Source code for pysensmcda.compromise.dominance_directed_graph

# Copyright (C) 2024 Bartosz Paradowski, Jakub Więckowski

import numpy as np
from numpy.linalg import matrix_power
from scipy.stats import rankdata
from ..validator import Validator
from ..utils import memory_guard

[docs] @memory_guard def dominance_directed_graph(rankings: np.ndarray) -> np.ndarray: """ Calculates compromised ranking using dominance directed graph. Parameters: ------------- rankings : ndarray Two-dimensional matrix containing different rankings in columns. Returns: ---------- ndarray Numpy array containing compromised ranking. Example: ------------ >>> rankings = np.array([[3, 2, 3], >>> [4, 4, 4], >>> [2, 3, 2], >>> [1, 1, 1]]) >>> compromised_ranking = dominance_directed_graph(rankings) """ Validator.is_type_valid(rankings, np.ndarray, 'rankings') alt_num = rankings.shape[0] final_points = np.zeros((alt_num, alt_num)) for ranking in rankings.T: A = np.zeros((alt_num, alt_num)) for idx in range(alt_num): A[idx, ranking > ranking[idx]] += 1 enhanced_dominant_matrix = A + matrix_power(A, 2) final_points += enhanced_dominant_matrix return rankdata(-np.sum(final_points, axis=1))