23 #ifndef FAUDES_OMG_RABINAUT_H
24 #define FAUDES_OMG_RABINAUT_H
51 template <
class GlobalAttr,
class StateAttr,
class EventAttr,
class TransAttr>
125 return dynamic_cast< const TrGenerator*
> (pOther); };
186 void RabinAcceptanceWrite(
void)
const;
197 virtual void RestrictStates(
const StateSet& rStates);
211 virtual void DotWrite(
const std::string& rFileName)
const;
protected:
241 #define THIS TrGenerator<GlobalAttr, StateAttr, EventAttr, TransAttr>
242 #define BASE TcGenerator<GlobalAttr, StateAttr, EventAttr, TransAttr>
243 #define TEMP template <class GlobalAttr, class StateAttr, class EventAttr, class TransAttr>
248 FD_DG(
"TrGenerator(" <<
this <<
")::TrGenerator()");
253 FD_DG(
"TrGenerator(" <<
this <<
")::TrGenerator(rOtherGen)");
258 FD_DG(
"TrGenerator(" <<
this <<
")::TrGenerator(rOtherGen)");
262 TEMP THIS::TrGenerator(
const std::string& rFileName) :
BASE(rFileName) {
263 FD_DG(
"TrGenerator(" <<
this <<
")::TrGenerator(rFilename) : done");
268 FD_DG(
"TrGenerator(" <<
this <<
")::operator = " << &rOtherGen);
270 BASE::DoAssign(rSrc);
275 FD_DG(
"TrGenerator(" <<
this <<
")::operator = " << &rSrc);
283 if(&rSrc==
static_cast<const Type*
>(
this))
286 const THIS* pgen=
dynamic_cast<const THIS*
>(&rSrc);
292 FD_DG(
"TrGenerator(" <<
this <<
")::Assign([type] " << &rSrc <<
"): call base");
302 res->EventSymbolTablep(BASE::mpEventSymbolTable);
303 res->mStateNamesEnabled=BASE::mStateNamesEnabled;
304 res->mReindexOnWrite=BASE::mReindexOnWrite;
319 THIS res= BASE::NewCGen();
325 BASE::GlobalAttribute(rRabAcc);
330 return *BASE::GlobalAttributep();
335 return BASE::GlobalAttribute();
342 rpair.
ISet()=THIS::States();
343 rpair.
RSet()=rMarking;
348 TEMP void THIS::RabinAcceptanceWrite(
void)
const {
354 BASE::RestrictStates(rStates);
359 TEMP void THIS::DotWrite(
const std::string& rFileName)
const {
360 FD_DG(
"RabinAutomaton(" <<
this <<
")::DotWrite(" << rFileName <<
")");
361 if(THIS::RabinAcceptance().Size()>5) {
362 FD_DG(
"RabinAutomaton(" <<
this <<
")::DotWrite(...): to many Rabin pairs");
363 BASE::DotWrite(rFileName);
366 StateSet::Iterator it;
367 BASE::SetMinStateIndexMap();
370 std::ofstream stream;
371 stream.exceptions(std::ios::badbit|std::ios::failbit);
372 stream.open(rFileName.c_str());
373 stream <<
"// dot output generated by libFAUDES RabinAutomaton" << std::endl;
374 stream <<
"digraph \"" << BASE::Name() <<
"\" {" << std::endl;
375 stream <<
" rankdir=LR" << std::endl;
376 stream <<
" node [shape=circle];" << std::endl;
378 stream <<
" // initial states" << std::endl;
380 for (it = BASE::InitStatesBegin(); it != BASE::InitStatesEnd(); ++it) {
381 std::string xname= BASE::StateName(*it);
382 if(xname==
"") xname=
ToStringInteger(
static_cast<long int>(BASE::MinStateIndex(*it)));
383 stream <<
" dot_dummyinit_" << i <<
" [shape=none, label=\"\" ];" << std::endl;
384 stream <<
" dot_dummyinit_" << i <<
" -> \"" << xname <<
"\";" << std::endl;
391 RabinAcceptance::CIterator rit;
392 for(rit=THIS::RabinAcceptance().Begin();rit!=THIS::RabinAcceptance().End();++rit) {
393 marked = marked + rit->ISet();
394 marked = marked + rit->RSet();
398 stream <<
" // plain states" << std::endl;
399 for (it = BASE::pStates->Begin(); it != BASE::pStates->End(); ++it) {
400 if(marked.
Exists(*it))
continue;
401 std::string xname=BASE::StateName(*it);
403 stream <<
" \"" << xname <<
"\";" << std::endl;
408 std::vector<std::string> ColorVector;
409 ColorVector.push_back(
"blue");
410 ColorVector.push_back(
"darkblue");
411 ColorVector.push_back(
"green");
412 ColorVector.push_back(
"orange");
413 ColorVector.push_back(
"green");
414 ColorVector.push_back(
"darkgreen");
415 ColorVector.push_back(
"red");
416 ColorVector.push_back(
"darkred");
419 stream <<
" // colored states" << std::endl;
421 for (it = marked.
Begin(); it != marked.
End(); ++it) {
422 std::string xname=BASE::StateName(*it);
423 if(xname==
"") xname=
ToStringInteger(
static_cast<long int>(BASE::MinStateIndex(*it)));
425 RabinAcceptance::CIterator rit;
426 std::vector<int> colvec;
428 for(rit=THIS::RabinAcceptance().Begin();rit!=THIS::RabinAcceptance().End();++rit) {
429 if(rit->ISet().Exists(*it)) colvec.push_back(col);
430 if(rit->RSet().Exists(*it)) colvec.push_back(col+1);
434 if(colvec.size()>1) {
435 for(
size_t i=0; i<colvec.size(); ++i) {
436 stream <<
" subgraph cluster_" << clustNr++ <<
" {color=" << ColorVector.at(colvec.at(i)) <<
";" << std::endl;
438 stream <<
" \"" << xname <<
"\" " << std::endl <<
" ";
439 for (
size_t i=0; i<colvec.size(); i++) {
445 if(colvec.size()==1) {
446 stream <<
" \"" << xname <<
"\" " <<
"[color=" << colvec.at(0) <<
"]" << std::endl;
464 stream <<
" // transition relation" << std::endl;
465 for (tit = BASE::TransRelBegin(); tit != BASE::TransRelEnd(); ++tit) {
466 std::string x1name= BASE::StateName(tit->X1);
468 std::string x2name= BASE::StateName(tit->X2);
470 stream <<
" \"" << x1name <<
"\" -> \"" << x2name <<
"\" [label=\"" << BASE::EventName(tit->Ev) <<
"\"];" << std::endl;
472 stream <<
"}" << std::endl;
475 catch (std::ios::failure&) {
477 "Exception opening/writing dotfile \""+rFileName+
"\"", 3);
479 BASE::ClearMinStateIndexMap();
void RestrictStates(const StateSet &rDomain)
virtual void Insert(const T &rElem)
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
virtual const Type * Cast(const Type *pOther) const
void Write(const Type *pContext=0) const
bool Exists(const T &rElem) const
Iterator Begin(void) const
TrGenerator< RabinAcceptance, AttributeVoid, AttributeCFlags, AttributeVoid > RabinAutomaton
std::string ToStringInteger(Int number)