- #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).
- #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.
- #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] (#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