From da69f175b4a229ab332a897dff79e137b41eb720 Mon Sep 17 00:00:00 2001 From: tempiaa <tempiaa@eurecom.fr> Date: Thu, 25 Jun 2020 13:57:51 +0200 Subject: [PATCH] More optimization for memory --- .../avatartranslator/AvatarSpecification.java | 6 +++ .../avatartranslator/AvatarTransition.java | 42 +++++++++++++--- .../modelchecker/AvatarModelChecker.java | 48 +++++++++++-------- .../modelchecker/SpecificationState.java | 9 +--- .../ui/window/JDialogAvatarModelChecker.java | 1 + 5 files changed, 72 insertions(+), 34 deletions(-) diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index deed36170e..9e5433fbef 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -367,6 +367,12 @@ public class AvatarSpecification extends AvatarElement { errors.add(at); } } + if (at.hasDelay()) { + returnVal = at.buildDelaySolver(); + if (returnVal == false) { + errors.add(at); + } + } for (AvatarAction aa : at.getActions()) { if (aa instanceof AvatarActionAssignment) { returnVal = ((AvatarActionAssignment) aa).buildActionSolver(block); diff --git a/src/main/java/avatartranslator/AvatarTransition.java b/src/main/java/avatartranslator/AvatarTransition.java index 18fc1432d4..935731cda8 100644 --- a/src/main/java/avatartranslator/AvatarTransition.java +++ b/src/main/java/avatartranslator/AvatarTransition.java @@ -93,10 +93,9 @@ public class AvatarTransition extends AvatarStateMachineElement { private String minCompute = "", maxCompute = ""; private AvatarStateMachineOwner block; - - - private AvatarExpressionSolver guardSolver; + private AvatarExpressionSolver minDelaySolver; + private AvatarExpressionSolver maxDelaySolver; private List<AvatarAction> actions; // actions on variable, or method call @@ -106,6 +105,8 @@ public class AvatarTransition extends AvatarStateMachineElement { this.guard = new AvatarGuardEmpty(); this.block = _block; guardSolver = null; + minDelaySolver = null; + maxDelaySolver = null; } public AvatarGuard getGuard() { @@ -113,15 +114,42 @@ public class AvatarTransition extends AvatarStateMachineElement { } public boolean buildGuardSolver() { - String expr = guard.toString().replaceAll("\\[", "").trim(); - expr = expr.replaceAll("\\]", ""); - guardSolver = new AvatarExpressionSolver(expr); - return guardSolver.buildExpression((AvatarBlock) block); + if (isGuarded()) { + String expr = guard.toString().replaceAll("\\[", "").trim(); + expr = expr.replaceAll("\\]", ""); + guardSolver = new AvatarExpressionSolver(expr); + return guardSolver.buildExpression((AvatarBlock) block); + } + return true; + } + + public boolean buildDelaySolver() { + boolean result; + if (hasDelay()) { + minDelaySolver = new AvatarExpressionSolver(minDelay); + result = minDelaySolver.buildExpression((AvatarBlock) block); + if (maxDelay.trim().length() != 0) { + maxDelaySolver = new AvatarExpressionSolver(maxDelay); + result &= maxDelaySolver.buildExpression((AvatarBlock) block); + } else { + maxDelaySolver = minDelaySolver; + } + return result; + } + return true; } public AvatarExpressionSolver getGuardSolver() { return guardSolver; } + + public AvatarExpressionSolver getMinDelaySolver() { + return minDelaySolver; + } + + public AvatarExpressionSolver getMaxDelaySolver() { + return maxDelaySolver; + } public void setGuard(AvatarGuard _guard) { this.guard = _guard; diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java index 744713c9e6..c05d093335 100644 --- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java +++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java @@ -85,6 +85,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { private boolean ignoreConcurrenceBetweenInternalActions; private boolean ignoreInternalStates; private boolean verboseInfo; + private int compressionFactor; // RG private boolean computeRG; @@ -152,6 +153,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { counterexample = false; freeIntermediateStateCoding = true; verboseInfo = true; + compressionFactor = 1; } public AvatarSpecification getInitialSpec() { @@ -213,6 +215,16 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { ignoreInternalStates = _b; } + public void setCompressionFactor(int compressionFactor) { + if (compressionFactor == 2 || compressionFactor == 4) { + this.compressionFactor = compressionFactor; + spec.sortAttributes(); + spec.setAttributeOptRatio(compressionFactor); + } else { + compressionFactor = 1; + } + } + public void setCheckNoDeadlocks(boolean _checkNoDeadlocks) { checkNoDeadlocks = _checkNoDeadlocks; deadlockStop = false; @@ -736,7 +748,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { prepareStates(); spec.sortAttributes(); - spec.setAttributeOptRatio(2); + spec.setAttributeOptRatio(compressionFactor); initExpressionSolvers(); prepareTransitions(); @@ -966,10 +978,10 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } - private void prepareTransitionsOfState(SpecificationState _ss) { + private ArrayList<SpecificationTransition> prepareTransitionsOfState(SpecificationState _ss) { int cpt; - _ss.transitions = new ArrayList<SpecificationTransition>(); + ArrayList<SpecificationTransition> transitions = new ArrayList<SpecificationTransition>(); //TraceManager.addDev("Preparing transitions of state " + _ss); @@ -984,12 +996,14 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { for (AvatarStateMachineElement elt : ase.getNexts()) { if (elt instanceof AvatarTransition) { - handleAvatarTransition((AvatarTransition) elt, block, sb, cpt, _ss.transitions, ase.getNexts().size() > 1); + handleAvatarTransition((AvatarTransition) elt, block, sb, cpt, transitions, ase.getNexts().size() > 1); } } cpt++; } + + return transitions; } @@ -1001,10 +1015,10 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { return; } - prepareTransitionsOfState(_ss); + ArrayList<SpecificationTransition> transitions = prepareTransitionsOfState(_ss); - if (_ss.transitions == null) { + if (transitions == null) { TraceManager.addDev("null transitions"); nbOfDeadlocks++; checkPropertyOnDeadlock(_ss); @@ -1013,7 +1027,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } //TraceManager.addDev("Possible transitions 1:" + transitions.size()); - ArrayList<SpecificationTransition> transitions = computeValidTransitions(_ss.transitions); + transitions = computeValidTransitions(transitions); //TraceManager.addDev("Possible transitions 3:" + transitions.size()); @@ -1176,8 +1190,6 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (freeIntermediateStateCoding) { _ss.freeUselessAllocations(); - } else { - _ss.finished(); } mustStop(); @@ -1284,9 +1296,9 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { // Compute next transition //prepareTransitionsOfState(previousState); - prepareTransitionsOfState(newState); + ArrayList<SpecificationTransition> transitions = prepareTransitionsOfState(newState); - if (newState.transitions == null) { + if (transitions == null) { TraceManager.addDev("null transitions"); nbOfDeadlocks++; checkPropertyOnDeadlock(_ss); @@ -1294,7 +1306,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { return; } - ArrayList<SpecificationTransition> transitions = computeValidTransitions(newState.transitions); + transitions = computeValidTransitions(transitions); st = null; if (ignoreConcurrenceBetweenInternalActions) { @@ -1365,8 +1377,6 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (freeIntermediateStateCoding) { _ss.freeUselessAllocations(); - } else { - _ss.finished(); } mustStop(); @@ -1382,13 +1392,13 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { ArrayList<Integer> stackStates = new ArrayList<>(); //keeps track of the block hashes do { - prepareTransitionsOfState(prevState); + ArrayList<SpecificationTransition> transitions = prepareTransitionsOfState(prevState); - if (prevState.transitions == null) { + if (transitions == null) { return prevState; } - ArrayList<SpecificationTransition> transitions = computeValidTransitions(prevState.transitions); + transitions = computeValidTransitions(transitions); stackStates.add(prevState.hashValue); found = false; @@ -1494,13 +1504,13 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if ((minDelay == null) || (minDelay.length() == 0)) { st.clockMin = 0 - _sb.values[SpecificationBlock.CLOCKMAX_INDEX]; } else { - st.clockMin = evaluateIntExpression(_at.getMinDelay(), _block, _sb) - _sb.values[SpecificationBlock.CLOCKMAX_INDEX]; + st.clockMin = _at.getMinDelaySolver().getResult(_sb) - _sb.values[SpecificationBlock.CLOCKMAX_INDEX]; } String maxDelay = _at.getMaxDelay().trim(); if ((maxDelay == null) || (maxDelay.length() == 0)) { st.clockMax = 0 - _sb.values[SpecificationBlock.CLOCKMIN_INDEX]; } else { - int resMax = evaluateIntExpression(_at.getMaxDelay(), _block, _sb); + int resMax = _at.getMaxDelaySolver().getResult(_sb); _sb.maxClock = Math.max(_sb.maxClock, resMax); st.clockMax = resMax - _sb.values[SpecificationBlock.CLOCKMIN_INDEX]; } diff --git a/src/main/java/avatartranslator/modelchecker/SpecificationState.java b/src/main/java/avatartranslator/modelchecker/SpecificationState.java index 51247a4d4c..2d4533bad7 100644 --- a/src/main/java/avatartranslator/modelchecker/SpecificationState.java +++ b/src/main/java/avatartranslator/modelchecker/SpecificationState.java @@ -65,9 +65,8 @@ public class SpecificationState implements Comparable<SpecificationState> { public LinkedList<SpecificationLink> nexts; // The RG is there public boolean property; //trace the property check at this state public boolean elaborated; //true only if the elaboration has been completed - public ArrayList<SpecificationTransition> transitions; -// public long distance; //max #steps to be reached from S0 + public SpecificationState() { hashComputed = false; property = false; @@ -193,14 +192,8 @@ public class SpecificationState implements Comparable<SpecificationState> { return 0; } - public void finished() { - //blocks = null; - transitions = null; - } - public void freeUselessAllocations() { blocks = null; - transitions = null; } public int compareTo( SpecificationState _s ) { diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java index 225f9ee218..0b78621a84 100644 --- a/src/main/java/ui/window/JDialogAvatarModelChecker.java +++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java @@ -729,6 +729,7 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act timer.scheduleAtFixedRate(mcm, 0, 500); // Setting options + amc.setCompressionFactor(1); amc.setIgnoreEmptyTransitions(ignoreEmptyTransitionsSelected); amc.setIgnoreConcurrenceBetweenInternalActions(ignoreConcurrenceBetweenInternalActionsSelected); amc.setIgnoreInternalStates(ignoreInternalStatesSelected); -- GitLab