Commit d2596858 authored by Savva Golubitsky's avatar Savva Golubitsky

little improvments after meeting

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