Commit 7188aaf9 authored by Savva Golubitsky's avatar Savva Golubitsky

first generator

parent 23661946
......@@ -8,5 +8,8 @@
],
"python.testing.pytestEnabled": false,
"python.testing.nosetestsEnabled": false,
"python.testing.unittestEnabled": true
"python.testing.unittestEnabled": true,
"files.associations": {
"typeinfo": "cpp"
}
}
\ No newline at end of file
......@@ -34,7 +34,7 @@ class Func():
def __str__(self):
if self.module =="" or self.name =="":
return ''
return "{}_{};".format(self.module, self.name)
return "{}_{}".format(self.module, self.name)
class Selector(Func):
def __init__(self, ntransf, module="", name="", dummy=False):
......@@ -42,6 +42,10 @@ class Selector(Func):
dummy = True
self.dummy = dummy
super().__init__(module, name, func=(lambda x: [True for i in range(ntransf)]) if dummy else None)
def __str__(self):
if self.module =="" or self.name =="":
return ''
return "{}_{}".format(self.module, self.name)
class Transfer:
......
......@@ -109,6 +109,7 @@ class GraphFactory():
print("Replacing state {} with subgraph {}".format(s,self.entities[s].subgraph))
parsr = Parser(subgraph=True)
subgr = parsr.parse_file(self.entities[s].subgraph)
self.entities = {**self.entities, **parsr.fact.entities}
self.states[s].replace_with_graph(subgr)
return self.graph
......@@ -275,29 +276,6 @@ class Parser():
self._topology(ln)
return self.fact.build(Parser.subgr_count)
toload = []
edgemap = {}
# def _gen_branch(self,cur_state):
# root = cur_state.name
# edges = []
# while cur_state is not None:
# if len(cur_state.transfers)==0:
# cur_state = None
# elif len(cur_state.transfers)==1:
# edges.append({"pred": str(cur_state.transfers[0].edge.pred_f),
# "morph": str(cur_state.transfers[0].edge.morph_f)})
# if str(cur_state.transfers[0].edge.pred_f) not in self.toload:
# self.toload.append(str(cur_state.transfers[0].edge))
# if str(cur_state.transfers[0].edge.morph_f) not in self.toload:
# self.toload.append(str(cur_state.transfers[0].edge))
# cur_state = cur_state.transfers[0].output_state
# else:
# pass
# self.edgemap[root] = list(filter(lambda x: x["morph"] != '', edges))
# return
checked=[]
bushes = {}
selectorends = {}
......@@ -314,86 +292,81 @@ class Parser():
for outs in bush.outstates:
if outs not in states_to_check and outs not in self.checked:
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(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("entities")
for e in self.fact.entities:
print(self.fact.entities[e])
print_bush(self.fact.graph.init_state, self.fact.entities, self.bushes)
preds, morphs, sels, st, body = print_graph(self.fact.graph.init_state, self.fact.entities, self.bushes)
from mako.template import Template
f = open("result.cpp", "w")
print(Template(filename="./cpp/template.cpp").render(preds=preds, morphs = morphs, sels = sels, states=st, body=body), file=f)
def print_bush(cur_state, entities, bushes):
def print_graph(cur_state, entities, bushes):
checked = []
toloadpred = []
toloadmorph = []
toloadsel =[]
tocheck = [cur_state]
body = ""
while len(tocheck) !=0:
cur_state=tocheck[0]
cur_b = bushes[cur_state]
# print("Name:", cur_state.name)
# #print("Name:", cur_state.name)
if len(cur_b.branches)>1:
print("{}:".format(cur_state.name))
#print("{}:".format(cur_state.name))
body+="{}:\n".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}")
#print("if (!({}))".format(stri))
body+="if (!({}))".format(stri)
#print("{\n\tfor (int seli = 0;", " seli < {};".format(len(cur_state.transfers)), " seli++)\n", "\t\tSEL_{}[seli]=false;".format(cur_state.name),"\n}")
body+="{\n\tfor (int seli = 0;"+" seli < {};".format(len(cur_state.transfers))+" 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}")
if cur_state.selector not in toloadsel:
toloadsel.append(cur_state.selector)
#print("else \n{\n", "\tSEL_{} = {}();\n".format(cur_state.name, cur_state.selector), "\n}")
body+="else {\n"+ "\tSEL_{} = {}();\n".format(cur_state.name, cur_state.selector)+"}\n"
else:
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:
#print("else \n{\n\tfor (int seli = 0;", " seli < {};".format(len(cur_state.transfers)), " seli++)\n", "\t\tSEL_{}[seli]=true;".format(cur_state.name),"\n}")
body+="else {\n\tfor (int seli = 0;"+" seli < {};".format(len(cur_state.transfers))+" seli++)\n"+"\t\tSEL_{}[seli]=true;".format(cur_state.name)+"\n}\n"
for i, br in enumerate(cur_b.branches):
print("if (SEL_{}[{}])".format(cur_state.name, i))
print("{")
#print("if (SEL_{}[{}])".format(cur_state.name, i))
#print("{")
body+="if (SEL_{}[{}])".format(cur_state.name, i)+"{\n"
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("}")
if b.pred not in toloadpred:
toloadpred.append(b.pred)
if b.morph not in toloadmorph:
toloadmorph.append(b.morph)
#print("\tcheck_pred({}(data), \"{}\");\{}(data);".format(b.pred,b.pred, b.morph))
body+= "\tcheck_pred({}(data), \"{}\");\n\t{}(data);\n".format(b.pred,b.pred, b.morph)
#print("\tgoto {};".format(br[len(br)-1].out.name))
body+="\tgoto {};\n".format(br[len(br)-1].out.name)+"}\n"
#print("}")
continue
for b in br:
if b.morph.name != "":
print("\t{}(data); {}(data);".format(b.pred, b.morph));
print("}")
if b.pred not in toloadpred:
toloadpred.append(b.pred)
if b.morph not in toloadmorph:
toloadmorph.append(b.morph)
#print("\tcheck_pred({}(data), \"{}\"); {}(data);".format(b.pred,b.pred, b.morph))
body+="\tcheck_pred({}(data), \"{}\");\n\t{}(data);\n".format(b.pred,b.pred, b.morph)
#print("}")
body+="}\n"
tocheck.remove(cur_state)
checked.append(cur_state)
return unique(toloadpred), unique(toloadmorph), unique(toloadsel), checked, body
def unique(lst):
for i, el in enumerate(lst):
for el2 in lst[i+1:]:
if el2.module == el.module and el2.name == el.name:
lst.remove(el2)
return lst
# if cur_state in checked:
# return
......
#include <libtools.h>
#include <anymap.h>
#include <thread>
typedef std::function<int(com::Anymap)> IntFunc;
typedef std::function<bool(com::Anymap)> BoolFunc;
......@@ -21,123 +20,37 @@ BoolArrFunc LoadSelector(std::string lib, std::string func){
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");
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;
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;
}
if (SEL_S_8[1]) {
goto TERM;
}
void check_pred(bool predval, std::string predname) {
if predval{
std::cout<<"Predicate"<<predname<<"returned FALSE!"<<std::endl;
exit(-1)
}
}
//
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;
}
int main(int argc, char const *argv[])
{
auto data = com::Anymap();
//Predicates
% for pred in preds:
auto ${pred} = LoadPred("${pred.module}", "${pred.name}");
% endfor
//Entry functions
% for morph in morphs:
auto ${str(morph)} = LoadEntry("${morph.module}", "${morph.name}");
% endfor
//Selectors
% for sel in sels:
auto ${str(sel)} = LoadSelector("${sel.module}", "${sel.name}");
% endfor
//Branch tokens
bool* SEL_${states[0].name} = new bool[${len(states[0].transfers)}];
std::fill_n(SEL_${states[0].name}, ${len(states[0].transfers)}, true);
% for st in states[1:]:
bool* SEL_${st.name} = new bool[${len(st.transfers)}];
std::fill_n(SEL_${st.name}, ${len(st.transfers)}, false);
% endfor
${body}
TERM:
std::cout<<"Termination!\n";
......
#include <libtools.h>
#include <anymap.h>
typedef std::function<int(com::Anymap)> IntFunc;
typedef std::function<bool(com::Anymap)> BoolFunc;
typedef std::function<bool*(com::Anymap)> BoolArrFunc;
IntFunc LoadEntry(std::string lib, std::string func) {
DllHandle handler;
return com::lib::loadFunction<int (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
}
BoolFunc LoadPred(std::string lib, std::string func) {
DllHandle handler;
return com::lib::loadFunction<int (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
}
BoolArrFunc LoadSelector(std::string lib, std::string func){
DllHandle handler;
return com::lib::loadFunction<bool* (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
}
void check_pred(bool predval, std::string predname) {
if predval{
std::cout<<"Predicate"<<predname<<"returned FALSE!"<<std::endl;
exit(-1)
}
}
int main(int argc, char const *argv[])
{
auto data = com::Anymap();
//Predicates
auto test_funcs.simplest_positiveness_predicate = LoadPred("test_funcs.simplest", "positiveness_predicate");
//Entry functions
auto test_funcs.simplest_increment_a_edge = LoadEntry("test_funcs.simplest", "increment_a_edge");
//Selectors
//Branch tokens
bool* SEL___BEGIN__ = new bool[1];
std::fill_n(SEL___BEGIN__, 1, true);
bool* SEL___END__ = new bool[0];
std::fill_n(SEL___END__, 0, false);
if (SEL___BEGIN__[0]){
check_pred(test_funcs.simplest_positiveness_predicate(data), "test_funcs.simplest_positiveness_predicate");
test_funcs.simplest_increment_a_edge(data);
check_pred(test_funcs.simplest_positiveness_predicate(data), "test_funcs.simplest_positiveness_predicate");
test_funcs.simplest_increment_a_edge(data);
}
if (!(false || SEL___BEGIN__[0] )){
for (int seli = 0; seli < 0; seli++)
SEL___END__[seli]=false;
}else {
for (int seli = 0; seli < 0; seli++)
SEL___END__[seli]=true;
}
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/file.adot')
gr = prsr.parse_file('./tests/adot/testsub.adot')
# gr.run(data)
# print (data)
print(prsr.generate_cpp())
......
digraph gcdfem_processor
digraph gcdfem_preprocessor
{
// Определение функций-обработчиков
PASS_PROCESSOR [module=libcomsdk, entry_func=pass_processor, comment=""]
FEM_TASK_LOAD [module=libgcdfes, entry_func=fem_task_loader, comment=""]
SLD_DATA_LOAD [module=libgcdfes, entry_func=sld_data_loader, comment=""]
BC_LOAD [module=libgcdfes, entry_func=bc_loader, comment=""]
CMP_PREPARE [module=libgcdfes, entry_func=computation_prepare, comment=""]
MESH_LOAD [module=libgcdfes, entry_func=fe_mesh_loader, comment=""]
FE_TYPE_LOAD [module=libgcdfes, entry_func=fe_type_loader, 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]
ASSEMBLE_OR_BC_APPLY [module=libgcdfes, entry_func=assemble_or_bc_apply, comment=""]
PRECOND_OR_SOLVE [module=libgcdfes, entry_func=precond_or_solve, comment=""]
// Определение функций-предикатов
PASS_PREDICATE [module=libcomsdk, function=pass_predicate]
CHECK_LAS [module=libcomsdk, function=check_las, comment=""]
PASS_PREDICATE [module=libcomsdk, entry_func=pass_predicate, comment=""]
// Определение морфизмов
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]
FEM_TASK_MORPHISM [predicate=PASS_PREDICATE, function=FEM_TASK_LOAD]
SLD_DATA_MORPHISM [predicate=PASS_PREDICATE, function=SLD_DATA_LOAD]
BC_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=BC_LOAD]
CMP_PREPARE_MORPHISM [predicate=PASS_PREDICATE, function=CMP_PREPARE]
MESH_CREATOR_MORPHISM [predicate=PASS_PREDICATE, function=MESH_LOAD]
FE_TYPE_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=FE_TYPE_LOAD]
// Определение морфизмов
PASS_MORPHISM [predicate=PASS_PREDICATE, function=PASS_PROCESSOR]
// Определение атрибутов узлов
// Определение атрибутов узлов
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=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__
S_1 -> S_2, S_3, S_4, S_5 [morphism=(FEM_TASK_MORPHISM, SLD_DATA_MORPHISM, BC_LOADER_MORPHISM, CMP_PREPARE_MORPHISM)]
S_2, S_3 -> S_6 [morphism=(MESH_CREATOR_MORPHISM, PASS_MORPHISM)]
S_6 -> S_7 [morphism=FE_TYPE_LOADER_MORPHISM]
S_7, S_4, S_5 -> S_8 [morphism=(PASS_MORPHISM, PASS_MORPHISM, PASS_MORPHISM)]
S_8 -> __END__
}
......@@ -7,8 +7,6 @@ digraph SIMPLEST {
__BEGIN__ -> ROOT
ROOT -> A [morphism=INCR_B]
A->B [morphism=INCR_B]
ROOT -> BR1, BR2, BR3 [morphism=(INCR_A, INCR_A, INCR_A)]
//BR3 -> SIBL3_BR1, SIBL3_BR2 [morphism=(INCR_A, INCR_A)]
//BR2 -> SIBL2_BR1, SIBL2_BR2 [morphism=(INCR_A, INCR_A)]
......
......@@ -7,5 +7,5 @@ digraph TEST_SUB {
__BEGIN__ -> ST1
ST1 -> ST2 [morphism=MORPH]
ST2 -> __END__
ST2 -> __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