Source code for mapof.elections.features.simple_ordinal
import logging
import math
from mapof.elections.features.register import register_ordinal_election_feature
[docs]
@register_ordinal_election_feature('is_condorcet')
def is_condorcet(election) -> dict:
"""
Checks if election witness Condorcet winner
Parameters
----------
election : OrdinalElection
Returns
-------
dict
'value': True if Condorcet winner exists, False otherwise
"""
if election.is_pseudo:
return {'value': None}
potes = election.get_potes() # get positional votes
for i in range(election.num_candidates):
condocret_winner = True
for j in range(election.num_candidates):
diff = 0
for k in range(election.num_voters):
if potes[k][i] <= potes[k][j]:
diff += 1
if diff < math.ceil((election.num_voters + 1) / 2.):
condocret_winner = False
break
if condocret_winner:
return {'value': True}
return {'value': False}
[docs]
@register_ordinal_election_feature('effective_num_candidates')
def get_effective_num_candidates(election, mode='Borda') -> dict:
""" Compute effective number of candidates of a given election."""
if election.is_pseudo:
return {'value': None}
c = election.num_candidates
matrix = election.get_frequency_matrix()
if mode == 'Borda':
all_scores = [sum([matrix[j][i] * (c - i - 1) for i in range(c)]) / (c * (c - 1) / 2)
for j in range(c)]
elif mode == 'Plurality':
all_scores = [sum([matrix[j][i] for i in range(1)]) for j in range(c)]
else:
logging.warning(f"Mode {mode} is not supported.")
all_scores = []
return {'value': 1. / sum([x * x for x in all_scores])}