From fc74a45f287373359c1fc68712fbb5c8e320f29f Mon Sep 17 00:00:00 2001 From: tempiaa <tempiaa@eurecom.fr> Date: Thu, 17 Sep 2020 21:35:33 +0200 Subject: [PATCH] Added BFS/DFS choice, updated deadlock check on DFS --- .../modelchecker/AvatarModelChecker.java | 31 ++++++++++++++++--- src/main/java/cli/Action.java | 5 +++ .../ui/window/JDialogAvatarModelChecker.java | 16 ++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java index 801a83fcd8..ccf5f675de 100644 --- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java +++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java @@ -81,6 +81,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { // Options + private boolean depthSearch; private boolean ignoreEmptyTransitions; private boolean ignoreConcurrenceBetweenInternalActions; private boolean ignoreInternalStates; @@ -147,6 +148,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { spec = initialSpec.advancedClone(); //TraceManager.addDev("After clone:\n" + spec); } + depthSearch = false; ignoreEmptyTransitions = true; ignoreConcurrenceBetweenInternalActions = true; ignoreInternalStates = true; @@ -213,6 +215,10 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { public void setFreeIntermediateStateCoding(boolean _b) { freeIntermediateStateCoding = _b; } + + public void setSearchType(int searchType) { + depthSearch = searchType == 1; + } public void setIgnoreEmptyTransitions(boolean _b) { ignoreEmptyTransitions = _b; @@ -459,7 +465,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { public boolean startModelCheckingProperties() { boolean studyS, studyL, studyR, studyRI, studyAL, genRG, genTrace; - boolean emptyTr, ignoreConcurrence; + boolean depthS, emptyTr, ignoreConcurrence; long deadlocks = 0; if (spec == null) { @@ -477,6 +483,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { stateLimitRG = false; timeLimitRG = false; + depthS = depthSearch; emptyTr = ignoreEmptyTransitions; ignoreConcurrence = ignoreConcurrenceBetweenInternalActions; studyR = studyReachability; @@ -529,9 +536,11 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (studyRI) { studyReinit = true; + depthSearch = true; startModelChecking(nbOfThreads); deadlocks += nbOfDeadlocks; resetModelChecking(); + depthSearch = depthS; studyReinit = false; } @@ -568,6 +577,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { //there is no need to study deadlocks again if (deadlocks == 0 || genTrace) { deadlockStop = true; + depthSearch = true; counterexample = genTrace; ignoreConcurrenceBetweenInternalActions = true; resetCounterexample(); @@ -577,6 +587,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { resetModelChecking(); ignoreConcurrenceBetweenInternalActions = ignoreConcurrence; counterexample = false; + depthSearch = depthS; deadlockStop = false; } } @@ -1312,7 +1323,11 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (studySafety) { actionOnProperty(newState, i, similar, _ss); } else { - pendingStates.add(newState); + if (depthSearch && i == 0) { + pendingStates.add(0, newState); + } else { + pendingStates.add(newState); + } if (counterexample && deadlockStop) { //Register counterexample trace actionOnProperty(newState, i, similar, _ss); @@ -1419,7 +1434,11 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (studySafety) { actionOnProperty(newState, 0, similar, _ss); } else { - pendingStates.add(newState); + if (depthSearch) { + pendingStates.add(0, newState); + } else { + pendingStates.add(newState); + } if (counterexample && deadlockStop) { //Register counterexample trace actionOnProperty(newState, 0, similar, _ss); @@ -1512,7 +1531,11 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (studySafety) { actionOnProperty(newState, 0, similar, _ss); } else { - pendingStates.add(newState); + if (depthSearch) { + pendingStates.add(0, newState); + } else { + pendingStates.add(newState); + } if (counterexample && deadlockStop) { //Register counterexample trace actionOnProperty(newState, 0, similar, _ss); diff --git a/src/main/java/cli/Action.java b/src/main/java/cli/Action.java index 73978e841b..c12ae2b976 100644 --- a/src/main/java/cli/Action.java +++ b/src/main/java/cli/Action.java @@ -854,6 +854,7 @@ public class Action extends Command { + "-q \"QUERY\"\tquery a safety pragma\n" + "-d\tno deadlocks check\n" + "-i\ttest model reinitialization\n" + + "-dfs\tDFS search preferred over BFS\n" + "-a\tno internal actions loops check\n" + "-n NUM\tmaximum states created (Only for a non verification study)\n" + "-t NUM\tmaximum time (ms) (Only for a non verification study)\n" @@ -976,6 +977,10 @@ public class Action extends Command { amc.setReinitAnalysis(true); reinit = true; break; + case "-dfs": + //internal action loops + amc.setSearchType(1); + break; case "-a": //internal action loops amc.setInternalActionLoopAnalysis(true); diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java index b216e4d965..1001eb7107 100644 --- a/src/main/java/ui/window/JDialogAvatarModelChecker.java +++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java @@ -83,6 +83,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act private final static String[] INFOS = {"Not started", "Running", "Stopped by user", "Finished"}; private final static Color[] COLORS = {Color.darkGray, Color.magenta, Color.red, Color.blue}; private final static String[] WORD_BITS = {"32 bits", "16 bits", "8 bits"}; + private final static String[] SEARCH_TYPE = {"BFS", "DFS"}; public final static int REACHABILITY_ALL = 1; @@ -116,6 +117,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act protected static boolean limitTimeSelected = false; protected static String timeLimitValue; protected static int wordRepresentationSelected = 1; + protected static int searchTypeSelected = 0; protected MainGUI mgui; @@ -147,6 +149,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act protected JButton show; protected JButton display; protected JComboBox wordRepresentationBox; + protected JComboBox searchTypeBox; //protected JRadioButton exe, exeint; //protected ButtonGroup exegroup; @@ -282,6 +285,17 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act ignoreEmptyTransitions.addActionListener(this); jp01.add(ignoreEmptyTransitions, c01); + c01.anchor = GridBagConstraints.EAST; + c01.fill = GridBagConstraints.NONE; + jp01.add(new JLabel("Search type: "), c01); + + c01.anchor = GridBagConstraints.WEST; + c01.fill = GridBagConstraints.HORIZONTAL; + searchTypeBox = new JComboBox(SEARCH_TYPE); + searchTypeBox.setSelectedIndex(searchTypeSelected); + searchTypeBox.addActionListener(this); + jp01.add(searchTypeBox, c01); + c01.anchor = GridBagConstraints.EAST; c01.fill = GridBagConstraints.NONE; jp01.add(new JLabel("Word size: "), c01); @@ -759,6 +773,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act // Setting options amc.setCompressionFactor(wordRepresentationSelected << 1); + amc.setSearchType(searchTypeSelected); amc.setIgnoreEmptyTransitions(ignoreEmptyTransitionsSelected); amc.setIgnoreConcurrenceBetweenInternalActions(ignoreConcurrenceBetweenInternalActionsSelected); amc.setIgnoreInternalStates(ignoreInternalStatesSelected); @@ -1145,6 +1160,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act checkReinitSelected = reinit.isSelected(); checkActionLoopSelected = actionLoop.isSelected(); wordRepresentationSelected = wordRepresentationBox.getSelectedIndex(); + searchTypeSelected = searchTypeBox.getSelectedIndex(); if (noReachability.isSelected()) { reachabilitySelected = REACHABILITY_NONE; -- GitLab