58 string description=
"Usage:\t component_info --help |\n\t\t\t file.des_comp \t (--events | --events_number\n\t\t\t\t\t | --states | --states_number\n\t\t\t\t\t | --transitions | --transitions_number\n\t\t\t\t\t | --observables | --observables_number \n\t\t\t\t\t | --unobservables | --unobservables_number\n\t\t\t\t\t | --initial_states | --initial_states_number)\n\t\t\t\t\t | --name | --statistics) \n\n\n Print on the standard output the information associated to the given option.";
92 int main(
int argc,
char ** argv)
109 if(getOption<Option>(argv[index],
options,currentOption))
111 if(currentOption !=
HELP)
142 if(!getOption<Option>(argv[index],
options,currentOption))
145 getParameter<string>(argc,argv,index,modelFile);
158 if(!modelFile.empty())
161 if(!getOption<Option>(argv[index],
options,currentOption))
170 getParameter<string>(argc,argv,index,modelFile);
187 printCommandLineError(
"component_info caught an exception when attempting to load the file " + modelFile +
":\n\t" + e.what());
193 switch(currentOption)
207 verbose<VbOutput>(
"%1% ") % *eventIt;
222 verbose<VbOutput>(
"%1% ") % component.
getLabel(*stateIt);
237 verbose<VbOutput>(
"%1% -> %2% %3% ")
238 % component.
getLabel(transIt->source())
239 % component.
getLabel(transIt->target())
255 verbose<VbOutput>(
"%1% ") % *eventIt;
272 verbose<VbOutput>(
"%1% ") % *eventIt;
279 unsigned counter = 0;
289 verbose<VbOutput>(
"%1% ") % counter;
299 verbose<VbOutput>(
"%1% ") % component.
getLabel(*stateIt);
310 verbose<VbOutput>(
"%1% ") % component.
name();
339 vector<string> labels;
340 unordered_map< Event,vector<unsigned> > indegEvt;
341 unordered_map< Event,vector<unsigned> > outdegEvt;
342 vector<unsigned> outdeg(1);
343 vector<unsigned> indeg(1);
346 stream <<
"# component name: " << component.
name() << endl;
347 stream <<
"# number of states: " << component.
numberOfStates() << endl;
349 stream <<
"# ratio transitions/states: " 351 unsigned obsTransNb = 0;
352 unsigned wcOutputBacktrackNumber=0;
353 unsigned wcInputBacktrackNumber=0;
354 unordered_map<Event,unsigned> wcOutputBacktrackNumberPerObs;
355 unordered_map<Event,unsigned> wcInputBacktrackNumberPerObs;
360 wcInputBacktrackNumberPerObs[*obsIt]=0;
361 wcOutputBacktrackNumberPerObs[*obsIt]=0;
363 for(ObservableComponent::StateIterator it = component.
stateBegin();
367 unordered_map<Event,unsigned> nbOutTransWithObs;
368 unordered_map<Event,unsigned> nbInTransWithObs;
374 nbOutTransWithObs[*obsIt]=0;
375 nbInTransWithObs[*obsIt]=0;
377 unsigned unobsTransNb = 0;
378 for(ObservableComponent::OutputTransitionIterator
386 ++nbOutTransWithObs[component.
getEvent(*outIt)];
398 if(unobsTransNb + nbOutTransWithObs[*obsIt]!=0)
400 wcOutputBacktrackNumberPerObs[*obsIt] += unobsTransNb + nbOutTransWithObs[*obsIt] -1;
401 if(outdegEvt[*obsIt].size() <= (unobsTransNb + nbOutTransWithObs[*obsIt] -1))
403 outdegEvt[*obsIt].resize(unobsTransNb + nbOutTransWithObs[*obsIt]);
404 outdegEvt[*obsIt][unobsTransNb + nbOutTransWithObs[*obsIt] -1]= 0;
405 if(max < outdegEvt[*obsIt].size())
407 max = outdegEvt[*obsIt].size();
410 ++outdegEvt[*obsIt][unobsTransNb + nbOutTransWithObs[*obsIt] -1];
417 for(ObservableComponent::InputTransitionIterator
424 ++nbInTransWithObs[component.
getEvent(*inIt)];
437 if(unobsTransNb + nbInTransWithObs[*obsIt]!=0)
439 wcInputBacktrackNumberPerObs[*obsIt] += unobsTransNb + nbInTransWithObs[*obsIt] -1;
440 if(indegEvt[*obsIt].size() <= (unobsTransNb + nbInTransWithObs[*obsIt] -1))
442 indegEvt[*obsIt].resize(unobsTransNb + nbInTransWithObs[*obsIt]);
443 indegEvt[*obsIt][unobsTransNb + nbInTransWithObs[*obsIt] -1]= 0;
444 if(max < indegEvt[*obsIt].size())
446 max = indegEvt[*obsIt].size();
449 ++indegEvt[*obsIt][unobsTransNb + nbInTransWithObs[*obsIt] -1];
453 if(it->outDeg() >= outdeg.size())
455 outdeg.resize(it->outDeg()+1);
456 if(max < outdeg.size())
461 outdeg[it->outDeg()]++;
464 wcOutputBacktrackNumber = wcOutputBacktrackNumber + (it->outDeg()-1);
466 if(it->inDeg() >= indeg.size())
468 indeg.resize(it->inDeg()+1);
469 if(max < indeg.size())
474 indeg[it->inDeg()]++;
477 wcInputBacktrackNumber = wcInputBacktrackNumber + (it->inDeg()-1);
481 stream <<
"# ratio obs.trans./transitions: " << ((double) obsTransNb)/((double)component.
numberOfTransitions()) << endl;
482 stream <<
"# worst-case output backtrack number: " << wcOutputBacktrackNumber << endl;
483 stream <<
"# worst-case input backtrack number: " << wcInputBacktrackNumber << endl;
485 stream <<
"# worst-case output backtrack number per observable: ";
491 stream << *obsIt <<
": " << wcOutputBacktrackNumberPerObs[*obsIt] <<
" ";
494 stream <<
"# worst-case input backtrack number per observable: ";
500 stream << *obsIt <<
": " << wcInputBacktrackNumberPerObs[*obsIt] <<
" ";
509 labels.push_back(
"num");
510 labels.push_back(
"outdeg");
511 labels.push_back(
"indeg");
517 indegEvt[*obsIt].resize(max);
518 outdegEvt[*obsIt].resize(max);
520 stream <<
"opbp-" << *obsIt;
521 labels.push_back(stream.str());
522 stringstream stream2;
523 stream2 <<
"ipbp-" << *obsIt;
524 labels.push_back(stream2.str());
527 for(
unsigned i = 0; i < labels.size(); ++i)
530 if( (i== 0) || (i-1 < labels.size()))
536 for(
unsigned i = 0; i < max; ++i)
538 stream << i <<
'\t' << outdeg[i] <<
'\t' << indeg[i];
544 stream <<
'\t' << outdegEvt[*obsIt][i] <<
'\t' << indegEvt[*obsIt][i];
vector< string > fileExtensions(numberOfFileExtensions)
unsigned numberOfEvents() const
Some utilities to deal with the command line.
size_t printCommandLineError(const string &msg)
string printStatistics(const ObservableComponent &component)
StateIterator stateBegin() const
void setVerboseLevel(Diades::Utils::VerboseLevel level)
const StateLabel & getLabel(State state) const
StateIterator stateEnd() const
static void destroyEvents()
InputTransitionIterator inputTransitionBegin(State s) const
TransitionIterator transitionEnd() const
unordered_set< State >::const_iterator InitialStateIterator
set< Event >::const_iterator ObservableEventIterator
InitialStateIterator initialStateEnd() const
An observable Component defined as a automaton.
Diades::Graph::NodeIterator StateIterator
unsigned numberOfInitialStates() const
virtual bool importDesCompModel(const string &filename)
const string & name() const
unsigned numberOfTransitions() const
InputTransitionIterator inputTransitionEnd(State s) const
EventIterator observableBegin() const
InitialStateIterator initialStateBegin() const
EventIterator observableEnd() const
unsigned numberOfStates() const
bool fileSuffixOk(const string &modelFile, const string &suffix)
ObservableEventIterator observableBegin() const
EventIterator eventBegin() const
OutputTransitionIterator outputTransitionBegin(State s) const
const ObservableMask & mask() const
ObservableEventIterator observableEnd() const
bool isObservable(const Event &e) const
vector< bool > isSet(numberOfOptions, false)
TransitionIterator transitionBegin() const
const Event & getEvent(Transition t) const
Diades::Graph::EdgeIterator TransitionIterator
int main(int argc, char **argv)
EventIterator eventEnd() const
set< Event >::const_iterator EventIterator
vector< string > options(numberOfOptions)
bool isUnobservable(const Event &e) const
unsigned numberOfObservableEvents() const
unsigned numberOfFileExtensions
OutputTransitionIterator outputTransitionEnd(State s) const
void printUsage(const po::options_description &desc)