6 #ifndef DIAG_GENERATOR_H
7 #define DIAG_GENERATOR_H
25 template <
class GlobalAttr,
class StateAttr,
class EventAttr,
class TransAttr>
85 FD_DG(
"TdiagGenerator(" <<
this <<
")::~TdiagGenerator()");
112 Idx InsFailureTypeMapping(
const std::string& failureType,
const EventSet& rfailureEvents);
119 void InsFailureTypeMap(
const std::map<std::string,EventSet>& rFailureMap);
128 Idx GetFailureType(
Idx failureEvent)
const;
135 EventSet GetAllFailureEvents(
void)
const;
146 void InsStateLabelMapping(
Idx dStateIndex,
Idx gStateIndex,
Idx labelIndex);
175 std::string SAStr(
Idx dStateIndex)
const;
188 void DotWrite(
const std::string& rFileName)
const;
201 #ifdef FAUDES_COMPATIBILITY
221 #define THIS TdiagGenerator<GlobalAttr, StateAttr, EventAttr, TransAttr>
222 #define BASE TcGenerator<GlobalAttr, StateAttr, EventAttr, TransAttr>
223 #define TEMP template<class GlobalAttr, class StateAttr, class EventAttr, class TransAttr>
228 FD_DG(
"TdiagGenerator(" <<
this <<
")::TdiagGenerator()");
230 BASE::mReindexOnWrite=
false;
235 FD_DG(
"TdiagGenerator(" <<
this <<
")::TdiagGenerator(rOtherGen)");
237 BASE::mReindexOnWrite=
false;
242 FD_DG(
"TdiagGenerator(" <<
this <<
")::TdiagGenerator(rOtherGen)");
244 BASE::mReindexOnWrite=
false;
248 TEMP THIS::TdiagGenerator(
const std::string& rFileName) :
BASE() {
249 FD_DG(
"TDiagGenerator(" <<
this <<
")::TdiagGenerator(rFilename) : done");
251 BASE::mReindexOnWrite=
false;
252 BASE::Read(rFileName);
260 res->EventSymbolTablep(BASE::mpEventSymbolTable);
261 res->mStateNamesEnabled=BASE::mStateNamesEnabled;
262 res->mReindexOnWrite=BASE::mReindexOnWrite;
264 res->mpLabelSymbolTable=mpLabelSymbolTable;
278 TEMP Idx THIS::InsFailureTypeMapping(
const std::string& failureType,
const EventSet& rfailureEvents) {
279 return BASE::pGlobalAttribute->AddFailureTypeMapping(failureType, rfailureEvents);
283 TEMP void THIS::InsFailureTypeMap(
const std::map<std::string,EventSet>& rFailureMap) {
284 BASE::pGlobalAttribute->AddFailureTypeMap(rFailureMap);
290 return BASE::pGlobalAttribute->FailureType(failureEvent);
295 return BASE::pGlobalAttribute->AllFailureEvents();
299 TEMP void THIS::InsStateLabelMapping(
Idx dStateIndex,
Idx gStateIndex,
Idx labelIndex) {
300 BASE::StateAttributep(dStateIndex)->AddStateLabelMapping(gStateIndex, labelIndex);
306 BASE::StateAttributep(dStateIndex)->AddStateLabelMap(gState, labels);
312 BASE::StateAttribute(dStateIndex,newAttr);
316 TEMP std::string THIS::SAStr(
Idx dStateIndex)
const {
317 return BASE::StateAttribute(dStateIndex).Str();
321 TEMP void THIS::DotWrite(
const std::string& rFileName)
const {
322 FD_DG(
"TdiagGenerator(" <<
this <<
")::DotWrite(" << rFileName <<
")");
323 BASE::SetMinStateIndexMap();
324 StateSet::Iterator lit;
325 typename BASE::ATransSet::Iterator tit;
327 std::ofstream stream;
328 stream.exceptions(std::ios::badbit|std::ios::failbit);
329 stream.open(rFileName.c_str());
330 stream <<
"digraph \"" << BASE::Name() <<
"\" {" << std::endl;
331 stream <<
" rankdir=LR" << std::endl;
332 stream <<
" node [shape=box];" << std::endl;
334 stream <<
" // initial states" << std::endl;
336 for (lit = BASE::InitStatesBegin(); lit != BASE::InitStatesEnd(); ++lit) {
338 std::string xname = SAStr(*lit);
340 stream <<
" dot_dummyinit_" << i <<
" [shape=none, label=\"\" ];" << std::endl;
341 stream <<
" dot_dummyinit_" << i <<
" -> \"" << xname <<
"\";" << std::endl;
345 stream <<
" // marked states" << std::endl;
346 for (lit = BASE::MarkedStatesBegin(); lit != BASE::MarkedStatesEnd(); ++lit) {
348 std::string xname = SAStr(*lit);
350 stream <<
" \"" << xname <<
"\" [shape=doubleoctagon];" << std::endl;
353 stream <<
" // rest of stateset" << std::endl;
354 for (lit = BASE::StatesBegin(); lit != BASE::StatesEnd(); ++lit) {
355 if (! (BASE::ExistsInitState(*lit) || BASE::ExistsMarkedState(*lit)) ) {
357 std::string xname = SAStr(*lit);
359 stream <<
" \"" << xname <<
"\";" << std::endl;
364 stream <<
" // transition relation" << std::endl;
365 for (tit = BASE::TransRelBegin(); tit != BASE::TransRelEnd(); ++tit) {
367 std::string x1name = SAStr(tit->X1);
370 std::string x2name = SAStr(tit->X2);
372 stream <<
" \"" << x1name <<
"\" -> \"" << x2name
373 <<
"\" [label=\"" << BASE::EventName(tit->Ev) <<
"\"];" << std::endl;
375 stream <<
"}" << std::endl;
378 catch (std::ios::failure&) {
379 throw Exception(
"TdiagGenerator::DotWrite",
380 "Exception opening/writing dotfile \""+rFileName+
"\"", 2);
382 BASE::ClearMinStateIndexMap();
#define FD_DG(message)
Debug: optional report on generator operations.
Implements state estimates for the current status of the generator.
Implements the label representation for state estimates.
static SymbolTable * StaticLabelSymbolTablep(void)
Get pointer to static LabelSymbolTable.
Set of indices with symbolic names.
A SymbolTable associates sybolic names with indices.
Generator with controllability attributes.
Provides the structure and methods to build and handle diagnosers.
~TdiagGenerator(void)
Default destructor.
SymbolTable * mpLabelSymbolTable
Pointer to static LabelSymbolTable of DiagLabelSet.
Base class of all FAUDES generators.
Includes all libFAUDES headers, no plugins.
State estimates for the current status of the generator (as state attributes).
Failure and indicator events for a common failure type.
Contains the failure and indicator partition for a system (used as global attribute).
Includes debugging to diagnosis plug-in.
libFAUDES resides within the namespace faudes.
uint32_t Idx
Type definition for index type (allways 32bit)
TdiagGenerator< AttributeFailureTypeMap, AttributeDiagnoserState, AttributeCFlags, AttributeVoid > Diagnoser
TdiagGenerator< AttributeFailureTypeMap, AttributeDiagnoserState, AttributeCFlags, AttributeVoid > diagGenerator
Compatibility: pre 2.20b used diagGenerator as C++ class name.
std::string ToStringInteger(Int number)
integer to string