Source code for mapof.elections.cultures.pseudo_cultures

import logging

from mapof.elections.cultures.params import *
from mapof.elections.cultures.register import register_pseudo_ordinal_culture


def get_frequency_matrix_for_guardian(
        culture_id: str,
        num_candidates: int,
        params: dict = None
) -> np.ndarray:

    if params is None:
        params = {}

    vectors = np.zeros([num_candidates, num_candidates])

    if culture_id == 'pseudo_identity':
        for i in range(num_candidates):
            vectors[i][i] = 1

    elif culture_id == 'pseudo_uniformity':
        for i in range(num_candidates):
            for j in range(num_candidates):
                vectors[i][j] = 1. / num_candidates

    elif culture_id == 'pseudo_stratification':
        weight = params.get('weight', 0.5)
        half = int(num_candidates*weight)
        for i in range(half):
            for j in range(half):
                vectors[i][j] = 1. / half
        for i in range(half, num_candidates):
            for j in range(half, num_candidates):
                vectors[i][j] = 1. / half

    elif culture_id == 'pseudo_antagonism':
        for i in range(num_candidates):
            for _ in range(num_candidates):
                vectors[i][i] = 0.5
                vectors[i][num_candidates - i - 1] = 0.5

    return vectors

[docs] @register_pseudo_ordinal_culture('pseudo_uniformity') def pseudo_uniformity(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with uniformity. """ return get_frequency_matrix_for_guardian('pseudo_uniformity', num_candidates, params)
[docs] @register_pseudo_ordinal_culture('pseudo_identity') def pseudo_identity(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with identity. """ return get_frequency_matrix_for_guardian('pseudo_identity', num_candidates, params)
[docs] @register_pseudo_ordinal_culture('pseudo_stratification') def pseudo_stratification(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with stratification. """ return get_frequency_matrix_for_guardian('pseudo_stratification', num_candidates, params)
[docs] @register_pseudo_ordinal_culture('pseudo_antagonism') def pseudo_antagonism(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with antagonism. """ return get_frequency_matrix_for_guardian('pseudo_antagonism', num_candidates, params)
[docs] @register_pseudo_ordinal_culture('pseudo_unid') def pseudo_unid(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with unid path. """ return get_pseudo_convex('pseudo_unid', num_candidates, params, get_frequency_matrix_for_guardian)
[docs] @register_pseudo_ordinal_culture('pseudo_anid') def pseudo_anid(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with anid path. """ return get_pseudo_convex('pseudo_anid', num_candidates, params, get_frequency_matrix_for_guardian)
[docs] @register_pseudo_ordinal_culture('pseudo_stid') def pseudo_stid(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with stid path. """ return get_pseudo_convex('pseudo_stid', num_candidates, params, get_frequency_matrix_for_guardian)
[docs] @register_pseudo_ordinal_culture('pseudo_anun') def pseudo_anun(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with anun path. """ return get_pseudo_convex('pseudo_anun', num_candidates, params, get_frequency_matrix_for_guardian)
[docs] @register_pseudo_ordinal_culture('pseudo_stun') def pseudo_stun(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with stun path. """ return get_pseudo_convex('pseudo_stun', num_candidates, params, get_frequency_matrix_for_guardian)
[docs] @register_pseudo_ordinal_culture('pseudo_stan') def pseudo_stan(num_candidates: int, params: dict = None): """ Returns pseudo culture frequency matrix with stan path. """ return get_pseudo_convex('pseudo_stan', num_candidates, params, get_frequency_matrix_for_guardian)
def get_pseudo_multiplication(num_candidates, params, model): logging.warning('THIS FUNCTION IS NOT IMPLEMENTED YET.') # params['weight'] = 0. # params['normphi'] = params['alpha'] # main_matrix = [] # if model == 'conitzer_path': # main_matrix = get_conitzer_vectors(num_candidates).transpose() # elif model == 'walsh_path': # main_matrix = get_walsh_vectors(num_candidates).transpose() # mallows_matrix = get_mallows_vectors(num_candidates, params).transpose() # output = np.matmul(main_matrix, mallows_matrix).transpose() return None def get_pseudo_convex( culture_id: str, num_candidates: int, params: dict, function_name ): if culture_id == 'pseudo_unid': base_1 = function_name('pseudo_uniformity', num_candidates) base_2 = function_name('pseudo_identity', num_candidates) elif culture_id == 'pseudo_anid': base_1 = function_name('pseudo_antagonism', num_candidates) base_2 = function_name('pseudo_identity', num_candidates) elif culture_id == 'pseudo_stid': base_1 = function_name('pseudo_stratification', num_candidates) base_2 = function_name('pseudo_identity', num_candidates) elif culture_id == 'pseudo_anun': base_1 = function_name('pseudo_antagonism', num_candidates) base_2 = function_name('pseudo_uniformity', num_candidates) elif culture_id == 'pseudo_stun': base_1 = function_name('pseudo_stratification', num_candidates) base_2 = function_name('pseudo_uniformity', num_candidates) elif culture_id == 'pseudo_stan': base_1 = function_name('pseudo_stratification', num_candidates) base_2 = function_name('pseudo_antagonism', num_candidates) else: raise NameError('No such pseudo_culture_id!') return convex_combination(base_1, base_2, length=num_candidates, params=params) def convex_combination( base_1, base_2, length=0, params=None ): alpha = params.get('alpha', 1) if base_1.ndim == 1: output = np.zeros([length]) for i in range(length): output[i] = alpha * base_1[i] + (1 - alpha) * base_2[i] elif base_1.ndim == 2: output = np.zeros([length, length]) for i in range(length): for j in range(length): output[i][j] = alpha * base_1[i][j] + (1 - alpha) * base_2[i][j] else: raise NameError('Unknown base!') return output def get_pairwise_matrix_for_guardian( culture_id: str, num_candidates: int, params: dict = None ): matrix = np.zeros([num_candidates, num_candidates]) if culture_id == 'pseudo_identity': for i in range(num_candidates): for j in range(i + 1, num_candidates): matrix[i][j] = 1 elif culture_id in {'pseudo_uniformity', 'pseudo_antagonism'}: for i in range(num_candidates): for j in range(num_candidates): if i != j: matrix[i][j] = 0.5 elif culture_id == 'pseudo_stratification': if params is None: params = {} weight = params.get('weight', 0.5) for i in range(int(num_candidates*weight)): for j in range(int(num_candidates*weight), num_candidates): matrix[i][j] = 1 for i in range(int(num_candidates*weight)): for j in range(int(num_candidates*weight)): if i != j: matrix[i][j] = 0.5 for i in range(int(num_candidates*weight), num_candidates): for j in range(int(num_candidates*weight), num_candidates): if i != j: matrix[i][j] = 0.5 return matrix def get_pseudo_borda_vector( culture_id: str, num_candidates: int, num_voters: int ): borda_vector = np.zeros([num_candidates]) m = num_candidates n = num_voters if culture_id == 'pseudo_identity': for i in range(m): borda_vector[i] = n * (m - 1 - i) elif culture_id in {'pseudo_uniformity', 'pseudo_antagonism'}: for i in range(m): borda_vector[i] = n * (m - 1) / 2 elif culture_id == 'pseudo_stratification': for i in range(int(m / 2)): borda_vector[i] = n * (m - 1) * 3 / 4 for i in range(int(m / 2), m): borda_vector[i] = n * (m - 1) / 4 return borda_vector