Commit 23661946 authored by Savva Golubitsky's avatar Savva Golubitsky

some code generation

parent 3ed50f82
......@@ -26,7 +26,7 @@ class Params():
def __str__(self):
stri = ""
for s in self.__slots__:
stri += s+": {}, ".format(getattr(self, s))
stri += ((s+": {}, ".format(getattr(self, s))) if getattr(self, s) is not None else "")
return stri
# entities = {}
......@@ -302,6 +302,7 @@ class Parser():
bushes = {}
selectorends = {}
def generate_cpp(self):
self.fact.graph.init_state.input_edges_number =0
states_to_check = [self.fact.graph.init_state]
while len(states_to_check)!=0:
for st in states_to_check:
......@@ -326,37 +327,98 @@ class Parser():
# 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, [])
level = 0
#bsh = self.bushes
#for b in bsh:
## print("-"*int(1/self.bushes[b].token), b.name, self.bushes[b].token)
send_token(self.fact.graph.init_state, 1, self.bushes, [])
for b in self.bushes:
print(b.name, "::")
for inc in self.bushes[b].incomes:
print(inc["st"].name, inc["i"], end =' ')
print()
# for br in bsh[b].branches:
# if bsh[br.out].token-bsh[b] < 0:
# level+=1
print_bush(self.fact.graph.init_state, 0, self.bushes, [])
def print_bush(cur_state, level, bushes, checked):
print("entities")
for e in self.fact.entities:
print(self.fact.entities[e])
print_bush(self.fact.graph.init_state, self.fact.entities, self.bushes)
def print_bush(cur_state, entities, bushes):
checked = []
tocheck = [cur_state]
while len(tocheck) !=0:
cur_state=tocheck[0]
cur_b = bushes[cur_state]
if cur_state in checked:
return
# print("Name:", cur_state.name)
if len(cur_b.branches)>1:
print("{}:".format(cur_state.name))
if len(cur_b.incomes)!=0:
stri = "false "
for inc in cur_b.incomes:
stri += "|| SEL_{}[{}] ".format(inc["st"].name, inc["i"])
print("if (!({}))".format(stri))
print("{\n\tfor (int seli = 0; seli < 2; seli ++)\n", "\t\tSEL_{}[seli] =false;".format(cur_state.name),"\n}")
if cur_state.name in entities and entities[cur_state.name].selector is not None:
print("else \n{\n", "\tSEL_{} = {}();\n".format(cur_state.name, cur_state.selector), "\n}")
else:
checked.append(cur_state)
if len(cur_b.outstates)==0:
return
checked.append(cur_state)
print(cur_b.state.name)
print("else \n{\n\tfor (int seli = 0; seli < 2; seli ++)\n", "\t\tSEL_{}[seli] =true;".format(cur_state.name),"\n}")
# if cur_state.name not in entities or entities[cur_state.name].selector is None:
# for i,br in enumerate(cur_b.branches):
# if br[len(br)-1].out not in tocheck:
# tocheck.append(br[len(br)-1].out)
# print("append:", br[len(br)-1].out.name)
# for b in br:
# if b.morph.name != "":
#
# print("{}(data); {}(data);".format(b.pred, b.morph));
# print("SEL_{}[{}] = true;".format(cur_state.name, i))
# tocheck.remove(cur_state)
# checked.append(cur_state)
# print("remove: ",cur_state.name )
# else:
for i, br in enumerate(cur_b.branches):
print("if (SEL_{}[{}])".format(cur_state.name, i))
print("{")
if br[len(br)-1].out not in tocheck:
tocheck.append(br[len(br)-1].out)
if br[len(br)-1].out in checked or br[len(br)-1].out is cur_state:
for b in br:
if b.morph.name != "":
print("\t{}(data); {}(data);".format(b.pred, b.morph));
print("\tgoto {};".format(br[len(br)-1].out.name))
print("}")
continue
for b in br:
print("\t"*level, b.pred)
print("\t"*level, b.morph)
if cur_b.outstates[i] in checked:
print("\t"*level,"goto {}".format(cur_b.outstates[i].name))
elif cur_b.token - bushes[cur_b.outstates[i]].token>0:
level +=1
elif cur_b.token - bushes[cur_b.outstates[i]].token<0:
level -=1
print_bush(cur_b.outstates[i], level, bushes, checked)
if b.morph.name != "":
print("\t{}(data); {}(data);".format(b.pred, b.morph));
print("}")
tocheck.remove(cur_state)
# if cur_state in checked:
# return
# else:
# checked.append(cur_state)
# if len(cur_b.outstates)==0:
# return
# checked.append(cur_state)
# print(cur_b.state.name)
# for i, br in enumerate(cur_b.branches):
# if len(cur_b.branches)>1:
# print("\t"*level,"if SEL_{}[{}]: {}".format(cur_state.name, i, len(cur_b.branches)))
# for b in br:
# print("\t"*(level+1), b.pred)
# print("\t"*(level+1), b.morph)
# out = cur_b.branches[i][len(cur_b.branches[i])-1].out
# if out in checked:
# print("\t"*level,"goto {}".format(out.name))
# elif cur_b.token - bushes[cur_b.outstates[i]].token>0:
# print("{} -> {} : {}".format(cur_state.name, out.name, cur_b.token - bushes[out].token))
# level +=1
# print_bush(out, level, bushes, checked)
# if cur_b.token - bushes[out].token<0:
# print("{} -> {} : {}".format(cur_state.name, out.name, cur_b.token - bushes[out].token))
# level -=1
def send_token(cur_state, token, bushes, checked):
......@@ -364,13 +426,16 @@ def send_token(cur_state, token, bushes, checked):
if cur_state in checked:
return
cur_b.token += token
cur_b.incomes +=1
# print(cur_b.state.name,len(cur_b.incomes), len(cur_b.outstates), cur_b.state.input_edges_number, cur_b.state.looped_edges_number)
if len(cur_b.outstates)==0:
return
if cur_b.incomes == cur_b.state.input_edges_number - cur_b.state.looped_edges_number:
if len(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,cur_b.token / len(cur_b.outstates), bushes, checked)
print("Sending:", cur_state.name)
for i,br in enumerate(cur_b.branches):
bushes[br[len(br)-1].out].incomes.append({"st":cur_state, "i":i})
# print(bushes[br[len(br)-1].out].incomes)
send_token(br[len(br)-1].out, cur_b.token / len(cur_b.branches), bushes, checked)
class _Tr():
slots=(
......@@ -405,7 +470,7 @@ class _Bush():
self.branches = []
self.outstates = []
self.token = 0
self.incomes = 0
self.incomes = []
def grow_bush(self):
for t in self.state.transfers:
......
......@@ -18,49 +18,127 @@ BoolFunc LoadPred(std::string lib, std::string func) {
BoolArrFunc LoadSelector(std::string lib, std::string func){
DllHandle handler;
return com::lib::loadFunction<std::list<bool> (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
return com::lib::loadFunction<bool* (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
}
int main(int argc, char const *argv[])
{
std::list<void*> selectors;
bool* ST1_sel_val, ST2_sel_val;
int NODE_counter;
auto data = com::Anymap();
auto predFunc = LoadPred("libprinters", "ReturnTrue");
auto entrFunc = LoadEntry("libprinters", "PrintHello");
auto selector = LoadSelector("libprinters", "ThreeTrue");
std::list<bool> ST_selector_val;
if (!predFunc(data)) {
std::cout<<"Predicate returned FALSE on state ${}\n";
goto TERM;
}
entrFunc(data);
int S_6_incomes=0,
S_8_incomes=0;
bool S_6_exec = false,
S_8_exec = false;
ST_selector_val = selector(data);
SELECTOR:
if (ST_selector_val[0]) {
ST_selector_val[0] = false;
branch1();
} else {
goto NODE;
}
if(ST_selector_val[1]) {
ST_selector_val[1] = false;
ST2_selector_val = selector2(data);
branch2();
S_1:
int i = 0;
auto SEL_S_1 = selector(data);
if (SEL_S_1[0]) {
libcomsdk_pass_predicate();
libgcdfes_fem_task_loader();
libcomsdk_pass_predicate();
libgcdfes_fe_mesh_loader();
}
if (SEL_S_1[1]) {
libcomsdk_pass_predicate();
libgcdfes_sld_data_loader();
libcomsdk_pass_predicate();
libcomsdk_pass_processor();
}
S_6_exec = SEL_S_1[0] || SEL_S_1[1];
if (S_6_exec) {
libcomsdk_pass_predicate();
libgcdfes_fe_type_loader();
libcomsdk_pass_predicate();
libcomsdk_pass_processor();
}
if (SEL_S_1[2]) {
libcomsdk_pass_predicate();
libgcdfes_bc_loader();
libcomsdk_pass_predicate();
libcomsdk_pass_processor();
}
if (SEL_S_1[3]){
libcomsdk_pass_predicate();
libgcdfes_computation_prepare();
libcomsdk_pass_predicate();
libcomsdk_pass_processor();
}
S_8_exec = S_6_exec || SEL_S_1[0] || SEL_S_1[1];
if (S_8_exec) {
auto SEL_S_8 = selector(data);
if (SEL_S_8[0]) {
goto ST1;
}
else {
goto NODE;
if (SEL_S_8[1]) {
goto TERM;
}
}
//
libcomsdk_None(data);
libgcdfes_las_fem_cslr_loader(data);
SEL___BEGIN__[0] = true;
if (!(false || SEL___BEGIN__[0] || SEL_S_2[0] ))
{
for (int seli = 0; seli < 2; seli ++)
SEL_S_2[seli] = false;
}
S_2:
if (SEL_S_2[0])
{
libcomsdk_None(data);
libgcdfes_las_fem_cslr_assemble(data);
goto S_2;
}
if (SEL_S_2[1])
{
libcomsdk_None(data);
libgcdfes_las_fem_cslr_bc_apply(data);
}
if (!(false || SEL_S_2[1] || SEL_S_3[0] ))
{
for (int seli = 0; seli < 2; seli ++)
SEL_S_3[seli] = false;
}
S_3:
if (SEL_S_3[0])
{
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_precond(data);
goto S_3;
}
if (SEL_S_3[1])
{
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_solver(data);
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_prepare(data);
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_postproc(data);
}
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_precond(data);
SEL_S_6[0] = true;
libcomsdk_None(data);
libgcdfes_las_eqn_cg_cslr_solver(data);
SEL_S_6[1] = true;
if (!(false || SEL_S_6[0] || SEL_S_6[1] ))
{
goto TERM;
}
NODE:
NODE_counter++;
if NODE_counter == NODE_capacity{
goto NEXT_NODE;
} else {
goto SELECTOR;
}
TERM:
std::cout<<"Termination!\n";
return 0;
......
......@@ -10,7 +10,7 @@ from comsdk.edge import Edge
prsr = pars.Parser(tocpp=True)
data = {"a":10}
gr = prsr.parse_file('./tests/adot/testsimple.adot')
gr = prsr.parse_file('./tests/adot/file.adot')
# gr.run(data)
# print (data)
print(prsr.generate_cpp())
......
digraph gcdhom_inverted_model_pso
digraph gcdfem_processor
{
// Определение функций-обработчиков
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="Проверка о необходимости реинициализации всего роя частиц в рамках метода роя частиц."]
PASS_PROCESSOR [module=libcomsdk, entry_func=pass_processor, comment=""]
PSO_AGENT_REINIT [module=libgcdfes, entry_func=pso_agent_reinit, comment="Реинициализация отдельной частицы (смещение частицы) в рое в рамках метода роя частиц."]
PSO_SWARM_REINIT [module=libgcdfes, entry_func=pso_swarm_reinit, comment="Реинициализация всего роя частиц в рамках метода роя частиц."]
LAS_FEM_CSlR_LOADER [module=libgcdfes, entry_func=las_fem_cslr_loader, comment=""]
LAS_FEM_CSlR_ASSEMBLE [module=libgcdfes, entry_func=las_fem_cslr_assemble, comment=""]
LAS_FEM_CSlR_BC_APPLY [module=libgcdfes, entry_func=las_fem_cslr_bc_apply, comment=""]
LAS_EQN_CG_CSlR_SOLVER [module=libgcdfes, entry_func=las_eqn_cg_cslr_solver, comment=""]
LAS_FEM_CSlR_PRECOND [module=libgcdfes, entry_func=las_eqn_cg_cslr_precond]
FEM_POSTPROCESS_PREPARE [module=libgcdfes, entry_func=las_eqn_cg_cslr_prepare]
FEM_POSTPROCESSOR [module=libgcdfes, entry_func=las_eqn_cg_cslr_postproc]
PSO_SWARM_ANALYSING [module=libgcdfes, entry_func=pso_swarm_analysing, comment="Анализ всего роя частиц в рамках метода роя частиц."]
ASSEMBLE_OR_BC_APPLY [module=libgcdfes, entry_func=assemble_or_bc_apply, 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="Инициализация метода роя частиц."]
PRECOND_OR_SOLVE [module=libgcdfes, entry_func=precond_or_solve, comment=""]
// Определение функций-предикатов
PASS_PREDICATE [module=libcomsdk, entry_func=pass_predicate]
PASS_PREDICATE [module=libcomsdk, function=pass_predicate]
CHECK_LAS [module=libcomsdk, function=check_las, comment=""]
// Определение морфизмов
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]
LAS_FEM_CSlR_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_LOADER]
LAS_FEM_CSlR_ASSEMBLE_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_ASSEMBLE]
LAS_FEM_CSlR_BC_APPLY_MORPHISM [predicate=CHECK_LAS, function=LAS_FEM_CSlR_BC_APPLY]
LAS_FEM_CSlR_PRECOND_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_PRECOND]
LAS_EQN_CG_CSlR_SOLVER_MORPHISM [predicate=PASS_PREDICATE, function=LAS_EQN_CG_CSlR_SOLVER]
FEM_POSTPROCESS_PREPARE_MORPHISM [predicate=PASS_PREDICATE, function=FEM_POSTPROCESS_PREPARE]
FEM_POSTPROCESSOR_MORPHISM [predicate=PASS_PREDICATE, function=FEM_POSTPROCESSOR]
// Определение атрибутов узлов
//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]
S_1 [parallelism=threading]
S_2 [selector=ASSEMBLE_OR_BC_APPLY]
S_3 [selector=PRECOND_OR_SOLVE]
// Определение топологии графовой модели метода конечных элементов
__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 = "Расчет завершён."]
S_1 -> S_2 [morphism=LAS_FEM_CSlR_LOADER_MORPHISM]
S_2 -> S_2,S_3 [morphism=(LAS_FEM_CSlR_ASSEMBLE_MORPHISM, LAS_FEM_CSlR_BC_APPLY_MORPHISM), order=(10,20)]
S_3 -> S_3,S_4 [morphism=(LAS_FEM_CSlR_PRECOND_MORPHISM, LAS_EQN_CG_CSlR_SOLVER_MORPHISM), order=(30,40)]
S_4 -> S_5 [morphism=FEM_POSTPROCESS_PREPARE_MORPHISM]
S_5 -> S_6 [morphism=FEM_POSTPROCESSOR_MORPHISM]
S_6 -> ST1, ST2 [morphism=(LAS_FEM_CSlR_PRECOND_MORPHISM, LAS_EQN_CG_CSlR_SOLVER_MORPHISM)]
ST1, ST2 -> __END__
}
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