diff --git a/src/ModelCheckLace.cpp b/src/ModelCheckLace.cpp index daaca60f573a731b76fa1655b288e3aa1c3b51b1..2db8f3ee6a2f30fa8a5402b0a47d7751fe35f6b5 100644 --- a/src/ModelCheckLace.cpp +++ b/src/ModelCheckLace.cpp @@ -33,7 +33,7 @@ void ModelCheckLace::preConfigure() { print_h(max); printf(" max.\n"); LACE_ME; - sylvan_set_limits(max, 28, 1); + sylvan_set_limits(max, 16, 2); sylvan_init_package(); sylvan_init_ldd(); @@ -134,8 +134,8 @@ TASK_3 (MDD, Aggregate_epsilon_lace, MDD, From, Set*, nonObservable, vector<Tran MDD M1; MDD M2=From; int it=0; - lddmc_refs_pushptr(&M1); - lddmc_refs_pushptr(&M2); + /*lddmc_refs_pushptr(&M1); + lddmc_refs_pushptr(&M2);*/ cout<<"worker "<<lace_get_worker()->worker<<endl; do @@ -145,17 +145,20 @@ TASK_3 (MDD, Aggregate_epsilon_lace, MDD, From, Set*, nonObservable, vector<Tran { lddmc_refs_spawn(SPAWN(lddmc_firing_lace,M2,(*tb_relation)[(*i)].getMinus(),(*tb_relation)[(*i)].getPlus())); } - // j=0; + for(Set::const_iterator i=nonObservable->begin(); !(i==nonObservable->end()); i++) { + lddmc_refs_push(M1); + lddmc_refs_push(M2); MDD succ=lddmc_refs_sync(SYNC(lddmc_firing_lace)); - //cout<<"j :"<<j<<endl; + lddmc_refs_push(succ); M2=lddmc_union(succ,M2); + lddmc_refs_pop(3); } } - while(M1!=M2); - lddmc_refs_popptr(2); + while (M1!=M2); + /* lddmc_refs_popptr(2);*/ return M2; } @@ -214,7 +217,7 @@ TASK_3 (bool, SetDivL, MDD, M, Set*, nonObservable, vector<TransSylvan>*, tb_rel LDDState * ModelCheckLace::getInitialMetaState() { - cout<<__func__<<endl; + if (!m_built_initial) { LDDState *initalAggregate=new LDDState(); LDDState *reached_class; LACE_ME; @@ -260,6 +263,8 @@ LDDState * ModelCheckLace::getInitialMetaState() initalAggregate->Successors.insert(initalAggregate->Successors.begin(),LDDEdge(reached_class,t)); reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(initalAggregate,t)); } + m_built_initial=true; + } return m_graph->getInitialState(); } diff --git a/src/ModelCheckLace.h b/src/ModelCheckLace.h index 00437d340f4d1a7642dbadb5593d03904f8fe595..bd2e6f8c7ad2093d7ca9264373ec34aa02a871c2 100644 --- a/src/ModelCheckLace.h +++ b/src/ModelCheckLace.h @@ -8,6 +8,7 @@ public: void buildSucc(LDDState *agregate) override; private: void preConfigure(); + bool m_built_initial=false; }; #endif diff --git a/src/sylvan_sog.c b/src/sylvan_sog.c index 828511871f6e3bda22e3f26c1d695201ce6aa88d..152af82e6f2189ba66ea1d811df06cb3a8b15e6e 100644 --- a/src/sylvan_sog.c +++ b/src/sylvan_sog.c @@ -19,6 +19,7 @@ static const uint64_t CACHE_FIRING_LACE = (57LL<<40); #define GETNODE(mdd) ((mddnode_t)llmsset_index_to_ptr(nodes, mdd)) + TASK_IMPL_3(MDD, lddmc_firing_lace, MDD, cmark, MDD, minus, MDD ,plus) { if (cmark == lddmc_true) return lddmc_true; @@ -36,6 +37,65 @@ TASK_IMPL_3(MDD, lddmc_firing_lace, MDD, cmark, MDD, minus, MDD ,plus) { mddnode_t n_plus = GETNODE(plus); mddnode_t n_minus = GETNODE(minus); + + //lddmc_refs_pushptr(&result); + uint32_t count=0; + uint32_t l_values[128]; + for (;;) + { + uint32_t value; + value = mddnode_getvalue(n_cmark); + uint32_t value_minus = mddnode_getvalue(n_minus); + uint32_t value_plus = mddnode_getvalue(n_plus); + if (value>=value_minus) + { + + lddmc_refs_spawn(SPAWN(lddmc_firing_lace, mddnode_getdown(n_cmark), mddnode_getdown(n_minus), mddnode_getdown(n_plus))); + l_values[count]=value-value_minus+value_plus; + count++; + + } + cmark = mddnode_getright(n_cmark); + if (cmark == lddmc_false) break; + n_cmark = GETNODE(cmark); + } + if (count>10) printf("Count %d\n",count); + result= lddmc_false; + while (count--) { + lddmc_refs_push(result); + MDD left=lddmc_refs_sync(SYNC(lddmc_firing_lace)); + lddmc_refs_push(left); + MDD result2 = + lddmc_makenode(l_values[count],left, lddmc_false); + lddmc_refs_push(result2); + result = lddmc_union( result, result2); + lddmc_refs_pop(3); + } + //lddmc_refs_popptr(1); + if (cache_put3(CACHE_FIRING_LACE, cmark, minus, plus,result)) sylvan_stats_count(CACHE_FIRING_LACE); + return result; +} + + + + +/*TASK_IMPL_3(MDD, lddmc_firing_lace, MDD, cmark, MDD, minus, MDD ,plus) { + + if (cmark == lddmc_true) return lddmc_true; + if (minus == lddmc_false) return lddmc_false; + if (plus == lddmc_false) return lddmc_false; + + MDD result; + if (cache_get3(CACHE_FIRING_LACE, cmark, minus, plus, &result)) { + printf("cached\n"); + sylvan_stats_count(CACHE_FIRING_LACE); + return result; + } + + mddnode_t n_cmark = GETNODE(cmark); + mddnode_t n_plus = GETNODE(plus); + mddnode_t n_minus = GETNODE(minus); + result= lddmc_false; //lddmc_refs_pushptr(&result); for (;;) @@ -63,3 +123,4 @@ TASK_IMPL_3(MDD, lddmc_firing_lace, MDD, cmark, MDD, minus, MDD ,plus) { if (cache_put3(CACHE_FIRING_LACE, cmark, minus, plus,result)) sylvan_stats_count(CACHE_FIRING_LACE); return result; } +*/