hio_plant.cpp
Go to the documentation of this file.
1/** @file hio_plant.cpp Generator with I/O-plant attributes */
2
3/* Hierarchical IO Systems Plug-In for FAU Discrete Event Systems Library (libfaudes)
4
5 Copyright (C) 2006 Sebastian Perk
6 Copyright (C) 2006 Thomas Moor
7 Copyright (C) 2006 Klaus Schmidt
8
9*/
10
11#include "hio_plant.h"
12
13namespace faudes {
14
15// IsHioPlantForm()
16bool IsHioPlantForm(HioPlant& rHioPlant,
17 StateSet& rQYpYe,
18 StateSet& rQUp,
19 StateSet& rQUe,
20 EventSet& rErrEvSet,
21 TransSet& rErrTrSet,
22 StateSet& rErrStSet,
23 std::string& rReportStr)
24 {
25 FD_DF("IsHioPlantForm("<< rHioPlant.Name() << ",...)");
26
27 // prepare results
28 rQYpYe.Clear();
29 rQUp.Clear();
30 rQUe.Clear();
31
32 rErrEvSet.Clear();
33 rErrEvSet.Name("rErrEvSet");
34
35 rErrTrSet.Clear();
36 rErrTrSet.Name("rErrTrSet");
37
38 rErrStSet.Clear();
39 rErrStSet.Name("rErrStSet");
40
41 // used to locally store error states/transitions on each condition
42 StateSet locErrStSet;
43 TransSet locErrTrSet;
44
45 rReportStr.clear();
46
47 // meant to be set false on violation of any condition:
48 bool finalResult = true;
49 // used to locally store result on each condition
50 bool localResult = true;
51
52 // helpers
53
54 EventSet yp = rHioPlant.YpEvents();
55 EventSet up = rHioPlant.UpEvents();
56 EventSet ye = rHioPlant.YeEvents();
57 EventSet ue = rHioPlant.UeEvents();
58
59 StateSet initStates = rHioPlant.InitStates();
60 StateSet accessibleStates = rHioPlant.AccessibleSet();
61
62 EventSet::Iterator evit;
63 StateSet::Iterator sit;
65
66 // Info string header
67 rReportStr.append("#########################################################\n");
68 rReportStr.append("########## IsHioPlantForm("+rHioPlant.Name()+",...) - test results:\n");
69
70 /**************************** Precondition: determinism ***********************/
71 // HioPlant must be deterministic
72 if(!rHioPlant.IsDeterministic()){
73 rReportStr.append("##### fail: generator is not deterministic!\n");
74 if(initStates.Size()>1) {
75 rErrStSet = initStates;
76 rReportStr.append("##### (amongst others, there is more than one initial state)\n");
77 }
78 finalResult = false;
79 }
80
81 rReportStr.append("#####\n");
82
83 // test all conditions verifying I/O-plant form:
84
85 /**************************** Condition (i) ***********************/
86 localResult = true;
87 rReportStr.append("########## Condition (i):\n");
88
89 //YP, UP, YE, UE nonempty?
90 if (yp.Empty()) {
91 rReportStr.append("##### fail: empty YP alphabet.\n");
92 localResult=false;
93 finalResult = false;
94 }
95 if (up.Empty()) {
96 rReportStr.append("##### fail: empty UP alphabet.\n");
97 localResult=false;
98 finalResult = false;
99 }
100 if (ye.Empty()) {
101 rReportStr.append("##### fail: empty YE alphabet.\n");
102 localResult=false;
103 finalResult = false;
104 }
105 if (ue.Empty()) {
106 rReportStr.append("##### fail: empty UE alphabet.\n");
107 localResult=false;
108 finalResult = false;
109 }
110
111 // check for disjoint eventsets YP, YE, UP, UE and for
112 // YP u YE u UP u UE == Sigma, ie unique HioEventFlags.
113 // note: testing disjoint P- and E-Alphabet is sufficient
114 // as properties U and Y are exclusive by construction.
115
116 rErrEvSet=(rHioPlant.PEvents()*rHioPlant.EEvents()) + (rHioPlant.Alphabet()-rHioPlant.PEvents()-rHioPlant.EEvents());
117
118 // In case of failing condition (i) further inspection is omitted, as too many consecutive faults are expected.
119 if(!rErrEvSet.Empty()){
120 rReportStr.append("##### fail: found events with missing or ambiguous attribute, see rErrEvSet:\n");
121 rReportStr.append(rErrEvSet.ToString()+"\n");
122 rReportStr.append("##### Condition (i) failed.\n");
123 rReportStr.append("########## Termination due to crucial failure. ##########\n");
124 rReportStr.append("#########################################################\n");
125 return false;
126 }
127 if(localResult) rReportStr.append("##### Condition (i) passed.\n");
128 else rReportStr.append("##### Condition (i) failed.\n");
129 rReportStr.append("#####\n");
130 /*************************** Condition (i) finished *****************************/
131
132
133 /*************************** Condition (ii) ***********************/
134 localResult = true;
135 rReportStr.append("########## Condition (ii):\n");
136
137 // check if in states QYpYe, QUp and QUe only Y-, UP- and UE-events are active, respectively.
138 for(sit = accessibleStates.Begin(); sit != accessibleStates.End(); ++sit) {
139
140 bool isY = false;
141 bool isUp = false;
142 bool isUe = false;
143 bool goodState = true;
144
145 EventSet activeEv = rHioPlant.ActiveEventSet(*sit);
146
147 if(activeEv.Empty()) {
148 //deadlocks are always QYpYe -states
149 rQYpYe.Insert(*sit);
150 rHioPlant.SetQYpYe(*sit);
151 }
152 else {
153
154 // get attribute of first event and compare with remaining events
155 evit = activeEv.Begin();
156 isY = rHioPlant.IsY(*evit);
157 isUp = rHioPlant.IsUp(*evit);
158 isUe = rHioPlant.IsUe(*evit);
159
160 for(; evit != activeEv.End(); evit++) {
161 if( (isY && !rHioPlant.IsY(*evit)) ||
162 (isUp && !rHioPlant.IsUp(*evit)) ||
163 (isUe && !rHioPlant.IsUe(*evit)) ) {
164 goodState = false;
165 localResult = false;
166 finalResult = false;
167 // add state to error set, go to next state
168 locErrStSet.Insert(*sit);
169 rErrStSet.Insert(*sit);
170 break; // leave loop over active events
171 }
172 }
173
174 activeEv.Clear();
175
176 if(!goodState) continue; // if undecidable go on with next state
177
178 // set state attribute
179 if(isY) {
180 rQYpYe.Insert(*sit);
181 rHioPlant.SetQYpYe(*sit);
182 }
183 else if(isUp) {
184 rQUp.Insert(*sit);
185 rHioPlant.SetQUp(*sit);
186 }
187 else if(isUe){
188 rQUe.Insert(*sit);
189 rHioPlant.SetQUe(*sit);
190 }
191 }
192 }
193
194 if(localResult) rReportStr.append("##### Condition (ii) passed.\n");
195 // In case of failing condition (ii) further inspection is omitted, as too many consecutive faults are expected.
196 else {
197 rReportStr.append("##### fail: found states with undecidable attribute:\n");
198 rReportStr.append(locErrStSet.ToString()+"\n");
199 locErrStSet.Clear();
200 rReportStr.append("##### Condition (ii) failed.\n");
201 rReportStr.append("########## Termination due to crucial failure. ##########\n");
202 rReportStr.append("###################### No success. ######################\n");
203 rReportStr.append("#########################################################\n");
204 return false;
205 }
206 rReportStr.append("#####\n");
207 /*************************** Condition (ii) finished ****************************/
208
209
210 /*************************** Condition (iii) **********************/
211 localResult = true;
212 rReportStr.append("########## Condition (iii):\n");
213
214 //check if the initial state is a QYpYe-state
215 if(!(initStates <= rQYpYe)) {
216 rReportStr.append("##### fail: some init state(s) is (are) not a QYpYe-state:\n");
217 locErrStSet=initStates-rQYpYe;
218 rErrStSet.InsertSet(locErrStSet);
219 rReportStr.append(locErrStSet.ToString()+"\n");
220 locErrStSet.Clear();
221 localResult = false;
222 finalResult = false;
223 }
224 if(localResult) rReportStr.append("##### Condition (iii) passed.\n");
225 else rReportStr.append("##### Condition (iii) failed.\n");
226 rReportStr.append("#####\n");
227
228 /*************************** Condition (iii) finished ***************************/
229
230
231 /*************************** Condition (iv) ***********************/
232 localResult = true;
233 rReportStr.append("########## Condition (iv):\n");
234
235 // YP-events have to lead to a QUp-state, while a YE-events
236 // have to lead to a QUe-state.
237 for(sit = rQYpYe.Begin(); sit != rQYpYe.End(); ++sit) {
238 for(tit = rHioPlant.TransRelBegin(*sit); tit != rHioPlant.TransRelEnd(*sit); ++tit) {
239 // YP-event to QUp-state, YE-event to QUe-state
240 if( (rHioPlant.IsYp(tit->Ev) && !(rQUp.Exists(tit->X2) || rQUe.Exists(tit->X2)))) {
241 // add transition to error transition set
242 rErrTrSet.Insert(*tit);
243 locErrTrSet.Insert(*tit);
244 finalResult = false;
245 localResult = false;
246 }
247 }
248 }
249
250 if(localResult) rReportStr.append("##### Condition (iv) passed.\n");
251 else {
252 rReportStr.append("##### fail: found YP- or YE-transitions leading to wrong states:\n");
253 rReportStr.append(locErrTrSet.ToString()+"\n");
254 locErrTrSet.Clear();
255 rReportStr.append("##### Condition (iv) failed.\n");
256 }
257 rReportStr.append("#####\n");
258 /*************************** Condition (iv) finished ****************************/
259
260
261 /*************************** Condition (v) ************************/
262 localResult = true;
263 rReportStr.append("########## Condition (v):\n");
264
265 // UP-events have to lead to a QYpYe-state
266 for(sit = rQUp.Begin(); sit != rQUp.End(); ++sit) {
267 for(tit = rHioPlant.TransRelBegin(*sit); tit != rHioPlant.TransRelEnd(*sit); ++tit) {
268 if(!rQYpYe.Exists(tit->X2)) {
269 rErrTrSet.Insert(*tit);
270 locErrTrSet.Insert(*tit);
271 finalResult = false;
272 localResult = false;
273 }
274 }
275 }
276
277 if(localResult) rReportStr.append("##### Condition (v) passed.\n");
278 else {
279 rReportStr.append("##### fail: found UP-transitions leading to wrong states:\n");
280 rReportStr.append(locErrTrSet.ToString()+"\n");
281 locErrTrSet.Clear();
282 rReportStr.append("##### Condition (v) failed.\n");
283 }
284 rReportStr.append("#####\n");
285 /*************************** Condition (v) finished *****************************/
286
287
288 /*************************** Condition (vi) ***********************/
289 localResult = true;
290 rReportStr.append("########## Condition (vi):\n");
291
292 // UE-events have to lead to a QYpYe-state
293 for(sit = rQUe.Begin(); sit != rQUe.End(); ++sit) {
294 for(tit = rHioPlant.TransRelBegin(*sit); tit != rHioPlant.TransRelEnd(*sit); ++tit) {
295 if(!rQYpYe.Exists(tit->X2)) {
296 rErrTrSet.Insert(*tit);
297 locErrTrSet.Insert(*tit);
298 finalResult = false;
299 localResult = false;
300 }
301 }
302 }
303
304 if(localResult) rReportStr.append("##### Condition (vi) passed.\n");
305 else {
306 rReportStr.append("##### fail: found UE-transitions leading to wrong states:\n");
307 rReportStr.append(locErrTrSet.ToString()+"\n");
308 locErrTrSet.Clear();
309 rReportStr.append("##### Condition (vi) failed.\n");
310 }
311 rReportStr.append("#####\n");
312 /*************************** Condition (vi) finished ****************************/
313
314
315 /*************************** Condition (vii) **********************/
316 localResult = true;
317 rReportStr.append("########## Condition (vii):\n");
318
319 // UP must be free in QUp-states
320 for(sit = rQUp.Begin(); sit != rQUp.End(); ++sit) {
321
322 if(!(up <= rHioPlant.ActiveEventSet(*sit))) {
323 rErrStSet.Insert(*sit);
324 locErrStSet.Insert(*sit);
325 finalResult = false;
326 localResult = false;
327 }
328 }
329
330 if(localResult) rReportStr.append("##### Condition (vii) passed.\n");
331 else {
332 rReportStr.append("##### fail: found QUp-states with inactive UP-events:\n");
333 rReportStr.append(locErrStSet.ToString()+"\n");
334 locErrStSet.Clear();
335 rReportStr.append("##### Condition (vii) failed.\n");
336 }
337 rReportStr.append("#####\n");
338 /*************************** Condition (vii) finished ***************************/
339
340
341 /*************************** Condition (viii) **********************/
342 localResult = true;
343 rReportStr.append("########## Condition (viii):\n");
344
345 // UE must be free in QUe-states
346 for(sit = rQUe.Begin(); sit != rQUe.End(); ++sit) {
347
348 if(!(ue <= rHioPlant.ActiveEventSet(*sit))) {
349 rErrStSet.Insert(*sit);
350 locErrStSet.Insert(*sit);
351 finalResult = false;
352 localResult = false;
353 }
354 }
355
356 if(localResult) rReportStr.append("##### Condition (viii) passed.\n");
357 else {
358 rReportStr.append("##### fail: found QUe-states with inactive UE-events:\n");
359 rReportStr.append(locErrStSet.ToString()+"\n");
360 locErrStSet.Clear();
361 rReportStr.append("##### Condition (viii) failed.\n");
362 }
363 rReportStr.append("#####\n");
364 /*************************** Condition (vii) finished ***************************/
365
366 //###### Condition ix is outdated since we introduced marking!!!
367 // /*************************** Condition (ix) ***********************/
368 // localResult = true;
369 // rReportStr.append("########## Condition (ix):\n");
370
371 // // Qm==Q?
372 // if(!(accessibleStates<=rHioPlant.MarkedStates())) {
373 // finalResult = false;
374 // localResult = false;
375 // }
376
377 // if(localResult) rReportStr.append("##### Condition (ix) passed.\n");
378 // else {
379 // rReportStr.append("##### fail: not all accessible states are marked:\n");
380 // locErrStSet = accessibleStates - rHioPlant.MarkedStates();
381 // rErrStSet.InsertSet(locErrStSet);
382 // rReportStr.append(locErrStSet.ToString()+"\n");
383 // locErrStSet.Clear();
384 // rReportStr.append("##### Condition (ix) failed.\n");
385 // }
386 // rReportStr.append("#####\n");
387 // /*************************** Condition (ix) finished ****************************/
388
389
390 /*************************** Condition (x) ************************/
391 rReportStr.append("########## Condition (x):\n");
392
393 // make accessible if necessary
394 if(!rHioPlant.IsAccessible()) {
395 rHioPlant.Accessible();
396 rReportStr.append("##### warning: non-accessible states have been removed.\n");
397 rReportStr.append("##### Condition (x) repaired.\n");
398 }
399 else rReportStr.append("##### Condition (x) passed.\n");
400 /*************************** Condition (x) finished *****************************/
401
402
403
404 /*************************** Final Result ************************/
405
406 rReportStr.append("##################### Final result: #####################\n");
407 if(finalResult) {
408 rReportStr.append("############## Generator is in HioPlantForm. ##############\n");
409 rReportStr.append("#########################################################\n");
410 return true;
411 }
412 else {
413 rReportStr.append("############ Generator is NOT in HioPlantForm. ###########\n");
414 rReportStr.append("#########################################################\n");
415 return false;
416 }
417
418}// END OF IsHioPlantForm()
419
420
421//IsHioPlantForm wrapper functions
422bool IsHioPlantForm(HioPlant& rHioPlant, std::string& rReportStr)
423{
424 StateSet QYpYe, QUp, QUe;
425 EventSet ErrEvSet;
426 TransSet ErrTrSet;
427 StateSet ErrStSet;
428
429 return IsHioPlantForm(rHioPlant, QYpYe, QUp, QUe, ErrEvSet, ErrTrSet, ErrStSet,rReportStr);
430}
431
432// rti function interface
433bool IsHioPlantForm(HioPlant& rHioPlant)
434{
435 StateSet QYpYe, QUp, QUe;
436 EventSet ErrEvSet;
437 TransSet ErrTrSet;
438 StateSet ErrStSet;
439 std::string ReportStr;
440
441 return IsHioPlantForm(rHioPlant, QYpYe, QUp, QUe, ErrEvSet, ErrTrSet, ErrStSet,ReportStr);
442}
443
444// rti function interface
445void HioStatePartition(HioPlant& rHioPlant) {
446 IsHioPlantForm(rHioPlant);
447}
448
449} // end namespace
#define FD_DF(message)
const std::string & Name(void) const
bool IsUp(Idx index) const
Definition hio_plant.h:1095
void SetQYpYe(Idx index)
Definition hio_plant.h:1317
EventSet EEvents(void) const
Definition hio_plant.h:1300
bool IsUe(Idx index) const
Definition hio_plant.h:1229
bool IsY(Idx index) const
Definition hio_plant.h:949
void SetQUe(Idx index)
Definition hio_plant.h:1480
EventSet UeEvents(void) const
Definition hio_plant.h:1252
EventSet UpEvents(void) const
Definition hio_plant.h:1118
bool IsYp(Idx index) const
Definition hio_plant.h:1083
EventSet PEvents(void) const
Definition hio_plant.h:1289
void SetQUp(Idx index)
Definition hio_plant.h:1398
EventSet YpEvents(void) const
Definition hio_plant.h:1107
EventSet YeEvents(void) const
Definition hio_plant.h:1241
bool Insert(const Transition &rTransition)
const TaEventSet< EventAttr > & Alphabet(void) const
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
EventSet ActiveEventSet(Idx x1) const
const StateSet & InitStates(void) const
TransSet::Iterator TransRelBegin(void) const
bool IsAccessible(void) const
StateSet AccessibleSet(void) const
TransSet::Iterator TransRelEnd(void) const
bool IsDeterministic(void) const
bool Empty(void) const
bool Exists(const T &rElem) const
virtual void Clear(void)
Iterator End(void) const
virtual void InsertSet(const TBaseSet &rOtherSet)
Iterator Begin(void) const
Idx Size(void) const
void HioStatePartition(HioConstraint &rHioConstraint)
bool IsHioPlantForm(HioPlant &rHioPlant, StateSet &rQYpYe, StateSet &rQUp, StateSet &rQUe, EventSet &rErrEvSet, TransSet &rErrTrSet, StateSet &rErrStSet, std::string &rReportStr)
Definition hio_plant.cpp:16

libFAUDES 2.33k --- 2025.09.16 --- c++ api documentaion by doxygen