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
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
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))
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))
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