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

first generator

parent 23661946
...@@ -8,5 +8,8 @@ ...@@ -8,5 +8,8 @@
], ],
"python.testing.pytestEnabled": false, "python.testing.pytestEnabled": false,
"python.testing.nosetestsEnabled": 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(): ...@@ -34,7 +34,7 @@ class Func():
def __str__(self): def __str__(self):
if self.module =="" or self.name =="": if self.module =="" or self.name =="":
return '' return ''
return "{}_{};".format(self.module, self.name) return "{}_{}".format(self.module, self.name)
class Selector(Func): class Selector(Func):
def __init__(self, ntransf, module="", name="", dummy=False): def __init__(self, ntransf, module="", name="", dummy=False):
...@@ -42,6 +42,10 @@ class Selector(Func): ...@@ -42,6 +42,10 @@ class Selector(Func):
dummy = True dummy = True
self.dummy = dummy self.dummy = dummy
super().__init__(module, name, func=(lambda x: [True for i in range(ntransf)]) if dummy else None) 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: class Transfer:
......
...@@ -109,6 +109,7 @@ class GraphFactory(): ...@@ -109,6 +109,7 @@ class GraphFactory():
print("Replacing state {} with subgraph {}".format(s,self.entities[s].subgraph)) print("Replacing state {} with subgraph {}".format(s,self.entities[s].subgraph))
parsr = Parser(subgraph=True) parsr = Parser(subgraph=True)
subgr = parsr.parse_file(self.entities[s].subgraph) subgr = parsr.parse_file(self.entities[s].subgraph)
self.entities = {**self.entities, **parsr.fact.entities}
self.states[s].replace_with_graph(subgr) self.states[s].replace_with_graph(subgr)
return self.graph return self.graph
...@@ -275,29 +276,6 @@ class Parser(): ...@@ -275,29 +276,6 @@ class Parser():
self._topology(ln) self._topology(ln)
return self.fact.build(Parser.subgr_count) 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=[] checked=[]
bushes = {} bushes = {}
selectorends = {} selectorends = {}
...@@ -314,86 +292,81 @@ class Parser(): ...@@ -314,86 +292,81 @@ class Parser():
for outs in bush.outstates: for outs in bush.outstates:
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, []) send_token(self.fact.graph.init_state, 1, self.bushes, [])
for b in self.bushes: preds, morphs, sels, st, body = print_graph(self.fact.graph.init_state, self.fact.entities, self.bushes)
print(b.name, "::") from mako.template import Template
for inc in self.bushes[b].incomes: f = open("result.cpp", "w")
print(inc["st"].name, inc["i"], end =' ') print(Template(filename="./cpp/template.cpp").render(preds=preds, morphs = morphs, sels = sels, states=st, body=body), file=f)
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)
def print_bush(cur_state, entities, bushes): def print_graph(cur_state, entities, bushes):
checked = [] checked = []
toloadpred = []
toloadmorph = []
toloadsel =[]
tocheck = [cur_state] tocheck = [cur_state]
body = ""
while len(tocheck) !=0: while len(tocheck) !=0:
cur_state=tocheck[0] cur_state=tocheck[0]
cur_b = bushes[cur_state] cur_b = bushes[cur_state]
# print("Name:", cur_state.name) # #print("Name:", cur_state.name)
if len(cur_b.branches)>1: 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: if len(cur_b.incomes)!=0:
stri = "false " stri = "false "
for inc in cur_b.incomes: for inc in cur_b.incomes:
stri += "|| SEL_{}[{}] ".format(inc["st"].name, inc["i"]) stri += "|| SEL_{}[{}] ".format(inc["st"].name, inc["i"])
print("if (!({}))".format(stri)) #print("if (!({}))".format(stri))
print("{\n\tfor (int seli = 0; seli < 2; seli ++)\n", "\t\tSEL_{}[seli] =false;".format(cur_state.name),"\n}") 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: 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: else:
print("else \n{\n\tfor (int seli = 0; seli < 2; seli ++)\n", "\t\tSEL_{}[seli] =true;".format(cur_state.name),"\n}") #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}")
# if cur_state.name not in entities or entities[cur_state.name].selector is None: 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):
# 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): for i, br in enumerate(cur_b.branches):
print("if (SEL_{}[{}])".format(cur_state.name, i)) #print("if (SEL_{}[{}])".format(cur_state.name, i))
print("{") #print("{")
body+="if (SEL_{}[{}])".format(cur_state.name, i)+"{\n"
if br[len(br)-1].out not in tocheck: if br[len(br)-1].out not in tocheck:
tocheck.append(br[len(br)-1].out) tocheck.append(br[len(br)-1].out)
if br[len(br)-1].out in checked or br[len(br)-1].out is cur_state: if br[len(br)-1].out in checked or br[len(br)-1].out is cur_state:
for b in br: for b in br:
if b.morph.name != "": if b.morph.name != "":
print("\t{}(data); {}(data);".format(b.pred, b.morph)); if b.pred not in toloadpred:
print("\tgoto {};".format(br[len(br)-1].out.name)) toloadpred.append(b.pred)
print("}") 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 continue
for b in br: for b in br:
if b.morph.name != "": if b.morph.name != "":
print("\t{}(data); {}(data);".format(b.pred, b.morph)); if b.pred not in toloadpred:
print("}") 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) 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: # if cur_state in checked:
# return # return
......
#include <libtools.h> #include <libtools.h>
#include <anymap.h> #include <anymap.h>
#include <thread>
typedef std::function<int(com::Anymap)> IntFunc; typedef std::function<int(com::Anymap)> IntFunc;
typedef std::function<bool(com::Anymap)> BoolFunc; typedef std::function<bool(com::Anymap)> BoolFunc;
...@@ -21,123 +20,37 @@ BoolArrFunc LoadSelector(std::string lib, std::string func){ ...@@ -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); return com::lib::loadFunction<bool* (com::Anymap), DllHandle>(lib.c_str(), func.c_str(), handler);
} }
int main(int argc, char const *argv[]) void check_pred(bool predval, std::string predname) {
{ if predval{
std::list<void*> selectors; std::cout<<"Predicate"<<predname<<"returned FALSE!"<<std::endl;
bool* ST1_sel_val, ST2_sel_val; exit(-1)
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;
}
} }
// int main(int argc, char const *argv[])
libcomsdk_None(data); {
libgcdfes_las_fem_cslr_loader(data); auto data = com::Anymap();
SEL___BEGIN__[0] = true; //Predicates
if (!(false || SEL___BEGIN__[0] || SEL_S_2[0] )) % for pred in preds:
{ auto ${pred} = LoadPred("${pred.module}", "${pred.name}");
for (int seli = 0; seli < 2; seli ++) % endfor
SEL_S_2[seli] = false; //Entry functions
} % for morph in morphs:
S_2: auto ${str(morph)} = LoadEntry("${morph.module}", "${morph.name}");
if (SEL_S_2[0]) % endfor
{ //Selectors
libcomsdk_None(data); % for sel in sels:
libgcdfes_las_fem_cslr_assemble(data); auto ${str(sel)} = LoadSelector("${sel.module}", "${sel.name}");
goto S_2; % endfor
} //Branch tokens
if (SEL_S_2[1]) bool* SEL_${states[0].name} = new bool[${len(states[0].transfers)}];
{ std::fill_n(SEL_${states[0].name}, ${len(states[0].transfers)}, true);
libcomsdk_None(data); % for st in states[1:]:
libgcdfes_las_fem_cslr_bc_apply(data); bool* SEL_${st.name} = new bool[${len(st.transfers)}];
} std::fill_n(SEL_${st.name}, ${len(st.transfers)}, false);
if (!(false || SEL_S_2[1] || SEL_S_3[0] )) % endfor
{
for (int seli = 0; seli < 2; seli ++) ${body}
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;
}
TERM: TERM:
std::cout<<"Termination!\n"; 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 ...@@ -10,7 +10,7 @@ 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/file.adot') gr = prsr.parse_file('./tests/adot/testsub.adot')
# gr.run(data) # gr.run(data)
# print (data) # print (data)
print(prsr.generate_cpp()) print(prsr.generate_cpp())
......
digraph gcdfem_processor digraph gcdfem_preprocessor
{ {
// Определение функций-обработчиков // Определение функций-обработчиков
PASS_PROCESSOR [module=libcomsdk, entry_func=pass_processor, comment=""] 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] PASS_PREDICATE [module=libcomsdk, entry_func=pass_predicate, comment=""]
CHECK_LAS [module=libcomsdk, function=check_las, comment=""]
// Определение морфизмов // Определение морфизмов
LAS_FEM_CSlR_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_LOADER] FEM_TASK_MORPHISM [predicate=PASS_PREDICATE, function=FEM_TASK_LOAD]
LAS_FEM_CSlR_ASSEMBLE_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_ASSEMBLE] SLD_DATA_MORPHISM [predicate=PASS_PREDICATE, function=SLD_DATA_LOAD]
LAS_FEM_CSlR_BC_APPLY_MORPHISM [predicate=CHECK_LAS, function=LAS_FEM_CSlR_BC_APPLY] BC_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=BC_LOAD]
LAS_FEM_CSlR_PRECOND_MORPHISM [predicate=PASS_PREDICATE, function=LAS_FEM_CSlR_PRECOND] CMP_PREPARE_MORPHISM [predicate=PASS_PREDICATE, function=CMP_PREPARE]
LAS_EQN_CG_CSlR_SOLVER_MORPHISM [predicate=PASS_PREDICATE, function=LAS_EQN_CG_CSlR_SOLVER] MESH_CREATOR_MORPHISM [predicate=PASS_PREDICATE, function=MESH_LOAD]
FEM_POSTPROCESS_PREPARE_MORPHISM [predicate=PASS_PREDICATE, function=FEM_POSTPROCESS_PREPARE] FE_TYPE_LOADER_MORPHISM [predicate=PASS_PREDICATE, function=FE_TYPE_LOAD]
FEM_POSTPROCESSOR_MORPHISM [predicate=PASS_PREDICATE, function=FEM_POSTPROCESSOR]
// Определение морфизмов
PASS_MORPHISM [predicate=PASS_PREDICATE, function=PASS_PROCESSOR]
// Определение атрибутов узлов // Определение атрибутов узлов
S_1 [parallelism=threading] S_1 [parallelism=threading]
S_2 [selector=ASSEMBLE_OR_BC_APPLY]
S_3 [selector=PRECOND_OR_SOLVE]
// Определение топологии графовой модели метода конечных элементов // Определение топологии графовой модели метода конечных элементов
__BEGIN__ -> S_1 __BEGIN__ -> S_1
S_1 -> S_2 [morphism=LAS_FEM_CSlR_LOADER_MORPHISM] 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_2,S_3 [morphism=(LAS_FEM_CSlR_ASSEMBLE_MORPHISM, LAS_FEM_CSlR_BC_APPLY_MORPHISM), order=(10,20)] S_2, S_3 -> S_6 [morphism=(MESH_CREATOR_MORPHISM, PASS_MORPHISM)]
S_3 -> S_3,S_4 [morphism=(LAS_FEM_CSlR_PRECOND_MORPHISM, LAS_EQN_CG_CSlR_SOLVER_MORPHISM), order=(30,40)] S_6 -> S_7 [morphism=FE_TYPE_LOADER_MORPHISM]
S_4 -> S_5 [morphism=FEM_POSTPROCESS_PREPARE_MORPHISM] S_7, S_4, S_5 -> S_8 [morphism=(PASS_MORPHISM, PASS_MORPHISM, PASS_MORPHISM)]
S_5 -> S_6 [morphism=FEM_POSTPROCESSOR_MORPHISM] S_8 -> __END__
S_6 -> ST1, ST2 [morphism=(LAS_FEM_CSlR_PRECOND_MORPHISM, LAS_EQN_CG_CSlR_SOLVER_MORPHISM)]
ST1, ST2 -> __END__
} }
...@@ -7,8 +7,6 @@ digraph SIMPLEST { ...@@ -7,8 +7,6 @@ digraph SIMPLEST {
__BEGIN__ -> ROOT __BEGIN__ -> ROOT
ROOT -> A [morphism=INCR_B]
A->B [morphism=INCR_B]
ROOT -> BR1, BR2, BR3 [morphism=(INCR_A, INCR_A, INCR_A)] ROOT -> BR1, BR2, BR3 [morphism=(INCR_A, INCR_A, INCR_A)]
//BR3 -> SIBL3_BR1, SIBL3_BR2 [morphism=(INCR_A, INCR_A)] //BR3 -> SIBL3_BR1, SIBL3_BR2 [morphism=(INCR_A, INCR_A)]
//BR2 -> SIBL2_BR1, SIBL2_BR2 [morphism=(INCR_A, INCR_A)] //BR2 -> SIBL2_BR1, SIBL2_BR2 [morphism=(INCR_A, INCR_A)]
......
...@@ -7,5 +7,5 @@ digraph TEST_SUB { ...@@ -7,5 +7,5 @@ digraph TEST_SUB {
__BEGIN__ -> ST1 __BEGIN__ -> ST1
ST1 -> ST2 [morphism=MORPH] 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