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])}