Summary
A PEtab problem whose measurements are at time = inf (steady-state) imports fine, but config load then crashes because the importer materializes the measurement as a TimeCourse rather than a steady-state scan. PyBNF already has steady-state support (a ParamScan with steady_state=>1, ADR-0046); the gap is only that import_job does not select it for time = inf measurements.
Reproduce
Blasi_CellSystems2016 from the Benchmark-Models-PEtab collection (subset I of the Grein et al. 2026 optimizer benchmark). Every Blasi measurement is at time = inf.
from pybnf.petab import petab1to2_preserve_scale, import_job
import tempfile
v2 = petab1to2_preserve_scale("Blasi_CellSystems2016/Blasi_CellSystems2016.yaml", tempfile.mkdtemp())
import_job(v2, "out", job_type="gntr") # OK — writes an .exp whose time column is `inf`
Then load the emitted conf (or run pybnf -c imported.conf -o):
File ".../pybnf/config.py", line 1422, in _load_experiments
action = TimeCourse({'suffix': name, 'method': method}, explicit_points=points)
File ".../pybnf/pset.py", line 1792, in __init__
self.stepnumber = int(np.round((self.time - self.t_start) / self.step))
OverflowError: cannot convert float infinity to integer
Root cause
PEtab time = inf denotes a steady-state measurement. import_job writes the literal inf into the .exp time column and emits a time-course experiment (experiment: ..., method: ode). TimeCourse.__init__ then derives a step count from the (assumed finite) time grid, which overflows on inf.
Expected
Recognize time = inf measurements at import and emit a steady-state action instead — a ParamScan with steady_state=>1, ss_method=>"newton" (ADR-0046) — so the datum is compared at the KINSOL steady state rather than at a fixed endpoint. PyBNF already supports this scan; only the importer's action selection needs to branch on time = inf.
Impact
Blocks Blasi_CellSystems2016 (all measurements at t = inf) — the last open subset-I problem in the Grein et al. 2026 benchmark import. Distinct from #509 (natural-log lnnormal noise), which this problem also uses: #509 is fixed and now lets Blasi import; this steady-state gap is what stops it at config load.
PyBNF version: 1.6.0 (main).
Summary
A PEtab problem whose measurements are at
time = inf(steady-state) imports fine, but config load then crashes because the importer materializes the measurement as aTimeCourserather than a steady-state scan. PyBNF already has steady-state support (aParamScanwithsteady_state=>1, ADR-0046); the gap is only thatimport_jobdoes not select it fortime = infmeasurements.Reproduce
Blasi_CellSystems2016from the Benchmark-Models-PEtab collection (subset I of the Grein et al. 2026 optimizer benchmark). Every Blasi measurement is attime = inf.Then load the emitted conf (or run
pybnf -c imported.conf -o):Root cause
PEtab
time = infdenotes a steady-state measurement.import_jobwrites the literalinfinto the.exptime column and emits a time-course experiment (experiment: ..., method: ode).TimeCourse.__init__then derives a step count from the (assumed finite) time grid, which overflows oninf.Expected
Recognize
time = infmeasurements at import and emit a steady-state action instead — aParamScanwithsteady_state=>1, ss_method=>"newton"(ADR-0046) — so the datum is compared at the KINSOL steady state rather than at a fixed endpoint. PyBNF already supports this scan; only the importer's action selection needs to branch ontime = inf.Impact
Blocks
Blasi_CellSystems2016(all measurements att = inf) — the last open subset-I problem in the Grein et al. 2026 benchmark import. Distinct from #509 (natural-loglnnormalnoise), which this problem also uses: #509 is fixed and now lets Blasi import; this steady-state gap is what stops it at config load.PyBNF version: 1.6.0 (
main).