hyb_abstraction.cpp
Go to the documentation of this file.
1/** @file hyb_abstraction.cpp Abstractions based on experments on linear hybrid automata */
2
3/*
4 Hybrid systems plug-in for FAU Discrete Event Systems Library
5
6 Copyright (C) 2017 Thomas Moor, Stefan Goetz
7
8*/
9
10#include "hyb_abstraction.h"
11
12using namespace faudes;
13
14
15
16// construct/destruct
18 mpExperiment(0), mExpChanged(true) {
19}
23
24
25// set/get experiment (we own)
27 if(mpExperiment) delete mpExperiment;
28 mpExperiment=exp;
29 mExpChanged=true;
30 mTivMode=false;
31 mTvMode=false;
32}
34 if(!mpExperiment)
35 throw Exception("LbdAbstraction::Experiment()", "experiment not set yet", 90);
36 return *mpExperiment;
37}
38
39
40// refine interface
42 if(!mpExperiment)
43 throw Exception("LbdAbstraction::RefineAt(..)", "experiment not set yet", 90);
45 mExpChanged=true;
46}
47void LbdAbstraction::RefineUniformly(unsigned int depth) {
48 if(!mpExperiment)
49 throw Exception("LbdAbstraction::RefineAt(..)", "experiment not set yet", 90);
51 mExpChanged=true;
52}
53
54// access abstractions
56 // build from scartch
57 if(!mTivMode) { doTivAbstractionMG(); mTivMode=true; mTvMode=false; mExpChanged=false;}
58 // optionl inclemental methods .. put here
60 // done
61 return mAbstraction;
62}
63
64// access abstractions
66 // build from scartch
67 if(!mTvMode) { doTvAbstraction(); mTvMode=true; mTivMode=false; mExpChanged=false;}
68 // optionl inclemental methods .. put here
70 // done
71 return mAbstraction;
72}
73
74
75// workers: copy tree
77 // prepare
79 mLeaves.Clear();
81 // loop todo
82 std::stack<Idx> todo;
83 todo.push(mpExperiment->Root());
85 while(!todo.empty()) {
86 Idx nid=todo.top();
87 todo.pop();
89 if(mpExperiment->IsLeave(nid)) mLeaves.Insert(nid);
91 EventSet::Iterator eit=events.Begin();
92 for(;eit!=events.End();++eit) {
93 Idx x2=mpExperiment->SuccessorNode(nid,*eit);
95 mAbstraction.SetTransition(nid,*eit,x2);
96 todo.push(x2);
97 }
98 }
99}
100
101// workers: time variant
104 /*
105 // without dumpstate
106 StateSet::Iterator sit=mLeaves.Begin();
107 StateSet::Iterator sit_end=mLeaves.End();
108 for(;sit!=sit_end;++sit) {
109 EventSet::Iterator eit=mpExperiment->Alphabet().Begin();
110 EventSet::Iterator eit_end=mpExperiment->Alphabet().End();
111 if(mpExperiment->IsLock(*sit)) continue;
112 for(;eit!=eit_end;++eit)
113 mAbstraction.SetTransition(*sit,*eit,*sit);
114 }
115 */
116 // with dumpstate
118 EventSet::Iterator eit=mpExperiment->Alphabet().Begin();
119 EventSet::Iterator eit_end=mpExperiment->Alphabet().End();
120 for(;eit!=eit_end;++eit)
121 mAbstraction.SetTransition(qd,*eit,qd);
122 StateSet::Iterator sit=mLeaves.Begin();
123 StateSet::Iterator sit_end=mLeaves.End();
124 for(;sit!=sit_end;++sit) {
125 EventSet::Iterator eit=mpExperiment->Alphabet().Begin();
126 EventSet::Iterator eit_end=mpExperiment->Alphabet().End();
127 if(mpExperiment->IsLock(*sit)) continue;
128 for(;eit!=eit_end;++eit)
129 mAbstraction.SetTransition(*sit,*eit,qd);
130 }
131
132
133}
134
135// workers: time invariant (Moor/Goetz style)
138 StateSet::Iterator sit=mLeaves.Begin();
139 StateSet::Iterator sit_end=mLeaves.End();
140 // assert: root must not be a leave here
141 for(;sit!=sit_end;++sit) {
142 if(mpExperiment->IsLock(*sit)) continue;
143 std::deque<Idx> seq=mpExperiment->Sequence(*sit);
144 while(seq.size()>0) {
145 seq.pop_front();
146 Idx x1=mpExperiment->Find(seq);
147 if(x1==0) continue;
148 if(mpExperiment->IsLock(x1)) break;
149 if(mpExperiment->IsLeave(x1)) continue;
151 EventSet::Iterator eit=events.Begin();
152 EventSet::Iterator eit_end=events.End();
153 for(;eit!=eit_end;++eit) {
154 Idx x2=mpExperiment->SuccessorNode(x1,*eit);
155 mAbstraction.SetTransition(*sit,*eit,x2);
156 }
157 break;
158 }
159 }
160}
161
162// workers: time invariant (Raisch/Yang style)
164 // prepare
166 mLeaves.Clear();
168 // loop todo: copy tree except leaves
169 // should assert that root is not a leave
170 std::stack<Idx> todo;
171 todo.push(mpExperiment->Root());
173 while(!todo.empty()) {
174 Idx nid=todo.top();
175 todo.pop();
176 if(mpExperiment->IsLeave(nid)) mLeaves.Insert(nid);
178 EventSet::Iterator eit=events.Begin();
179 for(;eit!=events.End();++eit) {
180 Idx x2=mpExperiment->SuccessorNode(nid,*eit);
181 if(mpExperiment->IsLeave(x2) && !mpExperiment->IsLock(x2)) continue;
184 mAbstraction.SetTransition(nid,*eit,x2);
185 todo.push(x2);
186 }
187 }
188 // fix ends
189 StateSet::Iterator sit=mAbstraction.StatesBegin();
190 StateSet::Iterator sit_end=mAbstraction.StatesEnd();
191 for(;sit!=sit_end;++sit) {
192 if(mpExperiment->IsLock(*sit)) continue;
193 EventSet events=mpExperiment->EnabledEvents(*sit);
194 EventSet::Iterator eit=events.Begin();
195 for(;eit!=events.End();++eit) {
196 if(mAbstraction.ExistsTransition(*sit,*eit)) continue;
197 std::deque<Idx> seq=mpExperiment->Sequence(*sit);
198 seq.push_back(*eit);
199 while(seq.size()>0) {
200 seq.pop_front();
201 Idx x2=mpExperiment->Find(seq);
202 if(x2==0) continue;
203 mAbstraction.SetTransition(*sit,*eit,x2);
204 break;
205 }
206 }
207 }
208}
bool IsLock(Idx nid) const
bool IsLeave(Idx nid) const
void RefineUniformly(unsigned int depth)
Idx Find(const std::deque< Idx > &seq) const
EventSet EnabledEvents(Idx nid) const
Idx Root(void) const
const EventSet & Alphabet(void) const
std::deque< Idx > Sequence(Idx nid) const
Idx SuccessorNode(Idx nid, Idx ev) const
void RefineUniformly(unsigned int depth)
const Generator & TivAbstraction(void)
const Generator & TvAbstraction(void)
faudes::Experiment * mpExperiment
const faudes::Experiment & Experiment(void)
StateSet::Iterator StatesBegin(void) const
bool SetTransition(Idx x1, Idx ev, Idx x2)
bool ExistsTransition(const std::string &rX1, const std::string &rEv, const std::string &rX2) const
StateSet::Iterator StatesEnd(void) const
virtual void Clear(void)
void InjectAlphabet(const EventSet &rNewalphabet)
virtual void Clear(void)
Iterator End(void) const
Iterator Begin(void) const
uint32_t Idx

libFAUDES 2.34e --- 2026.03.16 --- c++ api documentaion by doxygen