Skip to content
Methods

Reference checks

Reference checks: Drybench Bioreactor

This page lists the reference checks published for Drybench Bioreactor. Each set gives the methods it covers, what the expected values were computed with, the number of cases, the tolerance the app must meet, the date, and the file holding the inputs and expected outputs, so you can open a case and compare it with what the app gives.

Every case was chosen and recorded by the Drybench team; none has been independently reviewed. A reference check tests the calculation, not your data, your experiment or whether a model suits it. Methods without a set are listed on the methods page with their level.

Methods and levelsDocumentation

These checks test the equations and their solution, not the preset parameter values, which have not been independently reviewed.

Published sets

Published verification sets

MethodsOracleFixturesToleranceDateFile
unstructured-growth-model, modified-rosenbrock, dissolved-oxygen-balanceSciPy33each point within the larger of 1e-5 of its value, a time shift of max(1e-4 h, 1e-5 of the elapsed time) times its slope, and its floor; events within 1e-3 h; the carbon and electron balances within 0.5 percent2026-10-07scenarios.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
unstructured-growth-modelSciPy4the chemostat's steady states and washout, and a batch run's implicit closed form, within 1e-3 relative2026-10-07analytic.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
dissolved-oxygen-balance, van-t-riet-klaSciPy22air saturation to the USGS DOTABLES output's rounding; the exhaust gas and kLa within 1e-9 relative2026-10-07transfer.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
scale-up-rulesSciPy3constant power per volume and tip speed within 1e-9 relative; constant-kLa speed within 1e-6 relative2026-10-07scaleup.jsonRecorded for version 0.2.0; the test suite checks the current engine against it.
dissolved-oxygen-balanceSciPy4Feed dissolved oxygen and a reference-basis gas flow: 4 chemostat cases rerun under the pinned SciPy 1.17.0, each output within 0.5 percent of its peak with the accuracy agreement and its time-shift allowance, events within 1e-3 h, closures within 0.5 percent; the 11 October file is kept unchanged and listed in no manifest2026-10-24transport-0.8.0.jsonRecorded for version 0.8.0; the test suite checks the current engine against it.
bioreactor-batch-fitSciPy20Batch μmax estimate: 20 cases with tolerances frozen before any engine code; μmax within 3 times the sum of the oracle's and the engine's spreads, the objective within its frozen envelope, each case's verdict (resolved, not resolved, refused) and its reasons exact2026-10-24batch-fit-0.9.0.jsonRecorded for version 0.9.0; the test suite checks the current engine against it.
bioreactor-batch-fitPython20The practical flags on 0.9.0's 20 cases (weak profile, near competing minimum, second minimum, misfit) by arithmetic on 0.9.0's stored values, no new oracle computation; flags and applicability exact. Supersedes 0.10.0, the same flags under a manifest without the values, kept write-once2026-10-24batch-fit-flags-0.11.0.jsonRecorded for version 0.11.0; the test suite checks the current engine against it.
bioreactor-batch-fitSciPy33Batch μmax estimate for bioreactor-batch-fit 1.1.0: 0.9.0's 20 cases byte-equal and 13 cases on the initial state from the t = 0 readings; 0.9.0's rules, with bound-contact disregarded on an exactly flat objective; verdicts, codes and reasons exact2026-10-25batch-fit-0.13.0.jsonRecorded for version 0.13.0; the test suite checks the current engine against it.
measured-comparison-time-alignmentPython fractions8elapsed hours exact where the reduced fraction's denominator is a power of two and within 1e-15 h otherwise; row identity and order, raw responses, roles, exclusions and qualification codes exact. The file's 12 refusal entries name a code and its fault but carry no inputs2026-10-19measured-comparison-0.3.0.jsonRecorded for version 0.3.0; the test suite checks the current engine against it.
measured-comparison-time-alignmentPython fractions3each case carries its inputs; the failing reference rule and its code, the dropped reference and its claimed hashes exact; elapsed hours as in 0.3.02026-10-20measured-comparison-0.4.0.jsonRecorded for version 0.4.0; the test suite checks the current engine against it.
measured-comparison-time-alignmentPython fractions25Measured-run comparison completion set: 25 cases with complete inputs, every refusal code and the simulation-reference alignment (Python fractions and hashlib, 3.12.14); refusal codes, hashes and qualification codes exact, elapsed hours as in 0.3.02026-10-24measured-comparison-0.5.0.jsonRecorded for version 0.5.0; the test suite checks the current engine against it.
kla-value-scaledNumPy18kLa from your value or readings: 18 settings against NumPy float64 (value and readings; agitation, gas flow, volume, reference-basis flow, Hughmark's cap) within 1e-12 relative; the non-coalescing exponents checked as arithmetic only2026-10-24kla-scaling-0.6.0.jsonRecorded for version 0.6.0; the test suite checks the current engine against it.
feed-lawPython decimal16Feed laws and pump sheet: 12 feeds and 4 design rates against Python decimal at 40 digits (constant, exponential, pump limit, the rescue's cap, the Vmax and end-time stops, every pump-sheet row and total) within 1e-12 relative2026-10-24feed-0.7.0.jsonRecorded for version 0.7.0; the test suite checks the current engine against it.
feed-handoffPython fractions86Feed hand-off: 14 schedules over the published pump sheets, 15 programmes (stop, total fed, refused incomplete programmes) and 57 substrate matches on the shipped table bioreactor-substrate-identity@1 (its keys recomputed by RDKit from a PubChem snapshot) against Python fractions (exact), within 1e-12 relative; keys, stops and refusal codes exact2026-10-24feed-handoff-0.12.0.jsonRecorded for version 0.12.0; the test suite checks the current engine against it.
feed-handoffPython fractions39Feed agreement: 27 cases and 12 of the preparation as received; exact2026-10-28feed-agreement-0.14.0.jsonRecorded for version 0.14.0; the test suite checks the current engine against it.
product-compositionPython fractions62Product composition: 21 formulas (C-mol mass, mass fractions, degree of reduction), 15 refusals, 18 yield cases with their carbon and electron bounds and verdicts, and 8 field cases, against Python fractions; exact, feasible at equality2026-10-31product-composition-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it.
unstructured-growth-modelSciPy12Product closures: 10 runs with a product unlike biomass, carbon and electron closure within 1e-7 at every output and switch, Radau against BDF within 1e-6 of peak, a chemostat's closed form within 1e-6; two negative controls2026-10-31product-closure-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it.
unstructured-growth-modelSciPy33The reduction: the 33 scenarios of 0.2.0 with the allocation at the product's defaults, within 0.2.0's tolerances and within 1e-9 of each series' peak (worst 6.8e-10)2026-10-31product-reduction-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it.

Oracles and build-time tools

Software the app's numbers were checked against, or its data built with. None of it ships with the app or is a dependency of it.

  • SciPy 1.17.0 (BSD-3-Clause; Oracle; 2026-10-07). solve_ivp's Radau method at a relative tolerance of 1e-9 on the same equations, which wrote the scenario, closed-form, transfer and scale-up fixtures
  • NumPy 2.3.5 (BSD-3-Clause; Oracle; 2026-10-07). the one-step and linear-solve checks against LAPACK, and the oracle's arithmetic
  • Python 3.12.14 (PSF-2.0; Build-time tool; 2026-10-07). running pipeline/bioreactor-simulator/reference.py offline, and deriving the batch estimate's practical flags (verification 0.11.0) by arithmetic on 0.9.0's stored values, standard library only; never shipped
  • Python fractions 3.9.6 (PSF-2.0; Oracle; 2026-10-19). exact rational elapsed hours for the measured-run comparison's time alignment (pipeline/bioreactor-simulator/reference-measured-comparison.py)
  • Python fractions 3.13.16 (PSF-2.0; Oracle; 2026-10-20). the measured-run comparison with a failed simulation reference: exact elapsed hours, the reference rules restated and the snapshot SHA-256 recomputed by hashlib (pipeline/bioreactor-simulator/reference-measured-comparison-2.py)
  • Python decimal 3.12.14 (PSF-2.0; Oracle; 2026-10-24). the feed laws and the pump sheet at 40 digits: constant, exponential and capped feeds, the Vmax and end-time stops, every pump-sheet row and total, and the design rates (pipeline/bioreactor-simulator/reference-feed.py)
  • Python fractions 3.12.14 (PSF-2.0; Oracle; 2026-10-24). the measured-run comparison's completion set: every refusal code and the simulation-reference alignment with complete inputs, exact elapsed hours and the hashes recomputed by hashlib (pipeline/bioreactor-simulator/reference-measured-comparison-3.py); and the feed hand-off, exactly: the schedule's units, mass flow and substrate mass over the feed's published pump sheets, the programme a feed recipe carries with its stop, total fed and refused incomplete programmes, and the exact-identity substrate match by InChIKey on the shipped table, with exact conversions to g/L and every refusal (pipeline/bioreactor-simulator/reference-feed-handoff.py)

Fixture tables, computed when the page was built

Draft until the independent bioprocess reviewer signs the equations, the presets and the fixtures (Q-19).

scenarios.json

SciPy 1.17.0 Radau, 2026-10-07; sha256 614bce70c89ce2cb…; the engine is held to: each point within the larger of 1e-5 of its value, a time shift of max(1e-4 h, 1e-5 of the elapsed time) times its slope, and its floor; inside the window after a change of aeration or feed, the series computed from dissolved oxygen on value alone; events within 1e-3 h.

ScenarioModeHorizon (h)kLa (per hour)Oxygen runs out (h)What it checks
batch-monodbatch122500–Batch Monod growth on glucose at 37 °C, oxygen not limiting; an overflow onset of 0.8 g/g/h watched
batch-monod-small-ksbatch122500–Batch growth with a glucose Ks of 33 µg/L (stiff near depletion)
batch-productbatch401500–Batch growth at 30 °C with a growth-associated and a basal product drawing on the substrate budget
batch-haldanebatch481500–Batch growth on methanol at 25 °C above the inhibition optimum (Haldane), a basal product
batch-starvationbatch162500–Batch growth into starvation, where uptake falls below maintenance
fed-batch-exponentialfed-batch24300023.49A batch phase, then an exponential feed at μset 0.15 per hour; an overflow onset of 0.8 g/g/h watched
fed-batch-exponential-small-ksfed-batch243000–The exponential feed with a glucose Ks of 33 µg/L: substrate near Ks in the fed phase (stiff)
fed-batch-exponential-cappedfed-batch241500–An exponential glucose feed from the start at μset 0.2 per hour, held at the pump's limit, with a product
fed-batch-exponential-methanolfed-batch362500–A methanol feed at μset 0.04 per hour from 25 g/L biomass at 25 °C
fed-batch-constantfed-batch303000–A batch phase, then a constant glucose feed: growth slows as the culture grows
fed-batch-constant-overfeedfed-batch402500–A constant methanol feed faster than the culture takes it up: methanol accumulates and inhibits growth
fed-batch-constant-stopfed-batch243000–A constant glucose feed that stops at a set time, then the culture uses up what is left
fed-batch-rescuedfed-batch2460010.63An exponential feed designed from the state at its start, at the pump's limit, then capped at 14 h to μ 0.1 per hour with a rate designed from the state there; the gas enriched and the flow raised at 12 h, the headspace pressure raised at 16 h, and the feed stopped when the volume reaches 7.5 L
chemostat-steadychemostat602500–A chemostat at D 0.3 per hour from inoculation to steady state
chemostat-stepchemostat802500–A chemostat stepped from D 0.2 to 0.45 per hour at 40 h
chemostat-washoutchemostat302500–A chemostat above the washout dilution rate
oxygen-limited-kla-50-dynamicfed-batch24502.40An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen dynamic
oxygen-limited-kla-50-qssfed-batch24502.40An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen quasi-steady
oxygen-limited-kla-200-dynamicfed-batch242004.64An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen dynamic
oxygen-limited-kla-200-qssfed-batch242004.64An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen quasi-steady
oxygen-limited-kla-1000-dynamicfed-batch24100013.08An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen dynamic
oxygen-limited-kla-1000-qssfed-batch24100013.08An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen quasi-steady
oxygen-step-kla-20-40-dynamicbatch16200.87Batch growth limited by oxygen at kLa 20 per hour, the agitation raised to kLa 40 at 5 h (the longest transient drawn); dissolved oxygen dynamic
oxygen-step-kla-20-40-qssbatch16200.87Batch growth limited by oxygen at kLa 20 per hour, the agitation raised to kLa 40 at 5 h (the longest transient drawn); dissolved oxygen quasi-steady
planted-excursion-06batch820005.50Batch growth with ample oxygen, kLa dropped from 2,000 to 5 per hour for 0.06 h at 5.5 h: the oxygen trigger is on for exactly 0.06 h, so the excursion rule keeps it
planted-excursion-04batch82000–Batch growth with ample oxygen, kLa dropped from 2,000 to 5 per hour for 0.04 h at 5.5 h: the oxygen trigger is on for exactly 0.04 h, so the excursion rule drops it
preset-e-coli-fed-batch@1fed-batch2440012.32The E. coli preset's default run, without rescue
preset-e-coli-fed-batch@1-rescuedfed-batch24400–The E. coli preset's run with the rescue's steps as the engine chose them
preset-s-cerevisiae-fed-batch@1fed-batch24400–The S. cerevisiae preset's default run
preset-s-cerevisiae-fed-batch@1-chemostatchemostat24200–The S. cerevisiae page's chemostat link: D 0.10 per hour, kLa 200 per hour, Sf 10 g/L, from its steady state
preset-pichia-aox1@1fed-batch24700–The Pichia preset's default run
preset-chemostat@1chemostat24400–The chemostat preset's default run
preset-custom@1fed-batch2440012.32The custom preset's default run

Maintenance at both ends of its range (pichia-aox1@1)

The data do not resolve maintenance, so the run is shown at both ends of its range, with everything else as the preset sets it.

Maintenance (g/g/h)Biomass at the end (g/L)Lowest DO (% air saturation)Peak OUR (mmol/L/h)DO below the setpoint
024.642.878.3never
0.02124.425.5101.6from 22.3 h