diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java index faf0d8730d3bef5664e15af3caf8461cf4746e6e..a933cf715973f186407eb47081873755eff9e927 100644 --- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java +++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java @@ -135,6 +135,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { checkNoDeadlocks = false; deadlockStop = false; studyReachability = false; + studyReinit = false; computeRG = false; stateLimitRG = false; //No state limit in RG computation timeLimitRG = false; @@ -326,13 +327,13 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } - public void setReinitAnalyzis(boolean studyReinit) { + public void setReinitAnalysis(boolean studyReinit) { this.studyReinit = studyReinit; } public boolean getReinitResult() { - if (initState != null) { + if (studyReinit && initState != null) { return initState.getResult(); } return false; @@ -363,7 +364,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { }*/ public boolean startModelCheckingProperties() { - boolean studyS, studyL, studyR, genRG; + boolean studyS, studyL, studyR, studyRI, genRG; long deadlocks = 0; if (spec == null) { @@ -382,6 +383,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { studyR = studyReachability; studyL = studyLiveness; studyS = studySafety; + studyRI = studyReinit; genRG = computeRG; //then compute livenesses @@ -390,15 +392,16 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { studySafety = false; studyLiveness = false; studyReachability = false; + studyReinit = false; if (studyL) { studySafety = true; for (SafetyProperty sp : livenesses) { safety = sp; startModelChecking(nbOfThreads); + deadlocks += nbOfDeadlocks; resetModelChecking(); safety.setComputed(); - deadlocks += nbOfDeadlocks; } studySafety = false; } @@ -426,12 +429,20 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { safetyLeadStates = null; } safety.setComputed(); - resetModelChecking(); deadlocks += nbOfDeadlocks; + resetModelChecking(); } studySafety = false; } + if (studyRI) { + studyReinit = true; + startModelChecking(nbOfThreads); + deadlocks += nbOfDeadlocks; + resetModelChecking(); + studyReinit = false; + } + if (studyR || genRG) { if (genRG) { deadlocks = 0; @@ -462,6 +473,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { studyLiveness = studyL; studySafety = studyS; studyReachability = studyR; + studyReinit = studyRI; TraceManager.addDev("Model checking done"); return true; @@ -538,6 +550,11 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } else { pendingStates.add(initialState); } + + if (studyReinit) { + initState = new SpecificationReinit(initialState); + } + //states.put(initialState.hashValue, initialState); //statesByID.put(initialState.id, initialState); nbOfCurrentComputations = 0; @@ -1858,18 +1875,29 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } } } + + if (studyReinit && similar != null) { + if (similar != initState.initState && stateIsReachableFromState(similar, _ss)) { + propertyDone = true; + initState.setResult(false); + } + } } private void checkPropertyOnDeadlock(SpecificationState ss) { if (studySafety) { if (safety.safetyType == SafetyProperty.ALLTRACES_ONESTATE && ss.property == false) { - safety.result = false; propertyDone = true; + safety.result = false; } else if (safety.safetyType == SafetyProperty.ONETRACE_ALLSTATES && ss.property == false) { - safety.result = true; propertyDone = true; + safety.result = true; } } + if (studyReinit) { + propertyDone = true; + initState.setResult(false); + } } @@ -2092,6 +2120,23 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } return ret.toString(); } + + + public String reinitToString() { + if (!studyReinit || initState == null) { + return "Reinitialization check not activeted\n"; + } + + String ret; + if (initState.getResult()) { + ret = "property is satisfied\n"; + } else { + ret = "property is NOT satisfied\n"; + } + + return ret; + } + // Do not free the RG public void freeUselessAllocations() { diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java index b13f0c8b87b337b70e2e5bd272c8933ae1bf5f2e..7ecb33b1d95d8a9a1f1294c5cce1981ea8c74e0c 100644 --- a/src/main/java/ui/window/JDialogAvatarModelChecker.java +++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java @@ -101,6 +101,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act protected static int livenessSelected = LIVENESS_NONE; protected static boolean safetySelected = false; protected static boolean checkNoDeadSelected = false; + protected static boolean checkReinitSelected = false; protected static boolean limitStatesSelected = false; protected static String stateLimitValue; protected static boolean limitTimeSelected = false; @@ -151,6 +152,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act protected JCheckBox timeLimit; protected JTextField timeLimitField; protected JCheckBox noDeadlocks; + protected JCheckBox reinit; protected JCheckBox safety; protected JButton checkUncheckAllPragmas; protected java.util.List<JCheckBox> customChecks; @@ -302,9 +304,17 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act // Deadlocks + cbasic.gridwidth = 1; noDeadlocks = new JCheckBox("No deadlocks?", checkNoDeadSelected); noDeadlocks.addActionListener(this); jpbasic.add(noDeadlocks, cbasic); + + + // Reinit + cbasic.gridwidth = GridBagConstraints.REMAINDER; + reinit = new JCheckBox("Reinitialization?", checkReinitSelected); + reinit.addActionListener(this); + jpbasic.add(reinit, cbasic); // Reachability @@ -699,6 +709,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act amc.setIgnoreConcurrenceBetweenInternalActions(ignoreConcurrenceBetweenInternalActionsSelected); amc.setIgnoreInternalStates(ignoreInternalStatesSelected); amc.setCheckNoDeadlocks(checkNoDeadSelected); + amc.setReinitAnalysis(checkReinitSelected); // Reachability int res; @@ -824,9 +835,14 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act jta.append("\n\nModel checking done\n"); jta.append("Nb of states:" + amc.getNbOfStates() + "\n"); jta.append("Nb of links:" + amc.getNbOfLinks() + "\n"); + if (checkNoDeadSelected) { jta.append("\nNo deadlocks?\n" + "-> " + amc.deadlockToString() + "\n"); } + + if (checkReinitSelected) { + jta.append("\nReinitialization?\n" + "-> " + amc.reinitToString() + "\n"); + } if ((reachabilitySelected == REACHABILITY_SELECTED) || (reachabilitySelected == REACHABILITY_ALL)) { jta.append("\nReachabilities found:\n"); @@ -1002,6 +1018,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act ignoreConcurrenceBetweenInternalActionsSelected = ignoreConcurrenceBetweenInternalActions.isSelected(); ignoreInternalStatesSelected = ignoreInternalStates.isSelected(); checkNoDeadSelected = noDeadlocks.isSelected(); + checkReinitSelected = reinit.isSelected(); if (noReachability.isSelected()) { reachabilitySelected = REACHABILITY_NONE; @@ -1034,7 +1051,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act switch (mode) { case NOT_STARTED: - if ((reachabilitySelected == REACHABILITY_SELECTED) || (reachabilitySelected == REACHABILITY_ALL) || (livenessSelected == LIVENESS_SELECTED) || (livenessSelected == LIVENESS_ALL) || checkNoDeadSelected || graphSelected || graphSelectedDot) { + if ((reachabilitySelected == REACHABILITY_SELECTED) || (reachabilitySelected == REACHABILITY_ALL) || (livenessSelected == LIVENESS_SELECTED) || (livenessSelected == LIVENESS_ALL) || checkNoDeadSelected || checkReinitSelected || graphSelected || graphSelectedDot) { start.setEnabled(true); } else { if (safetySelected) {