Commit 5ac2c912 authored by Savva Golubitsky's avatar Savva Golubitsky

subgraph error resolved

parent 603f8882
......@@ -19,7 +19,7 @@ class Func():
def __init__(self, module="", name="", dummy=False,func=None, comment=''):
self.module = module
self.name = name
self.comment=comment.replace("\0", " ")
self.comment=comment.replace("\0", " ") if comment is not None else ""
if module =="" or name =="" or module is None or name is None:
dummy = True
if func is not None:
......@@ -51,7 +51,7 @@ class Selector(Func):
class Transfer:
def __init__(self, edge, output_state, order=0):
def __init__(self, edge, output_state, order=0, comment = None):
self.edge = edge
self.output_state = output_state
self.order = order
......@@ -159,7 +159,7 @@ class State:
self.is_term_state=False
self._branching_states_history = None
self._proxy_state=None
self.comment = ""
self.comment = None
def idle_run(self, idle_run_type, branching_states_history):
def __sort_by_order(tr):
......@@ -196,7 +196,9 @@ class State:
next_state = transfer.output_state
next_state.idle_run(idle_run_type, branching_states_history + [next_state.name])
def connect_to(self, term_state, edge=None):
def connect_to(self, term_state, edge=None, comment=None):
if comment is not None or comment != "":
self.comment = comment
self.transfers.append(Transfer(edge, term_state))
self.selector = Selector(len(self.transfers))
# edge.set_output_state(term_state)
......
......@@ -98,6 +98,14 @@ class GraphFactory():
else:
self.graph = Graph(self.states["__BEGIN__"], self.states["__END__"])
self.graph.init_graph()
if self.issub:
oldkeys = []
for e in self.entities:
oldkeys.append(e)
for old in oldkeys:
if self.entities[old].selector is not None or self.entities[old].subgraph is not None:
self.entities[self.name + str(Parser.subgr_count)+"_"+old] = self.entities[old]
del self.entities[old]
for s in self.states:
if s in self.entities and self.entities[s].selector is not None:
selname = self.entities[s].selector
......@@ -111,10 +119,8 @@ class GraphFactory():
print("Replacing state {} with subgraph {}".format(s,self.entities[s].subgraph))
parsr = Parser(subgraph=True, tocpp= self.tocpp)
subgr = parsr.parse_file(self.entities[s].subgraph)
# self.entities = {**self.entities, **parsr.fact.entities}
self.states[s].replace_with_graph(subgr)
self.graph = Graph(self.graph.init_state, self.graph.term_state)
return self.graph
......@@ -132,25 +138,39 @@ class Parser():
Parser.subgr_count+=1
def _check_brackets(self, rawfile):
br = 0
br = { "[":{"line":0, "count":0}, "(":{"line":0, "count":0}, "{":{"line":0, "count":0}, "\"":{"line":0, "count":0}}
line = 1
qu = 0
for char in rawfile:
if char == "[":
br+=1
br["["]["line"] = line
br["["]["count"] +=1
elif char == "{":
br+=1
br["{"]["line"] = line
br["{"]["count"] +=1
elif char == "(":
br+=1
br["("]["line"] = line
br["("]["count"] +=1
elif char == "]":
br-=1
br["["]["count"] -=1
elif char == "}":
br-=1
br["{"]["count"] -=1
elif char == ")":
br-=1
br["("]["count"] -=1
elif char =="\"":
qu+=1
if br!=0 or qu%2!=0:
raise Exception("Brackets or quotes do not match! Check your file")
br["\""]["line"] = line
br["\""]["count"] += 1 if br["\""]["count"]==0 else -1
elif char == "\n":
line+=1
expstr= "Brackets or quotes do not match! Missing closing brackets on lines: "
fl = False
for c in br:
print("br:",br[c]["count"])
if br[c]["count"] != 0:
fl= True
expstr+=str(br[c]["line"])+" "
if fl:
raise Exception(expstr)
def _split_multiple(self,param):
vals = {}
......@@ -195,7 +215,8 @@ class Parser():
setattr(parm, r[0], r[1])
else:
raise Exception("\tERROR:Unknown parameter: "+ r[0])
setattr(parm, "comment", comment)
if comment != "":
setattr(parm, "comment", comment.replace("\0", " "))
return parm
def _param_from_entln(self, raw):
......@@ -325,8 +346,9 @@ def print_graph(cur_state, entities, bushes):
if len(cur_b.branches)>1 or len(cur_b.incomes)>1:
body+="{}:\n".format(cur_state.name)
if len(cur_b.incomes)!=0:
if cur_b.state.comment!="":
body+="//"+cur_b.state.comment.replace('\0', ' ')+"\n"
if cur_b.state.comment!="" and cur_b.state.comment is not None:
print("STcomm:", cur_b.state.comment)
body+="//"+cur_b.state.comment+"\n"
stri = "false "
for inc in cur_b.incomes:
stri += "|| SEL_{}[{}] ".format(inc["st"].name, inc["i"])
......
#include <libtools.h>
#include <anymap.h>
#include <iniparser.h>
typedef std::function<int(com::Anymap)> IntFunc;
typedef std::function<bool(com::Anymap)> BoolFunc;
......@@ -29,7 +30,13 @@ void check_pred(bool predval, std::string predname) {
int main(int argc, char const *argv[])
{
auto data = com::Anymap();
com::ini::INIParser parser(argv[1]);
if(!parser.isLoaded()){
std::cerr<<"Cannot find file:"<<argv[1]<<std::endl;
return -1;
}
com::Anymap data();
parser.loadINIDataToAnyMap(data);
//Predicates
% for pred in preds:
auto ${pred} = LoadPred("${pred.module}", "${pred.name}");
......
#include <libtools.h>
#include <anymap.h>
#include <iniparser.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[])
{
com::ini::INIParser parser(argv[1]);
if(!parser.isLoaded()){
std::cerr<<"Cannot find file:"<<argv[1]<<std::endl;
return -1;
}
com::Anymap data();
parser.loadINIDataToAnyMap(data);
//Predicates
auto test_funcs.simplest_positiveness_predicate = LoadPred("test_funcs.simplest", "positiveness_predicate");
auto libcomsdk_pass_predicate = LoadPred("libcomsdk", "pass_predicate");
//Entry functions
auto test_funcs.simplest_increment_a_edge = LoadEntry("test_funcs.simplest", "increment_a_edge");
auto libgcdfes_pso_swarm_init = LoadEntry("libgcdfes", "pso_swarm_init");
auto libgcdfes_pso_agent_init = LoadEntry("libgcdfes", "pso_agent_init");
auto libgcdfes_pso_task_data_reinit = LoadEntry("libgcdfes", "pso_task_data_reinit");
auto libgcdfes_pso_hom_agent_postproc = LoadEntry("libgcdfes", "pso_hom_agent_postproc");
auto libgcdfes_pso_agent_reinit = LoadEntry("libgcdfes", "pso_agent_reinit");
auto libgcdfes_pso_swarm_analysing = LoadEntry("libgcdfes", "pso_swarm_analysing");
auto libgcdfes_pso_swarm_reinit = LoadEntry("libgcdfes", "pso_swarm_reinit");
auto libcomsdk_pass_processor = LoadEntry("libcomsdk", "pass_processor");
//Selectors
auto libgcdfes_check_pso_agent_reinit = LoadSelector("libgcdfes", "check_pso_agent_reinit");
auto libgcdfes_check_pso_swarm_reinit = LoadSelector("libgcdfes", "check_pso_swarm_reinit");
//Branch tokens
bool* SEL___BEGIN__ = new bool[1];
std::fill_n(SEL___BEGIN__, 1, true);
bool* SEL_gcdhom_inverted_model_pso1_S_4 = new bool[1];
std::fill_n(SEL_gcdhom_inverted_model_pso1_S_4, 1, false);
bool* SEL_gcdhom_inverted_model_pso1_S_6 = new bool[2];
std::fill_n(SEL_gcdhom_inverted_model_pso1_S_6, 2, false);
bool* SEL_gcdhom_inverted_model_pso1_S_7 = new bool[2];
std::fill_n(SEL_gcdhom_inverted_model_pso1_S_7, 2, false);
bool* SEL___END__ = new bool[0];
std::fill_n(SEL___END__, 0, false);
if (SEL___BEGIN__[0]){
//root graph
check_pred(test_funcs.simplest_positiveness_predicate(data), "test_funcs.simplest_positiveness_predicate");
test_funcs.simplest_increment_a_edge(data);
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_swarm_init(data);//Инициализация метода роя частиц.
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_swarm_init(data);//Инициализация роя частиц.
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_agent_init(data);//Инициализация отдельной частицы в рамках метода роя частиц.
}
gcdhom_inverted_model_pso1_S_4:
if (!(false || SEL___BEGIN__[0] || SEL_gcdhom_inverted_model_pso1_S_6[0] || SEL_gcdhom_inverted_model_pso1_S_7[0] )){
for (int seli = 0; seli < 1; seli++)
SEL_gcdhom_inverted_model_pso1_S_4[seli]=false;
}else {
for (int seli = 0; seli < 1; seli++)
SEL_gcdhom_inverted_model_pso1_S_4[seli]=true;
}
if (SEL_gcdhom_inverted_model_pso1_S_4[0]){
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_task_data_reinit(data);//Реинициализация постановки задачи анализа эффективных характеристик КМ методом асимптотического осреднения.
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_hom_agent_postproc(data);//Постпроцессинг после решения отдельной задачи методом асимптотического осреднения.
}
gcdhom_inverted_model_pso1_S_6:
if (!(false || SEL_gcdhom_inverted_model_pso1_S_4[0] )){
for (int seli = 0; seli < 2; seli++)
SEL_gcdhom_inverted_model_pso1_S_6[seli]=false;
}else {
SEL_gcdhom_inverted_model_pso1_S_6 = libgcdfes_check_pso_agent_reinit();//
}
if (SEL_gcdhom_inverted_model_pso1_S_6[0]){
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_agent_reinit(data);//Реинициализация отдельной частицы (смещение частицы) в рое в рамках метода роя частиц.
goto gcdhom_inverted_model_pso1_S_4;
}
if (SEL_gcdhom_inverted_model_pso1_S_6[1]){
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_swarm_analysing(data);//Анализ всего роя частиц в рамках метода роя частиц.
}
gcdhom_inverted_model_pso1_S_7:
if (!(false || SEL_gcdhom_inverted_model_pso1_S_6[1] )){
for (int seli = 0; seli < 2; seli++)
SEL_gcdhom_inverted_model_pso1_S_7[seli]=false;
}else {
SEL_gcdhom_inverted_model_pso1_S_7 = libgcdfes_check_pso_swarm_reinit();//
}
if (SEL_gcdhom_inverted_model_pso1_S_7[0]){
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libgcdfes_pso_swarm_reinit(data);//Реинициализация всего роя частиц в рамках метода роя частиц.
goto gcdhom_inverted_model_pso1_S_4;
}
if (SEL_gcdhom_inverted_model_pso1_S_7[1]){
//ПАСС, морфизм.
check_pred(libcomsdk_pass_predicate(data), "libcomsdk_pass_predicate");
libcomsdk_pass_processor(data);
//root graph
check_pred(test_funcs.simplest_positiveness_predicate(data), "test_funcs.simplest_positiveness_predicate");
test_funcs.simplest_increment_a_edge(data);
}
if (!(false || SEL_gcdhom_inverted_model_pso1_S_7[1] )){
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;
}
digraph ADD {
FUNC [module=test_funcs.simplest, entry_func=increment_b_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC, comment="ADD"]
__BEGIN__ -> ST [morphism = MORPH]
ST -> __END__
}
\ No newline at end of file
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, comment="ПАСС, морфизм."]
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 = "Расчет завершён."]
}
digraph CYCLED {
FUNC [module=test_funcs.simplest, entry_func=decrement_a_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC]
SEL [module = test_funcs.simplest, entry_func = selector_a_nonpositive]
ST2 [selector = SEL]
__BEGIN__ -> ST1
ST1 -> ST2 [morphism=MORPH]
ST2 -> ST1
ST2 -> __END__
}
\ No newline at end of file
digraph SIMPLEST {
FUNCA [module=test_funcs.simplest, entry_func=increment_a_edge]
FUNCB [module=test_funcs.simplest, entry_func=increment_b_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
INCR_A [predicate=PRED, function=FUNCA]
INCR_B [predicate=PRED, function=FUNCB]
__BEGIN__ -> ROOT
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)]
//SIBL3_BR1 -> SIBL3_BR1_1, SIBL3_BR1_2 [morphism=(INCR_A, INCR_A)]
//SIBL3_BR1_1, SIBL3_BR1_2 -> TERM [morphism=(INCR_A, INCR_A)]
//BR1, SIBL2_BR1, SIBL2_BR2, TERM, SIBL3_BR2 -> __END__ [morphism=(INCR_A, INCR_A, INCR_A, INCR_A, INCR_A)]
BR1, BR2, BR3 -> __END__ [morphism=(INCR_A, INCR_A, INCR_A)]
}
\ No newline at end of file
digraph SIMPLE {
FUNC [module=libprinters, entry_func=PrintHello]
PRED [module=libprinters, entry_func=ReturnTrue]
MORPH [predicate=PRED, function=FUNC]
FUNC1 [module=libprinters, entry_func=PrintHello1]
PRED1 [module=libprinters, entry_func=ReturnTrue1]
MORPH1 [predicate=PRED1, function=FUNC1]
FUNC2 [module=libprinters, entry_func=PrintHello2]
PRED2 [module=libprinters, entry_func=ReturnTrue2]
MORPH2 [predicate=PRED2, function=FUNC2]
__BEGIN__ -> ST1 [morphism = MORPH]
ST1 -> ST2, ST3, ST4 [morphism = (MORPH, MORPH1, MORPH2)]
ST2 -> ST3, ST5 [morphism = (MORPH1,MORPH2)]
ST4 -> ST5 [morphism = MORPH]
ST3 -> ST5 [morphism = MORPH]
//ST21 -> ST31, ST312[morphism =(MORPH1,MORPH2)]
//ST3, ST31, ST312 -> ST4[morphism = (MORPH,MORPH1,MORPH2) ]
ST5 -> __END__
}
\ No newline at end of file
digraph TEST_SUB {
FUNC [module=test_funcs.simplest, entry_func=increment_a_edge]
PRED [module=test_funcs.simplest, entry_func=positiveness_predicate]
MORPH [predicate=PRED, function=FUNC, comment="root graph"]
// SEL [module=test_funcs.simplest, entry_func=selector_a_nonpositive]
ST2 [subgraph = templates/adot/file.adot]
// ST3 [selector = SEL]
__BEGIN__ -> ST1 [morphism = MORPH]
ST1 -> ST2
ST2 -> ST3
ST3 -> __END__ [morphism = MORPH]
}
\ 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