Source code for mapof.roommates.objects.Roommates
#!/usr/bin/env python
import copy
import numpy as np
from mapof.core.objects.Instance import Instance
from mapof.roommates.cultures import generate_votes
from mapof.roommates.features import get_local_feature
import mapof.roommates.persistence.instance_exports as exports
import mapof.roommates.persistence.instance_imports as imports
[docs]
class Roommates(Instance):
def __init__(self,
experiment_id,
instance_id,
alpha=1,
culture_id=None,
num_agents=None,
is_imported=True,
votes=None):
super().__init__(experiment_id, instance_id, alpha=alpha, culture_id=culture_id)
self.num_agents = num_agents
self.votes = votes
self.retrospetive_vectors = None
self.positionwise_vectors = None
if is_imported and experiment_id != 'virtual':
try:
self.votes, self.num_agents, self.params, self.culture_id = \
imports.import_real_instance(self)
self.alpha = self.params['alpha']
except:
pass
def get_retrospective_vectors(self):
if self.retrospetive_vectors is not None:
return self.retrospetive_vectors
return self.votes_to_retrospective_vectors()
def get_positionwise_vectors(self):
if self.positionwise_vectors is not None:
return self.positionwise_vectors
return self.votes_to_positionwise_vectors()
def votes_to_retrospective_vectors(self):
vectors = np.zeros([self.num_agents, self.num_agents - 1], dtype=int)
order_votes = [[] for _ in range(self.num_agents)]
for a in range(self.num_agents):
(missing,) = set(range(self.num_agents)) - set(self.votes[a])
order_votes[missing] = copy.deepcopy(self.votes[a])
for a in range(self.num_agents):
for i, b in enumerate(order_votes[a]):
vectors[a][i] = int(list(order_votes[b]).index(a))
self.retrospetive_vectors = vectors
return vectors
def votes_to_positionwise_vectors(self):
vectors = np.zeros([self.num_agents, self.num_agents - 1])
for i in range(self.num_agents):
pos = 0
for j in range(self.num_agents - 1):
vote = self.votes[i][j]
vectors[vote][pos] += 1
pos += 1
for i in range(self.num_agents):
for j in range(self.num_agents - 1):
vectors[i][j] /= float(self.num_agents)
self.positionwise_vectors = vectors
return vectors
def prepare_instance(self, is_exported=None, params: dict = None):
if params is None:
params = {}
if self.culture_id == 'roommates_norm-mallows' and 'norm-phi' not in params:
params['norm-phi'] = np.random.rand()
params['alpha'] = params['norm-phi']
elif self.culture_id == 'roommates_urn' and 'alpha' not in params:
params['alpha'] = np.random.rand()
elif 'alpha' not in params:
params['alpha'] = 1
if 'variable' in params:
params['alpha'] = params[params['variable']]
self.alpha = params['alpha']
self.votes = generate_votes(culture_id=self.culture_id,
num_agents=self.num_agents,
params=params)
self.params = params
if is_exported:
exports.export_instance_to_a_file(self)
def compute_feature(self, feature_id, feature_long_id=None, **kwargs):
if feature_long_id is None:
feature_long_id = feature_id
feature = get_local_feature(feature_id)
self.features[feature_long_id] = feature(self, **kwargs)