|
Go to the documentation of this file.
38 FD_DF( "SupNorm(" << rK. Name() << "," << rL. Name() << "," << rOAlph. Name() << ")");
53 std::string rLname=rL. Name();
69 FD_DF( "SupNorm: sizeof L U complement(K)=L-K: "<<tempgen. Size());
72 Project(tempgen,rOAlph,rResult);
74 FD_DF( "SupNorm: sizeof p(L-K): "<< rResult. Size());
76 FD_DF( "SupNorm: sizeof pinv(p(L-K)): "<<rResult. Size());
85 FD_DF( "SupNorm: sizeof K - pinv(p(L-K)) (result): "<<rResult. Size());
109 FD_DF( "CompleteSynth(" << rPlant. Name() << "," << rSpec. Name()<< ")");
116 FD_DF( "CompleteSynth::empty language specification: empty closed loop.");
117 rClosedLoop. Name( "CompeleteSynth("+rPlant. Name()+ ", "+rSpec. Name()+ ")");
127 FD_DF( "CompleteSynth:: spec size " << ClosedLoopCand. Size());
130 SupConClosed(rPlant, rCAlph, ClosedLoopCand, rClosedLoop);
132 FD_DF( "CompleteSynth: size of current result after SupCon: "<<rClosedLoop. Size());
137 FD_DF( "CompleteSynth:: failed: empty language result.");
139 rClosedLoop. Name( "CompeleteSynth("+rPlant. Name()+ ", "+rSpec. Name()+ ")");
143 FD_DF( "CompleteSynth:: candidate size " << rClosedLoop. Size());
147 if(dead_ends. Empty()) {
149 FD_DF( "CompleteSynth:: done");
150 rClosedLoop. Name( "CompeleteSynth("+rPlant. Name()+ ", "+rSpec. Name()+ ")");
155 FD_DF( "CompleteSynth:: eliminating following " << dead_ends. Size() << " dead ends");
161 ClosedLoopCand=rClosedLoop;
164 FD_DF( "CompleteSynth:: size of result after removing dead ends: "<<rClosedLoop. Size());
169 FD_DF( "CompleteSynth:: failed: empty language result.");
170 rClosedLoop. Name( "CompeleteSynth("+rPlant. Name()+ ", "+rSpec. Name()+ ")");
185 FD_DF( "NormalCompleteSynth(" << rPlant. Name() << "," << rSpec. Name()<< ")");
197 FD_DF( "NormalCompleteSynth:: failed: empty result after CompleteSynth().");
198 std::cout<<std::endl<< "NormalCompleteSynth:: failed: empty result after CompleteSynth().";
199 rClosedLoop. Name( "NormalCompleteSynth(" + rPlant. Name() + "," + rSpec. Name()+ ")");
204 if( IsNormal(rPlant,rOAlph,rClosedLoop)) {
205 FD_DF( "NormalCompleteSynth:: candidate supervisor is normal. success.");
206 rClosedLoop. Name( "NormalCompleteSynth(" + rPlant. Name() + "," + rSpec. Name()+ ")");
212 FD_DF( "NormalCompleteSynth:: candidate supervisor not normal. running SupNorm");
213 if(! SupNormSP(rPlant, rOAlph, rClosedLoop, Spec)) {
214 FD_DF( "NormalCompleteSynth:: failed: empty result after SupNorm().");
215 std::cout<<std::endl<< "NormalCompleteSynth:: failed: empty result after SupNorm().";
217 rClosedLoop. Name( "NormalCompleteSynth(" + rPlant. Name() + "," + rSpec. Name()+ ")");
224 FD_DF( "NormalCompleteSynth:: size of result after SupNorm(): "<<Spec. Size());
237 FD_DF( "NormalCompleteSynth(" << rPlant. Name() << "," << rSpec. Name()<< ")");
248 FD_DF( "NormalCompleteSynthNB:: failed: empty result after NormalCompleteSynth().");
249 std::cout<<std::endl<< "NormalCompleteSynthNB:: failed: empty result after NormalCompleteSynth().";
250 rClosedLoop. Name( "NormalCompleteSynthNB(" + rPlant. Name() + "," + rSpec. Name()+ ")");
255 if(rClosedLoop. IsTrim()) {
256 FD_DF( "NormalCompleteSynthNB:: candidate supervisor is trim. success.");
257 rClosedLoop. Name( "NormalCompleteSynthNB(" + rPlant. Name() + "," + rSpec. Name()+ ")");
263 FD_DF( "NormalCompleteSynthNB:: candidate supervisor not Trim. running Trim()");
266 FD_DF( "NormalCompleteSynthNB:: failed: empty result after Trim().");
267 std::cout<<std::endl<< "NormalCompleteSynthNB:: failed: empty result after Trim().";
269 rClosedLoop. Name( "NormalCompleteSynthNB(" + rPlant. Name() + "," + rSpec. Name()+ ")");
274 FD_DF( "NormalCompleteSynthNB:: size of result after Trim():"<<Spec. Size());
288 FD_DF( "HioSortCL(...)");
290 #ifdef FAUDES_CHECKED
293 std::stringstream errstr;
294 errstr << "At least one empty parameter.";
295 throw Exception( "HioSortCL", errstr.str(), 0);
304 EventSet::Iterator evit;
306 for (evit = rUc. Begin(); evit != rUc. End(); ++evit) {
310 for (evit = rYp. Begin(); evit != rYp. End(); ++evit) {
314 for (evit = rUp. Begin(); evit != rUp. End(); ++evit) {
318 for (evit = rYe. Begin(); evit != rYe. End(); ++evit) {
322 for (evit = rUe. Begin(); evit != rUe. End(); ++evit) {
326 #ifdef FAUDES_CHECKED
328 if (!errevents. Empty()){
329 std::stringstream errstr;
330 errstr << "Non-disjoint parameters; ambiguous events:\n" <<errevents. ToString();
331 throw Exception( "HioSortCL", errstr.str(), 0);
353 for (evit = rYp. Begin(); evit != rYp. End(); ++evit) {
357 for (evit = rYc. Begin(); evit != rYc. End(); ++evit) {
361 for (evit = rUc. Begin(); evit != rUc. End(); ++evit) {
365 for (evit = rUp. Begin(); evit != rUp. End(); ++evit) {
370 for (evit = rYe. Begin(); evit != rYe. End(); ++evit) {
374 for (evit = rUe. Begin(); evit != rUe. End(); ++evit) {
386 const std::string& rErrState1,
387 const std::string& rErrState2,
389 Idx& rErrState2Idx) {
390 FD_DF( "HioFreeInput( [generator] " << rGen. Name() << ")");
393 if(&rResGen== &rGen) {
394 pResGen= rResGen. New();
397 #ifdef FAUDES_CHECKED
399 if(rInput. Empty() || !((rInput*rOutput).Empty())) {
400 std::stringstream errstr;
401 errstr << "Empty Input-alphabet or non-disjoint Input and Output.\n";
402 errstr << "Input: "<< rInput. ToString()<< "\n";
403 errstr << "Output: "<< rOutput. ToString()<< "\n";
404 errstr << "Input*Output: "<< (rInput*rOutput).ToString()<< "\n";
405 throw Exception( "HioFreeInput", errstr.str(), 0);
412 if(!StateNamesEnabled && (!rErrState1.empty()||!rErrState2.empty())) {
413 FD_WARN( "HioFreeInput: state names disabled in rResGen: error state names ignored.");
419 pResGen-> Name( "HioFreeInput("+rGen. Name()+ ")");
422 std::string errstate1;
423 if(StateNamesEnabled) {
433 EventSet::Iterator evit;
434 bool InputInserted = false;
440 if( (disabledInput!=rInput) && !disabledInput. Empty()) {
441 FD_DF( "HioFreeInput: " << *sit << " disabledInput: " << disabledInput. ToString());
442 InputInserted = true;
443 for (evit = disabledInput. Begin(); evit != disabledInput. End(); ++evit) {
451 if(StateNamesEnabled) {
452 FD_DF( "HioFreeInput(...): inserted error state 1: " << errstate1 << " with Idx: " << rErrState1Idx);
455 FD_DF( "HioFreeInput(...): inserted error state 1 with Idx: " << rErrState1Idx);
457 if(!rOutput. Empty()) {
459 std::string errstate2;
460 if(StateNamesEnabled) {
463 FD_DF( "HioFreeInput(...): inserted error state 2: " << errstate2);
467 FD_DF( "HioFreeInput(...): inserted error state 2 with Idx: " << rErrState2Idx);
471 for (evit = rInput. Begin(); evit != rInput. End(); ++evit) {
475 for (evit = rOutput. Begin(); evit != rOutput. End(); ++evit) {
485 if(pResGen != &rResGen) {
486 pResGen-> Move(rResGen);
497 const std::string& rErrState1,
498 const std::string& rErrState2) {
499 Idx errstate1,errstate2;
500 HioFreeInput(rGen,rInput,rOutput,rResGen,rErrState1,rErrState2,errstate1,errstate2);
511 std::string ErrState1,ErrState2;
512 HioFreeInput(rGen,rInput,rOutput,rResGen,ErrState1,ErrState2);
521 FD_DF( "HioFreeInput( [plant] " << rPlant. Name() << ")");
525 Idx errstateUp,errstateUe,errstate2;
526 std::string ErrState1,ErrState2;
535 HioFreeInput(rPlant,uP,NoOutput,rResPlant,ErrState1,ErrState2,errstateUp,errstate2);
538 HioFreeInput(rResPlant,uE,NoOutput,rResPlant,ErrState1,ErrState2,errstateUe,errstate2);
557 FD_DF( "HioFreeInput( [controller] " << rController. Name() << ")");
560 if(&rResController== &rController) {
561 pResController=rResController. New();
568 std::string errStr1, errStr2;
571 Idx errIdx1, errIdx2;
574 pResController-> Assign(rController);
578 pResController-> Name( "HioFreeInput("+rController. Name()+ ")");
587 if(StateNamesEnabled) {
595 pResController-> SetErr(errIdx1);
598 pResController-> SetQUp(errIdx1);
601 StateSet::Iterator sit=pResController-> StatesBegin();
602 EventSet::Iterator evit;
603 bool InputInserted = false;
604 for(;sit!=pResController-> StatesEnd();sit++){
608 disabledInput = UcEvents - active;
611 if( (disabledInput!=UcEvents) && !disabledInput. Empty()) {
613 InputInserted = true;
614 for (evit = disabledInput. Begin(); evit != disabledInput. End(); ++evit) {
619 disabledInput = YpEvents - active;
622 if( (disabledInput!=YpEvents) && !disabledInput. Empty()) {
624 InputInserted = true;
625 for (evit = disabledInput. Begin(); evit != disabledInput. End(); ++evit) {
634 std::string errstate2;
635 if(StateNamesEnabled) {
636 FD_DF( "HioFreeInput(...): inserted error state 1: " << errStr1);
639 FD_DF( "HioFreeInput(...): inserted error state 2: " << errStr2);
642 FD_DF( "HioFreeInput(...): inserted error state 1 with Idx: " << errIdx1);
644 FD_DF( "HioFreeInput(...): inserted error state 2 with Idx: " << errIdx2);
648 pResController-> SetErr(errIdx2);
650 pResController-> SetQYp(errIdx2);
653 for (evit = UpEvents. Begin(); evit != UpEvents. End(); ++evit) {
657 for (evit = YpEvents. Begin(); evit != YpEvents. End(); ++evit) {
668 if(pResController != &rResController) {
669 pResController-> Move(rResController);
670 delete pResController;
673 rResController. SetYc(YcEvents);
674 rResController. SetUc(UcEvents);
675 rResController. SetYp(YpEvents);
676 rResController. SetUp(UpEvents);
684 FD_DF( "HioFreeInput( [environment] " << rEnvironment. Name() << ")");
687 if(&rResEnvironment== &rEnvironment) {
688 pResEnvironment=rResEnvironment. New();
695 std::string errStr1, errStr2;
698 Idx errIdx1, errIdx2;
701 pResEnvironment-> Assign(rEnvironment);
705 pResEnvironment-> Name( "HioFreeInput("+rEnvironment. Name()+ ")");
714 if(StateNamesEnabled) {
723 pResEnvironment-> SetErr(errIdx1);
725 pResEnvironment-> SetQUe(errIdx1);
728 StateSet::Iterator sit=pResEnvironment-> StatesBegin();
729 EventSet::Iterator evit;
730 bool InputInserted = false;
731 for(;sit!=pResEnvironment-> StatesEnd();sit++){
735 disabledInput = UlEvents - active;
738 if( (disabledInput!=UlEvents) && !disabledInput. Empty()) {
740 InputInserted = true;
741 for (evit = disabledInput. Begin(); evit != disabledInput. End(); ++evit) {
746 disabledInput = YeEvents - active;
749 if( (disabledInput!=YeEvents) && !disabledInput. Empty()) {
751 InputInserted = true;
752 for (evit = disabledInput. Begin(); evit != disabledInput. End(); ++evit) {
761 std::string errstate2;
762 if(StateNamesEnabled) {
763 FD_DF( "HioFreeInput(...): inserted error state 1: " << errStr1);
766 FD_DF( "HioFreeInput(...): inserted error state 2: " << errStr2);
769 FD_DF( "HioFreeInput(...): inserted error state 1 with Idx: " << errIdx1);
771 FD_DF( "HioFreeInput(...): inserted error state 2 with Idx: " << errIdx2);
775 pResEnvironment-> SetErr(errIdx2);
777 pResEnvironment-> SetQYe(errIdx2);
780 for (evit = UeEvents. Begin(); evit != UeEvents. End(); ++evit) {
784 for (evit = YeEvents. Begin(); evit != YeEvents. End(); ++evit) {
794 if(pResEnvironment != &rResEnvironment) {
795 pResEnvironment-> Move(rResEnvironment);
796 delete pResEnvironment;
799 rResEnvironment. SetYl(YlEvents);
800 rResEnvironment. SetUl(UlEvents);
801 rResEnvironment. SetYe(YeEvents);
802 rResEnvironment. SetUe(UeEvents);
812 Idx errstate1,errstate2;
813 std::string ErrState1= "Y-Error";
814 std::string ErrState2= "ErrorQY";
818 HioFreeInput(rConstraint,y,u,rResConstraint,ErrState1,ErrState2,errstate1,errstate2);
820 rResConstraint. SetErr(errstate1);
821 rResConstraint. SetErr(errstate2);
823 rResConstraint. SetY(y);
824 rResConstraint. SetU(u);
829 FD_DF( "HioFreeInput( [single arg plant] " << rPlant. Name() << ")");
864 const std::map< std::pair<Idx,Idx>, Idx >& rMapOrigToResult,
868 std::map< Idx, std::pair<Idx,Idx> > mapResultToOrig;
869 std::map< std::pair<Idx,Idx>, Idx >::const_iterator iter;
870 for( iter = rMapOrigToResult.begin(); iter != rMapOrigToResult.end(); ++iter ) {
871 mapResultToOrig.insert(std::make_pair( iter->second, iter->first ));
876 StateSet::Iterator sit;
877 std::map< Idx, Idx > rGen1Clones,rGen2Clones;
878 for(sit = nonmarked. Begin(); sit != nonmarked. End(); sit ++) {
894 std::map<Idx,Idx>::iterator cloneit;
895 bool x1hasGen1Clone,x1hasGen2Clone, x2hasClone;
896 for(;tit!=tit_end;tit++) {
898 x1hasGen1Clone= false;
899 x1hasGen2Clone= false;
907 cloneit=rGen1Clones.find(tit->X1);
908 if(cloneit!=rGen1Clones.end()) x1hasGen1Clone= true;
909 cloneit=rGen2Clones.find(tit->X1);
910 if(cloneit!=rGen2Clones.end()) x1hasGen2Clone= true;
916 cloneit=rGen1Clones.find(tit->X2);
917 if(cloneit!=rGen1Clones.end()) {
920 TransToClear. Insert(*tit);
921 TransToSet. Insert(tit->X1,tit->Ev,rGen1Clones[tit->X2]);
924 TransToSet. Insert(rGen1Clones[tit->X1],tit->Ev,rGen1Clones[tit->X2]);
927 TransToSet. Insert(rGen2Clones[tit->X1],tit->Ev,rGen1Clones[tit->X2]);
935 cloneit=rGen2Clones.find(tit->X2);
936 if(cloneit!=rGen2Clones.end()) {
939 TransToClear. Insert(*tit);
940 TransToSet. Insert(tit->X1,tit->Ev,cloneit->second);
943 TransToSet. Insert(rGen1Clones[tit->X1],tit->Ev,rGen2Clones[tit->X2]);
946 TransToSet. Insert(rGen2Clones[tit->X1],tit->Ev,rGen2Clones[tit->X2]);
955 if( (x1hasGen1Clone||x1hasGen2Clone) && !x2hasClone ) {
956 if(x1hasGen1Clone) TransToSet. Insert(rGen1Clones[tit->X1],tit->Ev,tit->X2);
957 if(x1hasGen2Clone) TransToSet. Insert(rGen2Clones[tit->X1],tit->Ev,tit->X2);
962 tit=TransToClear. Begin();
963 tit_end=TransToClear. End();
967 tit=TransToSet. Begin();
968 tit_end=TransToSet. End();
982 FD_DF( "MarkAlternationAB()");
984 #ifdef FAUDES_CHECKED
987 std::stringstream errstr;
988 errstr << "Empty parameter rAset.";
989 throw Exception( "CheapAltAnB", errstr.str(), 0);
992 std::stringstream errstr;
993 errstr << "Empty parameter rBset.";
994 throw Exception( "CheapAltAnB", errstr.str(), 0);
1009 EventSet::Iterator evit=rAset. Begin();
1010 EventSet::Iterator evit_end=rAset. End();
1011 for(;evit!=evit_end;++evit) {
1019 evit_end=rBset. End();
1020 for(;evit!=evit_end;++evit) {
1039 FD_DF( "HioShuffle()");
1048 std::map< std::pair<Idx,Idx>, Idx > MapOrigToResult;
1049 Parallel(rPlantA,rPlantB,MapOrigToResult,parallel1);
1056 Idx state1,state2,state3;
1061 EventSet::Iterator evit;
1062 for (evit = A. Begin(); evit != A. End(); ++evit) {
1066 for (evit = B. Begin(); evit != B. End(); ++evit) {
1070 Parallel(parallel1,EventPairs,parallel2);
1071 parallel1 = parallel2;
1112 FD_DF( "------ HioShuffle with Environment-First-Policy! -----");
1116 StateSet::Iterator sit_end = parallel1. StatesEnd();
1118 for(; sit != sit_end; sit++)
1127 if (!(ActiveYe. Empty())&& !(ActiveYp. Empty()))
1132 for(;tit!=tit_end;tit++)
1135 if(ActiveYp. Exists(tit->Ev))
1137 TransToClear. Insert(*tit);
1140 tit=TransToClear. Begin();
1141 tit_end=TransToClear. End();
1142 for(;tit!=tit_end;tit++)
1162 HioFreeInput(parallel1, rUp, rYp, parallel2, "errYp_Ye", "errUp");
1165 HioFreeInput(parallel2, rUe, rYe, parallel1, "errYp_Ye", "errUe");
1172 Parallel(parallel2,parallel1,parallel1);
1174 rIOShuffAB = parallel1;
1175 rIOShuffAB. Name( "HioShuffle("+rPlantA. Name()+rPlantB. Name()+ ")");
1191 #ifdef FAUDES_CHECKED
1194 std::stringstream errstr;
1195 errstr << "Empty Yp alphabet\n";
1196 throw Exception( "HioShuffle", errstr.str(), 0);
1199 std::stringstream errstr;
1200 errstr << "Empty Up alphabet\n";
1201 throw Exception( "HioShuffle", errstr.str(), 0);
1204 std::stringstream errstr;
1205 errstr << "Empty Ye alphabet\n";
1206 throw Exception( "HioShuffle", errstr.str(), 0);
1209 std::stringstream errstr;
1210 errstr << "Empty Ue alphabet\n";
1211 throw Exception( "HioShuffle", errstr.str(), 0);
1215 EventSet alphabet,alphabetA,alphabetB,errevents;
1221 EventSet::Iterator evit;
1223 for (evit = rUp. Begin(); evit != rUp. End(); ++evit) {
1227 for (evit = rYe. Begin(); evit != rYe. End(); ++evit) {
1231 for (evit = rUe. Begin(); evit != rUe. End(); ++evit) {
1235 if (!errevents. Empty()){
1236 std::stringstream errstr;
1237 errstr << "Non-disjoint parameters; ambiguous events:\n" <<errevents. ToString();
1238 throw Exception( "HioShuffle", errstr.str(), 0);
1244 errevents=alphabetA+alphabetB-alphabet;
1245 if (!errevents. Empty()){
1246 std::stringstream errstr;
1247 errstr << "Plant A- or plant B-events missing in Yp,Up,Ye or Ue:\n" <<errevents. ToString();
1248 throw Exception( "HioShuffle", errstr.str(), 0);
1252 HioPlant hioPlantA= HioPlant(rPlantA,rYp*alphabetA,rUp*alphabetA,rYe*alphabetA,rUe*alphabetA);
1255 std::stringstream errstr;
1256 errstr << "plant A not in HioPlantForm:\n" << report;
1257 throw Exception( "HioShuffle", errstr.str(), 0);
1260 HioPlant hioPlantB= HioPlant(rPlantB,rYp*alphabetB,rUp*alphabetB,rYe*alphabetB,rUe*alphabetB);
1263 std::stringstream errstr;
1264 errstr << "plant B not in HioPlantForm:\n" << report;
1265 throw Exception( "HioShuffle", errstr.str(), 0);
1288 HioShuffle(rPlantA, rPlantB, yp, up, ye, ue, rIOShuffAB);
1291 rIOShuffAB. SetYp(yp);
1292 rIOShuffAB. SetUp(up);
1293 rIOShuffAB. SetYe(ye);
1294 rIOShuffAB. SetUe(ue);
1307 FD_DF( "CheapAltAnB()");
1311 std::stringstream errstr;
1312 errstr << "Parameter Depth must be 1 or greater.";
1313 throw Exception( "CheapAltAnB", errstr.str(), 0);
1315 #ifdef FAUDES_CHECKED
1317 std::stringstream errstr;
1318 errstr << "Empty parameter rAset.";
1319 throw Exception( "CheapAltAnB", errstr.str(), 0);
1322 std::stringstream errstr;
1323 errstr << "Empty parameter rBset.";
1324 throw Exception( "CheapAltAnB", errstr.str(), 0);
1340 EventSet::Iterator evit;
1341 for (evit = rBset. Begin(); evit != rBset. End(); ++evit) {
1346 for ( int i=0; i!=Depth; ++i) {
1350 for (evit = rAset. Begin(); evit != rAset. End(); ++evit) {
1355 for (evit = rBset. Begin(); evit != rBset. End(); ++evit) {
1369 FD_DF( "CheapAltAB()");
1391 FD_DF( "HioShuffle()");
1400 Parallel(rPlantA,rPlantB,parallel1);
1406 Idx state1,state2,state3;
1411 EventSet::Iterator evit;
1412 for (evit = A. Begin(); evit != A. End(); ++evit) {
1416 for (evit = B. Begin(); evit != B. End(); ++evit) {
1420 Parallel(parallel1,EventPairs,parallel2);
1475 Parallel(parallel2, AltAB, parallel1);
1528 HioFreeInput(parallel1, rUp, rYp, parallel2, "errYp_Ye", "errUp");
1531 HioFreeInput(parallel2, rUe, rYe, parallel1, "errYp_Ye", "errUe");
1534 rIOShuffAB = parallel1;
1576 const bool UnMarkedOnly,
1578 std::stack<Idx>& rSTACK,
1580 std::map<const Idx, int>& rDFN,
1581 std::map<const Idx, int>& rLOWLINK,
1582 std::set<StateSet>& rSccSet,
1585 FD_DF( "SerchYclessScc: -- search from state "<< state << "--");
1588 rNewStates. Erase(state);
1597 rLOWLINK[state]=rDFN[state];
1602 rStackStates. Insert(state);
1608 for (; it != it_end; ++it) {
1611 SuccStates. Insert(it->X2);
1616 StateSet::Iterator sit = SuccStates. Begin();
1617 StateSet::Iterator sit_end = SuccStates. End();
1618 for (; sit != sit_end; ++sit)
1621 if(rNewStates. Exists(*sit))
1625 SearchYclessScc(*sit, rcount, rGen, rYc, UnMarkedOnly, rNewStates, rSTACK, rStackStates, rDFN, rLOWLINK, rSccSet, rRoots);
1627 if(rLOWLINK[*sit]<rLOWLINK[state])
1629 rLOWLINK[state]=rLOWLINK[*sit];
1636 if((rDFN[*sit]<rDFN[state])&&(rStackStates. Exists(*sit)))
1639 if(rDFN[*sit]<rLOWLINK[state])
1641 rLOWLINK[state]=rDFN[*sit];
1647 if(rLOWLINK[state]==rDFN[state])
1652 bool realscc=rSTACK.top()!=state;
1657 for (; it != it_end; ++it)
1659 if((it->X2==state)&&(!rYc. Exists(it->Ev)))
1675 bool purelyUnMarked= true;
1681 Idx top=rSTACK.top();
1688 rStackStates. Erase(top);
1698 if(!purelyUnMarked || UnMarkedOnly)
1700 rSccSet.insert(Scc);
1717 std::set<StateSet>& rSccSet,
1720 FD_DF( "YclessScc(" << rGen. Name() << ")");
1729 std::stack<Idx> STACK;
1737 std::map<const Idx, int> DFN;
1739 std::map<const Idx, int> LOWLINK;
1744 while(!NewStates. Empty()) {
1746 if(NewStates. Exists(InitState)) {
1747 SearchYclessScc(InitState, count, rGen, rYc, false, NewStates, STACK, StackStates, DFN, LOWLINK, rSccSet, rRoots);
1749 SearchYclessScc(*NewStates. Begin(), count, rGen, rYc, false, NewStates, STACK, StackStates, DFN, LOWLINK, rSccSet, rRoots);
1753 return !rSccSet.empty();
1761 std::set<StateSet>& rSccSet,
1764 FD_DF( "YclessScc(" << rGen. Name() << ")");
1773 std::stack<Idx> STACK;
1781 std::map<const Idx, int> DFN;
1783 std::map<const Idx, int> LOWLINK;
1788 while(!NewStates. Empty()) {
1790 if(NewStates. Exists(InitState)) {
1791 SearchYclessScc(InitState, count, rGen, rYc, true, NewStates, STACK, StackStates, DFN, LOWLINK, rSccSet, rRoots);
1793 SearchYclessScc(*NewStates. Begin(), count, rGen, rYc, true, NewStates, STACK, StackStates, DFN, LOWLINK, rSccSet, rRoots);
1797 return !rSccSet.empty();
1806 std::set<StateSet>& rSccSet)
1808 FD_DF( "YclessScc(" << rGen. Name() << ")");
1814 return YclessScc(rGen,rYc,rSccSet,Roots);
1822 FD_DF( "IsYcLive(" << rGen. Name() << ")");
1824 std::set<StateSet> rSccSet;
1828 return rSccSet.size()==0;
1834 const std::set<StateSet>& rStateSets)
1836 FD_DF( "WriteStateSets()");
1837 std::cout<<std::endl;
1838 if(rStateSets.empty()) {
1839 std::cout<< "WriteStateSets: Set of state sets is empty."<<std::endl;
1840 FD_DF( "WriteStateSets: Set of state sets is empty.");
1843 std::cout<< ">WriteStateSets: Set of state sets begin:"<< std::endl;
1844 std::set<StateSet>::iterator StateSetit = rStateSets.begin();
1845 std::set<StateSet>::iterator StateSetit_end = rStateSets.end();
1846 for (; StateSetit != StateSetit_end; ++StateSetit) {
1847 std::cout<<std::endl<< " >> State set begin:"<< std::endl;
1848 StateSet::Iterator sit = StateSetit->Begin();
1849 StateSet::Iterator sit_end = StateSetit->End();
1850 for (; sit != sit_end; ++sit) {
1851 std::cout<< " >> "<<*sit<<std::endl;
1853 std::cout<< " >> State set end."<< std::endl;
1855 std::cout<<std::endl<< ">WriteStateSets: Set of state sets end."<<std::endl;
1863 const std::set<StateSet>& rStateSets)
1865 FD_DF( "WriteStateSets()");
1866 std::cout<<std::endl;
1867 if(rStateSets.empty()) {
1868 std::cout<< "WriteStateSets: Set of state sets is empty."<<std::endl;
1869 FD_DF( "WriteStateSets: Set of state sets is empty.");
1872 std::cout<< ">WriteStateSets: Set of state sets begin:"<< std::endl;
1873 std::set<StateSet>::iterator StateSetit = rStateSets.begin();
1874 std::set<StateSet>::iterator StateSetit_end = rStateSets.end();
1875 for (; StateSetit != StateSetit_end; ++StateSetit) {
1876 std::cout<<std::endl<< " >> State set begin:"<< std::endl;
1878 std::cout<< " >> State set end."<< std::endl;
1880 std::cout<<std::endl<< ">WriteStateSets: Set of state sets end."<<std::endl;
1886 const std::set<StateSet>& rSccSet,
1890 FD_DF( "SccEntries(...)");
1893 rEntryStates. Clear();
1894 rEntryTransSet. Clear();
1899 FD_DF( "SccEntries: Entry states of all SCCs:");
1902 std::set<StateSet>::iterator sccit = rSccSet.begin();
1903 std::set<StateSet>::iterator sccit_end = rSccSet.end();
1904 for ( int i=0; sccit != sccit_end; ++sccit, i++) {
1905 FD_DF( "SccEntries: SCC " << i << " begin:");
1907 StateSet::Iterator sit = sccit->Begin();
1908 StateSet::Iterator sit_end = sccit->End();
1909 for (; sit != sit_end; ++sit) {
1912 rEntryStates. Insert(*sit);
1917 for(;tit!=tit_end;tit++) {
1921 if(!sccit->Exists(tit->X1)) {
1923 rEntryTransSet. Insert(*tit);
1925 if(!rEntryStates. Exists(*sit)) {
1929 FD_DF( "SccEntries: Entry state:" <<*sit);
1930 rEntryStates. Insert(*sit);
1935 FD_DF( "SccEntries: SCC " << i << " end:");
1937 FD_DF( "SccEntries: done");
1944 std::set<StateSet>& rSccSet,
1945 const Idx EntryState,
1949 FD_DF( "CloneScc(...)");
1951 std::map<const Idx, Idx> clone;
1955 StateSet::Iterator sit=rScc. Begin();
1956 StateSet::Iterator sit_end=rScc. End();
1957 for(;sit!=sit_end;sit++) {
1975 for(;sit!=sit_end;sit++) {
1978 for(;tit!=tit_end;tit++) {
1980 if(rScc. Exists(tit->X2)) {
1989 if(rEntryStates. Exists(tit->X2)) {
1990 rEntryTransSet. Insert(clone[*sit],tit->Ev,tit->X2);
1997 TransSet TransToClear, EntryTransToInsert;
2000 for(;tit!=tit_end;tit++) {
2005 EntryTransToInsert. Insert(tit->X1,tit->Ev,clone[EntryState]);
2007 TransToClear. Insert(*tit);
2012 for(;tit2!=tit2_end;tit2++) {
2015 rEntryTransSet. Erase(*tit2);
2020 for(;tit3!=tit3_end;tit3++) {
2022 rEntryTransSet. Insert(*tit3);
2025 rEntryStates. Erase(EntryState);
2026 rEntryStates. Insert(clone[EntryState]);
2033 const Idx EntryState,
2037 FD_DF( "CloneUnMarkedScc(...)");
2039 std::map<const Idx, Idx> clone;
2043 StateSet::Iterator sit=rScc. Begin();
2044 StateSet::Iterator sit_end=rScc. End();
2045 for(;sit!=sit_end;sit++) {
2046 if(*sit != EntryState) {
2050 else clone[*sit]=*sit;
2062 bool isEntryState= false;
2064 for(;sit!=sit_end;sit++) {
2065 isEntryState=(*sit==EntryState);
2068 for(;tit!=tit_end;tit++) {
2070 if(rScc. Exists(tit->X2)) {
2075 TransToClear. Insert(*tit);
2084 if(rEntryStates. Exists(tit->X2)) {
2085 rEntryTransSet. Insert(clone[*sit],tit->Ev,tit->X2);
2093 tit=TransToClear. Begin();
2094 tit_end=TransToClear. End();
2095 for(;tit!=tit_end;tit++) {
2110 FD_DF( "YcAcyclic: Statesize before: "<<rGen. Size()<< " - starting...");
2112 std::set<StateSet> SccSet,UnMarkedSccSet;
2114 StateSet Scc,Roots,EntryStates,notRoots,UnMarkedRoots;
2127 if(! YclessScc(rResGen,rYc,SccSet,Roots)) {
2132 FD_DF( "YcAcyclic: Statesize of result: "<<rResGen. Size());
2148 SccEntries(rResGen,SccSet,EntryStates,EntryTransSet);
2152 notRoots=EntryStates - Roots;
2161 StateSet::Iterator sit=notRoots. Begin();
2162 StateSet::Iterator sit_end=notRoots. End();
2163 for(;sit!=sit_end;sit++)
2166 std::set<StateSet>::iterator sccit = SccSet.begin();
2167 std::set<StateSet>::iterator sccit_end = SccSet.end();
2168 for (; sccit != sccit_end; ++sccit)
2170 if(sccit->Exists(*sit))
2179 CloneScc(rResGen,Scc,SccSet,*sit,EntryStates,EntryTransSet);
2198 std::set<StateSet>::iterator sccit = UnMarkedSccSet.begin();
2199 std::set<StateSet>::iterator sccit_end = UnMarkedSccSet.end();
2200 for (; sccit != sccit_end; ++sccit) {
2202 if( !( ((*sccit)*EntryStates).Empty() ) ) {
2203 Idx EntryState=*(((*sccit)*EntryStates).Begin());
2217 std::set<StateSet>::iterator sccit = SccSet.begin();
2218 std::set<StateSet>::iterator sccit_end = SccSet.end();
2220 for (; sccit != sccit_end; ++sccit)
2223 StateSet::Iterator sit = sccit-> Begin();
2224 StateSet::Iterator sit_end = sccit->End();
2225 for (; sit != sit_end; ++sit)
2231 for(;tit!=tit_end;tit++)
2235 if(sccit->Exists(tit->X2) && EntryStates. Exists(tit->X2)
2239 TransToClear. Insert(*tit);
2248 for(;tit!=tit_end;tit++)
2289 FD_DF( "ConstrSynth_Beta(...)");
2296 rOpConstraint. Clear();
2299 Parallel(rPlant,rLocConstr,rOpConstraint);
2303 rOpConstraint. Clear();
2311 Project(rOpConstraint,sigmap,tmpGen);
2312 rOpConstraint. Clear();
2322 HioFreeInput(tmpGen, rYp, rUp, rOpConstraint, "errUp", "errYp");
2324 rOpConstraint. Name( "ConstrSynth_Beta("+rPlant. Name()+ ")");
2343 FD_DF( "HioSynth(...)");
2345 rController. Clear();
2353 sigmacp. InsertSet(rUc + rYc + rUp + rYp);
2355 sigmace. InsertSet(rUc + rYc + rUel + rYel);
2377 minhio = HioSortCL(rYc,rUc,rYp,rUp,rYel,rUel);
2392 FD_DF( "Size of plantspec: "<<plantspec. Size()<< " - Statemin...");
2394 FD_DF( "done. New Statesize: "<<plantspec. Size()<< ".");
2397 FD_DF( "******************** computing YcAcyclic(plantspec):");
2401 YcAcyclic(plantspec,rYc,yclifeplantspec);
2407 Parallel(yclifeplantspec,minhio,plantspec);
2408 yclifeplantspec. Clear();
2410 Parallel(plantspec,rLocConstr,plantspec);
2412 plantspec. Name( "actualspec");
2423 FD_DF( "size of closed loop before StateMin: "<<loop. Size()<< ", starting StateMin...");
2425 FD_DF( "...size of closed loop after StateMin (tmp_closedloop.gen): "<<loop. Size());
2429 FD_DF( "********* IsYcLive(closed loop): "<< IsYcLive(loop,rYc));
2433 FD_DF( "******************** external closed loop: tmp_extloop.gen");
2435 Project(loop,sigmace,extloop);
2436 FD_DF( "size of external closed loop: "<<extloop. Size());
2450 FD_DF( "******************** project closed loop: tmp_controller.gen");
2453 Project(loop,sigmacp,controller);
2459 HioFreeInput(controller, rYp, rUp, rController, "errUp", "errYp");
2461 FD_DF( "size of marked IO controller: "<<rController. Size()<< ". PrefixClosure, StateMin...");
2467 FD_WARN( "Careful: marking information of the specification has been erased from the resulting controller.");
2471 FD_DF( "...size of prefix-closed IO controller after StateMin: "<<rController. Size());
2473 rController. Name( "HioSynth("+rPlant. Name()+ ","+rSpec. Name()+ ")");
2474 FD_DF( "IO controller synthesis done. ******************** " );
2492 rController. Clear();
2494 #ifdef FAUDES_CHECKED
2497 std::stringstream errstr;
2498 errstr << "Empty Yc alphabet\n";
2499 throw Exception( "HioSynth", errstr.str(), 0);
2502 std::stringstream errstr;
2503 errstr << "Empty Uc alphabet\n";
2504 throw Exception( "HioSynth", errstr.str(), 0);
2507 std::stringstream errstr;
2508 errstr << "Empty Yp alphabet\n";
2509 throw Exception( "HioSynth", errstr.str(), 0);
2512 std::stringstream errstr;
2513 errstr << "Empty Up alphabet\n";
2514 throw Exception( "HioSynth", errstr.str(), 0);
2517 std::stringstream errstr;
2518 errstr << "Empty Ye alphabet\n";
2519 throw Exception( "HioSynth", errstr.str(), 0);
2522 std::stringstream errstr;
2523 errstr << "Empty Ue alphabet\n";
2524 throw Exception( "HioSynth", errstr.str(), 0);
2532 EventSet::Iterator evit;
2534 for (evit = rUc. Begin(); evit != rUc. End(); ++evit) {
2538 for (evit = rYp. Begin(); evit != rYp. End(); ++evit) {
2542 for (evit = rUp. Begin(); evit != rUp. End(); ++evit) {
2546 for (evit = rYel. Begin(); evit != rYel. End(); ++evit) {
2550 for (evit = rUel. Begin(); evit != rUel. End(); ++evit) {
2554 if (!errevents. Empty()){
2555 std::stringstream errstr;
2556 errstr << "Non-disjoint parameters; ambiguous events:\n" <<errevents. ToString();
2557 throw Exception( "HioSynth", errstr.str(), 0);
2564 if (!(plantEvents*specEvents==rYel+rUel)){
2565 std::stringstream errstr;
2566 errstr << "Alphabet mismatch between plant and spec:\n";
2567 errstr << "plant: " << plantEvents. ToString() << "\n";
2568 errstr << "spec: " << specEvents. ToString() << "\n";
2569 errstr << "Yel+Uel: " << (rYel+rUel).ToString() << "\n";
2570 throw Exception( "HioSynth", errstr.str(), 0);
2573 if (!(rExtConstr. Alphabet()<=specEvents)){
2574 std::stringstream errstr;
2575 errstr << "Alphabet mismatch between external constraints and spec.\n";
2576 throw Exception( "HioSynth", errstr.str(), 0);
2579 if (!(rLocConstr. Alphabet()<=plantEvents)){
2580 std::stringstream errstr;
2581 errstr << "Alphabet mismatch between internal constraints and plant.\n";
2582 throw Exception( "HioSynth", errstr.str(), 0);
2586 HioPlant spec(rSpec,rYc,rUc,rYel,rUel);
2589 std::stringstream errstr;
2590 errstr << "Spec not in HioPlantForm:\n" << report;
2591 throw Exception( "HioSynth", errstr.str(), 0);
2597 HioSynthUnchecked(rPlant,rSpec,rExtConstr,rLocConstr,rYc,rUc,rYp,rUp,rYel,rUel,rController);
2609 rController. Clear();
2611 #ifdef FAUDES_CHECKED
2617 std::stringstream errstr;
2618 errstr << "Plant not in HioPlantForm:\n" << report;
2619 throw Exception( "HioSynthMonolithic", errstr.str(), 0);
2639 HioSynth(rPlant,rSpec,extConstr,rSp,yc,uc,yp,up,ye,ue,rController);
2642 rController. SetYc(yc);
2643 rController. SetUc(uc);
2644 rController. SetYp(yp);
2645 rController. SetUp(up);
2659 rController. Clear();
2661 #ifdef FAUDES_CHECKED
2667 std::stringstream errstr;
2668 errstr << "HioShuffle not in HioPlantForm:\n" << report;
2669 throw Exception( "HioSynthHierarchical", errstr.str(), 0);
2678 std::stringstream errstr;
2679 errstr << "Environment not in HioEnvironmentForm:\n" << report;
2680 throw Exception( "HioSynthHierarchical", errstr.str(), 0);
2687 std::stringstream errstr;
2688 errstr << "Alphabet mismatch between I/O-shuffle and environment.\n";
2689 throw Exception( "HioSynthHierarchical", errstr.str(), 0);
2693 std::stringstream errstr;
2694 errstr << "Alphabet mismatch between specification and environment.\n";
2695 throw Exception( "HioSynthHierarchical", errstr.str(), 0);
2703 Parallel(rHioShuffle,rEnvironment,ioShuffParEnv);
2719 HioSynth(ioShuffParEnv,rSpec,extConstr,rIntConstr,yc,uc,yp,up,ye,ue,rController);
2722 rController. SetYc(yc);
2723 rController. SetUc(uc);
2724 rController. SetYp(yp);
2725 rController. SetUp(up);
2742 FD_DF( "HioShuffle()_Musunoi");
2745 EventSet A,B,SigmaP, Yp, Up, Ye, Ue;
2756 Parallel(rPlantA,rPlantB,parallel1);
2762 Idx state1,state2,state3;
2767 EventSet::Iterator evit;
2768 for (evit = A. Begin(); evit != A. End(); ++evit) {
2772 for (evit = B. Begin(); evit != B. End(); ++evit) {
2776 Parallel(parallel1,EventPairs,parallel2);
2811 Parallel(parallel2, AltAB, parallel1);
2823 StateSet::Iterator sit_end = parallel1. StatesEnd();
2825 for(; sit != sit_end; sit++)
2835 if (!(ActiveYe. Empty())&& !(ActiveYp. Empty()))
2840 for(;tit!=tit_end;tit++)
2843 if(ActiveYp. Exists(tit->Ev))
2845 TransToClear. Insert(*tit);
2848 tit=TransToClear. Begin();
2849 tit_end=TransToClear. End();
2850 for(;tit!=tit_end;tit++)
2865 HioFreeInput(parallel1, Up, Yp, parallel2, "errYp_Ye", "errUp");
2868 HioFreeInput(parallel2, Ue, Ye, parallel1, "errYp_Ye", "errUe");
2871 rIOShuffAB = parallel1;
2892 locconstr = rLocConstr;
2904 sigmacp. InsertSet(rUc + rYc + rUp + rYp);
2906 sigmace. InsertSet(rUc + rYc + rUe + rYe);
2920 FD_DF( "******************** actual plant: composition with environment constraint: tmp_cplant.gen ");
2927 FD_DF( "******************** mininmal hio structure: tmp_minhio.gen, composition with plant: tmp_hioplant.gen ");
2937 FD_DF( "******************** composition plant-specification: tmp_plantspec.gen ");
2941 Parallel(hiocplant,spec,plantspec);
2945 FD_DF( "Size of plantspec: "<<plantspec. Size()<< " - Statemin...");
2949 FD_DF( "done. New Statesize: "<<plantspecMin. Size()<< ".");
2950 plantspec=plantspecMin;
2951 plantspecMin. Clear();
2953 FD_DF( "******************** computing YcAcyclic(plantspec):");
2957 YcAcyclic(plantspec,yc,yclifeplantspec);
2962 yclifeplantspecMin=yclifeplantspec;
2966 FD_DF( "******************** actual spec: composition yclifeplantspec||minhio||locconstr (tmp_actualspec.gen)");
2968 Parallel(yclifeplantspecMin,minhio,plantspec);
2972 Parallel(plantspec,locconstr,actualspec);
2975 FD_DF( "******************** closed loop synthesis: tmp_closedloop.gen/.dot");
2978 FD_DF( "Starting NormalCompleteSynth....");
2986 FD_DF( "size of closed loop before StateMin: "<<loop. Size()<< ", starting StateMin...");
2989 FD_DF( "Starting NormalCompleteSynth....done... starting StateMin");
2993 FD_DF( "...size of closed loop after StateMin (tmp_closedloop.gen): "<<minloop. Size());
2999 minlooptest=minloop;
3000 std::set<StateSet> SccSet;
3003 FD_DF( "*********number of Yc-less strongly connencted components in closed loop (should be zero): "
3009 FD_DF( "******************** external closed loop: tmp_extloop.gen/.dot");
3011 Project(minloop,sigmace,extloop);
3012 FD_DF( "size of external closed loop: "<<extloop. Size());;
3016 FD_DF( "External closed loop meets specification.");
3019 FD_DF( "External closed loop EQUALS specification.");
3026 FD_DF( "******************** project closed loop: tmp_controller.gen/.dot ");
3029 Project(minloop,sigmacp,controller);
3034 FD_DF( "******************** extend to IO controller: tmp_IOcontroller.gen/.dot ");
3043 FD_DF( "...size of IO controller after StateMin: "<<minIOcontroller. Size());
3048 rController = minIOcontroller;
3066 FD_DF( "IO controller synthesis done. ******************** " );
bool Exists(const Idx &rIndex) const
void SymbolicName(Idx index, const std::string &rName)
virtual void InsertSet(const NameSet &rOtherSet)
bool Insert(const Idx &rIndex)
void RestrictSet(const NameSet &rOtherSet)
EventSet UEvents(void) const
EventSet YEvents(void) const
EventSet YcEvents(void) const
EventSet UcEvents(void) const
EventSet YpEvents(void) const
THioController * New(void) const
EventSet UpEvents(void) const
EventSet UeEvents(void) const
EventSet YeEvents(void) const
EventSet LEvents(void) const
EventSet UlEvents(void) const
EventSet YlEvents(void) const
THioEnvironment * New(void) const
EventSet EEvents(void) const
EventSet EEvents(void) const
EventSet UeEvents(void) const
EventSet UpEvents(void) const
EventSet YpEvents(void) const
EventSet YeEvents(void) const
Iterator Begin(void) const
EventSet ActiveEvents(Idx x1, SymbolTable *pSymTab=NULL) const
Iterator BeginByX2(Idx x2) const
bool Insert(const Transition &rTransition)
Iterator EndByX2(Idx x2) const
bool Erase(const Transition &t)
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
virtual TaGenerator & Assign(const Type &rSrc)
virtual void Move(TaGenerator &rGen)
const TaEventSet< EventAttr > & Alphabet(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
StateSet::Iterator StatesBegin(void) const
StateSet::Iterator InitStatesBegin(void) const
const TransSet & TransRel(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
const StateSet & MarkedStates(void) const
const EventSet & Alphabet(void) const
virtual void Move(vGenerator &rGen)
bool InitStatesEmpty(void) const
EventSet ActiveEventSet(Idx x1) const
TransSet::Iterator TransRelBegin(void) const
void ClrTransition(Idx x1, Idx ev, Idx x2)
virtual vGenerator * New(void) const
void InjectMarkedStates(const StateSet &rNewMarkedStates)
Idx MarkedStatesSize(void) const
StateSet AccessibleSet(void) const
bool ExistsState(Idx index) const
std::string StateSetToString(const StateSet &rStateSet) const
void Name(const std::string &rName)
StateSet::Iterator StatesEnd(void) const
void DelStates(const StateSet &rDelStates)
TransSet::Iterator TransRelEnd(void) const
StateSet TerminalStates(void) const
void SetMarkedState(Idx index)
bool StateNamesEnabled(void) const
bool ExistsInitState(Idx index) const
bool ExistsMarkedState(Idx index) const
std::string UniqueStateName(const std::string &rName) const
const StateSet & States(void) const
void InjectAlphabet(const EventSet &rNewalphabet)
bool Exists(const T &rElem) const
Iterator Begin(void) const
virtual bool Erase(const T &rElem)
const std::string & Name(void) const
void StateMin(const Generator &rGen, Generator &rResGen)
bool LanguageInclusion(const Generator &rGen1, const Generator &rGen2)
void PrefixClosure(Generator &rGen)
bool LanguageEquality(const Generator &rGen1, const Generator &rGen2)
void LanguageIntersection(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void Project(const Generator &rGen, const EventSet &rProjectAlphabet, Generator &rResGen)
void Parallel(const Generator &rGen1, const Generator &rGen2, Generator &rResGen)
void InvProject(Generator &rGen, const EventSet &rProjectAlphabet)
void LanguageComplement(Generator &rGen, const EventSet &rAlphabet)
bool IsNormal(const Generator &rL, const EventSet &rOAlph, const Generator &rK)
void SupConClosed(const Generator &rPlantGen, const EventSet &rCAlph, const Generator &rSpecGen, Generator &rResGen)
void CheapAltAnB(const EventSet rAset, const EventSet rBset, const int Depth, Generator &rAltAnB)
void CloneScc(Generator &rGen, const StateSet &rScc, std::set< StateSet > &rSccSet, const Idx EntryState, StateSet &rEntryStates, TransSetX2EvX1 &rEntryTransSet)
void ConstrSynth_Beta(Generator &rPlant, const EventSet &rYp, const EventSet &rUp, const Generator &rLocConstr, Generator &rOpConstraint)
void MarkAlternationAB(const EventSet rAset, const EventSet rBset, Generator &rAltAB)
void HioSynthMonolithic(const HioPlant &rPlant, const HioPlant &rSpec, const HioConstraint &rSc, const HioConstraint &rSp, const HioConstraint &rSe, HioController &rController)
void SearchYclessScc(const Idx state, int &rcount, const Generator &rGen, const EventSet &rYc, const bool UnMarkedOnly, StateSet &rNewStates, std::stack< Idx > &rSTACK, StateSet &rStackStates, std::map< const Idx, int > &rDFN, std::map< const Idx, int > &rLOWLINK, std::set< StateSet > &rSccSet, StateSet &rRoots)
void HioFreeInput(const Generator &rGen, const EventSet &rInput, const EventSet &rOutput, Generator &rResGen, const std::string &rErrState1, const std::string &rErrState2, Idx &rErrState1Idx, Idx &rErrState2Idx)
void CheapAltAB(const EventSet rAset, const EventSet rBset, const int Depth, Generator &rAltAB)
void HioSynth(const Generator &rPlant, const Generator &rSpec, const Generator &rExtConstr, const Generator &rLocConstr, const EventSet &rYc, const EventSet &rUc, const EventSet &rYp, const EventSet &rUp, const EventSet &rYel, const EventSet &rUel, Generator &rController)
void WriteStateSets(const std::set< StateSet > &rStateSets)
Generator HioSortCL(const EventSet &rYc, const EventSet &rUc, const EventSet &rYp, const EventSet &rUp, const EventSet &rYe, const EventSet &rUe)
void SccEntries(const Generator &rGen, const std::set< StateSet > &rSccSet, StateSet &rEntryStates, TransSetX2EvX1 &rEntryTransSet)
bool YclessUnmarkedScc(const Generator &rGen, const EventSet &rYc, std::set< StateSet > &rSccSet, StateSet &rRoots)
void YcAcyclic(const Generator &rGen, const EventSet &rYc, Generator &rResGen)
void CloneUnMarkedScc(Generator &rGen, const StateSet &rScc, const Idx EntryState, const StateSet &rEntryStates, TransSetX2EvX1 &rEntryTransSet)
void HioShuffleUnchecked(const Generator &rPlantA, const Generator &rPlantB, const EventSet &rYp, const EventSet &rUp, const EventSet &rYe, const EventSet &rUe, Generator &rIOShuffAB)
void HioSynthUnchecked(const Generator &rPlant, const Generator &rSpec, const Generator &rExtConstr, const Generator &rLocConstr, const EventSet &rYc, const EventSet &rUc, const EventSet &rYp, const EventSet &rUp, const EventSet &rYel, const EventSet &rUel, Generator &rController)
bool NormalCompleteSynthNB(Generator &rPlant, const EventSet &rCAlph, const EventSet &rOAlph, const Generator &rSpec, Generator &rClosedLoop)
void MarkHioShuffle(const Generator &rGen1, const Generator &rGen2, const std::map< std::pair< Idx, Idx >, Idx > &rMapOrigToResult, Generator &rShuffle)
bool IsYcLive(const Generator &rGen, const EventSet &rYc)
bool NormalCompleteSynth(Generator &rPlant, const EventSet &rCAlph, const EventSet &rOAlph, const Generator &rSpec, Generator &rClosedLoop)
void HioSynthHierarchical(const HioPlant &rHioShuffle, const HioEnvironment &rEnvironment, const HioPlant &rSpec, const Generator &rIntConstr, const HioConstraint &rSc, const HioConstraint &rSl, HioController &rController)
bool CompleteSynth(const Generator &rPlant, const EventSet rCAlph, const Generator &rSpec, Generator &rClosedLoop)
bool YclessScc(const Generator &rGen, const EventSet &rYc, std::set< StateSet > &rSccSet, StateSet &rRoots)
void HioShuffle(const Generator &rPlantA, const Generator &rPlantB, const EventSet &rYp, const EventSet &rUp, const EventSet &rYe, const EventSet &rUe, Generator &rIOShuffAB)
void HioShuffleTU(const Generator &rPlantA, const Generator &rPlantB, const EventSet &rUp, const EventSet &rYp, const EventSet &rYe, const EventSet &rUe, const int Depth, Generator &rIOShuffAB)
static int report(lua_State *L, int status)
THioController< AttributeVoid, HioStateFlags, HioEventFlags, AttributeVoid > HioController
void NormalityConsistencyCheck(const Generator &rL, const EventSet &rOAlph, const Generator &rK)
bool IsHioEnvironmentForm(HioEnvironment &rHioEnvironment, StateSet &rQYe, StateSet &rQUe, StateSet &rQUl, StateSet &rQYlUe, EventSet &rErrEvSet, TransSet &rErrTrSet, StateSet &rErrStSet, std::string &rReportStr)
bool IsHioControllerForm(HioController &rHioController, StateSet &rQUc, StateSet &rQYP, StateSet &rQUp, StateSet &rQYcUp, EventSet &rErrEvSet, TransSet &rErrTrSet, StateSet &rErrStSet, std::string &rReportStr)
THioPlant< AttributeVoid, HioStateFlags, HioEventFlags, AttributeVoid > HioPlant
void HioSynth_Musunoi(const Generator &rPlant, const HioPlant &rSpec, const Generator &rConstr, const Generator &rLocConstr, const EventSet &rYp, const EventSet &rUp, Generator &rController)
std::string ToStringInteger(Int number)
bool IsHioPlantForm(HioPlant &rHioPlant, StateSet &rQYpYe, StateSet &rQUp, StateSet &rQUe, EventSet &rErrEvSet, TransSet &rErrTrSet, StateSet &rErrStSet, std::string &rReportStr)
void HioShuffle_Musunoi(const HioPlant &rPlantA, const HioPlant &rPlantB, int depth, Generator &rIOShuffAB)
bool SupNormSP(Generator &rL, const EventSet &rOAlph, const Generator &rK, Generator &rResult)
libFAUDES 2.33c
--- 2025.05.15
--- c++ api documentaion by doxygen
|