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
1=== modified file 'src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp'
2--- src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2014-05-09 16:05:31 +0000
3+++ src/DiscreteVerification/VerificationTypes/LivenessSearch.cpp 2014-07-07 19:00:30 +0000
4@@ -51,7 +51,11 @@
5 marking->incrementAge();
6 marking->setGeneratedBy(NULL);
7 if(addToPW(marking, &next_marking)){
8- return true;
9+ // this can only occur when there is a deadlock detected by cut
10+ // pop last marking as it is not a part of the trace
11+ // ie. we detect the situation 1 delay later.
12+ trace.pop();
13+ return true;
14 }
15 endOfMaxRun = false;
16 }
17
18=== modified file 'src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp'
19--- src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp 2014-04-06 11:00:59 +0000
20+++ src/DiscreteVerification/VerificationTypes/TimeDartVerification.cpp 2014-07-07 19:00:30 +0000
21@@ -199,11 +199,18 @@
22 if(diff > tapn.getMaxConstant()) {
23 diff = (tapn.getMaxConstant() + 1) - trace->start;
24 }
25+
26+ // find the lowest delay at which the query is satisfied
27+ while(diff && base->canDeadlock(tapn, trace->start + diff - 1))
28+ {
29+ --diff;
30+ }
31
32 while (diff) { // while there is some delay in trace
33 NonStrictMarkingBase* mc = new NonStrictMarkingBase(*base);
34 mc->incrementAge(trace->start + diff);
35- mc->setGeneratedBy(NULL); // NULL indicates that it is a delay transition
36+ mc->setGeneratedBy(NULL); // NULL indicates that it is a delay transition
37+
38 if (last != NULL) {
39 last->setParent(mc); // set the parent of the last marking
40 }
41
42=== modified file 'src/DiscreteVerification/VerificationTypes/Verification.hpp'
43--- src/DiscreteVerification/VerificationTypes/Verification.hpp 2014-06-11 15:18:23 +0000
44+++ src/DiscreteVerification/VerificationTypes/Verification.hpp 2014-07-07 19:00:30 +0000
45@@ -8,6 +8,8 @@
46 #include "../../Core/TAPNParser/util.hpp"
47 #include "../DeadlockVisitor.hpp"
48
49+
50+
51 namespace VerifyTAPN {
52 namespace DiscreteVerification {
53 template<typename T>
54@@ -27,6 +29,7 @@
55 std::cout << "Error generating trace" << std::endl;
56 }
57
58+ void removeLastIfDelay(rapidxml::xml_node<>&);
59 void printHumanTrace(T* m, std::stack<T*>& stack, AST::Quantifier query);
60 void printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn);
61 rapidxml::xml_node<>* createTransitionNode(T* old, T* current, rapidxml::xml_document<>& doc);
62@@ -125,6 +128,19 @@
63 }
64
65 template<typename T>
66+ void Verification<T>::removeLastIfDelay(rapidxml::xml_node<>& root)
67+ {
68+ using namespace rapidxml;
69+ xml_node<>* node = root.last_node();
70+ if(node){
71+ char* name = node->name();
72+ if(strcmp(name, "delay") == 0){
73+ root.remove_last_node();
74+ }
75+ }
76+ }
77+
78+ template<typename T>
79 void Verification<T>::printXMLTrace(T* m, std::stack<T*>& stack, AST::Query* query, TAPN::TimedArcPetriNet& tapn) {
80 using namespace rapidxml;
81 std::cerr << "Trace: " << std::endl;
82@@ -170,6 +186,8 @@
83 if(delayloop)
84 continue;
85 if ((!foundLoop) && stack.empty() && old->getNumberOfChildren() > 0) {
86+ // remove delay before delay forever
87+ removeLastIfDelay(*root);
88 xml_node<>* node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));
89 root->append_node(node);
90 delayedForever = true;
91@@ -247,13 +265,17 @@
92 node = doc.allocate_node(node_element, "deadlock");
93 } else {
94 // if not it is delay forever
95- node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));
96+
97+ // remove delay before delay forever
98+ removeLastIfDelay(*root);
99+ node = doc.allocate_node(node_element, "delay", doc.allocate_string("forever"));
100+
101 }
102 root->append_node(node);
103 }
104 }
105 }
106-
107+
108 std::cerr << doc;
109 }
110

Subscribers

People subscribed via source and target branches