From c8134e3a37a03ac0a791190b8c8d2b9493e76373 Mon Sep 17 00:00:00 2001
From: tempiaa <tempiaa@eurecom.fr>
Date: Thu, 30 Apr 2020 11:20:54 +0200
Subject: [PATCH] Optimized synchronization of signals for better performance

---
 .../modelchecker/AvatarModelChecker.java      | 63 ++++++++++++++-----
 1 file changed, 48 insertions(+), 15 deletions(-)

diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
index b50c1bba22..d5ed7b9073 100644
--- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
+++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
@@ -72,6 +72,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
     private Map<Long, SpecificationState> statesByID;
     private List<SpecificationState> pendingStates;
     private List<SpecificationState> safetyLeadStates;
+    private Map<AvatarTransition, Set<AvatarTransition>> signalRelation;
     //private List<SpecificationLink> links;
     private int nbOfLinks;
     private long stateID = 0;
@@ -1244,7 +1245,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
         // Compute the id of each transition
         // Assumes the allStates list has been computed in AvatarStateMachine
         // Assumes that it is only after states that transitions have non empty
-
+        signalRelation = new HashMap<AvatarTransition, Set<AvatarTransition>>();
 
         for (AvatarBlock block : spec.getListOfBlocks()) {
             AvatarStateMachine asm = block.getStateMachine();
@@ -1263,6 +1264,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
                                             at.type = AvatarTransition.TYPE_RECV_SYNC;
                                         } else {
                                             at.type = AvatarTransition.TYPE_SEND_SYNC;
+                                            synchronizeSignalRelation(at, sig);
                                         }
                                     }
                                 } else {
@@ -1294,6 +1296,31 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
             ab.setBlockIndex(i++);
         }
     }
+    
+    private void synchronizeSignalRelation(AvatarTransition sender, AvatarSignal sig) {
+        HashSet<AvatarTransition> set = new HashSet<>();
+
+        for (AvatarBlock block : spec.getListOfBlocks()) {
+            AvatarStateMachine asm = block.getStateMachine();
+            if (asm != null) {
+                for (int i = 0; i < asm.allStates.length; i++) {
+                    for (int j = 0; j < asm.allStates[i].nbOfNexts(); j++) {
+                        AvatarStateMachineElement e = asm.allStates[i].getNext(j);
+                        if (e instanceof AvatarTransition) {
+                            AvatarStateMachineElement n = e.getNext(0);
+                            if (n != null && n instanceof AvatarActionOnSignal) {
+                                AvatarSignal asr = ((AvatarActionOnSignal) n).getSignal();
+                                if (asr.isIn() && spec.areSynchronized(sig, asr)) {
+                                    set.add((AvatarTransition) e);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        signalRelation.put(sender, set);
+    }
 
     public boolean oldEvaluateBoolExpression(String _expr, AvatarBlock _block, SpecificationBlock _sb) {
         String act = _expr;
@@ -1395,20 +1422,26 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
     }
 
     private SpecificationTransition computeSynchronousTransition(SpecificationTransition sender, SpecificationTransition receiver) {
-        AvatarTransition trs = sender.transitions[0];
-        AvatarTransition trr = receiver.transitions[0];
-
-        AvatarStateMachineElement asmes, asmer;
-        asmes = trs.getNext(0);
-        asmer = trr.getNext(0);
-        if ((asmes == null) || (asmer == null)) return null;
-        if (!(asmes instanceof AvatarActionOnSignal)) return null;
-        if (!(asmer instanceof AvatarActionOnSignal)) return null;
-
-        AvatarSignal ass = ((AvatarActionOnSignal) asmes).getSignal();
-        AvatarSignal asr = ((AvatarActionOnSignal) asmer).getSignal();
-
-        if (spec.areSynchronized(ass, asr)) {
+//        AvatarTransition trs = sender.transitions[0];
+//        AvatarTransition trr = receiver.transitions[0];
+//
+//        AvatarStateMachineElement asmes, asmer;
+//        asmes = trs.getNext(0);
+//        asmer = trr.getNext(0);
+//        if ((asmes == null) || (asmer == null)) return null;
+//        if (!(asmes instanceof AvatarActionOnSignal)) return null;
+//        if (!(asmer instanceof AvatarActionOnSignal)) return null;
+//
+//        AvatarSignal ass = ((AvatarActionOnSignal) asmes).getSignal();
+//        AvatarSignal asr = ((AvatarActionOnSignal) asmer).getSignal();
+//
+//        if (spec.areSynchronized(ass, asr)) {
+//            SpecificationTransition st = new SpecificationTransition();
+//            st.makeFromTwoSynchronous(sender, receiver);
+//            return st;
+//        }
+        
+        if (signalRelation.get(sender.transitions[0]).contains(receiver.transitions[0])) {
             SpecificationTransition st = new SpecificationTransition();
             st.makeFromTwoSynchronous(sender, receiver);
             return st;
-- 
GitLab