def _generate_social_preferences()

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)