Simulation#
Client for running battery simulations using UCP protocol and PyBaMM.
For usage examples and guides, see Simulate API on docs.ionworks.com.
Simulation client for running battery simulations.
This module provides the SimulationClient for running battery
simulations using the Universal Cycler Protocol (UCP) format. It supports
single simulations, batch simulations with design of experiments (DOE),
and PyBaMM-based modeling.
- class ionworks.simulation.SimulationResult(time_series, steps, metrics)[source]#
Bases:
objectTyped result returned by
SimulationClient.get_result().- Parameters:
- time_series: DataFrame | DataFrame#
Time-series data with one row per time point. Column names follow the platform convention (e.g.
"Time [s]","Voltage [V]"). Returns a polars DataFrame by default; a pandas DataFrame whenset_dataframe_backend("pandas")is active.
- steps: DataFrame | DataFrame#
Step-level summary with one row per protocol step. Returns the same DataFrame type as
time_series.
- class ionworks.simulation.QuickModelConfig(*, capacity=1.0, chemistry='NMC/Graphite')[source]#
Bases:
BaseModelQuick model configuration for protocol-based simulations.
A quick model builds a system ECM from a nominal capacity and a chemistry name — it does not take a base
model_id(that is what a full parameterized model is for).- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.ProtocolExperimentConfig(*, protocol, name)[source]#
Bases:
BaseModelProtocol experiment configuration.
- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.DOERow(*, type, name, min=None, max=None, count=None, values=None, mean=None, std=None)[source]#
Bases:
BaseModelDesign of experiments row configuration.
- Parameters:
- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.DesignParametersDOE(*, sampling, rows, count=None)[source]#
Bases:
BaseModelDesign of experiments configuration.
- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.ProtocolSimulationBatchRequest(*, parameterized_model, protocol_experiment, design_parameters_doe=None, experiment_parameters=None, max_backward_jumps=None, study_id=None, project_id=None, extra_variables=None)[source]#
Bases:
BaseModelRequest model for batch protocol-based simulation.
- Parameters:
- parameterized_model: Any#
- protocol_experiment: ProtocolExperimentConfig#
- design_parameters_doe: DesignParametersDOE | None#
- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.SimulationResponse(*, simulation_id, job_id)[source]#
Bases:
BaseModelResponse model for simulation creation.
- model_config = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class ionworks.simulation.SimulationClient(client)[source]#
Bases:
objectClient for running simulations.
- Parameters:
client (Any)
- __init__(client)[source]#
Initialize the SimulationClient.
- Parameters:
client (Any) – The HTTP client instance for making API requests.
- Return type:
None
- protocol(config)[source]#
Create a single protocol-based simulation.
Delegates to
protocol_batch()and returns the single result. Pass the same config fields asprotocol_batch(), plus the single-simulation convenience fielddesign_parameters(a flatdict[str, float]) — it is translated internally to a one-row discrete DOE.- Parameters:
Configuration dictionary containing:
- parameterized_model: one of
a quick-model dict
{"capacity": <Ah>, "chemistry": <name>}(builds a system ECM; no basemodel_id),a
QuickModelConfig,a full model dict
{"model_id": ..., "parameters": {...}}, ora parameterized-model ID string.
protocol_experiment: ProtocolExperimentConfig dict with protocol and name fields
experiment_parameters: Optional dict with initial_soc and initial_temperature
design_parameters: Optional
dict[str, float]— design parameter overrides for this single simulation (translated to a single-row discrete DOE under the hood).max_backward_jumps: Optional int
study_id: Optional str
extra_variables: Optional list[str] — extra variables to include in simulation output
- Returns:
Response containing simulation_id and job_id.
- Return type:
- Raises:
ValueError – If the configuration is invalid, both
design_parametersanddesign_parameters_doeare supplied, or a multi-rowdesign_parameters_doeis supplied (useprotocol_batch()for multi-simulation DOE).
- protocol_batch(config)[source]#
Create multiple protocol-based simulations using DOE.
Uses a two-step flow: first parses the protocol and creates an experiment template (
POST /protocols/parse-to-template), then runs the batch (POST /simulations/with-template/batch).- Parameters:
Configuration dictionary containing:
- parameterized_model: one of
a quick-model dict
{"capacity": <Ah>, "chemistry": <name>}(builds a system ECM; no basemodel_id),a
QuickModelConfig,a full model dict
{"model_id": ..., "parameters": {...}}, ora parameterized-model ID string.
protocol_experiment: ProtocolExperimentConfig dict with protocol and name fields
design_parameters_doe: DesignParametersDOE dict
experiment_parameters: Optional dict
max_backward_jumps: Optional int
study_id: Optional str
extra_variables: Optional list[str] — extra variables to include in simulation output
- Returns:
List of responses, each containing simulation_id and job_id.
- Return type:
- Raises:
ValueError – If the configuration is invalid.
- list(parameterized_model_id=None, study_id=None)[source]#
List simulations filtered by parameterized model or study.
Exactly one of
parameterized_model_idorstudy_idmust be provided.
- get_result(simulation_id)[source]#
Get simulation data/result for a completed simulation.
- Parameters:
simulation_id (str) – The UUID of the simulation.
- Returns:
Typed result with
time_seriesandstepsas DataFrames andmetricsas a plain dict. DataFrame type (polars or pandas) follows the active backend set viaset_dataframe_backend().- Return type:
- Raises:
IonworksError – If the API request fails. A 404 typically means the result is not yet available (simulation still running or queued). Other status codes indicate authentication failures, server errors, or a missing simulation ID.
- wait_for_completion(simulation_id, timeout=60, poll_interval=2, verbose=True, raise_on_failure=True)[source]#
Wait for simulation(s) to complete by polling until done or timeout.
- Parameters:
simulation_id (str | list[str]) – Single simulation ID or list of simulation IDs to wait for. Can also be a
SimulationResponseor list of them (thejob_idwill be extracted automatically for failure detection).timeout (int) – Maximum time to wait in seconds (default: 60).
poll_interval (int) – Time between polls in seconds (default: 2).
verbose (bool) – Whether to print status updates (default: True).
raise_on_failure (bool) – Whether to raise
IonworksErrorwhen a simulation’s job fails or is canceled (default: True).
- Returns:
Completed simulation(s). Returns single dict if single ID provided, list of dicts if list of IDs provided. Only returns completed simulations if timeout is reached.
- Return type:
- Raises:
TimeoutError – If timeout is reached before all simulations complete.
IonworksError – If a simulation fails and raise_on_failure is True.