Newer
Older

Peter Jentsch
committed
function contact_weight(p, contact_time)
return 1 - (1-p)^contact_time
end

Peter Jentsch
committed
function Φ(payoff,β)
return 1 / (exp(-1*β*payoff))
end
Base.@propagate_inbounds @views function update_alert_durations!(t,modelsol)
#remove Base.@propagate_inbounds if you get segfaults

Peter Jentsch
committed
@unpack notification_parameter = modelsol.params

Peter Jentsch
committed
@unpack time_of_last_alert, app_user_index,inf_network,covid_alert_times,app_user = modelsol

Peter Jentsch
committed
for (i,node) in enumerate(modelsol.app_user_index), mixing_graph in inf_network.graph_list[t]

Peter Jentsch
committed
for j in 2:14

Peter Jentsch
committed
covid_alert_times[j-1,i] = covid_alert_times[j,i] #shift them all back

Peter Jentsch
committed
end
for j in neighbors(mixing_graph.g,node)

Peter Jentsch
committed
if app_user[j]

Peter Jentsch
committed
covid_alert_times[end,i] += get_weight(mixing_graph,GraphEdge(node,j)) #add the contact times for today to the back

Peter Jentsch
committed
end
end
covid_alert_total_exposures = 1 - (1 - notification_parameter) ^ sum(covid_alert_times[:,i])
if rand(RNG) < covid_alert_total_exposures

Peter Jentsch
committed
time_of_last_alert[i] = t
end
end
end

Peter Jentsch
committed
Base.@propagate_inbounds @views function update_infection_state!(t,modelsol)
#remove Base.@propagate_inbounds if you get segfaults

Peter Jentsch
committed
@unpack base_transmission_probability,immunization_loss_prob,recovery_rate = modelsol.params

Peter Jentsch
committed
@unpack u_inf,u_vac,u_next_inf,u_next_vac,demographics,inf_network,status_totals = modelsol

Peter Jentsch
committed
function agent_transition!(node, from::AgentStatus,to::AgentStatus)

Peter Jentsch
committed
status_totals[Int(from)] -= 1
status_totals[Int(to)] += 1

Peter Jentsch
committed
u_next_inf[node] = to
end

Peter Jentsch
committed

Peter Jentsch
committed
u_next_inf .= u_inf

Peter Jentsch
committed
for i in 1:modelsol.nodes
agent_status = u_inf[i]
is_vaccinator = u_vac[i]
agent_demo = demographics[i]
if agent_status == Susceptible
if is_vaccinator

Peter Jentsch
committed
agent_transition!(i, Susceptible,Immunized)

Peter Jentsch
committed
else

Peter Jentsch
committed
for mixing_graph in inf_network.graph_list[t]

Peter Jentsch
committed
for j in neighbors(mixing_graph.g,i)

Peter Jentsch
committed
if u_inf[j] == Infected && u_next_inf[i] != Infected

Peter Jentsch
committed
if rand(RNG) < contact_weight(base_transmission_probability,get_weight(mixing_graph,GraphEdge(i,j)))

Peter Jentsch
committed
agent_transition!(i, Susceptible,Infected)
end

Peter Jentsch
committed
end
end
end
end
elseif agent_status == Infected
if rand(RNG) < recovery_rate

Peter Jentsch
committed
agent_transition!(i, Infected,Recovered)

Peter Jentsch
committed
end
elseif agent_status == Immunized
if rand(RNG) < immunization_loss_prob

Peter Jentsch
committed
agent_transition!(i, Immunized,Susceptible)

Peter Jentsch
committed
end
end
end

Peter Jentsch
committed
end
Base.@propagate_inbounds @views function update_vaccination_opinion_state!(t,modelsol,total_infections)
#remove Base.@propagate_inbounds if you get segfaults

Peter Jentsch
committed
@unpack π_base, η,γ, κ, ω, ρ, ω_en,ρ_en,γ,β = modelsol.params

Peter Jentsch
committed
@unpack demographics,time_of_last_alert, nodes, soc_network,u_vac,u_next_vac,app_user,app_user_list = modelsol

Peter Jentsch
committed
app_user_pointer = 0

Peter Jentsch
committed

Peter Jentsch
committed
for i in 1:nodes
vac_payoff = 0
soc_nbrs_vac = @MArray [0,0,0]

Peter Jentsch
committed
soc_nbrs_nonvac = 0
num_soc_nbrs = 0

Peter Jentsch
committed
for sc_g in soc_network.graph_list[t]
soc_nbrs = neighbors(sc_g.g,i)

Peter Jentsch
committed
num_soc_nbrs += length(soc_nbrs)
for nbr in soc_nbrs
if u_vac[nbr]
soc_nbrs_vac[Int(demographics[nbr])] += 1
else
soc_nbrs_nonvac += 1
end
end
end

Peter Jentsch
committed
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)

Peter Jentsch
committed
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)
end

Peter Jentsch
committed

Peter Jentsch
committed
if u_vac[i]
if rand(RNG) < 1 - Φ(vac_payoff,β)

Peter Jentsch
committed
u_next_vac[i] = !u_vac[i]

Peter Jentsch
committed
else
u_next_vac[i] = u_vac[i]

Peter Jentsch
committed
end
else
if rand(RNG) < Φ(vac_payoff,β)

Peter Jentsch
committed
u_next_vac[i] = !u_vac[i]

Peter Jentsch
committed
else
u_next_vac[i] = u_vac[i]

Peter Jentsch
committed
end
end
end
end
function agents_step!(t,modelsol)

Peter Jentsch
committed
remake!(modelsol.inf_network,modelsol.index_vectors,modelsol.ws_matrix_tuple.daily)
remake!(modelsol.soc_network,modelsol.index_vectors,modelsol.rest_matrix_tuple.daily)

Peter Jentsch
committed
for network in modelsol.inf_network.graph_list[t]
sample_mixing_graph!(network) #get new contact weights

Peter Jentsch
committed
end

Peter Jentsch
committed

Peter Jentsch
committed
update_alert_durations!(t,modelsol)

Peter Jentsch
committed
update_vaccination_opinion_state!(t,modelsol,modelsol.status_totals[Int(Infected)])

Peter Jentsch
committed
update_infection_state!(t,modelsol)

Peter Jentsch
committed

Peter Jentsch
committed
modelsol.u_vac .= modelsol.u_next_vac
modelsol.u_inf .= modelsol.u_next_inf
end

Peter Jentsch
committed
function solve!(modelsol,recordings...)

Peter Jentsch
committed
for t in 1:modelsol.sim_length
#advance agent states based on the new network

Peter Jentsch
committed
for recording in recordings
record!(t,modelsol,recording)
end

Peter Jentsch
committed
agents_step!(t,modelsol)