From 3fe2ccbac816c68cdccdfa758987d5cc1b5e4bd1 Mon Sep 17 00:00:00 2001
From: tempiaa <tempiaa@eurecom.fr>
Date: Wed, 10 Jun 2020 12:25:21 +0200
Subject: [PATCH] Added prototype classes for counterexamples

---
 .../modelchecker/CounterexampleTrace.java     | 99 +++++++++++++++++++
 .../CounterexampleTraceState.java             | 29 ++++++
 2 files changed, 128 insertions(+)
 create mode 100644 src/main/java/avatartranslator/modelchecker/CounterexampleTrace.java
 create mode 100644 src/main/java/avatartranslator/modelchecker/CounterexampleTraceState.java

diff --git a/src/main/java/avatartranslator/modelchecker/CounterexampleTrace.java b/src/main/java/avatartranslator/modelchecker/CounterexampleTrace.java
new file mode 100644
index 0000000000..3dc1cd1ef6
--- /dev/null
+++ b/src/main/java/avatartranslator/modelchecker/CounterexampleTrace.java
@@ -0,0 +1,99 @@
+package avatartranslator.modelchecker;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import avatartranslator.AvatarBlock;
+import avatartranslator.AvatarSpecification;
+import avatartranslator.AvatarStateMachine;
+
+public class CounterexampleTrace {
+    private LinkedList<CounterexampleTraceState> trace;
+    private CounterexampleTraceState counterexampleState;
+    private AvatarSpecification spec;
+
+    
+    public CounterexampleTrace(AvatarSpecification spec) {
+        this.trace = null;
+        this.counterexampleState = null;
+        this.spec = spec;
+    }
+    
+    
+    public void setCounterexample(CounterexampleTraceState cs) {
+        this.counterexampleState = cs;
+    }
+
+    
+    public boolean hasCounterexample() {
+        return counterexampleState != null;
+    }
+    
+    
+    public boolean buildTrace(CounterexampleTraceState cs) {
+        counterexampleState = cs;
+        return buildTrace();
+    }
+    
+    
+    public boolean buildTrace() {
+        if (counterexampleState == null) {
+            return false;
+        }
+
+        trace = new LinkedList<CounterexampleTraceState>();
+
+        CounterexampleTraceState cs = counterexampleState;
+        trace.add(cs);
+
+        while (cs.father != null) {
+            cs = cs.father;
+            trace.add(0, cs);
+        }
+
+        return true;
+    }
+    
+    
+    public String toString() {
+        if (trace == null) {
+            return "";
+        }
+        
+        StringBuilder s = new StringBuilder();
+        
+        for (CounterexampleTraceState cs : trace) {
+            s.append(cs.toString() + " -> ");
+        }
+        s.append(" []");
+        return s.toString();
+    }
+    
+    public String generateSimpleTrace() {
+        if (trace == null) {
+            return "";
+        }
+        
+        StringBuilder s = new StringBuilder();
+        List<AvatarBlock> blocks = spec.getListOfBlocks();
+        
+        for (AvatarBlock block : blocks) {
+            if (block.getStateMachine().allStates == null) {
+                return "";
+            }
+        }
+
+        int id = 0;
+        for (CounterexampleTraceState cs : trace) {
+            s.append(id);
+            int j = 0;
+            for (AvatarBlock block : blocks) {
+                s.append("\t" + block.getName() + "." + block.getStateMachine().allStates[cs.blocksStates[j]].getName());
+            }
+            s.append("\n");
+            id++;
+        }
+        return s.toString();
+    }
+
+}
diff --git a/src/main/java/avatartranslator/modelchecker/CounterexampleTraceState.java b/src/main/java/avatartranslator/modelchecker/CounterexampleTraceState.java
new file mode 100644
index 0000000000..d9f0618469
--- /dev/null
+++ b/src/main/java/avatartranslator/modelchecker/CounterexampleTraceState.java
@@ -0,0 +1,29 @@
+package avatartranslator.modelchecker;
+
+
+public class CounterexampleTraceState {
+    public CounterexampleTraceState father;
+    public int[] blocksStates;
+    public int hash;
+    
+    public CounterexampleTraceState() {
+        this.father = null;
+        this.blocksStates = null;
+    }
+    
+    public void initState(SpecificationState ss, CounterexampleTraceState father) {
+        this.father = father;
+        this.hash = ss.hashValue;
+        if (ss.blocks != null) {
+            this.blocksStates = new int[ss.blocks.length];
+            for (int i = 0; i < ss.blocks.length; i++) {
+                this.blocksStates[i] = ss.blocks[i].values[SpecificationBlock.STATE_INDEX];
+            }
+        }
+    }
+    
+    public String toString() {
+        return "" + hash;
+    }
+
+}
-- 
GitLab