Building a composable Julia ecosystem for infectious disease modelling
A roadmap, challenges, and questions
Slides EpiAware on GitHub epiaware.org Session on pretalx
Abstract
Infectious disease models that integrate multiple data sources provide better evidence for outbreak response than chains of separate models, but building them is slow and requires expertise across domains. Composable modelling, where validated components combine into joint models that properly propagate uncertainty, addresses this but requires an ecosystem of reusable infectious disease model components. We believe Julia is the best language for this ecosystem due to its type system, multiple dispatch, automatic differentiation support, and existing scientific computing infrastructure (SciML, Turing.jl, Distributions.jl), which provide the foundations composable modelling needs. In this talk, we present the EpiAware roadmap for creating and sustaining that ecosystem, our current progress, and our questions for the Julia community.
In R, we have built the epinowcast ecosystem (packages, community forum, seminar series) and developed several other widely used packages including EpiNow2 and scoringutils. We want to create something equivalent in Julia: a domain-focused ecosystem in the mould of SciML or Turing.jl, with the community infrastructure of rOpenSci and the domain specificity of SpeedyWeather.jl.
So far, we have CensoredDistributions.jl, which handles common biases in epidemiological delay distributions, and an R interface prototype (EpiAwareR). We initially plan to implement packages covering distribution extensions for epidemiological use, delay and generation time estimation, disease dynamics components, and forecast evaluation, alongside a centralised documentation site.
At the package level, we need to answer questions about what makes a good Julia package in our ecosystem: consistent documentation via DocStringExtensions and DocumenterCitations, robust testing with Aqua.jl and JET.jl, automatic differentiation backend testing via DifferentiationInterfaceTest, and where we need package extensions (e.g. for Turing.jl integration).
At the ecosystem level, we need to understand how to manage releases so that package versions work together, how to run reverse dependency checks before publishing, how to set up shared CI and centralised documentation across many packages, and how to help users understand which automatic differentiation backends are compatible when they combine multiple packages.
Resources
Code
- EpiAware on GitHub. 22 repositories, 19 of them public, 11 Julia packages, 10 registered in the General registry.
- epiaware.org. The org’s documentation and package site.
- EpiAwarePackageTools.jl. One template that keeps ten of the eleven packages’ tests, docs, and README format in sync.
- EpiAwareADTools.jl. A library of automatic differentiation workarounds, each one deleted once the upstream fix lands.
- CensoredDistributions.jl. The most mature package so far, 25 registered releases.
- EpiAwareR. Sebastian Funk’s prototype R interface to the Julia ecosystem.
What we built in R
- epinowcast. The ecosystem this roadmap is trying to build again in Julia.
- The epinowcast community forum. The community half of it, alongside the seminar series.
- EpiNow2. Widely used. The package whose lack of modularity started this.
- scoringutils. Forecast evaluation in R. The plan above has a Julia equivalent.
Papers and writing
- A workflow for infectious disease modelling. The paper this roadmap is trying to give a proper home to.
- BVDOutbreakSize. A live joint model of the 2026 DRC outbreak of Ebola disease caused by Bundibugyo virus, built the way we want ecosystem packages to compose. It builds on the Imperial (McCabe et al.) report. Source.
Ecosystems we are learning from
- rOpenSci. The community infrastructure model named in the abstract, built around package peer review.
- SciML governance. A steering council, an advisory committee, and a written governance document, for an ecosystem well past the size we are planning for.
- SpeedyWeather.jl. The closest thing Julia has to a domain-specific ecosystem at the size we are aiming for.
- JuMP’s governance. A named BDFL and a steering committee, worth reading before we write ours.
- MultiDocumenter.jl. How SciML stitches many packages’ docs into one site.
- DifferentiationInterface.jl. The automatic differentiation abstraction layer every package’s AD test suite runs through, alongside DifferentiationInterfaceTest.jl.