def disambiguate(self): gd = GraphDisambiguator() gd.find_instances(self) self.nodes = TopographicalSorter( self.nodes, dependencies=lambda n: tuple( e.related for e in n.related(backward=False))).sorted()
def process(self, normalize=True, prune=True, disambiguate=True): # TODO move models' normalize methods to regulator steps (SHARE-1023) if normalize: self.normalize() gd = GraphDisambiguator() # TODO move pruning to regulator step (SHARE-1024) if prune: gd.prune(self) if disambiguate: gd.find_instances(self) self.nodes = TopographicalSorter(self.nodes, dependencies=lambda n: tuple(e.related for e in n.related(backward=False))).sorted()
def process(self, normalize=True, prune=True, disambiguate=True): if normalize: self.normalize() gd = GraphDisambiguator() if prune: gd.prune(self) if disambiguate: gd.find_instances(self) self.nodes = TopographicalSorter( self.nodes, dependencies=lambda n: tuple( e.related for e in n.related(backward=False))).sorted()
def __init__(self, data, namespace=None): self.nodes = [] self.relations = {} self._lookup = {} self.namespace = namespace hints, relations = {}, set() for blob in copy.deepcopy(data): id, type = blob.pop('@id'), blob.pop('@type').lower() self._lookup[id, type] = ChangeNode(self, id, type, blob, namespace=namespace) self.relations[self._lookup[id, type]] = set() self.nodes.append(self._lookup[id, type]) for k, v in tuple(blob.items()): if isinstance(v, dict) and k != 'extra' and not k.startswith('@'): related = (v.pop('@id'), v.pop('@type').lower()) hints[(id, type), related] = k relations.add(((id, type), related)) blob.pop(k) if isinstance(v, list): for rel in v: subject = (rel.pop('@id'), rel.pop('@type').lower()) relations.add((subject, (id, type))) blob.pop(k) for subject, related in relations: try: edge = GraphEdge(self._lookup[subject], self._lookup[related], hint=hints.get((subject, related))) except KeyError as e: raise UnresolvableReference(*e.args) self.relations[self._lookup[subject]].add(edge) self.relations[self._lookup[related]].add(edge) self.nodes = TopographicalSorter( self.nodes, dependencies=lambda n: tuple( e.related for e in n.related(backward=False))).sorted()