Skip to content

Commit

Permalink
Merge pull request pybamm-team#3406 from kratman/feat/benchmarkSeed
Browse files Browse the repository at this point in the history
tests: Consistent random seed in benchmarks
  • Loading branch information
Saransh-cpp authored Oct 20, 2023
2 parents 31dfbe3 + 061f35d commit bdba266
Show file tree
Hide file tree
Showing 11 changed files with 180 additions and 53 deletions.
5 changes: 5 additions & 0 deletions benchmarks/benchmark_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import numpy as np


def set_random_seed(seed_value=42):
np.random.seed(seed_value)
55 changes: 42 additions & 13 deletions benchmarks/different_model_options.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pybamm
from benchmarks.benchmark_utils import set_random_seed
import numpy as np


Expand Down Expand Up @@ -30,6 +31,10 @@ def build_model(parameter, model_, option, value):


class SolveModel:
solver: pybamm.BaseSolver
model: pybamm.BaseModel
t_eval: np.ndarray

def solve_setup(self, parameter, model_, option, value, solver_class):
import importlib

Expand Down Expand Up @@ -71,7 +76,7 @@ def solve_setup(self, parameter, model_, option, value, solver_class):
disc = pybamm.Discretisation(mesh, self.model.default_spatial_methods)
disc.process_model(self.model)

def solve_model(self, model, params):
def solve_model(self, _model, _params):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -82,11 +87,14 @@ class TimeBuildModelLossActiveMaterial:
["none", "stress-driven", "reaction-driven", "stress and reaction-driven"],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("Ai2020", model, "loss of active material", params)


class TimeSolveLossActiveMaterial:
class TimeSolveLossActiveMaterial(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -95,11 +103,12 @@ class TimeSolveLossActiveMaterial:
)

def setup(self, model, params, solver_class):
set_random_seed()
SolveModel.solve_setup(
self, "Ai2020", model, "loss of active material", params, solver_class
)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -110,11 +119,14 @@ class TimeBuildModelLithiumPlating:
["none", "irreversible", "reversible", "partially reversible"],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("OKane2022", model, "lithium plating", params)


class TimeSolveLithiumPlating:
class TimeSolveLithiumPlating(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -123,11 +135,12 @@ class TimeSolveLithiumPlating:
)

def setup(self, model, params, solver_class):
set_random_seed()
SolveModel.solve_setup(
self, "OKane2022", model, "lithium plating", params, solver_class
)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -146,11 +159,14 @@ class TimeBuildModelSEI:
],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("Marquis2019", model, "SEI", params)


class TimeSolveSEI:
class TimeSolveSEI(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -167,9 +183,10 @@ class TimeSolveSEI:
)

def setup(self, model, params, solver_class):
set_random_seed()
SolveModel.solve_setup(self, "Marquis2019", model, "SEI", params, solver_class)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -185,11 +202,14 @@ class TimeBuildModelParticle:
],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("Marquis2019", model, "particle", params)


class TimeSolveParticle:
class TimeSolveParticle(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -203,11 +223,12 @@ class TimeSolveParticle:
)

def setup(self, model, params, solver_class):
set_random_seed()
SolveModel.solve_setup(
self, "Marquis2019", model, "particle", params, solver_class
)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -218,11 +239,14 @@ class TimeBuildModelThermal:
["isothermal", "lumped", "x-full"],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("Marquis2019", model, "thermal", params)


class TimeSolveThermal:
class TimeSolveThermal(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -231,11 +255,12 @@ class TimeSolveThermal:
)

def setup(self, model, params, solver_class):
set_random_seed()
SolveModel.solve_setup(
self, "Marquis2019", model, "thermal", params, solver_class
)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)


Expand All @@ -246,11 +271,14 @@ class TimeBuildModelSurfaceForm:
["false", "differential", "algebraic"],
)

def setup(self, _model, _params):
set_random_seed()

def time_setup_model(self, model, params):
build_model("Marquis2019", model, "surface form", params)


class TimeSolveSurfaceForm:
class TimeSolveSurfaceForm(SolveModel):
param_names = ["model", "model option", "solver class"]
params = (
[pybamm.lithium_ion.SPM, pybamm.lithium_ion.DFN],
Expand All @@ -259,6 +287,7 @@ class TimeSolveSurfaceForm:
)

def setup(self, model, params, solver_class):
set_random_seed()
if (model, params, solver_class) == (
pybamm.lithium_ion.SPM,
"differential",
Expand All @@ -269,5 +298,5 @@ def setup(self, model, params, solver_class):
self, "Marquis2019", model, "surface form", params, solver_class
)

def time_solve_model(self, model, params, solver_class):
def time_solve_model(self, _model, _params, _solver_class):
self.solver.solve(self.model, t_eval=self.t_eval)
41 changes: 33 additions & 8 deletions benchmarks/memory_sims.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import pybamm
from benchmarks.benchmark_utils import set_random_seed

parameters = ["Marquis2019", "Chen2020"]


class MemSPMSimulationCCCV:
param_names = ["parameter"]
params = parameters
param: pybamm.ParameterValues
model: pybamm.BaseModel
sim: pybamm.Simulation

def mem_setup_SPM_simulationCCCV(self, parameters):
self.param = pybamm.ParameterValues(parameters)
def setup(self, _params):
set_random_seed()

def mem_setup_SPM_simulationCCCV(self, params):
self.param = pybamm.ParameterValues(params)
self.model = pybamm.lithium_ion.SPM()
exp = pybamm.Experiment(
[
Expand All @@ -28,9 +35,15 @@ def mem_setup_SPM_simulationCCCV(self, parameters):
class MemDFNSimulationCCCV:
param_names = ["parameter"]
params = parameters
param: pybamm.ParameterValues
model: pybamm.BaseModel
sim: pybamm.Simulation

def setup(self, _params):
set_random_seed()

def mem_setup_DFN_simulationCCCV(self, parameters):
self.param = pybamm.ParameterValues(parameters)
def mem_setup_DFN_simulationCCCV(self, params):
self.param = pybamm.ParameterValues(params)
self.model = pybamm.lithium_ion.DFN()
exp = pybamm.Experiment(
[
Expand All @@ -50,9 +63,15 @@ def mem_setup_DFN_simulationCCCV(self, parameters):
class MemSPMSimulationGITT:
param_names = ["parameter"]
params = parameters
param: pybamm.ParameterValues
model: pybamm.BaseModel
sim: pybamm.Simulation

def mem_setup_SPM_simulationGITT(self, parameters):
self.param = pybamm.ParameterValues(parameters)
def setup(self, _params):
set_random_seed()

def mem_setup_SPM_simulationGITT(self, params):
self.param = pybamm.ParameterValues(params)
self.model = pybamm.lithium_ion.SPM()
exp = pybamm.Experiment(
[("Discharge at C/20 for 1 hour", "Rest for 1 hour")] * 20
Expand All @@ -66,9 +85,15 @@ def mem_setup_SPM_simulationGITT(self, parameters):
class MemDFNSimulationGITT:
param_names = ["parameter"]
params = parameters
param: pybamm.ParameterValues
model: pybamm.BaseModel
sim: pybamm.Simulation

def setup(self, _params):
set_random_seed()

def mem_setup_DFN_simulationGITT(self, parameters):
self.param = pybamm.ParameterValues(parameters)
def mem_setup_DFN_simulationGITT(self, params):
self.param = pybamm.ParameterValues(params)
self.model = pybamm.lithium_ion.SPM()
exp = pybamm.Experiment(
[("Discharge at C/20 for 1 hour", "Rest for 1 hour")] * 20
Expand Down
19 changes: 16 additions & 3 deletions benchmarks/memory_unit_benchmarks.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import pybamm
from benchmarks.benchmark_utils import set_random_seed
import numpy as np


class MemCreateExpression:
R: pybamm.Parameter
model: pybamm.BaseModel

def setup(self):
set_random_seed()

def mem_create_expression(self):
self.R = pybamm.Parameter("Particle radius [m]")
D = pybamm.Parameter("Diffusion coefficient [m2.s-1]")
Expand Down Expand Up @@ -31,8 +38,12 @@ def mem_create_expression(self):
return self.model


class MemParameteriseModel:
class MemParameteriseModel(MemCreateExpression):
r: pybamm.SpatialVariable
geometry: dict

def setup(self):
set_random_seed()
MemCreateExpression.mem_create_expression(self)

def mem_parameterise(self):
Expand All @@ -58,8 +69,9 @@ def mem_parameterise(self):
return param


class MemDiscretiseModel:
class MemDiscretiseModel(MemParameteriseModel):
def setup(self):
set_random_seed()
MemCreateExpression.mem_create_expression(self)
MemParameteriseModel.mem_parameterise(self)

Expand All @@ -76,8 +88,9 @@ def mem_discretise(self):
return disc


class MemSolveModel:
class MemSolveModel(MemDiscretiseModel):
def setup(self):
set_random_seed()
MemCreateExpression.mem_create_expression(self)
MemParameteriseModel.mem_parameterise(self)
MemDiscretiseModel.mem_discretise(self)
Expand Down
Loading

0 comments on commit bdba266

Please sign in to comment.