コード例 #1
0
 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()
コード例 #2
0
ファイル: change.py プロジェクト: spearous0001/SHARE
    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()
コード例 #3
0
    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()
コード例 #4
0
    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()