A roadmap, challenges, and questions
London School of Hygiene & Tropical Medicine
14 August 2026
samabbott.co.uk/JuliaCon2026/roadmap
JuliaCon 2026, Muschel — N3, Friday 14 August 2026, 14:30.
BVDOutbreakSize, first commit 2026-05-19 with 33 that day, read 2026-08-13 from the clone at 90df658d · figures from the WHO collaboratory talk of 10 June 2026, fitted to data as of 7 June · situation reports from insp.cd · McCabe et al., Estimation of the size of the outbreak of Ebola disease caused by Bundibugyo virus in DRC, Imperial College London, 18 May 2026, doi:10.25560/130007.
About 35,000 lines of Julia across src, test, scripts, ext and docs, counted 2026-08-13 · the Enzyme comparison is BVDOutbreakSize#445, open at 2026-08-12.
epiaware.org, read 2026-08-13.
ComposableTuringIDModels.jlTuring.jl. Transmission, latent process and observation are separate objects that nest into one modelTuring toolchain come with itepiaware.org/approaches/composable-turing-models, read 2026-08-13, comments trimmed to fit · ComposableTuringIDModels.jl
using ComposableTuringIDModels, Distributions, Turing, Mooncake
using ADTypes: AutoMooncake
renewal = Renewal(;
generation_time = Gamma(1.4, 1 / 0.38),
rt = AR(; ϵ_t = HierarchicalNormal(std = HalfNormal(0.1))),
initialisation = Normal(log(1.0), 1.0))
obs = LatentDelay( # delay → ascertainment → noise
Ascertainment(NegativeBinomialError(),
Intercept(Normal(log(0.4), 0.1))),
truncated(Normal(5.0, 2.0), 0.0, Inf))
model = IDModel(renewal, obs)
chain = sample(as_turing_model(model, cases, length(cases)),
NUTS(0.95; adtype = AutoMooncake(; config = nothing)),
MCMCThreads(), 100, 2)ComposedDistributions.jlDistributions.jlconvolve_series pushes a time series through the tree, and it marginalises across the tree where that is cheaperlower turns a delay into a compartmental generator, over Catalyst, SciMLBase, JumpProcesses and AlgebraicPetriepiaware.org/approaches/composed-distributions, read 2026-08-13, comments trimmed to fit · ComposedDistributions.jl · LoweredDistributions.jl README, read 2026-08-10.
using ComposedDistributions, Distributions
tree = @uncertain compose(( # parallel pathways, nested
clinical = sequential(
:onset_admit => Gamma(Normal(1.2, 0.2), 3.0),
:admit_resolve => resolve(
:death => (Gamma(2.0, 3.5), 0.3),
:discharge => (Gamma(1.0, 8.0), 0.7))),
surveillance = sequential(
:onset_notif => Gamma(0.7, 20.0),
:notif_compete => compete(
:confirmed => Gamma(2.0, 1.0),
:lost => Gamma(5.0, 0.5))),))
event_tree(tree) # the tree,
params_table(tree) # its parameters,
priors = param_priors(tree) # and its default priors
case = rand(tree)
logpdf(tree, case)epinowcast, its community forum and seminar seriesTuring.jlSciMLrOpenSciSpeedyWeather.jlComrade.jlHydroModels.jlcommunity.epinowcast.org and epinowcast.org/seminars, read 2026-08-11 · SciML governance and rOpenSci software review, read 2026-08-11.
| Package | Since | Stars | CRAN |
|---|---|---|---|
EpiNow2 |
2020 | 141 | 58,073 |
epinowcast |
2021 | 67 | not on CRAN |
epidist |
2023 | 16 | not on CRAN |
primarycensored |
2024 | 9 | 11,294 |
baselinenowcast |
2025 | 10 | 1,678 |
Stars and creation dates from the GitHub API, downloads are CRAN totals to 2026-08-11 from cranlogs, retrieved 2026-08-12, and baselinenowcast 2026-08-13.
epinowcast was the attempt at community developed tools