in randomized_uncertain_social_preferences/rusp/wrappers_rusp.py [0:0]
def _generate_social_preferences(self, n_agents):
'''
Generate the relationship graph (without uncertainty)
'''
# Generate random partitions
if self.max_team_size != self.min_team_size:
random_partitions = self._partition_agents(n_agents, self.min_team_size, self.max_team_size)
else:
random_partitions = np.random.randint(self.min_team_size, self.max_team_size + 1, (n_agents))
random_partitions = np.cumsum(random_partitions)
random_partitions = random_partitions[random_partitions <= n_agents]
random_partitions = np.concatenate([[0], random_partitions, [n_agents]])
# Convert random partitions into a block diagonal matrix
self.reward_xform_mat = np.zeros((n_agents, n_agents))
for i in range(len(random_partitions) - 1):
block = slice(random_partitions[i], random_partitions[i + 1])
self.reward_xform_mat[block, block] = 1
# Randomize reward sharing values in block diagonal matrix
self.reward_xform_mat *= np.random.beta(a=self.alpha, b=self.beta, size=(n_agents, n_agents))
# Make sure off-diagonal is symmetric
self.reward_xform_mat = np.tril(self.reward_xform_mat, -1) + np.tril(self.reward_xform_mat).T
if not self.allow_diagonal_non_1:
np.fill_diagonal(self.reward_xform_mat, 1.0)
# Randomly shuffle agents so that agent indicies do not matter
random_shuffle_mat = np.eye(n_agents)
np.random.shuffle(random_shuffle_mat)
# We rotate, sum over teams, then unrotate
self.reward_xform_mat = np.matmul(np.matmul(random_shuffle_mat.T, self.reward_xform_mat), random_shuffle_mat)
# Normalize rows
self.unnormalized_reward_xform_mat = self.reward_xform_mat.copy()
self.reward_xform_mat /= np.sum(self.reward_xform_mat, axis=1, keepdims=True)