Commit f3bfd376 authored by Savva Golubitsky's avatar Savva Golubitsky

if nesting

parent d19b237f
...@@ -278,29 +278,29 @@ class Parser(): ...@@ -278,29 +278,29 @@ class Parser():
toload = [] toload = []
edgemap = {} edgemap = {}
def _gen_branch(self,cur_state): # def _gen_branch(self,cur_state):
root = cur_state.name # root = cur_state.name
edges = [] # edges = []
while cur_state is not None: # while cur_state is not None:
if len(cur_state.transfers)==0: # if len(cur_state.transfers)==0:
cur_state = None # cur_state = None
elif len(cur_state.transfers)==1: # elif len(cur_state.transfers)==1:
edges.append({"pred": str(cur_state.transfers[0].edge.pred_f), # edges.append({"pred": str(cur_state.transfers[0].edge.pred_f),
"morph": str(cur_state.transfers[0].edge.morph_f)}) # "morph": str(cur_state.transfers[0].edge.morph_f)})
if str(cur_state.transfers[0].edge.pred_f) not in self.toload: # if str(cur_state.transfers[0].edge.pred_f) not in self.toload:
self.toload.append(str(cur_state.transfers[0].edge)) # self.toload.append(str(cur_state.transfers[0].edge))
if str(cur_state.transfers[0].edge.morph_f) not in self.toload: # if str(cur_state.transfers[0].edge.morph_f) not in self.toload:
self.toload.append(str(cur_state.transfers[0].edge)) # self.toload.append(str(cur_state.transfers[0].edge))
cur_state = cur_state.transfers[0].output_state # cur_state = cur_state.transfers[0].output_state
else: # else:
pass # pass
self.edgemap[root] = list(filter(lambda x: x["morph"] != '', edges)) # self.edgemap[root] = list(filter(lambda x: x["morph"] != '', edges))
return # return
checked=[] checked=[]
bushes = [] bushes = {}
selectorends = {}
def generate_cpp(self): def generate_cpp(self):
states_to_check = [self.fact.graph.init_state] states_to_check = [self.fact.graph.init_state]
while len(states_to_check)!=0: while len(states_to_check)!=0:
...@@ -310,7 +310,7 @@ class Parser(): ...@@ -310,7 +310,7 @@ class Parser():
bush = _Bush(st) bush = _Bush(st)
print("ins:", bush.state.name) print("ins:", bush.state.name)
bush.grow_bush() bush.grow_bush()
self.bushes.append(bush) self.bushes[st] = bush
for i, br in enumerate(bush.branches): for i, br in enumerate(bush.branches):
for b in br: for b in br:
print(i, b) print(i, b)
...@@ -319,17 +319,49 @@ class Parser(): ...@@ -319,17 +319,49 @@ class Parser():
print(outs.name) print(outs.name)
if outs not in states_to_check and outs not in self.checked: if outs not in states_to_check and outs not in self.checked:
states_to_check.append(outs) states_to_check.append(outs)
# for b in self.bushes:
# print(b.name, "::")
# for o in self.bushes[b].outstates:
# print(o.name, len(o.transfers), end=' ')
# print()
# cur_b = self.bushes[self.fact.graph.init_state]
# cur_b.selectorfin = None
# cur_b.token = 1
# tocheck = cur_b.outstates
# while len(tocheck)!=0:
# for st in cur_b.outstates:
# self.bushes[st].token = cur_b.level / len(cur_b.branches)
# self.bushes[self.fact.graph.init_state].token
send_token(self.fact.graph.init_state, 1,self.bushes, [])
for b in self.bushes:
print("-"*int(1/self.bushes[b].token), b.name, self.bushes[b].token)
def send_token(cur_state, token, bushes, checked):
cur_b = bushes[cur_state]
print("NAME:", cur_state.name, cur_b.token )
if cur_state in checked:
return
cur_b.token += token
cur_b.incomes +=1
if len(cur_b.outstates)==0:
return
if cur_b.incomes == cur_b.state.input_edges_number - cur_b.state.looped_edges_number:
checked.append(cur_state)
for st in cur_b.outstates:
send_token(st,token / len(cur_b.outstates), bushes, checked)
class _Tr(): class _Tr():
slots=( slots=(
'pred', 'pred',
'morph' 'morph',
'out'
) )
def __init__(self, transf): def __init__(self, transf):
self.pred = transf.edge.pred_f self.pred = transf.edge.pred_f
self.morph = transf.edge.morph_f self.morph = transf.edge.morph_f
self.out = transf.output_state
def __str__(self): def __str__(self):
return "{}\n{}\n".format(self.pred, self.morph) return "{}\n{}\n".format(self.pred, self.morph)
...@@ -340,7 +372,10 @@ class _Bush(): ...@@ -340,7 +372,10 @@ class _Bush():
'state', 'state',
'selector', 'selector',
'branches', 'branches',
'outstates' 'outstates',
'token',
'incomes',
'selectorfin'
) )
def __init__(self, state): def __init__(self, state):
...@@ -348,6 +383,8 @@ class _Bush(): ...@@ -348,6 +383,8 @@ class _Bush():
self.selector = state.selector self.selector = state.selector
self.branches = [] self.branches = []
self.outstates = [] self.outstates = []
self.token = 0
self.incomes = 0
def grow_bush(self): def grow_bush(self):
for t in self.state.transfers: for t in self.state.transfers:
...@@ -363,3 +400,5 @@ class _Bush(): ...@@ -363,3 +400,5 @@ class _Bush():
self.branches.append(branch) self.branches.append(branch)
if cur_state not in self.outstates: if cur_state not in self.outstates:
self.outstates.append(cur_state) self.outstates.append(cur_state)
...@@ -35,14 +35,32 @@ int main(int argc, char const *argv[]) ...@@ -35,14 +35,32 @@ int main(int argc, char const *argv[])
entrFunc(data); entrFunc(data);
SELECTOR:
ST_selector_val = selector(data); ST_selector_val = selector(data);
SELECTOR:
if (ST_selector_val[0]) { if (ST_selector_val[0]) {
ST_selector_val[0] = false;
branch1(); branch1();
} else {
goto NODE;
} }
if(ST_selector_val[1]) { if(ST_selector_val[1]) {
ST_selector_val[1] = false;
ST2_selector_val = selector2(data);
branch2(); branch2();
} }
else {
goto NODE;
}
NODE:
NODE_counter++;
if NODE_counter == NODE_capacity{
goto NEXT_NODE;
} else {
goto SELECTOR;
}
TERM: TERM:
std::cout<<"Termination!\n"; std::cout<<"Termination!\n";
return 0; return 0;
......
...@@ -10,12 +10,12 @@ from comsdk.edge import Edge ...@@ -10,12 +10,12 @@ from comsdk.edge import Edge
prsr = pars.Parser(tocpp=True) prsr = pars.Parser(tocpp=True)
data = {"a":10} data = {"a":10}
gr = prsr.parse_file('./tests/adot/testsimple.adot') gr = prsr.parse_file('./tests/adot/file.adot')
# gr.run(data) # gr.run(data)
# print (data) # print (data)
print(prsr.generate_cpp()) print(prsr.generate_cpp())
for b in prsr.bushes: # for b in prsr.bushes:
digraph gcdhom_inverted_model_pso
{
// Определение функций-обработчиков
PASS_PROCESSOR [module=libcomsdk, entry_func=pass_processor]
CHECK_PSO_AGENT_REINIT [module=libgcdfes, entry_func=check_pso_agent_reinit, comment="Проверка о необходимости реинициализации отдельной частицы (смещение частицы) в рое в рамках метода роя частиц."]
CHECK_PSO_SWARM_REINIT [module=libgcdfes, entry_func=check_pso_swarm_reinit, comment="Проверка о необходимости реинициализации всего роя частиц в рамках метода роя частиц."]
PSO_AGENT_REINIT [module=libgcdfes, entry_func=pso_agent_reinit, comment="Реинициализация отдельной частицы (смещение частицы) в рое в рамках метода роя частиц."]
PSO_SWARM_REINIT [module=libgcdfes, entry_func=pso_swarm_reinit, comment="Реинициализация всего роя частиц в рамках метода роя частиц."]
PSO_SWARM_ANALYSING [module=libgcdfes, entry_func=pso_swarm_analysing, comment="Анализ всего роя частиц в рамках метода роя частиц."]
PSO_HOM_AGENT_POSTPROC [module=libgcdfes, entry_func=pso_hom_agent_postproc, comment="Постпроцессинг после решения отдельной задачи методом асимптотического осреднения."]
PSO_TASK_DATA_REINIT [module=libgcdfes, entry_func=pso_task_data_reinit, comment="Реинициализация постановки задачи анализа эффективных характеристик КМ методом асимптотического осреднения."]
PSO_AGENT_INIT [module=libgcdfes, entry_func=pso_agent_init, comment="Инициализация отдельной частицы в рамках метода роя частиц."]
PSO_SWARM_INIT [module=libgcdfes, entry_func=pso_swarm_init, comment="Инициализация роя частиц."]
PSO_INIT [module=libgcdfes, entry_func=pso_swarm_init, comment="Инициализация метода роя частиц."]
// Определение функций-предикатов
PASS_PREDICATE [module=libcomsdk, entry_func=pass_predicate]
// Определение морфизмов
PASS_MORPHISM [predicate=PASS_PREDICATE, function=PASS_PROCESSOR]
PSO_AGENT_REINIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_AGENT_REINIT]
PSO_SWARM_REINIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_SWARM_REINIT]
PSO_SWARM_ANALYSING_MORPHISM [predicate=PASS_PREDICATE, function=PSO_SWARM_ANALYSING]
PSO_HOM_AGENT_POSTPROC_MORPHISM [predicate=PASS_PREDICATE, function=PSO_HOM_AGENT_POSTPROC]
PSO_TASK_DATA_REINIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_TASK_DATA_REINIT]
PSO_AGENT_INIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_AGENT_INIT]
PSO_SWARM_INIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_SWARM_INIT]
PSO_INIT_MORPHISM [predicate=PASS_PREDICATE, function=PSO_INIT]
// Определение атрибутов узлов
//S_1 [subgraph=gcdhom_preprocessor.adot]
//S_5 [subgraph=gcdhom_processor.adot]
S_6 [selector=CHECK_PSO_AGENT_REINIT]
S_7 [selector=CHECK_PSO_SWARM_REINIT]
// Определение топологии графовой модели метода конечных элементов
__BEGIN__ -> S_1
S_1 -> S_2 [morphism=PSO_INIT_MORPHISM]
S_2 -> S_3 [morphism=PSO_SWARM_INIT_MORPHISM]
S_3 -> S_4 [morphism=PSO_AGENT_INIT_MORPHISM]
S_4 -> S_5 [morphism=PSO_TASK_DATA_REINIT_MORPHISM]
S_5 -> S_6 [morphism=PSO_HOM_AGENT_POSTPROC_MORPHISM]
S_6 -> S_4, S_7 [morphism=(PSO_AGENT_REINIT_MORPHISM, PSO_SWARM_ANALYSING_MORPHISM), order=(10,20)]
S_7 -> S_4, S_8 [morphism=(PSO_SWARM_REINIT_MORPHISM, PASS_MORPHISM), order=(30,40)]
S_8 -> __END__ [comment = "Расчет завершён."]
}
...@@ -12,9 +12,11 @@ digraph SIMPLE { ...@@ -12,9 +12,11 @@ digraph SIMPLE {
MORPH2 [predicate=PRED2, function=FUNC2] MORPH2 [predicate=PRED2, function=FUNC2]
__BEGIN__ -> ST1 [morphism = MORPH] __BEGIN__ -> ST1 [morphism = MORPH]
ST1 -> ST2, ST21 [morphism = (MORPH, MORPH1)] ST1 -> ST2, ST3, ST4 [morphism = (MORPH, MORPH1, MORPH2)]
ST2 -> ST3[morphism = MORPH] ST2 -> ST3, ST5 [morphism = (MORPH1,MORPH2)]
ST21 -> ST31, ST312[morphism =(MORPH1,MORPH2)] ST4 -> ST3 [morphism = MORPH]
ST3, ST31, ST312 -> ST4[morphism = (MORPH,MORPH1,MORPH2) ] ST3 -> ST5 [morphism = MORPH]
ST4 -> ST1, __END__ //ST21 -> ST31, ST312[morphism =(MORPH1,MORPH2)]
//ST3, ST31, ST312 -> ST4[morphism = (MORPH,MORPH1,MORPH2) ]
ST5 -> __END__
} }
\ No newline at end of file
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