Commit 64ac347a authored by Savva Golubitsky's avatar Savva Golubitsky

generation of simple graph, Bug spotted

parent 36839f25
...@@ -60,11 +60,20 @@ class Edge(object): ...@@ -60,11 +60,20 @@ class Edge(object):
def morph(self, data, dynamic_keys_mapping={}): def morph(self, data, dynamic_keys_mapping={}):
# print(self.pred_name, self.morph_name, self.order) # print(self.pred_name, self.morph_name, self.order)
proxy_data = self._io_mapping.build_proxy_data(data, dynamic_keys_mapping) proxy_data = self._io_mapping.build_proxy_data(data, dynamic_keys_mapping)
#print(proxy_data) # print(proxy_data)
self.preprocess(data) self.preprocess(data)
self._morphism(proxy_data) self._morphism(proxy_data)
self.postprocess(data) self.postprocess(data)
def __str__(self):
out = ""
if not (self.pred_module =="" or self.pred_name ==""):
out += "{}::{}(data);\n".format(self.pred_module, self.pred_name)
if not (self.morph_module =="" or self.morph_name ==""):
out += "{}::{}(data);\n".format(self.morph_module, self.morph_name)
return out
# class DummyEdge(Edge): # class DummyEdge(Edge):
# def __init__(self): # def __init__(self):
# super().__init__(None, None) # super().__init__(None, None)
......
...@@ -116,7 +116,15 @@ class Graph: ...@@ -116,7 +116,15 @@ class Graph:
data['__WORKING_DIR__'] = data['__CURRENT_WORKING_DIR__'] data['__WORKING_DIR__'] = data['__CURRENT_WORKING_DIR__']
def generate_cpp(self): def generate_cpp(self):
pass cur_state = self.init_state
while True:
if len(cur_state.transfers)==1:
print(cur_state.transfers[0].edge)
cur_state = cur_state.transfers[0].output_state
if cur_state is None:
break
else:
break
...@@ -170,13 +178,9 @@ class State: ...@@ -170,13 +178,9 @@ class State:
return # no need to go further if we already were there return # no need to go further if we already were there
if self._branching_states_history is None: if self._branching_states_history is None:
self._branching_states_history = branching_states_history self._branching_states_history = branching_states_history
print(self.name,": \t", self.input_edges_number, len(self.transfers))
print(self._branching_states_history)
elif idle_run_type == IdleRunType.CLEANUP: elif idle_run_type == IdleRunType.CLEANUP:
self.activated_input_edges_number = 0 self.activated_input_edges_number = 0
# print('\tCLEANUP STATE {}, active: {}, branches_story: {}'.format(self.name, self.activated_input_edges_number, self._branching_states_history))
if self._branching_states_history is not None and self._is_looped_branch(branching_states_history): if self._branching_states_history is not None and self._is_looped_branch(branching_states_history):
# print('\tqwer')
self._branching_states_history = None self._branching_states_history = None
return return
if self._branching_states_history is None: if self._branching_states_history is None:
...@@ -280,12 +284,6 @@ class State: ...@@ -280,12 +284,6 @@ class State:
def _has_loop(self): def _has_loop(self):
return self.looped_edges_number != 0 return self.looped_edges_number != 0
def generate_cpp(self):
ststr = "{}:\n\t".format(self.name)
if len(self.transfers)==1:
print("{}(data);\n{}(data);".format(t.edge.pred_name, t.edge.morph.name))
return
def transfer_to_termination(data): def transfer_to_termination(data):
return None return None
......
...@@ -85,12 +85,12 @@ class GraphFactory(): ...@@ -85,12 +85,12 @@ class GraphFactory():
self.states[st1].connect_to(self.states[st2], edge=Edge(pred, entr, order=ordr)) self.states[st1].connect_to(self.states[st2], edge=Edge(pred, entr, order=ordr))
print("{} -> {}".format(st1, st2)) print("{} -> {}".format(st1, st2))
def build(self): def build(self, nsub):
print("BUILDING {}\nStates:".format(self.name)) print("BUILDING {}\nStates:".format(self.name))
for s in self.states: for s in self.states:
print("\t"+ s) print("\t"+ s)
if self.issub: if self.issub:
self.graph = Graph(self.states[self.name+"_"+"__BEGIN__"], self.states[self.name+"_"+"__END__"]) self.graph = Graph(self.states[self.name+str(nsub)+"_"+"__BEGIN__"], self.states[self.name+str(nsub)+"_"+"__END__"])
else: else:
self.graph = Graph(self.states["__BEGIN__"], self.states["__END__"]) self.graph = Graph(self.states["__BEGIN__"], self.states["__END__"])
self.graph.init_graph() self.graph.init_graph()
...@@ -108,7 +108,6 @@ class GraphFactory(): ...@@ -108,7 +108,6 @@ class GraphFactory():
parsr = Parser(subgraph=True) parsr = Parser(subgraph=True)
subgr = parsr.parse_file(self.entities[s].subgraph) subgr = parsr.parse_file(self.entities[s].subgraph)
self.states[s].replace_with_graph(subgr) self.states[s].replace_with_graph(subgr)
self.graph.init_graph()
return self.graph return self.graph
class Parser(): class Parser():
...@@ -117,11 +116,13 @@ class Parser(): ...@@ -117,11 +116,13 @@ class Parser():
'fact', 'fact',
'issub' 'issub'
) )
subgr_count = 0
def __init__(self, tocpp=False, subgraph=False): def __init__(self, tocpp=False, subgraph=False):
self.fact = GraphFactory(tocpp=tocpp) self.fact = GraphFactory(tocpp=tocpp)
self.fact.issub = subgraph self.fact.issub = subgraph
self.issub = subgraph self.issub = subgraph
if subgraph:
Parser.subgr_count+=1
def _check_brackets(self, rawfile): def _check_brackets(self, rawfile):
br = 0 br = 0
...@@ -185,8 +186,7 @@ class Parser(): ...@@ -185,8 +186,7 @@ class Parser():
if r[0] in parm.__slots__: if r[0] in parm.__slots__:
setattr(parm, r[0], r[1]) setattr(parm, r[0], r[1])
else: else:
print("\tERROR:Unknown parameter: "+ r[0]) raise Exception("\tERROR:Unknown parameter: "+ r[0])
exit(-1)
return parm return parm
def _param_from_entln(self, raw): def _param_from_entln(self, raw):
...@@ -207,9 +207,9 @@ class Parser(): ...@@ -207,9 +207,9 @@ class Parser():
right = spl[2].split(",") right = spl[2].split(",")
if self.issub: if self.issub:
for i in range(len(left)): for i in range(len(left)):
left[i] = self.fact.name + "_" + left[i] left[i] = self.fact.name + str(Parser.subgr_count) + "_" + left[i]
for i in range(len(right)): for i in range(len(right)):
right[i] = self.fact.name + "_" + right[i] right[i] = self.fact.name + str(Parser.subgr_count) + "_" + right[i]
if (len(left)>1) and (len(right)>1): if (len(left)>1) and (len(right)>1):
raise Exception("ERROR: Ambigious multiple connection in line:\n\t{}".format(raw)) raise Exception("ERROR: Ambigious multiple connection in line:\n\t{}".format(raw))
# many to one conection # many to one conection
...@@ -279,5 +279,5 @@ class Parser(): ...@@ -279,5 +279,5 @@ class Parser():
self.fact.entities[name] = parm self.fact.entities[name] = parm
elif top_re.match(ln): elif top_re.match(ln):
self._topology(ln) self._topology(ln)
return self.fact.build() return self.fact.build(Parser.subgr_count)
...@@ -9,22 +9,40 @@ from comsdk.graph import * ...@@ -9,22 +9,40 @@ from comsdk.graph import *
from comsdk.edge import Edge from comsdk.edge import Edge
prsr = pars.Parser() prsr = pars.Parser()
print(prsr.fact.tocpp) graph = prsr.parse_file('./tests/adot/testsimple.adot')
graph = prsr.parse_file('./tests/adot/testparal.adot')
# s_1 = State('cycled_s_1')
# s_2 = State('cycled_s_2')
# s_3 = State('cycled_s_3')
# s_1.connect_to(s_2, edge=Edge(Func(),Func(func=increment_a_edge)))
# s_2.connect_to(s_3, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# s_2.connect_to(s_1, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
#
# graph = Graph(s_1, s_2)
data = {"a":1, "b":1} data = {"a":1, "b":1}
# graph.generate_cpp()
graph.run(data) graph.run(data)
print(data) print(data)
print(graph.generate_cpp())
# root = State('root')
# br2 = State('br2')
# br3 = State('br3')
# br2_sibl1 = State('br3_sibl1')
# br2_sibl2 = State('br3_sibl2')
# br3_sibl1 = State('br3_sibl1')
# br3_sibl2 = State('br3_sibl2')
# end = State('end')
#
# root.connect_to(br2, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# root.connect_to(br3, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br3.connect_to(br3_sibl1, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br3.connect_to(br3_sibl2, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br2.connect_to(br2_sibl1, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br2.connect_to(br2_sibl2, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br3_sibl1.connect_to(end, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br3_sibl2.connect_to(end, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br2_sibl1.connect_to(end, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
# br2_sibl2.connect_to(end, edge=Edge(Func(func=positiveness_predicate), Func(func=increment_a_edge)))
#
# graph = Graph(root, end)
# data = {"a":1, "b":1}
# graph.run(data)
#
# print(data)
digraph SIMPLEST { digraph CYCLED {
FUNC [module=test_funcs.simplest, entry_func=decrement_a_edge] FUNC [module=test_funcs.simplest, entry_func=decrement_a_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate] PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC] MORPH [predicate=PRED, function=FUNC]
...@@ -9,6 +9,6 @@ digraph SIMPLEST { ...@@ -9,6 +9,6 @@ digraph SIMPLEST {
__BEGIN__ -> ST1 __BEGIN__ -> ST1
ST1 -> ST2 [morphism=MORPH] ST1 -> ST2 [morphism=MORPH]
ST2 -> ST1 ST2 -> ST1 [morphism=MORPH]
ST2 -> __END__ ST2 -> __END__
} }
\ No newline at end of file
...@@ -6,11 +6,11 @@ digraph SIMPLEST { ...@@ -6,11 +6,11 @@ digraph SIMPLEST {
INCR_B [predicate=PRED, function=FUNCB] INCR_B [predicate=PRED, function=FUNCB]
__BEGIN__ -> ST2 __BEGIN__ -> ROOT
ST2 -> ST3_1, ST3_2 [morphism=(INCR_A, INCR_B)] ROOT -> BR1, BR2, BR3 [morphism=(INCR_A, INCR_A, INCR_A)]
ST3_1 -> ST3_1_1, ST3_1_2 [morphism=(INCR_A, INCR_B)] BR3 -> SIBL3_BR1, SIBL3_BR2 [morphism=(INCR_A, INCR_A)]
ST3_2 -> ST3_2_1, ST3_2_2 [morphism=(INCR_A, INCR_B)] BR2 -> SIBL2_BR1, SIBL2_BR2 [morphism=(INCR_A, INCR_A)]
//ST3_1_1 -> ST3_1_1_1, ST3_1_1_2 SIBL3_BR1 -> SIBL3_BR1_1, SIBL3_BR1_2 [morphism=(INCR_A, INCR_A)]
ST3_1_1, ST3_1_2, ST3_2_1, ST3_2_2 -> ST_TERM [morphism=(INCR_A, INCR_B, INCR_A, INCR_B)] SIBL3_BR1_1, SIBL3_BR1_2 -> TERM [morphism=(INCR_A, INCR_A)]
ST_TERM -> __END__ BR1, SIBL2_BR1, SIBL2_BR2, TERM, SIBL3_BR2 -> __END__ [morphism=(INCR_A, INCR_A, INCR_A, INCR_A, INCR_A)]
} }
\ No newline at end of file
digraph SIMPLE {
FUNC [module=test_funcs.simplest, entry_func=increment_a_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC]
__BEGIN__ -> ST1 [morphism = MORPH]
ST1 -> ST2 [morphism = MORPH]
ST2 -> ST3[morphism = MORPH]
ST3 -> ST4[morphism = MORPH]
ST4 -> __END__
}
\ No newline at end of file
digraph TEST_SUB { digraph TEST_SUB {
FUNC [module=test_funcs.simplest, entry_func=decrement_a_edge] FUNC [module=test_funcs.simplest, entry_func=increment_a_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate] PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC] MORPH [predicate=PRED, function=FUNC]
ST2 [subgraph = tests/adot/add.dot] ST2 [subgraph = tests/adot/add.adot]
__BEGIN__ -> ST1 __BEGIN__ -> ST1
ST1 -> ST2 [morphism=MORPH] ST1 -> ST2 [morphism=MORPH]
ST2 -> __END ST2 -> __END__
} }
\ No newline at end of file
...@@ -230,24 +230,30 @@ class GraphGoodCheck(unittest.TestCase): ...@@ -230,24 +230,30 @@ class GraphGoodCheck(unittest.TestCase):
def _get_trivial_parallel_graph(self, initial_conditions): def _get_trivial_parallel_graph(self, initial_conditions):
''' '''
s_1 -> s_2 -> s_3 -> s_6 s_1 -> s_2 -> s_3 ---------> s6s
-> s_4 -> s_5 -> -> s_4 -> s_4_1 -> s_5
-> s_4_2
p_12 = p_24 = p_13 = p_34 := a not 0 p_12 = p_24 = p_13 = p_34 := a not 0
f_12 = f_24 := a + 1 f_12 = f_24 := a + 1
f_13 = f_34 := b + 1 f_13 = f_34 := b + 1
''' '''
s_1 = State('nonparallel_s_1', selection_policy=AllSelectionPolicy()) s_1 = State('nonparallel_s_1')
s_2 = State('parallel_s_2') s_2 = State('parallel_s_2')
s_3 = State('parallel_s_3') s_3 = State('parallel_s_3')
s_4 = State('parallel_s_4') s_4 = State('parallel_s_4')
s_4_1 = State('parallel_s_4_1')
s_4_2 = State('parallel_s_4_2')
s_5 = State('parallel_s_5') s_5 = State('parallel_s_5')
s_6 = State('nonparallel_s_6') s_6 = State('nonparallel_s_6')
s_1.connect_to(s_2, edge=Edge(nonzero_predicate, increment_a_edge)) s_1.connect_to(s_2, edge=Edge(nonzero_predicate, increment_a_edge))
s_2.connect_to(s_3, edge=Edge(nonzero_predicate, increment_a_edge)) s_2.connect_to(s_3, edge=Edge(nonzero_predicate, increment_a_edge))
s_3.connect_to(s_6, edge=Edge(nonzero_predicate, increment_a_edge)) s_3.connect_to(s_6, edge=Edge(nonzero_predicate, increment_a_edge))
s_1.connect_to(s_4, edge=Edge(nonzero_predicate, increment_b_edge)) s_1.connect_to(s_4, edge=Edge(nonzero_predicate, increment_b_edge))
s_4.connect_to(s_5, edge=Edge(nonzero_predicate, increment_b_edge)) s_4.connect_to(s_4_1, edge=Edge(nonzero_predicate, increment_b_edge))
s_4.connect_to(s_4_2, edge=Edge(nonzero_predicate, increment_b_edge))
s_4_1.connect_to(s_5, edge=Edge(nonzero_predicate, increment_b_edge))
s_4_2.connect_to(s_6, edge=Edge(nonzero_predicate, increment_b_edge))
s_5.connect_to(s_6, edge=Edge(nonzero_predicate, increment_b_edge)) s_5.connect_to(s_6, edge=Edge(nonzero_predicate, increment_b_edge))
correct_outputs = [] correct_outputs = []
for ic in initial_conditions: for ic in initial_conditions:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment