From da3146dfc77a07fe0288883495ee44e678022d08 Mon Sep 17 00:00:00 2001 From: Mahmoud Bentriou <mahmoud.bentriou@centralesupelec.fr> Date: Sat, 16 Jan 2021 11:15:56 +0100 Subject: [PATCH] Improvement of the distributed simulation paradigm of the package. Simulation of synchronized models is easily distributable. Change of the signature of check_constraints and update_state in order to access the model parameters. Test about distributed simulations was renamed and completed. --- automata/automaton_F.jl | 46 +++---- automata/automaton_G.jl | 120 +++++++++--------- automata/automaton_G_and_F.jl | 117 ++++++++--------- core/lha.jl | 19 +-- core/model.jl | 16 +-- tests/run_unit.jl | 2 +- ...stributed.jl => distributed_simulation.jl} | 12 ++ 7 files changed, 175 insertions(+), 157 deletions(-) rename tests/unit/{macro_network_model_distributed.jl => distributed_simulation.jl} (82%) diff --git a/automata/automaton_F.jl b/automata/automaton_F.jl index 3c59e86..caea4d0 100644 --- a/automata/automaton_F.jl +++ b/automata/automaton_F.jl @@ -32,72 +32,74 @@ function create_automaton_F(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1 end istrue(val::Float64) = convert(Bool, val) + sym_isabs_func = Symbol(m.isabsorbing) + # l0 loc : we construct the edges of the form l0 => (..) # "cc" as check_constraints tuple = (:l0, :l1) - 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}) = + cc_aut_F_l0l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_F_l0l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1; S[:n] = get_value(S, x, sym_obs); S[:d] = Inf; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = 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}) = + us_aut_F_l1l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; S[:d] = 0) edge1 = Edge([nothing], cc_aut_F_l1l2_1, us_aut_F_l1l2_1!) - cc_aut_F_l1l2_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l2_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = getfield(S, :time) >= constants[:t1] && S[:d] == 0 - us_aut_F_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2) edge4 = Edge([nothing], cc_aut_F_l1l2_4, us_aut_F_l1l2_4!) - cc_aut_F_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l2_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && getfield(S, :time) <= constants[:t2] - us_aut_F_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l3_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (constants[:x1] <= S[:n] <= constants[:x2]) - us_aut_F_l1l3_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1l3_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; S[:d] = 0;) edge1 = Edge([nothing], cc_aut_F_l1l3_1, us_aut_F_l1l3_1!) - cc_aut_F_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1l3_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; 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(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l1l3_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1l3_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; 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!) @@ -105,19 +107,19 @@ function create_automaton_F(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1 # l3 loc tuple = (:l3, :l1) - 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}) = + cc_aut_F_l3l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_F_l3l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1; S[:n] = get_value(S, x, sym_obs); - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l3l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (getfield(S, :time) >= constants[:t2]) - us_aut_F_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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 76f7e62..e0d2bce 100644 --- a/automata/automaton_G.jl +++ b/automata/automaton_G.jl @@ -5,10 +5,10 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1 locations = [:l0, :l1, :l2, :l3, :l4] # Invariant predicates - true_inv_predicate(x::Vector{Int}) = true - Λ_F = Dict(:l0 => true_inv_predicate, :l1 => true_inv_predicate, - :l2 => true_inv_predicate, :l3 => true_inv_predicate, - :l4 => true_inv_predicate) + @everywhere true_inv_predicate(x::Vector{Int}) = true + Λ_F = Dict(:l0 => getfield(Main, :true_inv_predicate), :l1 => getfield(Main, :true_inv_predicate), + :l2 => getfield(Main, :true_inv_predicate), :l3 => getfield(Main, :true_inv_predicate), + :l4 => getfield(Main, :true_inv_predicate)) ## Init and final loc locations_init = [:l0] @@ -30,163 +30,165 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1 for loc in locations map_edges[loc] = Dict{Location, Vector{Edge}}() end - istrue(val::Float64) = convert(Bool, val) + @everywhere istrue(val::Float64) = convert(Bool, val) + + sym_isabs_func = Symbol(m.isabsorbing) # l0 loc tuple = (:l0, :l1) - 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}) = + @everywhere cc_aut_G_l0l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere us_aut_G_l0l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1; S[:d] = 0; - S[:n] = get_value(S, x, sym_obs); + S[:n] = get_value(S, x, $(Meta.quot(sym_obs))); S[:in] = true; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) - edge1 = Edge([nothing], cc_aut_G_l0l1_1, us_aut_G_l0l1_1!) + S[:isabs] = getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x)) + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l0l1_1), getfield(Main, :us_aut_G_l0l1_1!)) map_edges[:l0][:l1] = [edge1] # l1 loc tuple = (:l1, :l3) - cc_aut_G_l1l3_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l3_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = 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}) = + @everywhere us_aut_G_l1l3_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; 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!) + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l1l3_1), getfield(Main, :us_aut_G_l1l3_1!)) - cc_aut_G_l1l3_3(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l3_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && (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}) = + @everywhere us_aut_G_l1l3_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; 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!) + edge3 = Edge([nothing], getfield(Main, :cc_aut_G_l1l3_3), getfield(Main, :us_aut_G_l1l3_3!)) - cc_aut_G_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l3_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + @everywhere us_aut_G_l1l3_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; S[:d] = 0; S[:in] = false) - edge2 = Edge([nothing], cc_aut_G_l1l3_2, us_aut_G_l1l3_2!) + edge2 = Edge([nothing], getfield(Main, :cc_aut_G_l1l3_2), getfield(Main, :us_aut_G_l1l3_2!)) - cc_aut_G_l1l3_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l3_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && (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}) = + @everywhere us_aut_G_l1l3_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3; S[:tprime] = 0.0) - edge4 = Edge([nothing], cc_aut_G_l1l3_4, us_aut_G_l1l3_4!) + edge4 = Edge([nothing], getfield(Main, :cc_aut_G_l1l3_4), getfield(Main, :us_aut_G_l1l3_4!)) map_edges[:l1][:l3] = [edge1, edge2, edge3, edge4] tuple = (:l1, :l4) - cc_aut_G_l1l4_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l4_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && (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}) = + @everywhere us_aut_G_l1l4_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l4; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l1l4_1), getfield(Main, :us_aut_G_l1l4_1!)) + @everywhere cc_aut_G_l1l4_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && (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}) = + @everywhere us_aut_G_l1l4_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l4) - edge2 = Edge([nothing], cc_aut_G_l1l4_2, us_aut_G_l1l4_2!) + edge2 = Edge([nothing], getfield(Main, :cc_aut_G_l1l4_2), getfield(Main, :us_aut_G_l1l4_2!)) map_edges[:l1][:l4] = [edge1, edge2] tuple = (:l1, :l2) - cc_aut_G_l1l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l1l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l1l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l1l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2) - edge1 = Edge([nothing], cc_aut_G_l1l2_1, us_aut_G_l1l2_1!) - cc_aut_G_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l1l2_1), getfield(Main, :us_aut_G_l1l2_1!)) + @everywhere cc_aut_G_l1l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l1l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l1l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + edge2 = Edge([nothing], getfield(Main, :cc_aut_G_l1l2_2), getfield(Main, :us_aut_G_l1l2_2!)) + @everywhere cc_aut_G_l1l2_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && getfield(S, :time) <= constants[:t1] - us_aut_G_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l1l2_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + edge3 = Edge([nothing], getfield(Main, :cc_aut_G_l1l2_3), getfield(Main, :us_aut_G_l1l2_3!)) + @everywhere cc_aut_G_l1l2_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && (constants[:t1] <= getfield(S, :time) <= constants[:t2]) - us_aut_G_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l1l2_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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!) + edge4 = Edge([nothing], getfield(Main, :cc_aut_G_l1l2_4), getfield(Main, :us_aut_G_l1l2_4!)) map_edges[:l1][:l2] = [edge1, edge2, edge3, edge4] # l3 loc tuple = (:l3, :l1) - 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}) = + @everywhere cc_aut_G_l3l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere us_aut_G_l3l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1; - 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!) + S[:n] = get_value(S, x, $(Meta.quot(sym_obs))); + S[:isabs] = getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x)) + edge1 = Edge([:ALL], getfield(Main, :cc_aut_G_l3l1_1), getfield(Main, :us_aut_G_l3l1_1!)) map_edges[:l3][:l1] = [edge1] tuple = (:l3, :l2) - cc_aut_G_l3l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l3l2_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l3l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l3l2_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + edge2 = Edge([nothing], getfield(Main, :cc_aut_G_l3l2_2), getfield(Main, :us_aut_G_l3l2_2!)) + @everywhere cc_aut_G_l3l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l3l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2) - edge1 = Edge([nothing], cc_aut_G_l3l2_1, us_aut_G_l3l2_1!) + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l3l2_1), getfield(Main, :us_aut_G_l3l2_1!)) map_edges[:l3][:l2] = [edge1, edge2] # l4 loc tuple = (:l4, :l1) - 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}) = + @everywhere cc_aut_G_l4l1_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere us_aut_G_l4l1_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1; S[:d] += S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); S[:tprime] = 0.0; - S[:n] = get_value(S, x, sym_obs); + S[:n] = get_value(S, x, $(Meta.quot(sym_obs))); S[:in] = true; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) - edge1 = Edge([:ALL], cc_aut_G_l4l1_1, us_aut_G_l4l1_1!) + S[:isabs] = getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x)) + edge1 = Edge([:ALL], getfield(Main, :cc_aut_G_l4l1_1), getfield(Main, :us_aut_G_l4l1_1!)) map_edges[:l4][:l1] = [edge1] tuple = (:l4, :l2) - cc_aut_G_l4l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + @everywhere cc_aut_G_l4l2_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (getfield(S, :time) >= constants[:t2]) - us_aut_G_l4l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + @everywhere us_aut_G_l4l2_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2; 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!) + edge1 = Edge([nothing], getfield(Main, :cc_aut_G_l4l2_1), getfield(Main, :us_aut_G_l4l2_1!)) map_edges[:l4][:l2] = [edge1] diff --git a/automata/automaton_G_and_F.jl b/automata/automaton_G_and_F.jl index 87c79b5..f17caf2 100644 --- a/automata/automaton_G_and_F.jl +++ b/automata/automaton_G_and_F.jl @@ -40,56 +40,57 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float for loc in locations map_edges[loc] = Dict{Location, Vector{Edge}}() end - istrue(val::Float64) = convert(Bool, val) + + sym_isabs_func = Symbol(m.isabsorbing) # l0G loc tuple = (:l0G, :l1G) - 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}) = + cc_aut_G_l0Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_G_l0Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1G; S[:d] = 0; S[:n] = get_value(S, x, sym_obs_G); S[:in] = true; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl3G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = 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}) = + us_aut_G_l1Gl3G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl3G_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && (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}) = + us_aut_G_l1Gl3G_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl3G_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_G_l1Gl3G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl3G_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && (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}) = + us_aut_G_l1Gl3G_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3G; S[:tprime] = 0.0) edge4 = Edge([nothing], cc_aut_G_l1Gl3G_4, us_aut_G_l1Gl3G_4!) @@ -97,52 +98,52 @@ 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl4G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && (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}) = + us_aut_G_l1Gl4G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l4G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl4G_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && (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}) = + us_aut_G_l1Gl4G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl2G_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && getfield(S, :time) <= constants[:t1] - us_aut_G_l1Gl2G_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l1Gl2G_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl2G_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && (constants[:t1] <= getfield(S, :time) <= constants[:t2]) - us_aut_G_l1Gl2G_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l1Gl2G_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l1Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l1Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G) edge1 = Edge([nothing], cc_aut_G_l1Gl2G_1, us_aut_G_l1Gl2G_1!) - cc_aut_G_l1Gl2G_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l1Gl2G_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l1Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l1Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G; S[:d] = S[:d] * (constants[:t2] - constants[:t1])) edge2 = Edge([nothing], cc_aut_G_l1Gl2G_2, us_aut_G_l1Gl2G_2!) @@ -151,27 +152,27 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float # l3G loc tuple = (:l3G, :l1G) - 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}) = + cc_aut_G_l3Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_G_l3Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1G; S[:n] = get_value(S, x, sym_obs_G); - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l3Gl2G_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l3Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l3Gl2G_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l3Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = !istrue(S[:in]) && getfield(S, :time) >= constants[:t2] - us_aut_G_l3Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l3Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G) edge1 = Edge([nothing], cc_aut_G_l3Gl2G_1, us_aut_G_l3Gl2G_1!) @@ -179,22 +180,22 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float # l4G loc tuple = (:l4G, :l1G) - 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}) = + cc_aut_G_l4Gl1G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_G_l4Gl1G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1G; S[:d] += S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); S[:tprime] = 0.0; S[:n] = get_value(S, x, sym_obs_G); S[:in] = true; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_G_l4Gl2G_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (getfield(S, :time) >= constants[:t2]) - us_aut_G_l4Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_G_l4Gl2G_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2G; S[:d] += S[:tprime] * min(abs(constants[:x1] - S[:n]), abs(constants[:x2] - S[:n])); S[:tprime] = 0.0) @@ -204,44 +205,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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = true - us_aut_F_l2Gl1F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + cc_aut_F_l2Gl1F_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_F_l2Gl1F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1F; S[:n] = get_value(S, x, sym_obs_F); S[:dprime] = Inf; - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl2F_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = 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}) = + us_aut_F_l1Fl2F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2F; S[:dprime] = 0) edge1 = Edge([nothing], cc_aut_F_l1Fl2F_1, us_aut_F_l1Fl2F_1!) - cc_aut_F_l1Fl2F_4(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl2F_4(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = getfield(S, :time) >= constants[:t3] && S[:dprime] == 0 - us_aut_F_l1Fl2F_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1Fl2F_4!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2F) edge4 = Edge([nothing], cc_aut_F_l1Fl2F_4, us_aut_F_l1Fl2F_4!) - cc_aut_F_l1Fl2F_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl2F_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1Fl2F_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2F; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl2F_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = istrue(S[:isabs]) && getfield(S, :time) <= constants[:t4] - us_aut_F_l1Fl2F_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1Fl2F_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l2F; S[:d] += S[:dprime]) edge3 = Edge([nothing], cc_aut_F_l1Fl2F_3, us_aut_F_l1Fl2F_3!) @@ -249,26 +250,26 @@ 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl3F_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (constants[:x3] <= S[:n] <= constants[:x4]) - us_aut_F_l1Fl3F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l1Fl3F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3F; S[:dprime] = 0;) edge1 = Edge([nothing], cc_aut_F_l1Fl3F_1, us_aut_F_l1Fl3F_1!) - cc_aut_F_l1Fl3F_2(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl3F_2(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1Fl3F_2!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3F; 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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l1Fl3F_3(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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}) = + us_aut_F_l1Fl3F_3!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l3F; 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!) @@ -277,19 +278,19 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float # l3F loc tuple = (:l3F, :l1F) - 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}) = + cc_aut_F_l3Fl1F_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = true + us_aut_F_l3Fl1F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (S.loc = :l1F; S[:n] = get_value(S, x, sym_obs_F); - S[:isabs] = getfield(m, :isabsorbing)(getfield(m, :p),x)) + S[:isabs] = getfield(Main, sym_isabs_func)(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(S::StateLHA, constants::Dict{Symbol,Float64}, xn::Vector{Int}) = + cc_aut_F_l3Fl2F_1(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (getfield(S, :time) >= constants[:t4]) - us_aut_F_l3Fl2F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}) = + us_aut_F_l3Fl2F_1!(S::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, p::Vector{Float64}) = (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 8bf648b..c28ad56 100644 --- a/core/lha.jl +++ b/core/lha.jl @@ -105,12 +105,13 @@ end function _find_edge_candidates!(edge_candidates::Vector{Edge}, edges_from_current_loc::Dict{Location,Vector{Edge}}, Λ::Dict{Location,Function}, - Snplus1::StateLHA, constants::Dict{Symbol,Float64}, x::Vector{Int}, + Snplus1::StateLHA, constants::Dict{Symbol,Float64}, + x::Vector{Int}, p::Vector{Float64}, only_asynchronous::Bool) nbr_candidates = 0 for target_loc in keys(edges_from_current_loc) for edge in edges_from_current_loc[target_loc] - if Λ[target_loc](x) && getfield(edge, :check_constraints)(Snplus1, constants, x) + if Λ[target_loc](x) && getfield(edge, :check_constraints)(Snplus1, constants, x, p) if edge.transitions[1] == nothing _push_edge!(edge_candidates, edge, nbr_candidates) nbr_candidates += 1 @@ -150,7 +151,7 @@ end function next_state!(Snplus1::StateLHA, A::LHA, xnplus1::Vector{Int}, tnplus1::Float64, tr_nplus1::Transition, - Sn::StateLHA, xn::Vector{Int}; verbose::Bool = false) + Sn::StateLHA, xn::Vector{Int}, p::Vector{Float64}; verbose::Bool = false) # En fait d'apres observation de Cosmos, après qu'on ait lu la transition on devrait stop. edge_candidates = Vector{Edge}(undef, 2) first_round::Bool = true @@ -172,14 +173,14 @@ function next_state!(Snplus1::StateLHA, A::LHA, 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, edges_from_current_loc, getfield(A, :Λ), Snplus1, constants, xn, true) + nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), Snplus1, constants, xn, p, 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 - getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xn) + getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xn, p) end first_round = false if verbose @@ -200,7 +201,7 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show tnplus1, tr_nplus1, xnplus1 @show edge_candidates for edge in edge_candidates - @show getfield(edge, :check_constraints)(Snplus1, constants, x) + @show getfield(edge, :check_constraints)(Snplus1, constants, x, p) end error("Unpredicted behavior automaton") end @@ -227,7 +228,7 @@ function next_state!(Snplus1::StateLHA, A::LHA, 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, edges_from_current_loc, getfield(A, :Λ), Snplus1, constants, xnplus1, false) + nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), Snplus1, constants, xnplus1, p, 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) @@ -237,7 +238,7 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show ind_edge, detected_event, nbr_candidates end if ind_edge > 0 - getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xnplus1) + getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, constants, xnplus1, p) end first_round = false if verbose @@ -256,7 +257,7 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show tnplus1, tr_nplus1, xnplus1 @show edge_candidates for edge in edge_candidates - @show getfield(edge, :check_constraints)(Snplus1, constants, x) + @show getfield(edge, :check_constraints)(Snplus1, constants, x, p) end error("Unpredicted behavior automaton") end diff --git a/core/model.jl b/core/model.jl index 431e528..c636424 100644 --- a/core/model.jl +++ b/core/model.jl @@ -166,7 +166,7 @@ function simulate(product::SynchronizedModel; p::Union{Nothing,AbstractVector{Fl _finish_bounded_trajectory!(values, times, transitions, time_bound) end if isabsorbing && !isacceptedLHA - next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn; verbose = verbose) + next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn, p_sim; verbose = verbose) copyto!(Sn, Snplus1) end return SynchronizedTrajectory(Sn, product, values, times, transitions) @@ -180,7 +180,7 @@ function simulate(product::SynchronizedModel; p::Union{Nothing,AbstractVector{Fl break end n += 1 - next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn; verbose = verbose) + next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn, p_sim; verbose = verbose) copyto!(xn, vec_x) tn = l_t[1] tr_n = l_tr[1] @@ -199,7 +199,7 @@ function simulate(product::SynchronizedModel; p::Union{Nothing,AbstractVector{Fl _finish_bounded_trajectory!(values, times, transitions, time_bound) end if isabsorbing && !isacceptedLHA - next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn; verbose = verbose) + next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn, p_sim; verbose = verbose) copyto!(Sn, Snplus1) end return SynchronizedTrajectory(Sn, product, values, times, transitions) @@ -223,7 +223,7 @@ function simulate(product::SynchronizedModel; p::Union{Nothing,AbstractVector{Fl i -= 1 break end - next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn; verbose = verbose) + next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn, p_sim; verbose = verbose) copyto!(xn, vec_x) tn = l_t[1] tr_n = l_tr[1] @@ -249,7 +249,7 @@ function simulate(product::SynchronizedModel; p::Union{Nothing,AbstractVector{Fl _finish_bounded_trajectory!(values, times, transitions, time_bound) end if isabsorbing && !isacceptedLHA - next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn; verbose = verbose) + next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn, p_sim; verbose = verbose) copyto!(Sn, Snplus1) end return SynchronizedTrajectory(Sn, product, values, times, transitions) @@ -286,7 +286,7 @@ function volatile_simulate(product::SynchronizedModel; # If x0 is absorbing if isabsorbing || isacceptedLHA if !isacceptedLHA - next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn; verbose = verbose) + next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn, p_sim; verbose = verbose) copyto!(Sn, Snplus1) end return Sn @@ -302,7 +302,7 @@ function volatile_simulate(product::SynchronizedModel; isabsorbing = true break end - next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn; verbose = verbose) + next_state!(Snplus1, A, vec_x, l_t[1], l_tr[1], Sn, xn, p_sim; verbose = verbose) copyto!(xn, vec_x) tn = l_t[1] tr_n = l_tr[1] @@ -311,7 +311,7 @@ function volatile_simulate(product::SynchronizedModel; n += 1 end if isabsorbing && !isacceptedLHA - next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn; verbose = verbose) + next_state!(Snplus1, A, xn, time_bound, nothing, Sn, xn, p_sim; verbose = verbose) copyto!(Sn, Snplus1) end return Sn diff --git a/tests/run_unit.jl b/tests/run_unit.jl index 06e4f43..55d5bf3 100644 --- a/tests/run_unit.jl +++ b/tests/run_unit.jl @@ -14,6 +14,7 @@ using Test @test include("unit/density_pm.jl") @test include("unit/dist_lp.jl") @test include("unit/dist_lp_var.jl") + @test include("unit/distributed_simulation.jl") @test include("unit/draw_pm.jl") @test include("unit/getindex_access_trajectory.jl") @@ -27,7 +28,6 @@ using Test @test include("unit/long_sim_er.jl") @test include("unit/macro_network_model.jl") - @test include("unit/macro_network_model_distributed.jl") @test include("unit/model_prior.jl") @test include("unit/models_exps_er_1d.jl") @test include("unit/models_exps_er_2d.jl") diff --git a/tests/unit/macro_network_model_distributed.jl b/tests/unit/distributed_simulation.jl similarity index 82% rename from tests/unit/macro_network_model_distributed.jl rename to tests/unit/distributed_simulation.jl index d02d440..06db472 100644 --- a/tests/unit/macro_network_model_distributed.jl +++ b/tests/unit/distributed_simulation.jl @@ -23,6 +23,7 @@ set_param!(model_SIR, [0.012, 0.05]) @everywhere simulate($model_SIR) sym_f! = Symbol(model_SIR.f!) sym_isabs = Symbol(model_SIR.isabsorbing) +# Check the creation of model has defined the necessary functions on all workers test_all = test_all && fetch(@spawnat 2 isdefined(Main, sym_f!)) && fetch(@spawnat 2 isdefined(Main, sym_isabs)) test_all = test_all && fetch(@spawnat 3 isdefined(Main, sym_f!)) && fetch(@spawnat 3 isdefined(Main, sym_isabs)) # Check the model object is not defined on workers @@ -55,6 +56,17 @@ test_all = test_all && fetch(@spawnat 3 isdefined(Main, sym_f!)) && fetch(@spawn test_all = test_all && !fetch(@spawnat 2 isdefined(Main, :ER)) && !fetch(@spawnat 2 isdefined(Main, :ER)) test_all = test_all && !fetch(@spawnat 3 isdefined(Main, :ER)) && !fetch(@spawnat 3 isdefined(Main, :ER)) +# Synchronized model +load_model("ER") +observe_all!(ER) +load_automaton("automaton_G") +x1, x2, t1, t2 = 50.0, 100.0, 0.0, 0.8 +A_G_R5 = create_automaton_G(ER, x1, x2, t1, t2, :E) +sync_ER = ER * A_G_R5 +@everywhere simulate($sync_ER) +test_all = test_all && !fetch(@spawnat 2 isdefined(Main, :sync_ER)) && !fetch(@spawnat 2 isdefined(Main, :sync_ER)) +test_all = test_all && !fetch(@spawnat 3 isdefined(Main, :sync_ER)) && !fetch(@spawnat 3 isdefined(Main, :sync_ER)) + rmprocs(2) return test_all -- GitLab