source: framspy/evolalg/dissimilarity/dissimilarity.py @ 1182

Last change on this file since 1182 was 1182, checked in by Maciej Komosinski, 19 months ago

More concise code and less redundancy in dissimilarity classes, added support for archive of genotypes, added hard limit on the number of genotype chars

File size: 1.3 KB
Line 
1from abc import ABC
2
3from evolalg.base.step import Step
4import numpy as np
5
6
7class Dissimilarity(Step, ABC):
8
9    def __init__(self, reduction="mean", output_field="dissim", knn=None, *args, **kwargs):
10        super(Dissimilarity, self).__init__(*args, **kwargs)
11
12        self.output_field = output_field
13        self.fn_reduce = Dissimilarity.get_reduction_by_name(reduction)
14        self.knn = knn
15
16
17    @staticmethod
18    def reduce(dissim_matrix, fn_reduce, knn):
19        if fn_reduce is None:
20            return dissim_matrix
21        elif fn_reduce is Dissimilarity.knn_mean:
22            return fn_reduce(dissim_matrix, 1, knn)
23        else:
24            return fn_reduce(dissim_matrix, axis=1)
25
26
27    @staticmethod
28    def knn_mean(dissim_matrix, axis, knn):
29        return np.mean(np.partition(dissim_matrix, knn)[:, :knn], axis=axis)
30
31
32    @staticmethod
33    def get_reduction_by_name(reduction: str):
34
35        if reduction not in REDUCTION_FUNCTION:
36            raise ValueError(f"Unknown reduction type '{reduction}'. Supported: {','.join(REDUCTION_FUNCTION.keys())}")
37
38        return REDUCTION_FUNCTION[reduction]
39
40
41
42REDUCTION_FUNCTION = {
43            "mean": np.mean,
44            "max": np.max,
45            "min": np.min,
46            "sum": np.sum,
47            "knn_mean": Dissimilarity.knn_mean,
48            "none": None
49        }
Note: See TracBrowser for help on using the repository browser.