#jsDisabledContent { display:none; } My Account |  Register |  Help

# Schwartz set

Article Id: WHEBN0000273588
Reproduction Date:

 Title: Schwartz set Author: World Heritage Encyclopedia Language: English Subject: 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
• References 6

## 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.

## 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

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

end

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

end

```   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

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

end

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

end

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

end

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

end

```   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

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

end

```   -- 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

```   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

```   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

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

end

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

end

```   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 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

```   -- 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
```

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

```   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

```   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

```   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

```   --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

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

end

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

end

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

end

```   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

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

end

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

end

```   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

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

end

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

end

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

end

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

end

```   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

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

end

```   -- 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

```   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

```   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

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

end

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

end

```   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 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

```   -- 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
```

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

```   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

```   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

```   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

```   --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

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

end

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

end

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

end

```   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

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

end

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

end

```   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

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

end

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

end

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

end

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

end

```   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

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

end

```   -- 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

```   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

```   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

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

end

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

end

```   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 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

```   -- 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
```

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

```   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

```   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

```   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

```   --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

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

end

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

end

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

end

```   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

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

end

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

end

```   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

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

end

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

end

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

end

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

end

```   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

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

end

```   -- 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

```   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

```   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

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

end

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

end

```   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 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

```   -- 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
```

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

```   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

```   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

```   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

```   --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

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

end

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

end

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

end

```   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.