Skip to content

3.1.0 release

Choose a tag to compare

@seabbs seabbs released this 05 Nov 17:52
4c4796e

Release notes for BVDOutbreakSize.
Major versions of the report are kept as GitHub Releases; each push to main also republishes the rendered analysis and the output/ artifacts.

v3.1.0

Changes since v3.0.0.

A minor version: every affected province is its own patch, the importation kernel is centred on gravity mobility, and the province case-fatality ratios and detection probabilities lie between zero and one by construction.

Performance

  • The health-zone kernel blocks and import fractions are each built in one Mooncake rule.
    The model does not change.
  • Fits run BLAS on one thread while the chains sample, each chain calling it on its own thread.
  • The per-patch Rt matrix and importation fractions are each built in one Mooncake rule.
    The model does not change.
  • The per-patch onsets and the onsets carried to confirmation go through the per-patch row convolution rule.
    The model does not change.
  • The per-patch treatment kernels (the patch rows through a delay, the demand share-out and the capacity and background admission shares) have hand-written Mooncake rules (#1217).
    The model does not change.
  • The censored delay PMFs (Gamma, LogNormal and Weibull) have a closed-form Mooncake rule.
    The model does not change.
  • The treatment flow no longer re-splits each patch's BVD admissions by weights of one when the per-patch reports carry the suspected-case detection (#1212).
    The model does not change.
  • The sum-to-zero bases the patch submodels build on every evaluation pass no derivative, so Mooncake no longer tapes them (#1213).
    The model does not change.
  • The province compositions skip stick-breaking rows with no trials and no count, which score exactly zero, so the composition gradient is about 27% faster with bit-identical results (#1195).
  • A hand-written Mooncake rule bins the per-patch confirmed and death rows to the province vintages in one call, about 8x faster on that step with bit-identical results (#1200).
  • Hand-written Mooncake rules for the health-zone pre-grid convolution and vintage window weights keep the per-draw rebuild of the zone delays to about 5% of the full zone gradient, from 24% without them (local timings in #1085).
  • The health-zone relative ascertainment and fatality multipliers take their sum-to-zero basis from the model inputs, built once per fit rather than on every gradient (#1081, resolves #1048).
    This cuts the zone gradient by about 5%, with the timings in #1081.
    The model does not change.

Model

  • The onset-to-admission Gamma scale prior is LogNormal(log(3.694), 0.32) at the onset-to-report, onset-to-detection and onset-to-death delays, and fitted values change (#1087).
  • Every affected province is its own patch, so the joint model has eight patches rather than Ituri, Nord-Kivu, Haut-Uele and a pooled other (#1147).
    SitRep 155 (16 October) reports the first confirmed cases in an eighth province, Nord-Ubangi, and the maintainers chose to give it its own patch.
    Giving Nord-Ubangi, with 2 cases, its own patch while Tshopo, with 59 by 10 October, stayed pooled would have broken the rule the pooling rested on, so Sud-Kivu, Tshopo, Bas-Uele and Sud-Ubangi become patches too.
    The new patches take the existing per-patch priors, so no prior is added or changed.
    Their reproduction-number deviations, ascertainment and lethality are informed mostly by the priors those parameters share across patches.
    The gravity kernel now sends each small province's exports to its own neighbours: about half of Nord-Kivu's go to Sud-Kivu, and about a third of Nord-Ubangi's go to Sud-Ubangi.
    The parameter count grows with the patch count, so fitted values change and the fits need rerunning.
    Archived release forecasts for the other patch are still scored against its four provinces.
    The patch figures take their default colours from the eight-colour zone palette, so no two patches share a colour.
    The zone composition calibration leaves out a patch with no zone counts to score for a stream, rather than giving it an empty row that broke the calibration plot.
  • The importation kernel's log flows have a multivariate normal prior whose mean is the log gravity kernel, so gravity is the prior and each flow's log deviation is the data's departure from it (#1030).
    The covariance is a destination effect correlated with each province's origin deviation plus a double-centred flow term whose correlation matrix ties each flow to its reverse, and each origin's export total is held.
    The deviation is drawn non-centred on a rectangular square root of the covariance, which leaves out the shift shared within an origin's column and so has no Cholesky factor.
    Fitted values change.
  • The health-zone importation kernel samples its distance decay and a log weight per destination zone, holding each origin's total into every province (#1030).
    The decay's LogNormal(0, 1) prior has its median at the fixed inverse-distance decay it replaces.
    Fitted values change.
  • The four daily treatment-centre flows (admissions, in-care deaths, rule-outs and absconds) take a negative-binomial dispersion of their own, rather than the dispersion of the occupancy, beds and in-care census (#1103).
    At 100 draws of the joint posterior from the docs CI run 37423718825, the shared dispersion sat at 546 (322 to 1472), set by the stocks, and the flows scattered 2.1 to 5.0 times the variance it allowed (Pearson dispersion index by stream).
    A dispersion fitted to the flows alone at those draws is about 14 and raises their log-likelihood by about 94.
    As a seventh pooled stream it shared the wide pooling spread the stocks need, and the joint fit did not converge (R-hat 1.14, bulk ESS 21, worst in the province capacity shares).
    The flow dispersion is centred on the stock dispersion, with log(1/√k_flow) Normal about log(1/√k_iso) with SD log(3)/2 and drawn directly.
    The offset is the log ratio of the flows' extra coefficient of variation to the stocks'.
    Its prior is set a priori, not from a fit: zero nests the shared dispersion, a threefold ratio either way sits at two SDs.
    Those fits show the problem and were not used to set the prior.
    Fitted values change.
    The flows carry less weight, so the in-care fatality, stays and admission rates they inform can widen.
  • The background split and the bed capacity shares draw their sum-to-zero deviations in centred form, on the scales $\tau_{\text{bg}}$ and $\tau_{\text{cap}}$, so z_bg becomes y_bg and z_cap becomes y_cap (#1123).
    The data pin each deviation rather than its scale, so the non-centred form tied the standard-normal draws to the scale along a funnel.
    On the joint posterior of the #1101 fit, whose model is the one before this change, the log scale correlates with the log mean square of its standard-normal draws at −0.93 for the background split and −0.96 for the capacity shares.
    Both scales are among the slowest-mixing parameters of recent CI fits.
    The two submodels lose their offset_prior keyword, which the centred form has no use for.
    This is an exact reparameterisation with the same prior and likelihood, so fitted values change only by sampling noise.
  • The national reproduction-number walk samples each knot after the first as the total log $R_t$ on its knot day, intervention ramp included, and centres the walk on those knots net of the ramp, so rt_state.z becomes rt_state.log_Rt_knots (#1124).
    It is a reparameterisation and the model is unchanged: the prior, the effect bound and every density are the same, and the log density agrees at mapped points.
    In the old coordinates the intervention effect, the growth rate and the early knots traded off along one stiff direction, the national $R_t$ level, which set the joint's step size.
    On draws from the main-model posterior the largest eigenvalue of the diagonally scaled Hessian falls from 2.6–5.3e5 to 0.4–1.4e5, and fixed-step NUTS probes stay stable at a step of 0.0045 against 0.002 (figures in the pull request).
    Fitted values change only by sampling noise.
  • The bed capacity walk samples the first week's growth directly, from the exact prior of the base growth plus the first step, so the first step is no longer a separate draw (#1102).
    The capacity only first moves over the first week, so the data saw the base growth and the first step only through their sum, and that pair formed one of the capacity ridges reported in #1084.
    With every other parameter of the treatment-only fit held at a posterior draw, the capacity block needs 1.8 to 2.6 times fewer gradients per effective draw of its slowest parameter, the step scale $\sigma_{\text{growth}}$, and has no divergences against 7 and 1 (two draws, figures in the pull request).
    The model is the same with one dimension fewer, so fitted values change only by sampling noise.
  • The province deviation level at the first knot is drawn centred on its scale σ_level rather than as σ_level times a standard normal (#1083).
    The province data pin the level, so the scale and the standard-normal draw traded off along a curved ridge.
    With every other parameter held at a posterior draw, the centred level samples σ_level with 18 to 34 times fewer gradients per effective draw (two draws, figures in the pull request).
    The model is the same, so fitted values change only by sampling noise.
  • The onset triangle's read SD prior is LogNormal(log 0.3, 0.5), centred on one figure pixel, in place of LogNormal(log 1, 0.5) (#1099).
    Rounding of each read has its own variance term, so the read SD is the error beyond it, and one count spans a median of 3.2 pixels across the digitised figures (data/onset_curve_figures.csv).
    The three published fits results-2720, results-2817 and results-2847 put the read SD between 0.16 and 0.29 counts (90% intervals), below the old prior's 1st percentile and inside the new prior's 90% range of 0.13 to 0.68.
    Fitted values change.
  • The health-zone model samples the joint's generation-interval and delay parameters with its weekly patch infections from the melded normal, and each draw rebuilds its generation interval and delays from them (#1085).
    They were fixed at their joint posterior means, so the zone results carried none of their uncertainty.
    Fitted zone values change slightly: the zone reproduction-number intervals widen a little, and the zone death composition can shorten the onset-to-death delay the zones read.
  • The health-zone case delay includes the onset-to-report step, so it is the delay the joint's province compositions apply to infections (#1085).
    It ran from infection to receipt without that step, about two and a half days short at the posterior mean.
  • The onset reporting hazard draws its delay deviations in centred form, on the scale $\sigma_{h0}$, so z_h0 becomes y_h0 (#1060).
    The triangle pins the hazard between two and eleven days' delay, and the non-centred form tied those deviations to $\sigma_{h0}$, which failed the joint fit's convergence check (R-hat 1.10 and 28 bulk effective samples, reported in #1060).
    On local onsets-only fits at two seeds (two chains of 500 draws each, reported in the pull request) the centred form raises the bulk effective samples of $\sigma_{h0}$ from 106 and 54 to 476 and 396, with the same posterior.
    The prior is unchanged, so fitted values change only by sampling noise.
  • The capacity growth SD prior is N⁺(0, 0.05), so its 95th percentile covers the fitted 0.07; fitted values change (#1050).
  • The cut-off and forecast beds, occupancy and admissions are built by province and summed to the national figures, with nothing capped: each province's beds are its share of the capacity walk, and its forecast runs the fitted stock forward (#958).
    The forecast draws the national occupancy and admissions from the national negative binomial and splits each across the provinces by the fitted split and its overdispersion, so the national forecast keeps the fitted spread.
    The national bed shortfall is the bed demand above the national beds; each province's patients above its own beds are reported by province.
  • The provinces' 24h admissions are fitted as a split of the national admissions (#958).
    Each province's share of the non-BVD admissions is its share of the non-BVD suspects moved by a sum-to-zero level (scale Normal⁺(0, 0.5)) and a weekly random walk over the printed days, which nest the constant share at zero.
    A province that never prints admissions keeps its share of the non-BVD suspects.
  • Each province's case-fatality ratio is the national ratio shifted by a sum-to-zero contrast on the logit scale, so it lies between zero and one by construction (#1149).
    It was the national ratio times a log-scale multiplier, which nothing bounded, and one draw of 2000 in the SitRep 154 fit put Nord-Kivu at 1.06.
    The province point prevalence rejected that draw and failed the province page.
    The death composition's severity multiplier is now the province ratio over the national one, and a zero contrast still gives every province the national ratio.
    The contrast's half-normal scale is 0.15 on the logit scale, which at the prior mean ratio of 0.33 is about the previous 0.1 on the log scale.
    The health-zone fatality is built the same way, as a logit shift of its province's ratio at the joint posterior mean, with the same change of scale prior.
    The zone point prevalence shifts each joint draw's province ratio by the zone's contrast, so it no longer caps the zone ratio at one.
    Fitted values change and the joint and zone fits need refitting.
  • Each province detects a BVD onset as a suspected case with its own probability, the DRC ascertainment shifted by a sum-to-zero contrast on the logit scale, so it lies between zero and one by construction (#1153).
    The national BVD suspected cases are each province's onsets through the onset-to-report delay times its probability, summed, and the suspected-case, laboratory, isolation and onset-curve streams read that sum.
    The DRC ascertainment is now the logit centre of the province probabilities, so the report gives the national suspected-case ascertainment as those probabilities weighted by the province onsets to the cut-off, recorded as p_drc_national and published alongside p_drc.
    The case composition's sum-to-zero log contrast becomes the confirmation contrast, which carries the provincial differences in testing, and the relative case ascertainment is the detection times that contrast.
    The detection spread takes a half-normal scale of 0.5 on the logit scale, about 0.125 on the log scale at the prior centre of 0.75, and the confirmation contrast keeps its scale of 0.3 on the log scale.
    The province occupancy splits carry the detection but no longer the confirmation contrast, since a suspect is admitted before testing.
    A zero detection spread gives the previous model, except that the occupancy splits then use incidence alone.
    The province point prevalence reads each province's detection directly, so it no longer rescales the relative ascertainment or caps it at one.
    The zone point prevalence shifts that probability on the logit scale by the log of the zone's relative ascertainment.
    The zone stage centres its ascertainment spread on the province spread of detection times confirmation, recorded as province_ascertainment_log_sd, rather than on the confirmation spread alone.
    Fitted values change and the joint fit, and everything fitted from it, needs refitting.

Data

  • A [skip_dates] manifest block leaves listed vintages out of a loaded history while keeping them in the manifest as printed, so a report whose cumulative a later report withdraws merges into the next window rather than reading as a fall (#1194).
  • The model cut-off advances to SitRep 171, 1 November.
    Confirmed cases rise 65 and confirmed deaths 23, both equal to the printed counts.
    The isolation tile (961) is the sum of the provinces without Haut-Uélé, which sent no care data, and is kept.
    data/onset_dashboard_history.csv adds the dashboard snapshot of 3 November.
    Fitted values change with the new data.
  • The model cut-off advances to SitRep 170, 31 October.
    SitRep 170 drops the SitRep 169 Ituri harmonisation without comment, so its national confirmed deaths (5 103) fall 269 below SitRep 169's 5 372.
    30 October is skipped for the national, province and zone deaths and the zone cases, so their 29 to 31 October step matches the two days' printed counts (#1188).
    data/onset_dashboard_history.csv adds the dashboard snapshot of 2 November.
    Fitted values change with the new data.
  • The model cut-off advances to SitRep 169, 30 October.
    SitRep 169 harmonises Ituri's deaths, so national confirmed deaths step 346 against 32 printed.
    The step is recorded as printed, and whether 30 October becomes a break day is raised in #1188.
    Yakoma (Nord-Ubangi) joins the health-zone blocks at SitRep 167, and the laboratory scanner reads three new phrasings.
    The national bed capacity has no entry from 26 October, because Ituri prints no beds and the remaining provinces' sum falls below the isolation tile (#1190).
    data/onset_dashboard_history.csv adds the dashboard snapshots of 28 October to 1 November.
    Fitted values change with the new data.
  • The model cut-off advances to SitRep 164, 25 October (#1185).
    Its isolation tile is blank, so the national isolation and bed series stop at 24 October, and Nord-Kivu's misprinted admissions are left out.
  • The model cut-off advances to SitRep 163, 24 October (#1166).
    Haut-Uélé's care paragraph that day repeats SitRep 162's and is left out of the province care blocks, so the national bed capacity takes Nord-Kivu's 410 alone.
    data/onset_dashboard_history.csv adds the dashboard snapshot of 26 October.
    Fitted values change with the new data.
  • 23 October is an occupancy reclassification break, because Ituri's start-of-day stock implied by its care paragraph falls 96 below the previous report's count while the same balance matched on the seven previous days (#1172).
    Fitted values change.
  • Bas-Uélé's care paragraphs on SitReps 155 and 156 (16 and 17 October) repeat SitRep 154's word for word, so they are left out of the province occupancy block as stale carry-forwards (#1180).
    Fitted values change.
  • The onset curve gains SitReps 151, 153 and 158, so its latest vintage is 19 October rather than 10 October (#1138, #1148).
    The reader now reads a short bar whose dark dead segment passes as outline, drops a column that carries the next bar's outline height, reads no bar from the band's pink beside the last outline, and lets two agreeing soft columns outvote a middle column under the dashed line.
    The rebuild adds 8 May to SitReps 133 and 134 and 2 May to SitRep 146, removes a 4 May bar from SitReps 112 and 143 to 145, and moves SitRep 120's 7 September from 17 to 24.
    SitReps 150 and 154 stay out, and #1154 gives the reasons.
  • The model cut-off advances to SitRep 162, 23 October, and the onset curve gains SitRep 160, so its latest vintage is 21 October (#1154).
    SitRep 160 removes 10 cases and 1 death from Beni's cumulative with no note (#1159), so Nord-Kivu and the national total rise by less than the printed 24h counts.
    The reader now reads a bar from its outlined columns when every other column of its window has lost its top outline, and reads nothing left of the y-axis line, which also drops a 24 and 28 April bar of 1 from SitReps 106 and 107.
    SitReps 161 and 162 redraw SitRep 160's extract, so the onset curve does not add them.
    The care scanner reads Nord-Kivu's patients sont pris en charge with its CTE/CT fraction.
    data/onset_dashboard_history.csv adds the dashboard snapshots of 22 and 24 October.
    Fitted values change with the new data.
  • Nord-Ubangi is the eighth source province (#1147).
    Its 2019 population, 1 425 000, is from the same INS Annuaire statistique RDC 2020 table as the other seven.
    Its centre, (3.8889, 20.9641), is the WorldPop-weighted mean of its 11 health-zone centroids, printed by task province-centres from the same INRB-UMIE build as the other seven.
    The province, laboratory and zone blocks carry zero nord_ubangi series to SitRep 154, since no report before SitRep 155 names the province, and the zone blocks carry Wapinda at zero.
    data/health_zones.csv gains Wapinda and the zone map gains Nord-Ubangi's 11 zones, 178 in all.
    The scanners and scripts/build_health_zones.py recognise the province.
  • The model cut-off advances to SitRep 159, 20 October (#1128, #1137, #1141).
    SitRep 142 (3 October) is not published on insp.cd, so every stream steps from 2 to 4 October.
    SitRep 145 prints no care section, so 6 October has a national isolation count and no province split.
    SitReps 147 and 149 print no Ituri alerts, so their suspect totals are partial and the suspected stream leaves out 8 and 10 October.
    The care scanner reads the care section where SitRep 146 renumbers it under PCI/EDS, and the laboratory scanner reads two misspellings of échantillons and a bullet with no sample noun.
    The onset curve adds SitReps 146 and 149; SitRep 147 stays out, and 148 with it as a reprint, because the reader takes the edge of a taller neighbour for its faded 6 October bar.
    SitRep 150 prints a Tableau 1 total of 9 065 against 9 066 in its own Tableau 2 and prose, so the confirmed and province series take the Tableau 2 figures, and its header misprints the report date as 12 October.
    The care scanner reads a patient count printed before its split or with no verb, and the laboratory scanner reads a count run into its noun.
    The onset curve does not add SitReps 150 and 151: the reader misreads a tick-column bar and a dead segment in 150 and takes the edge of 151's last bar for a 12 October bar the figure does not draw.
    SitRep 152 reprints SitRep 151's onset figure, so it stays out with it.
    The onset curve does not add SitReps 153 and 154 either, because on their larger renders the reader misplaces the bars around 14 May and drops 5 June from 154.
    The laboratory scanner reads positives worded as new confirmed cases against a sample count, and the care scanner reads a wrapped line that opens on a bracket, which also fills Sud-Kivu's 17 patients and 25 beds on 12 September.
    SitRep 155 (16 October) reports Nord-Ubangi's first 2 cases and 1 death, in Wapinda, and SitRep 158 its third case.
    SitRep 155's isolation tile repeats SitRep 154's while Nord-Kivu prints no count, so the isolation stream leaves out 16 October.
    From SitRep 156 Nord-Kivu prints its beds only as the fraction behind its CTE/CT occupancy rate, which gives 410 beds, and the care scanner reads that form.
    SitRep 159's Haut-Uélé care paragraph carries the day before forward, so the province care blocks leave it out, as for SitRep 152.
    The onset curve adds none of SitReps 155 to 159: 155 and 157 reprint earlier figures, 156 redraws SitRep 154's extract, and 158 and 159 misread 14 May as SitReps 153 and 154 do.
    data/onset_dashboard_history.csv adds the dashboard snapshots of 7, 8, 9, 12, 15, 16 and 19 October.
    Fitted values change with the new data.
    SitRep 135's figure is by notification date rather than onset date, so the onset curve does not add it (#644).
    SitRep 136's onset figure is added, after a reader fix that stops it dropping bars on tick columns (#1018), and SitRep 137 reprints it.
    The reader's weekly tick chain now steps over split and missing ticks, which leaves every earlier block unchanged.
  • The onset curve adds SitRep 143 (4 October) and SitReps 144 and 145, which reprint its figure, after two reader fixes (#1106).
    A day between two outline columns of the same height is read again without the gridline skip when it reads below both and a washed column beside its tick shows fill but no outline, so 14 September reads 62 rather than 24.
    Inside the pink incomplete-data band a day whose columns disagree reads the level run of columns centred nearest it, so 30 September and 1 October read 23 and 7 rather than 31 and 15.
    A rebuild changes seven earlier cells in the band, after which none of their dates falls between consecutive vintages: 7 September in SitReps 118 to 120 (17, 26 and 24 to 9, 14 and 17), 129's 18 September (13 to 5) and 19 September in 130 to 132 (16, 16 and 27 to 2, 2 and 10).
    On onset dates more than 56 days before the report, SitRep 143 differs from the dashboard's 2 October snapshot by 0.38 cases a day and at most 5 (scripts/compare_onset_sources.py).
  • The tick-column re-read above now also fires when the two bounding outlines differ in height.
    A day on a tick is read again, without the gridline skip, when every column's skipped run falls more than two counts short of its own unskipped run and that unskipped run reaches either outline (#1138).
    SitReps 150 and 151 still stay out of the onset curve.
    SitRep 150's 29 July reads 69 against 51 from day-grid drift rather than a tick-column break, and SitRep 151's larger render reads a phantom bar of 3 on 12 October, a day on which the figure draws no bar.
  • The dashboard onset history reads the daily counts embedded in the page, since the INRB-UMIE dashboard draws its onset charts in the browser from 25 September (#1062).
    It adds the 2 October snapshot, the first since 23 September, and the earlier rows are unchanged.
    On the 23 September data, built both ways, the counts and the old chart reading agree on every row.
  • The onset curve adds SitReps 139, 140 and 141 (30 September to 2 October), after three reader fixes (#1061).
    The weekly tick row leaves out the date labels' tops, which moved single ticks on these renders and shifted runs of days onto their neighbours.
    A washed bar on a tick column is read again without the gridline skip, capped at its outline columns.
    Past the last tick only dark outlines bound a day, and a day whose columns disagree is read from its centre column, so the last faded bars no longer repeat the bar before them.
    A rebuild changes six earlier cells, each towards its neighbouring vintages: SitRep 100's 17 August (0 to 15), 113's 2 September (22 to 16), 121's 9 September (22 to 9) and 128's 15 September (25 to 14), and adds 112's 2 September and 126's 16 September (2 each).
    SitRep 138 stays out, because its render loses the outline between the 15 and 16 June bars and 16 June reads 40 against 28 to 29 elsewhere.
  • data/observations.toml carries per-health-zone confirmed cases and deaths to SitRep 154 (15 October), including Alimbongo (Nord-Kivu) from SitRep 141, scanned from Tableau 2 including the caption that drops de santé from SitRep 124, and data/health_zones.csv and src/assets/health_zones.geojson hold the zone boundaries (#779, #979, #980).
    Dakwa (Bas-Uélé), new at SitRep 147, has no polygon in the Ministry of Health health-zone map, so its case is carried in the Bas-Uélé unallocated row until the zone is mapped.
  • province_admissions_history block, sparse by province, to SitRep 159 (20 October), and province beds raised to the rate-implied beds where the patients exceed a stale printed count (#958).
  • Where a health zone's cumulative count falls, its increment takes the report's printed 24h figure for that zone rather than the clamped zero (#1161, resolves #750).
    The figures are read from Tableau 2 on the flagged zone-vintages only: 6 of the 8 case falls and 8 of the 9 death falls, with the three falls of 11 June predating the 24h columns.
    Only three of those figures are non-zero: Butembo's 4 cases and Bunia's 7 and Bambu's 4 deaths on 22 July.
    The death composition still leaves out the vintages with a zone fall, so the one change the health-zone fit sees is Butembo's 4 cases in the Nord-Kivu composition on 22 July.
    Fitted health-zone values change.

Report

  • Kath Sherratt and Samuel Brand move from the authors to the acknowledgements, as authors of versions 1.0.0 to 3.0.0 (#1176).
  • The README, the About page and CITATION.cff ask users to cite this project and the INSP and WHO situation reports only; the prior work moves to the README's further references (#1176).
  • The spatial hyperparameter pair plot against the prior moves from the province estimates to the province in-sample checks, where it replaces a pair plot of every province's reproduction number and case total.
  • Tables with more than ten body rows are compact, scroll inside a box with a sticky header, and have a row filter and sortable columns.
    Sorting is numeric where a column holds numbers, by the first number in a cell such as "1.2 (0.8–1.9)" or "12%".
    Smaller tables, and every table without JavaScript, render as before.
    The site's theme entry extends the DocumenterVitepress default, which the docs build copies from the installed package.
  • The province and health-zone in-sample pages follow each area's estimates across releases, as the national page does (#1174).
    The province page shows each province's reproduction number, confirmed cases and case-fatality ratio at every release, and the zone page the reproduction number and confirmed cases of the twelve zones with most cases.
    scripts/score_releases.jl collects them from each release's province_estimates.csv and zone_estimates.csv into data/province/released_estimates.csv and data/zone/released_estimates.csv, skipping a release without the table.
    The basename is already excluded from the fit hash, so the fit keys do not change, and neither do the fitted values.
  • The health-zone overview and point prevalence tables list every zone, in place of the top twenty with every zone in a fold.
    The zone forecast table lists every zone, in place of the top fifteen.
    The figures still show the leading zones.
  • The summaries at the top of the in-sample and forecast evaluation pages give their per-stream and per-province scores as a table rather than a bullet per row.
    The national in-sample table marks which streams are still reporting and replaces the folded calibration table further down that page.
    A value that was not scored reads n/a.
  • Past province and health-zone forecasts against what was observed are shown only on the forecast evaluation pages, not also on the forecast pages.
    Each forecast page links to its evaluation section instead.
  • The past province and health-zone forecasts are drawn as a grid of three columns, one panel per province stream or zone, rather than a single column.
  • The dashboard map's detail draws the posterior predictive of the weekly confirmed cases and deaths over the observed bars, on by default with a toggle, and a new fit metric shades each area by where its latest week's count falls in that predictive (#1173).
    The province and national predictive is the joint's, split by the fitted province shares as the province in-sample page scores it.
    The zone predictive is the zone composition's for the cases, which splits each patch's observed count across its zones.
    The zones carry no deaths predictive, since the model drops the reattributed death vintages that the observed series keeps.
    The model and the fitted values do not change.
  • The dashboard map has a date slider under its title that every metric follows, with a play button that steps it a week at a time (#1168).
    The reproduction number, the confirmed cases and deaths to date and over the past 7, 14 and 28 days, and the reported treatment-centre figures come from the map's time series on that date.
    The counts are whole weeks ending on the cut-off's weekday, and the total to date is the cut-off's total less the later weeks.
    The estimates without a series take the latest saved cut-off on or before the date, or stay at the cut-off when no earlier one is saved.
    The colour classes are the cut-off's at every date, and at the cut-off the map is unchanged.
    The detail charts show the last 4 or 8 weeks or the whole series, 8 weeks by default, with the reproduction number's axis fitted to the period shown and a rule on the map's date.
    The date logic sits in its own script with Node tests that pre-commit runs.
    The model and the fitted values do not change.
  • The province and health-zone estimates report point prevalence at the cut-off: the people infected but not yet symptomatic and the people with symptoms who have not yet been detected, per 100,000 residents.
    A figure ranks the areas by the rate in the community.
    Each posterior draw gives its own prevalence from its daily infections and delays, and the methods give the calculation.
    The model and the fitted values do not change (#1119).
  • A plot of each province's and health zone's confirmed cases over the past week against its reproduction number leads the province estimates, sits under the zone maps and is on the summary page (#1072, resolves #1054).
    Faint bars span the 90% credible interval of the reproduction number, and of the cases for the forecast, so an uncertain estimate draws a long bar rather than a precise dot.
    A faded triangle marks the week before and, for provinces, a hollow point the forecast week ahead.
    Fitted values do not change.
  • The summary page keeps to the headline numbers, tables and figures, with one line pointing to the methods.
    It drops the abstract, which stays on the home page, and the method notes move to the methods page.
    Each table and figure that needs one has a caption giving what it shows and its interval, in place of the prose under it (#1118).
    The health-zone table ends with the number of zones that had a confirmed case over the past two weeks.
  • The summary page has a province map of modelled infections to date and a compact province table of infections to date, the reproduction number at the cut-off and the latest week's confirmed cases.
  • The summary page keeps the zone maps and the confirmed cases against the reproduction number by zone, and drops the zone forecast figure.
  • The cases against reproduction number plot nudges apart the labels of nearby points and is drawn at the page width on the summary page.
  • The health-zone estimates page drops the zone reproduction-number trajectories and the zone ranking figure.
    The table gives each zone's reproduction number in the ranking order, and the in-sample zone page keeps the zone trajectories against the frozen fit.
  • The methods define the reproduction number in words and state the credible-interval convention and the sampler diagnostics.
  • Every fit uses the headline joint's sampler settings, and the methods page states them (#1100).
    These are two chains of 1000 draws after 1000 warm-up steps, at a target acceptance of 0.80 and a tree depth of at most 10.
    The single-stream fits, the health-zone fits, the frozen re-fits and the scripts that fit outside the docs build take them from joint_sampler_args() in docs/fits/registry.jl, so a change there moves every fit.
    The single-stream fits ran 500 draws after 200 warm-up steps at 0.85, the single-population frozen re-fits the same at 0.90, and the health-zone fits 800 draws.
    Every fit cache key changes, so every fit refits.
    The single-stream and single-population frozen fits now take twice the draws and 5 times the warm-up, and the health-zone fits a quarter more draws, so each runs longer.
    The frozen re-fits also drop their target acceptance from 0.90 to 0.80, which takes larger steps and may give more divergences.
    The parameter-recovery fits drop their target acceptance from 0.85 to 0.80, and scripts/zone_fit_report.jl fits at these settings rather than 600 draws after 400 warm-up steps.
    BVD_RECOVERY_SAMPLES, BVD_RECOVERY_WARMUP and BVD_RECOVERY_MAX_DEPTH are removed, since the BVD_JOINT_* overrides now set the recovery fits too.
  • The dashboard page keeps a short lead and links the methods and estimates pages, and the map's legend and detail column use short labels (resolves #1089).
  • The map's summary, zone filter, window and R-source menus sit behind an Options disclosure that counts the settings in use, and its K menu shows only for the chance of K+ cases (resolves #1078).
    On a phone the metrics scroll in one strip, so the controls take four short rows rather than a screen.
  • The map's summary menu shows only for the metrics with a 90% interval rather than sitting greyed out, and the Options control is hidden on the province layer when it has nothing to hold (#1078).
  • The methods open with a model overview and three diagrams: the joint model's generative chain, its province patches coupled by importation, and what the health-zone model takes from the joint fit.
    The diagrams are TikZ sources rebuilt by scripts/build_diagrams.sh, and fitted values do not change (#1073).
  • The methods score the confirmed positives as a beta-binomial with its intra-window correlation and prior, as the model does, not as a binomial (#1073).
  • The health-zone methods are shorter and say plainly what the zone model takes from the joint model: sampled weekly patch infections and origin intensities, fixed delays and mean import odds, and inherited priors (resolves #1057).
  • The outbreak size, reproduction number and basic reproduction number by past release move to the national in-sample checks, and the summary page links them (resolves #1058).
  • The dashboard map shows confirmed cases or confirmed deaths for its forecast, to-date and weekly views, names the count in every label, and adds a view of the modelled, delay-adjusted case fatality ratio for provinces and the country (resolves #1053).
  • The dashboard map gains a treatment-centre view by province: patients in isolation, beds and the share of beds in use, each as last reported, as modelled at the cut-off and as forecast a week ahead, with the reported series in the detail column.
    Health zones report no treatment figures, so the view opens the province layer.
    Admissions are not shown, since the observations carry them for the country only.
    Fitted values do not change (#1080).
  • The dashboard map has a box that finds a health zone or province by name and zooms to it, and clicking a table row, or pressing Enter on it, does the same (#1079).
    This also gives a keyboard route to every area.
    Show national zooms back out to the whole map.
  • In the narrow layout the dashboard map's legend sits under the map in two columns rather than covering most of it (#1079).
  • The dashboard map has a compare menu beside its data date that sets an earlier cut-off's estimates beside the current ones: under each figure in the detail column, dashed in its reproduction number and weekly charts, and in the tooltips (#1114).
    The map keeps the current shading, and the menu shows only when the build carries an archive of earlier cut-offs.
  • The overall fit diagnostics table on the National estimates page and the Summary dashboard gains the tail effective sample size (#1051).
    The health-zone model's diagnostics stay on the Health-zone estimates page, so the national page no longer needs the health-zone fit.
  • The Province estimates page gains a table of the joint fit's province-level parameters (#1051).
  • Two in-sample checks move from the estimates pages to the in-sample pages: the zone reproduction numbers against the fit a week earlier, and the latest onset figure against its posterior predictive by onset date.
    Fitted values do not change (resolves #1055).
  • The report pages describe each figure and table in a caption beneath it rather than in the prose above it, and drop prose that repeats the methods, the limitations or another page (#1127).
    Fitted values do not change.
  • The confirmed-cases and confirmed-deaths single-stream models are fitted at each of the three May frozen cut-offs and scored alongside the frozen joint (resolves #513).
    They are the only streams with truth to score from those cut-offs, so the frozen comparison of the joint against each stream's own model now covers every May cut-off rather than the one-week-back cut-off alone.
    Existing fitted values do not change.
  • The methods page states every production prior, the per-stream dispersions, the onset-to-sample constraint and the 139-genome genetic bound, and its captions and limitations match the code (#1205).
  • The write-up drops prose that repeats the methods page or another section, and development narrative (#1207).

Infrastructure

  • The depot cache prune keeps a running docs build's docs-env cache, so the later jobs load the compiled package from list rather than compiling it again (#1229).
  • The zone parent extract is written beside the fit cache rather than into it, so a joint-type fit cache no longer carries an 86 MB copy nothing in the build reads (#1238).
  • The cache prune also removes superseded fit caches, and pull-request fit caches while the repository is over budget, so main's fits are not evicted (#1236).
  • The docs deploy waits on the health-zone pages, so a failed zone render skips the deploy (#1175).
  • The docs fits save their chain to the cache as soon as sampling ends, so a fit that finishes near the job's time limit is kept if the job is then cancelled, and the re-run loads it rather than refitting.
  • The docs build keeps its resolved manifest for ten days rather than three, so a re-run of failed jobs after a long fit can still pin it.
  • The benchmark driver turns off Pkg's automatic precompilation, which under Julia 1.13.2 fails with "Unknown package" on indirect dependencies after AirspeedVelocity adds its own packages.
  • The docs commit their own docs/package.json, which pins @nolebase/vitepress-plugin-enhanced-readabilities and @nolebase/ui to 2.18.2.
    Their 2.21 releases on 13 and 14 October 2026 require vitepress 2, so npm install failed on the DocumenterVitepress 0.3.6 template, which asks for ^2.18.2 alongside vitepress 1 (#1134).
  • The formatter environment pins Runic to 1.11.1 again, matching the pre-commit hook, and Dependabot no longer proposes Runic bumps, which have to reformat the tree in the same commit.
  • Each release carries all five tables the dashboard map reads, adding the zone time series and the province and national estimates and time series to the zone estimates it already carried (#1114).
    scripts/archive_dashboard.jl collects them from the newest release of each of the last 14 data cut-offs, and the deploy from main stages them under zone_map/archive/ with an index, leaving them out of pull request previews and site.zip.
    Releases from before this change do not carry the tables and are left out.
  • The per-fit job summary, the convergence gate report and each fit's diagnostics bundle give, per chain, the share of draws at the tree-depth cap, the mean acceptance statistic and the energy fraction of missing information beside the step size, so a fit that spends every draw at the cap is visible in CI (#1093, part of #1060).
    The cached CI headline joint fit joint__71835cdb61145210 (SitRep 136) reaches the cap of 10 on every draw of both chains, at a step size of 0.0015, with mean acceptance 0.95 against its target of 0.80 and E-BFMI 0.84 and 0.81.
    Fitted values do not change.
  • The joint-model fits, and the health-zone fits that take their warm-up, run 1000 warm-up steps where they ran 500 (#1109, part of #1060).
    In one CI build on SitRep 143 the headline joint reached R-hat 1.03 with bulk ESS 95, against 1.10 and 1.11 in main's last two builds, and took 2 h 53 min, about 35 minutes longer.
    frozen_validation still reached R-hat 1.09.
  • Every fit in the docs build, the parameter-recovery fits and the health-zone scripts run 750 warm-up steps where they ran 1000 (#1193, part of #1186).
  • Four slow test items that each built their own live-data bvd_joint sample production_joint instead, which the suite compiles anyway (#1005).
    The two-phase seeding test checks its identities on prior draws and takes one Mooncake gradient, rather than a NUTS fit of a model with no data.
    The gradient keeps the coverage job running the renewal and knot-interpolation rules, which the AD job tests but does not report coverage for.
    In the coverage job of run 38192361183 the five items took 486 s of the 70-minute run, 169 s of it the seeding fit.
    Run together locally with the province case-fatality item, which now reuses the same compiled model, the six take 437 s rather than 729 s.
  • Each parameter-recovery seed uploads its per-parameter diagnostics ranked by R-hat and its per-chain sampler table, and the recovery report's per-seed table gives each chain's step size and the three parameters with the highest R-hat (#1088).
    An unconverged seed can then be traced to a parameter and to a stuck chain from the artifact.
    Fitted values do not change.
  • The benchmark suite times the health-zone model and its kernels, on a synthetic zone dataset of 60 zones, 4 patches, 150 days and 95 vintages (#996).
    They run by default, the benchmark workflow's run included, and BVD_BENCH_ZONE=false leaves them out of a local run.
    The zone tests and the benchmark build that dataset from one shared fixture.
    The kernels take their inputs from the zone model's own draw construction, so they follow any change to the model.
  • Test comments and the comments and docstrings of the report-side source drop filler, emphasis caps and development narrative (#1197).
  • The repository docs, workflow comments, Taskfile descriptions and script comments drop filler, emphasis caps and development narrative (#1196).
    Fitted values do not change.

Fixed

  • Report-side docstrings and the counterfactual axis label match the code (#1208).
  • The province and zone in-sample pages give their estimate-evolution sections their own anchors, so the links to the national section resolve again (follows #1174).
  • The embedded dashboard map grows its frame to fit its page in the narrow layout, so the layer switch no longer scrolls out of reach inside the frame (resolves #1052).
  • The onset forecast model no longer boxes its sampled scan scale inside the interval comprehension, so the boxed-captures check passes again.
  • The test environment declares the Downloads and Base64 standard libraries the SitRep downloader loads, so its tests run under the sandboxed test runner.
  • The national and province forecast summary tables show by default instead of being folded away behind their own dropdown (#1056).
  • Two patch-model tests pinned values the SitRep 141 data moved past, and now check the property each was written for (#1065).
    The province positivity test asks that Ituri's positivity exceed Nord-Kivu's by more than binomial sampling noise, not by a factor of two.
    The seed-prior test brackets the Nord-Kivu share at the first province report, the level the seed sets, rather than the share over the whole window, which also carries the later rise.
    Fitted values do not change.
  • The province bed and overview tables leave non-finite draws out of each cell and print "—" when none is finite, instead of failing; the province bed table test seeds its prior draws (#1086, resolves #1063).
  • Admissions are uncensored in the fit and in the forecast (#918).
  • The cut-off occupancy and bed shortfall are on the reported scale, the demand plus the reclassification offset (#640).
  • Province occupancy is the national modelled occupancy split on the demand shares, the basis the likelihood and forecast use, so a province over its beds, as Nord-Kivu prints, shows its patients above the beds rather than a capped occupancy (#920).

What's Changed

  • model(capacity): widen the growth SD prior to N⁺(0, 0.05) by @seabbs-bot in #1050
  • fix: the two test failures on main (boxed onset-forecast capture, sandboxed SitRep downloader tests) by @seabbs-bot in #1068
  • docs(methods): shorten the health-zone model and clarify its joint inputs by @seabbs-bot in #1070
  • docs: move the past-release checks to the national in-sample page by @seabbs-bot in #1071
  • docs(report): move misplaced in-sample checks to the in-sample pages by @seabbs-bot in #1069
  • fix(forecasts): unfold the national and province summary tables by @sbfnk-bot in #1067
  • data: advance to SitRep 141 (2 October) by @seabbs-bot in #1064
  • docs(methods): model overview with three reviewed TikZ diagrams by @seabbs-bot in #1073
  • model(onsets): draw the reporting hazard's delay deviations centred (#1060) by @seabbs-bot in #1074
  • Dashboard: treatment-centre view by province (patients in isolation, beds, beds in use) by @seabbs-bot in #1080
  • fix(summaries): drop non-finite draws in the median and interval cells by @seabbs-bot in #1086
  • perf(zone): build the relative-multiplier bases once, not per gradient by @seabbs-bot in #1081
  • Dashboard: confirmed deaths and case fatality ratio; keep the layer switch in reach by @seabbs-bot in #1059
  • Dashboard: less text, compact controls on phones by @seabbs-bot in #1090
  • model(zones): carry the generation interval and delay uncertainty into the health-zone model by @seabbs-bot in #1085
  • Add tail ESS and health-zone rows to fit diagnostics, add province diagnostics by @sbfnk-bot in #1066
  • data(onsets): digitise SitReps 139 to 141 after three reader fixes by @seabbs-bot in #1097
  • feat(fits): report tree-depth saturation, acceptance and E-BFMI per chain by @seabbs-bot in #1093
  • model(patch): draw the province deviation level centred on its scale by @seabbs-bot in #1083
  • build(deps): update Runic requirement from =1.11.1 to =1.11.1, 1.12 in /test/formatter by @dependabot[bot] in #1075
  • ci(format): pin Runic to 1.11.1 again and stop Dependabot bumping it by @seabbs-bot in #1101
  • data(onsets): read the dashboard's embedded onset counts by @seabbs-bot in #1095
  • model(onsets): centre the read SD prior on one figure pixel by @seabbs-bot in #1099
  • fit(joint): 1000 warm-up steps for the joint-model fits by @sbfnk-bot in #1109
  • data: advance to SitRep 145 (6 October) by @seabbs-bot in #1113
  • fit(capacity): sample the first week's growth, not the base growth and first step by @seabbs-bot in #1102
  • perf(model): sample the national Rt walk's knots as the total log Rt, ramp included by @seabbs-bot in #1124
  • fix(onsets): read SitRep 143's tick-column and faded band bars, digitise SitReps 143 to 145 by @seabbs-bot in #1120
  • fit: every fit uses the joint's sampler settings by @seabbs-bot in #1100
  • docs(estimates): drop the health-zone fit from the national estimates page by @seabbs-bot in #1098
  • docs(report): move figure and table descriptions into captions and trim repeated prose by @seabbs-bot in #1127
  • data: advance to SitRep 149 (10 October) by @seabbs-bot in #1128
  • perf(model): centre the background split and capacity share deviations by @seabbs-bot in #1123
  • docs: trim the summary page, add a province map and table, caption the figures by @seabbs-bot in #1118
  • fix(docs): pin the nolebase readability plugin for vitepress 1 by @seabbs-bot in #1134
  • feat(report): report point prevalence by province and health zone by @sbfnk-bot in #1121
  • fix(benchmark): turn off Pkg auto-precompile in the benchmark driver by @seabbs-bot in #1140
  • docs(prevalence): one community-rate figure, and infected but not yet symptomatic by @sbfnk-bot in #1143
  • data: advance to SitRep 159 (11 to 20 October) by @seabbs-bot in #1141
  • build(deps): update DocStringExtensions requirement from 0.9 to 0.9, 0.10 by @dependabot[bot] in #1150
  • feat(dashboard): compare the map with an earlier data cut-off by @seabbs-bot in #1130
  • fix(dashboard): show the summary menu and Options only when they apply by @seabbs-bot in #1129
  • test: share one compiled headline model across slow test items by @seabbs-bot in #1131
  • feat(recovery): record which parameter and which chain fail by @seabbs-bot in #1135
  • model(patch): multivariate normal prior on the importation flows, centred on gravity by @seabbs-bot in #1030
  • perf(benchmark): add the health-zone model and its kernels to the benchmark suite by @seabbs-bot in #1136
  • ci(docs): save each fit to the cache as soon as sampling ends by @seabbs-bot in #1156
  • fix(docs): retry the gh-pages deploy when another writer wins the push by @seabbs-bot in #1158
  • model(treatment): give the daily treatment flows their own dispersion by @seabbs-bot in #1103
  • model(cases): bound the province suspected-case ascertainment in the model by @seabbs-bot in #1153
  • data: advance to SitRep 162 (23 October), onset curve to SitRep 160, with reader fixes for #1138 and #1148 by @seabbs-bot in #1154
  • fix(treatment): province beds, occupancy and admissions on one uncapped basis by @seabbs-bot in #969
  • test(detection): drop the province admissions split in the no-care joint by @seabbs-bot in #1165
  • data(zones): take the printed 24h figure on flagged zone falls by @seabbs-bot in #1161
  • feat(scoring): fit confirmed and confirmed-deaths single-stream models at the May frozen cut-offs by @seabbs-bot in #1163
  • model(delays): LogNormal prior on the onset-to-admission Gamma scale (#1087) by @seabbs-bot in #1155
  • feat(dashboard): posterior predictive over the weekly counts and a fit-vs-data map metric by @seabbs-bot in #1173
  • data(isolation): add the 23 October occupancy reclassification break by @seabbs-bot in #1172
  • docs: show past province and zone forecasts only on the evaluation pages by @seabbs-bot in #1169
  • docs(evaluation): tabulate the per-stream summary scores by @seabbs-bot in #1167
  • feat(report): province and zone estimate evolution across releases by @seabbs-bot in #1174
  • docs(theme): compact, scrollable, filterable and sortable large tables by @seabbs-bot in #1171
  • data: advance to SitRep 163 (24 October) by @seabbs-bot in #1166
  • docs(province): pair the spatial hyperparameters against their prior by @seabbs-bot in #1170
  • docs(zone): list every zone in the overview, prevalence and forecast tables by @seabbs-bot in #1177
  • chore: open v3.1.0 after the v3.0.0 release by @seabbs-bot in #1176
  • data(care): leave out Bas-Uélé's repeated care paragraphs on SitReps 155 and 156 by @seabbs-bot in #1180
  • fix(docs): give the area estimate-evolution sections their own anchors by @seabbs-bot in #1187
  • data: advance to SitRep 164 (25 October) by @seabbs-bot in #1185
  • build(deps): update JET requirement from 0.10, 0.11, 0.12 to 0.10, 0.11, 0.12, 0.13 in /test/jet by @dependabot[bot] in #1182
  • data: advance to SitRep 169 (30 October) by @seabbs-bot in #1189
  • ci(docs): cut the joint fits' warm-up to 750 iterations by @seabbs-bot in #1193
  • feat(data): add a [skip_dates] manifest block by @seabbs-bot in #1194
  • docs: cut filler and narration from the repository docs, workflows and scripts by @seabbs-bot in #1196
  • docs: cut filler and narration from tests and report-side source comments by @seabbs-bot in #1197
  • data: advance to SitRep 170 (31 October) by @seabbs-bot in #1191
  • docs: align the write-up with the model code by @seabbs-bot in #1205
  • docs(src): align report-side docstrings with the code by @seabbs-bot in #1208
  • docs: cut duplicated, stale and narrative prose from the write-up by @seabbs-bot in #1207
  • refactor: remove dead code found in the fluff sweep by @seabbs-bot in #1210
  • docs: answer the review on the fluff sweep by @seabbs-bot in #1202
  • test(docstrings): read the argument check as one any() by @seabbs-bot in #1215
  • perf: sum-to-zero bases pass no derivative by @seabbs-bot in #1213
  • docs: link results pages to the methods instead of restating them by @seabbs-bot in #1216
  • perf: skip the identity re-weighting of the patch BVD admissions by @seabbs-bot in #1212
  • docs(methods): tighten the observation models by @seabbs-bot in #1220
  • docs(methods): tighten the data, infection and delay sections by @seabbs-bot in #1221
  • docs(methods): tighten the joint, health-zone and fitting sections by @seabbs-bot in #1218
  • perf: rules for the per-patch treatment kernels by @seabbs-bot in #1217
  • docs: state what results-page captions show without contrasts by @seabbs-bot in #1222
  • docs(methods): state the data, infection and delay sections positively by @seabbs-bot in #1223
  • docs(methods): mechanism-only pass on the joint, zone and fitting sections by @seabbs-bot in #1224
  • docs(methods): state the observation models positively and split long paragraphs by @seabbs-bot in #1225
  • ci(docs): log why the compiled package is rejected, and gate the deploy on the zone pages by @seabbs-bot in #1175
  • docs(methods): state how the scan SD and zone correlation prior are set by @seabbs-bot in #1227
  • perf: carry the patch onsets through convolve_rows by @seabbs-bot in #1231
  • ci: keep the docs depot cache of a running build by @seabbs-bot in #1229
  • test: drop the death block's skipped vintages from the province grid check by @seabbs-bot in #1234
  • perf: build the patch Rt and importation matrices in Mooncake rules by @seabbs-bot in #1233
  • perf(patch): bin the per-patch confirmed and death rows through one rule by @seabbs-bot in #1200
  • ci: prune superseded and pull-request fit caches by @seabbs-bot in #1236
  • ci(docs): keep the zone parent extract out of the fit cache by @seabbs-bot in #1238
  • perf(composition): skip stick-breaking rows with no trials and no count by @seabbs-bot in #1195
  • data: advance to SitRep 171 (1 November) by @seabbs-bot in #1237
  • perf: closed-form Mooncake rule for the censored delay PMF by @seabbs-bot in #1228
  • perf(fit): run BLAS on one thread while the chains sample by @seabbs-bot in #1240
  • Fix/methods text clarifications by @ch-holt in #1243
  • perf(zone): build the kernel blocks and import fractions in Mooncake rules by @seabbs-bot in #1242

New Contributors

Full Changelog: v3.0.0...v3.1.0