Reference checks
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.
These checks test the equations and their solution, not the preset parameter values, which have not been independently reviewed.
| Methods | Oracle | Fixtures | Tolerance | Date | File |
|---|---|---|---|---|---|
| unstructured-growth-model, modified-rosenbrock, dissolved-oxygen-balance | SciPy | 33 | 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; events within 1e-3 h; the carbon and electron balances within 0.5 percent | 2026-10-07 | scenarios.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| unstructured-growth-model | SciPy | 4 | the chemostat's steady states and washout, and a batch run's implicit closed form, within 1e-3 relative | 2026-10-07 | analytic.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| dissolved-oxygen-balance, van-t-riet-kla | SciPy | 22 | air saturation to the USGS DOTABLES output's rounding; the exhaust gas and kLa within 1e-9 relative | 2026-10-07 | transfer.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| scale-up-rules | SciPy | 3 | constant power per volume and tip speed within 1e-9 relative; constant-kLa speed within 1e-6 relative | 2026-10-07 | scaleup.jsonRecorded for version 0.2.0; the test suite checks the current engine against it. |
| dissolved-oxygen-balance | SciPy | 4 | Feed 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 manifest | 2026-10-24 | transport-0.8.0.jsonRecorded for version 0.8.0; the test suite checks the current engine against it. |
| bioreactor-batch-fit | SciPy | 20 | Batch μ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 exact | 2026-10-24 | batch-fit-0.9.0.jsonRecorded for version 0.9.0; the test suite checks the current engine against it. |
| bioreactor-batch-fit | Python | 20 | The 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-once | 2026-10-24 | batch-fit-flags-0.11.0.jsonRecorded for version 0.11.0; the test suite checks the current engine against it. |
| bioreactor-batch-fit | SciPy | 33 | Batch μ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 exact | 2026-10-25 | batch-fit-0.13.0.jsonRecorded for version 0.13.0; the test suite checks the current engine against it. |
| measured-comparison-time-alignment | Python fractions | 8 | elapsed 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 inputs | 2026-10-19 | measured-comparison-0.3.0.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| measured-comparison-time-alignment | Python fractions | 3 | each 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.0 | 2026-10-20 | measured-comparison-0.4.0.jsonRecorded for version 0.4.0; the test suite checks the current engine against it. |
| measured-comparison-time-alignment | Python fractions | 25 | Measured-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.0 | 2026-10-24 | measured-comparison-0.5.0.jsonRecorded for version 0.5.0; the test suite checks the current engine against it. |
| kla-value-scaled | NumPy | 18 | kLa 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 only | 2026-10-24 | kla-scaling-0.6.0.jsonRecorded for version 0.6.0; the test suite checks the current engine against it. |
| feed-law | Python decimal | 16 | Feed 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 relative | 2026-10-24 | feed-0.7.0.jsonRecorded for version 0.7.0; the test suite checks the current engine against it. |
| feed-handoff | Python fractions | 86 | Feed 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 exact | 2026-10-24 | feed-handoff-0.12.0.jsonRecorded for version 0.12.0; the test suite checks the current engine against it. |
| feed-handoff | Python fractions | 39 | Feed agreement: 27 cases and 12 of the preparation as received; exact | 2026-10-28 | feed-agreement-0.14.0.jsonRecorded for version 0.14.0; the test suite checks the current engine against it. |
| product-composition | Python fractions | 62 | Product 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 equality | 2026-10-31 | product-composition-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it. |
| unstructured-growth-model | SciPy | 12 | Product 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 controls | 2026-10-31 | product-closure-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it. |
| unstructured-growth-model | SciPy | 33 | The 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-31 | product-reduction-0.15.0.jsonRecorded for version 0.15.0; the test suite checks the current engine against it. |
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.
Draft until the independent bioprocess reviewer signs the equations, the presets and the fixtures (Q-19).
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.
| Scenario | Mode | Horizon (h) | kLa (per hour) | Oxygen runs out (h) | What it checks |
|---|---|---|---|---|---|
| batch-monod | batch | 12 | 2500 | – | Batch Monod growth on glucose at 37 °C, oxygen not limiting; an overflow onset of 0.8 g/g/h watched |
| batch-monod-small-ks | batch | 12 | 2500 | – | Batch growth with a glucose Ks of 33 µg/L (stiff near depletion) |
| batch-product | batch | 40 | 1500 | – | Batch growth at 30 °C with a growth-associated and a basal product drawing on the substrate budget |
| batch-haldane | batch | 48 | 1500 | – | Batch growth on methanol at 25 °C above the inhibition optimum (Haldane), a basal product |
| batch-starvation | batch | 16 | 2500 | – | Batch growth into starvation, where uptake falls below maintenance |
| fed-batch-exponential | fed-batch | 24 | 3000 | 23.49 | A 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-ks | fed-batch | 24 | 3000 | – | The exponential feed with a glucose Ks of 33 µg/L: substrate near Ks in the fed phase (stiff) |
| fed-batch-exponential-capped | fed-batch | 24 | 1500 | – | 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-methanol | fed-batch | 36 | 2500 | – | A methanol feed at μset 0.04 per hour from 25 g/L biomass at 25 °C |
| fed-batch-constant | fed-batch | 30 | 3000 | – | A batch phase, then a constant glucose feed: growth slows as the culture grows |
| fed-batch-constant-overfeed | fed-batch | 40 | 2500 | – | A constant methanol feed faster than the culture takes it up: methanol accumulates and inhibits growth |
| fed-batch-constant-stop | fed-batch | 24 | 3000 | – | A constant glucose feed that stops at a set time, then the culture uses up what is left |
| fed-batch-rescued | fed-batch | 24 | 600 | 10.63 | An 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-steady | chemostat | 60 | 2500 | – | A chemostat at D 0.3 per hour from inoculation to steady state |
| chemostat-step | chemostat | 80 | 2500 | – | A chemostat stepped from D 0.2 to 0.45 per hour at 40 h |
| chemostat-washout | chemostat | 30 | 2500 | – | A chemostat above the washout dilution rate |
| oxygen-limited-kla-50-dynamic | fed-batch | 24 | 50 | 2.40 | An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen dynamic |
| oxygen-limited-kla-50-qss | fed-batch | 24 | 50 | 2.40 | An exponential feed at μset 0.25 per hour with kLa 50 per hour; dissolved oxygen quasi-steady |
| oxygen-limited-kla-200-dynamic | fed-batch | 24 | 200 | 4.64 | An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen dynamic |
| oxygen-limited-kla-200-qss | fed-batch | 24 | 200 | 4.64 | An exponential feed at μset 0.25 per hour with kLa 200 per hour; dissolved oxygen quasi-steady |
| oxygen-limited-kla-1000-dynamic | fed-batch | 24 | 1000 | 13.08 | An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen dynamic |
| oxygen-limited-kla-1000-qss | fed-batch | 24 | 1000 | 13.08 | An exponential feed at μset 0.25 per hour with kLa 1000 per hour; dissolved oxygen quasi-steady |
| oxygen-step-kla-20-40-dynamic | batch | 16 | 20 | 0.87 | Batch 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-qss | batch | 16 | 20 | 0.87 | Batch 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-06 | batch | 8 | 2000 | 5.50 | Batch 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-04 | batch | 8 | 2000 | – | 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@1 | fed-batch | 24 | 400 | 12.32 | The E. coli preset's default run, without rescue |
| preset-e-coli-fed-batch@1-rescued | fed-batch | 24 | 400 | – | The E. coli preset's run with the rescue's steps as the engine chose them |
| preset-s-cerevisiae-fed-batch@1 | fed-batch | 24 | 400 | – | The S. cerevisiae preset's default run |
| preset-s-cerevisiae-fed-batch@1-chemostat | chemostat | 24 | 200 | – | 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@1 | fed-batch | 24 | 700 | – | The Pichia preset's default run |
| preset-chemostat@1 | chemostat | 24 | 400 | – | The chemostat preset's default run |
| preset-custom@1 | fed-batch | 24 | 400 | 12.32 | The custom preset's default run |
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 |
|---|---|---|---|---|
| 0 | 24.6 | 42.8 | 78.3 | never |
| 0.021 | 24.4 | 25.5 | 101.6 | from 22.3 h |