Source code for lcc.stars_processing.deciders.custom_decider

from lcc.stars_processing.utilities.base_decider import BaseDecider
from lcc.entities.exceptions import QueryInputError


[docs]class CustomDecider(BaseDecider): ''' This decider allows to specify ranges of coordinates got from descriptors. So there is no need to run `learn` method. Anyway it is implemented to be consistent with other deciders. Also it checks if `boundaries` and given coordinates match. Attributes ---------- boundaries : list, iterable List of tuples of two values - lower and higher border value treshold : float Treshold value for evaluating ''' def __init__(self, boundaries): ''' Parameters ---------- boundaries : list, iterable List of tuples of two values - lower and higher border value. If one of these value is None there is no lower/upper limit. Example ------- [(1,10), (5,None), (None,8)] First coordinate means "something between 1 and 10, the second means greater then 5 and the last one means something lower then 8 ''' if [x for x in boundaries if len(x) != 2]: raise QueryInputError( "List of boundaries have to be consist of tuples of two values") self.boundaries = boundaries self.treshold = 0.5
[docs] def evaluate(self, star_coords): """ Parameters ----------- star_coords : list Coordinates of inspected star got from sub-filters Returns -------- list of lists Probability that inspected star belongs to the searched group of objects """ self._checkDimensions(star_coords) probabilities = [] for one_star in star_coords: passed = not False in [self._evaluateOne( one_star[i], self.boundaries[i]) for i in range(len(self.boundaries))] if passed: probabilities.append(1) else: probabilities.append(0) return probabilities
def _evaluateOne(self, coo, coo_ranges): lower = coo_ranges[0] higher = coo_ranges[1] coo = float(coo) if lower and higher: return coo > lower and coo < higher elif lower: return coo > lower elif higher: return coo < higher return True
[docs] def learn(self, right_coords=[], wrong_coords=[]): """ No need to learn this decider. Anyway it is implemented to be consistent with other deciders. Also it checks if `boundaries` and given coordinates match. Parameters ----------- right_coords : list "Coordinates" of searched objects wrong_coords : list "Coordinates" of other objects Returns ------- NoneType None """ if len(right_coords) and len(wrong_coords): self._checkDimensions(right_coords) self._checkDimensions(wrong_coords)
def _checkDimensions(self, coords): expected_dim = len(self.boundaries) dim = len(coords[0]) if expected_dim != dim: raise QueryInputError("Dimension of the decider boundaries (dim: %i) and given coordinates (dim: %i) dont match.\nGot: %s" % ( expected_dim, dim, coords))