From 0663831b5ee908ab0006413003a089b889f1dc8f Mon Sep 17 00:00:00 2001 From: tempiaa <tempiaa@eurecom.fr> Date: Mon, 20 Apr 2020 18:03:26 +0200 Subject: [PATCH] Assigment Action using the new expression evaluator --- .../AvatarActionAssignment.java | 23 ++++++ .../AvatarExpressionAttribute.java | 24 ++++++ .../modelchecker/AvatarModelChecker.java | 73 +++++++++++-------- 3 files changed, 89 insertions(+), 31 deletions(-) diff --git a/src/main/java/avatartranslator/AvatarActionAssignment.java b/src/main/java/avatartranslator/AvatarActionAssignment.java index 8a558a16bb..40d0c911d5 100644 --- a/src/main/java/avatartranslator/AvatarActionAssignment.java +++ b/src/main/java/avatartranslator/AvatarActionAssignment.java @@ -42,6 +42,8 @@ import myutil.TraceManager; import java.util.Map; +import avatartranslator.modelchecker.SpecificationBlock; + /** * Class AvatarActionAssignment * Creation: 16/09/2015 @@ -51,10 +53,14 @@ import java.util.Map; public class AvatarActionAssignment implements AvatarAction { AvatarLeftHand leftHand; AvatarTerm rightHand; + AvatarExpressionSolver actionSolver; + private AvatarExpressionAttribute leftAttribute; public AvatarActionAssignment (AvatarLeftHand _leftHand, AvatarTerm _rightHand) { this.leftHand = _leftHand; this.rightHand = _rightHand; + this.actionSolver = null; + this.leftAttribute = null; } public boolean isAVariableSetting () { @@ -72,6 +78,10 @@ public class AvatarActionAssignment implements AvatarAction { public AvatarTerm getRightHand () { return this.rightHand; } + + public AvatarExpressionSolver getActionSolver() { + return actionSolver; + } public boolean isABasicVariableSetting () { return (this.leftHand instanceof AvatarAttribute || this.leftHand instanceof AvatarTuple) && @@ -85,6 +95,19 @@ public class AvatarActionAssignment implements AvatarAction { public String toString () { return this.leftHand.getName() + " = " + this.rightHand.getName(); } + + public boolean buildActionSolver(AvatarBlock block) { + boolean res; + actionSolver = new AvatarExpressionSolver(rightHand.getName()); + res = actionSolver.buildExpression((AvatarBlock) block); + leftAttribute = new AvatarExpressionAttribute(block, leftHand.getName()); + res &= !leftAttribute.hasError(); + return res; + } + + public void executeActionSolver(SpecificationBlock sb) { + leftAttribute.setValue(sb, actionSolver.getResult(sb)); + } @Override public boolean containsAMethodCall () { diff --git a/src/main/java/avatartranslator/AvatarExpressionAttribute.java b/src/main/java/avatartranslator/AvatarExpressionAttribute.java index 264eef134b..5f8ccad448 100644 --- a/src/main/java/avatartranslator/AvatarExpressionAttribute.java +++ b/src/main/java/avatartranslator/AvatarExpressionAttribute.java @@ -190,6 +190,30 @@ public class AvatarExpressionAttribute { return value; } + public void setValue(SpecificationState ss, int value) { + int v = value; + + if (isNot) { + v = (value == 0) ? 1 : 0; + } else if (isNegated) { + v = -value; + } + + ss.blocks[blockIndex].values[accessIndex] = v; + } + + public void setValue(SpecificationBlock sb, int value) { + int v = value; + + if (isNot) { + v = (value == 0) ? 1 : 0; + } else if (isNegated) { + v = -value; + } + + sb.values[accessIndex] = v; + } + public String toString() { String res = ""; if (isNot) { diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java index b90ea40fba..ca5d24b9e9 100644 --- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java +++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java @@ -159,20 +159,6 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { public AvatarSpecification getReworkedAvatarSpecification() { return spec; } - - private void initExpressionSolvers() { - for (AvatarBlock block : spec.getListOfBlocks()) { - AvatarStateMachine asm = block.getStateMachine(); - - for (AvatarStateMachineElement elt : asm.getListOfElements()) { - if (elt instanceof AvatarTransition) { - if (((AvatarTransition) elt).isGuarded()) { - ((AvatarTransition) elt).buildGuardSolver(); - } - } - } - } - } public int getNbOfStates() { if (states == null) { @@ -448,6 +434,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { nbOfThreads = Runtime.getRuntime().availableProcessors(); + nbOfThreads = 1; TraceManager.addDev("Starting the model checking with " + nbOfThreads + " threads"); TraceManager.addDev("Ignore internal state:" + ignoreInternalStates); startModelChecking(nbOfThreads); @@ -680,6 +667,28 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { } nbOfCurrentComputations = 0; } + + private void initExpressionSolvers() { + AvatarTransition at; + + for (AvatarBlock block : spec.getListOfBlocks()) { + AvatarStateMachine asm = block.getStateMachine(); + + for (AvatarStateMachineElement elt : asm.getListOfElements()) { + if (elt instanceof AvatarTransition) { + at = (AvatarTransition) elt; + if (at.isGuarded()) { + at.buildGuardSolver(); + } + for (AvatarAction aa : at.getActions()) { + if (aa instanceof AvatarActionAssignment) { + ((AvatarActionAssignment) aa).buildActionSolver(block); + } + } + } + } + } + } private void prepareTransitionsOfState(SpecificationState _ss) { @@ -1419,23 +1428,25 @@ public class AvatarModelChecker implements Runnable, myutil.Graph { if (retAction == null) { retAction = nameOfVar + "=" + act; } - - int indexVar = block.getIndexOfAvatarAttributeWithName(nameOfVar); - AvatarType type = block.getAttribute(indexVar).getType(); - if (indexVar != -1) { - if (type == AvatarType.INTEGER) { - //TraceManager.addDev("Evaluating int expr=" + act); - int result = evaluateIntExpression(act, _st.blocks[0], _newState.blocks[_st.blocksInt[0]]); - _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = result; - } else if (type == AvatarType.BOOLEAN) { - boolean bool = evaluateBoolExpression(act, _st.blocks[0], _newState.blocks[_st.blocksInt[0]]); - if (bool) { - _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = 1; - } else { - _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = 0; - } - } - } + + ((AvatarActionAssignment) aAction).executeActionSolver(_newState.blocks[_st.blocksInt[0]]); + +// int indexVar = block.getIndexOfAvatarAttributeWithName(nameOfVar); +// AvatarType type = block.getAttribute(indexVar).getType(); +// if (indexVar != -1) { +// if (type == AvatarType.INTEGER) { +// //TraceManager.addDev("Evaluating int expr=" + act); +// int result = evaluateIntExpression(act, _st.blocks[0], _newState.blocks[_st.blocksInt[0]]); +// _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = result; +// } else if (type == AvatarType.BOOLEAN) { +// boolean bool = evaluateBoolExpression(act, _st.blocks[0], _newState.blocks[_st.blocksInt[0]]); +// if (bool) { +// _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = 1; +// } else { +// _newState.blocks[_st.blocksInt[0]].values[SpecificationBlock.ATTR_INDEX + indexVar] = 0; +// } +// } +// } } } -- GitLab