Merge lp:~tapaal-contributor/tapaal/ltl-icon-selection-1997234 into lp:tapaal/3.9

Proposed by Lena Ernstsen
Status: Merged
Approved by: Jiri Srba
Approved revision: 1179
Merge reported by: Jiri Srba
Merged at revision: not available
Proposed branch: lp:~tapaal-contributor/tapaal/ltl-icon-selection-1997234
Merge into: lp:tapaal/3.9
Diff against target: 310 lines (+112/-32)
9 files modified
src/dk/aau/cs/model/tapn/TAPNQuery.java (+6/-7)
src/dk/aau/cs/verification/QueryResult.java (+2/-0)
src/dk/aau/cs/verification/QueryType.java (+3/-1)
src/dk/aau/cs/verification/Stats.java (+3/-3)
src/dk/aau/cs/verification/VerificationResult.java (+16/-0)
src/dk/aau/cs/verification/VerifyTAPN/VerifyPN.java (+0/-1)
src/dk/aau/cs/verification/VerifyTAPN/VerifyPNCTLOutputParser.java (+18/-10)
src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNIconSelector.java (+28/-8)
src/pipe/gui/RunVerification.java (+36/-2)
To merge this branch: bzr merge lp:~tapaal-contributor/tapaal/ltl-icon-selection-1997234
Reviewer Review Type Date Requested Status
Jiri Srba Approve
Review via email: mp+435360@code.launchpad.net

This proposal supersedes a proposal from 2023-01-09.

Commit message

Considers LTL nodes when selecting icons for verification

To post a comment you must log in.
1177. By Lena Ernstsen

Reverted change to avoid NPE

1178. By Lena Ernstsen

Added 'show raw query results' button for state equation results

1179. By Lena Ernstsen

Fixed wrong statistics for CTL queries

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

Tested and works fine.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/dk/aau/cs/model/tapn/TAPNQuery.java'
2--- src/dk/aau/cs/model/tapn/TAPNQuery.java 2016-04-14 20:09:47 +0000
3+++ src/dk/aau/cs/model/tapn/TAPNQuery.java 2023-01-23 10:20:36 +0000
4@@ -1,9 +1,6 @@
5 package dk.aau.cs.model.tapn;
6
7-import dk.aau.cs.TCTL.TCTLAFNode;
8-import dk.aau.cs.TCTL.TCTLAbstractProperty;
9-import dk.aau.cs.TCTL.TCTLEFNode;
10-import dk.aau.cs.TCTL.TCTLEGNode;
11+import dk.aau.cs.TCTL.*;
12 import dk.aau.cs.TCTL.visitors.HasDeadlockVisitor;
13 import dk.aau.cs.verification.QueryType;
14 import pipe.dataLayer.TAPNQuery.QueryCategory;
15@@ -27,9 +24,11 @@
16 }
17
18 public QueryType queryType(){
19- if(property instanceof TCTLEFNode) return QueryType.EF;
20- else if(property instanceof TCTLEGNode) return QueryType.EG;
21- else if(property instanceof TCTLAFNode) return QueryType.AF;
22+ if (property instanceof TCTLEFNode) return QueryType.EF;
23+ else if (property instanceof TCTLEGNode) return QueryType.EG;
24+ else if (property instanceof LTLENode) return QueryType.E;
25+ else if (property instanceof LTLANode) return QueryType.A;
26+ else if (property instanceof TCTLAFNode) return QueryType.AF;
27 else return QueryType.AG;
28 }
29
30
31=== modified file 'src/dk/aau/cs/verification/QueryResult.java'
32--- src/dk/aau/cs/verification/QueryResult.java 2020-07-13 13:58:47 +0000
33+++ src/dk/aau/cs/verification/QueryResult.java 2023-01-23 10:20:36 +0000
34@@ -61,6 +61,8 @@
35 || (queryType().equals(QueryType.EG)) // && !isQuerySatisfied())
36 || (queryType().equals(QueryType.AF)) // && isQuerySatisfied())
37 || (queryType().equals(QueryType.AG) && isQuerySatisfied())
38+ || (queryType().equals(QueryType.A))
39+ || (queryType().equals(QueryType.E))
40 || (hasDeadlock() &&
41 (!isQuerySatisfied() && queryType().equals(QueryType.EF)) ||
42 (isQuerySatisfied() && queryType().equals(QueryType.AG))
43
44=== modified file 'src/dk/aau/cs/verification/QueryType.java'
45--- src/dk/aau/cs/verification/QueryType.java 2011-05-21 13:00:05 +0000
46+++ src/dk/aau/cs/verification/QueryType.java 2023-01-23 10:20:36 +0000
47@@ -4,5 +4,7 @@
48 EF,
49 EG,
50 AF,
51- AG
52+ AG,
53+ A,
54+ E
55 }
56
57=== modified file 'src/dk/aau/cs/verification/Stats.java'
58--- src/dk/aau/cs/verification/Stats.java 2020-07-13 13:58:47 +0000
59+++ src/dk/aau/cs/verification/Stats.java 2023-01-23 10:20:36 +0000
60@@ -137,15 +137,15 @@
61 @Override
62 public String toString() {
63 StringBuilder buffer = new StringBuilder();
64- buffer.append("Discovered markings: ");
65+ buffer.append("Discovered configurations: ");
66 buffer.append(discovered);
67 buffer.append(System.getProperty("line.separator"));
68
69- buffer.append("Explored markings: ");
70+ buffer.append("Explored configurations: ");
71 buffer.append(explored);
72 buffer.append(System.getProperty("line.separator"));
73
74- buffer.append("Stored markings: ");
75+ buffer.append("Stored configurations: ");
76 buffer.append(stored);
77 return buffer.toString();
78 }
79
80=== modified file 'src/dk/aau/cs/verification/VerificationResult.java'
81--- src/dk/aau/cs/verification/VerificationResult.java 2021-10-13 18:51:36 +0000
82+++ src/dk/aau/cs/verification/VerificationResult.java 2023-01-23 10:20:36 +0000
83@@ -4,6 +4,8 @@
84 import java.util.ArrayList;
85 import java.util.Comparator;
86 import java.util.List;
87+import java.util.regex.Matcher;
88+import java.util.regex.Pattern;
89
90 import dk.aau.cs.model.tapn.NetworkMarking;
91 import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
92@@ -21,6 +23,7 @@
93 private NameMapping nameMapping;
94 private TTrace secondaryTrace;
95 private boolean isSolvedUsingStateEquation = false;
96+ private int bound;
97
98 public boolean isQuerySatisfied() {
99 return queryResult.isQuerySatisfied();
100@@ -32,6 +35,15 @@
101 this.verificationTime = verificationTime;
102 this.stats = stats;
103 this.rawOutput = rawOutput;
104+
105+ String[] lines = rawOutput.split(System.getProperty("line.separator"));
106+ for (String line : lines) {
107+ Matcher matcher = Pattern.compile("\\s*-k\\s*(\\d+)\\s*").matcher(line);
108+ if (matcher.find()) {
109+ this.bound = Integer.parseInt(matcher.group(1));
110+ break;
111+ }
112+ }
113 }
114
115 public VerificationResult(QueryResult queryResult, TTrace trace, long verificationTime, Stats stats, boolean isSolvedUsingStateEquation){
116@@ -231,4 +243,8 @@
117 public String getRawOutput() {
118 return rawOutput;
119 }
120+
121+ public int getBound() {
122+ return bound;
123+ }
124 }
125
126=== modified file 'src/dk/aau/cs/verification/VerifyTAPN/VerifyPN.java'
127--- src/dk/aau/cs/verification/VerifyTAPN/VerifyPN.java 2021-07-16 20:39:22 +0000
128+++ src/dk/aau/cs/verification/VerifyTAPN/VerifyPN.java 2023-01-23 10:20:36 +0000
129@@ -340,7 +340,6 @@
130 tapnTrace = parseTrace(trace, options, model, exportedModel, query, queryResult.value1());
131 } else {
132 tapnTrace = parseTrace(errorOutput, options, model, exportedModel, query, queryResult.value1());
133-
134 }
135 return new VerificationResult<TimedArcPetriNetTrace>(queryResult.value1(), tapnTrace, runner.getRunningTime(), queryResult.value2(), approximationResult, standardOutput);
136 }
137
138=== modified file 'src/dk/aau/cs/verification/VerifyTAPN/VerifyPNCTLOutputParser.java'
139--- src/dk/aau/cs/verification/VerifyTAPN/VerifyPNCTLOutputParser.java 2020-07-13 14:30:00 +0000
140+++ src/dk/aau/cs/verification/VerifyTAPN/VerifyPNCTLOutputParser.java 2023-01-23 10:20:36 +0000
141@@ -13,15 +13,16 @@
142 private static final String Query_IS_NOT_SATISFIED_STRING = "Query is NOT satisfied";
143 private static final String Query_IS_SATISFIED_STRING = "Query is satisfied";
144
145- private static final Pattern configurationsPattern = Pattern.compile("\\s*Configurations:\\s*(\\d+)\\s*");
146- private static final Pattern markingsPattern = Pattern.compile("\\s*Markings:\\s*(\\d+)\\s*");
147- private static final Pattern edgesPattern = Pattern.compile("\\t+Edges:\\s*(\\d+)\\s*");
148-
149- private static final Pattern processedEdgesPattern = Pattern.compile("\\s*Processed Edges:\\s*(\\d+)\\s*");
150- private static final Pattern processedNEdgesPattern = Pattern.compile("\\s*Processed N. Edges:\\s*(\\d+)\\s*");
151- private static final Pattern exploredConfigurationsPattern = Pattern.compile("\\s*Explored Configs:\\s*(\\d+)\\s*");
152-
153- private static final Pattern maxUsedTokensPattern = Pattern.compile("\\s*Max number of tokens found in any reachable marking:\\s*(>)?(\\d+)\\s*");
154+ private static final Pattern configurationsPattern = Pattern.compile("\\s*Configurations\\s*:\\s*(\\d+)\\s*");
155+ private static final Pattern markingsPattern = Pattern.compile("\\s*Markings\\s*:\\s*(\\d+)\\s*");
156+ private static final Pattern edgesPattern = Pattern.compile("\\t+Edges\\s*:\\s*(\\d+)\\s*");
157+
158+ private static final Pattern processedEdgesPattern = Pattern.compile("\\s*Processed Edges\\s*:\\s*(\\d+)\\s*");
159+ private static final Pattern processedNEdgesPattern = Pattern.compile("\\s*Processed N. Edges\\s*:\\s*(\\d+)\\s*");
160+ private static final Pattern exploredConfigurationsPattern = Pattern.compile("\\s*Explored Configs\\s*:\\s*(\\d+)\\s*");
161+
162+ private static final Pattern maxUsedTokensPattern = Pattern.compile("\\s*Max number of tokens found in any reachable marking\\s*:\\s*(>)?(\\d+)\\s*");
163+ private static final Pattern maxTokensPattern = Pattern.compile("\\s*max tokens\\s*:\\s*(>)?(\\d+)\\s*");
164
165 public VerifyPNCTLOutputParser(int totalTokens, int extraTokens, TAPNQuery queryType) {
166 super(totalTokens, extraTokens, queryType);
167@@ -76,7 +77,14 @@
168
169 matcher = maxUsedTokensPattern.matcher(line);
170 if(matcher.find()){
171- maxUsedTokens = Integer.parseInt(matcher.group(1));
172+ maxUsedTokens += Integer.parseInt(matcher.group(2));
173+ String operator = matcher.group(1) == null ? "" : matcher.group(1);
174+ if(operator.equals(">")) maxUsedTokens += 1; // Indicate non-k-boundedness by encoding that an extra token was used.
175+ }
176+
177+ matcher = maxTokensPattern.matcher(line);
178+ if(matcher.find()){
179+ maxUsedTokens += Integer.parseInt(matcher.group(2));
180 String operator = matcher.group(1) == null ? "" : matcher.group(1);
181 if(operator.equals(">")) maxUsedTokens += 1; // Indicate non-k-boundedness by encoding that an extra token was used.
182 }
183
184=== modified file 'src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNIconSelector.java'
185--- src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNIconSelector.java 2019-03-22 10:13:18 +0000
186+++ src/dk/aau/cs/verification/VerifyTAPN/VerifyTAPNIconSelector.java 2023-01-23 10:20:36 +0000
187@@ -15,27 +15,47 @@
188 switch(result.getQueryResult().queryType())
189 {
190 case EF:
191- if(result.isQuerySatisfied()){
192+ if (result.isQuerySatisfied()) {
193 return satisfiedIcon;
194- }else if(!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)){
195+ } else if (!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
196 return notSatisfiedIcon;
197 }
198 break;
199 case AG:
200- if(!result.isQuerySatisfied()) return notSatisfiedIcon;
201- else if(result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) return satisfiedIcon;
202+ if (!result.isQuerySatisfied() && result.getBound() >= result.getQueryResult().boundednessAnalysis().usedTokens()) {
203+ return notSatisfiedIcon;
204+ } else if (result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
205+ return satisfiedIcon;
206+ }
207 break;
208 case AF:
209- if(!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)){
210+ if (!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
211 return notSatisfiedIcon;
212- } else if(result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)){
213+ } else if (result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
214 return satisfiedIcon;
215 }
216 break;
217 case EG:
218- if(result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) return satisfiedIcon;
219- else if(!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) return notSatisfiedIcon;
220+ if (result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
221+ return satisfiedIcon;
222+ } else if (!result.isQuerySatisfied() && result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
223+ return notSatisfiedIcon;
224+ }
225 break;
226+ case A:
227+ if (!result.isQuerySatisfied()) {
228+ return notSatisfiedIcon;
229+ } else if (result.isQuerySatisfied() && result.getBound() >= result.getQueryResult().boundednessAnalysis().usedTokens()) {
230+ return satisfiedIcon;
231+ }
232+ break;
233+ case E:
234+ if (!result.isQuerySatisfied() && result.getBound() >= result.getQueryResult().boundednessAnalysis().usedTokens()) {
235+ return notSatisfiedIcon;
236+ } else if (result.isQuerySatisfied()) {
237+ return satisfiedIcon;
238+ }
239+ break;
240 default:
241 return null;
242 }
243
244=== modified file 'src/pipe/gui/RunVerification.java'
245--- src/pipe/gui/RunVerification.java 2021-10-13 18:51:36 +0000
246+++ src/pipe/gui/RunVerification.java 2023-01-23 10:20:36 +0000
247@@ -298,11 +298,20 @@
248 gbc.anchor = GridBagConstraints.WEST;
249 panel.add(new JLabel(toHTML(result.getResultString())), gbc);
250
251+ if (result.getBound() < result.getQueryResult().boundednessAnalysis().usedTokens() &&
252+ !result.getQueryResult().toString().toLowerCase().contains("only markings with")) {
253+ gbc = new GridBagConstraints();
254+ gbc.gridx = 0;
255+ gbc.gridy = 0;
256+ gbc.gridwidth = 2;
257+ gbc.anchor = GridBagConstraints.WEST;
258+ panel.add(new JLabel("<html><br/><br/>Only markings with at most " + result.getBound() + " tokens were explored<br/><br/></html>"), gbc);
259+ }
260+
261 // TODO remove this when the engine outputs statistics
262 boolean isCTLQuery = result.getQueryResult().isCTL;
263
264 if(modelChecker.supportsStats() && !result.isSolvedUsingStateEquation() && !isCTLQuery){
265-
266 displayStats(panel, result.getStatsAsString(), modelChecker.getStatsExplanations());
267
268 if(!result.getTransitionStatistics().isEmpty()){
269@@ -383,15 +392,40 @@
270 } else if (modelChecker.supportsStats() && !result.isSolvedUsingStateEquation() && isCTLQuery){
271 displayStats(panel, result.getCTLStatsAsString(), modelChecker.getStatsExplanations());
272
273+ if (result.getRawOutput() != null) {
274+ JButton showRawQueryButton = new JButton("Show raw query results");
275+ showRawQueryButton.addActionListener(arg0 -> {
276+ JOptionPane.showMessageDialog(panel, createRawQueryPanel(result.getRawOutput()), "Raw query results", JOptionPane.INFORMATION_MESSAGE);
277+ });
278+ gbc = new GridBagConstraints();
279+ gbc.gridx = 0;
280+ gbc.gridy = 4;
281+ gbc.insets = new Insets(0,0,10,0);
282+ gbc.anchor = GridBagConstraints.WEST;
283+ panel.add(showRawQueryButton, gbc);
284+ }
285 }
286
287 if(result.isSolvedUsingStateEquation()){
288 gbc = new GridBagConstraints();
289 gbc.gridx = 0;
290- gbc.gridy = 6;
291+ gbc.gridy = 4;
292 gbc.insets = new Insets(0,0,15,0);
293 gbc.anchor = GridBagConstraints.WEST;
294 panel.add(new JLabel(toHTML("The query was resolved using state equations.")), gbc);
295+
296+ if (result.getRawOutput() != null) {
297+ JButton showRawQueryButton = new JButton("Show raw query results");
298+ showRawQueryButton.addActionListener(arg0 -> {
299+ JOptionPane.showMessageDialog(panel, createRawQueryPanel(result.getRawOutput()), "Raw query results", JOptionPane.INFORMATION_MESSAGE);
300+ });
301+ gbc = new GridBagConstraints();
302+ gbc.gridx = 0;
303+ gbc.gridy = 5;
304+ gbc.insets = new Insets(0,0,10,0);
305+ gbc.anchor = GridBagConstraints.WEST;
306+ panel.add(showRawQueryButton, gbc);
307+ }
308 }
309
310 gbc = new GridBagConstraints();

Subscribers

People subscribed via source and target branches