Exemplo n.º 1
0
    def gen_cc2(self):
        if self.semantics is None:
            return
        self.delete_folder(self.get_cc2_folder())
        os.makedirs(join(self.get_cc2_folder(), "closure"))
        os.makedirs(join(self.get_cc2_folder(), "synthesis"))

        pomsets = [self.semantics[f] for f in self.semantics]
        cc2c = cc2closure(pomsets)
        self.cc2 = {"closure": {}, "mapping": {}}
        cc2res = cc2pom(cc2c, pomsets)
        i = 0
        for pm in cc2c:
            # TODO: we should use the transitive reduction, but it does not work

            nx.readwrite.graphml.write_graphml(
                pm, join(self.get_cc2_folder(), "closure", "%d.graphml" % i))
            utils.debug_pomset(
                pomset.transitive_reduction(pm),
                join(self.get_cc2_folder(), "closure", "%d" % i),
            )
            self.cc2["closure"][i] = pm
            if not cc2res[i] is None:
                self.cc2["mapping"][i] = cc2res[i]
            i += 1
Exemplo n.º 2
0
    def gen_cc3(self):
        if self.semantics is None:
            return
        self.delete_folder(self.get_cc3_folder())
        os.makedirs(join(self.get_cc3_folder(), "closure"))
        os.makedirs(join(self.get_cc3_folder(), "synthesis"))

        pomsets = [self.semantics[f] for f in self.semantics]
        self.cc3 = {"closure": {}, "mapping": {}}

        (cc3c, prefixes) = cc3closure(pomsets)
        cc3c = self.filter_cc3_closure(cc3c)
        cc3res = cc3pom(cc3c, prefixes)
        i = 0

        # TODO: remove duplicates after
        for pm in cc3c:
            pm = pomset.transitive_reduction(pm)
            fix_pom_out = self.fix_cc3_counter_example(pm)
            nx.readwrite.graphml.write_graphml(
                fix_pom_out,
                join(self.get_cc3_folder(), "closure", "%d.graphml" % i))
            utils.debug_pomset(
                fix_pom_out, join(self.get_cc3_folder(), "closure", "%d" % i))
            self.cc3["closure"][i] = fix_pom_out
            if not cc3res[i] is None:
                self.cc3["mapping"][i] = cc3res[i]
            i += 1
Exemplo n.º 3
0
 def gen_semantics(self):
     # I should ensure this goes in the third position and remove all the past semantics from the tree
     self.delete_folder(self.get_semantics_folder())
     cmd = "../gg2pom -d %s/ --gml %s" % (self.get_root_folder(),
                                          self.sgg_absolute_path)
     os.system(cmd)
     self.semantics = {}
     for f in self.list_files_in_folder(self.get_semantics_folder()):
         graph = nx.readwrite.graphml.read_graphml(
             join(self.get_semantics_folder(), f))
         self.semantics[f] = graph
         utils.debug_pomset(pomset.transitive_reduction(graph),
                            join(self.get_semantics_folder(), f))
Exemplo n.º 4
0
    def gen_semantics(self):
        # I should ensure this goes in the third position and remove all the past semantics from the tree
        for f in glob.glob(join(self.get_semantics_folder() + '*.graphml')) + \
            glob.glob(join(self.get_semantics_folder() + '*.dot')):
            os.remove(f)  # Cleanup old semantics

        cmd = "gg2pom -d %s/ --gml %s" % (
            os.path.dirname(self.sgg_absolute_path),
            self.sgg_absolute_path,
        )
        os.system(cmd)
        self.semantics = {}
        for f in glob.glob(join(self.get_semantics_folder(), '*.graphml')):
            if f.endswith('choreography.graphml'):
                continue
            graph = nx.readwrite.graphml.read_graphml(
                join(self.get_semantics_folder(), f))
            self.semantics[f] = graph
            utils.debug_pomset(pomset.transitive_reduction(graph),
                               join(self.get_semantics_folder(), f))
Exemplo n.º 5
0
def termination_condition(global_view):
    debug = True

    res = {}
    principals = []
    for pom in global_view:
        for pr in get_all_principals(pom):
            if not pr in principals:
                principals.append(pr)
    errors = 0
    for p in principals:
        res[p] = []
        print("------------------------------")
        print("Principal %s" % p)
        for id_pom1 in range(len(global_view)):
            g_pom1 = global_view[id_pom1]
            for id_pom2 in range(len(global_view)):
                g_pom2 = global_view[id_pom2]
                test_path = join("/tmp", p, str(id_pom1), str(id_pom2))
                try:
                    os.makedirs(test_path)
                except:
                    pass

                if g_pom1 == g_pom2:
                    continue
                pom1 = pomset.transitive_closure(g_pom1)
                pom1 = pomset.proj(pom1, p)
                pom2 = pomset.transitive_closure(g_pom2)
                pom2 = pomset.proj(pom2, p)

                print(id_pom1, id_pom2)
                if debug:
                    utils.debug_pomset(pom1, join(test_path, "pom1"))
                    utils.debug_pomset(pom2, join(test_path, "pom2"))

                ext_pom = nx.DiGraph()
                for n in pom1.nodes():
                    ext_pom.add_node((1, n), **pom1.nodes[n])
                # add all missing labels of pom2
                pom2_labels = [
                    frozenset(pom2.nodes[n].items()) for n in pom2.nodes()
                ]
                pom1_labels = [
                    frozenset(ext_pom.nodes[n].items())
                    for n in ext_pom.nodes()
                ]
                super_set_of_labels = True
                for lbl in set(pom1_labels):
                    if pom2_labels.count(lbl) < pom1_labels.count(lbl):
                        super_set_of_labels = False
                        break
                print("Superset of labels %s" % super_set_of_labels)
                if not super_set_of_labels:
                    continue
                h = 0
                for lbl in set(pom2_labels):
                    for i in range(
                            pom2_labels.count(lbl) - pom1_labels.count(lbl)):
                        h += 1
                        ext_pom.add_node((2, h), **(dict(lbl)))
                if debug:
                    utils.debug_pomset(ext_pom, join(test_path, "pomext"))
                # this condition is too restrictive, since we only need to check that the
                # edge intersection is a partial order
                # m = iso.GraphMatcher(pom2, ext_pom, nm)
                m = iso.GraphMatcher(pom2, pom1, nm)
                print("Sub isomorphism %s" % m.subgraph_is_isomorphic())
                if not m.subgraph_is_isomorphic():
                    continue
                print(m.mapping)
                # this condition is broken
                #nodes = [n for n in pom2.nodes() if m.mapping[n][0] == 2]
                nodes = [n for n in pom2.nodes() if n not in m.mapping]
                print(nodes)
                pom2_sub = nx.subgraph(pom2, nodes)
                min2_sub = [
                    n for n in pom2_sub.nodes()
                    if len(pom2_sub.in_edges(n)) == 0
                ]
                min2_sub = [n for n in min2_sub if "in" in pom2_sub.nodes[n]]
                if len(min2_sub) == 0:
                    continue
                res[p].append(
                    (id_pom1, id_pom2, pom1, pom2,
                     dict([(m.mapping[k], k) for k in m.mapping]), min2_sub))
                print([pom2_sub.nodes[n] for n in min2_sub])
                if debug:
                    export_termination_counterexample("/tmp", *res[p][-1])

    return res