World Library  
Flag as Inappropriate
Email this Article

Schwartz set

Article Id: WHEBN0000273588
Reproduction Date:

Title: Schwartz set  
Author: World Heritage Encyclopedia
Language: English
Subject: Schulze method, Smith set, Smith criterion, Voting theory, Condorcet method
Collection:
Publisher: World Heritage Encyclopedia
Publication
Date:
 

Schwartz set

In voting systems, the Schwartz set is the union of all Schwartz set components. A Schwartz set component is any non-empty set S of candidates such that

  1. Every candidate inside the set S is pairwise unbeaten by every candidate outside S; and
  2. No non-empty proper subset of S fulfills the first property.

A set of candidates that meets the first requirement is also known as an undominated set.

The Schwartz set provides one standard of optimal choice for an election outcome. Voting systems that always elect a candidate from the Schwartz set pass the Schwartz criterion. The Schwartz set is named for political scientist Thomas Schwartz.

Contents

  • Properties 1
  • Smith set comparison 2
  • Algorithms 3
  • Complying methods 4
  • See also 5
  • References 6
  • External links 7

Properties

  • The Schwartz set is always non-empty—there is always at least one Schwartz set component.
  • Any two distinct Schwartz set components are disjoint.
  • If there is a Condorcet winner, it is the only member of the Schwartz set. If there is only one member in the Schwartz set, it is at least a weak Condorcet winner.
  • If a Schwartz set component contains only a single candidate, that candidate is a weak Condorcet winner. If a Schwartz set component contains multiple candidates, they are all in a beatpath cycle with each other, a top cycle.
  • Any two candidates that are in different Schwartz set components are pairwise tied with each other.

Smith set comparison

The Schwartz set is closely related to and is always a subset of the Smith set. The Smith set is larger if and only if a candidate in the Schwartz set has a pairwise tie with a candidate that is not in the Schwartz set. For example, given:

  • 3 voters preferring candidate A to B to C
  • 1 voter preferring candidate B to C to A
  • 1 voter preferring candidate C to A to B
  • 1 voter preferring candidate C to B to A

then we have A pairwise beating B, B pairwise beating C, and A tying with C in their pairwise comparison, making A the only member of the Schwartz set, while the Smith set on the other hand consists of all the candidates.

Algorithms

The Schwartz set can be calculated with the Floyd–Warshall algorithm in time Θ(n3) or with a version of Kosaraju's algorithm in time Θ(n2).

Complying methods

The Schulze method always chooses a winner from the Schwartz set.

See also

References

  • require('Module:No globals')

local function getCatForId( id )

   local title = mw.title.getCurrentTitle()
   local namespace = title.namespace
   if namespace == 0 then

return ''

   elseif namespace == 2 and not title.isSubpage then

return ''

   else

return ''

   end

end

local function viafLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )

end

local function kulturnavLink( id )

   return '.. id .. ' id' 

end

local function sikartLink( id )

   return '.. id .. '&lng=en ' .. id .. '' 

end

local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)

   return '.. id2 .. ' ' .. id .. '' 

end


local function ciniiLink( id )

   return '.. id .. '?l=en ' .. id .. '' 

end

local function bneLink( id )

   return '.. id .. ' ' .. id .. '' 

end


local function uscongressLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function narapersonLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function naraorganizationLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)

   return '.. id2 .. ' ' .. id .. '' 

end

local function mgpLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' 

end

local function rslLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. '&CON_LNG=ENG ' .. id .. ''

end

local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)

   if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
      not string.match( id, '^C/0/%d%d?$' ) and
           not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function sbnLink( id )

   if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )

end

local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end

local function nclLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '&CON_LNG=ENG ' .. id .. '' 

end

local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end

local function sudocLink( id )

   if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function hlsLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.php ' .. id .. ''

end

local function lirLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.450.0.html ' .. id .. ''

end

local function splitLccn( id )

   if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
       id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
   end
   if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
        return mw.text.split( id, '/' )
   end
   return false

end

local function append(str, c, length)

   while str:len() < length do
       str = c .. str
   end
   return str

end

local function lccnLink( id )

   local parts = splitLccn( id )
   if not parts then
       return false
   end
   local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
   id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
   return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )

end

local function mbLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )

end

--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local function getIsniCheckDigit( isni )

   local total = 0
   for i = 1, 15 do
       local digit = isni:byte( i ) - 48 --Get integer value
       total = (total + digit) * 2
   end
   local remainder = total % 11
   local result = (12 - remainder) % 11
   if result == 10 then
       return "X"
   end
   return tostring( result )

end

--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid --See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier local function validateIsni( id )

   id = id:gsub( '[ %-]', ):upper()
   if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
       return false
   end
   if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
       return false
   end
   return id

end

local function isniLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )

end

local function orcidLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-'  .. id:sub( 9, 12 ) .. '-'  .. id:sub( 13, 16 )
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )

end

local function gndLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )

end

local function selibrLink( id ) if not string.match( id, '^%d+$' ) then

       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )

end

local function bnfLink( id )

   --Add cb prefix if it has been removed
   if not string.match( id, '^cb.+$' ) then
       id = 'cb' .. id
   end
   return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )

end

local function bpnLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )

end

local function ridLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )

end

local function bibsysLink( id )

   return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )

end

local function ulanLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )

end

local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end

local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end

local function getIdsFromWikidata( item, property )

   local ids = {}
   if not item.claims[property] then
       return ids
   end
   for _, statement in pairs( item.claims[property] ) do
         if statement.mainsnak.datavalue then
          table.insert( ids, statement.mainsnak.datavalue.value )
         end
   end
   return ids

end

local function matchesWikidataRequirements( item, reqs )

   for _, group in pairs( reqs ) do
       local property = 'p' .. group[1]
       local qid = group[2]
       if item.claims[property] ~= nil then
           for _, statement in pairs ( item.claims[property] ) do
                if statement.mainsnak.datavalue ~= nil then
                        if statement.mainsnak.datavalue.value['numeric-id'] == qid then
                        return true
                end
            end
           end
       end
   end
   return false

end

local function createRow( id, label, rawValue, link, withUid )

   if link then
       if withUid then
           return '* ' .. label .. ' ' .. link .. '\n'
       else
           return '* ' .. label .. ' ' .. link .. '\n'
       end
   else

return '* \n'

   end

end

--In this order: name of the parameter, label, propertyId in Wikidata, formatting function local conf = {

   { 'VIAF', 'VIAF', 214, viafLink },
   { 'LCCN', 'LCCN', 244, lccnLink },
   { 'ISNI', 'ISNI', 213, isniLink },
   { 'ORCID', 'ORCID', 496, orcidLink },
   { 'GND', 'GND', 227, gndLink },
   { 'SELIBR', 'SELIBR', 906, selibrLink },
   { 'SUDOC', 'SUDOC', 269, sudocLink },    
   { 'BNF', 'BNF', 268, bnfLink },
   { 'BPN', 'BPN', 651, bpnLink },
   { 'RID', 'ResearcherID', 1053, ridLink },
   { 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
   { 'ULAN', 'ULAN', 245, ulanLink },
   { 'HDS', 'HDS', 902, hlsLink },
   { 'LIR', 'LIR', 886, lirLink },
   { 'MBA', 'MusicBrainz', 434, mbLink },
   { 'MGP', 'MGP', 549, mgpLink },    
   { 'NLA', 'NLA', 409, nlaLink },
   { 'NDL', 'NDL', 349, ndlLink },
   { 'NCL', 'NCL', 1048, nclLink },
   { 'NKC', 'NKC', 691, nkcLink },
   { 'Léonore', 'Léonore', 640, leonoreLink }, 
   { 'SBN', 'ICCU', 396, sbnLink },     
   { 'RLS', 'RLS', 947, rslLink },
   { 'Botanist', '[[Author ci   In an analysis of serial decision making based on majority rule, describes the Smith set and the Schwartz set, but apparently fails to recognize that the Schwartz set can have multiple components.
  • require('Module:No globals')

local function getCatForId( id )

   local title = mw.title.getCurrentTitle()
   local namespace = title.namespace
   if namespace == 0 then

return ''

   elseif namespace == 2 and not title.isSubpage then

return ''

   else

return ''

   end

end

local function viafLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )

end

local function kulturnavLink( id )

   return '.. id .. ' id' 

end

local function sikartLink( id )

   return '.. id .. '&lng=en ' .. id .. '' 

end

local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)

   return '.. id2 .. ' ' .. id .. '' 

end


local function ciniiLink( id )

   return '.. id .. '?l=en ' .. id .. '' 

end

local function bneLink( id )

   return '.. id .. ' ' .. id .. '' 

end


local function uscongressLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function narapersonLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function naraorganizationLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)

   return '.. id2 .. ' ' .. id .. '' 

end

local function mgpLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' 

end

local function rslLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. '&CON_LNG=ENG ' .. id .. ''

end

local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)

   if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
      not string.match( id, '^C/0/%d%d?$' ) and
           not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function sbnLink( id )

   if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )

end

local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end

local function nclLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '&CON_LNG=ENG ' .. id .. '' 

end

local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end

local function sudocLink( id )

   if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function hlsLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.php ' .. id .. ''

end

local function lirLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.450.0.html ' .. id .. ''

end

local function splitLccn( id )

   if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
       id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
   end
   if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
        return mw.text.split( id, '/' )
   end
   return false

end

local function append(str, c, length)

   while str:len() < length do
       str = c .. str
   end
   return str

end

local function lccnLink( id )

   local parts = splitLccn( id )
   if not parts then
       return false
   end
   local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
   id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
   return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )

end

local function mbLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )

end

--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local function getIsniCheckDigit( isni )

   local total = 0
   for i = 1, 15 do
       local digit = isni:byte( i ) - 48 --Get integer value
       total = (total + digit) * 2
   end
   local remainder = total % 11
   local result = (12 - remainder) % 11
   if result == 10 then
       return "X"
   end
   return tostring( result )

end

--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid --See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier local function validateIsni( id )

   id = id:gsub( '[ %-]', ):upper()
   if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
       return false
   end
   if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
       return false
   end
   return id

end

local function isniLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )

end

local function orcidLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-'  .. id:sub( 9, 12 ) .. '-'  .. id:sub( 13, 16 )
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )

end

local function gndLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )

end

local function selibrLink( id ) if not string.match( id, '^%d+$' ) then

       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )

end

local function bnfLink( id )

   --Add cb prefix if it has been removed
   if not string.match( id, '^cb.+$' ) then
       id = 'cb' .. id
   end
   return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )

end

local function bpnLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )

end

local function ridLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )

end

local function bibsysLink( id )

   return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )

end

local function ulanLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )

end

local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end

local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end

local function getIdsFromWikidata( item, property )

   local ids = {}
   if not item.claims[property] then
       return ids
   end
   for _, statement in pairs( item.claims[property] ) do
         if statement.mainsnak.datavalue then
          table.insert( ids, statement.mainsnak.datavalue.value )
         end
   end
   return ids

end

local function matchesWikidataRequirements( item, reqs )

   for _, group in pairs( reqs ) do
       local property = 'p' .. group[1]
       local qid = group[2]
       if item.claims[property] ~= nil then
           for _, statement in pairs ( item.claims[property] ) do
                if statement.mainsnak.datavalue ~= nil then
                        if statement.mainsnak.datavalue.value['numeric-id'] == qid then
                        return true
                end
            end
           end
       end
   end
   return false

end

local function createRow( id, label, rawValue, link, withUid )

   if link then
       if withUid then
           return '* ' .. label .. ' ' .. link .. '\n'
       else
           return '* ' .. label .. ' ' .. link .. '\n'
       end
   else

return '* \n'

   end

end

--In this order: name of the parameter, label, propertyId in Wikidata, formatting function local conf = {

   { 'VIAF', 'VIAF', 214, viafLink },
   { 'LCCN', 'LCCN', 244, lccnLink },
   { 'ISNI', 'ISNI', 213, isniLink },
   { 'ORCID', 'ORCID', 496, orcidLink },
   { 'GND', 'GND', 227, gndLink },
   { 'SELIBR', 'SELIBR', 906, selibrLink },
   { 'SUDOC', 'SUDOC', 269, sudocLink },    
   { 'BNF', 'BNF', 268, bnfLink },
   { 'BPN', 'BPN', 651, bpnLink },
   { 'RID', 'ResearcherID', 1053, ridLink },
   { 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
   { 'ULAN', 'ULAN', 245, ulanLink },
   { 'HDS', 'HDS', 902, hlsLink },
   { 'LIR', 'LIR', 886, lirLink },
   { 'MBA', 'MusicBrainz', 434, mbLink },
   { 'MGP', 'MGP', 549, mgpLink },    
   { 'NLA', 'NLA', 409, nlaLink },
   { 'NDL', 'NDL', 349, ndlLink },
   { 'NCL', 'NCL', 1048, nclLink },
   { 'NKC', 'NKC', 691, nkcLink },
   { 'Léonore', 'Léonore', 640, leonoreLink }, 
   { 'SBN', 'ICCU', 396, sbnLink },     
   { 'RLS', 'RLS', 947, rslLink },
   { 'Botanist', '[[Author ci   Introduces the notion of the Schwartz set at the end of the paper as a possible alternative to maximization, in the presence of cyclic preferences, as a standard of rational choice.
  • require('Module:No globals')

local function getCatForId( id )

   local title = mw.title.getCurrentTitle()
   local namespace = title.namespace
   if namespace == 0 then

return ''

   elseif namespace == 2 and not title.isSubpage then

return ''

   else

return ''

   end

end

local function viafLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )

end

local function kulturnavLink( id )

   return '.. id .. ' id' 

end

local function sikartLink( id )

   return '.. id .. '&lng=en ' .. id .. '' 

end

local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)

   return '.. id2 .. ' ' .. id .. '' 

end


local function ciniiLink( id )

   return '.. id .. '?l=en ' .. id .. '' 

end

local function bneLink( id )

   return '.. id .. ' ' .. id .. '' 

end


local function uscongressLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function narapersonLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function naraorganizationLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)

   return '.. id2 .. ' ' .. id .. '' 

end

local function mgpLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' 

end

local function rslLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. '&CON_LNG=ENG ' .. id .. ''

end

local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)

   if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
      not string.match( id, '^C/0/%d%d?$' ) and
           not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function sbnLink( id )

   if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )

end

local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end

local function nclLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '&CON_LNG=ENG ' .. id .. '' 

end

local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end

local function sudocLink( id )

   if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function hlsLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.php ' .. id .. ''

end

local function lirLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.450.0.html ' .. id .. ''

end

local function splitLccn( id )

   if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
       id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
   end
   if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
        return mw.text.split( id, '/' )
   end
   return false

end

local function append(str, c, length)

   while str:len() < length do
       str = c .. str
   end
   return str

end

local function lccnLink( id )

   local parts = splitLccn( id )
   if not parts then
       return false
   end
   local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
   id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
   return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )

end

local function mbLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )

end

--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local function getIsniCheckDigit( isni )

   local total = 0
   for i = 1, 15 do
       local digit = isni:byte( i ) - 48 --Get integer value
       total = (total + digit) * 2
   end
   local remainder = total % 11
   local result = (12 - remainder) % 11
   if result == 10 then
       return "X"
   end
   return tostring( result )

end

--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid --See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier local function validateIsni( id )

   id = id:gsub( '[ %-]', ):upper()
   if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
       return false
   end
   if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
       return false
   end
   return id

end

local function isniLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )

end

local function orcidLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-'  .. id:sub( 9, 12 ) .. '-'  .. id:sub( 13, 16 )
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )

end

local function gndLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )

end

local function selibrLink( id ) if not string.match( id, '^%d+$' ) then

       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )

end

local function bnfLink( id )

   --Add cb prefix if it has been removed
   if not string.match( id, '^cb.+$' ) then
       id = 'cb' .. id
   end
   return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )

end

local function bpnLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )

end

local function ridLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )

end

local function bibsysLink( id )

   return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )

end

local function ulanLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )

end

local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end

local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end

local function getIdsFromWikidata( item, property )

   local ids = {}
   if not item.claims[property] then
       return ids
   end
   for _, statement in pairs( item.claims[property] ) do
         if statement.mainsnak.datavalue then
          table.insert( ids, statement.mainsnak.datavalue.value )
         end
   end
   return ids

end

local function matchesWikidataRequirements( item, reqs )

   for _, group in pairs( reqs ) do
       local property = 'p' .. group[1]
       local qid = group[2]
       if item.claims[property] ~= nil then
           for _, statement in pairs ( item.claims[property] ) do
                if statement.mainsnak.datavalue ~= nil then
                        if statement.mainsnak.datavalue.value['numeric-id'] == qid then
                        return true
                end
            end
           end
       end
   end
   return false

end

local function createRow( id, label, rawValue, link, withUid )

   if link then
       if withUid then
           return '* ' .. label .. ' ' .. link .. '\n'
       else
           return '* ' .. label .. ' ' .. link .. '\n'
       end
   else

return '* \n'

   end

end

--In this order: name of the parameter, label, propertyId in Wikidata, formatting function local conf = {

   { 'VIAF', 'VIAF', 214, viafLink },
   { 'LCCN', 'LCCN', 244, lccnLink },
   { 'ISNI', 'ISNI', 213, isniLink },
   { 'ORCID', 'ORCID', 496, orcidLink },
   { 'GND', 'GND', 227, gndLink },
   { 'SELIBR', 'SELIBR', 906, selibrLink },
   { 'SUDOC', 'SUDOC', 269, sudocLink },    
   { 'BNF', 'BNF', 268, bnfLink },
   { 'BPN', 'BPN', 651, bpnLink },
   { 'RID', 'ResearcherID', 1053, ridLink },
   { 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
   { 'ULAN', 'ULAN', 245, ulanLink },
   { 'HDS', 'HDS', 902, hlsLink },
   { 'LIR', 'LIR', 886, lirLink },
   { 'MBA', 'MusicBrainz', 434, mbLink },
   { 'MGP', 'MGP', 549, mgpLink },    
   { 'NLA', 'NLA', 409, nlaLink },
   { 'NDL', 'NDL', 349, ndlLink },
   { 'NCL', 'NCL', 1048, nclLink },
   { 'NKC', 'NKC', 691, nkcLink },
   { 'Léonore', 'Léonore', 640, leonoreLink }, 
   { 'SBN', 'ICCU', 396, sbnLink },     
   { 'RLS', 'RLS', 947, rslLink },
   { 'Botanist', '[[Author ci   Gives an axiomatic characterization and justification of the Schwartz set as a possible standard for optimal, rational collective choice.
  • require('Module:No globals')

local function getCatForId( id )

   local title = mw.title.getCurrentTitle()
   local namespace = title.namespace
   if namespace == 0 then

return ''

   elseif namespace == 2 and not title.isSubpage then

return ''

   else

return ''

   end

end

local function viafLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'VIAF' )

end

local function kulturnavLink( id )

   return '.. id .. ' id' 

end

local function sikartLink( id )

   return '.. id .. '&lng=en ' .. id .. '' 

end

local function tlsLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'WIKI') end)

   return '.. id2 .. ' ' .. id .. '' 

end


local function ciniiLink( id )

   return '.. id .. '?l=en ' .. id .. '' 

end

local function bneLink( id )

   return '.. id .. ' ' .. id .. '' 

end


local function uscongressLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function narapersonLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function naraorganizationLink( id )

   return '.. id .. ' ' .. id .. '' 

end

local function botanistLink( id ) local id2 = mw.ustring.gsub(id, '%s', function(s) return mw.uri.encode(s, 'PATH') end)

   return '.. id2 .. ' ' .. id .. '' 

end

local function mgpLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' 

end

local function rslLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. '&CON_LNG=ENG ' .. id .. ''

end

local function leonoreLink( id ) -- Identifiants allant de LH/1/1 à LH/2794/54 (légionnaires) -- Identifiants allant de C/0/1 à C/0/84 (84 légionnaires célèbres) -- Identifiants allant de 19800035/1/1 à 19800035/385/51670 (légionnaires décédés entre 1954 et 1977, et quelques dossiers de légionnaires décédés avant 1954)

   if not string.match( id, '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and
      not string.match( id, '^C/0/%d%d?$' ) and
           not string.match( id, '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function sbnLink( id )

   if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and not string.match( id, '^IT\\ICCU\\%u%u[%d%u]%u\\%d%d%d%d%d%d$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SBN' )

end

local function nkcLink( id ) return '.. id .. '&CON_LNG=ENG ' .. id .. '' end

local function nclLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '&CON_LNG=ENG ' .. id .. '' 

end

local function ndlLink( id ) return '.. id .. ' ' .. id .. '' end

local function sudocLink( id )

   if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' 

end

local function hlsLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.php ' .. id .. ''

end

local function lirLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. '.450.0.html ' .. id .. ''

end

local function splitLccn( id )

   if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
       id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
   end
   if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
        return mw.text.split( id, '/' )
   end
   return false

end

local function append(str, c, length)

   while str:len() < length do
       str = c .. str
   end
   return str

end

local function lccnLink( id )

   local parts = splitLccn( id )
   if not parts then
       return false
   end
   local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'
   id = parts[1] .. parts[2] .. append( parts[3], '0', 6 )
   return '.. lccnType .. '/' .. id .. ' ' .. id .. '' .. getCatForId( 'LCCN' )

end

local function mbLink( id )

   -- TODO Implement some sanity checking regex
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'MusicBrainz' )

end

--Returns the ISNI check digit isni must be a string where the 15 first elements are digits local function getIsniCheckDigit( isni )

   local total = 0
   for i = 1, 15 do
       local digit = isni:byte( i ) - 48 --Get integer value
       total = (total + digit) * 2
   end
   local remainder = total % 11
   local result = (12 - remainder) % 11
   if result == 10 then
       return "X"
   end
   return tostring( result )

end

--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid --See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier local function validateIsni( id )

   id = id:gsub( '[ %-]', ):upper()
   if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then
       return false
   end
   if getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then
       return false
   end
   return id

end

local function isniLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   return '.. id .. ' ' .. id:sub( 1, 4 ) .. ' ' .. id:sub( 5, 8 ) .. ' '  .. id:sub( 9, 12 ) .. ' '  .. id:sub( 13, 16 ) .. '' .. getCatForId( 'ISNI' )

end

local function orcidLink( id )

   id = validateIsni( id )
   if not id then
       return false
   end
   id = id:sub( 1, 4 ) .. '-' .. id:sub( 5, 8 ) .. '-'  .. id:sub( 9, 12 ) .. '-'  .. id:sub( 13, 16 )
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ORCID' )

end

local function gndLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'GND' )

end

local function selibrLink( id ) if not string.match( id, '^%d+$' ) then

       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'SELIBR' )

end

local function bnfLink( id )

   --Add cb prefix if it has been removed
   if not string.match( id, '^cb.+$' ) then
       id = 'cb' .. id
   end
   return '.. id .. ' ' .. id .. ' .. id .. ' (data)' .. getCatForId( 'BNF' )

end

local function bpnLink( id )

   if not string.match( id, '^%d+$' ) then
       return false
   end
   return '.. id .. ' ' .. id .. '' .. getCatForId( 'BPN' )

end

local function ridLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'RID' )

end

local function bibsysLink( id )

   return '.. id .. '&feltselect=bs.autid ' .. id .. '' .. getCatForId( 'BIBSYS' )

end

local function ulanLink( id )

   return '.. id .. ' ' .. id .. '' .. getCatForId( 'ULAN' )

end

local function nlaLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'NLA' ) end

local function rkdartistsLink( id ) return '.. id .. ' ' .. id .. '' .. getCatForId( 'RKDartists' ) end

local function getIdsFromWikidata( item, property )

   local ids = {}
   if not item.claims[property] then
       return ids
   end
   for _, statement in pairs( item.claims[property] ) do
         if statement.mainsnak.datavalue then
          table.insert( ids, statement.mainsnak.datavalue.value )
         end
   end
   return ids

end

local function matchesWikidataRequirements( item, reqs )

   for _, group in pairs( reqs ) do
       local property = 'p' .. group[1]
       local qid = group[2]
       if item.claims[property] ~= nil then
           for _, statement in pairs ( item.claims[property] ) do
                if statement.mainsnak.datavalue ~= nil then
                        if statement.mainsnak.datavalue.value['numeric-id'] == qid then
                        return true
                end
            end
           end
       end
   end
   return false

end

local function createRow( id, label, rawValue, link, withUid )

   if link then
       if withUid then
           return '* ' .. label .. ' ' .. link .. '\n'
       else
           return '* ' .. label .. ' ' .. link .. '\n'
       end
   else

return '* \n'

   end

end

--In this order: name of the parameter, label, propertyId in Wikidata, formatting function local conf = {

   { 'VIAF', 'VIAF', 214, viafLink },
   { 'LCCN', 'LCCN', 244, lccnLink },
   { 'ISNI', 'ISNI', 213, isniLink },
   { 'ORCID', 'ORCID', 496, orcidLink },
   { 'GND', 'GND', 227, gndLink },
   { 'SELIBR', 'SELIBR', 906, selibrLink },
   { 'SUDOC', 'SUDOC', 269, sudocLink },    
   { 'BNF', 'BNF', 268, bnfLink },
   { 'BPN', 'BPN', 651, bpnLink },
   { 'RID', 'ResearcherID', 1053, ridLink },
   { 'BIBSYS', 'BIBSYS', 1015, bibsysLink },
   { 'ULAN', 'ULAN', 245, ulanLink },
   { 'HDS', 'HDS', 902, hlsLink },
   { 'LIR', 'LIR', 886, lirLink },
   { 'MBA', 'MusicBrainz', 434, mbLink },
   { 'MGP', 'MGP', 549, mgpLink },    
   { 'NLA', 'NLA', 409, nlaLink },
   { 'NDL', 'NDL', 349, ndlLink },
   { 'NCL', 'NCL', 1048, nclLink },
   { 'NKC', 'NKC', 691, nkcLink },
   { 'Léonore', 'Léonore', 640, leonoreLink }, 
   { 'SBN', 'ICCU', 396, sbnLink },     
   { 'RLS', 'RLS', 947, rslLink },
   { 'Botanist', '[[Author ci   Proves that the Schwartz set is the set of undominated elements of the transitive closure of the pairwise preference relation.
  • Discusses the Smith set (named GETCHA) and the Schwartz set (named GOCHA) as possible standards for optimal, rational collective choice.

External links

  • Example algorithms to calculate the Schwartz set
This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and USA.gov, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for USA.gov and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.
 
Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.
 
By using this site, you agree to the Terms of Use and Privacy Policy. World Heritage Encyclopedia™ is a registered trademark of the World Public Library Association, a non-profit organization.
 


Copyright © World Library Foundation. All rights reserved. eBooks from Project Gutenberg are sponsored by the World Library Foundation,
a 501c(4) Member's Support Non-Profit Organization, and is NOT affiliated with any governmental agency or department.