Skip to content

Commit

Permalink
Merge pull request #23 from jangevaare/dev
Browse files Browse the repository at this point in the history
v0.4.7
  • Loading branch information
jangevaare authored Mar 23, 2020
2 parents c2efead + c4a166c commit fa1cab4
Show file tree
Hide file tree
Showing 42 changed files with 590 additions and 509 deletions.
10 changes: 4 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
# Documentation: http://docs.travis-ci.com/user/languages/julia/
## Documentation: http://docs.travis-ci.com/user/languages/julia/
codecov: true
language: julia
os:
- linux
- osx
julia:
- 1.1
- 1.2
- 1.3
- 1.4
- nightly
notifications:
email: false
matrix:
allow_failures:
- julia: nightly
fast_finish: true
after_success:
- julia -e 'using Pkg; Pkg.add("Coverage"); using Coverage; Codecov.submit(process_folder())'
fast_finish: true
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "Pathogen"
uuid = "c8189ad9-0349-5cbb-98f2-579781f27e5c"
authors = ["Justin Angevaare <justinangevaare@gmail.com>"]
version = "0.4.6"
version = "0.4.7"

[deps]
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Expand Down
74 changes: 40 additions & 34 deletions src/Pathogen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,41 +15,47 @@ module Pathogen
import StatsBase.mean,
ProgressMeter.next!

# Types
include("types/EpidemicModel.jl")
include("types/DiseaseState.jl")
include("types/Population.jl")
include("types/Events/Event.jl")
include("types/Events/Events.jl")
include("types/Events/EventExtents.jl")
include("types/Events/EventObservations.jl")
include("types/Events/EventRates.jl")
include("types/Risks/AbstractRisk.jl")
include("types/Risks/RiskFunctions.jl")
include("types/Risks/RiskParameters.jl")
include("types/Risks/RiskPriors.jl")
include("types/Transmissions/Transmission.jl")
include("types/Transmissions/TransmissionNetwork.jl")
include("types/Transmissions/TransmissionRates.jl")
include("types/Simulation.jl")
include("types/MarkovChain.jl")
include("types/MCMC.jl")
include("types/Transmissions/TransmissionNetworkDistribution.jl")
# Core
include("core/EpidemicModel.jl")
include("core/DiseaseState.jl")
include("core/Population.jl")
include("core/Events/Event.jl")
include("core/Events/Events.jl")
include("core/Events/EventRates.jl")
include("core/Risks/AbstractRisk.jl")
include("core/Risks/RiskFunctions.jl")
include("core/Risks/RiskParameters.jl")
include("core/Transmissions/Transmission.jl")
include("core/Transmissions/TransmissionNetwork.jl")
include("core/Transmissions/TransmissionRates.jl")
include("core/initialize.jl")
include("core/update!.jl")

# Functions
include("functions/_pathway_from.jl")
include("functions/_pathway_to.jl")
include("functions/_accept.jl")
include("functions/_bounds.jl")
include("functions/generate.jl")
include("functions/initialize.jl")
include("functions/observe.jl")
include("functions/update!.jl")
include("functions/simulate!.jl")
include("functions/loglikelihood.jl")
include("functions/logpriors.jl")
include("functions/start!.jl")
include("functions/iterate!.jl")
# Simulation
include("simulation/Simulation.jl")
include("simulation/generate.jl")
include("simulation/simulate!.jl")
include("simulation/update!.jl")
include("simulation/EventObservations.jl")
include("simulation/observe.jl")

# Inference
include("inference/TransmissionNetworkDistribution.jl")
include("inference/RiskPriors.jl")
include("inference/EventExtents.jl")
include("inference/MarkovChain.jl")
include("inference/MCMC.jl")
include("inference/_pathway_from.jl")
include("inference/_pathway_to.jl")
include("inference/_accept.jl")
include("inference/_bounds.jl")
include("inference/generate.jl")
include("inference/initialize.jl")
include("inference/update!.jl")
include("inference/loglikelihood.jl")
include("inference/logpriors.jl")
include("inference/start!.jl")
include("inference/iterate!.jl")

# Visualization
include("visualization/epidemic_curve.jl")
Expand Down
File renamed without changes.
File renamed without changes.
11 changes: 5 additions & 6 deletions src/types/Events/Event.jl → src/core/Events/Event.jl
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
abstract type AbstractEvent end

struct NoEvent <: AbstractEvent
time::Float64

function NoEvent()
return new(Inf)
end
end

struct Event{T <: EpidemicModel} <: AbstractEvent
Expand All @@ -26,10 +21,14 @@ struct Event{T <: EpidemicModel} <: AbstractEvent
end
end

function _time(x::AbstractEvent) where T <: EpidemicModel
function _time(x::Event{T}) where T <: EpidemicModel
return x.time
end

function _time(x::NoEvent)
return Inf
end

# function Base.copy(x::Event{T}) where T <: EpidemicModel
# return Event{T}(copy(x.time), copy(x.id), copy(x.new_state))
# end
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ struct TransmissionRates
end
end

function Base.copy(x::TransmissionRates)
return TransmissionRates(copy(x.external),
copy(x.internal))
end
# function Base.copy(x::TransmissionRates)
# return TransmissionRates(copy(x.external),
# copy(x.internal))
# end

function Base.sum(x::TransmissionRates)
return sum(x.external) + sum(x.internal)
Expand Down
48 changes: 48 additions & 0 deletions src/core/initialize.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
function initialize(::Type{TransmissionRates},
states::Vector{DiseaseState},
pop::Population,
rf::RiskFunctions{T},
rp::RiskParameters{T}) where T <: EpidemicModel
n_ids = length(states)
tr = TransmissionRates(n_ids)
for i in findall(states .== Ref(State_S))
# External exposure
#tr.external[i] = rf.susceptibility(rp.susceptibility, pop, i) * rf.sparks(rp.sparks, pop, i)
tr.external[i] = rf.sparks(rp.sparks, pop, i)
# Internal exposure
for k in findall(states .== Ref(State_I))
tr.internal[k, i] = rf.susceptibility(rp.susceptibility, pop, i) *
rf.infectivity(rp.infectivity, pop, i, k) *
rf.transmissibility(rp.transmissibility, pop, k)
end
end
@debug "Initialization of $T TransmissionRates complete" external = tr.external ∑external = sum(tr.external) internal = tr.internal ∑internal = sum(tr.internal)
return tr
end

function initialize(::Type{EventRates},
tr::TransmissionRates,
states::Vector{DiseaseState},
pop::Population,
rf::RiskFunctions{T},
rp::RiskParameters{T}) where T <: EpidemicModel
n_ids = length(states)
rates = EventRates{T}(n_ids)
for i = 1:n_ids
if states[i] == State_S
if T in [SEIR; SEI]
rates.exposure[i] = tr.external[i] + sum(tr.internal[:,i])
elseif T in [SIR; SI]
rates.infection[i] = tr.external[i] + sum(tr.internal[:,i])
end
elseif states[i] == State_E
rates.infection[i] = rf.latency(rp.latency, pop, i)
elseif states[i] == State_I
if T in [SEIR; SIR]
rates.removal[i] = rf.removal(rp.removal, pop, i)
end
end
end
@debug "Initialization of $T EventRates complete" rates = rates[_state_progressions[T][2:end]]
return rates
end
120 changes: 120 additions & 0 deletions src/core/update!.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
function update!(events::Events{T},
event::Event{T}) where T <: EpidemicModel
events[event.new_state][event.individual] = event.time
return events
end

function update!(states::Vector{DiseaseState},
event::Event{T}) where T <: EpidemicModel
states[event.individual] = event.new_state
return states
end

function update!(net::TransmissionNetwork,
xfer::ExogenousTransmission)
net.external[xfer.individual] = true
return net
end

function update!(net::TransmissionNetwork,
xfer::EndogenousTransmission)
net.internal[xfer.source, xfer.individual] = true
return net
end

function update!(net::TransmissionNetwork,
xfer::NoTransmission)
return net
end

function update!(tr::TransmissionRates,
event::Event{T},
states::Vector{DiseaseState},
pop::Population,
rf::RiskFunctions{T},
rp::RiskParameters{T};
xzero::Bool=false) where T <: EpidemicModel
id = event.individual
if _new_transmission(event) && xzero
tr.external[id] = 0.0
tr.internal[:, id] .= 0.0
end
if event.new_state == State_I
transmissibility = rf.transmissibility(rp.transmissibility, pop, id)
@simd for i in findall(states .== Ref(State_S))
tr.internal[id, i] = rf.susceptibility(rp.susceptibility, pop, i) *
rf.infectivity(rp.infectivity, pop, i, id) *
transmissibility
end
elseif event.new_state == State_R
@simd for i in findall(states .== Ref(State_S))
tr.internal[id, i] = 0.0
end
end
return tr
end

function update!(rates::EventRates{T},
tr::TransmissionRates,
event::Event{T},
states::Vector{DiseaseState},
pop::Population,
rf::RiskFunctions{T},
rp::RiskParameters{T}) where T <: EpidemicModel
id = event.individual
if event.new_state == State_E
rates.exposure[id] = 0.0
rates.infection[id] = rf.latency(rp.latency, pop, id)
@logmsg LogLevel(-5000) "Exposure rate total for i = $id updated" λ = rates.exposure[id]
@logmsg LogLevel(-5000) "Infection rate for i = $id updated" λ = rates.infection[id]
elseif event.new_state == State_I
rates.infection[id] = 0.0
@logmsg LogLevel(-5000) "Infection rate for i = $id updated" λ = rates.infection[id]
if T in [SEIR; SIR]
rates.removal[id] = rf.removal(rp.removal, pop, id)
@logmsg LogLevel(-5000) "Removal rate for i = $id updated" λ = rates.removal[id]
end
if T in [SEIR; SEI]
@simd for i in findall(states .== Ref(State_S))
# This assumes `TransmissionRates` already updated!
rates.exposure[i] += tr.internal[id, i]
@logmsg LogLevel(-5000) "Exposure rate total for i = $id updated" λ = rates.exposure[id]
end
elseif T in [SIR; SI]
@simd for i in findall(states .== Ref(State_S))
# This assumes `TransmissionRates` already updated!
rates.infection[i] += tr.internal[id, i]
@logmsg LogLevel(-5000) "Infection rate total for i = $id updated" λ = rates.infection[id]
end
end
elseif event.new_state == State_R
rates.removal[id] = 0.0
@logmsg LogLevel(-5000) "Removal rate for i = $id updated" λ = rates.removal[id]
if T == SEIR
@simd for i in findall(states .== Ref(State_S))
# This assumes `TransmissionRates` already updated!
rates.exposure[i] = sum(tr.internal[:, i])
@logmsg LogLevel(-5000) "Exposure rate total for i = $i updated" λ = rates.exposure[i]
end
elseif T == SIR
@simd for i in findall(states .== Ref(State_S))
# This assumes `TransmissionRates` already updated!
rates.infection[i] = sum(tr.internal[:, i])
@logmsg LogLevel(-5000) "Infection rate for i = $i updated" λ = rates.infection[i]
end
end
end
return rates
end

function update!(tr::TransmissionRates,
rates::EventRates{T},
event::Event{T},
states::Vector{DiseaseState},
pop::Population,
rf::RiskFunctions{T},
rp::RiskParameters{T}) where T <: EpidemicModel
update!(tr, event, states, pop, rf, rp)
update!(rates, tr, event, states, pop, rf, rp)
return tr, rates
end
Loading

2 comments on commit fa1cab4

@jangevaare
Copy link
Owner Author

@jangevaare jangevaare commented on fa1cab4 Mar 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator register

Release notes:

  • Support for specification of a TransmissionNetworkPrior for conducting inference via MCMC
  • Package restructuring (non-breaking)

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/11431

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.4.7 -m "<description of version>" fa1cab49f8b39c8cf665541b17839480617ee131
git push origin v0.4.7

Please sign in to comment.