Commit 44feda9e authored by Bentriou Mahmoud's avatar Bentriou Mahmoud
Browse files

Forgot the file core/utils.jl in previous commit

Add of several useful functions for access values of model, lha and
trajectory objects.
parent 0a2d2796
......@@ -22,14 +22,18 @@ export load_automaton, get_index, get_value, length_var
# Model related methods
export simulate, set_param!, get_param, set_observed_var!
export is_bounded
export is_bounded, check_consistency
export load_model, get_module_path
# Utils
export get_module_path
include("common.jl")
include("trajectory.jl")
include("lha.jl")
include("model.jl")
include("utils.jl")
end
......@@ -88,4 +88,6 @@ end
LHA(A::LHA, map_var::Dict{String,Int}) = LHA(A.l_transitions, A.l_loc, A.Λ,
A.l_loc_init, A.l_loc_final, A.map_var_automaton_idx, A.l_flow,
A.map_edges, A.l_ctes, map_var)
Base.:*(m::ContinuousTimeModel, A::LHA) = SynchronizedModel(m, A)
Base.:*(A::LHA, m::ContinuousTimeModel) = SynchronizedModel(m, A)
......@@ -19,6 +19,8 @@ function Base.show(io::IO, S::StateLHA)
end
end
isaccepted(S::StateLHA) = S.loc in (S.A).l_loc_final
# Methods for synchronize / read the trajectory
function init_state(A::LHA, x0::SubArray{Int,1}, t0::Float64)
S0 = StateLHA(A, "", zeros(length_var(A)), t0)
......
load_model(name_model::String) = include(get_module_path() * "/models/" * name_model * ".jl")
# Simulation
function simulate(m::ContinuousTimeModel)
# trajectory fields
......@@ -120,14 +122,18 @@ function set_observed_var!(m::Model,g::Vector{String})
m._map_obs_var_idx = _map_obs_var_idx
end
is_bounded(m::Model) = m.time_bound < Inf
function check_consistency(m::Model) end
function simulate(m::Model, n::Int; bound::Float64 = Inf)::AbstractObservations end
function set_param!(m::Model, p::Vector{Float64})::Nothing end
function get_param(m::Model)::Vector{Float64} end
get_module_path() = dirname(dirname(pathof(@__MODULE__)))
function load_model(name_model::String)
include(get_module_path() * "/models/" * name_model * ".jl")
is_bounded(m::ContinuousTimeModel) = m.time_bound < Inf
function check_consistency(m::ContinuousTimeModel)
@assert m.d == length(m.map_var_idx)
@assert m.k == length(m.map_param_idx)
@assert m.k == length(m.p)
@assert length(m.g) <= m.d
@assert length(m._g_idx) == length(m.g)
@assert m.buffer_size >= 0
@assert typeof(m.is_absorbing(m.p, view(reshape(m.x0, 1, m.d), 1, :))) == Bool
return true
end
set_param!(m::ContinuousTimeModel, p::Vector{Float64}) = (m.p = p)
set_param!(m::ContinuousTimeModel, name_p::String, p_i::Float64) = (m.p[m.map_param_idx[name_p]] = p_i)
get_param(m::ContinuousTimeModel) = m.p
get_module_path() = dirname(dirname(pathof(@__MODULE__)))
......@@ -5,10 +5,10 @@ d=4
k=3
dict_var = Dict("E" => 1, "S" => 2, "ES" => 3, "P" => 4)
dict_p = Dict("k1" => 1, "k2" => 2, "k3" => 3)
l_tr = ["R1","R2","R3"]
p = [1.0, 1.0, 1.0]
x0 = [100, 100, 0, 0]
t0 = 0.0
l_tr_ER = ["R1","R2","R3"]
p_ER = [1.0, 1.0, 1.0]
x0_ER = [100, 100, 0, 0]
t0_ER = 0.0
function ER_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String}, idx::Int,
xn::SubArray{Int,1}, tn::Float64, p::Vector{Float64})
a1 = p[1] * xn[1] * xn[2]
......@@ -43,8 +43,8 @@ function ER_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String}, i
end
is_absorbing_ER(p::Vector{Float64},xn::SubArray{Int,1}) =
(p[1]*xn[1]*xn[2] + (p[2]+p[3])*xn[3]) === 0.0
g = ["P"]
g_ER = ["P"]
ER = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,ER_f!,is_absorbing_ER; g=g)
ER = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_ER,p_ER,x0_ER,t0_ER,ER_f!,is_absorbing_ER; g=g_ER)
export ER
......@@ -5,10 +5,10 @@ d=3
k=2
dict_var = Dict("S" => 1, "I" => 2, "R" => 3)
dict_p = Dict("ki" => 1, "kr" => 2)
l_tr = ["R1","R2"]
p = [0.0012, 0.05]
x0 = [95, 5, 0]
t0 = 0.0
l_tr_SIR = ["R1","R2"]
p_SIR = [0.0012, 0.05]
x0_SIR = [95, 5, 0]
t0_SIR = 0.0
function SIR_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String}, idx::Int,
xn::SubArray{Int,1}, tn::Float64, p::Vector{Float64})
a1 = p[1] * xn[1] * xn[2]
......@@ -42,8 +42,8 @@ function SIR_f!(mat_x::Matrix{Int}, l_t::Vector{Float64}, l_tr::Vector{String},
l_tr[idx] = "R$(reaction)"
end
is_absorbing_SIR(p::Vector{Float64}, xn::SubArray{Int,1}) = (p[1]*xn[1]*xn[2] + p[2]*xn[2]) === 0.0
g = ["I"]
g_SIR = ["I"]
SIR = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr,p,x0,t0,SIR_f!,is_absorbing_SIR; g=g)
SIR = ContinuousTimeModel(d,k,dict_var,dict_p,l_tr_SIR,p_SIR,x0_SIR,t0_SIR,SIR_f!,is_absorbing_SIR; g=g_SIR)
export SIR
......@@ -11,7 +11,7 @@ A_F = create_automaton_F(SIR, x1, x2, t1, t2, "I") # <: LHA
function test_last_state(A::LHA, m::ContinuousTimeModel)
σ = simulate(m)
Send = read_trajectory(A, σ)
test = (get_state_from_time(σ, Send.time)[1] == Send["n"]) & (Send["d"] == 0)
test = (get_state_from_time(σ, Send.time)[1] == Send["n"]) && (Send["d"] == 0)
#=
if !test
@show Send
......@@ -25,7 +25,7 @@ test_all = true
nbr_sim = 10000
for i = 1:nbr_sim
test = test_last_state(A_F, SIR)
global test_all = test_all & test
global test_all = test_all && test
end
return test_all
......
......@@ -17,5 +17,8 @@ using Test
@test include("unit/dist_lp.jl")
@test include("unit/l_dist_lp.jl")
@test include("unit/check_trajectory_consistency.jl")
@test include("unit/check_model_consistency.jl")
@test include("unit/set_param.jl")
@test include("unit/side_effects_1.jl")
end
using MarkovProcesses
load_model("SIR")
load_model("ER")
return check_consistency(ER) && check_consistency(SIR)
using MarkovProcesses
load_model("SIR") # p = 0.0012, 0.05
load_model("ER") # p = 1; 1; 1
test_all = true
new_param_ER = [1.0, 2.0, 1.5]
set_param!(ER, new_param_ER)
test_all = test_all && (ER.p == new_param_ER)
k2 = 4.0
set_param!(ER, "k2", k2)
test_all = test_all && (ER.p == [1.0, 4.0, 1.5])
k1 = 0.5
set_param!(ER, "k1", k1)
test_all = test_all && (ER.p == [0.5, 4.0, 1.5])
k3 = 10.0
set_param!(ER, "k3", 10.0)
test_all = test_all && (ER.p == [0.5, 4.0, 10.0])
new_param_SIR = [0.0013, 0.08]
set_param!(SIR, new_param_SIR)
test_all = test_all && (SIR.p == new_param_SIR)
kr = 0.06
set_param!(SIR, "kr", kr)
test_all = test_all && (SIR.p == [0.0013, 0.06])
ki = 0.011
set_param!(SIR, "ki", ki)
test_all = test_all && (SIR.p == [0.011, 0.06])
return test_all
using MarkovProcesses
load_model("SIR")
load_model("ER")
test = SIR.map_var_idx !== ER.map_var_idx &&
SIR.map_param_idx !== ER.map_var_idx &&
SIR.l_transitions !== ER.l_transitions &&
SIR.g !== ER.g &&
SIR._g_idx !== ER._g_idx &&
SIR.f! != ER.f! &&
SIR.is_absorbing != ER.is_absorbing
return test
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment