From cd6462b39ad6da1e4c6fd302188b041599929da2 Mon Sep 17 00:00:00 2001
From: pjentsch <pjentsch@uwaterloo.ca>
Date: Sat, 20 Feb 2021 01:29:49 -0500
Subject: [PATCH] removed LTC/HCW stuff, contact generation needs fixing, use
 bytearrays instead of bitarrays for weights

---
 .../src/CovidAlertVaccinationModel.jl         |  8 +++--
 CovidAlertVaccinationModel/src/agents.jl      | 16 +++------
 CovidAlertVaccinationModel/src/graphs.jl      | 35 ++++---------------
 .../src/mixing_distributions.jl               | 20 +++++------
 CovidAlertVaccinationModel/test/runtests.jl   |  4 +--
 5 files changed, 28 insertions(+), 55 deletions(-)

diff --git a/CovidAlertVaccinationModel/src/CovidAlertVaccinationModel.jl b/CovidAlertVaccinationModel/src/CovidAlertVaccinationModel.jl
index c9b198f..ca0f71b 100644
--- a/CovidAlertVaccinationModel/src/CovidAlertVaccinationModel.jl
+++ b/CovidAlertVaccinationModel/src/CovidAlertVaccinationModel.jl
@@ -41,11 +41,15 @@ default(dpi = 300)
 default(framestyle = :box)
 using BenchmarkTools
 function main()
-    agent_model = AgentModel(5000,5)
     # display(size.(agent_model.demographic_index_vectors))
+
+    agent_model = AgentModel(5000)
     u_0 = get_u_0(length(agent_model.demographics))
     steps = 300
-    # Random.seed!(RNG,1)
+    Random.seed!(RNG,1)
+
+    @btime solve!($u_0,$get_parameters(),$steps,$agent_model,$vaccinate_uniformly!);    
+    # agent_model = AgentModel(10_000)
     @btime solve!($u_0,$get_parameters(),$steps,$agent_model,$vaccinate_uniformly!);
     # sol,graphs = solve!(u_0,get_parameters(),steps,agent_model,vaccinate_uniformly!);
     # return aggregate_timeseries(sol)
diff --git a/CovidAlertVaccinationModel/src/agents.jl b/CovidAlertVaccinationModel/src/agents.jl
index 1632925..09dc805 100644
--- a/CovidAlertVaccinationModel/src/agents.jl
+++ b/CovidAlertVaccinationModel/src/agents.jl
@@ -1,11 +1,8 @@
-#Agent type definitions
-
+#agent type definitions
 @enum AgentDemographic begin
     Young = 1
     Adult
     Elderly
-    AdultHCW
-    ElderlyLTC
 end
 @enum AgentStatus begin
     Susceptible = 1
@@ -22,8 +19,8 @@ struct AgentModel{GraphType,DistMatrixList1,DistMatrixList2,DistMatrixList3}
     workschool_contacts_mean_adjusted_list::DistMatrixList1
     rest_contacts_mean_adjusted_list::DistMatrixList2
     home_contacts_duration_list::DistMatrixList3
-    function AgentModel(num_households,num_ltc)
-        pop_list,base_network,index_vectors = generate_population(num_households,num_ltc)
+    function AgentModel(num_households)
+        pop_list,base_network,index_vectors = generate_population(num_households)
         pop_sizes = length.(index_vectors)
 
         workschool_contacts_mean_adjusted_list = [symmetrize_means(pop_sizes,initial_workschool_mixing_matrix)]
@@ -65,6 +62,8 @@ function Base.show(io::IO, status::AgentStatus)
         print(io, "I")
     elseif status == Recovered
         print(io, "R")
+    elseif status == Immunized
+        print(io, "Vac")
     end
 end
 
@@ -73,12 +72,7 @@ function Base.show(io::IO, status::AgentDemographic)
         print(io, "<20")
     elseif status == Adult
         print(io, "20-60")
-    elseif status == AdultHCW
-        print(io, "20-60 HCW")
     elseif status == Elderly
         print(io, ">60")
-    elseif status == ElderlyLTC
-        print(io, ">60 LTC")
     end
 end 
-
diff --git a/CovidAlertVaccinationModel/src/graphs.jl b/CovidAlertVaccinationModel/src/graphs.jl
index df195d6..e7b95cd 100644
--- a/CovidAlertVaccinationModel/src/graphs.jl
+++ b/CovidAlertVaccinationModel/src/graphs.jl
@@ -86,7 +86,7 @@ function generate_contact_vectors!(ij_dist,ji_dist,i_to_j_contacts, j_to_i_conta
 end
 #add a bipartite graph derived from mixing matrices onto g
 function generate_mixing_graph!(g,index_vectors,contacts)
-    for i in 1:5, j in 1:5  
+    for i in 1:length(index_vectors), j in 1:length(index_vectors)  
         random_bipartite_graph_fast_CL!(g,index_vectors[i],index_vectors[j],contacts.contact_array[i,j],contacts.contact_array[j,i])
     end
     return g
@@ -109,7 +109,7 @@ function random_bipartite_graph_fast_CL!(g::SimpleGraph,anodes,bnodes,aseq,bseq)
     return g
 end
 
-#same algorithm but with a bitarray
+#same algorithm but with a bitarray, this cannot produce parallel edges
 function random_bipartite_graph_fast_CL!(g::T,anodes,bnodes,aseq,bseq) where T<:AbstractArray 
     lena = length(aseq)
     lenb = length(bseq)
@@ -124,41 +124,18 @@ function random_bipartite_graph_fast_CL!(g::T,anodes,bnodes,aseq,bseq) where T<:
 end
 
 #generate population with households distributed according to household_size_distribution
-#Assume 5% of elderly are in LTC roughly, these are divide evenly among a specific number of LTC ltc_homes
-#LTC homes and households are assumed to be complete static graphs.
-function generate_population(num_households,num_LTC)
-    # LTC_sizes = rand(LTC_distribution,num_LTC)
-    prob_adult_is_HCW = 0.01#assume 1% of adults are HCW
-    prob_elderly_in_LTC = 0.05 #5% of elderly are in LTC
-
+function generate_population(num_households)
     households_composition = sample_household_data(num_households)
     households = map( l -> [fill(AgentDemographic(i),n) for (i,n) in enumerate(l)],households_composition) |>
                     l -> reduce(vcat,l) |>
                     l -> reduce(vcat,l)
 
     total_household_pop = sum(sum.(households_composition))
-    ltc_pop = Int(div(total_household_pop,(1 - prob_elderly_in_LTC))) - total_household_pop
-    hcw_pop = Int(ceil(prob_adult_is_HCW*total_household_pop))
-    ltc_pop_list = fill(ElderlyLTC,ltc_pop)
-
-    adults_indices = findall(x -> x == Adult, households)
-    households[sample(RNG,adults_indices,hcw_pop)] .= AdultHCW
-
-    ltc_home_size = Int(ceil(ltc_pop/num_LTC))
-    @assert ltc_home_size != 0 error("must have at least one LTC resident,make problem larger")
-    if ltc_home_size != 0
-        ltc_homes = [ltc_pop_list[i:min(i + ltc_home_size - 1,ltc_pop)] for i = 1:ltc_home_size:ltc_pop]
-    else 
-        ltc_homes = Vector{Vector{AgentDemographic}}()
-    end
-    ltc_networks = map(LightGraphs.complete_graph,length.(ltc_homes))
     household_networks = map(LightGraphs.complete_graph, sum.(households_composition))
 
-    population_list = vcat(reduce(vcat,households), reduce(vcat,ltc_homes))
-    network = blockdiag(reduce(blockdiag,household_networks; init = SimpleGraph()), reduce(blockdiag,ltc_networks; init = SimpleGraph()))
-
-    index_vectors = [findall(x -> x == AgentDemographic(i), population_list) for i in 1:AgentDemographic.size+1]
-
+    population_list = reduce(vcat,households)
+    network = reduce(blockdiag,household_networks; init = SimpleGraph())
+    index_vectors = [findall(x -> x == AgentDemographic(i), population_list) for i in 1:(AgentDemographic.size-1)]
     return (;
         population_list,
         network,
diff --git a/CovidAlertVaccinationModel/src/mixing_distributions.jl b/CovidAlertVaccinationModel/src/mixing_distributions.jl
index f3f8df6..8da1851 100644
--- a/CovidAlertVaccinationModel/src/mixing_distributions.jl
+++ b/CovidAlertVaccinationModel/src/mixing_distributions.jl
@@ -56,26 +56,24 @@ function from_mean(::Type{ZWDist{DistType,T}},α,μ) where {DistType <: Distribu
 end
 StatsBase.mean(d::ZWDist{Dist,T}) where {Dist,T} = (1 - d.α)*StatsBase.mean(d.base_dist)
 
+
 const initial_workschool_type = Union{ZWDist{Geometric{Float64},Discrete},ZWDist{Poisson{Float64},Discrete}}
 
 const initial_workschool_mixing_matrix = convert(Array{initial_workschool_type},map(t->from_mean(t...),[
-    (ZWDist{Geometric{Float64},Discrete}, 0.433835,4.104848) (ZWDist{Geometric{Float64},Discrete},0.406326,2.568782) (ZWDist{Poisson{Float64},Discrete},0.888015,0.017729) (ZWDist{Geometric{Float64},Discrete},0.406326,2.568782) (ZWDist{Poisson{Float64},Discrete},0.888015,0.017729)
-    (ZWDist{Geometric{Float64},Discrete}, 0.600966,0.975688) (ZWDist{Geometric{Float64},Discrete},0.4306,5.057572) (ZWDist{Poisson{Float64},Discrete}, 0.84513,0.021307) (ZWDist{Geometric{Float64},Discrete},0.4306,5.057572) (ZWDist{Poisson{Float64},Discrete}, 0.84513,0.021307)
-    (ZWDist{Poisson{Float64},Discrete},0.887392,0.001937)   (ZWDist{Poisson{Float64},Discrete},0.793004,0.00722)   (ZWDist{Poisson{Float64},Discrete},0.940473, 0.022134) (ZWDist{Poisson{Float64},Discrete},0.793004,0.00722)   (ZWDist{Poisson{Float64},Discrete},0.940473, 0.022134)
-    (ZWDist{Geometric{Float64},Discrete}, 0.600966,0.975688) (ZWDist{Geometric{Float64},Discrete},0.4306,5.057572) (ZWDist{Poisson{Float64},Discrete}, 0.84513,0.021307) (ZWDist{Geometric{Float64},Discrete},0.4306,5.057572) (ZWDist{Poisson{Float64},Discrete}, 0.84513,0.021307)
-    (ZWDist{Poisson{Float64},Discrete},0.887392,0.001937)   (ZWDist{Poisson{Float64},Discrete},0.793004,0.00722)   (ZWDist{Poisson{Float64},Discrete},0.940473, 0.022134) (ZWDist{Poisson{Float64},Discrete},0.793004,0.00722)   (ZWDist{Poisson{Float64},Discrete},0.940473, 0.022134)
+    (ZWDist{Geometric{Float64},Discrete}, 0.433835,4.104848) (ZWDist{Geometric{Float64},Discrete},0.406326,2.568782) (ZWDist{Poisson{Float64},Discrete},0.888015,0.017729)
+    (ZWDist{Geometric{Float64},Discrete}, 0.600966,0.975688) (ZWDist{Geometric{Float64},Discrete},0.4306,5.057572) (ZWDist{Poisson{Float64},Discrete}, 0.84513,0.021307)
+    (ZWDist{Poisson{Float64},Discrete},0.887392,0.001937)   (ZWDist{Poisson{Float64},Discrete},0.793004,0.00722)   (ZWDist{Poisson{Float64},Discrete},0.940473, 0.022134) 
 ]))
 
 
 const initial_rest_type = Union{Geometric{Float64},Poisson{Float64}}
 const initial_rest_mixing_matrix =  convert(Array{initial_rest_type},map(t->from_mean(t...),[
-    (Geometric{Float64},2.728177)  (Geometric{Float64},1.382557)        (Poisson{Float64},0.206362)    (Geometric{Float64},1.382557)        (Poisson{Float64},0.206362) 
-    (Poisson{Float64},1.139072)    (Geometric{Float64},3.245594)        (Poisson{Float64},0.785297)    (Geometric{Float64},3.245594)        (Poisson{Float64},0.785297)   
-    (Poisson{Float64},0.264822)    (Poisson{Float64},0.734856)          (Poisson{Float64},0.667099)    (Poisson{Float64},0.734856)          (Poisson{Float64},0.667099)  
-    (Poisson{Float64},1.139072)    (Geometric{Float64},3.245594)        (Poisson{Float64},0.785297)    (Geometric{Float64},3.245594)        (Poisson{Float64},0.785297)   
-    (Poisson{Float64},0.264822)    (Poisson{Float64},0.734856)          (Poisson{Float64},0.667099)    (Poisson{Float64},0.734856)          (Poisson{Float64},0.667099)  
+    (Geometric{Float64},2.728177)  (Geometric{Float64},1.382557)        (Poisson{Float64},0.206362) 
+    (Poisson{Float64},1.139072)    (Geometric{Float64},3.245594)        (Poisson{Float64},0.785297)   
+    (Poisson{Float64},0.264822)    (Poisson{Float64},0.734856)          (Poisson{Float64},0.667099) 
 ]))
 
-const contact_time_distribution_matrix = convert(Array{initial_rest_type},[Geometric() for i in 1:AgentDemographic.size + 1, j in 1:AgentDemographic.size + 1])
+const contact_time_distribution_matrix = convert(Array{initial_rest_type},[Geometric() for i in 1:(AgentDemographic.size-1), j in 1:(AgentDemographic.size-1)])
+
 
 
diff --git a/CovidAlertVaccinationModel/test/runtests.jl b/CovidAlertVaccinationModel/test/runtests.jl
index cb4d959..56772e1 100644
--- a/CovidAlertVaccinationModel/test/runtests.jl
+++ b/CovidAlertVaccinationModel/test/runtests.jl
@@ -3,12 +3,12 @@ using RandomNumbers.Xorshifts
 using Test
 using ThreadsX
 import StatsBase.mean
-model_sizes = [(100,1),(1000,1),(1000,3),(5000,3)]
+model_sizes = [100,1000,1000,5000]
 vaccination_strategies = [vaccinate_uniformly!]
 vaccination_rates = [0.000,0.005,0.01,0.05]
 infection_rates = [0.01,0.05,0.1]
 agent_models = ThreadsX.map(model_size -> AgentModel(model_size...), model_sizes)
-dem_cat = AgentDemographic.size + 1
+dem_cat = AgentDemographic.size -1
 
 
 
-- 
GitLab