Merge lp:~verifydtapn-contributers/verifydtapn/Delay90Bug into lp:verifydtapn

Proposed by Peter Gjøl Jensen
Status: Merged
Approved by: Jiri Srba
Approved revision: 313
Merged at revision: 312
Proposed branch: lp:~verifydtapn-contributers/verifydtapn/Delay90Bug
Merge into: lp:verifydtapn
Diff against target: 109 lines (+37/-4)
3 files modified
src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp (+5/-1)
src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp (+8/-1)
src/DiscreteVerification/VerificationTypes/Verification.hpp (+24/-2)
To merge this branch: bzr merge lp:~verifydtapn-contributers/verifydtapn/Delay90Bug
Reviewer Review Type Date Requested Status
Jiri Srba Approve
Review via email: mp+225714@code.launchpad.net

Commit message

Trailing delays removed and if we print delay for ever, any previous delay is removed.

Description of the change

The fix removes trailing delays from traces which leads to wrong reporting of "delay forever" (see bug).

To post a comment you must log in.
312. By Jiri Srba

fixes a problem with wrong delay detection in case of a deadlock

Revision history for this message
Jiri Srba (srba) wrote :

I fixed a small issue. However, if e.g. EG ends with delay for ever, it will report something like

...
delay 7
delay for ever

and the delay 7 is redundant and should be replaced just with delay for ever.

review: Needs Fixing
313. By Peter Gjøl Jensen

fixed by altering trace before output, rather than adding more special cases

Revision history for this message
Jiri Srba (srba) wrote :

Tested and seems to work just fine. Mathias and Jakob, what do you think?

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp'
--- src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2014-05-09 16:05:31 +0000
+++ src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2014-07-07 19:00:30 +0000
@@ -51,7 +51,11 @@
51 marking->incrementAge();51 marking->incrementAge();
52 marking->setGeneratedBy(NULL);52 marking->setGeneratedBy(NULL);
53 if(addToPW(marking, &next_marking)){53 if(addToPW(marking, &next_marking)){
54 return true;54 // this can only occur when there is a deadlock detected by cut
55 // pop last marking as it is not a part of the trace
56 // ie. we detect the situation 1 delay later.
57 trace.pop();
58 return true;
55 }59 }
56 endOfMaxRun = false;60 endOfMaxRun = false;
57 }61 }
5862
=== modified file 'src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp'
--- src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp 2014-04-06 11:00:59 +0000
+++ src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp 2014-07-07 19:00:30 +0000
@@ -199,11 +199,18 @@
199 if(diff > tapn.getMaxConstant()) {199 if(diff > tapn.getMaxConstant()) {
200 diff = (tapn.getMaxConstant() + 1) - trace->start;200 diff = (tapn.getMaxConstant() + 1) - trace->start;
201 }201 }
202
203 // find the lowest delay at which the query is satisfied
204 while(diff && base->canDeadlock(tapn, trace->start + diff - 1))
205 {
206 --diff;
207 }
202208
203 while (diff) { // while there is some delay in trace209 while (diff) { // while there is some delay in trace
204 NonStrictMarkingBase* mc = new NonStrictMarkingBase(*base);210 NonStrictMarkingBase* mc = new NonStrictMarkingBase(*base);
205 mc->incrementAge(trace->start + diff);211 mc->incrementAge(trace->start + diff);
206 mc->setGeneratedBy(NULL); // NULL indicates that it is a delay transition212 mc->setGeneratedBy(NULL); // NULL indicates that it is a delay transition
213
207 if (last != NULL) {214 if (last != NULL) {
208 last->setParent(mc); // set the parent of the last marking215 last->setParent(mc); // set the parent of the last marking
209 }216 }
210217
=== modified file 'src/DiscreteVerification/VerificationTypes/Verification.hpp'
--- src/DiscreteVerification/VerificationTypes/Verification.hpp 2014-06-11 15:18:23 +0000
+++ src/DiscreteVerification/VerificationTypes/Verification.hpp 2014-07-07 19:00:30 +0000
@@ -8,6 +8,8 @@
8#include "../../Core/TAPNParser/util.hpp"8#include "../../Core/TAPNParser/util.hpp"
9#include "../DeadlockVisitor.hpp"9#include "../DeadlockVisitor.hpp"
1010
11
12
11namespace VerifyTAPN {13namespace VerifyTAPN {
12 namespace DiscreteVerification {14 namespace DiscreteVerification {
13 template<typename T>15 template<typename T>
@@ -27,6 +29,7 @@
27 std::cout << "Error generating trace" << std::endl;29 std::cout << "Error generating trace" << std::endl;
28 }30 }
2931
32 void removeLastIfDelay(rapidxml::xml_node<>&);
30 void printHumanTrace(T* m, std::stack<T*>& stack, AST::Quantifier query);33 void printHumanTrace(T* m, std::stack<T*>& stack, AST::Quantifier query);
31 void printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn);34 void printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn);
32 rapidxml::xml_node<>* createTransitionNode(T* old, T* current, rapidxml::xml_document<>& doc);35 rapidxml::xml_node<>* createTransitionNode(T* old, T* current, rapidxml::xml_document<>& doc);
@@ -125,6 +128,19 @@
125 }128 }
126129
127 template<typename T>130 template<typename T>
131 void Verification<T>::removeLastIfDelay(rapidxml::xml_node<>& root)
132 {
133 using namespace rapidxml;
134 xml_node<>* node = root.last_node();
135 if(node){
136 char* name = node->name();
137 if(strcmp(name, "delay") == 0){
138 root.remove_last_node();
139 }
140 }
141 }
142
143 template<typename T>
128 void Verification<T>::printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn) {144 void Verification<T>::printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn) {
129 using namespace rapidxml;145 using namespace rapidxml;
130 std::cerr << "Trace: " << std::endl;146 std::cerr << "Trace: " << std::endl;
@@ -170,6 +186,8 @@
170 if(delayloop)186 if(delayloop)
171 continue;187 continue;
172 if ((!foundLoop) && stack.empty() && old->getNumberOfChildren() > 0) {188 if ((!foundLoop) && stack.empty() && old->getNumberOfChildren() > 0) {
189 // remove delay before delay forever
190 removeLastIfDelay(*root);
173 xml_node<>* node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));191 xml_node<>* node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));
174 root->append_node(node);192 root->append_node(node);
175 delayedForever = true;193 delayedForever = true;
@@ -247,13 +265,17 @@
247 node = doc.allocate_node(node_element, "deadlock");265 node = doc.allocate_node(node_element, "deadlock");
248 } else {266 } else {
249 // if not it is delay forever267 // if not it is delay forever
250 node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever")); 268
269 // remove delay before delay forever
270 removeLastIfDelay(*root);
271 node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));
272
251 }273 }
252 root->append_node(node);274 root->append_node(node);
253 }275 }
254 }276 }
255 }277 }
256278
257 std::cerr << doc;279 std::cerr << doc;
258 }280 }
259 281

Subscribers

People subscribed via source and target branches