From 43e030d2f9d9429afa58332e59b9e73c9a158ccc Mon Sep 17 00:00:00 2001
From: tempiaa <tempiaa@eurecom.fr>
Date: Fri, 24 Apr 2020 14:14:36 +0200
Subject: [PATCH] Model-checker: improved heap memory footprint of about 60%

---
 .../modelchecker/AvatarModelChecker.java      | 17 ++++---
 .../modelchecker/SafetyProperty.java          |  4 +-
 .../modelchecker/SpecificationTransition.java | 49 ++++++-------------
 3 files changed, 29 insertions(+), 41 deletions(-)

diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
index c2a5c24651..5f8ac57c61 100644
--- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
+++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
@@ -209,7 +209,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
                 //TraceManager.addDev("null elt in state machine of block=" + block.getName());
                 //if (elt.canBeVerified() && elt.isChecked()) {
                 if (elt.isChecked()) {
-                    SafetyProperty sp = new SafetyProperty(block, elt);
+                    SafetyProperty sp = new SafetyProperty(block, elt, SafetyProperty.ALLTRACES_ONESTATE);
                     livenesses.add(sp);
                 }
             }
@@ -223,7 +223,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
         for (AvatarBlock block : spec.getListOfBlocks()) {
             for (AvatarStateMachineElement elt : block.getStateMachine().getListOfElements()) {
                 if (((elt instanceof AvatarStateElement) && (elt.canBeVerified())) || (elt.isCheckable())) {
-                    SafetyProperty sp = new SafetyProperty(block, elt);
+                    SafetyProperty sp = new SafetyProperty(block, elt, SafetyProperty.ALLTRACES_ONESTATE);
                     livenesses.add(sp);
                 }
             }
@@ -549,7 +549,9 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
     public void stopModelChecking() {
         emptyPendingStates();
         stoppedBeforeEnd = true;
-        safety.result = false;
+        if (studySafety) {
+            safety.result = false;
+        }
         TraceManager.addDev("Model checking stopped");
     }
     
@@ -770,7 +772,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
                             ((AvatarActionAssignment) aa).buildActionSolver(block);
                         }
                     }
-                }else if (elt instanceof AvatarActionOnSignal) {
+                } else if (elt instanceof AvatarActionOnSignal) {
                     ((AvatarActionOnSignal) elt).buildActionSolver(block);
                 }
             }
@@ -1423,7 +1425,8 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
             ase = getNextState(_st.transitions[i], _newState, 10);
             if (ase != null) {
                 checkElement(ase, _newState);
-                int index = _st.blocks[i].getStateMachine().getIndexOfState(ase);
+                //int index = _st.blocks[i].getStateMachine().getIndexOfState(ase);
+                int index = _st.transitions[i].getBlock().getStateMachine().getIndexOfState(ase);
                 if (index > -1) {
                     _newState.blocks[_st.blocksInt[i]].values[SpecificationBlock.STATE_INDEX] = index;
                 }
@@ -1507,7 +1510,9 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
             retAction = "";
         }
 
-        return "i(" + _st.blocks[0].getName() + "/" + retAction + ")";
+        //return "i(" + _st.blocks[0].getName() + "/" + retAction + ")";
+        return "i(" + _st.transitions[0].getBlock().getName() + "/" + retAction + ")";
+
     }
 
     private String executeSyncTransition(SpecificationState _previousState, SpecificationState _newState, SpecificationTransition _st) {
diff --git a/src/main/java/avatartranslator/modelchecker/SafetyProperty.java b/src/main/java/avatartranslator/modelchecker/SafetyProperty.java
index 651b555382..9f599f5554 100644
--- a/src/main/java/avatartranslator/modelchecker/SafetyProperty.java
+++ b/src/main/java/avatartranslator/modelchecker/SafetyProperty.java
@@ -88,7 +88,7 @@ public class SafetyProperty  {
         analyzeProperty(_spec);
     }
     
-    public SafetyProperty(AvatarBlock block, AvatarStateMachineElement state) {
+    public SafetyProperty(AvatarBlock block, AvatarStateMachineElement state, int _safetyType) {
         //create liveness safety
         this.block = block;
         this.state = state;
@@ -96,7 +96,7 @@ public class SafetyProperty  {
         safetySolver = new AvatarExpressionSolver();
         safetySolver.builExpression(attribute);
         propertyType = BLOCK_STATE;
-        safetyType = ALLTRACES_ONESTATE;
+        safetyType = _safetyType;
         result = true;
     }
 
diff --git a/src/main/java/avatartranslator/modelchecker/SpecificationTransition.java b/src/main/java/avatartranslator/modelchecker/SpecificationTransition.java
index d375c7f9cf..a44e68f79b 100644
--- a/src/main/java/avatartranslator/modelchecker/SpecificationTransition.java
+++ b/src/main/java/avatartranslator/modelchecker/SpecificationTransition.java
@@ -57,8 +57,6 @@ public class SpecificationTransition  {
 
     public boolean fromStateWithMoreThanOneTransition;
     
-    public AvatarBlock[] blocks;
-    public SpecificationBlock[] specBlocks;
     public int[] blocksInt;
 
     public AvatarTransition[] transitions;
@@ -71,13 +69,7 @@ public class SpecificationTransition  {
 
     public void init(int _nbOfElements, AvatarTransition _at, AvatarBlock _ab, SpecificationBlock _sb, int _blockIndex) {
         transitions = new AvatarTransition[_nbOfElements];
-        transitions[0] = _at;
-
-        blocks = new AvatarBlock[_nbOfElements];
-        blocks[0] = _ab;
-
-        specBlocks = new SpecificationBlock[_nbOfElements];
-        specBlocks[0] = _sb;
+        transitions[0] = _at;        
 
         blocksInt = new int[_nbOfElements];
         blocksInt[0] = _blockIndex;
@@ -97,14 +89,6 @@ public class SpecificationTransition  {
         transitions[0] = _tr1.transitions[0];
         transitions[1] = _tr2.transitions[0];
 
-        blocks = new AvatarBlock[nbOfElements];
-        blocks[0] = _tr1.blocks[0];
-        blocks[1] = _tr2.blocks[0];
-
-        specBlocks = new SpecificationBlock[nbOfElements];
-        specBlocks[0] = _tr1.specBlocks[0];
-        specBlocks[1] = _tr2.specBlocks[0];
-
         blocksInt = new int[nbOfElements];
         blocksInt[0] = _tr1.blocksInt[0];
         blocksInt[1] = _tr2.blocksInt[0];
@@ -115,17 +99,17 @@ public class SpecificationTransition  {
     }
 
     public boolean hasBlockOf(SpecificationTransition _tr) {
-        if (blocks == null) {
+        if (transitions == null) {
             return false;
         }
 
-        if (_tr.blocks == null) {
+        if (_tr.transitions == null) {
             return false;
         }
 
-        for (int i=0; i<blocks.length; i++) {
-            for(int j=0; j<_tr.blocks.length; j++) {
-                if (blocks[i] == _tr.blocks[j]) {
+        for (int i=0; i<transitions.length; i++) {
+            for(int j=0; j<_tr.transitions.length; j++) {
+                if (transitions[i].getBlock() == _tr.transitions[j].getBlock()) {
                     return true;
                 }
             }
@@ -134,6 +118,7 @@ public class SpecificationTransition  {
         return false;
     }
 
+    
     public boolean hasBlockIndex(int _index) {
         if (blocksInt == null) {
             return false;
@@ -151,19 +136,17 @@ public class SpecificationTransition  {
     public String toString() {
         String ret = "Trans: ";
 
-        if (blocks != null) {
-            for (int i=0; i<blocks.length; i++) {
-                ret += "/ Block" + i  + ": " + blocks[i].getName();
-            }
+//        if (blocks != null) {
+//            for (int i=0; i<blocks.length; i++) {
+//                ret += "/ Block" + i  + ": " + blocks[i].getName();
+//            }
+//        }
+        if (transitions != null) {
+            for (int i = 0; i < transitions.length; i++) {
+                ret += "/ Block" + i  + ": " + transitions[i].getBlock().getName() + "/" + transitions[i];
+        	}
         }
         
-	
-	
-	if (transitions != null) {
-	    for (int i=0; i<transitions.length; i++) {
-		ret += "/" + transitions[i];
-	    }
-	}
         return ret;
     }
     
-- 
GitLab