Commit d2596858 authored by Savva Golubitsky's avatar Savva Golubitsky

little improvments after meeting

1 merge request!1Парсер aDOT формата в рамках pycomsdk
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -26,6 +26,10 @@ class InOutMapping(object):
class Edge(object):
__slots__ = [
'pred_module',
'pred_name',
'morph_module',
'morph_name',
'_predicate',
'_morphism',
'_io_mapping',
......@@ -35,8 +39,12 @@ class Edge(object):
def __init__(self, predicate, morphism,
io_mapping=InOutMapping(),
):
self._predicate = predicate
self._morphism = morphism
self.pred_module = predicate.module
self.pred_name = predicate.name
self._predicate = predicate.func
self.morph_module = morphism.module
self.morph_name = morphism.name
self._morphism = morphism.func
self._io_mapping = io_mapping
self.preprocess = lambda pd: None
self.postprocess = lambda pd: None
......
......@@ -8,9 +8,10 @@ import comsdk.aux as aux
ImplicitParallelizationInfo = collections.namedtuple('ImplicitParallelizationInfo', ['array_keys_mapping', 'branches_number', 'branch_i'])
class Transfer:
def __init__(self, edge, output_state):
def __init__(self, edge, output_state, index=None):
self.edge = edge
self.output_state = output_state
self.index = index
def transfer(self, data, dynamic_keys_mapping={}):
#print(dynamic_keys_mapping)
......@@ -104,7 +105,7 @@ class Graph:
return False
return True
def init_graph(self, data):
def init_graph(self, data={}):
if not self._initialized:
self.init_state.idle_run(IdleRunType.INIT, [self.init_state.name])
self._initialized = True
......@@ -122,7 +123,7 @@ class State:
'activated_input_edges_number',
'transfers',
'parallelization_policy',
'selection_policy',
'selector',
'is_term_state',
'array_keys_mapping',
'_branching_states_history',
......@@ -130,12 +131,12 @@ class State:
]
def __init__(self, name,
parallelization_policy=None,
selection_policy=None,
selector=None,
array_keys_mapping=None, # if array_keys_mapping is not None, we have implicit parallelization in this state
):
self.name = name
self.parallelization_policy = SerialParallelizationPolicy() if parallelization_policy is None else parallelization_policy
self.selection_policy = OnlyOneSelectionPolicy() if selection_policy is None else selection_policy
self.selector = lambda x: True if selector is None else selector
self.array_keys_mapping = array_keys_mapping
self.input_edges_number = 0
self.looped_edges_number = 0
......@@ -148,7 +149,6 @@ class State:
def idle_run(self, idle_run_type, branching_states_history):
if self._proxy_state is not None:
return self._proxy_state.idle_run(idle_run_type, branching_states_history)
# print('{} {} -> '.format(self.name, branching_states_history), end='')
if idle_run_type == IdleRunType.INIT:
self.input_edges_number += 1
if self.input_edges_number != 1:
......@@ -206,7 +206,7 @@ class State:
dynamic_keys_mapping = build_dynamic_keys_mapping(implicit_parallelization_info)
for transfer in self.transfers:
predicate_values.append(transfer.edge.predicate(data, dynamic_keys_mapping))
selected_edge_indices = self.selection_policy.select(predicate_values)
selected_edge_indices = self.selector.func(predicate_values)
if not selected_edge_indices:
raise GraphUnexpectedTermination(
'State {}: Predicate values {} do not conform selection policy'.format(self.name, predicate_values))
......
......@@ -53,9 +53,15 @@ class GraphFactory():
self.states = {}
self.tocpp = tocpp
def add_state(self, statename, params=None):
def add_state(self, statename, selectorname=None):
if selectorname is not None:
sp = entities[selectorname]
if self.tocpp:
sel_f = Func(sp.module, sp.entry_func)
else:
sel_f = Func(sp.module, sp.entry_func, getattr(imp.import_module(sp.module), sp.entry_func))
if statename not in self.states:
newstate = gr.State(statename)
newstate = gr.State(statename, selector=sel_f)
self.states[statename] = newstate
def _create_morphism(self, morphname=None):
......@@ -91,16 +97,12 @@ class GraphFactory():
def add_connection(self, st1, st2, morphism=None):
pred, entr = self._create_morphism(morphism)
self.states[st1].connect_to(self.states[st2], edge=Edge(pred.func, entr.func))
self.states[st1].connect_to(self.states[st2], edge=Edge(pred, entr))
print("{} --{}-{}--> {}".format(st1, pred, entr, st2))
def build(self):
self.graph = gr.Graph(self.states["__BEGIN__"], self.states["__END__"])
data = None
self.graph.init_graph(data)
#TODO: реализоывть Edge(Func, Func)
self.graph.init_graph()
fact = GraphFactory(tocpp=True)
entities = {}
......@@ -188,11 +190,11 @@ def topology(raw):
# one to many connection, here could be selector
elif len(right)>1:
p = param_from_props(spl[3])
fact.add_state(left[0],selector=p.selector)
morphs = split_multiple(p)
if len(morphs)!=len(right):
print("\tERROR:Count of edges do not match to count of states in one to many connection!\n\t\t{}".format(raw))
exit()
fact.add_state(left[0])
for i, st in enumerate(right):
fact.add_state(st)
fact.add_connection(left[0], st, morphs[i].morphism)
......
......@@ -9,6 +9,7 @@ digraph CODEOBJECT_GENERATOR
REPEAT [module=case_gen_funcs, entry_func=repeat]
EXIT [module=case_gen_funcs, entry_func=exit]
CREATE_DUMP [module=case_gen_funcs, entry_func=create_dump]
CHECK_DUMP [module=case_gen_funcs, entry_func=check_dump]
// Определения функций-предикатов
PREDICATE_X [module=predicate_funcs, entry_func=predicate_x]
PREDICATE_Y [module=predicate_funcs, entry_func=predicate_y]
......@@ -33,9 +34,9 @@ digraph CODEOBJECT_GENERATOR
NAMES_SUBSTITUTED -> CONTENT_SUBSTITUTED [morphism=EDGE_3]
CONTENT_SUBSTITUTED -> DUMP_CREATED [morphism=EDGE_10]
CONTENT_SUBSTITUTED -> RESULT_SAVED [morphism=EDGE_4]
CONTENT_SUBSTITUTED -> RESULT_SAVED [morphism=EDGE_5, comment="test comment to cpp"]
CONTENT_SUBSTITUTED -> RESULT_SAVED [morphism=EDGE_5,comment="test comment to cpp"]
// В зависимости от результата вычисления функции-SELECTOR осуществляется переход по
//первому или второму ребру
RESULT_SAVED, DUMP_CREATED -> __END__ [morphism=(EDGE_8, EDGE_9),order=(20,30)]
RESULT_SAVED -> INPUT_READY,__END__ [selector=SELECTOR, morphism=(EDGE_6, EDGE_7)]
RESULT_SAVED, DUMP_CREATED -> __END__ [morphism=(EDGE_8, EDGE_9)]
}
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