From a5af805023b86554da0461e52e15da9ccf541832 Mon Sep 17 00:00:00 2001
From: Merlin Baviere <merlin.baviere@student-cs.fr>
Date: Fri, 28 Mar 2025 14:03:33 +0100
Subject: [PATCH] =?UTF-8?q?TP2=20:=20unique=20question=20:=20=1B[200~?=
 =?UTF-8?q?=C3=80=20quoi?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../constant_propagation.cpython-313.pyc      | Bin 0 -> 8508 bytes
 Pystan/config/constant_propagation.py         |  67 ++++++++++++++----
 Pystan/config/example_iteration.py            |   2 +
 3 files changed, 55 insertions(+), 14 deletions(-)
 create mode 100644 Pystan/config/__pycache__/constant_propagation.cpython-313.pyc

diff --git a/Pystan/config/__pycache__/constant_propagation.cpython-313.pyc b/Pystan/config/__pycache__/constant_propagation.cpython-313.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..51feff5f9764833e4c0f2ab14143279abe81d367
GIT binary patch
literal 8508
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
DggT9T

literal 0
HcmV?d00001

diff --git a/Pystan/config/constant_propagation.py b/Pystan/config/constant_propagation.py
index a530c34..37cb8ce 100644
--- a/Pystan/config/constant_propagation.py
+++ b/Pystan/config/constant_propagation.py
@@ -85,23 +85,62 @@ class Constant_propagation(Transfer[state]):
     def __init__(self,instr):
         self.variables = variables_of_instr(instr)
     def bottom(self) -> state:
-        ...
+        return None
     def init_state(self) -> state:
-        ...
-    def join(self,s1:state,s2:state) -> state:
-        ...
+        return {var: abstract_value(None) for var in self.variables}
+    def join(self, s1: state, s2: state) -> state:
+        if s1 is None:
+            return s2
+        if s2 is None:
+            return s1
+        result = {}
+        for var in self.variables:
+            v1 = s1.get(var, abstract_value(None))
+            v2 = s2.get(var, abstract_value(None))
+            if v1.value == v2.value:
+                result[var] = v1
+            else:
+                result[var] = abstract_value(None)
+        return result
+    
+    def included(self, s1: state, s2: state) -> bool:
+        if s1 is None:
+            return True
+        if s2 is None:
+            return False
+        return all(
+            s2.get(var, abstract_value(None)).value in {s1.get(var, abstract_value(None)).value, None}
+            for var in self.variables
+        )
 
-    def included(self,s1: state,s2: state) -> bool:
-        ...
+    def tr_skip(self, s: state) -> state:
+        return s
 
-    def tr_skip(self,s: state) -> state:
-        ...
+    def tr_set(self, s: state, v: str, e: ArithExpr) -> state:
+        if s is None:
+            return None
+        new_env = s.copy()
+        new_env[v] = eval_aexp(s, e) or abstract_value(None)
+        return new_env
+
+    def tr_test(self, s: state, c: BoolExpr) -> state:
+        if s is None:
+            return None
+
+        res = eval_bexp(s, c)
+        if res is None:
+            return None
+        if res.value is False:
+            return None
 
-    def tr_set(self,s: state,v: str,e: ArithExpr) -> state:
-        ...
+        if isinstance(c, BEEq) and isinstance(c.left_expr, AEVar) and isinstance(c.right_expr, AECst):
+            var = c.left_expr.var
+            val = c.right_expr.value
+            new_env = s.copy()
+            new_env[var] = abstract_value(val)
+            return new_env
 
-    def tr_test(self,s: state,c: BoolExpr) -> state:
-        ...
+        return s
 
-    def tr_err(self,s: state,e: Expr) -> state:
-        ...
+    def tr_err(self, s: state, e: Expr) -> state:
+        return None
diff --git a/Pystan/config/example_iteration.py b/Pystan/config/example_iteration.py
index 3a9a71b..02020a1 100644
--- a/Pystan/config/example_iteration.py
+++ b/Pystan/config/example_iteration.py
@@ -50,3 +50,5 @@ res = fixpoint_iteration(NoInfo(),cfg)
 unreachable = [node for node, state in res.items() if state == frozenset()]
 for node in unreachable:
     print(f"{node} is unreachable")
+
+# Les noeuds inaccessibles sont ceux qui sont gardés par une condition toujours fausse.
-- 
GitLab