- #969 - Updates synthetic data and adds example script for thermal parameterisation.
- #965 - Adds synthetic data and example scripts for OCV parameterisation.
- #963 - Adds an example for generating synthetic data from a specification and exporting it to a PyProBE-compatible parquet file.
- #928 - Adds the option to choose
matplotlibas the plotting library for plotting functions. Additionally, figures and axes can be created manually and passed as keyword arguments to plotting functions. An example notebookplotting.ipynbwas added to thegetting_starteddirectory to demonstrate usage of the new features. - #962 - Separate the surface from the bulk temperature in the
CellTemperaturemodel. - #918 - Adds a plot for predictions sampled from a posterior distribution (
pybop.plot.predictive). - #940 - Adds support for Python 3.14 (EP-BOLFI optimiser and PyProBE still restricted to Python 3.12 or below).
- #967 - Add
Dataset.get_discontinuitiesand update thepybop.pybamm.RecommendedSolveroptions. - #946 - Use
vectorizedevaluation for SciPy differential evolution by default instead of multiprocessingworkers. - #925 - Add
UnboundedDistributionand theget_transformed_distributionfunctionality.
- #915 - Fixes axis labels for non-standard domain names, adds
Datasetlength property and addskindproperty toInterpolant. - #911 - Fixes the passing of the cost log to the Voronoi surface plot.
- #905 - Remove restriction on numpy.
- #928 - Deprecates
StandardPlotandStandardSubplotin favour of new standardised backend functionality. - #960 - Remove
asvbenchmarking. - #938 - Make SALib an optional dependency and remove
sensitivity_analysisin favour of using SALib directly. - #942 - Adds
evaluate_batchto the costs and ensures that anEvaluationis returned.
v26.3 - 2026-03-05
- #897 - Adds separate
LogPrior,LogPDFandLogPosteriorclasses and updatesset_target. - #873 - Adds methods for saving result and reconstructing result from saved data.
result.save: saves entire python object using pickle.result.save_data: saves primarily the logger data and any other data required to reconstruct the result from the problem or the sampler (forSamplingResult).Result.load_result: reconstructs theResultobject based on the underlying problem (or sampler forSamplingResult) and the data saved to file. - #862 - Adds pybop.MarginalDistribution, pybop.MultivariateLogNormal.
- #889 - Adds methods for setting the initial state from a voltage to the grouped models.
- #869 - Adds methods for pre-processing current data for linear interpolation.
- #868 - Adds support for Python3.13 (NumPy restricted to <2.4, EP-BOLFI optimiser and PyProBE do not support Python 3.13).
- #871 - Adds a lumped thermal model called
CellTemperature. - #846 - Adds Bayesian optimisation framework and, as an example, the EP-BOLFI optimiser
- #890 - Fix the assignment of parameters within a
MetaProblem. - #847 - Update readme and diagram of pybop components so that the diagram is displayed correctly in the readme.
- #894 - Distinguish different uses of
sigma, pass the covariance to the samplers, and add parameterget_meanandget_stdfunctions. - #862 - Removes MultivariateParameters class. Instead allows multivariate parameters to be passed via pybamm.ParameterValues (as a pybop.Parameter with a pybop.MarginalDistribution). The pybop.Parameters class now handles multivariate parameters. Multivariate distributions are now defined in the model space instead of the search space.
- #878 - Use "Current [A]" instead of "Current function [A]" in datasets and allow list of control functions.
- #864 - Remove
check_already_existsfromParameterValuesfollowing PyBaMM PR 5339. - #860 - Create a parent class for optimisation and sampling results, move
PosteriorSummaryattributes to theSamplingResultand deprecate thepints.AdaptiveCovarianceMCMCsampler. - #857 - Deprecate the custom PyBaMM model build process for a simulation without an experiment and rename
batch_solveassolve_batchto align with other functions. - #839 - Renames 'prior' as 'distribution'
for pybop.Parameter. Allows construction of apybop.Parameterwith a distribution of typescipy.stats.distributions.rv_frozen. Removesmargins,set_bounds,remove_boundsfrompybop.Parameter.
v25.11 - 2025-11-24
- #815 - Adds function import_pyprobe_result to import a pyprobe.result into a pybop.dataset. Allows for creating a dataset directly from a pybamm.solution object.
- #837 - Update the descriptons in the example scripts and notebooks.
- #833 - Upgrade to Pints 0.5.1, PyBaMM 25.10.1 and NumPy 2, fix some deprecation warnings.
- #816 - Enable simulator multi-processing via the evaluators.
- #834 - Finite difference calculations of the Hessian matrix are updated. A new notebbok file is added which demonstrates sensitivity analysis using SALib.
- #829 - Create
SamplingResultand best inputs property for results.
v25.10 - 2025-10-31
This release presents a major restructure of PyBOP's base classes. We move from setting up a model, problem, cost,
then optimiser to defining a simulator, cost, problem, and then optimiser. A pybop.pybamm.Simulator is designed
to simulate a pybamm.BaseModel. Optimisation parameters can be passed through a pybamm.ParameterValues class.
To understand how to update your use of PyBOP, please take a look at the example notebooks and scripts.
- #820 - Remove the
nameproperty frompybop.Parameter - #821 - Remove the
papersfolder and update Readme. - #809 - Major restructure, including:
- Deprecate Python 3.9 support
- Update initial state setting (requires PyBaMM > 25.8)
- Remove jax methods
- Add PyBaMM and PyBaMM-EIS simulators for rebuilding and running simulations for a given set of input parameters
- Remove PyBaMM wrappers and enable use of PyBaMM model, parameter values and experiment classes
- Remove observers
- Remove standalone class examples
- Improve logging
- Remove Optimisation and MCMCSampler wrapper classes
- Remove Fisher information computation
- Rename
apply_transformargument totransformed - Remove the
update_capacityoption from theDesignProblem - Update sensitivities retrieval (for PyBaMM 25.8)
- Remove uninformative examples
- Move optimiser and sampler options into defined classes
- Add PyBaMM utilities, design variable definitions and the
add_variable_to_modelfunction - Allow plotting via functions on the
OptimisationResult - Separate the cost classes from the
Problem - Replace
FittingProblemandDesignProblemby a singleProblemclass - Rename and reimplement
MultiFittingProblemasMetaProblem - Add
BaseSimulatoras a generic base class for thepybop.pybamm.Simulatorandpybop.pybamm.EISSimulator - Enable
pybop.Parameterobjects to be passed directly to an instance ofpybamm.ParameterValues - Update the method for setting formation concentrations to be part of the model definition
- Rename some example scripts and notebooks
- Update the docs and test workflows
v25.6 - 2025-07-16
- #767 - Adds the
GroupedSPMmodel for parameter identification. - #644 - Adds example applications for common battery experiments.
- #763 - Updates the GITT pulse fitting method to allow iteration over many pulses.
- #771 - Match naming of
n_sensitivity_samplesand fix intermittenttest_optimisation_f_guessedtest. - #737 - Sensitivities no longer available for CasadiSolver in Pybamm v25.6 onwards. Updates Hallemans example scripts.
- #705 - Bug fix
fitting_problem.evaulate()failure return type alongside fixes for Pybammv25.4. - #546 - Default Pybamm solver to
IDAKLU, changes required for Pybamm v25.4.1
v25.3 - 2025-03-28
- #649 - Adds verbose outputs to Pints-based optimisers.
- #659 - Enables user-defined weightings of the error measures.
- #674 - Adds the reason for stopping to the
OptimisationResult. - #663 - Adds DFN fitting examples alongside synthetic data generation methods.
- #676 - Update the format of the problem sensitivities to a dict.
- #681 - Update the spatial variable defaults of the
GroupedSPMemodel. - #692 - Improvements/fixes for
BaseSamplerandBasePintsSamplerclasses, addsChainProcessorclasses w/ clearer structure.
- #678 - Fixed bug where model wasn't plotted for observer classes with
pybop.plot.quick().
- #684 - Updates
plot.quicktoplot.problemfor clarity. - #661 - Adds
pybop.CostInterfacewhich aligns the optimisers and samplers with a unifiedcall_costin which transformations and sign inversions are applied. Also includes bug fixes for transformations and gradient calculations.
v25.1 - 2025-02-03
- #636 - Adds
pybop.IRPropPlusoptimiser with corresponding tests. - #635 - Adds support for multi-proposal evaluation of list-like objects to
BaseCostclasses. - #635 - Adds global parameter sensitivity analysis with method
BaseCost.sensitivity_analysis. This is computation is added toOptimisationResultif optimiser argcompute_sensitivitiesisTrue. An additional arg is added to select the number of samples for analysis:n_sensitivity_samples. - [#630] (pybop-team#632) - Fisher Information Matrix added to
BaseLikelihoodclass. - #619 - Adds
pybop.SimulatingAnnealingoptimiser with corresponding tests. - #565 - DigiBatt added as funding partner.
- #638 - Allows the problem class to accept any domain name.
- #618 - Adds Mean Absolute Error (MAE) and Mean Squared Error (MSE) costs.
- #601 - Deprecates
MultiOptimisationResultby merging withOptimisationResult. - #600 - Removes repetitious functionality within the cost classes.
- #602 - Aligns the standard quick plot of
MultiFittingProblemoutputs.
- #656 - Completes
ParameterSetchanges from #593 and aligns the simulation options inmodel.predictwith the model properties such as the solver. - #593 - Enables
ParameterSetto systematically return apybamm.ParameterValuesobject within the model class.
v24.12 - 2024-12-21
- #481 - Adds experimental support for PyBaMM's jaxified IDAKLU solver. Includes Jax-specific cost functions
pybop.JaxSumSquareErrorandpybop.JaxLogNormalLikelihood. AddsJaxoptional dependency to PyBaMM dependency. - #597 - Adds number of function evaluations
n_evaluationstoOptimisationResult. - #362 - Adds the
classify_using_Hessianfunctionality to classify the optimised result. - #584 - Adds the
GroupedSPMemodel for parameter identification. - #571 - Adds Multistart functionality to optimisers via initialisation arg
multistart. - #582 - Fixes
population_sizearg for Pints' based optimisers, reshapesparameters.rvsto be parameter instances. - #570 - Updates the contour and surface plots, adds mixed chain effective sample size computation, x0 to optim.log
- #566 - Adds
UnitHyperCubetransformation class, fixes incorrect application of gradient transformation. - #569 - Adds parameter specific learning rate functionality to GradientDescent optimiser.
- #282 - Restructures the examples directory.
- #396 - Adds
ecm_with_tau.pyexample script. - #452 - Extends
cell_massandapproximate_capacityfor half-cell models. - #544 - Allows iterative plotting using
StandardPlot. - #541 - Adds
ScaledLogLikelihoodandBaseMetaLikelihoodclasses. - #409 - Adds plotting and convergence methods for Monte Carlo sampling. Includes open-access Tesla 4680 dataset for Bayesian inference example. Fixes transformations for sampling.
- #531 - Adds Voronoi optimiser surface plot (
pybop.plot.surface) for fast optimiser aligned cost visualisation. - #532 - Adds
linked_parametersexample script which shows how to update linked parameters during design optimisation. - #529 - Adds
GravimetricPowerDensityandVolumetricPowerDensitycosts, along with the mathjax extension for Sphinx.
- #580 - Random Search optimiser is implimented.
- #588 - Makes
minimisinga property ofBaseOptimiserset by the cost class. - #512 - Refactors
LogPosteriorwith attributes pointing to composed likelihood object. - #551 - Refactors Optimiser arguments,
population_sizeandmax_iterationsas default args, improves optimiser docstrings
- #595 - Fixes non-finite LogTransformed bounds for indices of zero.
- #561 - Bug fixes the sign of the SciPy cost logs for maximised costs.
- #505 - Bug fixes for
LogPosteriorwith transformedGaussianLogLikelihoodlikelihood.
- #481 -
problem.modelis now a copied instance ofmodel - #598 - Depreciated
Adamoptimiser has been removed, seeAdamWfor replacement. - #531 - Plot methods moved to
pybop.plotwith mostly minimal renaming. For example,pybop.plot_parametersis nowpybop.plot.parameters. Other breaking changes include:pybop.plot2dtopybop.plot.contour. - #526 - Refactor
OptimisationResultsclasses, withoptim.run()now return the full object. Adds finite cost value check for optimised parameters.
v24.9.1 - 2024-09-16
- #495 - Bugfixes for Transformation class, adds
apply_transformoptional arg toBaseCostfor transformation functionality.
v24.9.0 - 2024-09-10
- #462 - Enables multidimensional learning rate for
pybop.AdamWwith updated (more robust) integration testing. Fixes bug inMinkowskiandSumofPowercost functions for gradient-based optimisers. - #411 - Updates notebooks with README in
examples/directory, removes kaleido dependency and moves to nbviewer rendering, displays notebook figures withnotebook_connectedplotly renderer - #6 - Adds Monte Carlo functionality, with methods based on Pints' algorithms. A base class is added
BaseSampler, in addition toPintsBaseSampler. - #353 - Allow user-defined check_params functions to enforce nonlinear constraints, and enable SciPy constrained optimisation methods
- #222 - Adds an example for performing and electrode balancing.
- #441 - Adds an example for estimating constants within a
pybamm.FunctionalParameter. - #405 - Adds frequency-domain based EIS prediction methods via
model.simulateEISand updates toproblem.evaluatewith examples and tests. - #460 - Notebook example files added for ECM and folder structure updated.
- #450 - Adds support for IDAKLU with output variables, and corresponding examples, tests.
- #364 - Adds the MultiFittingProblem class and the multi_fitting example script.
- #444 - Merge
BaseModelbuild()andrebuild()functionality. - #435 - Adds SLF001 linting for private members.
- #418 - Wraps the
get_parameter_infomethod from PyBaMM to get a dictionary of parameter names and types. - #413 - Adds
DesignCostfunctionality toWeightedCostclass with additional tests. - #357 - Adds
Transformation()class withLogTransformation(),IdentityTransformation(), andScaledTransformation(),ComposedTransformation()implementations with corresponding examples and tests. - #427 - Adds the nbstripout pre-commit hook to remove unnecessary metadata from notebooks.
- #327 - Adds the
WeightedCostsubclass, defines when to evaluate a problem and adds thespm_weighted_costexample script. - #393 - Adds Minkowski and SumofPower cost classes, with an example and corresponding tests.
- #403 - Adds lychee link checking action.
- #473 - Bugfixes for transformation class, adds optional
apply_transformarg toBaseCost.__call__(), addslog_update()method toBaseOptimiser. - #464 - Fix order of design
parameter_setupdates and refactorupdate_capacity. - #468 - Renames
quick_plot.pytostandard_plots.py. - #454 - Fixes benchmarking suite.
- #421 - Adds a default value for the initial SOC for design problems.
- #499 - BPX is added as an optional dependency.
- #483 - Replaces
pybop.MAPwithpybop.LogPosteriorwith an updated call args and bugfixes. - #436 - API Change: The functionality from
BaseCost.evaluate/S1&BaseCost._evaluate/S1is represented inBaseCost.__call__&BaseCost.compute.BaseCost.computedirectly acts on the predictions, whileBaseCost.__call__callsBaseProblem.evaluate/S1beforeBaseCost.compute.computehas optional args for gradient cost calculations. - #424 - Replaces the
init_socinput toFittingProblemwith the option to pass an initial OCV value, updatesBaseModeland fixesmulti_model_identification.ipynbandspm_electrode_design.ipynb.
v24.6.1 - 2024-07-31
- #313 - Fixes for PyBaMM v24.5, drops support for PyBaMM v23.9, v24.1
v24.6 - 2024-07-08
- #319 - Adds
CuckooSearchoptimiser with corresponding tests. - #359 - Aligning Inputs between problem, observer and model.
- #379 - Adds model.simulateS1 to weekly benchmarks.
- #174 - Adds new logo and updates Readme for accessibility.
- #316 - Adds Adam with weight decay (AdamW) optimiser, adds depreciation warning for pints.Adam implementation.
- #271 - Aligns the output of the optimisers via a generalisation of Result class.
- #315 - Updates init structure to remove circular import issues and minimises dependancy imports across codebase for faster PyBOP module import. Adds type-hints to BaseModel and refactors rebuild parameter variables.
- #236 - Restructures the optimiser classes, adds a new optimisation API through direct construction and keyword arguments, and fixes the setting of
max_iterations, and_minimising. Introducespybop.BaseOptimiser,pybop.BasePintsOptimiser, andpybop.BaseSciPyOptimiserclasses. - #322 - Add
Parametersclass to store and access multiple parameters in one object. - #321 - Updates Prior classes with BaseClass, adds a
problem.sample_initial_conditionsmethod to improve stability of SciPy.Minimize optimiser. - #249 - Add WeppnerHuggins model and GITT example.
- #304 - Decreases the testing suite completion time.
- #301 - Updates default echem solver to "fast with events" mode.
- #251 - Increment PyBaMM > v23.5, remove redundant tests within integration tests, increment citation version, fix examples with incorrect model definitions.
- #285 - Drop support for Python 3.8.
- #275 - Adds Maximum a Posteriori (MAP) cost function with corresponding tests.
- #273 - Adds notebooks to nox examples session and updates CI workflows for change.
- #250 - Adds DFN, MPM, MSMR models and moves multiple construction variables to BaseEChem. Adds exception catch on simulate & simulateS1.
- #241 - Adds experimental circuit model fitting notebook with LG M50 data.
- #268 - Fixes the GitHub Release artifact uploads, allowing verification of codesigned binaries and source distributions via
sigstore-python. - #79 - Adds BPX as a dependency and imports BPX support from PyBaMM.
- #267 - Add classifiers to pyproject.toml, update project.urls.
- #195 - Adds the Nelder-Mead optimiser from PINTS as another option.
- #393 - General integration test fixes. Adds UserWarning when using Plot2d with prior generated bounds.
- #338 - Fixes GaussianLogLikelihood class, adds integration tests, updates non-bounded parameter implementation by applying bounds from priors and
boundary_multiplierargument. Bugfixes to CMAES construction. - #339 - Updates the calculation of the cyclable lithium capacity in the spme_max_energy example.
- #387 - Adds keys to ParameterSet and updates ECM OCV check.
- #380 - Restore self._boundaries construction for
pybop.PSO. - #372 - Converts
np.arraytonp.asarrayfor Numpy v2.0 support. - #165 - Stores the attempted and best parameter values and the best cost for each iteration in the log attribute of the optimiser and updates the associated plots.
- #354 - Fixes the calculation of the gradient in the
RootMeanSquaredErrorcost. - #347 - Resets options between MSMR tests to cope with a bug in PyBaMM v23.9 which is fixed in PyBaMM v24.1.
- #337 - Restores benchmarks, relaxes CI schedule for benchmarks and scheduled tests.
- #231 - Allows passing of keyword arguments to PyBaMM models and disables build on initialisation.
- #321 - Improves
integration/test_spm_parameterisation.pystability, adds flakly pytest plugin, andtest_thevenin_parameterisation.pyintegration test. - #330 - Fixes implementation of default plotting options.
- #317 - Installs seed packages into
noxsessions, ensuring that scheduled tests can pass. - #308 - Enables testing on both macOS Intel and macOS ARM (Silicon) runners and fixes the scheduled tests.
- #299 - Bugfix multiprocessing support for Linux, MacOS, Windows (WSL) and improves coverage.
- #270 - Updates PR template.
- #91 - Adds a check on the number of parameters for CMAES and makes XNES the default optimiser.
- #322 - Add
Parametersclass to store and access multiple parameters in one object (API change). - #285 - Drop support for Python 3.8.
- #251 - Drop support for PyBaMM v23.5
- #236 - Restructures the optimiser classes (API change).
v24.3.1 - 2024-06-17
- #369 - Upper pins Numpy < 2.0 due to breaking Pints' functionality.
v24.3 - 2024-03-25
- #245 - Updates ruff config for import linting.
- #198 - Adds default subplot trace options, removes
[]in axis plots as per SI standard, add varying signal length to quick_plot, restores design optimisation execption. - #224 - Updated prediction objects to dictionaries, cost class calculations, added
additional_variablesargument to problem class, updated scipy.minimize defualt method to Nelder-Mead, added gradient cost landscape plots with optional argument. - #179 - Adds
asvconfiguration for benchmarking and initial benchmark suite. - #218 - Adds likelihood base class,
GaussianLogLikelihoodKnownSigma,GaussianLogLikelihood, andProbabilityBasedcost function. As well as addition of a maximum likelihood estimation (MLE) example. - #185 - Adds a pull request template, additional nox sessions
quickfor standard tests + docs,pre-commitfor pre-commit,testto run all standard tests,doctestfor docs. - #215 - Adds
release_workflow.mdand updatesrelease_action.yaml - #204 - Splits integration, unit, examples, plots tests, update workflows. Adds pytest
--examples,--integration,--plotsargs. Adds tests for coverage after removal of examples. Adds examples and integrations nox sessions. Addspybop.RMSE._evaluateS1()method - #206 - Adds Python 3.12 support with corresponding github actions changes.
- #18 - Adds geometric parameter fitting capability, via
model.rebuild()withmodel.rebuild_parameters. - #203 - Adds support for modern Python packaging via a
pyproject.tomlfile and configures thepytesttest runner andrufflinter to use their configurations stored as declarative metadata. - #123 - Configures scheduled tests to run against the last three PyPI releases of PyBaMM via dynamic GitHub Actions matrix generation.
- #187 - Adds M1 Github runner to
test_on_pushworkflow, updt. self-hosted supported python versions in scheduled tests. - #118 - Adds example jupyter notebooks.
- #151 - Adds a standalone version of the Problem class.
- #12 - Adds initial implementation of an Observer class and an unscented Kalman filter.
- #190 - Adds a second example design cost, namely the VolumetricEnergyDensity.
- #259 - Fix gradient calculation from
model.simulateS1to remove cross-polution and refactor cost._evaluateS1 for fitting costs. - #233 - Enforces model rebuild on initialisation of a Problem to allow a change of experiment, fixes if statement triggering current function update, updates
predictionstosimulationto keep distinction betweenpredictandsimulateand addstest_changes. - #123 - Reinstates check for availability of parameter sets via PyBaMM upon retrieval by
pybop.ParameterSet.pybamm(). - #196 - Fixes failing observer cost tests.
- #63 - Removes NLOpt Optimiser from future releases. This is to support deployment to the Apple M-Series platform.
- #164 - Fixes convergence issues with gradient-based optimisers, changes default
model.check_params()to allow infeasible solutions during optimisation iterations. Adds a feasibility check on the optimal parameters. - #211 - Allows a subset of parameter bounds or bounds=None to be passed, returning warnings where needed.
v23.12 - 2023-12-19
- #141 - Adds documentation with Sphinx and PyData Sphinx Theme. Updates docstrings across package, relocates
costsanddatasetto top-level of package. Adds noxfile session and deployment workflow for docs. - #131 - Adds
SciPyDifferentialEvolutionoptimiser, adds functionality for user-selectable maximum iteration limit toSciPyMinimize,NLoptOptimize, andBaseOptimiserclasses. - #107 - Adds Equivalent Circuit Model (ECM) with examples, Import/Export parameter methods
ParameterSet.import_parameterandParameterSet.export_parameters, updates default FittingProblem.signal definition to"Voltage [V]", and testing infrastructure - #127 - Adds Windows and macOS runners to the
test_on_pushaction - #114 - Adds standard plotting class
pybop.StandardPlot()via plotly backend - #114 - Adds
quick_plot(),plot_convergence(), andplot_cost2d()methods - #114 - Adds a SciPy minimize example and logging for non-Pints optimisers
- #116 - Adds PSO, SNES, XNES, ADAM, and IPropMin optimisers to PintsOptimisers() class
- #38 - Restructures the Problem classes ahead of adding a design optimisation example
- #38 - Updates tests and adds a design optimisation example script
spme_max_energy - #120 - Updates the parameterisation test settings including the number of iterations
- #145 - Reformats Dataset to contain a dictionary and signal into a list of strings
- #182 - Allow square-brackets indexing of Dataset
- Initial release
- Adds Pints, NLOpt, and SciPy optimisers
- Adds SumofSquareError and RootMeanSquareError cost functions
- Adds Parameter and Dataset classes