64 #include <Utils/Assertion.hh> 65 #include <Graph/Graph.hh> 66 #include <Graph/NodeMap.hh> 67 #include <Graph/EdgeMap.hh> 68 #include <AutModel/ObservableComponent.hh> 80 #define MAXDELAY 600 // max delay before exiting the process in second 92 int nbStateMin,
int nbStateMax,
93 int nbFaultMin,
int nbFaultMax,
94 int nbSharedMax,
int nbSharedMaxComp,
95 int nbObsMin,
int nbObsMax,
96 int nbNormalMin,
int nbNormalMax,
97 const Graph & topology,
98 const NodeMap<string> & compName,
99 const EdgeMap< set<long> > & sharedEvnt,
100 const vector<ObservableComponent *> & setOfComponents);
102 void generateLatexTopology(
const Graph & topology,
const NodeMap<string> & compName,
const EdgeMap< set<long> > & sharedEvnt, ofstream & latexfile);
105 int nbComp,
int connectivity,
106 int nbStateMin,
int nbStateMax,
107 int nbFaultMin,
int nbFaultMax,
108 int nbSharedMax,
int nbSharedMaxComp,
109 int nbObsMin,
int nbObsMax,
110 int nbNormalMin,
int nbNormalMax,ofstream & latexfile);
119 cerr <<
"TIMEOUT reached: Generation Aborted" << endl;
120 cerr <<
"Delete any files that would already be generated by this process" << endl;
128 memset(&
sa,0,
sizeof(
sa)) ;
130 sigaction(SIGALRM, &
sa, NULL);
131 timer.it_value.tv_sec = delay;
132 timer.it_value.tv_usec = 0;
134 timer.it_interval.tv_sec = 1;
135 timer.it_interval.tv_usec = 0;
136 setitimer(ITIMER_REAL, &
timer, NULL);
150 const EdgeMap< set<long> > & sharedEvnt,
long numberOfSharedEvents)
153 ofstream file(
"topology.dot");
155 file <<
"digraph G {" << endl;
156 file <<
"\tratio=fill;" << endl;
157 file <<
"\tpage=\"8.5,11.6\";" << endl;
158 file <<
"\tsize=\"7.5,10.5\";" << endl;
159 file <<
"\tlabel = \"State Number= ";
160 file << topology.numberOfNodes() <<
"\\n";
161 file <<
"Edge Number= " << topology.numberOfEdges() <<
"\\n";
162 file <<
"Number of shared events = " << numberOfSharedEvents <<
"\";" << endl;
167 stateIt!=topology.nodeEnd();
169 file <<
"\t" << *stateIt <<
"\t [label=\"" << compIds[*stateIt] <<
"\"];" << endl;
175 transIt!= topology.edgeEnd();
178 file <<
"\t" << transIt->source() <<
" -> " << transIt->target()
180 for(set<long>::const_iterator longIt = sharedEvnt[*transIt].begin();
181 longIt != sharedEvnt[*transIt].end();
184 file << *longIt <<
" ";
188 file <<
"\"];" << endl;
201 cout <<
"Usage: ObservableComponentGenerator " << endl;
202 cout <<
"\t[--comp nbComp]" << endl;
203 cout <<
"\t[--connectivity nbConn]" << endl;
204 cout <<
"\t[--sharedMax nbSharedMax]" << endl;
205 cout <<
"\t[--sharedMaxComp nbSharedMaxComp]" << endl;
206 cout <<
"\t[--stateMin nbStateMin]" << endl;
207 cout <<
"\t[--stateMax nbStateMax ]" << endl;
208 cout <<
"\t[--faultMin nbFaultMin ]" << endl;
209 cout <<
"\t[--faultMax nbFaultMax]" << endl;
210 cout <<
"\t[--obsMin nbObsMin]" << endl;
211 cout <<
"\t[--obsMax nbObsMax]" << endl;
212 cout <<
"\t[--normalMin nbNormalMin]" << endl;
213 cout <<
"\t[--normalMax nbNormalMax]" << endl << endl;
214 cout <<
"Generate a model which is a cluster of 'nbComp' components (default = 3) " << endl;
215 cout <<
"(every component communicates with every other component either directly " << endl;
216 cout <<
"or indirectly). Every component contains at least nbStateMin states " << endl;
217 cout <<
"(default = 2), nbFaultMin fault events (default = 1), " << endl;
218 cout <<
"nbObsMin observable events (default = 1) and " << endl;
219 cout <<
"nbNormalMin normals events (default = 0). Every component contains at most " << endl;
220 cout <<
"nbConn direct connections (default = 3), nbStateMax states (default = 4), " << endl;
221 cout <<
"nbFaultMax fault events (default = 2), nbSharedMax shared events (default = 2)," << endl;
222 cout <<
"nbSharedMaxComp shared events between two components (default = 3), " << endl;
223 cout <<
"nbObsMax observable events (default = 2) and nbNormalMax normals events (default = 1)." << endl;
224 cout <<
"The generated components are live (every state has at least an output transition). " << endl;
237 long range = upper - lower;
239 long j = lrint((
double) floor(((range + 1.0)*rand())/(RAND_MAX + 1.0)));
251 srand( (
unsigned)time( NULL ) );
260 cout <<
"Parameter error: " << parameter << endl;
261 cout <<
"Error: " << message << endl << endl;
282 Graph & topology, NodeMap<unsigned> & compIds)
284 list<Node> unsaturatedNodes;
285 unsigned currentComp = 0;
286 Node s1 = topology.newNode();
287 unsaturatedNodes.push_back(s1);
288 compIds[s1] = currentComp;
292 cout <<
"Creation of topology nodes:" << endl;
293 while(currentComp != nbComp)
296 Node s = topology.newNode();
297 compIds[s] = currentComp;
299 cout <<
"." << flush;
301 while(s.degree() == 0)
304 if(unsaturatedNodes.size() == 1)
311 topology.newEdge(s,unsaturatedNodes.front());
314 (unsaturatedNodes.front().degree() == connectivity)
316 (nbSharedMax == (unsaturatedNodes.front().inDeg()+1))
322 unsaturatedNodes.pop_front();
327 list<Node>::iterator it = unsaturatedNodes.begin();
328 while((it != unsaturatedNodes.end())
330 (s.degree() < connectivity)
332 (nbSharedMax > (s.inDeg() +1))
334 (unsaturatedNodes.size() > 1))
339 if(connected != 0 && (s.degree() < connectivity)
340 && (nbSharedMax > (s.inDeg() +1))
347 topology.newEdge(s,*it);
352 topology.newEdge(*it,s);
355 if((it->degree() == connectivity)
356 || (nbSharedMax == (it->inDeg() +1))
360 it = unsaturatedNodes.erase(it);
374 if((s.degree() < connectivity)
376 (nbSharedMax > (s.inDeg() + 1))
379 unsaturatedNodes.push_back(s);
400 Graph & topology, NodeMap<unsigned> & compIds)
403 set<Node> unsaturatedNodes;
404 unsigned currentComp = 0;
405 Node s1 = topology.newNode();
406 compIds[s1] = currentComp;
410 cout <<
"Creation of topology nodes:" << endl;
411 while(currentComp != nbComp)
413 Node s = topology.newNode();
414 compIds[s] = currentComp;
416 cout <<
"." << flush;
424 set<Node> saturatedNodes;
425 set<Node> reachables;
426 NodeMap<int> depth(topology);
427 reachables.insert(s1);
430 stateIt != topology.nodeEnd();
437 set<Node>::const_iterator reachIt = reachables.begin();
438 while(index < neighbour)
443 topology.newEdge(*reachIt,*stateIt);
444 if(reachIt->degree() == connectivity)
446 saturatedNodes.insert(*reachIt);
447 reachables.erase(reachIt);
449 if(stateIt->degree() < connectivity)
451 reachables.insert(*stateIt);
455 saturatedNodes.insert(*stateIt);
457 depth[*stateIt] = depth[*reachIt] + 1;
462 NodeMap<unsigned> connectivityOfNodes(topology);
466 stateIt != topology.nodeEnd();
470 if(connectivityOfNodes[*stateIt] == stateIt->degree())
472 saturatedNodes.insert(*stateIt);
476 unsaturatedNodes.insert(*stateIt);
483 stateIt != topology.nodeEnd();
486 if(saturatedNodes.find(*stateIt) == saturatedNodes.end())
488 unsaturatedNodes.erase(*stateIt);
489 set<Node> selectionNodes = unsaturatedNodes;
490 bool found = !selectionNodes.empty();
491 while(found && (stateIt->degree() < connectivityOfNodes[*stateIt]))
493 set<Node>::const_iterator it = selectionNodes.begin();
494 found = it != selectionNodes.end();
499 while(index != chosenIndex)
504 Node chosenNode = *it;
505 selectionNodes.erase(it);
506 if(depth[chosenNode] <= depth[*stateIt])
508 bool alreadyPresent =
false;
510 while((!alreadyPresent) && (outEdgeIt != chosenNode.outEdgeEnd()))
512 alreadyPresent = outEdgeIt->target() == *stateIt;
517 selectionNodes.erase(chosenNode);
521 topology.newEdge(chosenNode,*stateIt);
526 bool alreadyPresent =
false;
528 while((!alreadyPresent) && (outEdgeIt != stateIt->outEdgeEnd()))
530 alreadyPresent = outEdgeIt->target() == chosenNode;
535 selectionNodes.erase(chosenNode);
539 topology.newEdge(*stateIt,chosenNode);
542 if(chosenNode.degree() == connectivityOfNodes[chosenNode])
544 saturatedNodes.insert(chosenNode);
545 unsaturatedNodes.erase(chosenNode);
546 selectionNodes.erase(chosenNode);
553 ofstream file(
"topology2.dot");
555 file <<
"digraph G {" << endl;
556 file <<
"\tratio=fill;" << endl;
557 file <<
"\tpage=\"8.5,11.6\";" << endl;
558 file <<
"\tsize=\"7.5,10.5\";" << endl;
559 file <<
"\tlabel = \"Node Number= ";
560 file << topology.numberOfNodes() <<
"\\n";
561 file <<
"Edge Number= " << topology.numberOfEdges() <<
"\";" << endl;
566 stateIt!=topology.nodeEnd();
568 file <<
"\t" << *stateIt <<
"\t [label=\"\"];" << endl;
574 transIt!= topology.edgeEnd();
577 file <<
"\t" << transIt->source() <<
" -> " << transIt->target() <<
";" << endl;
589 EdgeMap< set<unsigned> > & sharedEvnt,
590 unsigned nbSharedMax,
unsigned nbSharedMaxComp)
606 EdgeMap< set<unsigned> > nbSharedFirstTry(topology);
622 selectedNodeIt != topology.nodeEnd();
625 unsigned nbEmitEvntMax = nbSharedMax;
627 inEdgeIt != selectedNodeIt->inEdgeEnd();
630 nbEmitEvntMax = nbEmitEvntMax -
631 (nbSharedFirstTry[*inEdgeIt].empty() ? 1 : nbSharedFirstTry[*inEdgeIt].size());
633 if(nbEmitEvntMax <= 0)
641 unsigned nbEmitEvntPerEdgeMax = nbEmitEvnt < nbSharedMaxComp ? nbEmitEvnt : nbSharedMaxComp;
644 outEdgeIt != selectedNodeIt->outEdgeEnd();
655 list<unsigned> selectedValues;
657 for(
unsigned index = 1; index <= nbEmitEvntForThisEdge; ++index)
661 set<unsigned> instances;
662 for(
unsigned instance = 0; instance < nbEmitEvnt; ++instance)
664 instances.insert(instance);
666 assertion(GraphInvalid, instances.size() >= selectedValues.size(),
667 "ObservableComponentGenerator: generateSharedEvent, there is a bug0 in the generation of shared events for a given edge of the topology");
669 for(list<unsigned>::const_iterator selectedIt = selectedValues.begin();
670 selectedIt != selectedValues.end();
674 assertion(GraphInvalid, !instances.empty(),
675 "ObservableComponentGenerator: generateSharedEvent, there is a bug1 in the generation of shared events for a given edge of the topology");
677 set<unsigned>::iterator instanceIt= instances.begin();
678 while(index != *selectedIt)
683 assertion(GraphInvalid, instanceIt != instances.end(),
684 "ObservableComponentGenerator: generateSharedEvent, there is a bug2 in the gerenration of shared events for a given edge of the topology");
686 nbSharedFirstTry[*outEdgeIt].insert(*instanceIt);
687 instances.erase(instanceIt);
699 selectedNodeIt != topology.nodeEnd();
706 inEdgeIt != selectedNodeIt->inEdgeEnd();
710 count = count + nbSharedFirstTry[*inEdgeIt].size();
712 set<unsigned> emittedEvents;
714 outEdgeIt != selectedNodeIt->outEdgeEnd();
718 for(set<unsigned>::const_iterator it = nbSharedFirstTry[*outEdgeIt].begin();
719 it != nbSharedFirstTry[*outEdgeIt].end();
723 emittedEvents.insert(*it);
726 count = count + emittedEvents.size();
727 if(count > nbSharedMax)
732 unsigned excess = count - nbSharedMax;
735 while((excess != 0) && (inEdgeIt != selectedNodeIt->inEdgeEnd()))
738 if(nbSharedFirstTry[*inEdgeIt].size() > 1)
740 nbSharedFirstTry[*inEdgeIt].erase(nbSharedFirstTry[*inEdgeIt].begin());
753 while(outEdgeIt != selectedNodeIt->outEdgeEnd())
756 nbSharedFirstTry[*outEdgeIt].clear();
757 nbSharedFirstTry[*outEdgeIt].insert(1);
764 unsigned generation = 0;
766 selectedNodeIt != topology.nodeEnd();
769 unsigned nbOfEmittedEvents = 0;
771 outEdgeIt != selectedNodeIt->outEdgeEnd();
775 for(set<unsigned>::const_iterator it = nbSharedFirstTry[*outEdgeIt].begin();
776 it != nbSharedFirstTry[*outEdgeIt].end();
779 sharedEvnt[*outEdgeIt].insert(generation+*it);
780 nbOfEmittedEvents = nbOfEmittedEvents > *it ? nbOfEmittedEvents : *it;
783 generation = generation + nbOfEmittedEvents + 1;
791 string appendInfo(
const string & label, vector<ObservableComponent *>::size_type index)
794 ostringstream stream(result);
795 stream << label << index;
807 const EdgeMap<string> & transEvent,
808 const set<string> & faultEvents,
809 const set<string> & normalEvents,
810 const set<string> & observableEvents,
811 const set<string> & sharedEvents)
814 string filename = name+
".lafmodel";
815 ofstream file(filename.c_str());
816 file << name << endl;
817 file << behav.numberOfNodes() << endl;
819 it != behav.nodeEnd();
826 file << faultEvents.size() << endl;
827 for(set<string>::const_iterator it = faultEvents.begin();
828 it != faultEvents.end();
834 file << endl << normalEvents.size() << endl;
835 for(set<string>::const_iterator it = normalEvents.begin();
836 it != normalEvents.end();
842 file << endl << sharedEvents.size() << endl;
843 for(set<string>::const_iterator it = sharedEvents.begin();
844 it != sharedEvents.end();
850 file << endl << observableEvents.size() << endl;
851 for(set<string>::const_iterator it = observableEvents.begin();
852 it != observableEvents.end();
858 file << endl << behav.numberOfEdges() << endl;
860 it != behav.edgeEnd();
864 file <<
appendInfo(name,it->source().id()) <<
" -> " 865 <<
appendInfo(name,it->target().id()) <<
" " << transEvent[*it] << endl;
874 void generateStates(ObservableComponent * newObservableComponent,
unsigned numberOfStates, set<Node> & unreachedStates,
875 vector<Node> & indexState)
878 indexState.resize(numberOfStates);
879 for(
unsigned i = 0; i < numberOfStates; ++i)
882 s << newObservableComponent->name() <<
"." << i;
883 indexState[i] = newObservableComponent->newState(s.str());
884 unreachedStates.insert(indexState[i]);
886 newObservableComponent->setInitial(*unreachedStates.begin());
900 unsigned numberOfTrans,
901 const vector<Event> & events,
903 const set<Event> & constrainedEvents,
904 const set<Event> & currentTriggerableConstrainedEvents,
905 set<Event> & newSelection,
906 set<Event> & unusedEvents)
909 require(GraphInvalid, numberOfUnusedEventPerState <= unusedEvents.size(),
910 "generateTriggerableEvents: impossible. BUG");
911 newSelection.clear();
914 while(index <= numberOfUnusedEventPerState )
918 set<Event>::iterator it = unusedEvents.begin();
920 while(counter != rankOfEvent)
926 if(constrainedEvents.find(*it) == constrainedEvents.end())
928 newSelection.insert(*it);
929 unusedEvents.erase(it);
934 if(currentTriggerableConstrainedEvents.find(*it) != currentTriggerableConstrainedEvents.end())
936 newSelection.insert(*it);
937 unusedEvents.erase(it);
942 assertion(GraphInvalid, newSelection.size() <= numberOfTrans,
"Bug with numberOfUnusedEventPerState");
944 while( ( newSelection.size() < numberOfTrans) )
948 if(constrainedEvents.find(events[indexOfEvent]) == constrainedEvents.end())
950 set<Event>::iterator it = unusedEvents.find(events[indexOfEvent]);
951 if (it != unusedEvents.end())
953 unusedEvents.erase(it);
955 newSelection.insert(events[indexOfEvent]);
959 if(currentTriggerableConstrainedEvents.find(events[indexOfEvent])
960 != currentTriggerableConstrainedEvents.end())
962 set<Event>::iterator it = unusedEvents.find(events[indexOfEvent]);
963 if (it != unusedEvents.end())
965 unusedEvents.erase(it);
967 newSelection.insert(events[indexOfEvent]);
975 ensure(GraphInvalid,!newSelection.empty(),
"generateTriggerableEvents: no possible events. Don't know whether it is a bug or the fact that there is no solution!! Try again with the same parameters");
985 State correspondingState,
986 NodeMap< set<State> > & stateMapping)
989 list< pair<State,State> > stack;
990 stack.push_back(make_pair(state, correspondingState));
992 while(!stack.empty())
995 State currentState = stack.back().first;
996 State currentCorrespondingState = stack.back().second;
999 while((!stop) && (outTransIt != currentCorrespondingState.outEdgeEnd()))
1002 Event currentEvent = localInteraction->getEvent(*outTransIt);
1006 while((!found) && (outTransIt2 != currentState.outEdgeEnd()))
1009 found = newObservableComponent->getEvent(*outTransIt2) == currentEvent;
1012 targetState = outTransIt2->target();
1019 if(stateMapping[targetState].find(outTransIt->target()) == stateMapping[targetState].end())
1021 stateMapping[targetState].insert(outTransIt->target());
1022 stack.push_back(make_pair(targetState,outTransIt->target()));
1046 const ObservableComponent * localInteraction,
1047 EdgeMap<int> & triggeredTransition,
1048 NodeMap< set<State> > & stateMapping,
1049 set<Event> & unusedEvents)
1052 list<Trans> unmatchedTransitions;
1053 for(ObservableComponent::TransIterator it = localInteraction->beginOfTrans();
1054 it != localInteraction->endOfTrans();
1058 if(triggeredTransition[*it] == 0)
1060 unmatchedTransitions.push_back(*it);
1064 while(!unmatchedTransitions.empty())
1067 Trans currentTrans = unmatchedTransitions.front();
1068 unmatchedTransitions.pop_front();
1071 list<State> potentialSourceStates;
1072 State possibleSource;
1073 State possibleTarget;
1075 ObservableComponent::StateIterator stateIt = newObservableComponent->beginOfStates();
1076 while(!stop && (stateIt != newObservableComponent->endOfStates()))
1078 if(stateMapping[*stateIt].find(currentTrans.source()) != stateMapping[*stateIt].end())
1080 potentialSourceStates.push_back(*stateIt);
1084 while(!found && (outTransIt != stateIt->outEdgeEnd()))
1087 found = newObservableComponent->getEvent(*outTransIt) == localInteraction->getEvent(currentTrans);
1090 possibleTarget = outTransIt->target();
1097 possibleSource = potentialSourceStates.back();
1105 triggeredTransition[currentTrans] = 1;
1106 if(stateMapping[possibleTarget].find(currentTrans.target()) == stateMapping[possibleTarget].end())
1108 stateMapping[possibleTarget].insert(currentTrans.target());
1110 currentTrans.target(),
1117 if(potentialSourceStates.empty())
1121 unmatchedTransitions.push_back(currentTrans);
1131 list<State>::const_iterator sourceIt = potentialSourceStates.begin();
1132 unsigned counter = 0;
1133 while(counter != indexSource)
1138 State source = *sourceIt;
1140 unsigned indexTarget =
generateRandomValue(0,newObservableComponent->numberOfStates() - 1);
1142 ObservableComponent::StateIterator targetIt = newObservableComponent->beginOfStates();
1143 while(counter != indexTarget)
1148 State target = *targetIt;
1150 Trans t = newObservableComponent->newTrans(source,target, localInteraction->getEvent(currentTrans));
1151 set<Event>::iterator unusedIt = unusedEvents.find(localInteraction->getEvent(currentTrans));
1152 if(unusedIt != unusedEvents.end())
1154 unusedEvents.erase(unusedIt);
1156 triggeredTransition[currentTrans] = 1;
1157 stateMapping[target].insert(currentTrans.target());
1161 currentTrans.target(),
1172 const ObservableComponent * localInteraction,
1173 unsigned numberOfStates,
1174 const vector<Event> & events,
1180 set<State> unreachedStates;
1181 vector<State> indexState;
1182 generateStates(newObservableComponent, numberOfStates, unreachedStates, indexState);
1196 set<Event> constrainedEvents;
1197 for(ObservableComponent::EventIterator it = localInteraction->beginOfEvents();
1198 it != localInteraction->endOfEvents();
1201 constrainedEvents.insert(*it);
1208 EdgeMap<int> triggeredTransition(localInteraction->behaviour());
1213 NodeMap< set<State> > stateMapping(newObservableComponent->behaviour());
1217 set<Event> unusedEvents;
1218 for(
unsigned index = 0; index < nbEvents; ++index)
1221 unusedEvents.insert(events[index]);
1228 list<State> stateToVisit;
1229 list<State> interactingStateToVisit;
1230 stateToVisit.push_back(*newObservableComponent->beginOfInitialStates());
1231 interactingStateToVisit.push_back(*localInteraction->beginOfInitialStates());
1232 unreachedStates.erase(*newObservableComponent->beginOfInitialStates());
1233 set<State> visitingOrVisitedStates;
1234 visitingOrVisitedStates.insert(*newObservableComponent->beginOfInitialStates());
1235 stateMapping[*newObservableComponent->beginOfInitialStates()].insert(*localInteraction->beginOfInitialStates());
1237 unsigned numberOfVisitedStates=0;
1240 while(!stateToVisit.empty())
1244 Node currentState = stateToVisit.front();
1245 stateToVisit.pop_front();
1249 State currentInteractingState = interactingStateToVisit.front();
1250 interactingStateToVisit.pop_front();
1251 set<Event> currentTriggerableConstrainedEvents;
1252 for(ObservableComponent::OutTransIterator it = localInteraction->beginOfOutTrans(currentInteractingState);
1253 it != localInteraction->endOfOutTrans(currentInteractingState);
1257 currentTriggerableConstrainedEvents.insert(localInteraction->getEvent(*it));
1267 unsigned numberOfTrans = 0;
1268 unsigned numberOfTriggerableEvents = nbEvents + currentTriggerableConstrainedEvents.size() - constrainedEvents.size();
1269 unsigned numberOfUnusedAndTriggerableEvents = unusedEvents.size();
1271 for(set<Event>::const_iterator it = unusedEvents.begin();
1272 it != unusedEvents.end();
1276 if((constrainedEvents.find(*it) != constrainedEvents.end())
1278 (currentTriggerableConstrainedEvents.find(*it) == currentTriggerableConstrainedEvents.end()))
1280 --numberOfUnusedAndTriggerableEvents;
1286 unsigned numberOfUnusedEventPerState = unusedEvents.size();
1287 if(unusedEvents.size() > 1)
1289 numberOfUnusedEventPerState =
1290 (unsigned) (ceil((
double) unusedEvents.size() / (double) (newObservableComponent->numberOfStates() - numberOfVisitedStates)));
1292 if (numberOfUnusedEventPerState > numberOfUnusedAndTriggerableEvents)
1294 numberOfUnusedEventPerState = numberOfUnusedAndTriggerableEvents;
1299 unsigned minimalNumberOfTrans = 0;
1300 if(numberOfUnusedEventPerState == 0)
1302 minimalNumberOfTrans = 1;
1306 minimalNumberOfTrans = numberOfUnusedEventPerState;
1313 set<Event> newSelection;
1326 currentTriggerableConstrainedEvents,
1336 State unreachedState;
1337 int numberOfIterationsBefore;
1338 if(!unreachedStates.empty())
1340 unreachedState = *unreachedStates.begin();
1341 unreachedStates.erase(unreachedState);
1347 set<Event>::const_iterator eventIt = newSelection.begin();
1348 for(
unsigned i = 0; i < numberOfTrans; ++i)
1352 if( (unreachedState.valid()) &&
1353 (counter == numberOfIterationsBefore))
1357 t = newObservableComponent->newTrans(currentState,unreachedState,*eventIt);
1358 if(visitingOrVisitedStates.find(unreachedState) == visitingOrVisitedStates.end())
1362 stateToVisit.push_back(unreachedState);
1363 visitingOrVisitedStates.insert(unreachedState);
1367 if(currentTriggerableConstrainedEvents.find(*eventIt)
1368 != currentTriggerableConstrainedEvents.end())
1371 ObservableComponent::OutTransIterator outTransIt = localInteraction->beginOfOutTrans(currentInteractingState);
1373 while((!found) && (outTransIt != localInteraction->endOfOutTrans(currentInteractingState)))
1375 found = (localInteraction->getEvent(*outTransIt)) == *eventIt;
1378 interactingStateToVisit.push_back(outTransIt->target());
1379 triggeredTransition[*outTransIt] = 1;
1380 stateMapping[unreachedState].insert(outTransIt->target());
1384 assertion(GraphInvalid,found,
"generateTransitionSystem: internal BUG1");
1389 interactingStateToVisit.push_back(currentInteractingState);
1390 stateMapping[unreachedState].insert(currentInteractingState);
1399 unsigned targetId = 0;
1400 if (newObservableComponent->isFailure(*eventIt))
1403 if(indexState[targetId] == currentState)
1405 unsigned currentStateId = targetId;
1407 if(targetId >= currentStateId)
1417 t = newObservableComponent->newTrans(currentState,indexState[targetId],*eventIt);
1419 if(visitingOrVisitedStates.find(indexState[targetId]) == visitingOrVisitedStates.end())
1421 stateToVisit.push_back(indexState[targetId]);
1422 visitingOrVisitedStates.insert(indexState[targetId]);
1425 if(currentTriggerableConstrainedEvents.find(*eventIt)
1426 != currentTriggerableConstrainedEvents.end())
1429 ObservableComponent::OutTransIterator outTransIt = localInteraction->beginOfOutTrans(currentInteractingState);
1431 while((!found) && (outTransIt != localInteraction->endOfOutTrans(currentInteractingState)))
1434 found = (localInteraction->getEvent(*outTransIt))
1438 interactingStateToVisit.push_back(outTransIt->target());
1439 triggeredTransition[*outTransIt] = 1;
1440 stateMapping[indexState[targetId]].insert(outTransIt->target());
1444 assertion(GraphInvalid,found,
"generateEdgeitionSystem: internal BUG1");
1449 interactingStateToVisit.push_back(currentInteractingState);
1450 stateMapping[indexState[targetId]].insert(currentInteractingState);
1457 ++numberOfVisitedStates;
1463 set<Event>::const_iterator it = unusedEvents.begin();
1464 while(!found && (it != unusedEvents.end()))
1467 found = constrainedEvents.find(*it) == constrainedEvents.end();
1470 ensure(GraphInvalid,!found,
"generateTransitionSystem: some unconstrained events are not used. BUG");
1476 ensure(GraphInvalid,unusedEvents.empty(),
"generateTransitionSystem: some events are not used. BUG");
1477 cout <<
"Stop generating the transition system: " << newObservableComponent->name() << endl;
1487 ObservableComponent * newObservableComponent,
1488 ObservableComponent * interaction,
1489 set<Event> & faultEvents,
1490 set<Event> & normalEvents,
1491 set<Event> & observableEvents,
1492 set<Event> & sharedEvents,
1493 const set<string> & labelOfSharedEvents,
1494 map<
string,
set< vector<ObservableComponent *>::size_type > > & unknownScope,
1495 unsigned nbStateMin,
1496 unsigned nbStateMax,
1497 unsigned nbFaultMin,
1498 unsigned nbFaultMax,
1501 unsigned nbNormalMin,
1502 unsigned nbNormalMax)
1504 require(GraphInvalid, !labelOfSharedEvents.empty(),
"generateComponent: this component has no interactions! BUG.");
1505 string name =
appendInfo(
"C",componentIndex);
1506 newObservableComponent->setName(name);
1508 cout <<
"Start generating the component: " << newObservableComponent->name() << endl;
1509 ObservableComponent * newInteractionObservableComponent;
1510 ObservableMask mask;
1514 vector<Event> events(nbFaultMax+nbObsMax+nbNormalMax+labelOfSharedEvents.size());
1515 int indexEvents = 0;
1520 for(
int index = 1; index <= numberOfFaultEvents; ++index)
1522 events[indexEvents] = EventFactory::factory()->getEvent(
appendInfo(name +
"_F",index));
1523 newObservableComponent->insertEvent(events[indexEvents]);
1524 faultEvents.insert(events[indexEvents]);
1525 mask.makeUnobservable(events[indexEvents]);
1532 for(
int index = 1; index <= numberOfNormalEvents; ++index)
1535 events[indexEvents] = EventFactory::factory()->getEvent(
appendInfo(name +
"_N",index));
1536 newObservableComponent->insertEvent(events[indexEvents]);
1537 normalEvents.insert(events[indexEvents]);
1538 mask.makeUnobservable(events[indexEvents]);
1547 for(
int index = 1; index <= numberOfObservableEvents; ++index)
1550 events[indexEvents] = EventFactory::factory()->getEvent(
appendInfo(name +
"_O",index));
1551 newObservableComponent->insertEvent(events[indexEvents]);
1552 observableEvents.insert(events[indexEvents]);
1553 mask.makeIdentifiable(events[indexEvents]);
1561 for(set<string>::const_iterator sharedEvtIt = labelOfSharedEvents.begin();
1562 sharedEvtIt != labelOfSharedEvents.end();
1566 events[indexEvents] = EventFactory::factory()->getEvent(
appendInfo(name +
"_" + *sharedEvtIt));
1567 newObservableComponent->insertEvent(events[indexEvents]);
1568 sharedEvents.insert(events[indexEvents]);
1569 mask.makeUnobservable(events[indexEvents]);
1572 newObservableComponent->setMask(mask);
1573 unsigned nbEvents = indexEvents;
1580 if(interaction->numberOfTransitions() == 0)
1585 newInteractionObservableComponent =
new ObservableComponent();
1586 newInteractionObservableComponent->project(newObservableComponent,sharedEvents);
1594 set<Code> projectedCodes;
1596 for(CodeIterator cit = newObservableComponent->beginOfCodes();
1597 cit != newObservableComponent->endOfCodes();
1601 if(cit->type() == ObservableComponent::Shared)
1605 CodeIterator cit2 = interaction->beginOfCodes();
1606 while(!found && (cit2 != interaction->endOfCodes()))
1609 found = *cit == *cit2;
1612 projectedCodes.insert(*cit2);
1623 assertion(GraphInvalid,!projectedCodes.empty(),
1624 "generateComponent: There is no shared code in the new local interaction model! BUG.");
1625 ObservableComponent * localProjection =
new ObservableComponent(*interaction,projectedCodes);
1629 generateEdgeitionSystem(newObservableComponent,localProjection, numberOfStates, eventCodes, nbEvents);
1634 set<Code> nonExclusiveSharedCodes;
1635 for(CodeIterator cit = newObservableComponent->beginOfCodes();
1636 cit != newObservableComponent->endOfCodes();
1640 if(cit->type() == ObservableComponent::Shared)
1642 unknownScope[newObservableComponent->nameOfCode(cit->id())].erase(componentIndex);
1643 if(!unknownScope[newObservableComponent->nameOfCode(cit->id())].empty())
1647 nonExclusiveSharedCodes.insert(*cit);
1651 delete localProjection;
1653 if(!nonExclusiveSharedCodes.empty())
1655 localProjection =
new ObservableComponent(*newObservableComponent,nonExclusiveSharedCodes);
1659 localProjection = 0;
1665 set<Code> nonExclusiveSharedCodes2;
1666 for(CodeIterator cit = interaction->beginOfCodes();
1667 cit != interaction->endOfCodes();
1671 if(cit->type() == ObservableComponent::Shared)
1673 if(!unknownScope[interaction->nameOfCode(cit->id())].empty())
1675 nonExclusiveSharedCodes2.insert(*cit);
1681 ObservableComponent * updatedInteraction = 0;
1682 if(!nonExclusiveSharedCodes2.empty())
1684 updatedInteraction =
new ObservableComponent(*interaction,nonExclusiveSharedCodes2);
1690 if((localProjection == 0) && (updatedInteraction == 0))
1692 newInteractionObservableComponent =
new ObservableComponent();
1693 newInteractionObservableComponent->setName(
"Null_Interaction");
1694 State s = newInteractionObservableComponent->newState();
1695 newInteractionObservableComponent->setInitialState(s);
1696 newInteractionObservableComponent->setLabelOfState(s,
"Null");
1700 if(localProjection == 0)
1702 newInteractionObservableComponent = updatedInteraction;
1706 if(updatedInteraction == 0)
1708 newInteractionObservableComponent = localProjection;
1715 set<Code>::iterator cit = nonExclusiveSharedCodes.begin();
1716 while(cit != nonExclusiveSharedCodes.end())
1719 set<Code>::iterator cit2 = nonExclusiveSharedCodes2.find(*cit);
1720 if(cit2 != nonExclusiveSharedCodes2.end())
1722 nonExclusiveSharedCodes2.erase(cit2);
1723 nonExclusiveSharedCodes.erase(cit);
1734 list<Code> normalCodes;
1735 for(set<Code>::const_iterator cit = nonExclusiveSharedCodes.begin();
1736 cit != nonExclusiveSharedCodes.end();
1740 normalCodes.push_back(*cit);
1742 while(!normalCodes.empty())
1745 localProjection->changeCodeType(normalCodes.front(), ObservableComponent::Normal);
1746 normalCodes.pop_front();
1749 for(set<Code>::const_iterator cit = nonExclusiveSharedCodes2.begin();
1750 cit != nonExclusiveSharedCodes2.end();
1754 normalCodes.push_back(*cit);
1756 while(!normalCodes.empty())
1759 updatedInteraction->changeCodeType(normalCodes.front(), ObservableComponent::Normal);
1760 normalCodes.pop_front();
1763 list<ObservableComponent *> models;
1764 models.push_back(localProjection);
1765 models.push_back(updatedInteraction);
1768 newInteractionObservableComponent =
new ObservableComponent(models);
1770 for(CodeIterator cit = newInteractionObservableComponent->beginOfCodes();
1771 cit != newInteractionObservableComponent->endOfCodes();
1775 if(cit->type() == ObservableComponent::Normal)
1777 normalCodes.push_back(*cit);
1780 while(!normalCodes.empty())
1783 newInteractionObservableComponent->changeCodeType(normalCodes.front(),ObservableComponent::Shared);
1784 normalCodes.pop_front();
1786 cout <<
"Done" << endl;
1787 delete localProjection;
1788 delete updatedInteraction;
1794 cout <<
"Stop generating the component: " << newObservableComponent->name() << endl;
1797 set<string> labels = labelOfSharedEvents;
1798 set<string> seenLabels;
1800 while((transIt != newObservableComponent->edgeEnd()))
1803 if(newObservableComponent->codeOfEdge(*transIt).type() == ObservableComponent::Shared)
1805 string labl = newObservableComponent->nameOfCode(newObservableComponent->codeOfEdge(*transIt).id());
1806 ensure(GraphInvalid,labels.find(labl) != labels.end(),
"generateComponent: there is a shared code in the generated model that is unknown");
1807 seenLabels.insert(labl);
1811 ensure(GraphInvalid,labels.size() == seenLabels.size(),
1812 "generateComponent: shared codes in the generated model are not correct");
1813 ensure(GraphInvalid,newInteractionObservableComponent->numberOfEdgeitions() > 0,
1814 "generateComponent: newInteractionObservableComponent is not correct");
1817 for(CodeIterator cit = newInteractionObservableComponent->beginOfCodes();
1818 cit != newInteractionObservableComponent->endOfCodes();
1822 if(cit->type() != ObservableComponent::Shared)
1824 cerr <<
"Problem with the following event: " << newInteractionObservableComponent->nameOfCode(cit->id()) << endl;
1826 ensure(GraphInvalid, cit->type() == ObservableComponent::Shared,
"generateComponent: Some events of the new interaction model are not shared");
1828 return newInteractionObservableComponent;
1834 unsigned nbStateMin,
unsigned nbStateMax,
1835 unsigned nbFaultMin,
unsigned nbFaultMax,
1836 unsigned nbSharedMax,
unsigned nbSharedMaxComp,
1837 unsigned nbObsMin,
unsigned nbObsMax,
1838 unsigned nbNormalMin,
unsigned nbNormalMax,
Graph & topology,
1839 NodeMap<string> & compName,
1840 EdgeMap< set<unsigned> > & sharedEvnt,
1841 vector<ObservableComponent *> & setOfComponents)
1843 cout <<
"Generating Topology..." << flush;
1844 NodeMap<unsigned> compIds(topology);
1849 cout <<
"Done" << endl;
1852 cout <<
"Shared event generation..." << flush;
1853 unsigned numberOfSharedEvents =
generateSharedEvents(topology, sharedEvnt, nbSharedMax, nbSharedMaxComp);
1854 cout << numberOfSharedEvents <<
" events. Done" << endl;
1855 visuDot(topology,compIds,sharedEvnt,numberOfSharedEvents);
1858 setOfComponents.resize(topology.numberOfNodes());
1861 vector< set<Event> > faultEvents(topology.numberOfNodes());
1862 vector< set<Event> > normalEvents(topology.numberOfNodes());
1863 vector< set<Event> > observableEvents(topology.numberOfNodes());
1864 vector< set<Event> > sharedEvents(topology.numberOfNodes());
1865 vector< set<string> > labelOfSharedEvents(topology.numberOfNodes());
1866 map<string, set< vector<ObservableComponent *>::size_type > > unknownScope;
1869 list<Node> nodesToVisit;
1870 nodesToVisit.push_back(*topology.nodeBegin());
1871 NodeMap<int> visitedNodes(topology);
1873 while( !nodesToVisit.empty() )
1875 Node node = nodesToVisit.front();
1876 stringstream stream;
1877 stream <<
"C" << index;
1878 compName[node] = stream.str();
1880 nodesToVisit.pop_front();
1881 visitedNodes[node] = 1;
1883 edgeIt != node.outEdgeEnd();
1886 if(visitedNodes[edgeIt->target()] == 0)
1888 nodesToVisit.push_back(edgeIt->target());
1889 visitedNodes[edgeIt->target()] = 1;
1891 for(set<unsigned>::const_iterator unsignedIt = sharedEvnt[*edgeIt].begin();
1892 unsignedIt != sharedEvnt[*edgeIt].end();
1897 unknownScope[label].insert(index);
1898 labelOfSharedEvents[index].insert(label);
1902 edgeIt != node.inEdgeEnd();
1906 if(visitedNodes[edgeIt->source()] == 0)
1908 nodesToVisit.push_back(edgeIt->source());
1909 visitedNodes[edgeIt->source()] = 1;
1911 for(set<unsigned>::const_iterator unsignedIt = sharedEvnt[*edgeIt].begin();
1912 unsignedIt != sharedEvnt[*edgeIt].end();
1917 unknownScope[label].insert(index);
1918 labelOfSharedEvents[index].insert(label);
1924 ObservableComponent * interaction =
new ObservableComponent();
1926 interaction->setName(
"Null_Interaction");
1927 State s = interaction->newState(
"Null");
1928 interaction->setInitial(s);
1929 for(vector<ObservableComponent *>::size_type index2 = 0;
1930 index2 < setOfComponents.size();
1933 setOfComponents[index2] =
new ObservableComponent();
1935 setOfComponents[index2],
1937 faultEvents[index2],
1938 normalEvents[index2],
1939 observableEvents[index2],
1940 sharedEvents[index2],
1941 labelOfSharedEvents[index2],
1952 interaction = newInteraction;
1954 for(vector<ObservableComponent *>::size_type index2 = 0;
1955 index2 < setOfComponents.size();
1958 stringstream fileName;
1959 stringstream fileDotName;
1960 fileDotName << setOfComponents[index2]->name() <<
".dot";
1961 fileName << setOfComponents[index2]->name() <<
".lafmodel";
1962 cout <<
"Write file " << fileName.str() <<
"..." << flush;
1963 setOfComponents[index2]->export2LafObservableComponent(fileName.str().c_str());
1964 setOfComponents[index2]->model2dot(fileDotName.str());
1965 cout <<
"Done" << endl;
1975 unsigned nbComp = 3;
1976 unsigned connectivity = 3;
1977 unsigned nbStateMin = 2;
1978 unsigned nbStateMax = 4;
1979 unsigned nbFaultMin = 1;
1980 unsigned nbFaultMax = 2;
1981 unsigned nbSharedMax = 6;
1982 unsigned nbSharedMaxComp = 3;
1983 unsigned nbObsMin = 1;
1984 unsigned nbObsMax = 2;
1985 unsigned nbNormalMin = 0;
1986 unsigned nbNormalMax = 1;
1994 for(
int i = 1; i < argc-1; i=i+2)
1997 string currentParameter = argv[i];
1998 cout << currentParameter << endl;
1999 string nextParameter;
2000 if(currentParameter ==
"--comp")
2002 nextParameter = argv[i+1];
2004 istringstream ist(nextParameter);
2005 bool ok = ist >> nbComp;
2008 printError(currentParameter,
"Wrong parameter type");
2012 printError(currentParameter,
"nbComp must be greater than 1");
2015 if(currentParameter ==
"--connectivity")
2017 nextParameter = argv[i+1];
2019 istringstream ist(nextParameter);
2020 bool ok = ist >> connectivity;
2023 printError(currentParameter,
"Wrong parameter type");
2025 if(connectivity < 0)
2027 printError(currentParameter,
"connectivity must be greater than 0");
2030 if(currentParameter ==
"--stateMax")
2032 nextParameter = argv[i+1];
2033 istringstream ist(nextParameter);
2034 bool ok = ist >> nbStateMax;
2037 printError(currentParameter,
"Wrong parameter type");
2041 printError(currentParameter,
"nbStateMax must be greater than 1");
2044 if(currentParameter ==
"--faultMax")
2046 nextParameter = argv[i+1];
2047 istringstream ist(nextParameter);
2048 bool ok = ist >> nbFaultMax;
2051 printError(currentParameter,
"Wrong parameter type");
2055 printError(currentParameter,
"nbFaultMax must be greater than 0");
2058 if(currentParameter ==
"--obsMax")
2060 nextParameter = argv[i+1];
2061 istringstream ist(nextParameter);
2062 bool ok = ist >> nbObsMax;
2065 printError(currentParameter,
"Wrong parameter type");
2069 printError(currentParameter,
"nbObsMax must be greater than 0");
2072 if(currentParameter ==
"--normalMax")
2074 nextParameter = argv[i+1];
2075 istringstream ist(nextParameter);
2076 bool ok = ist >> nbNormalMax;
2079 printError(currentParameter,
"Wrong parameter type");
2083 printError(currentParameter,
"nbNormalMax must be greater than 0");
2086 if(currentParameter ==
"--sharedMax")
2088 nextParameter = argv[i+1];
2089 istringstream ist(nextParameter);
2090 bool ok = ist >> nbSharedMax;
2093 printError(currentParameter,
"Wrong parameter type");
2097 printError(currentParameter,
"nbSharedMax must be greater than 0");
2101 if(currentParameter ==
"--sharedMaxComp")
2103 nextParameter = argv[i+1];
2104 istringstream ist(nextParameter);
2105 bool ok = ist >> nbSharedMaxComp;
2108 printError(currentParameter,
"Wrong parameter type");
2110 if(nbSharedMaxComp < 0)
2112 printError(currentParameter,
"nbSharedMax must be greater than 0");
2115 if(currentParameter ==
"--stateMin")
2117 nextParameter = argv[i+1];
2118 istringstream ist(nextParameter);
2119 bool ok = ist >> nbStateMin;
2122 printError(currentParameter,
"Wrong parameter type");
2126 printError(currentParameter,
"nbStateMin must be greater than 1");
2129 if(currentParameter ==
"--faultMin")
2131 nextParameter = argv[i+1];
2132 istringstream ist(nextParameter);
2133 bool ok = ist >> nbFaultMin;
2136 printError(currentParameter,
"Wrong parameter type");
2140 printError(currentParameter,
"nbFaultMin must be greater than 0");
2143 if(currentParameter ==
"--obsMin")
2145 nextParameter = argv[i+1];
2146 istringstream ist(nextParameter);
2147 bool ok = ist >> nbObsMin;
2150 printError(currentParameter,
"Wrong parameter type");
2154 printError(currentParameter,
"nbObsMin must be greater than 0");
2157 if(currentParameter ==
"--normalMin")
2159 nextParameter = argv[i+1];
2160 istringstream ist(nextParameter);
2161 bool ok = ist >> nbNormalMin;
2164 printError(currentParameter,
"Wrong parameter type");
2168 printError(currentParameter,
"nbNormalMin must be greater than 0");
2173 if(nbStateMin > nbStateMax)
2175 printError(
"nbStateMin",
"nbStateMax should be at least equal to nbStateMin");
2177 if(nbFaultMin > nbFaultMax)
2179 printError(
"nbFaultMin",
"nbFaultMax should be at least equal to nbFaultMin");
2181 if(nbObsMin > nbObsMax)
2183 printError(
"nbObsMin",
"nbObsMax should be at least equal to nbObsMin");
2185 if(nbNormalMin > nbNormalMax)
2187 printError(
"nbNormalMin",
"nbNormalMax should be at least equal to nbNormalMin");
2189 if((nbComp > 2) && (connectivity == 1))
2191 printError(
"connectivity",
"Since nbComp > 2, connectivity must be >= 2");
2193 if(nbSharedMaxComp > nbSharedMax)
2195 printError(
"nbSharedMaxComp",
"nbSharedMax must be greater or equal to nbSharedMaxComp");
2197 cout <<
"Here are the parameters for the generation: " << endl;
2198 cout <<
"\tNumber of components: " << nbComp << endl;
2199 cout <<
"\tConnectivity: " << connectivity << endl;
2200 cout <<
"\tNumber of states between " << nbStateMin <<
" and " << nbStateMax << endl;
2201 cout <<
"\tNumber of fault events between " << nbFaultMin <<
" and " << nbFaultMax << endl;
2202 cout <<
"\tNumber of shared events smaller than " << nbSharedMax << endl;
2203 cout <<
"\tNumber of shared events between two components smaller than " << nbSharedMaxComp << endl;
2204 cout <<
"\tNumber of observable events between " << nbObsMin <<
" and " << nbObsMax << endl;
2205 cout <<
"\tNumber of normal events between " << nbNormalMin <<
" and " << nbNormalMax << endl;
2209 NodeMap<string> compName(topology);
2210 EdgeMap< set<unisgned> > sharedEvnt(topology,0);
2211 vector<ObservableComponent *> setOfComponents;
2214 nbFaultMin,nbFaultMax,
2215 nbSharedMax,nbSharedMaxComp,nbObsMin,nbObsMax,
2216 nbNormalMin,nbNormalMax,topology,compName,sharedEvnt,setOfComponents);
2218 nbFaultMin,nbFaultMax,
2219 nbSharedMax,nbSharedMaxComp,nbObsMin,nbObsMax,
2220 nbNormalMin,nbNormalMax,topology,compName,sharedEvnt,setOfComponents);
2230 int nbStateMin,
int nbStateMax,
2231 int nbFaultMin,
int nbFaultMax,
2232 int nbSharedMax,
int nbSharedMaxComp,
2233 int nbObsMin,
int nbObsMax,
2234 int nbNormalMin,
int nbNormalMax,
2235 const Graph & topology,
2236 const NodeMap<string> & compName,
2237 const EdgeMap< set<long> > & sharedEvnt,
2238 const vector<ObservableComponent *> & setOfComponents)
2241 stringstream stream;
2242 stream <<
"MOD" << (unsigned)time( NULL );
2243 string fileName = stream.str()+
".tex";
2244 latexfile.open(fileName.c_str());
2246 nbStateMin, nbStateMax,
2247 nbFaultMin, nbFaultMax,
2248 nbSharedMax, nbSharedMaxComp,
2250 nbNormalMin, nbNormalMax, latexfile);
2261 int nbStateMin,
int nbStateMax,
2262 int nbFaultMin,
int nbFaultMax,
2263 int nbSharedMax,
int nbSharedMaxComp,
2264 int nbObsMin,
int nbObsMax,
2265 int nbNormalMin,
int nbNormalMax,
2266 ofstream & latexfile)
2269 latexfile <<
"\\documentclass[11pt]{article}" << endl;
2270 latexfile <<
"\\usepackage{array}" << endl;
2271 latexfile <<
"\\textwidth 17cm \\textheight 26cm \\voffset -3cm \\hoffset -1.6cm" << endl;
2272 latexfile <<
"\\title{Discrete-event model: " << name <<
"}" << endl;
2275 latexfile <<
"\\date{" << ctime( &rawtime ) <<
"}" << endl;
2276 latexfile <<
"\\begin{document}" << endl;
2277 latexfile <<
"\\maketitle" << endl;
2278 latexfile <<
"\\section{Introduction}" << endl;
2279 latexfile <<
"This model has been generated with the following parameters of {\\tt ObservableComponentGenerator}." << endl;
2280 latexfile <<
"\\begin{center}" << endl;
2281 latexfile <<
"{\\small" << endl;
2282 latexfile <<
"\\begin{tabular}{|c|c|c|} " << endl;
2283 latexfile <<
"\\hline" << endl;
2284 latexfile <<
"Number of components & {\\tt --comp} & " << nbComp <<
" \\\\ " << endl;
2285 latexfile <<
"\\hline" << endl;
2286 latexfile <<
"Connectivity & {\\tt --connectivity} & " << connectivity <<
" \\\\" << endl;
2287 latexfile <<
"\\hline" << endl;
2288 latexfile <<
"Maximal of interactive events per component & {\\tt --sharedMax} & " << nbSharedMax <<
" \\\\" << endl;
2289 latexfile <<
"\\hline" << endl;
2290 latexfile <<
"Maximal number of interactive events between two components & {\\tt --sharedMaxComp} & " << nbSharedMaxComp <<
" \\\\" << endl;
2291 latexfile <<
"\\hline" << endl;
2292 latexfile <<
"Minimal number of faults per component & {\\tt --faultMin} & " << nbFaultMin <<
" \\\\" << endl;
2293 latexfile <<
"\\hline" << endl;
2294 latexfile <<
"Maximal number of faults per component & {\\tt --faultMax} & " << nbFaultMax <<
" \\\\" << endl;
2295 latexfile <<
"\\hline" << endl;
2296 latexfile <<
"Minimal number of observable per component & {\\tt --obsMin} & " << nbObsMin <<
" \\\\" << endl;
2297 latexfile <<
"\\hline" << endl;
2298 latexfile <<
"Maximal number of observable events per component & {\\tt --obsMax} & " << nbObsMax <<
" \\\\" << endl;
2299 latexfile <<
"\\hline" << endl;
2300 latexfile <<
"Minimal number of normal events per component & {\\tt --normalMin} & " << nbNormalMin <<
" \\\\" << endl;
2301 latexfile <<
"\\hline" << endl;
2302 latexfile <<
"Maximal number of normal events per component & {\\tt --normalMax} & " << nbNormalMax <<
" \\\\" << endl;
2303 latexfile <<
"\\hline" << endl;
2304 latexfile <<
"Minimal number of states per component & {\\tt --stateMin} & " << nbStateMin <<
" \\\\" << endl;
2305 latexfile <<
"\\hline" << endl;
2306 latexfile <<
"Maximal number of states per component & {\\tt --stateMax} & " << nbStateMax <<
" \\\\" << endl;
2307 latexfile <<
"\\hline" << endl;
2308 latexfile <<
"\\end{tabular}" << endl;
2309 latexfile <<
"}" << endl;
2310 latexfile <<
"\\end{center}" << endl;
2319 const EdgeMap< set<long> > & sharedEvnt, ofstream & latexfile)
2321 latexfile <<
"\\section{Topology}" << endl;
2322 latexfile <<
"\\label{sec:topology}" << endl;
2323 latexfile <<
"The topology of the system is composed of ";
2324 latexfile << topology.numberOfNodes();
2325 latexfile <<
" components and " << topology.numberOfEdge();
2326 latexfile <<
" connections." << endl;
2327 latexfile <<
" The treewidth of this topology is " << endl;
2332 nodeIt != topology.nodeEnd();
2335 latexfile <<
"\\paragraph{Neighbourhood of component {\\tt ";
2336 latexfile << compName[*nodeIt] <<
"}}~\\\\" << endl;
2337 latexfile <<
"\\begin{enumerate}" << endl;
2339 outTransIt != topology.outEdgeEnd(*nodeIt);
2342 latexfile <<
"\\item Component {\\tt " << compName[outTransIt->target()] <<
"} with events {\\tt ";
2343 for(set<long>::const_iterator it = sharedEvnt[*outTransIt].begin();
2344 it != sharedEvnt[*outTransIt].end();
2348 set<long>::const_iterator it2 = it;
2350 if(it2 != sharedEvnt[*outTransIt].end())
2352 latexfile <<
"}, {\\tt ";
2355 latexfile <<
"}." << endl;
2358 inEdgeIt != topology.inEdgeEnd(*nodeIt);
2361 latexfile <<
"\\item Component {\\tt " << compName[inEdgeIt->source()] <<
"} with events {\\tt ";
2362 for(set<long>::const_iterator it = sharedEvnt[*inEdgeIt].begin();
2363 it != sharedEvnt[*inEdgeIt].end();
2367 set<long>::const_iterator it2 = it;
2369 if(it2 != sharedEvnt[*inEdgeIt].end())
2371 latexfile <<
"}, {\\tt ";
2374 latexfile <<
"}." << endl;
2377 latexfile <<
"\\end{enumerate}" << endl;
2385 for(vector<ObservableComponent *>::size_type index2 = 0;
2386 index2 < setOfComponents.size();
2389 latexfile <<
"\\newpage" << endl;
2390 latexfile <<
"\\subsection{Component {\\tt " << setOfComponents[index2]->name() <<
"}}" << endl;
2391 latexfile <<
"\\label{comp:" << setOfComponents[index2]->name() <<
"}" << endl;
2392 latexfile <<
"\\begin{center}" << endl;
2393 latexfile <<
"{\\small" << endl;
2394 latexfile <<
"\\begin{tabular}{|c|m{8cm}|}" << endl;
2395 latexfile <<
"\\hline" << endl;
2396 latexfile <<
"Number of states & " << setOfComponents[index2]->numberOfNodes() <<
" \\\\" << endl;
2397 latexfile <<
"\\hline" << endl;
2398 latexfile <<
"Number of Edgeitions & " << setOfComponents[index2]->numberOfEdgeitions() <<
" \\\\" << endl;
2399 latexfile <<
"\\hline" << endl;
2400 latexfile <<
"Interactive events & {\\tt ";
2401 for(map<IdCode,string>::const_iterator it = setOfComponents[index2]->sharedsBegin();
2402 it != setOfComponents[index2]->sharedsEnd();
2405 latexfile <<
"\\verb|" << it->second <<
"| ";
2407 latexfile <<
"} \\\\" << endl;
2408 latexfile <<
"\\hline" << endl;
2409 latexfile <<
"Fault events & {\\tt ";
2410 for(map<IdCode,string>::const_iterator it = setOfComponents[index2]->failuresBegin();
2411 it != setOfComponents[index2]->failuresEnd();
2414 latexfile <<
"\\verb|" << it->second <<
"| ";
2416 latexfile <<
"} \\\\" << endl;
2417 latexfile <<
"\\hline" << endl;
2418 latexfile <<
"Observable events & {\\tt ";
2419 for(map<IdCode,string>::const_iterator it = setOfComponents[index2]->observablesBegin();
2420 it != setOfComponents[index2]->observablesEnd();
2423 latexfile <<
"\\verb|" << it->second <<
"| ";
2425 latexfile <<
"} \\\\" << endl;
2426 latexfile <<
"\\hline" << endl;
2427 latexfile <<
"Normal events & {\\tt ";
2428 for(map<IdCode,string>::const_iterator it = setOfComponents[index2]->normalsBegin();
2429 it != setOfComponents[index2]->normalsEnd();
2432 latexfile <<
"\\verb|" << it->second <<
"| ";
2434 latexfile <<
"} \\\\" << endl;
2435 latexfile <<
"\\hline" << endl;
2436 latexfile <<
"\\end{tabular} }" << endl << endl;
2437 latexfile <<
"\\end{center}" << endl << endl << endl;
2438 latexfile <<
"\\paragraph{Initial state:} " << setOfComponents[index2]->prettyLabelOfNode(setOfComponents[index2]->initialNode()) << endl;
2439 latexfile <<
"\\paragraph{Edgeition system:}" << endl;
2440 if(setOfComponents[index2]->numberOfNodes() > 10)
2442 latexfile <<
"Note: as the number of states is greater than 10, only transitions involved in the first 10 states are printed." << endl;
2445 vector<Node> printedNodes(1);
2446 printedNodes[0] = setOfComponents[index2]->initialNode();
2447 map<Node,int> mappingNodes;
2448 mappingNodes[setOfComponents[index2]->initialNode()] = 0;
2449 list<Node> visitingNodes;
2450 visitingNodes.push_back(setOfComponents[index2]->initialNode());
2452 while((!visitingNodes.empty()) && (stateNb < 10))
2454 Node currentState = visitingNodes.front();
2455 visitingNodes.pop_front();
2457 while((stateNb < 10) && (outTransIt != setOfComponents[index2]->outEdgeEnd(currentState)))
2459 if(mappingNodes.find(outTransIt->target()) == mappingNodes.end())
2462 printedNodes.push_back(outTransIt->target());
2463 mappingNodes[printedNodes.back()] = printedNodes.size()-1;
2464 visitingNodes.push_back(outTransIt->target());
2470 latexfile <<
"\\begin{center}" << endl;
2471 latexfile <<
"{\\small" << endl;
2473 latexfile <<
"\\begin{tabular}{|c";
2474 for(
unsigned i = 0; i< printedNodes.size(); ++i)
2476 latexfile <<
"|m{1cm}";
2478 latexfile <<
"|}" << endl;
2479 latexfile <<
"\\hline" << endl;
2480 for(
unsigned i = 0; i< printedNodes.size(); ++i)
2482 latexfile <<
" & {\\bf " << setOfComponents[index2]->prettyLabelOfNode(printedNodes[i]) <<
"}";
2484 latexfile <<
"\\\\" << endl;
2485 latexfile <<
"\\hline" << endl;
2486 for(
unsigned i = 0; i< printedNodes.size(); ++i)
2488 latexfile <<
"{\\bf " << setOfComponents[index2]->prettyLabelOfNode(printedNodes[i]) <<
"}";
2489 map< Node,set<string> > outEvents;
2491 outTransIt != setOfComponents[index2]->outEdgeEnd(printedNodes[i]);
2494 if(mappingNodes.find(outTransIt->target()) != mappingNodes.end())
2496 outEvents[outTransIt->target()].insert( setOfComponents[index2]->nameOfCode( setOfComponents[index2]->codeOfEdge(*outTransIt).id()));
2499 for(
unsigned j = 0; j< printedNodes.size(); ++j)
2502 for(set<string>::const_iterator stringIt = outEvents[printedNodes[j]].begin();
2503 stringIt != outEvents[printedNodes[j]].end();
2506 latexfile <<
"\\verb|" << *stringIt <<
"| ";
2509 latexfile <<
"\\\\" << endl;
2510 latexfile <<
"\\hline" << endl;
2514 latexfile <<
"\\end{tabular}";
2515 latexfile <<
"}" << endl;
2516 latexfile <<
"\\end{center}";
2527 latexfile <<
"\\end{document}" << endl;
2543 stringstream stream;
2544 stream <<
"TreeWidthBug" << (unsigned) time(0) <<
".cc";
2545 string fileName = stream.str();
2546 ofstream banfile(fileName.c_str());
2548 banfile <<
"#include \"Node.h\"" << endl;
2549 banfile <<
"#include \"Graph.h\"" << endl << endl;
2550 banfile <<
"using namespace BAN;" << endl << endl;
2551 banfile <<
"int main(int argc, char** argv) {" << endl;
2552 banfile <<
"\t Graph g;" << endl;
2558 NodeMap<int> status(topology,0);
2561 it != topology.edgeEnd();
2564 if(status[it->source()] == 0)
2566 nodeOf[it->source()] = topo.createNode();
2568 node <<
"N" << it->source().id();
2569 banfile <<
"\t Node " << node.str() <<
" = g.createNode();" << endl;
2570 status[it->source()] = 1;
2572 if(status[it->target()] == 0)
2575 node <<
"N" << it->target().id();
2576 banfile <<
"\t Node " << node.str() <<
" = g.createNode();" << endl;
2577 nodeOf[it->target()] = topo.createNode();
2578 status[it->target()] = 1;
2580 stringstream source;
2581 source <<
"N" << it->source().id();
2582 stringstream target;
2583 target <<
"N" << it->target().id();
2585 banfile <<
"\t g.createEdge(" << source.str() <<
", " << target.str() <<
");" << endl;
2587 topo.createEdge(
nodeOf[it->source()],
nodeOf[it->target()]);
2589 banfile <<
"\t std::cout << \"TreeWidth = \" << std::flush;" << endl;
2590 banfile <<
"\t std::cout << g.getTreeWidth() << std::endl;" << endl;
2591 banfile <<
"}" << endl;
2593 return topo.getTreeWidth();
void writeComponent(const string &name, const Graph &behav, const EdgeMap< string > &transEvent, const set< string > &faultEvents, const set< string > &normalEvents, const set< string > &observableEvents, const set< string > &sharedEvents)
NodeMap< BAN::Node > nodeOf
GraphIterator< Edge > EdgeIterator
unsigned generateSharedEvents(Graph &topology, EdgeMap< set< unsigned > > &sharedEvnt, unsigned nbSharedMax, unsigned nbSharedMaxComp)
string appendInfo(const string &label, vector< ObservableComponent *>::size_type index)
void timer_handler(int signum)
int computeTreeWidth(const Graph &topology)
void generateTopology(unsigned nbComp, unsigned connectivity, unsigned nbSharedMax, Graph &topology, NodeMap< unsigned > &compIds)
#define ensure(Exception, expr, message)
void generateStates(ObservableComponent *newObservableComponent, unsigned numberOfStates, set< Node > &unreachedStates, vector< Node > &indexState)
void initialiseRandomGenerator()
void generateLatexEpilog(ofstream &latexfile)
void generateLatexFile(int nbComp, int connectivity, int nbStateMin, int nbStateMax, int nbFaultMin, int nbFaultMax, int nbSharedMax, int nbSharedMaxComp, int nbObsMin, int nbObsMax, int nbNormalMin, int nbNormalMax, const Graph &topology, const NodeMap< string > &compName, const EdgeMap< set< long > > &sharedEvnt, const vector< ObservableComponent *> &setOfComponents)
DdAutFsm::EventPropertyId Event
GraphIterator< Node > NodeIterator
void propagateInteractingStates(ObservableComponent *newObservableComponent, const ObservableComponent *localInteraction, State state, State correspondingState, NodeMap< set< State > > &stateMapping)
void generateTriggerableEvents(unsigned numberOfUnusedEventPerState, unsigned numberOfTrans, const vector< Event > &events, unsigned nbEvents, const set< Event > &constrainedEvents, const set< Event > ¤tTriggerableConstrainedEvents, set< Event > &newSelection, set< Event > &unusedEvents)
void completeObservableComponent(ObservableComponent *newObservableComponent, const ObservableComponent *localInteraction, EdgeMap< int > &triggeredTransition, NodeMap< set< State > > &stateMapping, set< Event > &unusedEvents)
void visuDot(const Graph &topology, const NodeMap< long > &compIds, const EdgeMap< set< long > > &sharedEvnt, long numberOfSharedEvents)
void generateTopology2(unsigned nbComp, unsigned connectivity, unsigned nbSharedMax, Graph &topology, NodeMap< unsigned > &compIds)
#define require(Exception, expr, message)
long generateRandomValue(long lower, long upper)
void generateTransitionSystem(ObservableComponent *newObservableComponent, const ObservableComponent *localInteraction, unsigned numberOfStates, const vector< Event > &events, unsigned nbEvents)
void generateLatexPreamble(const string &name, int nbComp, int connectivity, int nbStateMin, int nbStateMax, int nbFaultMin, int nbFaultMax, int nbSharedMax, int nbSharedMaxComp, int nbObsMin, int nbObsMax, int nbNormalMin, int nbNormalMax, ofstream &latexfile)
int main(int argc, char *argv[])
ObservableComponent * generateComponent(vector< ObservableComponent *>::size_type componentIndex, ObservableComponent *newObservableComponent, ObservableComponent *interaction, set< Event > &faultEvents, set< Event > &normalEvents, set< Event > &observableEvents, set< Event > &sharedEvents, const set< string > &labelOfSharedEvents, map< string, set< vector< ObservableComponent *>::size_type > > &unknownScope, unsigned nbStateMin, unsigned nbStateMax, unsigned nbFaultMin, unsigned nbFaultMax, unsigned nbObsMin, unsigned nbObsMax, unsigned nbNormalMin, unsigned nbNormalMax)
list< Edge >::iterator OutEdgeIterator
void setTimeOut(long delay)
boost::adjacency_list Graph
void generateModel(unsigned nbComp, unsigned connectivity, unsigned nbStateMin, unsigned nbStateMax, unsigned nbFaultMin, unsigned nbFaultMax, unsigned nbSharedMax, unsigned nbSharedMaxComp, unsigned nbObsMin, unsigned nbObsMax, unsigned nbNormalMin, unsigned nbNormalMax, Graph &topology, NodeMap< string > &compName, EdgeMap< set< unsigned > > &sharedEvnt, vector< ObservableComponent *> &setOfComponents)
void printError(string parameter, string message)
void generateLatexTopology(const Graph &topology, const NodeMap< string > &compName, const EdgeMap< set< long > > &sharedEvnt, ofstream &latexfile)
list< Edge >::iterator InEdgeIterator
void generateLatexComponents(const vector< ObservableComponent *> &setOfComponents, ofstream &latexfile)
#define assertion(Exception, expr, message)