From 36839f25aad7ff6b3893bf4e623b6239b022d644 Mon Sep 17 00:00:00 2001
From: lbstr <golubitskiy_savv@mail.ru>
Date: Tue, 3 Dec 2019 17:41:10 +0300
Subject: [PATCH] testparal.adot not works

---
 comsdk/__pycache__/graph.cpython-37.pyc | Bin 12635 -> 12885 bytes
 comsdk/graph.py                         |  37 ++++++++++++++----------
 test_parser.py                          |   2 +-
 tests/adot/testparal.adot               |   7 ++++-
 4 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/comsdk/__pycache__/graph.cpython-37.pyc b/comsdk/__pycache__/graph.cpython-37.pyc
index 897961c1e96762f61fc8b9d65edb5d78dd6d9cec..03877b0678b87e637ef1c969ff2fb57e7b8cffec 100644
GIT binary patch
delta 3065
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
Rc~cGT3#(z(G)=$H`+tBik@^4t

delta 2895
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

diff --git a/comsdk/graph.py b/comsdk/graph.py
index bd9fc18..b63e087 100644
--- a/comsdk/graph.py
+++ b/comsdk/graph.py
@@ -34,13 +34,10 @@ class Func():
         return "{}.{}()".format(self.module, self.name)
 
 class Selector(Func):
-    __slots__=(
-        'ntransf'
-    )
     def __init__(self, ntransf, module="", name="", dummy=False):
         if module=="" and name =="":
             dummy = True
-        self.ntransf = ntransf
+        self.dummy = dummy
         super().__init__(module, name, func=(lambda x: [True for i in range(ntransf)]) if dummy else None)
 
 
@@ -51,9 +48,7 @@ class Transfer:
         self.order = order
 
     def transfer(self, data, dynamic_keys_mapping={}):
-        #print(dynamic_keys_mapping)
         self.edge.morph(data, dynamic_keys_mapping)
-        #return self.output_state, None
         return self.output_state
 
 class IdleRunType(Enum):
@@ -119,6 +114,11 @@ class Graph:
         data['__CURRENT_WORKING_DIR__'] = os.getcwd()
         if not '__WORKING_DIR__' in data:
             data['__WORKING_DIR__'] = data['__CURRENT_WORKING_DIR__']
+    
+    def generate_cpp(self):
+        pass
+
+
 
 class State:
     __slots__ = [
@@ -133,6 +133,7 @@ class State:
         'array_keys_mapping',
         '_branching_states_history',
         '_proxy_state',
+        'possible_branches'
         ]
     def __init__(self, name, 
                  parallelization_policy=None,
@@ -147,6 +148,7 @@ class State:
         self.looped_edges_number = 0
         self.activated_input_edges_number = 0
         self.transfers = []
+        self.possible_branches=[]
         self.is_term_state=False
         self._branching_states_history = None
         self._proxy_state=None
@@ -168,6 +170,8 @@ class State:
                 return # no need to go further if we already were there
             if self._branching_states_history is None:
                 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:
             self.activated_input_edges_number = 0
 #           print('\tCLEANUP STATE {}, active: {}, branches_story: {}'.format(self.name, self.activated_input_edges_number, self._branching_states_history))
@@ -179,8 +183,8 @@ class State:
                 self._branching_states_history = branching_states_history
         else:
             self.activated_input_edges_number += 1 # BUG: here we need to choose somehow whether we proceed or not
-#        if len(self.output_edges) == 0:
-#            print('Terminate state found')
+        # if len(self.transfers) == 0:
+            # print('Terminate state found')
         if len(self.transfers) == 1:
             self.transfers[0].output_state.idle_run(idle_run_type, branching_states_history)
         else:
@@ -202,7 +206,7 @@ class State:
     
     def run(self, data, implicit_parallelization_info=None):
         print('STATE {}\n\tjust entered, implicit_parallelization_info: {}'.format(self.name, implicit_parallelization_info))
-        print('\t{}'.format(data))
+        # print('\t{}'.format(data))
         if self._proxy_state is not None:
             return self._proxy_state.run(data, implicit_parallelization_info)
         self._activate_input_edge(implicit_parallelization_info)
@@ -227,7 +231,7 @@ class State:
                 raise Exception("\tERROR: predicate {} returns {} running from STATE {}".format(transf.edge.pred_name,transf.edge.predicate(data, dynamic_keys_mapping), self.name))
         return self.parallelization_policy.make_transfer_func(selected_transfers,
                                                          array_keys_mapping=self.array_keys_mapping,
-                                                         implicit_parallelization_info=implicit_parallelization_info,), \
+                                                         implicit_parallelization_info=implicit_parallelization_info, state=self), \
                implicit_parallelization_info
 
 
@@ -276,10 +280,12 @@ class State:
     def _has_loop(self):
         return self.looped_edges_number != 0
 
-    def cpp_print(self, parameter_list):
+    def generate_cpp(self):
         ststr = "{}:\n\t".format(self.name)
-        for t in self.transfers:
-            print(t.edge)
+        if len(self.transfers)==1:
+            print("{}(data);\n{}(data);".format(t.edge.pred_name, t.edge.morph.name))
+            return
+
 
 def transfer_to_termination(data):
     return None
@@ -290,8 +296,9 @@ class SerialParallelizationPolicy:
     def __init__(self):
         pass
 
-    def make_transfer_func(self, morphisms, array_keys_mapping=None, implicit_parallelization_info=None):
+    def make_transfer_func(self, morphisms, array_keys_mapping=None, implicit_parallelization_info=None, state=None):
         def _morph(data):
+            # print("MORPHING FROM {}".format(state.name))
             if array_keys_mapping is None:
                 dynamic_keys_mapping = build_dynamic_keys_mapping(implicit_parallelization_info)
                 next_morphs = [partial(morphism.transfer, dynamic_keys_mapping=dynamic_keys_mapping) for morphism in morphisms]
@@ -317,7 +324,7 @@ class SerialParallelizationPolicy:
             #while len(next_morphs) != 1 or _is_implicitly_parallelized(next_impl_para_infos):
             while len(next_morphs) != 1 or _requires_joint_of_implicit_parallelization(array_keys_mapping, next_impl_para_infos):
                 if next_impl_para_infos == []:
-                    raise Exception("Morpsh count on state is {}".format(str(len(next_morphs))))
+                    raise Exception("Morphs count on state {} is {}".format(state.name, str(len(next_morphs))))
 #                print(array_keys_mapping, next_impl_para_infos)
                 cur_morphs[:] = next_morphs[:]
                 cur_impl_para_infos[:] = next_impl_para_infos[:]
diff --git a/test_parser.py b/test_parser.py
index 96c30d3..a2c9d13 100644
--- a/test_parser.py
+++ b/test_parser.py
@@ -23,7 +23,7 @@ graph = prsr.parse_file('./tests/adot/testparal.adot')
 
 
 data = {"a":1, "b":1}
-
+# graph.generate_cpp()
 graph.run(data)
 
 print(data)
diff --git a/tests/adot/testparal.adot b/tests/adot/testparal.adot
index 4f797d6..d5637f9 100644
--- a/tests/adot/testparal.adot
+++ b/tests/adot/testparal.adot
@@ -5,7 +5,12 @@ digraph SIMPLEST {
     INCR_A [predicate=PRED, function=FUNCA]
     INCR_B [predicate=PRED, function=FUNCB]
     
+
     __BEGIN__ -> ST2 
     ST2 -> ST3_1, ST3_2 [morphism=(INCR_A, INCR_B)]
-    ST3_1, ST3_2 -> __END__ 
+    ST3_1 -> ST3_1_1, ST3_1_2 [morphism=(INCR_A, INCR_B)]
+    ST3_2 -> ST3_2_1, ST3_2_2 [morphism=(INCR_A, INCR_B)]
+    //ST3_1_1 -> ST3_1_1_1, ST3_1_1_2
+    ST3_1_1, ST3_1_2, ST3_2_1, ST3_2_2 ->  ST_TERM [morphism=(INCR_A, INCR_B, INCR_A, INCR_B)]
+    ST_TERM -> __END__
 }
\ No newline at end of file
-- 
2.17.1