Merge lp:~verifydtapn-contributers/verifydtapn/urgentTransitions into lp:verifydtapn
- urgentTransitions
- Merge into trunk
Proposed by
Peter Gjøl Jensen
Status: | Merged |
---|---|
Approved by: | Jiri Srba |
Approved revision: | 439 |
Merged at revision: | 283 |
Proposed branch: | lp:~verifydtapn-contributers/verifydtapn/urgentTransitions |
Merge into: | lp:verifydtapn |
Diff against target: |
300 lines (+91/-22) 8 files modified
src/Core/ArgsParser.hpp (+1/-1) src/Core/TAPN/TimedTransition.cpp (+24/-2) src/Core/TAPN/TimedTransition.hpp (+6/-2) src/Core/TAPNParser/TAPNXmlParser.cpp (+9/-1) src/DiscreteVerification/SuccessorGenerator.hpp (+27/-6) src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp (+10/-5) src/DiscreteVerification/VerificationTypes/ReachabilitySearch.cpp (+10/-5) src/DiscreteVerification/VerificationTypes/TimeDartVerification.hpp (+4/-0) |
To merge this branch: | bzr merge lp:~verifydtapn-contributers/verifydtapn/urgentTransitions |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mathias Grund Sørensen | Approve | ||
Jakob Taankvist | Approve | ||
Jiri Srba | Approve | ||
Review via email: mp+176040@code.launchpad.net |
Commit message
Description of the change
Implementation of urgent transitions for the pointwise engine.
The only major change is the return-type of the successor-generator which now returns "Query Satisfied", "Query Unsatisfied" and "Urgent Enabled" to be able to allow/disallow the aging of a marking when needed.
To post a comment you must log in.
Revision history for this message
Jiri Srba (srba) : | # |
review:
Approve
Revision history for this message
Jakob Taankvist (jakob-taankvist) : | # |
review:
Approve
Revision history for this message
Mathias Grund Sørensen (mathias.grund) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/Core/ArgsParser.hpp' | |||
2 | --- src/Core/ArgsParser.hpp 2013-05-14 19:30:32 +0000 | |||
3 | +++ src/Core/ArgsParser.hpp 2013-07-21 08:22:24 +0000 | |||
4 | @@ -80,7 +80,7 @@ | |||
5 | 80 | class ArgsParser { | 80 | class ArgsParser { |
6 | 81 | typedef std::vector< boost::shared_ptr<Switch> > parser_vec; | 81 | typedef std::vector< boost::shared_ptr<Switch> > parser_vec; |
7 | 82 | public: | 82 | public: |
9 | 83 | ArgsParser() : parsers(), version(2,0,1) { initialize(); }; | 83 | ArgsParser() : parsers(), version(2,2,0) { initialize(); }; |
10 | 84 | virtual ~ArgsParser() {}; | 84 | virtual ~ArgsParser() {}; |
11 | 85 | 85 | ||
12 | 86 | VerificationOptions parse(int argc, char* argv[]) const; | 86 | VerificationOptions parse(int argc, char* argv[]) const; |
13 | 87 | 87 | ||
14 | === modified file 'src/Core/TAPN/TimedTransition.cpp' | |||
15 | --- src/Core/TAPN/TimedTransition.cpp 2013-05-08 15:10:14 +0000 | |||
16 | +++ src/Core/TAPN/TimedTransition.cpp 2013-07-21 08:22:24 +0000 | |||
17 | @@ -1,17 +1,28 @@ | |||
18 | 1 | #include "TimedTransition.hpp" | 1 | #include "TimedTransition.hpp" |
19 | 2 | #include "TimedPlace.hpp" | ||
20 | 2 | 3 | ||
21 | 3 | namespace VerifyTAPN { | 4 | namespace VerifyTAPN { |
22 | 4 | namespace TAPN { | 5 | namespace TAPN { |
23 | 5 | void TimedTransition::print(std::ostream& out) const | 6 | void TimedTransition::print(std::ostream& out) const |
24 | 6 | { | 7 | { |
26 | 7 | out << getName() << "(" << index << ")"; | 8 | out << getName(); |
27 | 9 | if(this->urgent) | ||
28 | 10 | out << " urgent "; | ||
29 | 11 | out << "(" << index << ")"; | ||
30 | 8 | } | 12 | } |
31 | 9 | 13 | ||
32 | 10 | void TimedTransition::addToPreset(const boost::shared_ptr<TimedInputArc>& arc) | 14 | void TimedTransition::addToPreset(const boost::shared_ptr<TimedInputArc>& arc) |
33 | 11 | { | 15 | { |
34 | 12 | if(arc) | 16 | if(arc) |
35 | 13 | { | 17 | { |
37 | 14 | preset.push_back(arc); | 18 | if(this->urgent){ // all urgency in discrete time must have untimed |
38 | 19 | //inputarcs to not break semantics | ||
39 | 20 | if(!arc.get()->getInterval().isZeroInfinity()){ | ||
40 | 21 | std::cout << "Urgent transitions must have untimed input arcs" << std::endl; | ||
41 | 22 | exit(1); | ||
42 | 23 | } | ||
43 | 24 | } | ||
44 | 25 | preset.push_back(arc); | ||
45 | 15 | } | 26 | } |
46 | 16 | } | 27 | } |
47 | 17 | 28 | ||
48 | @@ -19,6 +30,17 @@ | |||
49 | 19 | { | 30 | { |
50 | 20 | if(arc) | 31 | if(arc) |
51 | 21 | { | 32 | { |
52 | 33 | if(this->urgent){ // all urgency in discrete time must have untimed | ||
53 | 34 | //inputarcs to not break semantics | ||
54 | 35 | if(!arc.get()->getInterval().isZeroInfinity()){ | ||
55 | 36 | std::cout << "Urgent transitions must have untimed transportarcs" << std::endl; | ||
56 | 37 | exit(1); | ||
57 | 38 | } else if(arc.get()->getDestination().getInvariant() != TimeInvariant::LS_INF){ | ||
58 | 39 | // urgency breaks if we have invariant at destination | ||
59 | 40 | std::cout << "Transportarcs going through an urgent transition cannot have invariants at destination-places." << std::endl; | ||
60 | 41 | exit(1); | ||
61 | 42 | } | ||
62 | 43 | } | ||
63 | 22 | transportArcs.push_back(arc); | 44 | transportArcs.push_back(arc); |
64 | 23 | } | 45 | } |
65 | 24 | } | 46 | } |
66 | 25 | 47 | ||
67 | === modified file 'src/Core/TAPN/TimedTransition.hpp' | |||
68 | --- src/Core/TAPN/TimedTransition.hpp 2013-05-08 15:10:14 +0000 | |||
69 | +++ src/Core/TAPN/TimedTransition.hpp 2013-07-21 08:22:24 +0000 | |||
70 | @@ -21,8 +21,8 @@ | |||
71 | 21 | public: // typedefs | 21 | public: // typedefs |
72 | 22 | typedef std::vector< boost::shared_ptr<TimedTransition> > Vector; | 22 | typedef std::vector< boost::shared_ptr<TimedTransition> > Vector; |
73 | 23 | public: | 23 | public: |
76 | 24 | TimedTransition(const std::string& name, const std::string& id) : name(name), id(id), preset(), postset(), transportArcs(), index(-1), untimedPostset(true) { }; | 24 | TimedTransition(const std::string& name, const std::string& id, bool urgent) : name(name), id(id), preset(), postset(), transportArcs(), index(-1), untimedPostset(true), urgent(urgent) { }; |
77 | 25 | TimedTransition() : name("*EMPTY*"), id("-1"), preset(), postset(), transportArcs(), index(-1), untimedPostset(true) { }; | 25 | TimedTransition() : name("*EMPTY*"), id("-1"), preset(), postset(), transportArcs(), index(-1), untimedPostset(true),urgent(false) { }; |
78 | 26 | virtual ~TimedTransition() { /* empty */ } | 26 | virtual ~TimedTransition() { /* empty */ } |
79 | 27 | 27 | ||
80 | 28 | public: // modifiers | 28 | public: // modifiers |
81 | @@ -49,6 +49,9 @@ | |||
82 | 49 | inline unsigned int getIndex() const { return index; } | 49 | inline unsigned int getIndex() const { return index; } |
83 | 50 | inline const bool hasUntimedPostset() const { return untimedPostset; } | 50 | inline const bool hasUntimedPostset() const { return untimedPostset; } |
84 | 51 | inline void setUntimedPostset(bool untimed){ untimedPostset = untimed; } | 51 | inline void setUntimedPostset(bool untimed){ untimedPostset = untimed; } |
85 | 52 | inline const bool isUrgent() const { | ||
86 | 53 | return urgent; | ||
87 | 54 | } | ||
88 | 52 | 55 | ||
89 | 53 | private: // data | 56 | private: // data |
90 | 54 | std::string name; | 57 | std::string name; |
91 | @@ -59,6 +62,7 @@ | |||
92 | 59 | InhibitorArc::WeakPtrVector inhibitorArcs; | 62 | InhibitorArc::WeakPtrVector inhibitorArcs; |
93 | 60 | unsigned int index; | 63 | unsigned int index; |
94 | 61 | bool untimedPostset; | 64 | bool untimedPostset; |
95 | 65 | bool urgent; | ||
96 | 62 | }; | 66 | }; |
97 | 63 | 67 | ||
98 | 64 | inline std::ostream& operator<<(std::ostream& out, const TimedTransition& transition) | 68 | inline std::ostream& operator<<(std::ostream& out, const TimedTransition& transition) |
99 | 65 | 69 | ||
100 | === modified file 'src/Core/TAPNParser/TAPNXmlParser.cpp' | |||
101 | --- src/Core/TAPNParser/TAPNXmlParser.cpp 2013-05-08 15:23:45 +0000 | |||
102 | +++ src/Core/TAPNParser/TAPNXmlParser.cpp 2013-07-21 08:22:24 +0000 | |||
103 | @@ -95,7 +95,15 @@ | |||
104 | 95 | { | 95 | { |
105 | 96 | std::string id(transitionNode.first_attribute("id")->value()); | 96 | std::string id(transitionNode.first_attribute("id")->value()); |
106 | 97 | std::string name(transitionNode.first_attribute("name")->value()); | 97 | std::string name(transitionNode.first_attribute("name")->value()); |
108 | 98 | return boost::make_shared<TimedTransition>(name, id); | 98 | xml_attribute<char>* urgenatt = transitionNode.first_attribute("urgent"); |
109 | 99 | bool urgent = false; | ||
110 | 100 | if(urgenatt != NULL){ | ||
111 | 101 | std::string urgentStr = urgenatt->value(); | ||
112 | 102 | if(urgentStr.compare("true") == 0){ | ||
113 | 103 | urgent = true; | ||
114 | 104 | } | ||
115 | 105 | } | ||
116 | 106 | return boost::make_shared<TimedTransition>(name, id,urgent ); | ||
117 | 99 | } | 107 | } |
118 | 100 | 108 | ||
119 | 101 | TAPNXmlParser::ArcCollections TAPNXmlParser::parseArcs(const xml_node<>& root, const TimedPlace::Vector& places, const TimedTransition::Vector& transitions) const | 109 | TAPNXmlParser::ArcCollections TAPNXmlParser::parseArcs(const xml_node<>& root, const TimedPlace::Vector& places, const TimedTransition::Vector& transitions) const |
120 | 102 | 110 | ||
121 | === modified file 'src/DiscreteVerification/SuccessorGenerator.hpp' | |||
122 | --- src/DiscreteVerification/SuccessorGenerator.hpp 2013-05-08 15:10:14 +0000 | |||
123 | +++ src/DiscreteVerification/SuccessorGenerator.hpp 2013-07-21 08:22:24 +0000 | |||
124 | @@ -132,6 +132,8 @@ | |||
125 | 132 | } | 132 | } |
126 | 133 | }; | 133 | }; |
127 | 134 | 134 | ||
128 | 135 | enum Result {QUERY_SATISFIED, QUERY_UNSATISFIED, URGENT_ENABLED}; | ||
129 | 136 | |||
130 | 135 | template<typename T> | 137 | template<typename T> |
131 | 136 | class SuccessorGenerator { | 138 | class SuccessorGenerator { |
132 | 137 | typedef google::sparse_hash_map<const void*, TokenList> ArcHashMap; | 139 | typedef google::sparse_hash_map<const void*, TokenList> ArcHashMap; |
133 | @@ -139,10 +141,13 @@ | |||
134 | 139 | typedef typename boost::ptr_vector< ArcAndTokenWithType > ArcAndTokensVector; | 141 | typedef typename boost::ptr_vector< ArcAndTokenWithType > ArcAndTokensVector; |
135 | 140 | 142 | ||
136 | 141 | public: | 143 | public: |
137 | 144 | |||
138 | 142 | SuccessorGenerator(TAPN::TimedArcPetriNet& tapn, Verification<T>& verifier); | 145 | SuccessorGenerator(TAPN::TimedArcPetriNet& tapn, Verification<T>& verifier); |
139 | 143 | ~SuccessorGenerator(); | 146 | ~SuccessorGenerator(); |
141 | 144 | bool generateAndInsertSuccessors(const T& marking); | 147 | |
142 | 148 | Result generateAndInsertSuccessors(const T& marking); | ||
143 | 145 | void printTransitionStatistics(std::ostream & out) const; | 149 | void printTransitionStatistics(std::ostream & out) const; |
144 | 150 | |||
145 | 146 | inline bool doSuccessorsExist(); | 151 | inline bool doSuccessorsExist(); |
146 | 147 | 152 | ||
147 | 148 | private: | 153 | private: |
148 | @@ -165,7 +170,7 @@ | |||
149 | 165 | const TimedTransition& transition, | 170 | const TimedTransition& transition, |
150 | 166 | int bound = std::numeric_limits<int>().max(), | 171 | int bound = std::numeric_limits<int>().max(), |
151 | 167 | bool isInhib = false | 172 | bool isInhib = false |
153 | 168 | ) const; | 173 | ); |
154 | 169 | 174 | ||
155 | 170 | inline void clearTransitionsArray() { | 175 | inline void clearTransitionsArray() { |
156 | 171 | memset(transitionStatistics, 0, numberoftransitions * sizeof (transitionStatistics[0])); | 176 | memset(transitionStatistics, 0, numberoftransitions * sizeof (transitionStatistics[0])); |
157 | @@ -175,6 +180,7 @@ | |||
158 | 175 | unsigned int* transitionStatistics; | 180 | unsigned int* transitionStatistics; |
159 | 176 | Verification<T>& verifier; | 181 | Verification<T>& verifier; |
160 | 177 | bool succesorsExist; | 182 | bool succesorsExist; |
161 | 183 | bool urgentEnabled; | ||
162 | 178 | }; | 184 | }; |
163 | 179 | 185 | ||
164 | 180 | template<typename T> | 186 | template<typename T> |
165 | @@ -200,11 +206,12 @@ | |||
166 | 200 | } | 206 | } |
167 | 201 | 207 | ||
168 | 202 | template<typename T> | 208 | template<typename T> |
170 | 203 | bool SuccessorGenerator<T>::generateAndInsertSuccessors(const T& marking) { | 209 | Result SuccessorGenerator<T>::generateAndInsertSuccessors(const T& marking) { |
171 | 204 | succesorsExist = false; | 210 | succesorsExist = false; |
173 | 205 | 211 | urgentEnabled = false; | |
174 | 206 | ArcHashMap enabledArcs(tapn.getInhibitorArcs().size() + tapn.getInputArcs().size() + tapn.getTransportArcs().size()); | 212 | ArcHashMap enabledArcs(tapn.getInhibitorArcs().size() + tapn.getInputArcs().size() + tapn.getTransportArcs().size()); |
175 | 207 | std::vector<unsigned int> enabledTransitionArcs(tapn.getTransitions().size(), 0); | 213 | std::vector<unsigned int> enabledTransitionArcs(tapn.getTransitions().size(), 0); |
176 | 214 | |||
177 | 208 | std::vector<const TAPN::TimedTransition* > enabledTransitions; | 215 | std::vector<const TAPN::TimedTransition* > enabledTransitions; |
178 | 209 | 216 | ||
179 | 210 | for (PlaceList::const_iterator iter = marking.getPlaceList().begin(); iter < marking.getPlaceList().end(); iter++) { | 217 | for (PlaceList::const_iterator iter = marking.getPlaceList().begin(); iter < marking.getPlaceList().end(); iter++) { |
180 | @@ -230,7 +237,16 @@ | |||
181 | 230 | } | 237 | } |
182 | 231 | 238 | ||
183 | 232 | enabledTransitions.insert(enabledTransitions.end(), allwaysEnabled.begin(), allwaysEnabled.end()); | 239 | enabledTransitions.insert(enabledTransitions.end(), allwaysEnabled.begin(), allwaysEnabled.end()); |
185 | 233 | return generateMarkings(marking, enabledTransitions, enabledArcs); | 240 | if(generateMarkings(marking, enabledTransitions, enabledArcs)){ |
186 | 241 | return QUERY_SATISFIED; | ||
187 | 242 | } else { | ||
188 | 243 | if(urgentEnabled){ | ||
189 | 244 | return URGENT_ENABLED; | ||
190 | 245 | } else{ | ||
191 | 246 | return QUERY_UNSATISFIED; | ||
192 | 247 | } | ||
193 | 248 | } | ||
194 | 249 | |||
195 | 234 | } | 250 | } |
196 | 235 | 251 | ||
197 | 236 | template<typename T> | 252 | template<typename T> |
198 | @@ -244,7 +260,7 @@ | |||
199 | 244 | const TimedTransition& transition, | 260 | const TimedTransition& transition, |
200 | 245 | int bound, | 261 | int bound, |
201 | 246 | bool isInhib | 262 | bool isInhib |
203 | 247 | ) const { | 263 | ) { |
204 | 248 | bool arcIsEnabled = false; | 264 | bool arcIsEnabled = false; |
205 | 249 | for (TokenList::const_iterator token_iter = place.tokens.begin(); token_iter != place.tokens.end(); token_iter++) { | 265 | for (TokenList::const_iterator token_iter = place.tokens.begin(); token_iter != place.tokens.end(); token_iter++) { |
206 | 250 | if (interval.getLowerBound() <= token_iter->getAge() && token_iter->getAge() <= interval.getUpperBound() && token_iter->getAge() <= bound) { | 266 | if (interval.getLowerBound() <= token_iter->getAge() && token_iter->getAge() <= interval.getUpperBound() && token_iter->getAge() <= bound) { |
207 | @@ -310,6 +326,11 @@ | |||
208 | 310 | } | 326 | } |
209 | 311 | } | 327 | } |
210 | 312 | 328 | ||
211 | 329 | // only here the weights have been properly checked. | ||
212 | 330 | if(transition.isUrgent()){ | ||
213 | 331 | this->urgentEnabled = true; | ||
214 | 332 | } | ||
215 | 333 | |||
216 | 313 | // Write statistics | 334 | // Write statistics |
217 | 314 | transitionStatistics[transition.getIndex()]++; | 335 | transitionStatistics[transition.getIndex()]++; |
218 | 315 | 336 | ||
219 | 316 | 337 | ||
220 | === modified file 'src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp' | |||
221 | --- src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2013-05-08 13:49:42 +0000 | |||
222 | +++ src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2013-07-21 08:22:24 +0000 | |||
223 | @@ -37,8 +37,16 @@ | |||
224 | 37 | trace.push(&next_marking); | 37 | trace.push(&next_marking); |
225 | 38 | validChildren = 0; | 38 | validChildren = 0; |
226 | 39 | 39 | ||
229 | 40 | 40 | bool noDelay = false; | |
230 | 41 | if(isDelayPossible(next_marking)){ | 41 | Result res = successorGenerator.generateAndInsertSuccessors(next_marking); |
231 | 42 | if (res == QUERY_SATISFIED) { | ||
232 | 43 | return true; | ||
233 | 44 | } else if (res == URGENT_ENABLED) { | ||
234 | 45 | noDelay = true; | ||
235 | 46 | } | ||
236 | 47 | |||
237 | 48 | |||
238 | 49 | if(!noDelay && isDelayPossible(next_marking)){ | ||
239 | 42 | NonStrictMarking* marking = new NonStrictMarking(next_marking); | 50 | NonStrictMarking* marking = new NonStrictMarking(next_marking); |
240 | 43 | marking->incrementAge(); | 51 | marking->incrementAge(); |
241 | 44 | marking->setGeneratedBy(NULL); | 52 | marking->setGeneratedBy(NULL); |
242 | @@ -47,9 +55,6 @@ | |||
243 | 47 | } | 55 | } |
244 | 48 | endOfMaxRun = false; | 56 | endOfMaxRun = false; |
245 | 49 | } | 57 | } |
246 | 50 | if(successorGenerator.generateAndInsertSuccessors(next_marking)){ | ||
247 | 51 | return true; | ||
248 | 52 | } | ||
249 | 53 | // if no delay is possible, and no transition-based succecors are possible, we have reached a max run | 58 | // if no delay is possible, and no transition-based succecors are possible, we have reached a max run |
250 | 54 | endOfMaxRun = endOfMaxRun && (!successorGenerator.doSuccessorsExist()); | 59 | endOfMaxRun = endOfMaxRun && (!successorGenerator.doSuccessorsExist()); |
251 | 55 | 60 | ||
252 | 56 | 61 | ||
253 | === modified file 'src/DiscreteVerification/VerificationTypes/ReachabilitySearch.cpp' | |||
254 | --- src/DiscreteVerification/VerificationTypes/ReachabilitySearch.cpp 2013-05-08 13:49:42 +0000 | |||
255 | +++ src/DiscreteVerification/VerificationTypes/ReachabilitySearch.cpp 2013-07-21 08:22:24 +0000 | |||
256 | @@ -32,8 +32,16 @@ | |||
257 | 32 | trace.push(&next_marking); | 32 | trace.push(&next_marking); |
258 | 33 | validChildren = 0; | 33 | validChildren = 0; |
259 | 34 | 34 | ||
260 | 35 | bool noDelay = false; | ||
261 | 36 | Result res = successorGenerator.generateAndInsertSuccessors(next_marking); | ||
262 | 37 | if(res == QUERY_SATISFIED){ | ||
263 | 38 | return true; | ||
264 | 39 | } else if (res == URGENT_ENABLED) { | ||
265 | 40 | noDelay = true; | ||
266 | 41 | } | ||
267 | 42 | |||
268 | 35 | // Generate next markings | 43 | // Generate next markings |
270 | 36 | if(isDelayPossible(next_marking)){ | 44 | if(!noDelay && isDelayPossible(next_marking)){ |
271 | 37 | NonStrictMarking* marking = new NonStrictMarking(next_marking); | 45 | NonStrictMarking* marking = new NonStrictMarking(next_marking); |
272 | 38 | marking->incrementAge(); | 46 | marking->incrementAge(); |
273 | 39 | marking->setGeneratedBy(NULL); | 47 | marking->setGeneratedBy(NULL); |
274 | @@ -41,11 +49,8 @@ | |||
275 | 41 | return true; | 49 | return true; |
276 | 42 | } | 50 | } |
277 | 43 | } | 51 | } |
278 | 44 | if(successorGenerator.generateAndInsertSuccessors(next_marking)){ | ||
279 | 45 | return true; | ||
280 | 46 | } | ||
281 | 47 | |||
282 | 48 | deleteMarking(&next_marking); | 52 | deleteMarking(&next_marking); |
283 | 53 | |||
284 | 49 | } | 54 | } |
285 | 50 | 55 | ||
286 | 51 | return false; | 56 | return false; |
287 | 52 | 57 | ||
288 | === modified file 'src/DiscreteVerification/VerificationTypes/TimeDartVerification.hpp' | |||
289 | --- src/DiscreteVerification/VerificationTypes/TimeDartVerification.hpp 2013-05-08 15:10:14 +0000 | |||
290 | +++ src/DiscreteVerification/VerificationTypes/TimeDartVerification.hpp 2013-07-21 08:22:24 +0000 | |||
291 | @@ -28,6 +28,10 @@ | |||
292 | 28 | if ((*iter)->getPreset().size() + (*iter)->getTransportArcs().size() == 0) { | 28 | if ((*iter)->getPreset().size() + (*iter)->getTransportArcs().size() == 0) { |
293 | 29 | allwaysEnabled.push_back(iter->get()); | 29 | allwaysEnabled.push_back(iter->get()); |
294 | 30 | } | 30 | } |
295 | 31 | if((*iter)->isUrgent()){ // no implementation for urgency in timedart engine yet | ||
296 | 32 | cout << "The TimeDart engine cannot handle urgent transitions" << endl; | ||
297 | 33 | exit(1); | ||
298 | 34 | } | ||
299 | 31 | } | 35 | } |
300 | 32 | } | 36 | } |
301 | 33 | 37 |