Last active
December 16, 2022 16:42
-
-
Save leriomaggio/d85bf91b8f3ed11b7927eaf39bdc79ae to your computer and use it in GitHub Desktop.
Numpy based implementation of the Borda Selection Algorithm for Rankings
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""Python/Numpy implementation of the Borda Count""" | |
import numpy as np | |
from nptyping import NDArray | |
from typing import Tuple, Union, List, Any | |
RankingsList = Union[NDArray[(Any, Any), np.int], List[List[int]]] | |
Ranking = NDArray[(Any,), np.int] | |
Counts = NDArray[(Any,), np.int] | |
AveragePositions = NDArray[(Any,), np.float] | |
Borda = Tuple[Ranking, Counts, AveragePositions] | |
def borda_count_np(X: RankingsList, min_score: float = 1, k: int = None) -> Borda: | |
"""Given N ranked ids lists of length P compute the number of | |
extractions on top-k positions and the mean position for each id. | |
Sort the element ids (in reversed DECREASING order) based on the | |
Borda Extraction Scores (BES). IDs having the same BES will be sorted | |
by their increasing average position (i.e. the average of the position | |
of each ID in all the rankings). | |
Parameters | |
---------- | |
X : Numpy array of integer with shape [N, P] or List of Lists | |
The list of rankings | |
min_score: float, optional | |
Minimum score considered for IDs (Default is 1) | |
k : int, optional | |
Top-K positions to select. | |
Default is None, which means that all the positions will be | |
selected (i.e. k = P) | |
Returns | |
------- | |
Borda | |
A tuple containing three NDarray: | |
1. Sorted IDs, i.e. the Borda Ranking; | |
2. The number of Extractions, i.e. Count; | |
3. The average positions of each ID. | |
Raises | |
------ | |
ValueError | |
If k < 1 or k > p | |
ValueError | |
If X contains duplicate IDs | |
""" | |
x_np = np.asarray(X) # make sure X is a Numpy array for efficiency | |
n, p = x_np.shape | |
if k is None: | |
k = p | |
if not 1 <= k <= p: | |
raise ValueError(f"k must be in [1, {p}], {k} given instead!") | |
# Verify that ranked lists do no contain repetitions | |
unique_ids = np.asarray([len(set(r)) for r in x_np[:]]) | |
if len(unique_ids[unique_ids < p]): | |
raise ValueError( | |
f"IDs in list of rankings are not unique! Unique IDs found: {unique_ids}" | |
) | |
positions = np.argsort(x_np, axis=1) | |
# Select TopK by forcing positions of others to last position | |
positions[positions >= k] = p | |
# Calculate scores of extractions in each ranking based on their relative position | |
exts = (p - positions - 1 + min_score).sum(axis=0) | |
# Count total number of valid extractions | |
counts = (positions < k).sum(axis=0) | |
# Reset all non-valid positions (>=k) for TopK selection | |
positions[positions >= k] = 0 | |
# Calculate Average positions of each element in each ranking | |
non_zero_counts = counts != 0 | |
avg_positions = positions.sum(axis=0) / np.where(non_zero_counts, counts, 1) | |
avg_positions[~non_zero_counts] = p - 1 | |
# Sort rankings based on average positions, and extraction scores | |
idx = np.lexsort((avg_positions, exts))[::-1] | |
return idx, counts[idx], avg_positions[idx] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | f11 | f12 | f13 | f14 | f15 | f16 | f17 | f18 | f19 | f20 | f21 | f22 | f23 | f24 | f25 | f26 | f27 | f28 | f29 | f30 | f31 | f32 | f33 | f34 | f35 | f36 | f37 | f38 | f39 | f40 | f41 | f42 | f43 | f44 | f45 | f46 | f47 | f48 | f49 | f50 | f51 | f52 | f53 | f54 | f55 | f56 | f57 | f58 | f59 | f60 | f61 | f62 | f63 | f64 | f65 | f66 | f67 | f68 | f69 | f70 | f71 | f72 | f73 | f74 | f75 | f76 | f77 | f78 | f79 | f80 | f81 | f82 | f83 | f84 | f85 | f86 | f87 | f88 | f89 | f90 | f91 | f92 | f93 | f94 | f95 | f96 | f97 | f98 | f99 | f100 | f101 | f102 | f103 | f104 | f105 | f106 | f107 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 73 | 5 | 85 | 42 | 64 | 1 | 32 | 14 | 84 | 79 | 57 | 91 | 8 | 40 | 58 | 3 | 47 | 17 | 41 | 21 | 7 | 16 | 13 | 88 | 72 | 23 | 12 | 74 | 56 | 36 | 19 | 89 | 30 | 2 | 4 | 31 | 9 | 29 | 65 | 78 | 93 | 105 | 46 | 63 | 71 | 15 | 20 | 0 | 94 | 37 | 43 | 52 | 62 | 80 | 33 | 102 | 55 | 86 | 53 | 51 | 103 | 24 | 95 | 25 | 44 | 106 | 101 | 22 | 87 | 76 | 27 | 35 | 28 | 81 | 82 | 66 | 11 | 38 | 6 | 104 | 90 | 69 | 26 | 83 | 75 | 18 | 54 | 70 | 48 | 59 | 61 | 67 | 10 | 50 | 77 | 96 | 97 | 99 | 100 | 98 | 92 | 68 | 39 | 34 | 49 | 45 | 60 | |
1 | 5 | 85 | 73 | 32 | 64 | 42 | 1 | 23 | 8 | 14 | 58 | 21 | 47 | 17 | 41 | 40 | 91 | 3 | 57 | 79 | 7 | 12 | 84 | 31 | 74 | 37 | 13 | 16 | 19 | 4 | 36 | 15 | 30 | 63 | 71 | 9 | 62 | 20 | 52 | 93 | 55 | 29 | 51 | 0 | 88 | 56 | 89 | 98 | 6 | 102 | 92 | 78 | 81 | 82 | 86 | 72 | 11 | 2 | 46 | 90 | 105 | 33 | 53 | 44 | 97 | 106 | 101 | 104 | 100 | 24 | 35 | 25 | 94 | 38 | 27 | 28 | 96 | 65 | 66 | 87 | 76 | 22 | 103 | 69 | 83 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 10 | 67 | 50 | 43 | 95 | 80 | 77 | 26 | 99 | 68 | 60 | 45 | 34 | 39 | 49 | |
2 | 5 | 73 | 85 | 1 | 42 | 64 | 57 | 16 | 79 | 14 | 32 | 84 | 58 | 40 | 3 | 8 | 47 | 17 | 41 | 21 | 78 | 74 | 35 | 36 | 38 | 91 | 7 | 12 | 46 | 56 | 88 | 76 | 87 | 13 | 19 | 23 | 93 | 4 | 31 | 2 | 63 | 71 | 62 | 52 | 55 | 94 | 72 | 20 | 9 | 51 | 89 | 30 | 37 | 0 | 15 | 66 | 69 | 28 | 102 | 27 | 67 | 25 | 33 | 86 | 53 | 65 | 29 | 60 | 105 | 49 | 44 | 24 | 68 | 77 | 45 | 22 | 43 | 95 | 103 | 81 | 106 | 101 | 82 | 80 | 26 | 34 | 39 | 104 | 96 | 6 | 11 | 97 | 98 | 90 | 100 | 50 | 54 | 61 | 59 | 70 | 48 | 18 | 75 | 99 | 92 | 83 | 10 | |
3 | 73 | 85 | 5 | 79 | 42 | 32 | 1 | 84 | 64 | 63 | 71 | 14 | 52 | 8 | 23 | 58 | 21 | 7 | 62 | 47 | 17 | 13 | 41 | 91 | 57 | 40 | 3 | 31 | 55 | 12 | 16 | 74 | 0 | 51 | 93 | 37 | 88 | 36 | 9 | 4 | 102 | 19 | 15 | 30 | 105 | 89 | 56 | 78 | 29 | 20 | 72 | 2 | 94 | 46 | 95 | 6 | 86 | 106 | 101 | 33 | 53 | 65 | 90 | 11 | 44 | 81 | 104 | 25 | 82 | 24 | 27 | 38 | 35 | 28 | 43 | 66 | 103 | 76 | 87 | 69 | 80 | 22 | 99 | 97 | 92 | 67 | 98 | 100 | 54 | 83 | 75 | 18 | 70 | 48 | 59 | 61 | 10 | 26 | 50 | 77 | 96 | 39 | 34 | 45 | 49 | 68 | 60 | |
4 | 85 | 73 | 5 | 32 | 42 | 1 | 64 | 23 | 84 | 79 | 58 | 8 | 14 | 74 | 21 | 47 | 17 | 41 | 19 | 40 | 57 | 3 | 7 | 37 | 13 | 91 | 31 | 16 | 12 | 63 | 20 | 71 | 52 | 36 | 4 | 62 | 0 | 9 | 89 | 93 | 55 | 51 | 88 | 15 | 94 | 56 | 105 | 30 | 102 | 78 | 72 | 81 | 82 | 2 | 46 | 86 | 33 | 29 | 53 | 95 | 25 | 24 | 44 | 38 | 35 | 106 | 101 | 27 | 22 | 103 | 65 | 28 | 90 | 66 | 104 | 26 | 11 | 69 | 43 | 54 | 76 | 87 | 83 | 18 | 75 | 70 | 48 | 59 | 61 | 96 | 6 | 67 | 80 | 10 | 50 | 99 | 97 | 98 | 100 | 68 | 45 | 60 | 49 | 92 | 77 | 39 | 34 | |
5 | 85 | 5 | 73 | 42 | 1 | 64 | 32 | 14 | 8 | 58 | 57 | 21 | 47 | 17 | 23 | 41 | 40 | 84 | 91 | 79 | 3 | 7 | 13 | 16 | 12 | 74 | 31 | 19 | 37 | 36 | 4 | 93 | 63 | 71 | 52 | 9 | 0 | 30 | 88 | 94 | 62 | 56 | 20 | 81 | 82 | 15 | 89 | 51 | 55 | 29 | 102 | 105 | 33 | 46 | 78 | 2 | 86 | 72 | 95 | 53 | 44 | 25 | 24 | 27 | 28 | 35 | 11 | 106 | 101 | 6 | 90 | 66 | 38 | 103 | 65 | 22 | 104 | 69 | 76 | 87 | 67 | 83 | 92 | 75 | 54 | 18 | 48 | 70 | 59 | 61 | 96 | 10 | 50 | 43 | 97 | 98 | 100 | 80 | 26 | 77 | 49 | 45 | 68 | 99 | 34 | 39 | 60 | |
6 | 73 | 5 | 85 | 32 | 1 | 42 | 64 | 58 | 8 | 21 | 14 | 47 | 17 | 41 | 91 | 23 | 79 | 84 | 40 | 57 | 74 | 3 | 7 | 93 | 13 | 12 | 19 | 16 | 31 | 30 | 63 | 36 | 71 | 29 | 52 | 4 | 102 | 88 | 62 | 37 | 9 | 56 | 15 | 89 | 0 | 72 | 20 | 51 | 2 | 94 | 78 | 55 | 105 | 46 | 6 | 65 | 95 | 86 | 33 | 11 | 53 | 106 | 101 | 24 | 43 | 25 | 90 | 44 | 104 | 22 | 27 | 38 | 35 | 80 | 28 | 87 | 76 | 66 | 69 | 81 | 82 | 103 | 26 | 83 | 54 | 99 | 18 | 75 | 92 | 70 | 48 | 59 | 61 | 67 | 97 | 98 | 50 | 10 | 96 | 100 | 77 | 68 | 45 | 49 | 60 | 39 | 34 | |
7 | 73 | 5 | 85 | 64 | 42 | 1 | 32 | 14 | 58 | 8 | 47 | 17 | 21 | 41 | 40 | 57 | 79 | 3 | 84 | 7 | 91 | 13 | 23 | 12 | 16 | 74 | 36 | 4 | 19 | 63 | 31 | 20 | 9 | 71 | 93 | 52 | 62 | 88 | 37 | 56 | 30 | 0 | 78 | 51 | 15 | 102 | 55 | 72 | 2 | 89 | 29 | 46 | 105 | 86 | 33 | 53 | 44 | 65 | 81 | 94 | 82 | 24 | 25 | 35 | 27 | 87 | 76 | 28 | 38 | 106 | 101 | 103 | 43 | 6 | 11 | 66 | 22 | 90 | 80 | 69 | 95 | 104 | 67 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 97 | 61 | 26 | 10 | 98 | 100 | 50 | 92 | 96 | 77 | 99 | 49 | 45 | 68 | 39 | 34 | 60 | |
8 | 73 | 5 | 85 | 42 | 1 | 32 | 64 | 74 | 14 | 8 | 58 | 84 | 40 | 79 | 47 | 17 | 41 | 57 | 21 | 3 | 16 | 91 | 19 | 7 | 23 | 12 | 13 | 78 | 36 | 31 | 88 | 72 | 4 | 35 | 89 | 56 | 38 | 2 | 46 | 62 | 20 | 63 | 71 | 9 | 93 | 52 | 30 | 51 | 37 | 55 | 65 | 0 | 94 | 76 | 87 | 15 | 29 | 43 | 102 | 86 | 25 | 105 | 53 | 27 | 66 | 24 | 28 | 33 | 69 | 67 | 44 | 80 | 95 | 22 | 60 | 68 | 49 | 26 | 45 | 90 | 6 | 11 | 106 | 101 | 81 | 82 | 104 | 103 | 77 | 83 | 54 | 18 | 75 | 70 | 48 | 59 | 61 | 96 | 50 | 10 | 98 | 97 | 92 | 100 | 99 | 34 | 39 | |
9 | 73 | 5 | 79 | 85 | 84 | 32 | 42 | 64 | 1 | 14 | 57 | 8 | 23 | 40 | 3 | 58 | 21 | 47 | 17 | 71 | 41 | 63 | 55 | 37 | 7 | 16 | 52 | 31 | 13 | 91 | 12 | 62 | 15 | 74 | 36 | 19 | 4 | 88 | 0 | 9 | 51 | 56 | 89 | 20 | 34 | 39 | 78 | 105 | 93 | 72 | 2 | 46 | 103 | 50 | 30 | 106 | 101 | 86 | 53 | 33 | 94 | 102 | 98 | 61 | 44 | 81 | 59 | 48 | 29 | 70 | 82 | 18 | 75 | 65 | 35 | 38 | 104 | 25 | 83 | 24 | 97 | 87 | 76 | 27 | 54 | 28 | 100 | 66 | 43 | 6 | 69 | 95 | 22 | 10 | 90 | 67 | 96 | 80 | 11 | 77 | 92 | 26 | 68 | 49 | 45 | 60 | 99 | |
10 | 73 | 85 | 5 | 32 | 42 | 64 | 84 | 1 | 79 | 14 | 58 | 8 | 74 | 47 | 17 | 40 | 41 | 21 | 57 | 19 | 23 | 3 | 91 | 7 | 13 | 16 | 12 | 31 | 37 | 36 | 93 | 4 | 20 | 88 | 71 | 63 | 55 | 89 | 94 | 56 | 9 | 15 | 52 | 62 | 72 | 102 | 30 | 0 | 2 | 46 | 105 | 29 | 78 | 95 | 51 | 86 | 33 | 65 | 53 | 24 | 25 | 81 | 82 | 22 | 106 | 101 | 44 | 43 | 35 | 26 | 27 | 28 | 104 | 80 | 87 | 76 | 66 | 38 | 103 | 90 | 11 | 69 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 96 | 61 | 6 | 97 | 98 | 10 | 50 | 67 | 100 | 99 | 92 | 68 | 60 | 77 | 45 | 39 | 34 | 49 | |
11 | 5 | 85 | 73 | 32 | 42 | 64 | 1 | 58 | 21 | 79 | 84 | 47 | 17 | 41 | 8 | 14 | 23 | 57 | 40 | 3 | 91 | 74 | 7 | 12 | 31 | 16 | 19 | 13 | 37 | 63 | 71 | 36 | 4 | 52 | 62 | 20 | 93 | 55 | 30 | 9 | 51 | 88 | 0 | 29 | 56 | 78 | 15 | 89 | 94 | 102 | 81 | 105 | 6 | 82 | 33 | 86 | 46 | 2 | 53 | 72 | 44 | 11 | 25 | 24 | 90 | 27 | 35 | 28 | 38 | 103 | 66 | 95 | 65 | 87 | 76 | 106 | 101 | 69 | 92 | 22 | 104 | 67 | 43 | 96 | 54 | 83 | 75 | 18 | 70 | 48 | 59 | 61 | 97 | 10 | 77 | 80 | 50 | 100 | 98 | 99 | 26 | 34 | 39 | 45 | 49 | 68 | 60 | |
12 | 73 | 5 | 85 | 1 | 64 | 42 | 32 | 8 | 58 | 14 | 47 | 17 | 41 | 40 | 21 | 91 | 3 | 57 | 74 | 16 | 23 | 7 | 79 | 84 | 12 | 13 | 36 | 19 | 31 | 4 | 62 | 93 | 63 | 30 | 71 | 78 | 37 | 52 | 35 | 38 | 51 | 9 | 29 | 88 | 20 | 0 | 56 | 55 | 89 | 46 | 2 | 15 | 72 | 102 | 86 | 94 | 53 | 44 | 66 | 27 | 105 | 28 | 25 | 69 | 67 | 76 | 87 | 33 | 24 | 6 | 60 | 11 | 68 | 49 | 45 | 65 | 22 | 81 | 82 | 90 | 103 | 106 | 101 | 43 | 95 | 92 | 34 | 39 | 77 | 104 | 96 | 26 | 80 | 98 | 97 | 100 | 10 | 50 | 54 | 61 | 59 | 70 | 48 | 18 | 83 | 75 | 99 | |
13 | 5 | 73 | 85 | 32 | 42 | 64 | 1 | 79 | 84 | 14 | 58 | 8 | 57 | 21 | 23 | 47 | 17 | 40 | 41 | 3 | 7 | 91 | 63 | 16 | 13 | 71 | 52 | 31 | 62 | 74 | 12 | 88 | 19 | 51 | 36 | 89 | 56 | 78 | 37 | 4 | 0 | 55 | 9 | 15 | 72 | 20 | 2 | 105 | 30 | 46 | 93 | 102 | 29 | 65 | 94 | 95 | 81 | 82 | 86 | 33 | 106 | 101 | 53 | 87 | 76 | 38 | 44 | 35 | 43 | 103 | 25 | 24 | 6 | 27 | 80 | 104 | 90 | 11 | 28 | 66 | 22 | 69 | 99 | 83 | 97 | 54 | 75 | 18 | 70 | 48 | 59 | 67 | 61 | 100 | 10 | 50 | 98 | 77 | 26 | 92 | 96 | 68 | 45 | 49 | 60 | 39 | 34 | |
14 | 5 | 73 | 85 | 42 | 64 | 1 | 14 | 32 | 79 | 57 | 84 | 40 | 7 | 3 | 8 | 13 | 58 | 16 | 47 | 17 | 21 | 41 | 15 | 91 | 12 | 23 | 56 | 88 | 36 | 9 | 74 | 31 | 4 | 63 | 71 | 72 | 93 | 2 | 52 | 0 | 46 | 19 | 37 | 78 | 89 | 62 | 55 | 98 | 30 | 102 | 65 | 94 | 20 | 106 | 101 | 105 | 51 | 104 | 29 | 33 | 86 | 43 | 53 | 97 | 44 | 25 | 87 | 76 | 100 | 38 | 24 | 35 | 80 | 27 | 103 | 28 | 66 | 95 | 22 | 69 | 90 | 6 | 11 | 81 | 82 | 96 | 67 | 26 | 83 | 77 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 10 | 50 | 92 | 49 | 45 | 68 | 99 | 34 | 39 | 60 | |
15 | 73 | 85 | 5 | 32 | 42 | 79 | 84 | 64 | 1 | 58 | 21 | 47 | 17 | 41 | 8 | 14 | 23 | 63 | 57 | 40 | 71 | 74 | 3 | 91 | 52 | 62 | 31 | 7 | 55 | 12 | 16 | 13 | 19 | 51 | 37 | 36 | 4 | 93 | 88 | 20 | 9 | 0 | 30 | 56 | 15 | 78 | 89 | 102 | 94 | 29 | 105 | 81 | 2 | 72 | 82 | 46 | 86 | 33 | 53 | 6 | 44 | 38 | 35 | 103 | 24 | 25 | 27 | 95 | 106 | 101 | 28 | 39 | 34 | 66 | 65 | 11 | 90 | 22 | 69 | 104 | 92 | 76 | 87 | 67 | 96 | 43 | 50 | 61 | 97 | 59 | 48 | 70 | 99 | 18 | 75 | 54 | 83 | 80 | 26 | 100 | 98 | 77 | 10 | 68 | 45 | 49 | 60 | |
16 | 5 | 73 | 85 | 32 | 42 | 1 | 64 | 14 | 79 | 84 | 8 | 40 | 57 | 23 | 3 | 21 | 58 | 16 | 47 | 17 | 41 | 31 | 91 | 7 | 93 | 13 | 78 | 12 | 74 | 15 | 36 | 19 | 63 | 71 | 88 | 35 | 20 | 62 | 4 | 52 | 37 | 56 | 98 | 102 | 46 | 38 | 55 | 9 | 2 | 72 | 51 | 89 | 0 | 87 | 76 | 30 | 94 | 104 | 106 | 101 | 29 | 97 | 100 | 65 | 90 | 81 | 82 | 43 | 6 | 105 | 11 | 66 | 69 | 67 | 80 | 28 | 86 | 27 | 25 | 33 | 53 | 60 | 68 | 49 | 95 | 44 | 96 | 45 | 24 | 54 | 77 | 83 | 18 | 70 | 75 | 48 | 59 | 61 | 10 | 92 | 50 | 22 | 103 | 99 | 26 | 39 | 34 | |
17 | 5 | 73 | 85 | 64 | 42 | 1 | 57 | 14 | 32 | 84 | 79 | 8 | 40 | 3 | 58 | 47 | 17 | 21 | 41 | 16 | 91 | 7 | 23 | 88 | 74 | 36 | 12 | 13 | 19 | 56 | 4 | 31 | 93 | 37 | 63 | 71 | 89 | 9 | 52 | 30 | 105 | 2 | 62 | 15 | 102 | 46 | 78 | 33 | 20 | 72 | 86 | 51 | 94 | 53 | 29 | 55 | 0 | 44 | 25 | 65 | 24 | 27 | 28 | 95 | 35 | 106 | 101 | 66 | 22 | 87 | 76 | 38 | 81 | 82 | 103 | 69 | 43 | 104 | 67 | 26 | 80 | 6 | 11 | 97 | 77 | 100 | 98 | 90 | 99 | 83 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 96 | 39 | 34 | 50 | 49 | 45 | 10 | 92 | 60 | 68 | |
18 | 73 | 5 | 85 | 1 | 42 | 64 | 32 | 14 | 79 | 84 | 8 | 58 | 57 | 40 | 47 | 17 | 7 | 41 | 21 | 3 | 13 | 16 | 74 | 91 | 23 | 12 | 36 | 19 | 63 | 71 | 88 | 0 | 9 | 89 | 4 | 52 | 31 | 56 | 37 | 72 | 62 | 2 | 78 | 20 | 93 | 105 | 15 | 55 | 30 | 46 | 51 | 65 | 86 | 33 | 103 | 53 | 29 | 94 | 24 | 25 | 44 | 102 | 43 | 22 | 27 | 28 | 35 | 80 | 38 | 66 | 87 | 76 | 106 | 101 | 95 | 69 | 81 | 26 | 82 | 67 | 77 | 83 | 11 | 104 | 75 | 18 | 48 | 59 | 70 | 61 | 10 | 54 | 50 | 90 | 96 | 6 | 97 | 98 | 99 | 100 | 49 | 45 | 92 | 68 | 39 | 34 | 60 | |
19 | 73 | 85 | 5 | 32 | 42 | 64 | 1 | 91 | 58 | 8 | 21 | 23 | 14 | 47 | 17 | 41 | 74 | 40 | 79 | 84 | 7 | 57 | 3 | 19 | 13 | 12 | 31 | 16 | 4 | 37 | 30 | 36 | 9 | 71 | 29 | 63 | 52 | 0 | 62 | 20 | 93 | 55 | 94 | 6 | 15 | 88 | 89 | 51 | 56 | 72 | 11 | 105 | 90 | 78 | 102 | 2 | 46 | 92 | 86 | 95 | 81 | 33 | 82 | 53 | 44 | 24 | 25 | 65 | 106 | 101 | 35 | 22 | 27 | 38 | 87 | 76 | 28 | 104 | 103 | 43 | 66 | 83 | 54 | 96 | 75 | 18 | 70 | 48 | 59 | 61 | 10 | 69 | 80 | 50 | 26 | 67 | 98 | 97 | 100 | 99 | 77 | 68 | 60 | 34 | 39 | 49 | 45 | |
20 | 32 | 85 | 5 | 73 | 42 | 23 | 1 | 64 | 79 | 84 | 14 | 21 | 8 | 58 | 31 | 47 | 17 | 7 | 41 | 37 | 13 | 91 | 40 | 57 | 3 | 0 | 74 | 19 | 12 | 63 | 71 | 16 | 52 | 93 | 9 | 4 | 72 | 88 | 36 | 62 | 55 | 20 | 102 | 56 | 30 | 89 | 15 | 105 | 2 | 51 | 29 | 94 | 46 | 65 | 78 | 81 | 82 | 11 | 43 | 90 | 95 | 80 | 6 | 33 | 103 | 86 | 106 | 101 | 53 | 10 | 83 | 25 | 75 | 18 | 48 | 59 | 70 | 61 | 44 | 54 | 24 | 50 | 35 | 38 | 104 | 27 | 28 | 99 | 66 | 22 | 87 | 76 | 77 | 97 | 69 | 98 | 100 | 67 | 92 | 34 | 39 | 26 | 96 | 68 | 60 | 45 | 49 | |
21 | 5 | 85 | 73 | 64 | 32 | 42 | 1 | 14 | 58 | 8 | 57 | 47 | 17 | 21 | 41 | 91 | 40 | 3 | 23 | 84 | 74 | 79 | 16 | 7 | 13 | 19 | 12 | 36 | 93 | 31 | 4 | 30 | 9 | 37 | 88 | 20 | 29 | 94 | 56 | 78 | 15 | 33 | 0 | 63 | 62 | 71 | 89 | 102 | 52 | 105 | 86 | 51 | 46 | 2 | 44 | 53 | 81 | 82 | 55 | 25 | 24 | 72 | 27 | 28 | 35 | 66 | 38 | 95 | 22 | 87 | 76 | 92 | 106 | 101 | 69 | 65 | 6 | 11 | 103 | 90 | 67 | 104 | 83 | 96 | 54 | 75 | 18 | 26 | 70 | 48 | 59 | 61 | 43 | 50 | 10 | 98 | 77 | 97 | 80 | 100 | 49 | 45 | 99 | 68 | 60 | 39 | 34 | |
22 | 73 | 79 | 5 | 84 | 85 | 42 | 1 | 64 | 32 | 91 | 58 | 14 | 21 | 8 | 47 | 74 | 17 | 41 | 63 | 71 | 19 | 23 | 7 | 52 | 57 | 40 | 15 | 3 | 62 | 13 | 55 | 94 | 12 | 31 | 93 | 20 | 16 | 51 | 88 | 37 | 4 | 30 | 0 | 89 | 36 | 56 | 72 | 9 | 29 | 78 | 106 | 101 | 102 | 2 | 104 | 98 | 46 | 6 | 65 | 95 | 100 | 105 | 97 | 43 | 90 | 11 | 86 | 53 | 33 | 24 | 80 | 44 | 25 | 87 | 76 | 22 | 35 | 38 | 96 | 27 | 28 | 26 | 66 | 103 | 81 | 82 | 92 | 69 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 61 | 67 | 50 | 10 | 34 | 39 | 68 | 77 | 60 | 99 | 49 | 45 | |
23 | 5 | 73 | 85 | 64 | 1 | 42 | 57 | 16 | 14 | 40 | 3 | 32 | 8 | 58 | 47 | 17 | 41 | 21 | 35 | 36 | 78 | 79 | 84 | 7 | 38 | 23 | 13 | 12 | 74 | 91 | 31 | 19 | 4 | 46 | 56 | 88 | 37 | 89 | 76 | 87 | 63 | 71 | 62 | 9 | 2 | 52 | 20 | 93 | 51 | 72 | 0 | 15 | 55 | 30 | 66 | 69 | 67 | 28 | 27 | 86 | 102 | 33 | 25 | 53 | 105 | 60 | 44 | 49 | 68 | 81 | 65 | 82 | 24 | 94 | 45 | 29 | 43 | 22 | 106 | 101 | 103 | 80 | 95 | 104 | 77 | 90 | 11 | 54 | 83 | 26 | 75 | 18 | 70 | 48 | 59 | 61 | 10 | 97 | 98 | 6 | 96 | 50 | 100 | 99 | 34 | 39 | 92 | |
24 | 73 | 5 | 85 | 64 | 42 | 1 | 79 | 32 | 84 | 58 | 14 | 8 | 47 | 17 | 21 | 41 | 40 | 57 | 3 | 91 | 12 | 7 | 63 | 71 | 16 | 74 | 13 | 23 | 52 | 4 | 36 | 62 | 19 | 55 | 31 | 88 | 9 | 37 | 51 | 30 | 93 | 56 | 0 | 20 | 15 | 89 | 78 | 105 | 29 | 72 | 2 | 46 | 86 | 53 | 102 | 33 | 44 | 94 | 24 | 25 | 65 | 103 | 6 | 27 | 35 | 38 | 28 | 106 | 101 | 66 | 81 | 22 | 82 | 87 | 76 | 95 | 34 | 39 | 43 | 69 | 11 | 104 | 67 | 90 | 80 | 92 | 26 | 96 | 97 | 50 | 61 | 98 | 59 | 70 | 48 | 54 | 18 | 75 | 100 | 83 | 77 | 10 | 45 | 49 | 68 | 99 | 60 | |
25 | 73 | 5 | 85 | 32 | 64 | 42 | 1 | 79 | 84 | 63 | 14 | 71 | 52 | 8 | 58 | 23 | 62 | 40 | 21 | 57 | 3 | 47 | 17 | 41 | 7 | 13 | 91 | 16 | 12 | 74 | 51 | 31 | 55 | 88 | 93 | 36 | 37 | 19 | 4 | 9 | 0 | 78 | 56 | 20 | 94 | 72 | 89 | 2 | 15 | 30 | 46 | 102 | 105 | 29 | 65 | 86 | 53 | 33 | 44 | 6 | 103 | 43 | 95 | 24 | 25 | 87 | 76 | 106 | 101 | 90 | 38 | 35 | 27 | 81 | 11 | 82 | 28 | 80 | 66 | 39 | 34 | 22 | 104 | 96 | 69 | 92 | 67 | 50 | 98 | 26 | 97 | 100 | 61 | 59 | 48 | 70 | 18 | 75 | 77 | 99 | 83 | 54 | 68 | 45 | 49 | 10 | 60 | |
26 | 73 | 5 | 85 | 1 | 64 | 42 | 32 | 14 | 8 | 58 | 91 | 47 | 17 | 57 | 40 | 41 | 21 | 3 | 16 | 84 | 79 | 74 | 15 | 7 | 23 | 12 | 78 | 19 | 13 | 36 | 35 | 31 | 30 | 4 | 38 | 37 | 88 | 93 | 29 | 9 | 20 | 62 | 56 | 106 | 101 | 46 | 102 | 63 | 104 | 71 | 89 | 51 | 76 | 87 | 52 | 98 | 2 | 94 | 0 | 55 | 105 | 97 | 72 | 100 | 66 | 27 | 28 | 69 | 86 | 67 | 33 | 81 | 25 | 95 | 53 | 82 | 44 | 60 | 24 | 68 | 49 | 6 | 45 | 65 | 11 | 90 | 22 | 43 | 77 | 92 | 103 | 83 | 54 | 80 | 75 | 18 | 70 | 48 | 59 | 61 | 26 | 50 | 10 | 99 | 96 | 34 | 39 | |
27 | 73 | 85 | 5 | 84 | 79 | 42 | 64 | 1 | 32 | 58 | 14 | 47 | 17 | 8 | 57 | 41 | 21 | 74 | 40 | 3 | 91 | 19 | 16 | 7 | 13 | 23 | 12 | 71 | 63 | 36 | 31 | 52 | 55 | 88 | 4 | 20 | 37 | 62 | 9 | 56 | 0 | 30 | 93 | 89 | 94 | 105 | 78 | 15 | 29 | 51 | 2 | 46 | 33 | 72 | 103 | 86 | 53 | 81 | 82 | 25 | 24 | 44 | 102 | 27 | 35 | 28 | 65 | 38 | 22 | 95 | 66 | 106 | 101 | 76 | 87 | 69 | 6 | 26 | 43 | 67 | 11 | 90 | 104 | 96 | 80 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 61 | 99 | 50 | 97 | 39 | 34 | 10 | 98 | 100 | 68 | 49 | 77 | 92 | 45 | 60 | |
28 | 5 | 73 | 85 | 32 | 64 | 42 | 1 | 14 | 57 | 8 | 40 | 79 | 58 | 3 | 23 | 21 | 84 | 47 | 17 | 41 | 16 | 7 | 91 | 13 | 12 | 37 | 31 | 36 | 74 | 4 | 63 | 19 | 71 | 62 | 52 | 9 | 89 | 56 | 51 | 0 | 88 | 55 | 20 | 105 | 30 | 15 | 46 | 2 | 93 | 78 | 72 | 102 | 33 | 86 | 29 | 44 | 53 | 81 | 82 | 65 | 35 | 38 | 103 | 25 | 24 | 27 | 94 | 28 | 106 | 101 | 66 | 90 | 87 | 76 | 6 | 95 | 11 | 43 | 69 | 22 | 104 | 67 | 80 | 83 | 97 | 54 | 75 | 18 | 70 | 48 | 59 | 92 | 99 | 61 | 100 | 98 | 10 | 50 | 26 | 77 | 96 | 45 | 49 | 68 | 34 | 39 | 60 | |
29 | 85 | 73 | 5 | 32 | 42 | 1 | 64 | 58 | 23 | 8 | 21 | 47 | 17 | 41 | 14 | 93 | 7 | 74 | 40 | 79 | 91 | 84 | 57 | 13 | 3 | 19 | 31 | 12 | 16 | 37 | 4 | 36 | 72 | 0 | 9 | 88 | 102 | 20 | 30 | 56 | 89 | 2 | 94 | 63 | 71 | 29 | 52 | 15 | 62 | 65 | 46 | 78 | 55 | 43 | 51 | 33 | 86 | 105 | 11 | 80 | 53 | 24 | 25 | 44 | 22 | 90 | 6 | 95 | 27 | 87 | 76 | 35 | 106 | 101 | 10 | 28 | 77 | 83 | 81 | 75 | 18 | 104 | 48 | 59 | 61 | 70 | 50 | 26 | 82 | 66 | 38 | 54 | 96 | 69 | 98 | 67 | 97 | 92 | 103 | 100 | 39 | 34 | 68 | 99 | 60 | 49 | 45 | |
30 | 5 | 73 | 85 | 42 | 64 | 32 | 1 | 14 | 57 | 58 | 84 | 8 | 79 | 19 | 40 | 74 | 47 | 17 | 21 | 41 | 20 | 3 | 23 | 16 | 7 | 91 | 13 | 56 | 12 | 31 | 88 | 36 | 93 | 37 | 4 | 89 | 78 | 46 | 63 | 71 | 72 | 9 | 2 | 102 | 52 | 30 | 62 | 55 | 15 | 29 | 0 | 105 | 94 | 51 | 65 | 81 | 82 | 33 | 86 | 95 | 53 | 43 | 25 | 106 | 101 | 24 | 87 | 76 | 35 | 80 | 22 | 38 | 11 | 44 | 90 | 104 | 6 | 27 | 26 | 28 | 66 | 54 | 103 | 83 | 18 | 70 | 48 | 59 | 75 | 61 | 99 | 97 | 10 | 69 | 98 | 50 | 100 | 67 | 96 | 77 | 68 | 34 | 39 | 60 | 92 | 45 | 49 | |
31 | 73 | 5 | 85 | 64 | 42 | 1 | 32 | 79 | 84 | 14 | 8 | 58 | 40 | 47 | 17 | 41 | 21 | 3 | 91 | 57 | 7 | 15 | 23 | 13 | 12 | 16 | 74 | 63 | 4 | 71 | 36 | 52 | 31 | 19 | 62 | 9 | 55 | 37 | 93 | 30 | 88 | 56 | 0 | 51 | 106 | 101 | 29 | 78 | 102 | 98 | 89 | 104 | 20 | 94 | 72 | 2 | 105 | 46 | 97 | 86 | 100 | 53 | 33 | 44 | 95 | 24 | 65 | 6 | 25 | 27 | 22 | 35 | 28 | 87 | 76 | 38 | 11 | 43 | 90 | 66 | 81 | 82 | 39 | 34 | 103 | 69 | 92 | 80 | 67 | 26 | 50 | 96 | 99 | 61 | 59 | 70 | 48 | 18 | 54 | 75 | 77 | 83 | 45 | 49 | 68 | 10 | 60 | |
32 | 73 | 5 | 85 | 84 | 1 | 79 | 64 | 14 | 57 | 3 | 16 | 42 | 40 | 8 | 58 | 38 | 32 | 47 | 17 | 41 | 91 | 21 | 36 | 35 | 74 | 7 | 13 | 12 | 93 | 23 | 19 | 4 | 62 | 88 | 78 | 30 | 63 | 31 | 71 | 52 | 45 | 68 | 51 | 9 | 67 | 56 | 49 | 60 | 66 | 69 | 46 | 55 | 28 | 27 | 102 | 37 | 15 | 86 | 2 | 33 | 20 | 94 | 29 | 53 | 25 | 89 | 44 | 76 | 87 | 105 | 0 | 24 | 72 | 65 | 22 | 95 | 106 | 101 | 6 | 104 | 43 | 81 | 103 | 82 | 26 | 11 | 80 | 97 | 77 | 90 | 96 | 98 | 100 | 92 | 39 | 34 | 83 | 99 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 50 | 10 | |
33 | 85 | 32 | 5 | 73 | 42 | 1 | 64 | 23 | 58 | 21 | 47 | 8 | 17 | 41 | 14 | 91 | 79 | 57 | 40 | 84 | 7 | 3 | 37 | 31 | 13 | 74 | 12 | 19 | 16 | 0 | 4 | 36 | 63 | 71 | 20 | 9 | 88 | 52 | 89 | 56 | 62 | 72 | 30 | 105 | 55 | 78 | 51 | 2 | 81 | 93 | 15 | 82 | 103 | 46 | 29 | 65 | 94 | 11 | 102 | 33 | 90 | 86 | 43 | 53 | 6 | 35 | 44 | 38 | 10 | 80 | 87 | 76 | 25 | 83 | 75 | 18 | 48 | 54 | 70 | 59 | 24 | 61 | 27 | 50 | 28 | 106 | 101 | 95 | 66 | 77 | 22 | 69 | 96 | 67 | 104 | 34 | 39 | 97 | 99 | 92 | 100 | 68 | 26 | 98 | 60 | 49 | 45 | |
34 | 85 | 73 | 5 | 32 | 42 | 64 | 1 | 79 | 14 | 23 | 84 | 63 | 8 | 71 | 21 | 58 | 52 | 47 | 17 | 40 | 41 | 57 | 7 | 3 | 62 | 13 | 91 | 31 | 12 | 16 | 37 | 74 | 93 | 51 | 0 | 36 | 4 | 55 | 88 | 19 | 9 | 89 | 56 | 30 | 94 | 78 | 15 | 72 | 2 | 20 | 46 | 102 | 29 | 105 | 86 | 33 | 53 | 81 | 82 | 44 | 65 | 25 | 24 | 90 | 35 | 27 | 28 | 38 | 6 | 66 | 87 | 76 | 103 | 11 | 43 | 95 | 96 | 106 | 101 | 92 | 69 | 22 | 80 | 67 | 104 | 83 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 50 | 77 | 10 | 98 | 99 | 26 | 97 | 100 | 45 | 49 | 68 | 39 | 34 | 60 | |
35 | 73 | 5 | 85 | 42 | 64 | 79 | 84 | 32 | 1 | 14 | 57 | 40 | 3 | 8 | 58 | 47 | 17 | 21 | 16 | 41 | 23 | 7 | 36 | 74 | 15 | 13 | 31 | 12 | 91 | 19 | 37 | 88 | 71 | 63 | 4 | 93 | 55 | 56 | 52 | 9 | 62 | 33 | 78 | 2 | 20 | 46 | 86 | 89 | 72 | 106 | 101 | 53 | 94 | 102 | 0 | 30 | 25 | 51 | 44 | 105 | 104 | 24 | 98 | 27 | 28 | 65 | 66 | 29 | 35 | 97 | 38 | 76 | 87 | 22 | 100 | 69 | 81 | 82 | 95 | 43 | 67 | 103 | 34 | 39 | 96 | 26 | 80 | 77 | 50 | 61 | 59 | 70 | 48 | 54 | 18 | 75 | 83 | 6 | 49 | 99 | 92 | 45 | 90 | 11 | 10 | 60 | 68 | |
36 | 73 | 5 | 85 | 42 | 64 | 14 | 1 | 79 | 32 | 84 | 57 | 3 | 40 | 58 | 8 | 16 | 47 | 17 | 41 | 21 | 63 | 91 | 71 | 36 | 7 | 12 | 78 | 52 | 74 | 13 | 62 | 23 | 35 | 38 | 4 | 88 | 31 | 19 | 55 | 51 | 9 | 56 | 37 | 46 | 2 | 30 | 0 | 76 | 87 | 20 | 89 | 72 | 103 | 86 | 105 | 93 | 66 | 53 | 27 | 69 | 28 | 44 | 67 | 15 | 33 | 29 | 25 | 24 | 65 | 60 | 94 | 49 | 45 | 68 | 102 | 22 | 43 | 81 | 82 | 6 | 106 | 101 | 11 | 95 | 90 | 80 | 77 | 96 | 26 | 92 | 39 | 34 | 104 | 54 | 83 | 75 | 18 | 70 | 48 | 59 | 61 | 50 | 97 | 99 | 98 | 100 | 10 | |
37 | 85 | 73 | 5 | 42 | 32 | 64 | 1 | 79 | 84 | 14 | 8 | 58 | 21 | 23 | 57 | 47 | 40 | 17 | 41 | 7 | 3 | 13 | 63 | 91 | 71 | 74 | 52 | 62 | 19 | 16 | 31 | 88 | 12 | 93 | 51 | 0 | 37 | 36 | 78 | 4 | 9 | 94 | 55 | 30 | 56 | 89 | 20 | 72 | 29 | 2 | 15 | 102 | 46 | 105 | 6 | 81 | 65 | 82 | 95 | 11 | 86 | 33 | 90 | 43 | 53 | 87 | 76 | 38 | 35 | 44 | 106 | 101 | 25 | 24 | 80 | 27 | 28 | 104 | 103 | 66 | 22 | 92 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 96 | 61 | 69 | 50 | 10 | 98 | 97 | 67 | 26 | 100 | 77 | 68 | 60 | 45 | 99 | 39 | 34 | 49 | |
38 | 5 | 73 | 85 | 1 | 32 | 64 | 42 | 58 | 8 | 14 | 23 | 91 | 47 | 17 | 21 | 41 | 57 | 40 | 3 | 84 | 79 | 74 | 7 | 19 | 16 | 12 | 13 | 37 | 31 | 20 | 93 | 36 | 4 | 102 | 30 | 89 | 9 | 56 | 29 | 15 | 105 | 63 | 71 | 0 | 88 | 52 | 62 | 55 | 72 | 81 | 46 | 82 | 2 | 51 | 94 | 33 | 86 | 11 | 6 | 78 | 53 | 106 | 101 | 24 | 90 | 44 | 25 | 95 | 35 | 104 | 65 | 22 | 27 | 28 | 38 | 66 | 99 | 103 | 87 | 76 | 43 | 54 | 97 | 83 | 80 | 18 | 75 | 70 | 10 | 48 | 59 | 98 | 69 | 61 | 100 | 26 | 50 | 67 | 92 | 96 | 34 | 39 | 68 | 77 | 49 | 45 | 60 | |
39 | 73 | 5 | 85 | 32 | 1 | 42 | 64 | 58 | 21 | 8 | 91 | 47 | 17 | 41 | 14 | 23 | 7 | 79 | 84 | 13 | 74 | 40 | 57 | 3 | 31 | 12 | 19 | 0 | 16 | 63 | 37 | 4 | 71 | 93 | 52 | 9 | 62 | 36 | 88 | 30 | 89 | 20 | 51 | 72 | 56 | 15 | 94 | 29 | 55 | 2 | 102 | 78 | 46 | 105 | 65 | 11 | 90 | 95 | 6 | 43 | 86 | 106 | 101 | 53 | 33 | 80 | 44 | 24 | 81 | 25 | 82 | 104 | 10 | 35 | 38 | 83 | 87 | 76 | 75 | 18 | 48 | 70 | 59 | 54 | 61 | 22 | 27 | 50 | 28 | 103 | 66 | 69 | 99 | 97 | 92 | 77 | 96 | 26 | 98 | 100 | 67 | 34 | 39 | 68 | 60 | 45 | 49 | |
40 | 85 | 73 | 5 | 1 | 32 | 42 | 64 | 8 | 14 | 58 | 40 | 15 | 47 | 17 | 21 | 74 | 41 | 3 | 57 | 16 | 23 | 7 | 79 | 84 | 13 | 19 | 91 | 12 | 36 | 31 | 106 | 101 | 4 | 37 | 35 | 78 | 104 | 38 | 88 | 98 | 97 | 72 | 9 | 89 | 100 | 102 | 2 | 56 | 63 | 0 | 71 | 62 | 105 | 20 | 52 | 46 | 30 | 51 | 93 | 55 | 65 | 95 | 29 | 76 | 87 | 86 | 66 | 25 | 27 | 43 | 53 | 28 | 94 | 69 | 33 | 67 | 44 | 24 | 81 | 82 | 60 | 80 | 49 | 68 | 45 | 22 | 99 | 11 | 77 | 90 | 103 | 6 | 26 | 83 | 75 | 18 | 48 | 70 | 59 | 54 | 61 | 10 | 50 | 96 | 92 | 39 | 34 | |
41 | 73 | 85 | 5 | 42 | 32 | 64 | 1 | 14 | 84 | 79 | 91 | 57 | 8 | 58 | 40 | 47 | 21 | 17 | 23 | 41 | 3 | 7 | 16 | 74 | 31 | 13 | 19 | 20 | 12 | 30 | 36 | 37 | 71 | 63 | 29 | 88 | 93 | 4 | 52 | 56 | 9 | 94 | 62 | 89 | 55 | 0 | 72 | 15 | 78 | 2 | 81 | 102 | 82 | 46 | 33 | 51 | 86 | 105 | 53 | 6 | 25 | 24 | 11 | 95 | 44 | 65 | 90 | 22 | 35 | 27 | 28 | 38 | 43 | 106 | 101 | 66 | 103 | 76 | 87 | 26 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 80 | 61 | 69 | 96 | 104 | 10 | 50 | 92 | 67 | 99 | 77 | 98 | 68 | 39 | 34 | 97 | 100 | 60 | 49 | 45 | |
42 | 73 | 5 | 85 | 64 | 79 | 84 | 42 | 1 | 58 | 32 | 47 | 17 | 41 | 21 | 8 | 14 | 57 | 40 | 3 | 74 | 91 | 7 | 16 | 12 | 63 | 71 | 13 | 23 | 52 | 36 | 19 | 62 | 4 | 88 | 55 | 31 | 93 | 9 | 56 | 78 | 51 | 20 | 37 | 30 | 0 | 89 | 2 | 46 | 72 | 86 | 15 | 33 | 94 | 53 | 29 | 44 | 105 | 24 | 25 | 102 | 65 | 27 | 28 | 38 | 35 | 66 | 87 | 76 | 22 | 103 | 69 | 6 | 43 | 106 | 101 | 81 | 82 | 67 | 95 | 11 | 26 | 96 | 90 | 104 | 80 | 92 | 39 | 34 | 97 | 77 | 98 | 54 | 83 | 18 | 75 | 70 | 48 | 59 | 61 | 100 | 45 | 49 | 50 | 10 | 68 | 99 | 60 | |
43 | 5 | 85 | 32 | 73 | 1 | 42 | 64 | 23 | 14 | 21 | 8 | 58 | 91 | 47 | 17 | 41 | 79 | 57 | 7 | 93 | 84 | 40 | 31 | 3 | 13 | 12 | 37 | 16 | 19 | 74 | 62 | 63 | 71 | 52 | 0 | 4 | 51 | 30 | 9 | 36 | 20 | 56 | 6 | 55 | 88 | 29 | 89 | 94 | 72 | 90 | 78 | 11 | 102 | 2 | 46 | 15 | 92 | 65 | 105 | 81 | 82 | 87 | 76 | 43 | 86 | 38 | 33 | 35 | 96 | 53 | 44 | 80 | 54 | 83 | 75 | 25 | 18 | 70 | 48 | 59 | 24 | 61 | 10 | 27 | 95 | 106 | 101 | 28 | 66 | 103 | 50 | 104 | 69 | 22 | 99 | 98 | 77 | 67 | 97 | 100 | 68 | 60 | 39 | 34 | 26 | 45 | 49 | |
44 | 5 | 73 | 85 | 64 | 42 | 84 | 79 | 1 | 32 | 14 | 57 | 8 | 40 | 3 | 58 | 47 | 17 | 21 | 41 | 7 | 16 | 23 | 91 | 13 | 12 | 74 | 36 | 63 | 71 | 31 | 52 | 4 | 37 | 62 | 19 | 55 | 88 | 9 | 93 | 51 | 89 | 15 | 105 | 56 | 0 | 78 | 20 | 2 | 94 | 46 | 102 | 72 | 86 | 30 | 33 | 53 | 103 | 44 | 29 | 24 | 25 | 65 | 81 | 82 | 95 | 106 | 101 | 27 | 35 | 28 | 66 | 87 | 76 | 38 | 22 | 43 | 69 | 39 | 34 | 104 | 67 | 80 | 26 | 97 | 96 | 98 | 100 | 50 | 6 | 90 | 61 | 59 | 70 | 48 | 18 | 54 | 75 | 11 | 77 | 83 | 99 | 49 | 45 | 92 | 68 | 10 | 60 | |
45 | 73 | 5 | 85 | 79 | 64 | 42 | 84 | 1 | 32 | 14 | 57 | 8 | 40 | 58 | 3 | 47 | 17 | 21 | 41 | 7 | 63 | 71 | 23 | 13 | 16 | 52 | 74 | 91 | 62 | 12 | 89 | 36 | 37 | 88 | 19 | 31 | 55 | 93 | 0 | 4 | 51 | 20 | 105 | 9 | 56 | 72 | 15 | 2 | 102 | 78 | 46 | 103 | 65 | 30 | 86 | 53 | 33 | 94 | 29 | 43 | 44 | 25 | 24 | 106 | 101 | 80 | 35 | 38 | 27 | 95 | 28 | 81 | 82 | 66 | 87 | 76 | 22 | 104 | 69 | 34 | 39 | 67 | 26 | 90 | 6 | 97 | 99 | 11 | 98 | 92 | 100 | 96 | 50 | 77 | 61 | 49 | 59 | 45 | 48 | 70 | 18 | 68 | 75 | 54 | 83 | 10 | 60 | |
46 | 5 | 73 | 32 | 85 | 1 | 42 | 64 | 14 | 23 | 91 | 8 | 7 | 21 | 40 | 58 | 3 | 47 | 17 | 41 | 13 | 57 | 16 | 79 | 31 | 62 | 12 | 84 | 63 | 52 | 71 | 74 | 4 | 0 | 51 | 36 | 78 | 37 | 9 | 38 | 30 | 93 | 19 | 35 | 29 | 55 | 88 | 89 | 56 | 20 | 46 | 2 | 15 | 6 | 72 | 90 | 76 | 87 | 102 | 94 | 11 | 92 | 86 | 66 | 44 | 67 | 53 | 69 | 105 | 27 | 28 | 45 | 65 | 68 | 60 | 81 | 25 | 82 | 33 | 49 | 24 | 43 | 106 | 101 | 95 | 80 | 83 | 54 | 96 | 75 | 104 | 18 | 70 | 48 | 59 | 61 | 22 | 10 | 77 | 50 | 103 | 98 | 97 | 100 | 26 | 99 | 34 | 39 | |
47 | 85 | 5 | 73 | 84 | 42 | 79 | 32 | 1 | 64 | 58 | 21 | 14 | 47 | 17 | 57 | 41 | 8 | 74 | 40 | 19 | 23 | 91 | 3 | 16 | 7 | 13 | 12 | 31 | 93 | 63 | 71 | 52 | 94 | 36 | 55 | 20 | 56 | 62 | 37 | 4 | 88 | 30 | 51 | 0 | 9 | 102 | 15 | 46 | 89 | 78 | 29 | 2 | 105 | 72 | 95 | 81 | 82 | 33 | 86 | 53 | 25 | 6 | 44 | 24 | 35 | 38 | 27 | 106 | 101 | 11 | 28 | 65 | 103 | 66 | 87 | 76 | 22 | 90 | 104 | 69 | 26 | 96 | 67 | 43 | 83 | 54 | 18 | 75 | 48 | 70 | 59 | 61 | 92 | 98 | 97 | 50 | 100 | 80 | 10 | 77 | 99 | 39 | 34 | 68 | 45 | 49 | 60 | |
48 | 85 | 5 | 73 | 42 | 32 | 64 | 1 | 14 | 8 | 58 | 21 | 47 | 17 | 41 | 57 | 40 | 84 | 3 | 79 | 23 | 91 | 16 | 74 | 7 | 12 | 19 | 31 | 13 | 15 | 36 | 4 | 37 | 88 | 9 | 30 | 56 | 20 | 93 | 89 | 94 | 78 | 33 | 71 | 63 | 106 | 101 | 29 | 2 | 46 | 86 | 55 | 72 | 52 | 105 | 0 | 98 | 53 | 62 | 104 | 102 | 25 | 44 | 24 | 97 | 81 | 82 | 100 | 27 | 65 | 51 | 28 | 95 | 35 | 22 | 66 | 87 | 76 | 38 | 69 | 103 | 43 | 67 | 11 | 26 | 6 | 90 | 80 | 77 | 96 | 83 | 75 | 18 | 54 | 48 | 70 | 59 | 61 | 50 | 10 | 92 | 49 | 68 | 45 | 99 | 39 | 34 | 60 | |
49 | 73 | 85 | 5 | 64 | 42 | 1 | 32 | 58 | 79 | 84 | 8 | 14 | 47 | 17 | 41 | 21 | 40 | 57 | 91 | 3 | 74 | 7 | 23 | 13 | 16 | 12 | 19 | 88 | 36 | 31 | 4 | 63 | 71 | 72 | 30 | 52 | 56 | 9 | 37 | 93 | 62 | 2 | 29 | 20 | 78 | 55 | 15 | 0 | 89 | 46 | 51 | 102 | 65 | 105 | 94 | 86 | 33 | 43 | 53 | 6 | 44 | 24 | 25 | 11 | 35 | 80 | 106 | 101 | 81 | 22 | 82 | 27 | 87 | 76 | 90 | 28 | 38 | 95 | 103 | 66 | 104 | 69 | 92 | 26 | 67 | 83 | 54 | 75 | 18 | 70 | 48 | 59 | 61 | 97 | 96 | 10 | 50 | 100 | 98 | 77 | 99 | 68 | 49 | 45 | 39 | 34 | 60 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pytest | |
import pandas as pd | |
import os | |
from numpy.testing import assert_array_almost_equal, assert_array_equal | |
from mlpy import borda_count as borda_mlpy | |
from .borda import borda_count_np | |
@pytest.fixture() | |
def docstring_example(): | |
"""Returns the example reported in MLPY borda_count docstring""" | |
x = [ | |
[2, 4, 1, 3, 0], # first ranked list | |
[3, 4, 1, 2, 0], # second ranked list | |
[2, 4, 3, 0, 1], # third ranked list | |
[0, 1, 4, 2, 3], # fo`urth ranked list | |
] | |
return x | |
@pytest.fixture() | |
def ranking_lists_with_reps(): | |
"""Returns the example reported in MLPY borda_count docstring""" | |
x = [ | |
[2, 4, 3, 3, 0], # first ranked list | |
[3, 4, 1, 2, 0], # second ranked list | |
[2, 4, 1, 0, 1], # third ranked list | |
[0, 1, 2, 2, 3], # fourth ranked list | |
] | |
return x | |
@pytest.fixture() | |
def data_folder(): | |
return os.path.abspath(os.path.dirname(__file__)) | |
@pytest.fixture() | |
def dap_rankings(data_folder): | |
"""Loads a Ranking example as returned by a DAP execution""" | |
fp = os.path.join(data_folder, "metric_ranking_dap.csv") | |
df = pd.read_csv(fp, header=0, index_col=0) | |
return df.values | |
def _compare_borda_arrays(fixture, top_k=None): | |
ids_mlpy, count_exts_mlpy, mean_pos_mlpy = borda_mlpy(fixture, k=top_k) | |
ids_np, count_exts_np, mean_pos_np = borda_count_np(fixture, k=top_k) | |
assert_array_equal(ids_mlpy, ids_np, "Rankings are Different") | |
assert_array_equal( | |
count_exts_mlpy, count_exts_np, "Count Extractions are Different" | |
) | |
assert_array_almost_equal( | |
mean_pos_mlpy, mean_pos_np, decimal=6, err_msg="Mean Positions are Different" | |
) | |
def test_dummy_ranking(docstring_example): | |
_compare_borda_arrays(docstring_example) | |
def test_borda_numpy_implementation_dap_ranking(dap_rankings): | |
_compare_borda_arrays(dap_rankings) | |
# Test and Compare Borda results at different values of TopK selections | |
def test_dummy_ranking_top_k(docstring_example): | |
for top_k in (1, 2, 3, 4): | |
_compare_borda_arrays(docstring_example, top_k=top_k) | |
def test_dap_ranking_top_k(dap_rankings): | |
for top_k in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 107): | |
_compare_borda_arrays(dap_rankings, top_k=top_k) | |
def test_exception_is_raised_with_k_out_of_range(docstring_example): | |
# Testing MLPY implementation first for comparability | |
with pytest.raises(ValueError): | |
borda_mlpy(docstring_example, k=0) | |
with pytest.raises(ValueError): | |
borda_count_np(docstring_example, k=0) | |
# Testing MLPY implementation first for comparability | |
with pytest.raises(ValueError): | |
borda_mlpy(docstring_example, k=6) | |
with pytest.raises(ValueError): | |
borda_count_np(docstring_example, k=6) | |
def test_value_error_rankings_list_with_repetitions(ranking_lists_with_reps): | |
with pytest.raises(ValueError): | |
borda_count_np(ranking_lists_with_reps) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment