Source code for mapof.roommates.cultures.impartial

import logging

import numpy as np
from mapof.core.utils import *

from mapof.roommates.cultures._utils import convert


[docs] def generate_impartial_votes(num_agents: int = None, **kwargs) -> list[list[int]]: """ Generates a list of votes based on the Impartial Culture model. Parameters ---------- num_agents : int Number of agents. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ votes = [list(np.random.permutation(num_agents)) for _ in range(num_agents)] return convert(votes)
[docs] def generate_group_ic_votes( num_agents: int = None, proportion=0.5, **kwargs ) -> list[list[int]]: """ Generates a list of votes based on the Group Impartial Culture model with two groups. Parameters ---------- num_agents : int Number of agents. proportion : float, optional Proportion of agents in the first group. Default is 0.5. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ size_1 = int(proportion * num_agents) size_2 = int(num_agents - size_1) votes_1 = [list(np.random.permutation(size_1)) + list(np.random.permutation([j for j in range(size_1, num_agents)])) for _ in range(size_1)] votes_2 = [list(np.random.permutation([j for j in range(size_1, num_agents)])) + list(np.random.permutation(size_1)) for _ in range(size_2)] votes = votes_1 + votes_2 return convert(votes)
[docs] def generate_id_votes(num_agents: int = None, **kwargs) -> list[list[int]]: """ Generates a list of votes based on the Identity model. Parameters ---------- num_agents : int Number of agents. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ votes = [list(range(num_agents)) for _ in range(num_agents)] return convert(votes)
[docs] def generate_asymmetric_votes(num_agents: int = None, **_kwargs) -> list[list[int]]: """ Generates a list of votes based on the Asymmetric model. Parameters ---------- num_agents : int Number of agents. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ votes = [list(range(num_agents)) for _ in range(num_agents)] votes = [rotate(vote, shift) for shift, vote in enumerate(votes)] return convert(votes)
[docs] def generate_symmetric_votes(num_agents: int = None, **_kwargs) -> list[list[int]]: """ Generates a matrix of votes based on the Symmetric model. Parameters ---------- num_agents : int Number of agents. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ num_rounds = num_agents - 1 def next(agents): first = agents[0] last = agents[-1] middle = agents[1:-1] new_agents = [first, last] new_agents.extend(middle) return new_agents agents = [i for i in range(num_agents)] rounds = [] for _ in range(num_rounds): pairs = [] for i in range(num_agents // 2): agent_1 = agents[i] agent_2 = agents[num_agents - 1 - i] pairs.append([agent_1, agent_2]) rounds.append(pairs) agents = next(agents) votes = np.zeros([num_agents, num_agents - 1], dtype=int) for pos, partition in enumerate(rounds): for x, y in partition: votes[x][pos] = y votes[y][pos] = x return votes.tolist()
[docs] def generate_chaos_votes(num_agents: int = None, **kwargs) -> list[list[int]]: """ Generates a matrix of votes based on the Chaos model. Parameters ---------- num_agents : int Number of agents. **kwargs Additional parameters for customization. Returns ------- list[list[int]] A list of votes. """ if num_agents-1 % 3 == 0: logging.warning("Incorrect realization of Chaos instance") num_rooms = num_agents // 2 matrix = np.zeros([num_agents, num_agents - 1], dtype=int) matrix[0] = [i for i in range(num_agents - 1)] for i in range(1, num_agents): for j in range(num_rooms): matrix[i][2 * j] = (i + j - 1) % (num_agents - 1) if j < num_rooms - 1: matrix[i][2 * j + 1] = (num_rooms + i + j - 1) % (num_agents - 1) votes = np.zeros([num_agents, num_agents - 1], dtype=int) for k1 in range(num_agents): for k2 in range(num_agents - 1): for i in range(num_agents): if k1 != i and matrix[i][matrix[k1][k2]] == matrix[k1][k2]: votes[k1][k2] = i return votes.tolist()