|
Go to the documentation of this file.
84 std::map<Idx,Idx>& rMapEventsToPlant,
205 std::map<Idx,Idx>& rMapStateToPartition,
242 std::map<Idx,Idx>& rMapStateToPartition,
244 std::map< Idx,std::vector<Idx> >& rMapOldToNew);
263 void Splitter( const std::map< Idx, std::vector<Idx> >& rMapOldToNew,
266 std::map<Idx,Idx>& rMapEventsToPlant,
321 std::map<Idx,Idx>& rMapEventsToPlant,
341 EventSet::Iterator eit=GAlph. Begin();
342 for(; eit!=GAlph. End(); ++eit) rMapEventsToPlant[*eit]=*eit;
350 for(; pos < rPlantGenVec. Size(); ++pos) {
357 for(; pos < rSpecGenVec. Size(); ++pos)
395 std::map<Idx,Idx> MapStateToPartition;
399 std::map<Idx,std::vector<Idx> > MapOldToNew;
423 if(AbstGen. Size() == 1) {
440 std::stringstream str_dis;
474 std::map<Idx,Idx> MapStateToPartition;
478 std::map<Idx,std::vector<Idx> > MapOldToNew;
547 std::stringstream str_dis;
548 str_dis<< " Distinguisher from "<<HSupGen. Name();
549 HSupGen. Name(str_dis.str());
581 for(; i < rGenVec. Size(); ++i)
592 std::map<faudes::Idx,faudes::Idx> MapStateToPartition;
616 if(UncAlph. Empty()) return;
626 for(; sit != rResGen. StatesEnd(); ++sit){
631 EventSet::Iterator eit=todo. Begin();
632 for(; eit != todo. End(); ++eit) toadd. Insert(*sit, *eit, temp);
636 if(toadd. Empty()) return;
642 for(; tit != toadd. End(); ++tit)
658 for(; i < rSpecGenVec. Size(); ++i) {
662 rResGenVec. Append(NewGen);
679 for(EventSet::Iterator eit = toinspect. Begin(); eit != toinspect. End(); ++eit){
682 std::vector<GeneratorVector::Position> PsubGens;
684 if(rGenVec. At(i).ExistsEvent(*eit))
685 PsubGens.push_back(i);
693 for(std::vector<GeneratorVector::Position>::iterator vit = PsubGens.begin(); vit != PsubGens.end(); ++vit){
694 for( TransSet::Iterator tit = rGenVec. At(*vit).TransRelBegin(); tit != rGenVec. At(*vit).TransRelEnd(); ++tit){
695 if((*eit == tit->Ev) && (tit->X1 != tit->X2)){
707 for(std::vector<GeneratorVector::Position>::iterator vit = PsubGens.begin(); vit != PsubGens.end(); ++vit){
709 if((*eit == tit->Ev) && (tit->X1 == tit->X2))
710 rGenVec. At(*vit).ClrTransition(tit++);
714 rGenVec. At(*vit).MinimizeAlphabet();
732 EventSet::Iterator eit = rLocAlph. Begin();
733 for(; eit != rLocAlph. End(); ++eit) {
734 bool IsSelfloop = true;
737 for(; tit != InvTransSet. EndByEv(*eit); ++tit)
739 if(tit->X1 != tit->X2) {IsSelfloop = false; break;}
754 std::map<Idx,Idx>& rMapStateToPartition,
756 std::map< Idx,std::vector<Idx> >& rMapOldToNew) {
759 rMapOldToNew.clear();
762 std::vector<std::vector<TransSet::Iterator> > NonDet;
763 std::vector<Idx> OrigStates;
768 for(tit2 = tit1++; tit1 != AbstGen. TransRelEnd(); tit2 = tit1++) {
769 if((tit2->X1 == tit1->X1) && (tit2->Ev == tit1->Ev)) {
770 std::vector<TransSet::Iterator> nondet;
771 nondet.push_back(tit2);
772 nondet.push_back(tit1);
773 NonDet.push_back(nondet);
778 std::string new_1_name;
779 std::string new_2_name;
782 std::vector<std::vector<TransSet::Iterator> >::iterator vvit=NonDet.begin();
783 for(; vvit != NonDet.end(); ++vvit) {
785 oldev = AbstGen. EventName((*vvit)[0]->Ev);
788 new_1_name = oldev + "_1_";
789 new_2_name = oldev + "_2_";
796 if(rMapOldToNew.find((*vvit)[0]->Ev) == rMapOldToNew.end()) {
797 rMapOldToNew[(*vvit)[0]->Ev].push_back(new1);
798 rMapOldToNew[(*vvit)[0]->Ev].push_back(new2);
807 std::map<Idx,Idx>::iterator mitSt = rMapStateToPartition.begin();
808 for(; mitSt != rMapStateToPartition.end(); ++mitSt)
809 if(mitSt->second == (*vvit)[0]->X1) OrigStates.push_back(mitSt->first);
812 std::vector<Idx>::iterator vit = OrigStates.begin();
813 for(; vit != OrigStates.end(); ++vit) {
819 if(rMapStateToPartition[tit->X2] == (*vvit)[0]->X2) {
823 if(rMapStateToPartition[tit->X2] == (*vvit)[1]->X2) {
858 const std::vector<Idx>& kids) {
862 std::vector<Idx>::const_iterator vit = kids.begin();
863 for(; vit != kids.end(); ++vit)
872 for(; tit != tit_end; ++tit) {
880 std::vector<Idx>::const_iterator vit = kids.begin();
881 for(; vit != kids.end(); ++vit) {
885 std::cout << "in Function Splitter(): ";
886 std::cout << "the SetTransition in rGenVec is failed\n";
898 void Splitter( const std::map< Idx, std::vector<Idx> >& rMapOldToNew,
901 std::map<Idx,Idx>& rMapEventsToPlant,
907 std::map<Idx, std::vector<Idx> >::const_iterator nemit = rMapOldToNew.begin();
908 for(; nemit != rMapOldToNew.end(); ++nemit) {
911 Idx parent = nemit->first;
912 const std::vector<Idx>& kids = nemit->second;
918 if(rConAlph. Exists(parent)) {
920 rConAlph. Erase(parent);
922 std::vector<Idx>::const_iterator vit = kids.begin();
923 for(; vit != kids.end(); ++vit) rConAlph. Insert(*vit);
931 rMapEventsToPlant.erase(rMapEventsToPlant.find(parent));
933 std::vector<Idx>::const_iterator vit = kids.begin();
934 for(; vit != kids.end(); ++vit)
935 rMapEventsToPlant.insert(std::make_pair(*vit, parent));
942 for(; i < rGenVec. Size(); ++i)
943 if(rGenVec. At(i).ExistsEvent(parent)) SplittGen(rGenVec. At(i), parent, kids);
950 for(; i < rSupGenVec. Size(); ++i)
951 if(rSupGenVec. At(i).ExistsEvent(parent)) SplittGen(rSupGenVec. At(i), parent, kids);
958 for(; i < rDisGenVec. Size(); ++i)
959 if(rDisGenVec. At(i).ExistsEvent(parent)) SplittGen(rDisGenVec. At(i), parent, kids);
986 bool operator()( const std::vector<GeneratorVector::Position> rPosVec1,
987 const std::vector<GeneratorVector::Position> rPosVec2) {
991 std::vector<GeneratorVector::Position>::const_iterator vit1;
992 vit1 = rPosVec1.begin();
998 std::vector<GeneratorVector::Position>::const_iterator vit2;
999 vit2 = rPosVec2.begin();
1013 bool BiggerMax(std::vector<GeneratorVector::Position>& rCandidate,
1022 gen=rGenVec. At(rCandidate[0]);
1023 std::vector<GeneratorVector::Position>::iterator vit=rCandidate.begin();
1024 for(std::advance(vit,1);vit!=rCandidate.end();++vit) {
1026 if(gen. Size()>Max) return true;
1036 if(rGenVec. Size() == 2) {
1047 std::vector<GeneratorVector::Position> Candidate;
1048 std::vector<std::vector<GeneratorVector::Position> > Candidates;
1049 Candidates.reserve(GAlph. Size());
1052 EventSet::Iterator eit = GAlph. Begin();
1053 for(; eit != GAlph. End(); ++eit) {
1056 for(; i < rGenVec. Size(); ++i)
1057 if(rGenVec. At(i).ExistsEvent(*eit)) Candidate.push_back(i);
1058 if(Candidate.size() == 1) continue;
1060 if( BiggerMax(Candidate, rGenVec)) continue;
1061 Candidates.push_back(Candidate);
1070 std::vector<std::vector<GeneratorVector::Position> >::iterator PosTarget;
1071 PosTarget = std::min_element(Candidates.begin(), Candidates.end(),
1076 rResGen. Assign(rGenVec. At(PosTarget->at(0)));
1077 std::vector<GeneratorVector::Position>::iterator vit=PosTarget->begin();
1078 for(std::advance(vit,1); vit!=PosTarget->end();++vit)
1079 Parallel(rResGen, rGenVec. At(*vit), rResGen);
1083 vit = PosTarget->begin();
1084 for(; vit != PosTarget->end(); ++vit) {
1085 rGenVec. Erase(*vit-x);
1107 if(rGenVec. Size() == 2) {
1114 std::vector<GeneratorVector::Position> candidate;
1115 std::vector<std::vector<GeneratorVector::Position> > candidates;
1123 for(; i < rGenVec. Size()-1; ++i) {
1125 const EventSet& alph1 = rGenVec. At(i).Alphabet();
1130 maxsize = alph. Size();
1133 for(; j < rGenVec. Size(); ++j) {
1137 if(alph. Size() > maxsize) {pos = j; maxsize = alph. Size();}
1138 else if(alph. Size() == maxsize) {
1145 if(g_j. Size() < g_pos. Size()) {pos = j; maxsize = alph. Size();}
1151 candidate.push_back(i);
1152 candidate.push_back(pos);
1153 candidates.push_back(candidate);
1157 std::vector<std::vector<GeneratorVector::Position> >::iterator PosTarget;
1158 PosTarget = std::min_element(candidates.begin(), candidates.end(),
1162 Parallel(rGenVec. At(PosTarget->at(0)), rGenVec. At(PosTarget->at(1)), rResGen);
1165 rGenVec. Erase(PosTarget->at(0));
1166 rGenVec. Erase(PosTarget->at(1)-1);
1191 std::stack<Idx> todo;
1192 StateSet::Iterator sit;
1193 for(sit = rBlockingstates. Begin(); sit != rBlockingstates. End(); ++sit){
1197 rBlockingstates. Clear();
1204 while(!todo.empty()){
1209 if(rBlockingstates. Exists(x2)) continue;
1210 rBlockingstates. Insert(x2);
1214 for(; tit_end != tit; ++tit){
1215 if(rLouc. Exists(tit->Ev))
1217 else if(rShuc. Exists(tit->Ev))
1218 rToredirect. Insert(*tit);
1231 rHSupGen. Assign(rOrigGen);
1239 isneed = !blockingstates. Empty();
1265 while(!blockingstates. Empty()){
1267 H_tocollect(blockingstates, itrel, louc, shuc, toredirect);
1276 if(!toredirect. Empty()) {
1282 for(; tit != tit_end; ++tit) {
1307 for(; i < rPlantGenVec. Size(); ++i)
1308 if(!rPlantGenVec. At(i).IsDeterministic()) {
1309 std::stringstream errstr;
1310 errstr<< "Plant:"<<rPlantGenVec. At(i).Name()<< " is nondeterministic\n";
1311 throw Exception( "Zhou::ParameterCheck", errstr.str(), 900);
1315 for(; i < rSpecGenVec. Size(); ++i)
1316 if(!rSpecGenVec. At(i).IsDeterministic()) {
1317 std::stringstream errstr;
1318 errstr<< "Spec:"<<rSpecGenVec. At(i).Name()<< " is nondeterministic\n";
1319 throw Exception( "Zhou::ParameterCheck", errstr.str(), 901);
1324 for(; i < rPlantGenVec. Size(); ++i) {
1325 const StateSet& stateset = rPlantGenVec. At(i).MarkedStates();
1326 if(stateset. Empty()) {
1327 std::stringstream errstr;
1328 errstr<< "Plant:"<<rPlantGenVec. At(i).Name()<< " hat no marked states\n";
1329 throw Exception( "Zhou::ParameterCheck", errstr.str(), 910);
1334 for(; i < rSpecGenVec. Size(); ++i) {
1335 const StateSet& stateset = rSpecGenVec. At(i).MarkedStates();
1336 if(stateset. Empty()) {
1337 std::stringstream errstr;
1338 errstr<< "Spec:"<<rSpecGenVec. At(i).Name()<< " hat no marked states\n";
1339 throw Exception( "Zhou::ParameterCheck", errstr.str(), 911);
1351 EventSet::Iterator eit = rConAlph. Begin();
1352 for(; eit != rConAlph. End(); ++eit)
1353 if(!GAlph. Exists(*eit)) {
1354 std::stringstream errstr;
1355 errstr<< "event:"<<rConAlph. SymbolicName(*eit)<< " is not included in generator\n";
1356 throw Exception( "Zhou::ParameterCheck", errstr.str(), 920);
1364 std::map<Idx,Idx>& rMapEventsToPlant,
1369 ComSyn comsyn = ComSyn(rPlantGenVec, rConAlph, rSpecGenVec,
1370 rMapEventsToPlant, rDisGenVec, rSupGenVec);
1382 std::map<Idx,Idx>& rMapEventsToPlant,
libFAUDES 2.28c
--- 2016.09.30
--- c++ api documentaion by doxygen
|