diff --git a/automata/automaton_F.jl b/automata/automaton_F.jl index 92befe98ddbd58e94eed00ac143e7d5a0362bfc6..58ee7d8ff1e81d970a5de1beaf1788c1ad97e8e0 100644 --- a/automata/automaton_F.jl +++ b/automata/automaton_F.jl @@ -53,79 +53,79 @@ 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 and "us" as update_state # l0 => l1 - @everywhere $(func_name(:cc, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l1; - getfield(S, :values)[$(idx_var_n)] = x[$(idx_obs_var)]; - setindex!(getfield(S, :values), Inf, $(idx_var_d)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l0, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l0, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l1; + S_values[$(idx_var_n)] = x[$(idx_obs_var)]; + setindex!(S_values, Inf, $(idx_var_d)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l1 loc # l1 => l2 #= - @everywhere $(func_name(:cc, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) >= $t1 && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l2; - setindex!(getfield(S, :values), 0, $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time >= $t1 && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l2; + setindex!(S_values, 0, $(idx_var_d))) =# #= - @everywhere $(func_name(:cc, :l1, :l2, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && getfield(S, :time) <= $t2 - @everywhere $(func_name(:us, :l1, :l2, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l2) + @everywhere $(func_name(:cc, :l1, :l2, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && S_time <= $t2 + @everywhere $(func_name(:us, :l1, :l2, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l2) =# - @everywhere $(func_name(:cc, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) >= $t1 && - getfield(S, :values)[$(idx_var_d)] == 0 - @everywhere $(func_name(:us, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l2) - - @everywhere $(func_name(:cc, :l1, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t2) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l2;) - #setindex!(getfield(S, :values), min(abs(getfield(S, :values)[$(idx_var_n)] - $x1), abs(getfield(S, :values)[$(idx_var_n)] - $x2)), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time >= $t1 && + S_values[$(idx_var_d)] == 0 + @everywhere $(func_name(:us, :l1, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l2) + + @everywhere $(func_name(:cc, :l1, :l2, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t2) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1, :l2, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l2;) + #setindex!(S_values, min(abs(S_values[$(idx_var_n)] - $x1), abs(S_values[$(idx_var_n)] - $x2)), $(idx_var_d))) # l1 => l3 - @everywhere $(func_name(:cc, :l1, :l3, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) <= $t1) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1, :l3, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l3; - setindex!(getfield(S, :values), min(sqrt((getfield(S, :time) - $t1)^2 + (getfield(S, :values)[$(idx_var_n)] - $x2)^2), - sqrt((getfield(S, :time) - $t1)^2 + (getfield(S, :values)[$(idx_var_n)] - $x1)^2)), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l3, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time <= $t1) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1, :l3, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l3; + setindex!(S_values, min(sqrt((S_time - $t1)^2 + (S_values[$(idx_var_n)] - $x2)^2), + sqrt((S_time - $t1)^2 + (S_values[$(idx_var_n)] - $x1)^2)), $(idx_var_d))) - @everywhere $(func_name(:cc, :l1, :l3, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1, :l3, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l3; - setindex!(getfield(S, :values), 0, $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1, :l3, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t1) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1, :l3, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l3; - val_min = min(getfield(S, :values)[$(idx_var_d)], - min(abs(getfield(S, :values)[$(idx_var_n)] - $x1), abs(getfield(S, :values)[$(idx_var_n)] - $x2))); - setindex!(getfield(S, :values), val_min, $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l3, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1, :l3, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l3; + setindex!(S_values, 0, $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1, :l3, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t1) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1, :l3, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l3; + val_min = min(S_values[$(idx_var_d)], + min(abs(S_values[$(idx_var_n)] - $x1), abs(S_values[$(idx_var_n)] - $x2))); + setindex!(S_values, val_min, $(idx_var_d))) # l3 loc # l3 => l1 - @everywhere $(func_name(:cc, :l3, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l3, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l1; - getfield(S, :values)[$(idx_var_n)] = x[$(idx_obs_var)]; - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l3, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l3, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l1; + S_values[$(idx_var_n)] = x[$(idx_obs_var)]; + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l3 => l2 - @everywhere $(func_name(:cc, :l3, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t2 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (S.loc = :l2) + @everywhere $(func_name(:cc, :l3, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t2 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = :l2) end eval(meta_elementary_functions) diff --git a/automata/automaton_G.jl b/automata/automaton_G.jl index b169df1ff19cc2f851b714d0321a562f290ef523..67847b4a6f3e95bdeb819dddb7dbd779f939f2ac 100644 --- a/automata/automaton_G.jl +++ b/automata/automaton_G.jl @@ -53,140 +53,140 @@ function create_automaton_G(m::ContinuousTimeModel, x1::Float64, x2::Float64, t1 @everywhere istrue(val::Float64) = convert(Bool, val) # l0 loc # l0 => l1 - @everywhere $(func_name(:cc, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1")); - setindex!(getfield(S, :values), 0, $(idx_var_d)); - setindex!(getfield(S, :values), x[$(idx_obs_var)], $(idx_var_n)); - setindex!(getfield(S, :values), true, $(idx_var_in)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l0, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l0, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1"); + setindex!(S_values, 0, $(idx_var_d)); + setindex!(S_values, x[$(idx_obs_var)], $(idx_var_n)); + setindex!(S_values, true, $(idx_var_in)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l1 => l3 - @everywhere $(func_name(:cc, :l1, :l3, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) <= $t1 && - getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2 - @everywhere $(func_name(:us, :l1, :l3, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3")); - setindex!(getfield(S, :values), min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), false, $(idx_var_in))) - - @everywhere $(func_name(:cc, :l1, :l3, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) <= $t1) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1, :l3, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3")); - setindex!(getfield(S, :values), 0, $(idx_var_d)); - setindex!(getfield(S, :values), false, $(idx_var_in))) - - @everywhere $(func_name(:cc, :l1, :l3, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1, :l3, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * (getfield(S, :time) - $t1), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) - - @everywhere $(func_name(:cc, :l1, :l3, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1, :l3, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3")); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) + @everywhere $(func_name(:cc, :l1, :l3, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time <= $t1 && + S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2 + @everywhere $(func_name(:us, :l1, :l3, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3"); + setindex!(S_values, min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, false, $(idx_var_in))) + + @everywhere $(func_name(:cc, :l1, :l3, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time <= $t1) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1, :l3, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3"); + setindex!(S_values, 0, $(idx_var_d)); + setindex!(S_values, false, $(idx_var_in))) + + @everywhere $(func_name(:cc, :l1, :l3, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1, :l3, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3"); + setindex!(S_values, S_values[$(idx_var_d)] * (S_time - $t1), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime))) + + @everywhere $(func_name(:cc, :l1, :l3, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1, :l3, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3"); + setindex!(S_values, 0.0, $(idx_var_tprime))) # l1 => l4 - @everywhere $(func_name(:cc, :l1, :l4, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1, :l4, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l4")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_d)] * (getfield(S, :time) - $t1), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1, :l4, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1, :l4, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l4"))) + @everywhere $(func_name(:cc, :l1, :l4, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1, :l4, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l4"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_d)] * (S_time - $t1), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1, :l4, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1, :l4, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l4")) # l1 => l2 #= - @everywhere $(func_name(:cc, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - getfield(S, :time) >= $t2 - @everywhere $(func_name(:us, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2"))) - - @everywhere $(func_name(:cc, :l1, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - getfield(S, :time) >= $t2 - @everywhere $(func_name(:us, :l1, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1, :l2, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && - getfield(S, :time) <= $t1 - @everywhere $(func_name(:us, :l1, :l2, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), ($t2 - $t1) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1, :l2, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && - ($t1 <= getfield(S, :time) <= $t2) - @everywhere $(func_name(:us, :l1, :l2, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + ($t2 - getfield(S, :time)) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + S_time >= $t2 + @everywhere $(func_name(:us, :l1, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2")) + + @everywhere $(func_name(:cc, :l1, :l2, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + S_time >= $t2 + @everywhere $(func_name(:us, :l1, :l2, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, S_values[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1, :l2, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && + S_time <= $t1 + @everywhere $(func_name(:us, :l1, :l2, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, ($t2 - $t1) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1, :l2, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && + ($t1 <= S_time <= $t2) + @everywhere $(func_name(:us, :l1, :l2, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, S_values[$(idx_var_d)] + ($t2 - S_time) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d))) =# # l3 => l1 - @everywhere $(func_name(:cc, :l3, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l3, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1")); - setindex!(getfield(S, :values), x[$(idx_obs_var)], $(idx_var_n)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l3, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l3, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1"); + setindex!(S_values, x[$(idx_obs_var)], $(idx_var_n)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l4 => l1 - @everywhere $(func_name(:cc, :l4, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l4, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_tprime)] * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime)); - setindex!(getfield(S, :values), x[$(idx_obs_var)], $(idx_var_n)); - setindex!(getfield(S, :values), true, $(idx_var_in)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l4, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l4, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_tprime)] * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime)); + setindex!(S_values, x[$(idx_obs_var)], $(idx_var_n)); + setindex!(S_values, true, $(idx_var_in)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l3 => l2 - @everywhere $(func_name(:cc, :l3, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - (getfield(S, :time) >= $t2 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l3, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - (getfield(S, :time) >= $t2 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2"))) + @everywhere $(func_name(:cc, :l3, :l2, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + (S_time >= $t2 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3, :l2, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, S_values[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l3, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + (S_time >= $t2 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2")) # l4 => l2 - @everywhere $(func_name(:cc, :l4, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l4, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + ($t2 - getfield(S, :time)) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) - - @everywhere $(func_name(:cc, :l4, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t2) - @everywhere $(func_name(:us, :l4, :l2, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_tprime)] * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) + @everywhere $(func_name(:cc, :l4, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l4, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, S_values[$(idx_var_d)] + ($t2 - S_time) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime))) + + @everywhere $(func_name(:cc, :l4, :l2, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t2) + @everywhere $(func_name(:us, :l4, :l2, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_tprime)] * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime))) end eval(meta_elementary_functions) diff --git a/automata/automaton_G_and_F.jl b/automata/automaton_G_and_F.jl index 367eb5d6d5a75ebab18770dfca6505131473c1c3..f445f297a22e89987e330f7b423f5f292a7fcb6c 100644 --- a/automata/automaton_G_and_F.jl +++ b/automata/automaton_G_and_F.jl @@ -67,216 +67,216 @@ function create_automaton_G_and_F(m::ContinuousTimeModel, x1::Float64, x2::Float # l0G loc # l0G => l1G - @everywhere $(func_name(:cc, :l0G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1G")); - setindex!(getfield(S, :values), 0, $(idx_var_d)); - setindex!(getfield(S, :values), x[$(idx_obs_var_G)], $(idx_var_n)); - setindex!(getfield(S, :values), true, $(idx_var_in)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l0G, :l1G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l0G, :l1G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1G"); + setindex!(S_values, 0, $(idx_var_d)); + setindex!(S_values, x[$(idx_obs_var_G)], $(idx_var_n)); + setindex!(S_values, true, $(idx_var_in)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l1G loc # l1G => l3G - @everywhere $(func_name(:cc, :l1G, :l3G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) <= $t1 && - getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2 - @everywhere $(func_name(:us, :l1G, :l3G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3G")); - setindex!(getfield(S, :values), min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), false, $(idx_var_in))) - - @everywhere $(func_name(:cc, :l1G, :l3G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) <= $t1) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1G, :l3G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3G")); - setindex!(getfield(S, :values), 0, $(idx_var_d)); - setindex!(getfield(S, :values), false, $(idx_var_in))) - - @everywhere $(func_name(:cc, :l1G, :l3G, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1G, :l3G, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * (getfield(S, :time) - $t1), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) - - @everywhere $(func_name(:cc, :l1G, :l3G, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - ($x1 <= getfield(S, :values)[$(idx_var_n)] <= $x2) - @everywhere $(func_name(:us, :l1G, :l3G, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3G")); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime))) + @everywhere $(func_name(:cc, :l1G, :l3G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time <= $t1 && + S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2 + @everywhere $(func_name(:us, :l1G, :l3G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3G"); + setindex!(S_values, min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, false, $(idx_var_in))) + + @everywhere $(func_name(:cc, :l1G, :l3G, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time <= $t1) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1G, :l3G, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3G"); + setindex!(S_values, 0, $(idx_var_d)); + setindex!(S_values, false, $(idx_var_in))) + + @everywhere $(func_name(:cc, :l1G, :l3G, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1G, :l3G, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3G"); + setindex!(S_values, S_values[$(idx_var_d)] * (S_time - $t1), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime))) + + @everywhere $(func_name(:cc, :l1G, :l3G, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + ($x1 <= S_values[$(idx_var_n)] <= $x2) + @everywhere $(func_name(:us, :l1G, :l3G, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3G"); + setindex!(S_values, 0.0, $(idx_var_tprime))) # l1G => l4G - @everywhere $(func_name(:cc, :l1G, :l4G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1G, :l4G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l4G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_d)] * (getfield(S, :time) - $t1), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1G, :l4G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - ($t1 <= getfield(S, :time) <= $t2) && - (getfield(S, :values)[$(idx_var_n)] < $x1 || getfield(S, :values)[$(idx_var_n)] > $x2) - @everywhere $(func_name(:us, :l1G, :l4G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l4G"))) + @everywhere $(func_name(:cc, :l1G, :l4G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1G, :l4G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l4G"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_d)] * (S_time - $t1), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1G, :l4G, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + ($t1 <= S_time <= $t2) && + (S_values[$(idx_var_n)] < $x1 || S_values[$(idx_var_n)] > $x2) + @everywhere $(func_name(:us, :l1G, :l4G, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l4G")) # l1G => l2G #= - @everywhere $(func_name(:cc, :l1G, :l2G, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && - getfield(S, :time) <= $t1 - @everywhere $(func_name(:us, :l1G, :l2G, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), ($t2 - $t1) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1G, :l2G, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && + S_time <= $t1 + @everywhere $(func_name(:us, :l1G, :l2G, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, ($t2 - $t1) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d))) - @everywhere $(func_name(:cc, :l1G, :l2G, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && - ($t1 <= getfield(S, :time) <= $t2) - @everywhere $(func_name(:us, :l1G, :l2G, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + ($t2 - getfield(S, :time)) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - getfield(S, :time) >= $t2 - @everywhere $(func_name(:us, :l1G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G"))) - - @everywhere $(func_name(:cc, :l1G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - getfield(S, :time) >= $t2 - @everywhere $(func_name(:us, :l1G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1G, :l2G, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && + ($t1 <= S_time <= $t2) + @everywhere $(func_name(:us, :l1G, :l2G, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, S_values[$(idx_var_d)] + ($t2 - S_time) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1G, :l2G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + S_time >= $t2 + @everywhere $(func_name(:us, :l1G, :l2G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G")) + + @everywhere $(func_name(:cc, :l1G, :l2G, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + S_time >= $t2 + @everywhere $(func_name(:us, :l1G, :l2G, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, S_values[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) =# # l3G loc # l3G => l1G - @everywhere $(func_name(:cc, :l3G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l3G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1G")); - setindex!(getfield(S, :values), x[$(idx_obs_var_G)], $(idx_var_n)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l3G, :l1G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l3G, :l1G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1G"); + setindex!(S_values, x[$(idx_obs_var_G)], $(idx_var_n)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l3G => l2G - @everywhere $(func_name(:cc, :l3G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_in)]) && - (getfield(S, :time) >= $t2 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) - - @everywhere $(func_name(:cc, :l3G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - !istrue(getfield(S, :values)[$(idx_var_in)]) && - (getfield(S, :time) >= $t2 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G"))) + @everywhere $(func_name(:cc, :l3G, :l2G, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_in)]) && + (S_time >= $t2 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3G, :l2G, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, S_values[$(idx_var_d)] * ($t2 - $t1), $(idx_var_d))) + + @everywhere $(func_name(:cc, :l3G, :l2G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + !istrue(S_values[$(idx_var_in)]) && + (S_time >= $t2 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3G, :l2G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G")) # l4G loc # l4G => l1G - @everywhere $(func_name(:cc, :l4G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l4G, :l1G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_tprime)] * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d)); - setindex!(getfield(S, :values), 0.0, $(idx_var_tprime)); - setindex!(getfield(S, :values), x[$(idx_obs_var_G)], $(idx_var_n)); - setindex!(getfield(S, :values), true, $(idx_var_in)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l4G, :l1G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l4G, :l1G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1G"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_tprime)] * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d)); + setindex!(S_values, 0.0, $(idx_var_tprime)); + setindex!(S_values, x[$(idx_obs_var_G)], $(idx_var_n)); + setindex!(S_values, true, $(idx_var_in)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l4G => l2G - @everywhere $(func_name(:cc, :l4G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l4G, :l2G, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + ($t2 - getfield(S, :time)) * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d));) + @everywhere $(func_name(:cc, :l4G, :l2G, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l4G, :l2G, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, S_values[$(idx_var_d)] + ($t2 - S_time) * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d));) - @everywhere $(func_name(:cc, :l4G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t2) - @everywhere $(func_name(:us, :l4G, :l2G, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2G")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_tprime)] * min(abs($x1 - getfield(S, :values)[$(idx_var_n)]), abs($x2 - getfield(S, :values)[$(idx_var_n)])), $(idx_var_d));) + @everywhere $(func_name(:cc, :l4G, :l2G, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t2) + @everywhere $(func_name(:us, :l4G, :l2G, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2G"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_tprime)] * min(abs($x1 - S_values[$(idx_var_n)]), abs($x2 - S_values[$(idx_var_n)])), $(idx_var_d));) # Connection between the two automata: l2G => l1F - @everywhere $(func_name(:cc, :l2G, :l1F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l2G, :l1F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1F")); - setindex!(getfield(S, :values), x[$(idx_obs_var_F)], $(idx_var_n)); - setindex!(getfield(S, :values), Inf, $(idx_var_dprime)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l2G, :l1F, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l2G, :l1F, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1F"); + setindex!(S_values, x[$(idx_obs_var_F)], $(idx_var_n)); + setindex!(S_values, Inf, $(idx_var_dprime)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l1F loc : we construct the edges of the form l1F => (..) # l1F => l2F - @everywhere $(func_name(:cc, :l1F, :l2F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) >= $t3 && - getfield(S, :values)[$(idx_var_dprime)] == 0 - @everywhere $(func_name(:us, :l1F, :l2F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2F"));) - #setindex!(getfield(S, :values), 0, $(idx_var_dprime))) - - @everywhere $(func_name(:cc, :l1F, :l2F, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t4) && - (getfield(S, :values)[$(idx_var_n)] < $x3 || getfield(S, :values)[$(idx_var_n)] > $x4) - @everywhere $(func_name(:us, :l1F, :l2F, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2F")); - #setindex!(getfield(S, :values), min(abs(getfield(S, :values)[$(idx_var_n)] - $x3), abs(getfield(S, :values)[$(idx_var_n)] - $x4)), $(idx_var_dprime)); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_dprime)], $(idx_var_d))) + @everywhere $(func_name(:cc, :l1F, :l2F, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time >= $t3 && + S_values[$(idx_var_dprime)] == 0 + @everywhere $(func_name(:us, :l1F, :l2F, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2F")); + #setindex!(S_values, 0, $(idx_var_dprime))) + + @everywhere $(func_name(:cc, :l1F, :l2F, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t4) && + (S_values[$(idx_var_n)] < $x3 || S_values[$(idx_var_n)] > $x4) + @everywhere $(func_name(:us, :l1F, :l2F, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2F"); + #setindex!(S_values, min(abs(S_values[$(idx_var_n)] - $x3), abs(S_values[$(idx_var_n)] - $x4)), $(idx_var_dprime)); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_dprime)], $(idx_var_d))) #= - @everywhere $(func_name(:cc, :l1F, :l2F, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - istrue(getfield(S, :values)[$(idx_var_isabs)]) && getfield(S, :time) <= $t4 - @everywhere $(func_name(:us, :l1F, :l2F, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2F")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_dprime)], $(idx_var_d))) - - @everywhere $(func_name(:cc, :l1F, :l2F, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :time) >= $t3 && - getfield(S, :values)[$(idx_var_dprime)] == 0 - @everywhere $(func_name(:us, :l1F, :l2F, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2F"))) + @everywhere $(func_name(:cc, :l1F, :l2F, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + istrue(S_values[$(idx_var_isabs)]) && S_time <= $t4 + @everywhere $(func_name(:us, :l1F, :l2F, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2F"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_dprime)], $(idx_var_d))) + + @everywhere $(func_name(:cc, :l1F, :l2F, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_time >= $t3 && + S_values[$(idx_var_dprime)] == 0 + @everywhere $(func_name(:us, :l1F, :l2F, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2F")) =# # l1F => l3F - @everywhere $(func_name(:cc, :l1F, :l3F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) <= $t3) && - (getfield(S, :values)[$(idx_var_n)] < $x3 || getfield(S, :values)[$(idx_var_n)] > $x4) - @everywhere $(func_name(:us, :l1F, :l3F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3F")); - setindex!(getfield(S, :values), min(sqrt((getfield(S, :time) - $t3)^2 + (getfield(S, :values)[$(idx_var_n)] - $x4)^2), - sqrt((getfield(S, :time) - $t3)^2 + (getfield(S, :values)[$(idx_var_n)] - $x3)^2)), $(idx_var_dprime))) - - @everywhere $(func_name(:cc, :l1F, :l3F, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - ($x3 <= getfield(S, :values)[$(idx_var_n)] <= $x4) - @everywhere $(func_name(:us, :l1F, :l3F, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3F")); - setindex!(getfield(S, :values), 0, $(idx_var_dprime));) - - @everywhere $(func_name(:cc, :l1F, :l3F, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t3) && - (getfield(S, :values)[$(idx_var_n)] < $x3 || getfield(S, :values)[$(idx_var_n)] > $x4) - @everywhere $(func_name(:us, :l1F, :l3F, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l3F")); - setindex!(getfield(S, :values), min(getfield(S, :values)[$(idx_var_dprime)], min(abs(getfield(S, :values)[$(idx_var_n)] - $x3), abs(getfield(S, :values)[$(idx_var_n)] - $x4))), $(idx_var_dprime))) + @everywhere $(func_name(:cc, :l1F, :l3F, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time <= $t3) && + (S_values[$(idx_var_n)] < $x3 || S_values[$(idx_var_n)] > $x4) + @everywhere $(func_name(:us, :l1F, :l3F, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3F"); + setindex!(S_values, min(sqrt((S_time - $t3)^2 + (S_values[$(idx_var_n)] - $x4)^2), + sqrt((S_time - $t3)^2 + (S_values[$(idx_var_n)] - $x3)^2)), $(idx_var_dprime))) + + @everywhere $(func_name(:cc, :l1F, :l3F, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + ($x3 <= S_values[$(idx_var_n)] <= $x4) + @everywhere $(func_name(:us, :l1F, :l3F, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3F"); + setindex!(S_values, 0, $(idx_var_dprime));) + + @everywhere $(func_name(:cc, :l1F, :l3F, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t3) && + (S_values[$(idx_var_n)] < $x3 || S_values[$(idx_var_n)] > $x4) + @everywhere $(func_name(:us, :l1F, :l3F, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l3F"); + setindex!(S_values, min(S_values[$(idx_var_dprime)], min(abs(S_values[$(idx_var_n)] - $x3), abs(S_values[$(idx_var_n)] - $x4))), $(idx_var_dprime))) # l3F loc # l3F => l1F - @everywhere $(func_name(:cc, :l3F, :l1F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l3F, :l1F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1F")); - setindex!(getfield(S, :values), x[$(idx_obs_var_F)], $(idx_var_n)); - setindex!(getfield(S, :values), getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) + @everywhere $(func_name(:cc, :l3F, :l1F, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l3F, :l1F, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1F"); + setindex!(S_values, x[$(idx_obs_var_F)], $(idx_var_n)); + setindex!(S_values, getfield(Main, $(Meta.quot(sym_isabs_func)))(p, x), $(idx_var_isabs))) # l3F => l2F - @everywhere $(func_name(:cc, :l3F, :l2F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (getfield(S, :time) >= $t4 || istrue(getfield(S, :values)[$(idx_var_isabs)])) - @everywhere $(func_name(:us, :l3F, :l2F, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2F")); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + getfield(S, :values)[$(idx_var_dprime)], $(idx_var_d))) + @everywhere $(func_name(:cc, :l3F, :l2F, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_time >= $t4 || istrue(S_values[$(idx_var_isabs)])) + @everywhere $(func_name(:us, :l3F, :l2F, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2F"); + setindex!(S_values, S_values[$(idx_var_d)] + S_values[$(idx_var_dprime)], $(idx_var_d))) end eval(meta_elementary_functions) diff --git a/automata/euclidean_distance_automaton.jl b/automata/euclidean_distance_automaton.jl index d7128a6e8dd6b71f30b3a4cab7b00e8ff5e8ab8c..e50b6e6d84da9f892e28dbb95ce7402fd7bfa412 100644 --- a/automata/euclidean_distance_automaton.jl +++ b/automata/euclidean_distance_automaton.jl @@ -44,37 +44,37 @@ function create_euclidean_distance_automaton(m::ContinuousTimeModel, timeline::A meta_elementary_functions = quote # l0 loc # l0 => l1 - @everywhere $(func_name(:cc, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1")); - setindex!(getfield(S, :values), x[$(idx_obs_var)], $(idx_var_n)); - setindex!(getfield(S, :values), 0.0, $(idx_var_d)); - setindex!(getfield(S, :values), 1.0, $(idx_var_idx))) + @everywhere $(func_name(:cc, :l0, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l0, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1"); + setindex!(S_values, x[$(idx_obs_var)], $(idx_var_n)); + setindex!(S_values, 0.0, $(idx_var_d)); + setindex!(S_values, 1.0, $(idx_var_idx))) # l1 loc # l1 => l1 # Defined below - @everywhere $(func_name(:cc, :l1, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :l1, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (tml = $(Tuple(timeline)); - tml_idx = tml[convert(Int, getfield(S, :values)[$(idx_var_idx)])]; - getfield(S, :values)[$(idx_var_t)] >= tml_idx) - @everywhere $(func_name(:us, :l1, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + tml_idx = tml[convert(Int, S_values[$(idx_var_idx)])]; + S_values[$(idx_var_t)] >= tml_idx) + @everywhere $(func_name(:us, :l1, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (y_obs = $(Tuple(observations)); - y_obs_idx = y_obs[convert(Int, getfield(S, :values)[$(idx_var_idx)])]; - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_d)] + (getfield(S, :values)[$(idx_var_n)] - y_obs_idx)^2, + y_obs_idx = y_obs[convert(Int, S_values[$(idx_var_idx)])]; + setindex!(S_values, S_values[$(idx_var_d)] + (S_values[$(idx_var_n)] - y_obs_idx)^2, $(idx_var_d)); - setindex!(getfield(S, :values), getfield(S, :values)[$(idx_var_idx)] + 1.0, $(idx_var_idx))) + setindex!(S_values, S_values[$(idx_var_idx)] + 1.0, $(idx_var_idx))) - @everywhere $(func_name(:cc, :l1, :l1, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l1, :l1, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setindex!(getfield(S, :values), x[$(idx_obs_var)], $(idx_var_n))) + @everywhere $(func_name(:cc, :l1, :l1, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l1, :l1, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (setindex!(S_values, x[$(idx_obs_var)], $(idx_var_n))) # l1 => l2 - @everywhere $(func_name(:cc, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - getfield(S, :values)[$(idx_var_idx)] >= ($nbr_observations + 1) - @everywhere $(func_name(:us, :l1, :l2, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l2")); - setindex!(getfield(S, :values), sqrt(getfield(S, :values)[$(idx_var_d)]), $(idx_var_d))) + @everywhere $(func_name(:cc, :l1, :l2, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(idx_var_idx)] >= ($nbr_observations + 1) + @everywhere $(func_name(:us, :l1, :l2, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l2"); + setindex!(S_values, sqrt(S_values[$(idx_var_d)]), $(idx_var_d))) end eval(meta_elementary_functions) @@ -90,11 +90,11 @@ function create_euclidean_distance_automaton(m::ContinuousTimeModel, timeline::A map_edges[:l1][:l1] = [edge1] for i = 1:nbr_observations meta_edge_i = quote - @everywhere $(func_name(:cc, :l1, :l1, 1+i))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :l1, :l1, 1+i))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = S[:t] >= $(timeline[i]) - @everywhere $(func_name(:us, :l1, :l1, 1+i))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setindex!(getfield(S, :values), S[:d] + (S[:n] - $(observations[i]))^2, $(idx_var_d)); - setindex!(getfield(S, :values), S[:idx] + 1.0, $(idx_var_idx))) + @everywhere $(func_name(:us, :l1, :l1, 1+i))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (setindex!(S_values, S[:d] + (S[:n] - $(observations[i]))^2, $(idx_var_d)); + setindex!(S_values, S[:idx] + 1.0, $(idx_var_idx))) end eval(meta_edge_i) push!(map_edges[:l1][:l1], Edge(nothing, getfield(Main, func_name(:cc, :l1, :l1, 1+i)), getfield(Main, func_name(:us, :l1, :l1, 1+i)))) diff --git a/automata/euclidean_distance_automaton_2.jl b/automata/euclidean_distance_automaton_2.jl index 38d30a0013db4af49a576c4906bfe9cedda8babc..95cb14d8e4fb781583a7cf13acc1bb096a2c112b 100644 --- a/automata/euclidean_distance_automaton_2.jl +++ b/automata/euclidean_distance_automaton_2.jl @@ -46,25 +46,25 @@ function create_euclidean_distance_automaton_2(m::ContinuousTimeModel, timeline: meta_elementary_functions = quote # l0 loc # l0 => l1 - @everywhere $(func_name(:cc, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0, :l1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l1")); - setindex!(getfield(S, :values), x[$(idx_obs_var)], $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:d)))) + @everywhere $(func_name(:cc, :l0, :l1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, :l0, :l1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l1"); + setindex!(S_values, x[$(idx_obs_var)], $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:d)))) # lnbr_obs => lfinal - @everywhere $(func_name(:cc, loc_nbr_obs, :lfinal, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:t))) >= $(timeline[nbr_observations]) - @everywhere $(func_name(:us, loc_nbr_obs, :lfinal, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("lfinal")); - setindex!(getfield(S, :values), get_value(S, $(to_idx(:d))) + (get_value(S, $(to_idx(:n)))-$(observations[nbr_observations]))^2, + @everywhere $(func_name(:cc, loc_nbr_obs, :lfinal, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:t))] >= $(timeline[nbr_observations]) + @everywhere $(func_name(:us, loc_nbr_obs, :lfinal, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("lfinal"); + setindex!(S_values, S_values[$(to_idx(:d))] + (S_values[$(to_idx(:n))]-$(observations[nbr_observations]))^2, $(to_idx(:d))); - setindex!(getfield(S, :values), sqrt(get_value(S, $(to_idx(:d)))), $(to_idx(:d)))) + setindex!(S_values, sqrt(S_values[$(to_idx(:d))]), $(to_idx(:d)))) # lnbr_obs => lnbr_obs - @everywhere $(func_name(:cc, loc_nbr_obs, loc_nbr_obs, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, loc_nbr_obs, loc_nbr_obs, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setindex!(getfield(S, :values), x[$(idx_obs_var)], $(to_idx(:n)))) + @everywhere $(func_name(:cc, loc_nbr_obs, loc_nbr_obs, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, loc_nbr_obs, loc_nbr_obs, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (setindex!(S_values, x[$(idx_obs_var)], $(to_idx(:n)))) end eval(meta_elementary_functions) # l0 loc @@ -86,16 +86,16 @@ function create_euclidean_distance_automaton_2(m::ContinuousTimeModel, timeline: # l1 loc # l1 => l1 # Defined below - @everywhere $(func_name(:cc, loci, locip1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:t))) >= $(timeline[i]) - @everywhere $(func_name(:us, loci, locip1, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, $(Meta.quot(locip1))); - setindex!(getfield(S, :values), get_value(S, $(to_idx(:d))) + (get_value(S, $(to_idx(:n)))-$(observations[i]))^2, + @everywhere $(func_name(:cc, loci, locip1, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:t))] >= $(timeline[i]) + @everywhere $(func_name(:us, loci, locip1, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = $(Meta.quot(locip1)); + setindex!(S_values, S_values[$(to_idx(:d))] + (S_values[$(to_idx(:n))]-$(observations[i]))^2, $(to_idx(:d)))) - @everywhere $(func_name(:cc, loci, loci, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, loci, loci, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setindex!(getfield(S, :values), x[$(idx_obs_var)], $(to_idx(:n)))) + @everywhere $(func_name(:cc, loci, loci, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true + @everywhere $(func_name(:us, loci, loci, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (setindex!(S_values, x[$(idx_obs_var)], $(to_idx(:n)))) end eval(meta_elementary_functions_loci) diff --git a/automata/period_automaton.jl b/automata/period_automaton.jl index bc4224df1b38c8a58096a90503b703d21f0b8b91..01d2e145c4a8f1f1db3d1392c4ecc36873f8dc7a 100644 --- a/automata/period_automaton.jl +++ b/automata/period_automaton.jl @@ -71,159 +71,159 @@ function create_period_automaton(m::ContinuousTimeModel, L::Float64, H::Float64, # l0 loc # * l0 => l0 - @everywhere $(func_name(:cc, :l0, :l0, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :l0, :l0, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0, :l0, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:us, :l0, :l0, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (nothing) # * l0 => l0prime - @everywhere $(func_name(:cc, :l0, :l0prime, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:t))) >= $initT - @everywhere $(func_name(:us, :l0, :l0prime, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("l0prime")); - setindex!(getfield(S, :values), Inf, $(to_idx(:d)))) + @everywhere $(func_name(:cc, :l0, :l0prime, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:t))] >= $initT + @everywhere $(func_name(:us, :l0, :l0prime, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("l0prime"); + setindex!(S_values, Inf, $(to_idx(:d)))) # * l0 => low - @everywhere $(func_name(:cc, :l0, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:t))) >= $initT - @everywhere $(func_name(:us, :l0, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low")); - setindex!(getfield(S, :values), 0.0, $(to_idx(:t))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:top))); - setindex!(getfield(S, :values), -1, $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:tp))); - setindex!(getfield(S, :values), Inf, $(to_idx(:d)))) + @everywhere $(func_name(:cc, :l0, :low, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:t))] >= $initT + @everywhere $(func_name(:us, :l0, :low, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low"); + setindex!(S_values, 0.0, $(to_idx(:t))); + setindex!(S_values, 0.0, $(to_idx(:top))); + setindex!(S_values, -1, $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:tp))); + setindex!(S_values, Inf, $(to_idx(:d)))) # l0prime # * l0prime => l0prime - @everywhere $(func_name(:cc, :l0prime, :l0prime, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :l0prime, :l0prime, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0prime, :l0prime, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:us, :l0prime, :l0prime, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (nothing) # * l0prime => low - @everywhere $(func_name(:cc, :l0prime, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :l0prime, :low, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = true - @everywhere $(func_name(:us, :l0prime, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low")); - setindex!(getfield(S, :values), 0.0, $(to_idx(:t))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:top))); - setindex!(getfield(S, :values), -1, $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:tp)))) + @everywhere $(func_name(:us, :l0prime, :low, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low"); + setindex!(S_values, 0.0, $(to_idx(:t))); + setindex!(S_values, 0.0, $(to_idx(:top))); + setindex!(S_values, -1, $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:tp)))) # low # * low => low - @everywhere $(func_name(:cc, :low, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :low, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :low, :low, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :low, :low, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (nothing) # * low => mid - @everywhere $(func_name(:cc, :low, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :low, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("mid"))) + @everywhere $(func_name(:cc, :low, :mid, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :low, :mid, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("mid")) # * low => final - @everywhere $(func_name(:cc, :low, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) == $N - @everywhere $(func_name(:us, :low, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("final")); - val_d = getfield(Main, $(Meta.quot(error_func)))(get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:var_tp))), + @everywhere $(func_name(:cc, :low, :final, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] == $N + @everywhere $(func_name(:us, :low, :final, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("final"); + val_d = getfield(Main, $(Meta.quot(error_func)))(S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:var_tp))], $(ref_mean_tp), $(ref_var_tp)); - setindex!(getfield(S, :values), val_d, $(to_idx(:d)))) + setindex!(S_values, val_d, $(to_idx(:d)))) # mid # * mid => mid - @everywhere $(func_name(:cc, :mid, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :mid, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :mid, :mid, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :mid, :mid, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (nothing) # * mid => low - @everywhere $(func_name(:cc, :mid, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N && - get_value(S, $(to_idx(:top))) == 0.0 - @everywhere $(func_name(:us, :mid, :low, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low"))) - - @everywhere $(func_name(:cc, :mid, :low, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) == -1.0 && - get_value(S, $(to_idx(:top))) == 1.0 - @everywhere $(func_name(:us, :mid, :low, 2))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low")); - setindex!(getfield(S, :values), get_value(S, $(to_idx(:n))) + 1, $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:top))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:tp)))) - - @everywhere $(func_name(:cc, :mid, :low, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (get_value(S, $(to_idx(:n))) == 0.0) && - get_value(S, $(to_idx(:top))) == 1.0 - @everywhere $(func_name(:us, :mid, :low, 3))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low")); - setindex!(getfield(S, :values), get_value(S, $(to_idx(:n))) + 1, $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:top))); - setindex!(getfield(S, :values), f_mean_tp(get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:tp))), - get_value(S, $(to_idx(:n)))), $(to_idx(:mean_tp))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:tp)))) - - @everywhere $(func_name(:cc, :mid, :low, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (1 <= get_value(S, $(to_idx(:n))) < $N) && - get_value(S, $(to_idx(:top))) == 1.0 - @everywhere $(func_name(:us, :mid, :low, 4))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("low")); - setindex!(getfield(S, :values), get_value(S, $(to_idx(:n))) + 1, $(to_idx(:n))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:top))); - setindex!(getfield(S, :values), g_var_tp(get_value(S, $(to_idx(:var_tp))), - get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:tp))), - get_value(S, $(to_idx(:n)))), $(to_idx(:var_tp))); - setindex!(getfield(S, :values), f_mean_tp(get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:tp))), - get_value(S, $(to_idx(:n)))), $(to_idx(:mean_tp))); - setindex!(getfield(S, :values), 0.0, $(to_idx(:tp)))) + @everywhere $(func_name(:cc, :mid, :low, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N && + S_values[$(to_idx(:top))] == 0.0 + @everywhere $(func_name(:us, :mid, :low, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low")) + + @everywhere $(func_name(:cc, :mid, :low, 2))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] == -1.0 && + S_values[$(to_idx(:top))] == 1.0 + @everywhere $(func_name(:us, :mid, :low, 2))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low"); + setindex!(S_values, S_values[$(to_idx(:n))] + 1, $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:top))); + setindex!(S_values, 0.0, $(to_idx(:tp)))) + + @everywhere $(func_name(:cc, :mid, :low, 3))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (S_values[$(to_idx(:n))] == 0.0) && + S_values[$(to_idx(:top))] == 1.0 + @everywhere $(func_name(:us, :mid, :low, 3))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low"); + setindex!(S_values, S_values[$(to_idx(:n))] + 1, $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:top))); + setindex!(S_values, f_mean_tp(S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:tp))], + S_values[$(to_idx(:n))]), $(to_idx(:mean_tp))); + setindex!(S_values, 0.0, $(to_idx(:tp)))) + + @everywhere $(func_name(:cc, :mid, :low, 4))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (1 <= S_values[$(to_idx(:n))] < $N) && + S_values[$(to_idx(:top))] == 1.0 + @everywhere $(func_name(:us, :mid, :low, 4))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("low"); + setindex!(S_values, S_values[$(to_idx(:n))] + 1, $(to_idx(:n))); + setindex!(S_values, 0.0, $(to_idx(:top))); + setindex!(S_values, g_var_tp(S_values[$(to_idx(:var_tp))], + S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:tp))], + S_values[$(to_idx(:n))]), $(to_idx(:var_tp))); + setindex!(S_values, f_mean_tp(S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:tp))], + S_values[$(to_idx(:n))]), $(to_idx(:mean_tp))); + setindex!(S_values, 0.0, $(to_idx(:tp)))) # * mid => high - @everywhere $(func_name(:cc, :mid, :high, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :mid, :high, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("high")); - setindex!(getfield(S, :values), 1.0, $(to_idx(:top)))) + @everywhere $(func_name(:cc, :mid, :high, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :mid, :high, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("high"); + setindex!(S_values, 1.0, $(to_idx(:top)))) # * mid => final - @everywhere $(func_name(:cc, :mid, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) == $N - @everywhere $(func_name(:us, :mid, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("final")); - val_d = getfield(Main, Meta.quot($error_func))(get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:var_tp))), + @everywhere $(func_name(:cc, :mid, :final, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] == $N + @everywhere $(func_name(:us, :mid, :final, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("final"); + val_d = getfield(Main, Meta.quot($error_func))(S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:var_tp))], $(ref_mean_tp), $(ref_var_tp)); - setindex!(getfield(S, :values), val_d, $(to_idx(:d)))) + setindex!(S_values, val_d, $(to_idx(:d)))) # high # * high => high - @everywhere $(func_name(:cc, :high, :high, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :high, :high, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = + @everywhere $(func_name(:cc, :high, :high, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :high, :high, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = (nothing) # * high => mid - @everywhere $(func_name(:cc, :high, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) < $N - @everywhere $(func_name(:us, :high, :mid, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("mid"))) + @everywhere $(func_name(:cc, :high, :mid, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] < $N + @everywhere $(func_name(:us, :high, :mid, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("mid")) # * high => final - @everywhere $(func_name(:cc, :high, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - get_value(S, $(to_idx(:n))) == $N - @everywhere $(func_name(:us, :high, :final, 1))(S::StateLHA, x::Vector{Int}, p::Vector{Float64}) = - (setfield!(S, :loc, Symbol("final")); - val_d = getfield(Main, Meta.quot($error_func))(get_value(S, $(to_idx(:mean_tp))), - get_value(S, $(to_idx(:var_tp))), + @everywhere $(func_name(:cc, :high, :final, 1))(S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + S_values[$(to_idx(:n))] == $N + @everywhere $(func_name(:us, :high, :final, 1))(ptr_loc::Vector{Symbol}, S_time::Float64, S_values::Vector{Float64}, x::Vector{Int}, p::Vector{Float64}) = + (ptr_loc[1] = Symbol("final"); + val_d = getfield(Main, Meta.quot($error_func))(S_values[$(to_idx(:mean_tp))], + S_values[$(to_idx(:var_tp))], $(ref_mean_tp), $(ref_var_tp)); - setindex!(getfield(S, :values), val_d, $(to_idx(:d)))) + setindex!(S_values, val_d, $(to_idx(:d)))) end eval(meta_elementary_functions) diff --git a/core/lha.jl b/core/lha.jl index 5693aa3d61f69832052351a8a900ce96d419e7f1..eb3ecc6ecea5e8981177d11337a02e364ee43732 100644 --- a/core/lha.jl +++ b/core/lha.jl @@ -105,13 +105,13 @@ end function _find_edge_candidates!(edge_candidates::Vector{Edge}, edges_from_current_loc::Dict{Location,Vector{Edge}}, Λ::Dict{Location,Function}, - Snplus1::StateLHA, + S_time::Float64, S_values::Vector{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, x, p) + if Λ[target_loc](x) && getfield(edge, :check_constraints)(S_time, S_values, x, p) if getfield(edge, :transitions) == nothing _push_edge!(edge_candidates, edge, nbr_candidates) nbr_candidates += 1 @@ -155,26 +155,26 @@ function next_state!(Snplus1::StateLHA, A::LHA, 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 detected_event::Bool = false turns = 0 - + current_values = getfield(Snplus1, :values) + current_time = getfield(Snplus1, :time) + ptr_current_loc = [getfield(Snplus1, :loc)] + if verbose println("##### Begin next_state!") @show xnplus1, tnplus1, tr_nplus1 @show Sn - @show Snplus1 end # In terms of values not reference, Snplus1 == Sn # First, we check the asynchronous transitions - #while first_round || length(edge_candidates) > 0 while true turns += 1 - #edge_candidates = empty!(edge_candidates) - current_loc = getfield(Snplus1, :loc) - edges_from_current_loc = getfield(A, :map_edges)[current_loc] + #edge_candidates = empty!(edge_candidates) + edges_from_current_loc = getfield(A, :map_edges)[ptr_current_loc[1]] # Save all edges that satisfies transition predicate (asynchronous ones) - nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), Sn, xn, p, true) #Snplus1=>Sn + nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), + current_time, current_values, 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) @@ -182,7 +182,7 @@ function next_state!(Snplus1::StateLHA, A::LHA, # Should be xn here #first_round = false if ind_edge > 0 - getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, xn, p) + getfield(edge_candidates[ind_edge], :update_state!)(ptr_current_loc, current_time, current_values, xn, p) else if verbose println("No edge fired") end break @@ -191,8 +191,12 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show turns @show edge_candidates @show ind_edge, detected_event, nbr_candidates - println("After update") - @show Snplus1 + @show ptr_current_loc[1] + @show current_time + @show current_values + if turns == 500 + @warn "We've reached 500 turns" + end end # For debug #= @@ -203,45 +207,40 @@ 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, xn, p) + @show getfield(edge, :check_constraints)(time_S, values_S, xn, p) end error("Unpredicted behavior automaton") end =# end if verbose - @show Snplus1 println("Time flies with the flow...") end # Now time flies according to the flow - values_Snplus1 = getfield(Snplus1, :values) - time_Snplus1 = getfield(Snplus1, :time) - current_loc = getfield(Snplus1, :loc) - for i in eachindex(values_Snplus1) - @inbounds coeff_deriv = (getfield(A, :flow)[current_loc])[i] + for i in eachindex(current_values) + @inbounds coeff_deriv = (getfield(A, :flow)[ptr_current_loc[1]])[i] if coeff_deriv > 0 - @inbounds values_Snplus1[i] += coeff_deriv*(tnplus1 - time_Snplus1) + @inbounds current_values[i] += coeff_deriv*(tnplus1 - current_time) end end - setfield!(Snplus1, :time, tnplus1) + current_time = tnplus1 if verbose - @show Snplus1 + @show ptr_current_loc[1] + @show current_time + @show current_values end # Now firing an edge according to the event - #first_round = true - #while first_round || length(edge_candidates) > 0 while true turns += 1 - current_loc = getfield(Snplus1, :loc) - edges_from_current_loc = getfield(A, :map_edges)[current_loc] + edges_from_current_loc = getfield(A, :map_edges)[ptr_current_loc[1]] # Save all edges that satisfies transition predicate (synchronous ones) - nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), Snplus1, xnplus1, p, false) + nbr_candidates = _find_edge_candidates!(edge_candidates, edges_from_current_loc, getfield(A, :Λ), + current_time, current_values, 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) - #first_round = false if ind_edge > 0 - getfield(edge_candidates[ind_edge], :update_state!)(Snplus1, xnplus1, p) + getfield(edge_candidates[ind_edge], :update_state!)(ptr_current_loc, current_time, current_values, xnplus1, p) end if ind_edge == 0 || detected_event if verbose @@ -250,9 +249,10 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show turns @show edge_candidates @show ind_edge, detected_event, nbr_candidates - println("After update") @show detected_event - @show Snplus1 + @show ptr_current_loc[1] + @show current_time + @show current_values else println("No edge fired") end @@ -263,9 +263,13 @@ function next_state!(Snplus1::StateLHA, A::LHA, @show turns @show edge_candidates @show ind_edge, detected_event, nbr_candidates - println("After update") @show detected_event - @show Snplus1 + @show ptr_current_loc[1] + @show current_time + @show current_values + if turns == 500 + @warn "We've reached 500 turns" + end end # For debug #= @@ -276,13 +280,18 @@ 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, x, p) + @show getfield(edge, :check_constraints)(time_S, values_S, x, p) end error("Unpredicted behavior automaton") end =# end - if verbose println("##### End next_state!") end + setfield!(Snplus1, :loc, ptr_current_loc[1]) + setfield!(Snplus1, :time, current_time) + if verbose + @show Snplus1 + println("##### End next_state!") + end end # For tests purposes diff --git a/tests/automata/period_automaton_doping_single.jl b/tests/automata/period_automaton_doping_single.jl new file mode 100644 index 0000000000000000000000000000000000000000..9a4614026e7f11489ed82f8fcd750d6cbc591eab --- /dev/null +++ b/tests/automata/period_automaton_doping_single.jl @@ -0,0 +1,19 @@ + +using MarkovProcesses +load_plots() + +load_model("doping_3way_oscillator") +load_automaton("period_automaton") +set_time_bound!(doping_3way_oscillator, 0.5) +set_x0!(doping_3way_oscillator, [:A, :B, :C], fill(333, 3)) +set_x0!(doping_3way_oscillator, [:DA, :DB, :DC], fill(10, 3)) + +A_per = create_period_automaton(doping_3way_oscillator, 300.0, 360.0, 5, :A; ref_mean_tp = 0.01) +sync_doping = doping_3way_oscillator * A_per + +σ = simulate(sync_doping) + +test = (σ.state_lha_end[:n] == 5.0 && isapprox(σ.state_lha_end[:mean_tp], 0.01, atol = 0.011)) + +return test + diff --git a/tests/run_automata.jl b/tests/run_automata.jl index 0d029fd824aa30ef31729410e550174ab2aad006..bba5533b6e3ba2c78e707a829b330780a9d7e41a 100644 --- a/tests/run_automata.jl +++ b/tests/run_automata.jl @@ -6,6 +6,7 @@ using Test @test include("automata/accept_R5.jl") @test include("automata/euclidean_distance.jl") @test include("automata/euclidean_distance_single.jl") + @test include("automata/period_automaton_doping_single.jl") @test include("automata/read_trajectory_last_state_F.jl") @test include("automata/read_trajectory_last_state_G.jl") @test include("automata/sync_simulate_last_state_F.jl")