mtc_2_functions.cpp
Go to the documentation of this file.
1/** @file mtc_2_functions.cpp
2
3Tutorial, MtcSystem functions eg parallel, project etc.
4
5
6@ingroup Tutorials
7
8@include mtc_2_functions.cpp
9*/
10
11
12#include "libfaudes.h"
13
14
15// Make the faudes namespace available to our program
16using namespace faudes;
17
18
19/////////////////
20// main program
21/////////////////
22
23int main() {
24 {
25 // create generator which is not accessible and not strongly, but weakly coaccessible
26 MtcSystem original, accNotStrCoac, notAccStrCoac, strTrim;
27
28 // the implementation below allows the user to easily change the generators
29 // and to find out what the algorithms effect when being applied on them
30 Idx st1 = original.InsState("1");
31 Idx st2 = original.InsState("2");
32 Idx st3 = original.InsState("3");
33 Idx st4 = original.InsState("4");
34 Idx st5 = original.InsState("5");
35 Idx st6 = original.InsColoredState("6", "c6a");
36
37 Idx eva = original.InsEvent("a");
38 Idx evb = original.InsEvent("b");
39 Idx evc = original.InsEvent("c");
40 Idx evd = original.InsEvent("d");
41
42 original.InsColor(st3, "c3");
43 original.InsColor(st4, "c4");
44 original.InsColor(st6, "c6b");
45
46 original.SetTransition(st1, eva, st2);
47 original.SetTransition(st2, evb, st3);
48 original.SetTransition(st2, evc, st4);
49 original.SetTransition(st4, evc, st6);
50 original.SetTransition(st5, eva, st4);
51 original.SetTransition(st6, evd, st1);
52 original.SetTransition(st3, evd, st3);
53
54 original.SetInitState(st1);
55
56 original.Write("tmp_mtc_functions_1a_not_trim.gen");
57 original.GraphWrite("tmp_mtc_functions_1a_not_trim.png");
58
59 ////////////////////////////////////////////////////
60 // analyze a generator's accessibility properties
61 ////////////////////////////////////////////////////
62 if (!original.IsAccessible())
63 std::cout << std::endl << "Original generator is not accessible" << std::endl;
64 if (!original.IsStronglyCoaccessible())
65 std::cout << "Original generator is not strongly coaccessible" << std::endl;
66 if (!original.IsStronglyTrim())
67 std::cout << "Original generator is not strongly trim" << std::endl << std::endl;
68
69 ////////////////////////////////////////////////////
70 // generate accessible version of original generator
71 ////////////////////////////////////////////////////
72 accNotStrCoac = original;
73 accNotStrCoac.Accessible();
74
75 accNotStrCoac.Write("tmp_mtc_functions_1b_acc.gen");
76 accNotStrCoac.GraphWrite("tmp_mtc_functions_1b_acc.png");
77
78 if (accNotStrCoac.IsAccessible())
79 std::cout << "accNotStrCoac is accessible" << std::endl;
80 if (!accNotStrCoac.IsStronglyTrim())
81 std::cout << "accNotStrCoac is not strongly trim" << std::endl << std::endl;
82
83 // generate strongly coaccessible version of original generator
84 notAccStrCoac = original;
85 notAccStrCoac.StronglyCoaccessible();
86
87 notAccStrCoac.Write("tmp_mtc_functions_1c_str_trim.gen");
88 notAccStrCoac.GraphWrite("tmp_mtc_functions_1c_str_trim.png");
89
90 if (notAccStrCoac.IsStronglyCoaccessible())
91 std::cout << "notAccStrCoac is strongly coaccessible" << std::endl;
92 if (!notAccStrCoac.IsStronglyTrim())
93 std::cout << "notAccStrCoac is not strongly trim" << std::endl << std::endl;
94
95 // generate trim version of original generator
96 strTrim = original;
97 strTrim.StronglyTrim();
98
99 strTrim.Write("tmp_mtc_functions_1d_str_trim.gen");
100 strTrim.GraphWrite("tmp_mtc_functions_1d_str_trim.png");
101
102 if (strTrim.IsAccessible())
103 std::cout << "strTrim is accessible" << std::endl;
104 if (strTrim.IsStronglyCoaccessible())
105 std::cout << "strTrim is strongly coaccessible" << std::endl;
106 if (strTrim.IsStronglyTrim())
107 std::cout << "strTrim is strongly trim" << std::endl << std::endl;
108 }
109
110 {
111 // create nondeterministic generator nondet, deterministic version to compute shall be saved as det
112 MtcSystem nondet, det;
113
114 // the implementation below allows the user to easily change the generators
115 // and to find out what the algorithms effect when being applied on them
116 Idx st1 = nondet.InsState("1");
117 Idx st2 = nondet.InsState("2");
118 Idx st3 = nondet.InsState("3");
119 Idx st4 = nondet.InsState("4");
120 Idx st5 = nondet.InsState("5");
121 Idx st6 = nondet.InsColoredState("6", "c6a");
122
123 Idx eva = nondet.InsEvent("a");
124 Idx evb = nondet.InsEvent("b");
125 Idx evc = nondet.InsEvent("c");
126
127 nondet.InsColor(st3, "c3");
128 nondet.InsColor(st4, "c4");
129 nondet.InsColor(st5, "c5");
130 nondet.InsColor(st6, "c6b");
131
132 nondet.SetTransition(st1, eva, st2);
133 nondet.SetTransition(st2, evb, st3);
134 nondet.SetTransition(st2, evb, st4);
135 nondet.SetTransition(st4, evc, st6);
136 nondet.SetTransition(st5, eva, st4);
137
138 nondet.SetInitState(st1);
139 nondet.SetInitState(st5);
140
141 nondet.Write("tmp_mtc_functions_2a_nondet.gen");
142 nondet.GraphWrite("tmp_mtc_functions_2a_nondet.png");
143
144 //////////////////////////////////////////////////
145 // make nondeterministic generator deterministic
146 //////////////////////////////////////////////////
147 mtcDeterministic(nondet, det);
148
149 det.Write("tmp_mtc_functions_2b_det.gen");
150 det.GraphWrite("tmp_mtc_functions_2b_det.png");
151 }
152
153 {
154 EventSet evset;
155 evset.Insert("a");
156 evset.Insert("b");
157 evset.Insert("d");
158
159 MtcSystem original, projected;
160
161 Idx st1 = original.InsState("1");
162 Idx st2 = original.InsState("2");
163 Idx st3 = original.InsState("3");
164 Idx st4 = original.InsState("4");
165 Idx st5 = original.InsState("5");
166
167 Idx eva = original.InsEvent("a");
168 Idx evb = original.InsEvent("b");
169 Idx evc = original.InsEvent("c");
170 Idx evd = original.InsEvent("d");
171
172 original.InsColor(st2, "color2");
173 original.InsColor(st3, "color3");
174
175 original.SetTransition(st1, eva, st2);
176 original.SetTransition(st2, evb, st3);
177 original.SetTransition(st2, evc, st4);
178 original.SetTransition(st3, evc, st5);
179 original.SetTransition(st4, evb, st5);
180 original.SetTransition(st5, evd, st1);
181
182 original.SetInitState(st1);
183
184 original.StateNamesEnabled(false);
185 original.Write("tmp_mtc_functions_3a_system.gen");
186 original.GraphWrite("tmp_mtc_functions_3a_system.png");
187
188 // Write state sets for colored and uncolored states to console
189 // original.ColoredStates().Write();
190 // original.UncoloredStates().Write();
191
192 //////////////////////////////////////////////////////////////
193 // compute projection for alphabet evset and the original
194 // generator result is deterministic and saved in projected
195 //////////////////////////////////////////////////////////////
196 mtcProject(original, evset, projected);
197
198 projected.Write("tmp_mtc_functions_3b_projected.gen");
199 projected.GraphWrite("tmp_mtc_functions_3b_projected.png");
200
201 //////////////////////////////////////////////////////////////
202 // compute original generator to its projected version for the
203 // alphabet evset result is nondeterministic
204 //////////////////////////////////////////////////////////////
205 mtcProjectNonDet(original, evset);
206
207 original.Write("tmp_mtc_functions_3c_projected_nondet.gen");
208 original.GraphWrite("tmp_mtc_functions_3c_projected_nondet.png");
209 }
210
211 {
212 // create two generators for parallel composition and compose them to gen_ab
213 MtcSystem gen_a, gen_b, gen_ab;
214
215 // generator a
216 Idx sta1 = gen_a.InsInitState("1");
217 Idx sta2 = gen_a.InsState("2");
218
219 gen_a.InsColor(sta2, "Color_1");
220
221 Idx evaa = gen_a.InsEvent("a");
222 Idx evab = gen_a.InsEvent("b");
223
224 gen_a.SetTransition(sta1, evaa, sta2);
225 gen_a.SetTransition(sta2, evab, sta1);
226
227 gen_a.Write("tmp_mtc_functions_4a_system.gen");
228 gen_a.GraphWrite("tmp_mtc_functions_4a_system.png");
229
230 // generator b
231 Idx stb1 = gen_b.InsInitState("1");
232 Idx stb2 = gen_b.InsState("2");
233
234 gen_b.InsColor(stb1, "Color_1");
235 gen_b.InsColor(stb2, "Color_2");
236
237 Idx evba = gen_b.InsEvent("a");
238 Idx evbc = gen_b.InsEvent("c");
239
240 gen_b.SetTransition(sta1, evba, sta2);
241 gen_b.SetTransition(sta2, evbc, sta1);
242
243 gen_b.Write("tmp_mtc_functions_4b_system.gen");
244 gen_b.GraphWrite("tmp_mtc_functions_4b_system.png");
245
246 /////////////////////////////////////////////
247 // Compute the parallel composition gen_ab of
248 // these two colored marking generators
249 /////////////////////////////////////////////
250 mtcParallel(gen_a, gen_b, gen_ab);
251
252 gen_ab.Write("tmp_mtc_functions_4c_parallel.gen");
253 gen_ab.GraphWrite("tmp_mtc_functions_4c_parallel.png");
254 }
255
256
257 {
258 // create model model and specification spec for
259 // computing a strongly nonblocking supervisor sup
260 MtcSystem model, spec, sup, sup_nb;
261
262 // generator model
263 Idx stm1 = model.InsInitState("1");
264 Idx stm2 = model.InsState("2");
265 Idx stm3 = model.InsState("3");
266 Idx stm4 = model.InsState("4");
267 Idx stm5 = model.InsState("5");
268 Idx stm6 = model.InsState("6");
269
270 model.InsColor(stm1, "Color_1");
271 model.InsColor(stm6, "Color_2");
272
273 Idx evma = model.InsControllableEvent("a");
274 Idx evmb = model.InsControllableEvent("b");
275 Idx evmc = model.InsControllableEvent("c");
276
277 model.SetTransition(stm1, evmb, stm2);
278 model.SetTransition(stm2, evma, stm3);
279 model.SetTransition(stm2, evmc, stm4);
280 model.SetTransition(stm4, evma, stm6);
281 model.SetTransition(stm1, evmc, stm5);
282 model.SetTransition(stm5, evmb, stm6);
283 model.SetTransition(stm6, evma, stm1);
284
285 model.Write("tmp_mtc_functions_5_plant.gen");
286 model.GraphWrite("tmp_mtc_functions_5_plant.png");
287
288 // generator spec
289 Idx sts1 = spec.InsInitState("1");
290 Idx sts2 = spec.InsState("2");
291
292 Idx evsb = spec.InsControllableEvent("b");
293 Idx evsc = spec.InsControllableEvent("c");
294
295 spec.SetTransition(sts1, evsb, sts2);
296 spec.SetTransition(sts2, evsc, sts1);
297
298 spec.Write("tmp_mtc_functions_5_spec.gen");
299 spec.GraphWrite("tmp_mtc_functions_5_spec.png");
300
301 /////////////////////////////////////////////////////////
302 // Inverse projection adds missing events by inserting
303 // self-loops into all automaton's states
304 /////////////////////////////////////////////////////////
305 mtcInvProject(spec, model.Alphabet());
306
307 spec.Write("tmp_mtc_functions_5_spec_invpro.gen");
308 spec.GraphWrite("tmp_mtc_functions_5_spec_invpro.png");
309
310 /////////////////////////////////////////////////////////
311 // Supervisor computation
312 /////////////////////////////////////////////////////////
313 mtcSupConClosed(model, spec, sup);
314
315 sup.Write("tmp_mtc_functions_5_super.gen");
316 sup.GraphWrite("tmp_mtc_functions_5_super.png");
317
318 /////////////////////////////////////////////
319 // Nonblocking supervisor computation
320 /////////////////////////////////////////////
321 mtcSupCon(model, spec, sup_nb);
322
323 sup_nb.Write("tmp_mtc_functions_5_supernb.gen");
324 sup_nb.GraphWrite("tmp_mtc_functions_5_supernb.png");
325 }
326
327}
328
bool Insert(const Idx &rIndex)
bool InsEvent(Idx index)
const TaEventSet< EventAttr > & Alphabet(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
void InsControllableEvent(Idx index)
Idx InsColoredState(const std::string &rStateName, const std::string &rColorName)
bool IsStronglyTrim(void) const
Idx InsColor(Idx stateIndex, const std::string &rColorName)
bool StronglyCoaccessible(void)
bool IsStronglyCoaccessible(void) const
void Write(const Type *pContext=0) const
bool IsAccessible(void) const
void SetInitState(Idx index)
bool StateNamesEnabled(void) const
void GraphWrite(const std::string &rFileName, const std::string &rOutFormat="", const std::string &rDotExec="dot") const
void mtcProject(const MtcSystem &rGen, const EventSet &rProjectAlphabet, MtcSystem &rResGen)
void mtcSupConClosed(const MtcSystem &rPlantGen, const MtcSystem &rSpecGen, MtcSystem &rResGen)
void mtcInvProject(MtcSystem &rGen, const EventSet &rProjectAlphabet)
void mtcProjectNonDet(MtcSystem &rGen, const EventSet &rProjectAlphabet)
void mtcDeterministic(const MtcSystem &rGen, MtcSystem &rResGen)
void mtcSupCon(const MtcSystem &rPlantGen, const MtcSystem &rSpecGen, MtcSystem &rResGen)
void mtcParallel(const MtcSystem &rGen1, const MtcSystem &rGen2, MtcSystem &rResGen)
int main()
uint32_t Idx

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