|
Go to the documentation of this file.
55 const std::list< StateSet >& rClasses
59 StateSet::Iterator sit;
60 StateSet::Iterator sit_end;
68 std::list< StateSet >::const_iterator qit=rClasses.begin();
69 for(;qit!=rClasses.end();++qit) {
73 for(;sit!=sit_end;++sit){
78 for(;tit!=tit_end;++tit) {
80 rRevTrans. Insert(q1,tit->Ev,tit->X2);
84 rit_end = rRevTrans. EndByX2(q2);
85 for(;rit!=rit_end;++rit) {
87 rRevTrans. Insert(rit->X1,rit->Ev,q1);
135 tit1=rXTrans. Begin();
136 tit1_end=rXTrans. End();
137 for(;tit1!=tit1_end; ++tit1) {
139 if(rSilentAlphabet. Exists(tit1->Ev)) {
140 tit2=rXTrans. Begin(tit1->X2);
141 tit2_end=rXTrans. End(tit1->X2);
142 for(;tit2!=tit2_end; ++tit2) {
143 newtrans. Insert(tit1->X1,tit2->Ev,tit2->X2);
148 tit2=rXTrans. Begin(tit1->X2);
149 tit2_end=rXTrans. End(tit1->X2);
150 for(;tit2!=tit2_end; ++tit2) {
151 if(rSilentAlphabet. Exists(tit2->Ev))
152 newtrans. Insert(tit1->X1,tit1->Ev,tit2->X2);
159 if(tsz==rXTrans. Size()) break;
174 FD_DF( "ObservationEquivalentQuotient(): ext. trans t#"<<xtrans. Size());
180 std::list< StateSet > eqclasses;
186 FD_DF( "ObservationEquivalentQuotient(): merging classes #"<< eqclasses.size());
208 rit1_end=rRevXTrans. EndByX2(q1);
210 rit2_end=rRevXTrans. EndByX2(q2);
213 for(;rit1!=rit1_end;++rit1) if(!rSilent. Exists(rit1->Ev)) break;
214 for(;rit2!=rit2_end;++rit2) if(!rSilent. Exists(rit2->Ev)) break;
216 if(rit1==rit1_end) break;
217 if(rit2==rit2_end) break;
219 if(rit1->X1!=rit2->X1) return false;
220 if(rit1->Ev!=rit2->Ev) return false;
227 for(;rit1!=rit1_end;++rit1) if(!rSilent. Exists(rit1->Ev)) break;
228 for(;rit2!=rit2_end;++rit2) if(!rSilent. Exists(rit2->Ev)) break;
229 if(rit1!=rit1_end) return false;
230 if(rit2!=rit2_end) return false;
234 bool ini1=rInitialStates. Exists(q1);
237 rit_end=rRevXTrans. EndByX2(q1);
238 for(;rit!=rit_end;++rit) {
239 if(!rSilent. Exists(rit->Ev)) continue;
240 if(rInitialStates. Exists(rit->X1)) {ini1= true; break;}
243 bool ini2=rInitialStates. Exists(q2);
246 rit_end=rRevXTrans. EndByX2(q2);
247 for(;rit!=rit_end;++rit) {
248 if(!rSilent. Exists(rit->Ev)) continue;
249 if(rInitialStates. Exists(rit->X1)) {ini2= true; break;}
252 if(ini1!=ini2) return false;
254 if(!nonsilent && !ini1) return false;
280 rit_end = rRevXTrans. EndByX2(q1);
281 for(;rit!=rit_end;++rit) {
282 if(rSilent. Exists(rit->Ev)) continue;
284 tit = rXTrans. Begin(rit->X1,rit->Ev);
285 tit_end = rXTrans. End(rit->X1,rit->Ev);
286 for(;tit!=tit_end;++tit)
293 rit_end = rRevXTrans. EndByX2(q1);
294 for(;rit!=rit_end;++rit) {
298 tit = rXTrans. Begin(q1);
299 tit_end = rXTrans. End(q1);
300 for(;tit!=tit_end;++tit) {
301 if(!rSilent. Exists(tit->Ev)) continue;
317 StateSet::Iterator sit1;
318 StateSet::Iterator sit1_end;
319 StateSet::Iterator sit2;
320 StateSet::Iterator sit2_end;
323 EventSet::Iterator eit;
324 EventSet::Iterator eit_end;
334 FD_DF( "ActiveEventsRule: ext. trans t#"<<xtrans. Size());
337 std::list< StateSet > eqclasses;
347 sit1_end=states. End();
348 for(;sit1!=sit1_end;++sit1) {
359 sit2=candidates. Begin();
360 sit2_end=candidates. End();
361 for(;sit2!=sit2_end;++sit2){
363 if(!states. Exists(*sit2)) continue;
365 if(*sit2<=*sit1) continue;
368 if(! ( active1 == xtrans. ActiveEvents(*sit2) - silent ) ) continue;
406 if(eqclass. Size()>0){
408 eqclasses.push_back(eqclass);
414 FD_DF( "ActiveEventsRule: merging classes #"<< eqclasses.size());
429 StateSet::Iterator sit1;
430 StateSet::Iterator sit1_end;
431 StateSet::Iterator sit2;
432 StateSet::Iterator sit2_end;
443 std::list< StateSet > eqclasses;
452 sit1_end=states. End();
453 for(;sit1!=sit1_end;++sit1) {
460 if(candidates. Empty()) continue;
464 sit2=candidates. Begin();
465 sit2_end=candidates. End();
466 for(;sit2!=sit2_end;++sit2){
468 if(!states. Exists(*sit2)) continue;
470 if(*sit2<=*sit1) continue;
488 if(eqclass. Size()>0){
490 eqclasses.push_back(eqclass);
496 FD_DF( "SilentContinuationRule(): merging classes #"<< eqclasses.size());
511 StateSet::Iterator sit;
512 StateSet::Iterator sit_end;
517 if(tit->X1 == tit->X2)
518 if(silent. Exists(tit->Ev)) {
528 std::list< StateSet > scclist;
531 std::map< Idx , Idx > sccxmap;
532 while(!scclist.empty()) {
533 const StateSet& scc=scclist.front();
534 if(scc. Size()<=1) { scclist.pop_front(); continue;}
546 for(;sit!=sit_end;++sit)
549 delstates.InsertSet(scc);
554 if(sccxmap.size()>0){
555 std::map<Idx,Idx>::iterator xit1;
556 std::map<Idx,Idx>::iterator xit2;
561 xit1=sccxmap.find(t. X1);
562 xit2=sccxmap.find(t. X2);
563 if(xit1!=sccxmap.end()) t. X1=xit1->second;
564 if(xit2!=sccxmap.end()) t. X2=xit2->second;
578 StateSet::Iterator sit=notcoaccSet. Begin();
579 StateSet::Iterator sit_end=notcoaccSet. End();
580 for(;sit!=sit_end;++sit){
598 StateSet::Iterator sit;
599 StateSet::Iterator sit_end;
603 for(;tit!=tit_end;++tit) {
604 if(silent. Exists(tit->Ev))
605 if(!coacc.Exists(tit->X2))
610 sit_end=sblock. End();
611 for(;sit!=sit_end;++sit) {
628 if(notcoacc. Size()<2) return;
637 for(;tit!=tit_end;++tit){
638 if(notcoacc. Exists(tit->X2))
658 for(;tit!=tit_end;++tit) {
660 if(silent. Exists(tit->Ev)) continue;
662 if(coacc.Exists(tit->X1)) continue;
663 if(coacc.Exists(tit->X2)) continue;
667 for(;dit!=dit_end;++dit) {
669 if(dit->X1==dit->X2) continue;
675 dit=deltrans. Begin();
676 dit_end=deltrans. End();
677 for(;dit!=dit_end;++dit)
694 StateSet::Iterator sit;
695 StateSet::Iterator sit_end;
703 for(;tit!=tit_end;++tit)
707 if(cand1. Size()==0) return;
713 for(;sit!=sit_end;++sit) {
716 for(;tit!=tit_end;++tit) {
717 if(silent. Exists(tit->Ev)) {
725 if(cand2. Size()==0) return;
730 for(;tit!=tit_end;++tit)
741 for(;tit!=tit_end;++tit) {
742 if(!cand2. Exists(tit->X2)) continue;
746 for(;dit!=dit_end;++dit) {
767 StateSet::Iterator sit;
768 StateSet::Iterator sit_end;
777 for(;tit!=tit_end;++tit)
783 for(;tit!=tit_end;++tit)
787 if(cand. Size()==0) return;
796 for(;tit!=tit_end;++tit) {
797 if(!cand. Exists(tit->X2)) continue;
800 if(dit==dit_end) cand. Erase(tit->X2);
801 for(;dit!=dit_end;++dit)
808 for(;sit!=sit_end;++sit)
831 FD_WPC(sz0, sz1, "ConflictEquivalentAbstraction: fixpoint iteration states #" << sz1);
833 if(rSilentEvents. Size()>0){
840 if(rGen. Size()==sz1) break;
847 if(rSilentEvents. Size()>0) {
851 if(rSilentEvents. Size()>0) {
854 if(rGen. Size()==sz2) break;
867 if(rGenVec. Size()==0) return true;
875 for(i=0;i<gvec. Size()-1;++i){
876 for(j=i+1;j<gvec. Size();++j){
880 all=all+gvec. At(i).Alphabet();
886 for(i=0;i<gvec. Size();++i){
889 if(sili. Size()<=1) continue;
896 for(;tit!=tit_end;) {
897 if(!sili. Exists(tit->Ev)) {++tit; continue;}
906 for(i=0;i<gvec. Size();i++){
908 FD_DF( "Abstract generator " << g. Name());
913 FD_DF( "No marked states (A)");
919 while(gvec. Size()>=2) {
923 for(i=1;i<gvec. Size();i++){
924 if(gvec. At(i).TransRelSize()<gvec. At(imin).TransRelSize())
931 for(i=0;i<gvec. Size();i++){
932 if(i==imin) continue;
937 for(j=0;j<gvec. Size();j++){
938 if(j==imin) continue;
940 shared=shared + gvec. At(j).Alphabet()*aij;
943 if(jscore>score) {score=jscore; jmin=i;}
962 FD_DF( "Compose generator " << gimin. Name() << " and " << gjmin. Name());
969 for(i=0;i<gvec. Size()-1;++i){
970 for(j=i+1;j<gvec. Size();++j){
974 all=all+gvec. At(i).Alphabet();
984 silent.EraseSet(sili);
987 for(;tit!=tit_end;) {
988 if(!sili. Exists(tit->Ev)) {++tit; continue;}
998 FD_DF( "Abstract generator " << gimin. Name());
999 FD_DF( "Silent events #" << (gimin. Alphabet()*silent).Size());
1003 FD_DF( "No marked states (A)");
1010 FD_DF( "Testing final stage with t#" << gvec. At(0).TransRelSize() << "/s#" << gvec. At(0).Size());
1011 bool res=gvec. At(0).BlockingStates().Size()==0;
1012 FD_DF( "IsNonblocking(): done");
libFAUDES 2.28a
--- 2016.09.13
--- c++ api documentaion by doxygen
|