Merge lp:~tapaal-contributor/tapaal/boundedness-check into lp:tapaal

Proposed by Lena Ernstsen
Status: Merged
Merged at revision: 1140
Proposed branch: lp:~tapaal-contributor/tapaal/boundedness-check
Merge into: lp:tapaal
Diff against target: 311 lines (+118/-33)
5 files modified
src/dk/aau/cs/verification/VerifyTAPN/VerifyPNOptions.java (+2/-1)
src/pipe/gui/KBoundAnalyzer.java (+66/-15)
src/pipe/gui/RunKBoundAnalysis.java (+29/-6)
src/pipe/gui/RunVerification.java (+3/-2)
src/pipe/gui/RunVerificationBase.java (+18/-9)
To merge this branch: bzr merge lp:~tapaal-contributor/tapaal/boundedness-check
Reviewer Review Type Date Requested Status
Jiri Srba Needs Fixing
Review via email: mp+407668@code.launchpad.net

Commit message

Boundedness check for verifypn uses different query and minimizing extra tokens is optional

To post a comment you must log in.
Revision history for this message
Jiri Srba (srba) wrote :

Open the game-harddisk example and check for boundedness, it is broken.

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/dk/aau/cs/verification/VerifyTAPN/VerifyPNOptions.java'
--- src/dk/aau/cs/verification/VerifyTAPN/VerifyPNOptions.java 2021-03-02 16:02:35 +0000
+++ src/dk/aau/cs/verification/VerifyTAPN/VerifyPNOptions.java 2021-08-25 10:24:16 +0000
@@ -84,7 +84,8 @@
84 result.append(" -a 10 ");84 result.append(" -a 10 ");
85 }85 }
86 if (this.queryReductionTime == QueryReductionTime.NoTime) {86 if (this.queryReductionTime == QueryReductionTime.NoTime) {
87 result.append(" -q 0 ");87 result.append(
88 " -q 0 ");
88 } else if (this.queryReductionTime == QueryReductionTime.ShortestTime) {89 } else if (this.queryReductionTime == QueryReductionTime.ShortestTime) {
89 //Run query reduction for 1 second, to avoid conflict with -s OverApprox argument, but also still not run the verification.90 //Run query reduction for 1 second, to avoid conflict with -s OverApprox argument, but also still not run the verification.
90 result.append(" -q 1");91 result.append(" -q 1");
9192
=== modified file 'src/pipe/gui/KBoundAnalyzer.java'
--- src/pipe/gui/KBoundAnalyzer.java 2021-02-07 11:09:51 +0000
+++ src/pipe/gui/KBoundAnalyzer.java 2021-08-25 10:24:16 +0000
@@ -2,15 +2,18 @@
22
3import javax.swing.JSpinner;3import javax.swing.JSpinner;
44
5import dk.aau.cs.TCTL.*;
6import dk.aau.cs.model.tapn.TimedArcPetriNet;
7import dk.aau.cs.model.tapn.TimedPlace;
8import dk.aau.cs.util.Tuple;
9import dk.aau.cs.verification.NameMapping;
10import dk.aau.cs.verification.TAPNComposer;
5import pipe.dataLayer.TAPNQuery.SearchOption;11import pipe.dataLayer.TAPNQuery.SearchOption;
6import pipe.dataLayer.TAPNQuery.TraceOption;12import pipe.dataLayer.TAPNQuery.TraceOption;
7import pipe.dataLayer.TAPNQuery.AlgorithmOption;13import pipe.dataLayer.TAPNQuery.AlgorithmOption;
8import pipe.dataLayer.TAPNQuery.QueryCategory;14import pipe.dataLayer.TAPNQuery.QueryCategory;
9import pipe.gui.widgets.RunningVerificationDialog;15import pipe.gui.widgets.RunningVerificationDialog;
10import dk.aau.cs.Messenger;16import dk.aau.cs.Messenger;
11import dk.aau.cs.TCTL.TCTLAGNode;
12import dk.aau.cs.TCTL.TCTLAbstractProperty;
13import dk.aau.cs.TCTL.TCTLTrueNode;
14import dk.aau.cs.model.tapn.TAPNQuery;17import dk.aau.cs.model.tapn.TAPNQuery;
15import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;18import dk.aau.cs.model.tapn.TimedArcPetriNetNetwork;
16import dk.aau.cs.verification.ModelChecker;19import dk.aau.cs.verification.ModelChecker;
@@ -22,6 +25,8 @@
22import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNDiscreteVerification;25import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNDiscreteVerification;
23import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNOptions;26import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNOptions;
2427
28import java.util.ArrayList;
29
25public class KBoundAnalyzer {30public class KBoundAnalyzer {
26 protected TimedArcPetriNetNetwork tapnNetwork;31 protected TimedArcPetriNetNetwork tapnNetwork;
27 protected int k;32 protected int k;
@@ -40,16 +45,24 @@
40 }45 }
4146
42 public void analyze() {47 public void analyze() {
43 TAPNQuery query = getBoundednessQuery();48 analyze(verificationOptions());
44 VerifyTAPNOptions options = verificationOptions();
45
46 RunKBoundAnalysis analyzer = new RunKBoundAnalysis(modelChecker, messenger, spinner);
47 RunningVerificationDialog dialog = new RunningVerificationDialog(CreateGui.getApp(), analyzer);
48
49 analyzer.execute(options, tapnNetwork, query, null);
50 dialog.setVisible(true);
51 }49 }
5250
51 public void analyze(VerifyTAPNOptions options) {
52 TAPNQuery query;
53 if (modelChecker instanceof VerifyPN) {
54 query = getPNBoundednessQuery();
55 } else {
56 query = getBoundednessQuery();
57 }
58
59 RunKBoundAnalysis analyzer = new RunKBoundAnalysis(modelChecker, messenger, spinner);
60 RunningVerificationDialog dialog = new RunningVerificationDialog(CreateGui.getApp(), analyzer);
61
62 analyzer.execute(options, tapnNetwork, query, null);
63 dialog.setVisible(true);
64 }
65
53 protected VerifyTAPNOptions verificationOptions() {66 protected VerifyTAPNOptions verificationOptions() {
54 if(modelChecker instanceof VerifyPN){67 if(modelChecker instanceof VerifyPN){
55 return new VerifyPNOptions(k, TraceOption.NONE, SearchOption.BFS, false, ModelReduction.BOUNDPRESERVING, false, false, 1, QueryCategory.Default, AlgorithmOption.CERTAIN_ZERO, false, pipe.dataLayer.TAPNQuery.QueryReductionTime.UnlimitedTime, false, null, false);68 return new VerifyPNOptions(k, TraceOption.NONE, SearchOption.BFS, false, ModelReduction.BOUNDPRESERVING, false, false, 1, QueryCategory.Default, AlgorithmOption.CERTAIN_ZERO, false, pipe.dataLayer.TAPNQuery.QueryReductionTime.UnlimitedTime, false, null, false);
@@ -62,10 +75,48 @@
62 }75 }
6376
64 protected TAPNQuery getBoundednessQuery() {77 protected TAPNQuery getBoundednessQuery() {
65 TCTLAbstractProperty property = null;78 TCTLAbstractProperty property = new TCTLAGNode(new TCTLTrueNode());
66
67 property = new TCTLAGNode(new TCTLTrueNode());
68
69 return new TAPNQuery(property, k);79 return new TAPNQuery(property, k);
70 }80 }
81
82 protected TAPNQuery getPNBoundednessQuery() {
83 int totalTokens = k + tapnNetwork.marking().size();
84
85 TCTLAtomicPropositionNode child = new TCTLAtomicPropositionNode(new TCTLTermListNode(getFactors()), "<=", new TCTLConstNode(totalTokens));
86 TCTLAbstractProperty property = new TCTLAGNode(child);
87
88 TAPNQuery query = new TAPNQuery(property, k);
89 query.setCategory(QueryCategory.CTL);
90
91 return query;
92 }
93
94 private ArrayList<TCTLAbstractStateProperty> getFactors() {
95 TimedArcPetriNet net = mergeNetComponents();
96 ArrayList<TCTLAbstractStateProperty> factors = new ArrayList<>();
97
98 tapnNetwork.sharedPlaces().forEach(o -> {
99 if (net.getPlaceByName(o.name()) != null && !net.getPlaceByName(o.name()).name().contains("Shared_")) {
100 net.getPlaceByName(o.name()).setName("Shared_" + o.name());
101 }
102 });
103 tapnNetwork.allTemplates().forEach(o -> o.places().forEach(x -> {
104 if (net.getPlaceByName(x.name()) != null) net.getPlaceByName(x.name()).setName(o.name() + "_" + x.name());
105 }));
106
107 for (TimedPlace place : net.places()) {
108 factors.add(new TCTLPlaceNode(place.name()));
109 factors.add(new AritmeticOperator("+"));
110 }
111 if (factors.get(factors.size()-1) instanceof AritmeticOperator) factors.remove(factors.size()-1);
112
113 return factors;
114 }
115
116 private TimedArcPetriNet mergeNetComponents() {
117 TAPNComposer composer = new TAPNComposer(new MessengerImpl(), CreateGui.getCurrentTab().getGuiModels(), true, true);
118 Tuple<TimedArcPetriNet, NameMapping> transformedModel = composer.transformModel(tapnNetwork);
119
120 return transformedModel.value1();
121 }
71}122}
72123
=== modified file 'src/pipe/gui/RunKBoundAnalysis.java'
--- src/pipe/gui/RunKBoundAnalysis.java 2020-05-27 12:59:31 +0000
+++ src/pipe/gui/RunKBoundAnalysis.java 2021-08-25 10:24:16 +0000
@@ -4,33 +4,47 @@
4import javax.swing.JSpinner;4import javax.swing.JSpinner;
55
6import dk.aau.cs.Messenger;6import dk.aau.cs.Messenger;
7import dk.aau.cs.verification.VerifyTAPN.VerifyPN;
7import net.tapaal.resourcemanager.ResourceManager;8import net.tapaal.resourcemanager.ResourceManager;
8import dk.aau.cs.model.tapn.simulation.TAPNNetworkTrace;9import dk.aau.cs.model.tapn.simulation.TAPNNetworkTrace;
9import dk.aau.cs.verification.Boundedness;10import dk.aau.cs.verification.Boundedness;
10import dk.aau.cs.verification.ModelChecker;11import dk.aau.cs.verification.ModelChecker;
11import dk.aau.cs.verification.VerificationResult;12import dk.aau.cs.verification.VerificationResult;
1213
14import java.util.ArrayList;
15
13public class RunKBoundAnalysis extends RunVerificationBase {16public class RunKBoundAnalysis extends RunVerificationBase {
1417
15 private final JSpinner spinner;18 private final JSpinner spinner;
1619
17 public RunKBoundAnalysis(ModelChecker modelChecker, Messenger messenger,JSpinner spinner) {20 public RunKBoundAnalysis(ModelChecker modelChecker, Messenger messenger,JSpinner spinner) {
18 super(modelChecker, messenger);21 super(modelChecker, messenger, spinner);
19 this.spinner = spinner;22 this.spinner = spinner;
20 }23 }
2124
22 @Override25 @Override
23 protected void showResult(VerificationResult<TAPNNetworkTrace> result) {26 protected boolean showResult(VerificationResult<TAPNNetworkTrace> result) {
24 if(result != null && !result.error()) {27 if(result != null && !result.error()) {
25 if (!result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {28 if (!result.getQueryResult().boundednessAnalysis().boundednessResult().equals(Boundedness.Bounded)) {
26 JOptionPane.showMessageDialog(CreateGui.getApp(),29 JOptionPane.showMessageDialog(CreateGui.getApp(),
27 getAnswerNotBoundedString(), "Analysis Result",30 getAnswerNotBoundedString(), "Analysis Result",
28 JOptionPane.INFORMATION_MESSAGE);31 JOptionPane.INFORMATION_MESSAGE);
29 } else {32 } else {
30 spinner.setValue(result.getQueryResult().boundednessAnalysis().usedTokens() - result.getQueryResult().boundednessAnalysis().tokensInNet());33 if (modelChecker instanceof VerifyPN && !result.getRawOutput().contains("max tokens:")) {
31 JOptionPane.showMessageDialog(CreateGui.getApp(),34 Object[] options = {"Ok", "Minimize extra tokens"};
32 getAnswerBoundedString(), "Analysis Result",35 int answer = JOptionPane.showOptionDialog(CreateGui.getApp(),
33 JOptionPane.INFORMATION_MESSAGE, ResourceManager.satisfiedIcon());36 getPNAnswerBoundedString(), "Analysis Result,",
37 JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE,
38 ResourceManager.satisfiedIcon(), options, JOptionPane.OK_OPTION);
39 return answer != JOptionPane.OK_OPTION;
40 } else if (modelChecker instanceof VerifyPN) {
41 spinner.setValue(result.getQueryResult().boundednessAnalysis().usedTokens() - result.getQueryResult().boundednessAnalysis().tokensInNet());
42 } else {
43 spinner.setValue(result.getQueryResult().boundednessAnalysis().usedTokens() - result.getQueryResult().boundednessAnalysis().tokensInNet());
44 JOptionPane.showMessageDialog(CreateGui.getApp(),
45 getAnswerBoundedString(), "Analysis Result",
46 JOptionPane.INFORMATION_MESSAGE, ResourceManager.satisfiedIcon());
47 }
34 }48 }
35 } else { 49 } else {
36 String message = "An error occured during the verification." +50 String message = "An error occured during the verification." +
@@ -40,6 +54,7 @@
40 54
41 messenger.displayWrappedErrorMessage(message,"Error during verification");55 messenger.displayWrappedErrorMessage(message,"Error during verification");
42 }56 }
57 return false;
43 }58 }
4459
45 protected String getAnswerNotBoundedString() {60 protected String getAnswerNotBoundedString() {
@@ -58,4 +73,12 @@
58 + "The number of extra tokens was automatically lowered to the\n"73 + "The number of extra tokens was automatically lowered to the\n"
59 + "minimum number of tokens needed for an exact analysis.";74 + "minimum number of tokens needed for an exact analysis.";
60 }75 }
76
77 protected String getPNAnswerBoundedString() {
78 return "The net with the specified extra number of tokens is bounded.\n\n"
79 + "This means that the analysis will be exact and always give \n"
80 + "the correct answer.\n\n"
81 + "The number of extra tokens can be lowered to the minimum number\n"
82 + "of tokens needed for an exact analysis.";
83 }
61}84}
6285
=== modified file 'src/pipe/gui/RunVerification.java'
--- src/pipe/gui/RunVerification.java 2021-02-22 22:56:50 +0000
+++ src/pipe/gui/RunVerification.java 2021-08-25 10:24:16 +0000
@@ -31,7 +31,7 @@
31 private final IconSelector iconSelector;31 private final IconSelector iconSelector;
32 private final VerificationCallback callback;32 private final VerificationCallback callback;
33 public RunVerification(ModelChecker modelChecker, IconSelector selector, Messenger messenger, VerificationCallback callback, String reducedNetFilePath, boolean reduceNetOnly) {33 public RunVerification(ModelChecker modelChecker, IconSelector selector, Messenger messenger, VerificationCallback callback, String reducedNetFilePath, boolean reduceNetOnly) {
34 super(modelChecker, messenger, reducedNetFilePath, reduceNetOnly);34 super(modelChecker, messenger, reducedNetFilePath, reduceNetOnly, null);
35 iconSelector = selector;35 iconSelector = selector;
36 this.callback = callback;36 this.callback = callback;
37 }37 }
@@ -45,7 +45,7 @@
45 }45 }
4646
47 @Override47 @Override
48 protected void showResult(VerificationResult<TAPNNetworkTrace> result) {48 protected boolean showResult(VerificationResult<TAPNNetworkTrace> result) {
49 if (result != null && !result.error()) {49 if (result != null && !result.error()) {
50 if(callback != null){50 if(callback != null){
51 callback.run(result);51 callback.run(result);
@@ -98,6 +98,7 @@
98 messenger.displayWrappedErrorMessage(message,"Error during verification");98 messenger.displayWrappedErrorMessage(message,"Error during verification");
9999
100 }100 }
101 return false;
101 }102 }
102103
103 private String toHTML(String string){104 private String toHTML(String string){
104105
=== modified file 'src/pipe/gui/RunVerificationBase.java'
--- src/pipe/gui/RunVerificationBase.java 2021-02-07 11:09:51 +0000
+++ src/pipe/gui/RunVerificationBase.java 2021-08-25 10:24:16 +0000
@@ -3,9 +3,9 @@
3import java.io.File;3import java.io.File;
4import java.util.concurrent.ExecutionException;4import java.util.concurrent.ExecutionException;
55
6import javax.swing.SwingUtilities;6import javax.swing.*;
7import javax.swing.SwingWorker;
87
8import dk.aau.cs.verification.VerifyTAPN.VerifyTAPNOptions;
9import pipe.dataLayer.TAPNQuery.SearchOption;9import pipe.dataLayer.TAPNQuery.SearchOption;
10import dk.aau.cs.Messenger;10import dk.aau.cs.Messenger;
11import dk.aau.cs.TCTL.visitors.RenameAllPlacesVisitor;11import dk.aau.cs.TCTL.visitors.RenameAllPlacesVisitor;
@@ -43,20 +43,25 @@
43 protected String reducedNetFilePath;43 protected String reducedNetFilePath;
44 protected boolean reduceNetOnly;44 protected boolean reduceNetOnly;
45 protected boolean reducedNetOpened = false;45 protected boolean reducedNetOpened = false;
46 46 protected JSpinner spinner;
47 47
48 protected Messenger messenger;48 protected Messenger messenger;
4949
50 public RunVerificationBase(ModelChecker modelChecker, Messenger messenger, String reducedNetFilePath, boolean reduceNetOnly) {50 public RunVerificationBase(ModelChecker modelChecker, Messenger messenger, String reducedNetFilePath, boolean reduceNetOnly, JSpinner spinner) {
51 super();51 super();
52 this.modelChecker = modelChecker;52 this.modelChecker = modelChecker;
53 this.messenger = messenger;53 this.messenger = messenger;
54 this.reducedNetFilePath = reducedNetFilePath;54 this.reducedNetFilePath = reducedNetFilePath;
55 this.reduceNetOnly = reduceNetOnly;55 this.reduceNetOnly = reduceNetOnly;
56 }56 this.spinner = spinner;
57 }
5758
58 public RunVerificationBase(ModelChecker modelChecker, Messenger messenger) {59 public RunVerificationBase(ModelChecker modelChecker, Messenger messenger) {
59 this(modelChecker, messenger, null, false);60 this(modelChecker, messenger, null, false, null);
61 }
62
63 public RunVerificationBase(ModelChecker modelChecker, Messenger messenger, JSpinner spinner) {
64 this(modelChecker, messenger, null, false, spinner);
60 }65 }
6166
62 67
@@ -212,8 +217,12 @@
212 return;217 return;
213 }218 }
214 firePropertyChange("state", StateValue.PENDING, StateValue.DONE);219 firePropertyChange("state", StateValue.PENDING, StateValue.DONE);
215 showResult(result);
216220
221 if (showResult(result) && spinner != null) {
222 options = new VerifyPNOptions(options.extraTokens(), pipe.dataLayer.TAPNQuery.TraceOption.NONE, SearchOption.BFS, false, ModelReduction.BOUNDPRESERVING, false, false, 1, pipe.dataLayer.TAPNQuery.QueryCategory.Default, pipe.dataLayer.TAPNQuery.AlgorithmOption.CERTAIN_ZERO, false, pipe.dataLayer.TAPNQuery.QueryReductionTime.NoTime, false, null, false);
223 KBoundAnalyzer optimizer = new KBoundAnalyzer(model, options.extraTokens(), modelChecker, new MessengerImpl(), spinner);
224 optimizer.analyze((VerifyTAPNOptions) options);
225 }
217 } else {226 } else {
218 modelChecker.kill();227 modelChecker.kill();
219 messenger.displayInfoMessage("Verification was interrupted by the user. No result found!", "Verification Cancelled");228 messenger.displayInfoMessage("Verification was interrupted by the user. No result found!", "Verification Cancelled");
@@ -231,5 +240,5 @@
231 });240 });
232 }241 }
233242
234 protected abstract void showResult(VerificationResult<TAPNNetworkTrace> result);243 protected abstract boolean showResult(VerificationResult<TAPNNetworkTrace> result);
235}244}

Subscribers

People subscribed via source and target branches