Source code for dnachisel.builtin_specifications.EnforceRegionsCompatibility

from collections import Counter
import itertools

from ..Location import Location
from ..Specification import Specification, SpecEvaluation

[docs]class EnforceRegionsCompatibility(Specification): """Ensure that different subregions satisfy compatibility constraints.""" max_possible_score = 0 def __init__(self, locations, compatibility_condition, condition_label='', boost=1.0): self.locations = [ Location.from_tuple(location) for location in locations ] self.compatibility_condition = compatibility_condition self.condition_label = condition_label self.boost = boost def evaluate(self, problem): incompatible_locations_pairs = [] for (r1, r2) in itertools.combinations(self.locations, 2): if not self.compatibility_condition(r1, r2, problem): incompatible_locations_pairs.append((r1, r2)) all_locations_with_incompatibility = [ region for incompatibles_pair in incompatible_locations_pairs for region in incompatibles_pair ] counter = Counter(all_locations_with_incompatibility) all_locations_with_incompatibility = sorted( list(set(all_locations_with_incompatibility)), key=counter.get ) score = -len(incompatible_locations_pairs) if score == 0: message = "All compatible !" else: message = "Found the following incompatibilities: %s" % ( incompatible_locations_pairs ) return SpecEvaluation( self, problem, score=score, locations=all_locations_with_incompatibility, message=message ) def localized(self, location, problem=None): if any(location.overlap_region(rl) for rl in self.locations): return self else: return None #(parent=self) def __repr__(self): return "CompatRegions(%s%s...)" % (self.condition_label, self.locations[0]) def __str__(self): return "CompatRegions(%s%s...)" % (self.condition_label, self.locations[0]) def label_parameters(self): params = [('locations', ", ".join([str(l) for l in self.locations]))] if self.condition_label not in [None, '']: params.append(('condition', self.condition_label)) return params