Skip to main content
Faster parallel data fits, name-based measurement lookup, Arbin subschedule/loop support, and clearer model and duplicate errors

Faster, more reliable parallel data fitting

Parallel data fitting has been rebuilt on a dedicated execution engine that drives optimizers, point evaluation, multistart coordination, and progress reporting more efficiently and reliably, with clearer error reporting when a fit fails.

Name-based measurement lookup

client.resolve_measurement(cell_specification, cell_instance, measurement) resolves a measurement_id from human-readable names, walking the spec → instance → measurement hierarchy with server-side filtering at each level. Scripts no longer need to hand-walk three list endpoints and repeat name-matching boilerplate just to get an id. parameterized_model.create_or_get also lands, giving parameterized models the re-runnable create-or-resolve behaviour the other cell resources already had.

Clearer errors for model failures and duplicates

Two opaque “An unexpected error occurred” cases — a fit whose model setup needs geometry the user didn’t supply, and a custom model with no discretisation recipe — now surface as a clear ModelError naming what failed. Separately, attempting to create a resource that already exists now returns a 409 CONFLICT (with the existing id) instead of a 500, so duplicate-creation attempts fail clearly instead of erroring unexpectedly.
Improvements
  • “Save as template” for an optimization now builds the template server-side, copying an optimization’s saved config directly into the template.
Fixes
  • Completed validation/datafit results no longer sporadically show “Failed to load plot data.” for one of a pair of plots.
  • Cycle-ageing experiments driven directly from stored measurement data (experiment="from data") now resolve their measurement references correctly, instead of failing later in the run.
Improvements
  • A bare element-wise cost (SSE/MSE/RMSE/MAE/Max) applied to a multi-variable objective now warns when variable lengths mismatch — e.g. a model-axis dQ/dV variable against a data-axis voltage variable — instead of silently broadcasting to a meaningless residual.
  • All 1-D interpolant calculations now accept a "pchip" interpolator (monotone cubic), the right choice for sparse, order-of-magnitude D(sto) tables such as half-cell GITT per-pulse diffusivity.
Fixes
  • The MSMR half-cell logistic value and derivative are now evaluated more robustly, so it can never overflow.
  • Model configuration now rebuilds consistently across execution paths, so results agree regardless of how a run was launched.
  • A custom model with serialised geometry/mesh now survives multistart runs reliably, fixing cases that previously failed to serialize.
Improvements
  • client.resolve_measurement and parameterized_model.create_or_get (both introduced above), plus Model.config for inspecting a model’s stored configuration.
  • Passing a bare pandas/polars DataFrame to a schema data field (objective data_input, OCPDataInterpolant.data, the Arrhenius calculations’ data) is now auto-wrapped correctly on serialization, instead of failing server-side validation with the opaque “Required field ‘data’ missing”.
Improvements
  • Arbin protocols now support subschedules, counter loops, and temperature add-ins, so schedules that previously crashed on upload with “Unsupported step type: SubSchedule” now parse and simulate end-to-end.
Fixes
  • BioLogic .mps simulation fixes: the loop counter is off by one no longer (EC-Lab’s ctrl_repeat does not count the first pass, so a loop now runs ctrl_repeat + 1 times), plus BCD/EIS support and drive-cycle fixes, each reproduced against the reported setting files before fixing.
  • User-correctable protocol and configuration errors across the Protocol Simulator and pipeline libraries now raise specific, actionable error messages instead of generic failures, so they surface clearly to the user.
Improvements
  • The process-data reader gotchas are now documented: selecting the record sheet for multi-sheet Neware BTSDA .xlsx files, and current-unit handling — alongside the one-call read.time_series_and_steps entry point.