From dfcc663d4c8e7e83cb334a12ce3d1f737951a173 Mon Sep 17 00:00:00 2001
From: Mahmoud Bentriou <mahmoud.bentriou@centralesupelec.fr>
Date: Thu, 10 Dec 2020 14:34:13 +0100
Subject: [PATCH] Speed up performance for LHA core files.

Change of signatures of unit functions update_state!, check_constraints
of the automata edges. Use getfield instead of getproperty.

Now the execution of statistical estimation of the distance G is of the
order of Cosmos !
---
 automata/automaton_F.jl       |  82 ++++++-------
 automata/automaton_G.jl       | 136 ++++++++++-----------
 automata/automaton_G_and_F.jl | 216 +++++++++++++++++-----------------
 core/lha.jl                   |  36 +++---
 4 files changed, 237 insertions(+), 233 deletions(-)

diff --git a/automata/automaton_F.jl b/automata/automaton_F.jl
index ec0106e..e0ff0e5 100644
--- a/automata/automaton_F.jl
+++ b/automata/automaton_F.jl
@@ -15,7 +15,7 @@ function create_automaton_F(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1
 
     #S.n <=> S.values[A.map_var_automaton_idx[:n]] 
     #P <=> xn[map_var_model_idx[constants[str_O]] with str_O = :P. On stock str_O dans constants
-    # P = get_value(A, x, sym_obs) 
+    # P = get_value(S, x, sym_obs) 
     ## Map of automaton variables
     map_var_automaton_idx = Dict{VariableAutomaton,Int}(:n => 1, :d => 2, :isabs => 3)
 
@@ -35,89 +35,89 @@ function create_automaton_F(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1
     # l0 loc : we construct  the edges of the form l0 => (..)
     # "cc" as check_constraints
     tuple = (:l0, :l1)
-    cc_aut_F_l0l1_1(A::LHA, S::StateLHA) = true
-    us_aut_F_l0l1_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l0l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = true
+    us_aut_F_l0l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1; 
-         S[:n] = get_value(A, x, sym_obs);
+         S[:n] = get_value(S, x, sym_obs);
          S[:d] = Inf; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([nothing], cc_aut_F_l0l1_1, us_aut_F_l0l1_1!)
     map_edges[:l0][:l1] = [edge1]
 
     # l1 loc : we construct  the edges of the form l1 => (..)
     tuple = (:l1, :l2)
-    cc_aut_F_l1l2_1(A::LHA, S::StateLHA) = 
-        S.time >= A.constants[:t1] &&
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_F_l1l2_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t1] &&
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_F_l1l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2;
          S[:d] = 0)
     edge1 = Edge([nothing], cc_aut_F_l1l2_1, us_aut_F_l1l2_1!)
     
-    cc_aut_F_l1l2_4(A::LHA, S::StateLHA) = 
-        S.time >= A.constants[:t1] &&
+    cc_aut_F_l1l2_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t1] &&
         S[:d] == 0 
-    us_aut_F_l1l2_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    us_aut_F_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2)
     edge4 = Edge([nothing], cc_aut_F_l1l2_4, us_aut_F_l1l2_4!)
 
-    cc_aut_F_l1l2_2(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t2]) && 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2])
-    us_aut_F_l1l2_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t2]) && 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2])
+    us_aut_F_l1l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2;
-         S[:d] = min(abs(S[:n] - A.constants[:x1]), abs(S[:n] - A.constants[:x2])))
+         S[:d] = min(abs(S[:n] - constants[:x1]), abs(S[:n] - constants[:x2])))
     edge2 = Edge([nothing], cc_aut_F_l1l2_2, us_aut_F_l1l2_2!)
 
-    cc_aut_F_l1l2_3(A::LHA, S::StateLHA) = 
-        istrue(S[:isabs]) && S.time <= A.constants[:t2]
-    us_aut_F_l1l2_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l2_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        istrue(S[:isabs]) && getfield(S, :time) <= constants[:t2]
+    us_aut_F_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2)
     edge3 = Edge([nothing], cc_aut_F_l1l2_3, us_aut_F_l1l2_3!)
 
     map_edges[:l1][:l2] = [edge1, edge2, edge3, edge4]
 
     tuple = (:l1, :l3)
-    cc_aut_F_l1l3_1(A::LHA, S::StateLHA) = 
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_F_l1l3_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l3_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_F_l1l3_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3;
          S[:d] = 0;)
     edge1 = Edge([nothing], cc_aut_F_l1l3_1, us_aut_F_l1l3_1!)
     
-    cc_aut_F_l1l3_2(A::LHA, S::StateLHA) = 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2]) && 
-        (S.time <= A.constants[:t1])
-    us_aut_F_l1l3_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2]) && 
+        (getfield(S, :time) <= constants[:t1])
+    us_aut_F_l1l3_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3;
-         S[:d] = min(sqrt((S.time - A.constants[:t1])^2 + (S[:n] - A.constants[:x2])^2), 
-                      sqrt((S.time - A.constants[:t1])^2 + (S[:n] - A.constants[:x1])^2)))
+         S[:d] = min(sqrt((getfield(S, :time) - constants[:t1])^2 + (S[:n] - constants[:x2])^2), 
+                      sqrt((getfield(S, :time) - constants[:t1])^2 + (S[:n] - constants[:x1])^2)))
     edge2 = Edge([nothing], cc_aut_F_l1l3_2, us_aut_F_l1l3_2!)
 
-    cc_aut_F_l1l3_3(A::LHA, S::StateLHA) = 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2])
-    us_aut_F_l1l3_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1l3_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2]) && 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2])
+    us_aut_F_l1l3_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3;
-         S[:d] = min(S[:d], min(abs(S[:n] - A.constants[:x1]), abs(S[:n] - A.constants[:x2]))))
+         S[:d] = min(S[:d], min(abs(S[:n] - constants[:x1]), abs(S[:n] - constants[:x2]))))
     edge3 = Edge([nothing], cc_aut_F_l1l3_3, us_aut_F_l1l3_3!)
     map_edges[:l1][:l3] = [edge1, edge2, edge3]
 
     # l3 loc
     tuple = (:l3, :l1)
-    cc_aut_F_l3l1_1(A::LHA, S::StateLHA) = true
-    us_aut_F_l3l1_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l3l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = true
+    us_aut_F_l3l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1;
-         S[:n] = get_value(A, x, sym_obs);
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:n] = get_value(S, x, sym_obs);
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_F_l3l1_1, us_aut_F_l3l1_1!)
     map_edges[:l3][:l1] = [edge1]
     
     
     tuple = (:l3, :l2)
-    cc_aut_F_l3l2_1(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t2])
-    us_aut_F_l3l2_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l3l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t2])
+    us_aut_F_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2)
     edge1 = Edge([nothing], cc_aut_F_l3l2_1, us_aut_F_l3l2_1!)
     map_edges[:l3][:l2] = [edge1]
diff --git a/automata/automaton_G.jl b/automata/automaton_G.jl
index d53fcb1..007d714 100644
--- a/automata/automaton_G.jl
+++ b/automata/automaton_G.jl
@@ -34,51 +34,51 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1
 
     # l0 loc
     tuple = (:l0, :l1)
-    cc_aut_G_l0l1_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l0l1_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l0l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l0l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1; 
          S[:d] = 0; 
-         S[:n] = get_value(A, x, sym_obs); 
+         S[:n] = get_value(S, x, sym_obs); 
          S[:in] = true; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([nothing], cc_aut_G_l0l1_1, us_aut_G_l0l1_1!)
     map_edges[:l0][:l1] = [edge1]
 
     # l1 loc
     tuple = (:l1, :l3)
-    cc_aut_G_l1l3_1(A::LHA, S::StateLHA) = 
-        S.time <= A.constants[:t1] && 
-        S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2]
-    us_aut_G_l1l3_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l1l3_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        getfield(S, :time) <= constants[:t1] && 
+        S[:n] < constants[:x1] || S[:n] > constants[:x2]
+    us_aut_G_l1l3_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3; 
-         S[:d] = min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] = min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:in] = false)
     edge1 = Edge([nothing], cc_aut_G_l1l3_1, us_aut_G_l1l3_1!)
 
-    cc_aut_G_l1l3_3(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l3_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
          !istrue(S[:in]) && 
-         (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-         (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1l3_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+         (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+         (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1l3_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3; 
-         S[:d] = S[:d] * (S.time - A.constants[:t1]); 
+         S[:d] = S[:d] * (getfield(S, :time) - constants[:t1]); 
          S[:tprime] = 0.0)
     edge3 = Edge([nothing], cc_aut_G_l1l3_3, us_aut_G_l1l3_3!)
    
-    cc_aut_G_l1l3_2(A::LHA, S::StateLHA) = 
-        (S.time <= A.constants[:t1]) && 
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1l3_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) <= constants[:t1]) && 
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1l3_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3; 
          S[:d] = 0; 
          S[:in] = false)
     edge2 = Edge([nothing], cc_aut_G_l1l3_2, us_aut_G_l1l3_2!)
 
-    cc_aut_G_l1l3_4(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l3_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1l3_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1l3_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3; 
          S[:tprime] = 0.0)
     edge4 = Edge([nothing], cc_aut_G_l1l3_4, us_aut_G_l1l3_4!)
@@ -86,80 +86,80 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1
     map_edges[:l1][:l3] = [edge1, edge2, edge3, edge4]
 
     tuple = (:l1, :l4)
-    cc_aut_G_l1l4_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l4_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2])
-    us_aut_G_l1l4_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2])
+    us_aut_G_l1l4_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l4; 
-         S[:d] += S[:d] * (S.time - A.constants[:t1]))
+         S[:d] += S[:d] * (getfield(S, :time) - constants[:t1]))
     edge1 = Edge([nothing], cc_aut_G_l1l4_1, us_aut_G_l1l4_1!)
-    cc_aut_G_l1l4_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l4_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2])
-    us_aut_G_l1l4_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2])
+    us_aut_G_l1l4_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l4)
     edge2 = Edge([nothing], cc_aut_G_l1l4_2, us_aut_G_l1l4_2!)
     
     map_edges[:l1][:l4] = [edge1, edge2]
 
     tuple = (:l1, :l2)
-    cc_aut_G_l1l2_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l1l2_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l1l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2)
     edge1 = Edge([nothing], cc_aut_G_l1l2_1, us_aut_G_l1l2_1!)
-    cc_aut_G_l1l2_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l1l2_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l1l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2; 
-         S[:d] = S[:d] * (A.constants[:t2] - A.constants[:t1]))
+         S[:d] = S[:d] * (constants[:t2] - constants[:t1]))
     edge2 = Edge([nothing], cc_aut_G_l1l2_2, us_aut_G_l1l2_2!)
-    cc_aut_G_l1l2_3(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l2_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:isabs]) && 
-        S.time <= A.constants[:t1]
-    us_aut_G_l1l2_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) <= constants[:t1]
+    us_aut_G_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2; 
-         S[:d] = (A.constants[:t2] - A.constants[:t1]) *
-                   min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])))
+         S[:d] = (constants[:t2] - constants[:t1]) *
+                   min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])))
     edge3 = Edge([nothing], cc_aut_G_l1l2_3, us_aut_G_l1l2_3!)
-    cc_aut_G_l1l2_4(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1l2_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:isabs]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2])
-    us_aut_G_l1l2_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2])
+    us_aut_G_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2; 
-         S[:d] += (A.constants[:t2] - S.time) * 
-                    min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])))
+         S[:d] += (constants[:t2] - getfield(S, :time)) * 
+                    min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])))
     edge4 = Edge([nothing], cc_aut_G_l1l2_4, us_aut_G_l1l2_4!)
     
     map_edges[:l1][:l2] = [edge1, edge2, edge3, edge4]
 
     # l3 loc
     tuple = (:l3, :l1)
-    cc_aut_G_l3l1_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l3l1_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l3l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l3l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1; 
-         S[:n] = get_value(A, x, sym_obs); 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:n] = get_value(S, x, sym_obs); 
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_G_l3l1_1, us_aut_G_l3l1_1!)
     
     map_edges[:l3][:l1] = [edge1]
 
     tuple = (:l3, :l2)
-    cc_aut_G_l3l2_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l3l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l3l2_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l3l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2;
-         S[:d] = S[:d] * (A.constants[:t2] - A.constants[:t1]))
+         S[:d] = S[:d] * (constants[:t2] - constants[:t1]))
     edge2 = Edge([nothing], cc_aut_G_l3l2_2, us_aut_G_l3l2_2!)
-    cc_aut_G_l3l2_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l3l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l3l2_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2)
     edge1 = Edge([nothing], cc_aut_G_l3l2_1, us_aut_G_l3l2_1!)
  
@@ -167,24 +167,24 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1
 
     # l4 loc
     tuple = (:l4, :l1)
-    cc_aut_G_l4l1_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l4l1_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l4l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l4l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1; 
-         S[:d] += S[:tprime] * min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] += S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:tprime] = 0.0; 
-         S[:n] = get_value(A, x, sym_obs); 
+         S[:n] = get_value(S, x, sym_obs); 
          S[:in] = true; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_G_l4l1_1, us_aut_G_l4l1_1!)
     
     map_edges[:l4][:l1] = [edge1]
 
     tuple = (:l4, :l2)
-    cc_aut_G_l4l2_1(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t2])
-    us_aut_G_l4l2_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l4l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t2])
+    us_aut_G_l4l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2; 
-         S[:d] +=  S[:tprime] * min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] +=  S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:tprime] = 0.0)
     edge1 = Edge([nothing], cc_aut_G_l4l2_1, us_aut_G_l4l2_1!)
     
diff --git a/automata/automaton_G_and_F.jl b/automata/automaton_G_and_F.jl
index 2e05a94..f8b1c2b 100644
--- a/automata/automaton_G_and_F.jl
+++ b/automata/automaton_G_and_F.jl
@@ -45,51 +45,51 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float
 
     # l0G loc
     tuple = (:l0G, :l1G)
-    cc_aut_G_l0Gl1G_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l0Gl1G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l0Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l0Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1G; 
          S[:d] = 0; 
-         S[:n] = get_value(A, x, sym_obs_G); 
+         S[:n] = get_value(S, x, sym_obs_G); 
          S[:in] = true; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([nothing], cc_aut_G_l0Gl1G_1, us_aut_G_l0Gl1G_1!)
     map_edges[:l0G][:l1G] = [edge1]
 
     # l1G loc
     tuple = (:l1G, :l3G)
-    cc_aut_G_l1Gl3G_1(A::LHA, S::StateLHA) = 
-        S.time <= A.constants[:t1] && 
-        S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2]
-    us_aut_G_l1Gl3G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l1Gl3G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        getfield(S, :time) <= constants[:t1] && 
+        S[:n] < constants[:x1] || S[:n] > constants[:x2]
+    us_aut_G_l1Gl3G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3G; 
-         S[:d] = min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] = min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:in] = false)
     edge1 = Edge([nothing], cc_aut_G_l1Gl3G_1, us_aut_G_l1Gl3G_1!)
 
-    cc_aut_G_l1Gl3G_3(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl3G_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
          !istrue(S[:in]) && 
-         (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-         (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1Gl3G_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+         (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+         (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1Gl3G_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3G; 
-         S[:d] = S[:d] * (S.time - A.constants[:t1]); 
+         S[:d] = S[:d] * (getfield(S, :time) - constants[:t1]); 
          S[:tprime] = 0.0)
     edge3 = Edge([nothing], cc_aut_G_l1Gl3G_3, us_aut_G_l1Gl3G_3!)
    
-    cc_aut_G_l1Gl3G_2(A::LHA, S::StateLHA) = 
-        (S.time <= A.constants[:t1]) && 
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1Gl3G_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l1Gl3G_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) <= constants[:t1]) && 
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1Gl3G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3G; 
          S[:d] = 0; 
          S[:in] = false)
     edge2 = Edge([nothing], cc_aut_G_l1Gl3G_2, us_aut_G_l1Gl3G_2!)
 
-    cc_aut_G_l1Gl3G_4(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl3G_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (A.constants[:x1] <= S[:n] <= A.constants[:x2])
-    us_aut_G_l1Gl3G_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (constants[:x1] <= S[:n] <= constants[:x2])
+    us_aut_G_l1Gl3G_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3G; 
          S[:tprime] = 0.0)
     edge4 = Edge([nothing], cc_aut_G_l1Gl3G_4, us_aut_G_l1Gl3G_4!)
@@ -97,81 +97,81 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float
     map_edges[:l1G][:l3G] = [edge1, edge2, edge3, edge4]
 
     tuple = (:l1G, :l4G)
-    cc_aut_G_l1Gl4G_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl4G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2])
-    us_aut_G_l1Gl4G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2])
+    us_aut_G_l1Gl4G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l4G; 
-         S[:d] += S[:d] * (S.time - A.constants[:t1]))
+         S[:d] += S[:d] * (getfield(S, :time) - constants[:t1]))
     edge1 = Edge([nothing], cc_aut_G_l1Gl4G_1, us_aut_G_l1Gl4G_1!)
     
-    cc_aut_G_l1Gl4G_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl4G_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2]) && 
-        (S[:n] < A.constants[:x1] || S[:n] > A.constants[:x2])
-    us_aut_G_l1Gl4G_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2]) && 
+        (S[:n] < constants[:x1] || S[:n] > constants[:x2])
+    us_aut_G_l1Gl4G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l4G)
     edge2 = Edge([nothing], cc_aut_G_l1Gl4G_2, us_aut_G_l1Gl4G_2!)
     
     map_edges[:l1G][:l4G] = [edge1, edge2]
 
     tuple = (:l1G, :l2G)
-    cc_aut_G_l1Gl2G_3(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl2G_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:isabs]) && 
-        S.time <= A.constants[:t1]
-    us_aut_G_l1Gl2G_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) <= constants[:t1]
+    us_aut_G_l1Gl2G_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G; 
-        S[:d] = (A.constants[:t2] - A.constants[:t1]) *
-        min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])))
+        S[:d] = (constants[:t2] - constants[:t1]) *
+        min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])))
     edge3 = Edge([nothing], cc_aut_G_l1Gl2G_3, us_aut_G_l1Gl2G_3!)
-        cc_aut_G_l1Gl2G_4(A::LHA, S::StateLHA) = 
+        cc_aut_G_l1Gl2G_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:isabs]) && 
-        (A.constants[:t1] <= S.time <= A.constants[:t2])
-    us_aut_G_l1Gl2G_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        (constants[:t1] <= getfield(S, :time) <= constants[:t2])
+    us_aut_G_l1Gl2G_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G; 
-        S[:d] += (A.constants[:t2] - S.time) * 
-        min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])))
+        S[:d] += (constants[:t2] - getfield(S, :time)) * 
+        min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])))
     edge4 = Edge([nothing], cc_aut_G_l1Gl2G_4, us_aut_G_l1Gl2G_4!)
-    cc_aut_G_l1Gl2G_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l1Gl2G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l1Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G)
     edge1 = Edge([nothing], cc_aut_G_l1Gl2G_1, us_aut_G_l1Gl2G_1!)
-    cc_aut_G_l1Gl2G_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l1Gl2G_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l1Gl2G_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l1Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G; 
-         S[:d] = S[:d] * (A.constants[:t2] - A.constants[:t1]))
+         S[:d] = S[:d] * (constants[:t2] - constants[:t1]))
     edge2 = Edge([nothing], cc_aut_G_l1Gl2G_2, us_aut_G_l1Gl2G_2!)
    
     map_edges[:l1G][:l2G] = [edge3, edge4, edge1, edge2]
 
     # l3G loc
     tuple = (:l3G, :l1G)
-    cc_aut_G_l3Gl1G_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l3Gl1G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l3Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l3Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1G; 
-         S[:n] = get_value(A, x, sym_obs_G); 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:n] = get_value(S, x, sym_obs_G); 
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_G_l3Gl1G_1, us_aut_G_l3Gl1G_1!)
     map_edges[:l3G][:l1G] = [edge1]
 
     tuple = (:l3G, :l2G)
-    cc_aut_G_l3Gl2G_2(A::LHA, S::StateLHA) = 
+    cc_aut_G_l3Gl2G_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l3Gl2G_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l3Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G;
-         S[:d] = S[:d] * (A.constants[:t2] - A.constants[:t1]))
+         S[:d] = S[:d] * (constants[:t2] - constants[:t1]))
     edge2 = Edge([nothing], cc_aut_G_l3Gl2G_2, us_aut_G_l3Gl2G_2!)
     
-    cc_aut_G_l3Gl2G_1(A::LHA, S::StateLHA) = 
+    cc_aut_G_l3Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
         !istrue(S[:in]) && 
-        S.time >= A.constants[:t2]
-    us_aut_G_l3Gl2G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t2]
+    us_aut_G_l3Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G)
     edge1 = Edge([nothing], cc_aut_G_l3Gl2G_1, us_aut_G_l3Gl2G_1!)
  
@@ -179,24 +179,24 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float
 
     # l4G loc
     tuple = (:l4G, :l1G)
-    cc_aut_G_l4Gl1G_1(A::LHA, S::StateLHA) = true
-    us_aut_G_l4Gl1G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l4Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_G_l4Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1G; 
-         S[:d] += S[:tprime] * min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] += S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:tprime] = 0.0; 
-         S[:n] = get_value(A, x, sym_obs_G); 
+         S[:n] = get_value(S, x, sym_obs_G); 
          S[:in] = true; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_G_l4Gl1G_1, us_aut_G_l4Gl1G_1!)
     
     map_edges[:l4G][:l1G] = [edge1]
 
     tuple = (:l4G, :l2G)
-    cc_aut_G_l4Gl2G_1(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t2])
-    us_aut_G_l4Gl2G_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_G_l4Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t2])
+    us_aut_G_l4Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2G; 
-         S[:d] +=  S[:tprime] * min(abs(A.constants[:x1] - S[:n]), abs(A.constants[:x2] - S[:n])); 
+         S[:d] +=  S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); 
          S[:tprime] = 0.0)
     edge1 = Edge([nothing], cc_aut_G_l4Gl2G_1, us_aut_G_l4Gl2G_1!)
 
@@ -204,44 +204,44 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float
     
     # Connection between the two automata: l2G => l1F
     tuple = (:l2G, :l1F)
-    cc_aut_F_l2Gl1F_1(A::LHA, S::StateLHA) = true
-    us_aut_F_l2Gl1F_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l2Gl1F_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_F_l2Gl1F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1F; 
-         S[:n] = get_value(A, x, sym_obs_F);
+         S[:n] = get_value(S, x, sym_obs_F);
          S[:dprime] = Inf; 
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([nothing], cc_aut_F_l2Gl1F_1, us_aut_F_l2Gl1F_1!)
     map_edges[:l2G][:l1F] = [edge1]
 
     # l1F loc : we construct  the edges of the form l1F => (..)
     tuple = (:l1F, :l2F)
-    cc_aut_F_l1Fl2F_1(A::LHA, S::StateLHA) = 
-        S.time >= A.constants[:t3] &&
-        (A.constants[:x3] <= S[:n] <= A.constants[:x4])
-    us_aut_F_l1Fl2F_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl2F_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t3] &&
+        (constants[:x3] <= S[:n] <= constants[:x4])
+    us_aut_F_l1Fl2F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2F;
          S[:dprime] = 0)
     edge1 = Edge([nothing], cc_aut_F_l1Fl2F_1, us_aut_F_l1Fl2F_1!)
     
-    cc_aut_F_l1Fl2F_4(A::LHA, S::StateLHA) = 
-        S.time >= A.constants[:t3] &&
+    cc_aut_F_l1Fl2F_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        getfield(S, :time) >= constants[:t3] &&
         S[:dprime] == 0 
-    us_aut_F_l1Fl2F_4!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    us_aut_F_l1Fl2F_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2F)
     edge4 = Edge([nothing], cc_aut_F_l1Fl2F_4, us_aut_F_l1Fl2F_4!)
 
-    cc_aut_F_l1Fl2F_2(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t4]) && 
-        (S[:n] < A.constants[:x3] || S[:n] > A.constants[:x4])
-    us_aut_F_l1Fl2F_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl2F_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t4]) && 
+        (S[:n] < constants[:x3] || S[:n] > constants[:x4])
+    us_aut_F_l1Fl2F_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2F;
-         S[:dprime] = min(abs(S[:n] - A.constants[:x3]), abs(S[:n] - A.constants[:x4]));
+         S[:dprime] = min(abs(S[:n] - constants[:x3]), abs(S[:n] - constants[:x4]));
          S[:d] += S[:dprime])
     edge2 = Edge([nothing], cc_aut_F_l1Fl2F_2, us_aut_F_l1Fl2F_2!)
 
-    cc_aut_F_l1Fl2F_3(A::LHA, S::StateLHA) = 
-        istrue(S[:isabs]) && S.time <= A.constants[:t4]
-    us_aut_F_l1Fl2F_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl2F_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        istrue(S[:isabs]) && getfield(S, :time) <= constants[:t4]
+    us_aut_F_l1Fl2F_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2F;
          S[:d] += S[:dprime])
     edge3 = Edge([nothing], cc_aut_F_l1Fl2F_3, us_aut_F_l1Fl2F_3!)
@@ -249,47 +249,47 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float
     map_edges[:l1F][:l2F] = [edge1, edge4, edge3, edge2]
 
     tuple = (:l1F, :l3F)
-    cc_aut_F_l1Fl3F_1(A::LHA, S::StateLHA) = 
-        (A.constants[:x3] <= S[:n] <= A.constants[:x4])
-    us_aut_F_l1Fl3F_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl3F_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (constants[:x3] <= S[:n] <= constants[:x4])
+    us_aut_F_l1Fl3F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3F;
          S[:dprime] = 0;)
     edge1 = Edge([nothing], cc_aut_F_l1Fl3F_1, us_aut_F_l1Fl3F_1!)
     
-    cc_aut_F_l1Fl3F_2(A::LHA, S::StateLHA) = 
-        (S[:n] < A.constants[:x3] || S[:n] > A.constants[:x4]) && 
-        (S.time <= A.constants[:t3])
-    us_aut_F_l1Fl3F_2!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl3F_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (S[:n] < constants[:x3] || S[:n] > constants[:x4]) && 
+        (getfield(S, :time) <= constants[:t3])
+    us_aut_F_l1Fl3F_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3F;
-         S[:dprime] = min(sqrt((S.time - A.constants[:t3])^2 + (S[:n] - A.constants[:x4])^2), 
-                           sqrt((S.time - A.constants[:t3])^2 + (S[:n] - A.constants[:x3])^2)))
+         S[:dprime] = min(sqrt((getfield(S, :time) - constants[:t3])^2 + (S[:n] - constants[:x4])^2), 
+                           sqrt((getfield(S, :time) - constants[:t3])^2 + (S[:n] - constants[:x3])^2)))
     edge2 = Edge([nothing], cc_aut_F_l1Fl3F_2, us_aut_F_l1Fl3F_2!)
 
-    cc_aut_F_l1Fl3F_3(A::LHA, S::StateLHA) = 
-        (S[:n] < A.constants[:x3] || S[:n] > A.constants[:x4]) && 
-        (A.constants[:t3] <= S.time <= A.constants[:t4])
-    us_aut_F_l1Fl3F_3!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l1Fl3F_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (S[:n] < constants[:x3] || S[:n] > constants[:x4]) && 
+        (constants[:t3] <= getfield(S, :time) <= constants[:t4])
+    us_aut_F_l1Fl3F_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l3F;
-         S[:dprime] = min(S[:dprime], min(abs(S[:n] - A.constants[:x3]), abs(S[:n] - A.constants[:x4]))))
+         S[:dprime] = min(S[:dprime], min(abs(S[:n] - constants[:x3]), abs(S[:n] - constants[:x4]))))
     edge3 = Edge([nothing], cc_aut_F_l1Fl3F_3, us_aut_F_l1Fl3F_3!)
     
     map_edges[:l1F][:l3F] = [edge1, edge2, edge3]
 
     # l3F loc
     tuple = (:l3F, :l1F)
-    cc_aut_F_l3Fl1F_1(A::LHA, S::StateLHA) = true
-    us_aut_F_l3Fl1F_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l3Fl1F_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true
+    us_aut_F_l3Fl1F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l1F;
-         S[:n] = get_value(A, x, sym_obs_F);
-         S[:isabs] = m.isabsorbing(m.p,x))
+         S[:n] = get_value(S, x, sym_obs_F);
+         S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x))
     edge1 = Edge([:ALL], cc_aut_F_l3Fl1F_1, us_aut_F_l3Fl1F_1!)
     
     map_edges[:l3F][:l1F] = [edge1]
     
     tuple = (:l3F, :l2F)
-    cc_aut_F_l3Fl2F_1(A::LHA, S::StateLHA) = 
-        (S.time >= A.constants[:t4])
-    us_aut_F_l3Fl2F_1!(A::LHA, S::StateLHA, x::Vector{Int}) = 
+    cc_aut_F_l3Fl2F_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = 
+        (getfield(S, :time) >= constants[:t4])
+    us_aut_F_l3Fl2F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = 
         (S.loc = :l2F)
     edge1 = Edge([nothing], cc_aut_F_l3Fl2F_1, us_aut_F_l3Fl2F_1!)
     
diff --git a/core/lha.jl b/core/lha.jl
index dd2f312..777f197 100644
--- a/core/lha.jl
+++ b/core/lha.jl
@@ -1,5 +1,6 @@
 
 length_var(A::LHA) = length(getfield(A, :map_var_automaton_idx))
+get_value(S::StateLHA, x::Vector{Int}, var::VariableModel) = x[getfield(getfield(S, :A), :map_var_model_idx)[var]]
 get_value(A::LHA, x::Vector{Int}, var::VariableModel) = x[getfield(A, :map_var_model_idx)[var]]
 
 copy(S::StateLHA) = StateLHA(getfield(S, :A), getfield(S, :loc), getfield(S, :values), getfield(S, :time))
@@ -51,7 +52,7 @@ isaccepted(S::StateLHA) = (getfield(S, :loc) in getfield(getfield(S, :A), :locat
 # Methods for synchronize / read the trajectory
 function init_state(A::LHA, x0::Vector{Int}, t0::Float64)
     S0 = StateLHA(A, :init, zeros(length_var(A)), t0)
-    for loc in A.locations_init
+    for loc in getfield(A, :locations_init)
         if A.Λ[loc](A,S0) 
             S0.loc = loc
             break
@@ -59,7 +60,8 @@ function init_state(A::LHA, x0::Vector{Int}, t0::Float64)
     end
     return S0
 end
-
+# A push! method implementend by myself because I know in most cases the edge candidates
+# are not greater than 2
 function _push_edge!(edge_candidates::Vector{Edge}, edge::Edge, nbr_candidates::Int)
     if nbr_candidates < 2
         edge_candidates[nbr_candidates+1] = edge
@@ -68,13 +70,14 @@ function _push_edge!(edge_candidates::Vector{Edge}, edge::Edge, nbr_candidates::
     end
 end
 
-function _find_edge_candidates!(edge_candidates::Vector{Edge}, current_loc::Location, 
-                                A::LHA, Snplus1::StateLHA, only_asynchronous::Bool)
+function _find_edge_candidates!(edge_candidates::Vector{Edge},
+                                edges_from_current_loc::Dict{Location,Vector{Edge}}, 
+                                Snplus1::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int},
+                                only_asynchronous::Bool)
     nbr_candidates = 0
-    edges_from_current_loc = A.map_edges[current_loc]
     for target_loc in keys(edges_from_current_loc)
         for edge in edges_from_current_loc[target_loc]
-            if edge.check_constraints(A, Snplus1)
+            if getfield(edge, :check_constraints)(Snplus1, constants, x)
                 if edge.transitions[1] == nothing
                     _push_edge!(edge_candidates, edge, nbr_candidates)
                     nbr_candidates += 1
@@ -127,22 +130,23 @@ function next_state!(Snplus1::StateLHA, A::LHA,
         @show Sn 
         @show Snplus1 
     end
-   
+    constants = getfield(A, :constants) 
     # In terms of values not reference, Snplus1 == Sn
     # First, we check the asynchronous transitions
     while first_round || length(edge_candidates) > 0
         turns += 1
         #edge_candidates = empty!(edge_candidates)
-        current_loc = Snplus1.loc
+        current_loc = getfield(Snplus1, :loc)
+        edges_from_current_loc = getfield(A, :map_edges)[current_loc]
         # Save all edges that satisfies transition predicate (asynchronous ones)
-        nbr_candidates = _find_edge_candidates!(edge_candidates, current_loc, A, Snplus1, true)
+        nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, Snplus1, constants, xnplus1, true)
         # Search the one we must chose, here the event is nothing because 
         # we're not processing yet the next event
         ind_edge, detected_event = _get_edge_index(edge_candidates, nbr_candidates, detected_event, nothing)
         # Update the state with the chosen one (if it exists)
         # Should be xn here
         if ind_edge > 0
-            edge_candidates[ind_edge].update_state!(A, Snplus1, xnplus1)
+            getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xnplus1)
         end
         first_round = false
         if verbose
@@ -163,7 +167,7 @@ function next_state!(Snplus1::StateLHA, A::LHA,
             @show tnplus1, tr_nplus1, xnplus1
             @show edge_candidates
             for edge in edge_candidates
-                @show edge.check_constraints(A, Snplus1)
+                @show getfield(edge, :check_constraints)(Snplus1, constants, x)
             end
             error("Unpredicted behavior automaton")
         end
@@ -187,10 +191,10 @@ function next_state!(Snplus1::StateLHA, A::LHA,
     first_round = true
     while first_round || length(edge_candidates) > 0
         turns += 1
-        #edge_candidates = empty!(edge_candidates)
-        current_loc = Snplus1.loc
+        current_loc = getfield(Snplus1, :loc)
+        edges_from_current_loc = getfield(A, :map_edges)[current_loc]
         # Save all edges that satisfies transition predicate (synchronous ones)
-        nbr_candidates =_find_edge_candidates!(edge_candidates, current_loc, A, Snplus1, false)
+        nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, Snplus1, constants, xnplus1, false)
         # Search the one we must chose
         ind_edge, detected_event = _get_edge_index(edge_candidates, nbr_candidates, detected_event, tr_nplus1)
         # Update the state with the chosen one (if it exists)
@@ -200,7 +204,7 @@ function next_state!(Snplus1::StateLHA, A::LHA,
             @show ind_edge, detected_event, nbr_candidates
         end
         if ind_edge > 0
-            edge_candidates[ind_edge].update_state!(A, Snplus1, xnplus1)
+            getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xnplus1)
         end
         first_round = false
         if verbose
@@ -219,7 +223,7 @@ function next_state!(Snplus1::StateLHA, A::LHA,
             @show tnplus1, tr_nplus1, xnplus1
             @show edge_candidates
             for edge in edge_candidates
-                @show edge.check_constraints(A, Snplus1)
+                @show getfield(edge, :check_constraints)(Snplus1, constants, x)
             end
             error("Unpredicted behavior automaton")
         end
-- 
GitLab