Skip to content
Snippets Groups Projects
Commit b5ee11d8 authored by Peter Jentsch's avatar Peter Jentsch
Browse files

new vaccination mechanics

parent f3aeb2ae
No related branches found
No related tags found
No related merge requests found
...@@ -5,19 +5,21 @@ const samples = 1 ...@@ -5,19 +5,21 @@ const samples = 1
const parameters = ( const parameters = (
sim_length = 600, sim_length = 600,
num_households = 5000, num_households = 5000,
I_0_fraction = 0.002, I_0_fraction = 0.0,
base_transmission_probability = 0.001, base_transmission_probability = 0.001,
recovery_rate = 1/7, recovery_rate = 1/7,
immunization_loss_prob = 0.0055, #mean time of 6 months immunization_loss_prob = 0.0055, #mean time of 6 months
π_base = -0.3, π_base = -1.0,
η = 0.0, η = 0.0,
κ = 0.8, κ = 0.0,
ω = 0.00005, ω = 0.00005,
ρ = [0.0,0.0,0.0], ρ_y = 0.0,
ρ_m = 0.0,
ρ_o = 0.0,
ω_en = 0.00, ω_en = 0.00,
ρ_en = [0.0,0.0,0.0], ρ_en = [0.0,0.0,0.0],
γ = 0.0, γ = 0.0,
β = 10.0, β = 5.0,
notification_parameter = 0.001, notification_parameter = 0.001,
vaccinator_prob = 0.2, vaccinator_prob = 0.2,
app_user_fraction = 0.2, app_user_fraction = 0.2,
......
...@@ -89,95 +89,94 @@ Base.@propagate_inbounds @views function update_infection_state!(t,modelsol) ...@@ -89,95 +89,94 @@ Base.@propagate_inbounds @views function update_infection_state!(t,modelsol)
end end
end end
end end
Base.@propagate_inbounds @views function update_vaccination_opinion_state!(t,modelsol,total_infections) # Base.@propagate_inbounds @views function update_vaccination_opinion_state!(t,modelsol,total_infections)
@unpack π_base, η,γ, κ, ω, ρ_y,ρ_m,ρ_o, ω_en,ρ_en,γ,β = modelsol.params # @unpack π_base, η,γ, κ, ω, ρ_y,ρ_m,ρ_o, ω_en,ρ_en,γ,β = modelsol.params
@unpack demographics,time_of_last_alert, nodes, soc_network,u_vac,u_next_vac,app_user,app_user_list = modelsol # @unpack demographics,time_of_last_alert, nodes, soc_network,u_vac,u_next_vac,app_user,app_user_list = modelsol
app_user_pointer = 0 # app_user_pointer = 0
for i in 1:nodes # for i in 1:nodes
vac_payoff = 0 # vac_payoff = 0
soc_nbrs_vac = @MArray [0,0,0] # soc_nbrs_vac = @MArray [0,0,0]
soc_nbrs_nonvac = 0 # soc_nbrs_nonvac = 0
num_soc_nbrs = 0 # num_soc_nbrs = 0
for sc_g in soc_network.graph_list[t] # for sc_g in soc_network.graph_list[t]
soc_nbrs = neighbors(sc_g.g,i) # soc_nbrs = neighbors(sc_g.g,i)
num_soc_nbrs += length(soc_nbrs) # num_soc_nbrs += length(soc_nbrs)
for nbr in soc_nbrs # for nbr in soc_nbrs
if u_vac[nbr] # if u_vac[nbr]
soc_nbrs_vac[Int(demographics[nbr])] += 1 # soc_nbrs_vac[Int(demographics[nbr])] += 1
else # else
soc_nbrs_nonvac += 1 # soc_nbrs_nonvac += 1
end # end
end # end
end # end
ρ = @SVector [ρ_y,ρ_m,ρ_o] # ρ = @SVector [ρ_y,ρ_m,ρ_o]
vac_payoff += π_base + dot(ρ,soc_nbrs_vac) + total_infections*ω + # vac_payoff += π_base + dot(ρ,soc_nbrs_vac) + total_infections*ω +
ifelse(num_soc_nbrs> 0, κ * ((sum(soc_nbrs_vac) - soc_nbrs_nonvac)/num_soc_nbrs),0) # ifelse(num_soc_nbrs> 0, κ * ((sum(soc_nbrs_vac) - soc_nbrs_nonvac)/num_soc_nbrs),0)
if app_user[i] && time_of_last_alert[app_user_list[i]]>=0 # if app_user[i] && time_of_last_alert[app_user_list[i]]>=0
vac_payoff += γ^(-1*(t - time_of_last_alert[app_user_list[i]]))* (η + dot(ρ_en,soc_nbrs_vac) + total_infections*ω_en) # vac_payoff += γ^(-1*(t - time_of_last_alert[app_user_list[i]]))* (η + dot(ρ_en,soc_nbrs_vac) + total_infections*ω_en)
end # end
if u_vac[i] # if u_vac[i]
if rand(Random.default_rng(Threads.threadid())) < 1 - Φ(vac_payoff,β) # if rand(Random.default_rng(Threads.threadid())) < 1 - Φ(vac_payoff,β)
u_next_vac[i] = !u_vac[i] # u_next_vac[i] = !u_vac[i]
else # else
u_next_vac[i] = u_vac[i] # u_next_vac[i] = u_vac[i]
end # end
else # else
if rand(Random.default_rng(Threads.threadid())) < Φ(vac_payoff,β) # if rand(Random.default_rng(Threads.threadid())) < Φ(vac_payoff,β)
u_next_vac[i] = !u_vac[i] # u_next_vac[i] = !u_vac[i]
else # else
u_next_vac[i] = u_vac[i] # u_next_vac[i] = u_vac[i]
end # end
end # end
end # end
# modelsol.daily_vaccinators = count(==(true),u_vac) #could maybe make this more efficient
# end
modelsol.daily_vaccinators = count(==(true),u_vac) #could maybe make this more efficient
end
Base.@propagate_inbounds @views function update_vaccination_opinion_state!(t,modelsol,total_infections)
Base.@propagate_inbounds @views function update_vaccination_opinion_state_2!(t,modelsol,total_infections)
@unpack π_base, η,γ, κ, ω, ρ_y,ρ_m,ρ_o, ω_en,ρ_en,γ,β = modelsol.params @unpack π_base, η,γ, κ, ω, ρ_y,ρ_m,ρ_o, ω_en,ρ_en,γ,β = modelsol.params
@unpack demographics,time_of_last_alert, nodes, soc_network,u_vac,u_next_vac,app_user,app_user_list = modelsol @unpack demographics,time_of_last_alert, nodes, soc_network,u_vac,u_next_vac,app_user,app_user_list = modelsol
app_user_pointer = 0 app_user_pointer = 0
for i in 1:nodes for i in 1:nodes
vac_payoff = 0 vac_payoff = 0
soc_nbrs = @MArray [0,0,0] soc_nbrs_count = @MArray [0,0,0]
num_soc_nbrs = 0 num_soc_nbrs = 0
for sc_g in soc_network.graph_list[t] for sc_g in soc_network.graph_list[t]
soc_nbrs = neighbors(sc_g.g,i) soc_nbrs = neighbors(sc_g.g,i)
num_soc_nbrs += length(soc_nbrs) num_soc_nbrs += length(soc_nbrs)
for nbr in soc_nbrs for nbr in soc_nbrs
soc_nbrs[Int(demographics[nbr])] += 1 soc_nbrs_count[Int(demographics[nbr])] += 1
end end
end end
ρ = @SVector [ρ_y,ρ_m,ρ_o] ρ = @SVector [ρ_y,ρ_m,ρ_o]
# random_neighbour = random_soc_network = sample(Random.default_rng(Threads.threadid()), soc_network.graph_list[t])
# display(random_soc_network)
if !isempty(neighbors(random_soc_network.g,i))
random_neighbour = sample(Random.default_rng(Threads.threadid()), neighbors(random_soc_network.g,i))
if u_vac[random_neighbour] == u_vac[i]
vac_payoff += π_base + dot(ρ,soc_nbrs_count) + total_infections*ω
if app_user[i] && time_of_last_alert[app_user_list[i]]>=0
vac_payoff += γ^(-1*(t - time_of_last_alert[app_user_list[i]]))* (η + dot(ρ_en,soc_nbrs_count) + total_infections*ω_en)
end
vac_payoff += π_base + dot(ρ,soc_nbrs_vac) + total_infections*ω + if u_vac[i]
ifelse(num_soc_nbrs> 0, κ * ((sum(soc_nbrs_vac) - soc_nbrs_nonvac)/num_soc_nbrs),0) if rand(Random.default_rng(Threads.threadid())) < 1 - Φ(vac_payoff,β)
u_next_vac[i] = false
if app_user[i] && time_of_last_alert[app_user_list[i]]>=0 end
vac_payoff += γ^(-1*(t - time_of_last_alert[app_user_list[i]]))* (η + dot(ρ_en,soc_nbrs_vac) + total_infections*ω_en) else
end if rand(Random.default_rng(Threads.threadid())) < Φ(vac_payoff,β)
u_next_vac[i] = true
if u_vac[i] end
if rand(Random.default_rng(Threads.threadid())) < 1 - Φ(vac_payoff,β) end
u_next_vac[i] = !u_vac[i]
else
u_next_vac[i] = u_vac[i]
end
else
if rand(Random.default_rng(Threads.threadid())) < Φ(vac_payoff,β)
u_next_vac[i] = !u_vac[i]
else
u_next_vac[i] = u_vac[i]
end end
end end
end end
modelsol.daily_vaccinators = count(==(true),u_vac) #could maybe make this more efficient modelsol.daily_vaccinators = count(==(true),u_vac) #could maybe make this more efficient
end end
......
...@@ -175,10 +175,10 @@ function filter_priors(location_key) ...@@ -175,10 +175,10 @@ function filter_priors(location_key)
end end
priors_dict = filter(row-> row["location"] == location_key, eachrow(priors)) |> priors_dict = filter(row-> row["location"] == location_key, eachrow(priors)) |>
df -> map(r -> (r[:index_out],r[:index_in]) => convert(Vector,r[string.(distribution_support)]),df) |> #this is pretty inflexible to changing support unfortunately df -> map(r -> (r[:index_out],r[:index_in]) =>Vector{Float64}(r[string.(distribution_support)]),df) |> #this is pretty inflexible to changing support unfortunately
Dict Dict
# display(priors_dict) display(priors_dict)
priors_probs = Dict(map(v -> v => DiscreteNonParametric(distribution_support,priors_dict[v]), collect(keys(priors_dict)))) priors_probs = Dict(map(v -> v => DiscreteNonParametric(distribution_support,priors_dict[v]), collect(keys(priors_dict))))
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment