"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+ "execution_count": null,
"source": [
- "rdata = amici.runAmiciSimulation(model, solver, edata)\n",
+ "rdata = amici.run_simulation(model, solver, edata)\n",
"amici.plotting.plot_observable_trajectories(rdata)"
]
},
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "On top of preequilibration, we can also specify presimulation. This option can be used to specify pretreatments where the system is not assumed to reach steadystate. Presimulation can be activated by specifying `t_presim` and `edata.fixedParametersPresimulation`. If both `fixedParametersPresimulation` and `fixedParametersPreequilibration` are specified, preequilibration will be performed first, followed by presimulation, followed by regular simulation. For this example we specify `DRUG_0=10` and `KIN_0=0` for the presimulation and `DRUG_0=10` and `KIN_0=2` for the regular simulation. We do not overwrite the `DRUG_0=3` and `KIN_0=0` that was previously specified for preequilibration."
- ]
+ "source": "On top of preequilibration, we can also specify presimulation. This option can be used to specify pretreatments where the system is not assumed to reach steadystate. Presimulation can be activated by specifying `t_presim` and `edata.fixed_parameters_presimulation`. If both `fixed_parameters_presimulation` and `fixed_parameters_pre_equilibration` are specified, pre-equilibration will be performed first, followed by presimulation, followed by regular simulation. For this example we specify `DRUG_0=10` and `KIN_0=0` for the presimulation and `DRUG_0=10` and `KIN_0=2` for the regular simulation. We do not overwrite the `DRUG_0=3` and `KIN_0=0` that was previously specified for pre-equilibration."
},
{
- "cell_type": "code",
- "execution_count": 14,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(3.0, 0.0)\n",
- "(10.0, 0.0)\n",
- "(10.0, 2.0)\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
"source": [
"edata.t_presim = 10\n",
- "edata.fixedParametersPresimulation = [10.0, 0.0]\n",
- "edata.fixedParameters = [10.0, 2.0]\n",
- "print(edata.fixedParametersPreequilibration)\n",
- "print(edata.fixedParametersPresimulation)\n",
- "print(edata.fixedParameters)\n",
- "rdata = amici.runAmiciSimulation(model, solver, edata)\n",
+ "edata.fixed_parameters_presimulation = [10.0, 0.0]\n",
+ "edata.fixed_parameters = [10.0, 2.0]\n",
+ "print(edata.fixed_parameters_pre_equilibration)\n",
+ "print(edata.fixed_parameters_presimulation)\n",
+ "print(edata.fixed_parameters)\n",
+ "rdata = amici.run_simulation(model, solver, edata)\n",
"amici.plotting.plot_observable_trajectories(rdata)"
]
}
diff --git a/doc/examples/example_splines/ExampleSplines.ipynb b/doc/examples/example_splines/ExampleSplines.ipynb
index 7958d63274..e121c3096b 100644
--- a/doc/examples/example_splines/ExampleSplines.ipynb
+++ b/doc/examples/example_splines/ExampleSplines.ipynb
@@ -89,17 +89,17 @@
" # Import the model module\n",
" model_module = amici.import_model_module(model_name, build_dir)\n",
" # Setup simulation timepoints and parameters\n",
- " model = model_module.getModel()\n",
+ " model = model_module.get_model()\n",
" for name, value in parameters.items():\n",
- " model.setParameterByName(name, value)\n",
+ " model.set_parameter_by_name(name, value)\n",
" if isinstance(T, int | float):\n",
" T = np.linspace(0, T, 100)\n",
- " model.setTimepoints([float(t) for t in T])\n",
- " solver = model.getSolver()\n",
- " solver.setSensitivityOrder(amici.SensitivityOrder.first)\n",
- " solver.setSensitivityMethod(amici.SensitivityMethod.forward)\n",
+ " model.set_timepoints([float(t) for t in T])\n",
+ " solver = model.create_solver()\n",
+ " solver.set_sensitivity_order(amici.SensitivityOrder.first)\n",
+ " solver.set_sensitivity_method(amici.SensitivityMethod.forward)\n",
" # Simulate\n",
- " rdata = amici.runAmiciSimulation(model, solver)\n",
+ " rdata = amici.run_simulation(model, solver)\n",
" # Plot results\n",
" if plot:\n",
" fig, ax = plt.subplots()\n",
@@ -587,9 +587,9 @@
"source": [
"# Sensitivities with respect to the spline values can be computed\n",
"fig, ax = plt.subplots()\n",
- "ax.plot(rdata[\"t\"], rdata.sx[:, 0], label=model.getParameterNames()[0])\n",
- "ax.plot(rdata[\"t\"], rdata.sx[:, 1], label=model.getParameterNames()[1])\n",
- "ax.plot(rdata[\"t\"], rdata.sx[:, 2], label=model.getParameterNames()[2])\n",
+ "ax.plot(rdata[\"t\"], rdata.sx[:, 0], label=model.get_parameter_names()[0])\n",
+ "ax.plot(rdata[\"t\"], rdata.sx[:, 1], label=model.get_parameter_names()[1])\n",
+ "ax.plot(rdata[\"t\"], rdata.sx[:, 2], label=model.get_parameter_names()[2])\n",
"ax.set_xlabel(\"time\")\n",
"ax.set_ylabel(\"sensitivity\")\n",
"ax.legend();"
diff --git a/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb b/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb
index 1f0cf5569f..bd43664797 100644
--- a/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb
+++ b/doc/examples/example_splines_swameye/ExampleSplinesSwameye2003.ipynb
@@ -25,7 +25,8 @@
"metadata": {},
"outputs": [],
"source": [
- "%pip install pypesto"
+ "# %pip install pypesto\n",
+ "%pip install pypesto git+https://github.com/dweindl/pyPESTO.git@amici100"
]
},
{
@@ -361,13 +362,10 @@
]
},
{
+ "metadata": {},
"cell_type": "code",
- "execution_count": 15,
- "id": "1beb3a3e-6966-4d3e-acc5-546c1932df9f",
- "metadata": {
- "tags": []
- },
"outputs": [],
+ "execution_count": null,
"source": [
"# Import PEtab problem into pyPESTO\n",
"pypesto_problem = pypesto.petab.PetabImporter(\n",
@@ -378,8 +376,9 @@
")\n",
"\n",
"# Increase maximum number of steps for AMICI\n",
- "pypesto_problem.objective.amici_solver.setMaxSteps(10**5)"
- ]
+ "pypesto_problem.objective.amici_solver.set_max_steps(10**5)"
+ ],
+ "id": "c6741bce012b6ffa"
},
{
"cell_type": "markdown",
@@ -534,7 +533,7 @@
"\n",
"def simulate_pEpoR(x=None, **kwargs):\n",
" problem, rdata = _simulate(x, **kwargs)\n",
- " assert problem.objective.amici_model.getObservableIds()[0].startswith(\n",
+ " assert problem.objective.amici_model.get_observable_ids()[0].startswith(\n",
" \"pEpoR\"\n",
" )\n",
" return rdata[\"t\"], rdata[\"y\"][:, 0]\n",
@@ -542,7 +541,7 @@
"\n",
"def simulate_pSTAT5(x=None, **kwargs):\n",
" problem, rdata = _simulate(x, **kwargs)\n",
- " assert problem.objective.amici_model.getObservableIds()[1].startswith(\n",
+ " assert problem.objective.amici_model.get_observable_ids()[1].startswith(\n",
" \"pSTAT5\"\n",
" )\n",
" return rdata[\"t\"], rdata[\"y\"][:, 1]\n",
@@ -550,7 +549,7 @@
"\n",
"def simulate_tSTAT5(x=None, **kwargs):\n",
" problem, rdata = _simulate(x, **kwargs)\n",
- " assert problem.objective.amici_model.getObservableIds()[-1].startswith(\n",
+ " assert problem.objective.amici_model.get_observable_ids()[-1].startswith(\n",
" \"tSTAT5\"\n",
" )\n",
" return rdata[\"t\"], rdata[\"y\"][:, -1]\n",
diff --git a/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb b/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb
index a7840e1127..c7875a6bce 100644
--- a/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb
+++ b/doc/examples/example_steady_states/ExampleEquilibrationLogic.ipynb
@@ -80,9 +80,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Import necessary libraries and define the model\n",
"import amici\n",
@@ -105,7 +103,7 @@
" SensitivityOrder,\n",
" SensitivityMethod,\n",
" import_model_module,\n",
- " runAmiciSimulation,\n",
+ " run_simulation,\n",
" AMICI_SUCCESS,\n",
" AMICI_ERROR,\n",
" ExpData,\n",
@@ -159,13 +157,13 @@
"temp_dir = Path(tempfile.mkdtemp())\n",
"model_output_dir = temp_dir / model_name\n",
"model_reduced_output_dir = temp_dir / model_reduced_name"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Import the model\n",
"sbml_importer = amici.SbmlImporter(antimony2sbml(ant_model), from_file=False)\n",
@@ -197,33 +195,33 @@
" observation_model=observation_model,\n",
" constant_parameters=constant_parameters,\n",
")"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
- "cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
+ "cell_type": "code",
"source": [
"# import the models and run some test simulations\n",
"model_reduced_module = import_model_module(\n",
" model_reduced_name, model_reduced_output_dir\n",
")\n",
- "model_reduced = model_reduced_module.getModel()\n",
+ "model_reduced = model_reduced_module.get_model()\n",
"\n",
"model_module = import_model_module(model_name, model_output_dir)\n",
- "model = model_module.getModel()\n",
+ "model = model_module.get_model()\n",
"\n",
"# simulate model with conservation laws\n",
- "model.setTimepoints(np.linspace(0, 2, 100))\n",
- "solver = model.getSolver()\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "model.set_timepoints(np.linspace(0, 2, 100))\n",
+ "solver = model.create_solver()\n",
+ "rdata = run_simulation(model, solver)\n",
"assert rdata.status == AMICI_SUCCESS\n",
"\n",
"# simulate model without conservation laws\n",
- "model_reduced.setTimepoints(np.linspace(0, 2, 100))\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced)\n",
+ "model_reduced.set_timepoints(np.linspace(0, 2, 100))\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"\n",
"# plot trajectories\n",
@@ -233,20 +231,22 @@
"plot_state_trajectories(rdata_reduced, model=model_reduced, ax=axes[0, 1])\n",
"plot_observable_trajectories(rdata_reduced, model=model_reduced, ax=axes[1, 1])\n",
"fig.tight_layout()"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
- "cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
+ "cell_type": "code",
"source": [
"# the enzyme state was removed from the ODEs of the reduced model\n",
- "print(model.getStateIdsSolver())\n",
- "print(model_reduced.getStateIdsSolver())\n",
- "print(model.getStateIds())\n",
- "print(model_reduced.getStateIds())"
- ]
+ "print(model.get_state_ids_solver())\n",
+ "print(model_reduced.get_state_ids_solver())\n",
+ "print(model.get_state_ids())\n",
+ "print(model_reduced.get_state_ids())"
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -290,24 +290,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# Call post-equilibration by setting an infinity timepoint\n",
- "model.setTimepoints([np.inf])\n",
+ "model.set_timepoints([np.inf])\n",
"\n",
"# Set the solver\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
"# maximum number of solver steps for numerical integration\n",
- "solver.setMaxSteps(1000)\n",
- "model.setSteadyStateComputationMode(\n",
+ "solver.set_max_steps(1000)\n",
+ "model.set_steady_state_computation_mode(\n",
" SteadyStateComputationMode.integrateIfNewtonFails\n",
")\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "rdata = run_simulation(model, solver)\n",
"assert rdata.status == AMICI_SUCCESS\n",
"# print out a subset of data returned by model simulation\n",
"for key in [\n",
@@ -317,13 +313,15 @@
" \"posteq_wrms\",\n",
" \"posteq_t\",\n",
" \"posteq_numsteps\",\n",
- " \"posteq_numstepsB\",\n",
+ " \"posteq_numsteps_b\",\n",
" \"posteq_status\",\n",
" \"posteq_cpu_time\",\n",
- " \"posteq_cpu_timeB\",\n",
+ " \"posteq_cpu_time_b\",\n",
"]:\n",
" print(f\"{key:>16}: {rdata[key]}\")"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -350,12 +348,12 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"list(SteadyStateStatus)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -373,46 +371,44 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# steady state value found by pre-equilibration\n",
"steady_state = rdata[\"x\"][0]\n",
"\n",
"timepoints = np.linspace(0, 14, 200)\n",
- "model.setTimepoints(timepoints)\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "model.set_timepoints(timepoints)\n",
+ "rdata = run_simulation(model, solver)\n",
"plot_state_trajectories(rdata, model=model)\n",
"\n",
"for stst_value in steady_state:\n",
" plt.axhline(y=stst_value, color=\"gray\", linestyle=\"--\", linewidth=1)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "We want to demonstrate a complete failure during the steady-state computation by reducing the number of integration steps to a lower value:"
- ]
+ "source": "We want to demonstrate a complete failure during the steady-state computation by reducing the number of integration steps to a lower value:"
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# reduce maxsteps for integration\n",
- "model.setTimepoints([np.inf])\n",
- "solver.setMaxSteps(100)\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "model.set_timepoints([np.inf])\n",
+ "solver.set_max_steps(100)\n",
+ "rdata = run_simulation(model, solver)\n",
"assert rdata.status == AMICI_ERROR\n",
"print(\"Simulation status:\", simulation_status_to_str(rdata[\"status\"]))\n",
"print(\"Status of post-equilibration:\", rdata[\"posteq_status\"])\n",
"print(\n",
" \"Number of steps employed in post-equilibration:\", rdata[\"posteq_numsteps\"]\n",
")"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -424,22 +420,18 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
+ "metadata": {},
"source": [
- "model_reduced.setTimepoints([np.inf])\n",
- "model_reduced.setSteadyStateComputationMode(\n",
+ "model_reduced.set_timepoints([np.inf])\n",
+ "model_reduced.set_steady_state_computation_mode(\n",
" SteadyStateComputationMode.integrateIfNewtonFails\n",
")\n",
"\n",
"# set the solver\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setMaxSteps(100)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_max_steps(100)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"assert rdata_reduced.posteq_status[0] == SteadyStateStatus.success\n",
"print(\n",
@@ -452,7 +444,9 @@
" \"Number of steps employed in post-equilibration:\",\n",
" rdata_reduced[\"posteq_numsteps\"],\n",
")"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -465,31 +459,27 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# create edata, with 3 timepoints and 2 observables:\n",
"edata = ExpData(2, 0, 0, np.array([0.0, 0.1, 1.0]))\n",
- "edata.setObservedData([1.8] * 6)\n",
- "edata.fixedParameters = np.array([3.0, 5.0])\n",
+ "edata.set_observed_data([1.8] * 6)\n",
+ "edata.fixed_parameters = np.array([3.0, 5.0])\n",
"# set parameters for pre-equilibration\n",
- "edata.fixedParametersPreequilibration = np.array([0.0, 2.0])\n",
- "edata.reinitializeFixedParameterInitialStates = True"
- ]
+ "edata.fixed_parameters_pre_equilibration = np.array([0.0, 2.0])\n",
+ "edata.reinitialize_fixed_parameter_initial_states = True"
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# create the solver object and run the simulation\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"print(\n",
" \"Simulation status:\",\n",
@@ -506,7 +496,9 @@
"\n",
"plot_state_trajectories(rdata_reduced, model=model_reduced)\n",
"plot_observable_trajectories(rdata_reduced, model=model_reduced)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -520,17 +512,17 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Change the last timepoint to an infinity timepoint.\n",
- "edata.setTimepoints(np.array([0.0, 0.1, float(\"inf\")]))\n",
+ "edata.set_timepoints(np.array([0.0, 0.1, float(\"inf\")]))\n",
"\n",
"# run the simulation\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"assert rdata_reduced.status == AMICI_SUCCESS"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -582,23 +574,19 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# Call simulation with singular Jacobian and `integrateIfNewtonFails` mode\n",
- "model.setTimepoints([np.inf])\n",
- "model.setSteadyStateSensitivityMode(\n",
+ "model.set_timepoints([np.inf])\n",
+ "model.set_steady_state_sensitivity_mode(\n",
" SteadyStateSensitivityMode.integrateIfNewtonFails\n",
")\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "solver.setMaxSteps(10000)\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "solver.set_max_steps(10000)\n",
+ "rdata = run_simulation(model, solver)\n",
"\n",
"np.set_printoptions(threshold=20)\n",
"print(\"Simulation status:\", simulation_status_to_str(rdata[\"status\"]))\n",
@@ -608,7 +596,9 @@
")\n",
"print(\"Computed state sensitivities:\")\n",
"print(rdata[\"sx\"][0, :, :])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -620,19 +610,17 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Call simulation with singular Jacobian and newtonOnly mode (will fail)\n",
- "model.setTimepoints([np.inf])\n",
- "model.setSteadyStateSensitivityMode(SteadyStateSensitivityMode.newtonOnly)\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "solver.setMaxSteps(10000)\n",
- "rdata = runAmiciSimulation(model, solver)\n",
+ "model.set_timepoints([np.inf])\n",
+ "model.set_steady_state_sensitivity_mode(SteadyStateSensitivityMode.newtonOnly)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "solver.set_max_steps(10000)\n",
+ "rdata = run_simulation(model, solver)\n",
"assert rdata.status == AMICI_ERROR\n",
"\n",
"print(\"Simulation status:\", simulation_status_to_str(rdata[\"status\"]))\n",
@@ -643,7 +631,9 @@
")\n",
"print(\"Computed state sensitivities:\")\n",
"print(rdata[\"sx\"][0, :, :])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -656,23 +646,19 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# Try `newtonOnly` option with reduced model\n",
- "model_reduced.setTimepoints([np.inf])\n",
- "model_reduced.setSteadyStateSensitivityMode(\n",
+ "model_reduced.set_timepoints([np.inf])\n",
+ "model_reduced.set_steady_state_sensitivity_mode(\n",
" SteadyStateSensitivityMode.newtonOnly\n",
")\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "solver_reduced.setMaxSteps(1000)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "solver_reduced.set_max_steps(1000)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"assert rdata_reduced.posteq_status == [\n",
" SteadyStateStatus.success,\n",
@@ -692,14 +678,14 @@
")\n",
"print(\"Computed state sensitivities:\")\n",
"print(rdata_reduced[\"sx\"][0, :, :])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "In this case, both steady state and the corresponding sensitivities could be computed by solving the linear systems $\\mathbf{s}^x = - \\frac{\\partial \\mathbf{f}}{\\partial \\theta}$ for state sensitivities ($\\mathbf{s}^x$)."
- ]
+ "source": "In this case, both steady state and the corresponding sensitivities could be computed by solving the linear systems $\\mathbf{s}^x = - \\frac{\\partial \\mathbf{f}}{\\partial \\theta}$ for state sensitivities ($\\mathbf{s}^x$)."
},
{
"cell_type": "markdown",
@@ -766,26 +752,24 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Call post-equilibration and sensitivities computation using adjoint sensitivity analysis\n",
"# by setting an infinity timepoint\n",
"# and creatÃng an edata object, which is needed for adjoint computation\n",
"edata = ExpData(2, 0, 0, np.array([float(\"inf\")]))\n",
- "edata.setObservedData([1.8] * 2)\n",
- "edata.fixedParameters = np.array([3.0, 5.0])\n",
+ "edata.set_observed_data([1.8] * 2)\n",
+ "edata.fixed_parameters = np.array([3.0, 5.0])\n",
"\n",
- "model_reduced.setSteadyStateSensitivityMode(\n",
+ "model_reduced.set_steady_state_sensitivity_mode(\n",
" SteadyStateSensitivityMode.newtonOnly\n",
")\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "solver_reduced.setMaxSteps(1000)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "solver_reduced.set_max_steps(1000)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"\n",
"print(\n",
" \"Simulation status:\",\n",
@@ -798,33 +782,33 @@
")\n",
"print(\n",
" \"Number of backward steps employed in post-equilibration:\",\n",
- " rdata_reduced[\"posteq_numstepsB\"],\n",
+ " rdata_reduced[\"posteq_numsteps_b\"],\n",
")\n",
"print(\"Computed gradient:\", rdata_reduced[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "If we carry out the same computation with a system that has a singular Jacobian, then `posteq_numstepsB` will not be `0` anymore (which indicates that the linear system solve was used to compute backward post-equilibration).\n",
- "Now, integration is carried out and hence `posteq_numstepsB > 0`:"
+ "If we carry out the same computation with a system that has a singular Jacobian, then `posteq_numsteps_b` will not be `0` anymore (which indicates that the linear system solve was used to compute backward post-equilibration).\n",
+ "Now, integration is carried out and hence `posteq_numsteps_b > 0`:"
]
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Call adjoint post-equilibration with model with singular Jacobian\n",
- "model.setSteadyStateSensitivityMode(SteadyStateSensitivityMode.newtonOnly)\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setMaxStepsBackwardProblem(10000)\n",
- "solver.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata = runAmiciSimulation(model, solver, edata)\n",
+ "model.set_steady_state_sensitivity_mode(SteadyStateSensitivityMode.newtonOnly)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_max_steps_backward_problem(10000)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata = run_simulation(model, solver, edata)\n",
"\n",
"print(\"Simulation status:\", simulation_status_to_str(rdata[\"status\"]))\n",
"print(\"Status of post-equilibration:\", rdata[\"posteq_status\"])\n",
@@ -833,10 +817,12 @@
")\n",
"print(\n",
" \"Number of backward steps employed in post-equilibration:\",\n",
- " rdata[\"posteq_numstepsB\"],\n",
+ " rdata[\"posteq_numsteps_b\"],\n",
")\n",
"print(\"Computed gradient:\", rdata[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -851,58 +837,50 @@
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "#### Pre-equilibration with forward sensitivities"
- ]
+ "source": "#### Pre-equilibration with forward sensitivities"
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# No post-equilibration this time.\n",
"# create edata, with 3 timepoints and 2 observables:\n",
"edata = ExpData(2, 0, 0, np.array([0.0, 0.1, 1.0]))\n",
- "edata.setObservedData([1.8] * 6)\n",
- "edata.fixedParameters = np.array([3.0, 5.0])\n",
+ "edata.set_observed_data([1.8] * 6)\n",
+ "edata.fixed_parameters = np.array([3.0, 5.0])\n",
"# set parameters for pre-equilibration\n",
- "edata.fixedParametersPreequilibration = np.array([0.0, 2.0])\n",
- "edata.reinitializeFixedParameterInitialStates = True\n",
+ "edata.fixed_parameters_pre_equilibration = np.array([0.0, 2.0])\n",
+ "edata.reinitialize_fixed_parameter_initial_states = True\n",
"\n",
"# create the solver object and run the simulation, singular Jacobian, enforce Newton solver for sensitivities\n",
- "model.setSteadyStateSensitivityMode(SteadyStateSensitivityMode.newtonOnly)\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata = runAmiciSimulation(model, solver, edata)\n",
+ "model.set_steady_state_sensitivity_mode(SteadyStateSensitivityMode.newtonOnly)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata = run_simulation(model, solver, edata)\n",
"\n",
"assert rdata.status == AMICI_ERROR\n",
"for key, value in rdata.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# Singular Jacobian, use simulation\n",
- "model.setSteadyStateSensitivityMode(\n",
+ "model.set_steady_state_sensitivity_mode(\n",
" SteadyStateSensitivityMode.integrateIfNewtonFails\n",
")\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata = runAmiciSimulation(model, solver, edata)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata = run_simulation(model, solver, edata)\n",
"assert rdata.status == AMICI_SUCCESS\n",
"assert rdata.preeq_status == [\n",
" SteadyStateStatus.failed_factorization,\n",
@@ -913,25 +891,27 @@
"for key, value in rdata.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Non-singular Jacobian, use Newton solver\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"for key, value in rdata_reduced.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -959,16 +939,14 @@
},
{
"cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
"source": [
"# Non-singular Jacobian, use Newton solver and adjoints with initial state sensitivities\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"assert rdata_reduced.preeq_status == [\n",
@@ -980,20 +958,20 @@
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)\n",
"print(\"Gradient:\", rdata_reduced[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
- "cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
+ "cell_type": "code",
"source": [
"# Non-singular Jacobian, use simulation solver and adjoints with initial state sensitivities\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(0)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(0)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"assert rdata_reduced.preeq_status == [\n",
@@ -1001,59 +979,61 @@
" SteadyStateStatus.success,\n",
" SteadyStateStatus.not_run,\n",
"]\n",
- "assert rdata_reduced.preeq_numstepsB == 0\n",
+ "assert rdata_reduced.preeq_numsteps_b == 0\n",
"\n",
"for key, value in rdata_reduced.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)\n",
"print(\"Gradient:\", rdata_reduced[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
- "cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
+ "cell_type": "code",
"source": [
"# Non-singular Jacobian, use Newton solver and adjoints with fully adjoint pre-equilibration\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(10)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver_reduced.setSensitivityMethodPreequilibration(SensitivityMethod.adjoint)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata_reduced = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(10)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver_reduced.set_sensitivity_method_pre_equilibration(\n",
+ " SensitivityMethod.adjoint\n",
+ ")\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata_reduced = run_simulation(model_reduced, solver_reduced, edata)\n",
"assert rdata_reduced.status == AMICI_SUCCESS\n",
"assert rdata_reduced.preeq_status == [\n",
" SteadyStateStatus.success,\n",
" SteadyStateStatus.not_run,\n",
" SteadyStateStatus.not_run,\n",
"]\n",
- "assert rdata_reduced.preeq_numstepsB == 0\n",
+ "assert rdata_reduced.preeq_numsteps_b == 0\n",
"\n",
"for key, value in rdata_reduced.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)\n",
"print(\"Gradient:\", rdata_reduced[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
- "cell_type": "markdown",
"metadata": {},
- "source": "As for post-equilibration, adjoint pre-equilibration has an analytic solution (via the linear system), which will be preferred. If used for models with singular Jacobian, numerical integration will be carried out, which is indicated by `preeq_numstepsB`."
+ "cell_type": "markdown",
+ "source": "As for post-equilibration, adjoint pre-equilibration has an analytic solution (via the linear system), which will be preferred. If used for models with singular Jacobian, numerical integration will be carried out, which is indicated by `preeq_numsteps_b`."
},
{
- "cell_type": "code",
- "execution_count": null,
"metadata": {},
- "outputs": [],
+ "cell_type": "code",
"source": [
"# Singular Jacobian, use try Newton solver and adjoints with fully adjoint pre-equilibration\n",
- "solver = model.getSolver()\n",
- "solver.setNewtonMaxSteps(10)\n",
- "solver.setSensitivityMethod(SensitivityMethod.adjoint)\n",
- "solver.setSensitivityMethodPreequilibration(SensitivityMethod.adjoint)\n",
- "solver.setSensitivityOrder(SensitivityOrder.first)\n",
- "rdata = runAmiciSimulation(model, solver, edata)\n",
+ "solver = model.create_solver()\n",
+ "solver.set_newton_max_steps(10)\n",
+ "solver.set_sensitivity_method(SensitivityMethod.adjoint)\n",
+ "solver.set_sensitivity_method_pre_equilibration(SensitivityMethod.adjoint)\n",
+ "solver.set_sensitivity_order(SensitivityOrder.first)\n",
+ "rdata = run_simulation(model, solver, edata)\n",
"assert rdata.status == AMICI_SUCCESS\n",
"assert rdata.preeq_status == [\n",
" SteadyStateStatus.failed_factorization,\n",
@@ -1061,12 +1041,14 @@
" SteadyStateStatus.not_run,\n",
"]\n",
"\n",
- "assert rdata.preeq_numstepsB > 0\n",
+ "assert rdata.preeq_numsteps_b > 0\n",
"for key, value in rdata.items():\n",
" if key[0:6] == \"preeq_\":\n",
" print(f\"{key:20s}:\", value)\n",
"print(\"Gradient:\", rdata[\"sllh\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
},
{
"cell_type": "markdown",
@@ -1088,36 +1070,30 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {
- "pycharm": {
- "name": "#%%\n"
- }
- },
- "outputs": [],
+ "metadata": {},
"source": [
"# Non-singular Jacobian, use simulation\n",
- "model_reduced.setSteadyStateSensitivityMode(\n",
+ "model_reduced.set_steady_state_sensitivity_mode(\n",
" SteadyStateSensitivityMode.integrateIfNewtonFails\n",
")\n",
- "solver_reduced = model_reduced.getSolver()\n",
- "solver_reduced.setNewtonMaxSteps(0)\n",
- "solver_reduced.setSensitivityMethod(SensitivityMethod.forward)\n",
- "solver_reduced.setSensitivityOrder(SensitivityOrder.first)\n",
+ "solver_reduced = model_reduced.create_solver()\n",
+ "solver_reduced.set_newton_max_steps(0)\n",
+ "solver_reduced.set_sensitivity_method(SensitivityMethod.forward)\n",
+ "solver_reduced.set_sensitivity_order(SensitivityOrder.first)\n",
"\n",
"# run with lax tolerances\n",
- "solver_reduced.setRelativeToleranceSteadyState(1e-2)\n",
- "solver_reduced.setAbsoluteToleranceSteadyState(1e-3)\n",
- "solver_reduced.setRelativeToleranceSteadyStateSensi(1e-2)\n",
- "solver_reduced.setAbsoluteToleranceSteadyStateSensi(1e-3)\n",
- "rdata_reduced_lax = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced.set_relative_tolerance_steady_state(1e-2)\n",
+ "solver_reduced.set_absolute_tolerance_steady_state(1e-3)\n",
+ "solver_reduced.set_relative_tolerance_steady_state_sensi(1e-2)\n",
+ "solver_reduced.set_absolute_tolerance_steady_state_sensi(1e-3)\n",
+ "rdata_reduced_lax = run_simulation(model_reduced, solver_reduced, edata)\n",
"\n",
"# run with strict tolerances\n",
- "solver_reduced.setRelativeToleranceSteadyState(1e-12)\n",
- "solver_reduced.setAbsoluteToleranceSteadyState(1e-16)\n",
- "solver_reduced.setRelativeToleranceSteadyStateSensi(1e-12)\n",
- "solver_reduced.setAbsoluteToleranceSteadyStateSensi(1e-16)\n",
- "rdata_reduced_strict = runAmiciSimulation(model_reduced, solver_reduced, edata)\n",
+ "solver_reduced.set_relative_tolerance_steady_state(1e-12)\n",
+ "solver_reduced.set_absolute_tolerance_steady_state(1e-16)\n",
+ "solver_reduced.set_relative_tolerance_steady_state_sensi(1e-12)\n",
+ "solver_reduced.set_absolute_tolerance_steady_state_sensi(1e-16)\n",
+ "rdata_reduced_strict = run_simulation(model_reduced, solver_reduced, edata)\n",
"\n",
"# compare ODE outputs\n",
"print(\"Number of ODE solver steps, until steady state:\")\n",
@@ -1131,7 +1107,9 @@
"print(\"\\nCPU time to reach steady state (ms):\")\n",
"print(\" lax tolerances: \", rdata_reduced_lax[\"preeq_cpu_time\"])\n",
"print(\" strict tolerances:\", rdata_reduced_strict[\"preeq_cpu_time\"])"
- ]
+ ],
+ "outputs": [],
+ "execution_count": null
}
],
"metadata": {
diff --git a/doc/examples/getting_started/GettingStarted.ipynb b/doc/examples/getting_started/GettingStarted.ipynb
index 1bacf00bef..c58e7f2ddc 100644
--- a/doc/examples/getting_started/GettingStarted.ipynb
+++ b/doc/examples/getting_started/GettingStarted.ipynb
@@ -14,7 +14,7 @@
"metadata": {},
"source": [
"## Model Compilation\n",
- "Before simulations can be run, the model must be imported and compiled. In this process, AMICI performs all symbolic manipulations that later enable scalable simulations and efficient sensitivity computation. The first step towards model compilation is the creation of an [SbmlImporter](https://amici.readthedocs.io/en/latest/generated/amici.sbml_import.SbmlImporter.html) instance, which requires an SBML Document that specifies the model using the [Systems Biology Markup Language (SBML)](https://sbml.org/). \n",
+ "Before simulations can be run, the model must be imported and compiled. In this process, AMICI performs all symbolic manipulations that later enable scalable simulations and efficient sensitivity computation. The first step towards model compilation is the creation of an [SbmlImporter](https://amici.readthedocs.io/en/latest/generated/amici.sbml_import.SbmlImporter.html) instance, which requires an SBML Document that specifies the model using the [Systems Biology Markup Language (SBML)](https://sbml.org/).\n",
"\n",
"For the purpose of this tutorial, we will use `model_steadystate_scaled.xml`, which is contained in the same directory as this notebook."
]
@@ -53,7 +53,7 @@
"metadata": {},
"source": [
"## Loading the model module\n",
- "To run simulations, we need to instantiate [amici.Model](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html) and [amici.Solver](https://amici.readthedocs.io/en/latest/generated/amici.amici.Solver.html) instances. As simulations require instances matching the imported model, they have to be imported from the generated model module. "
+ "To run simulations, we need to instantiate [amici.Model](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html) and [amici.Solver](https://amici.readthedocs.io/en/latest/generated/amici.amici.Solver.html) instances. As simulations require instances matching the imported model, they have to be imported from the generated model module."
]
},
{
@@ -65,42 +65,34 @@
"# load the model module\n",
"model_module = amici.import_model_module(model_name, model_dir)\n",
"# instantiate model\n",
- "model = model_module.getModel()\n",
+ "model = model_module.get_model()\n",
"# instantiate solver\n",
- "solver = model.getSolver()"
+ "solver = model.create_solver()"
]
},
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "The model allows the user to manipulate model related properties of simulations. This includes the values of model parameters that can be set by using [amici.Model.setParameterByName](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html#amici.amici.Model.setParameterByName). Here, we set the model parameter `p1` to a value of `1e-3`."
- ]
+ "source": "The model allows the user to manipulate model related properties of simulations. This includes the values of model parameters that can be set by using [amici.Model.set_parameter_by_name](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html#amici.amici.Model.set_parameter_by_name). Here, we set the model parameter `p1` to a value of `1e-3`."
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
- "source": [
- "model.setParameterByName(\"p1\", 1e-3)"
- ]
+ "source": "model.set_parameter_by_name(\"p1\", 1e-3)"
},
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "In contrast, the solver instance allows the specification of simulation related properties. This includes setting options for the SUNDIALS solver such as absolute tolerances via [amici.Solver.setAbsoluteTolerance](https://amici.readthedocs.io/en/latest/generated/amici.amici.Solver.html#amici.amici.Solver.setAbsoluteTolerance). Here we set the absolute integration tolerances to `1e-10`."
- ]
+ "source": "In contrast, the solver instance allows the specification of simulation related properties. This includes setting options for the SUNDIALS solver such as absolute tolerances via [amici.Solver.set_absolute_tolerance](https://amici.readthedocs.io/en/latest/generated/amici.amici.Solver.html#amici.amici.Solver.set_absolute_tolerance). Here we set the absolute integration tolerances to `1e-10`."
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
- "source": [
- "solver.setAbsoluteTolerance(1e-10)"
- ]
+ "source": "solver.set_absolute_tolerance(1e-10)"
},
{
"cell_type": "markdown",
@@ -112,9 +104,7 @@
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "Model simulations can be executed using the [amici.runAmiciSimulations](https://amici.readthedocs.io/en/latest/generated/amici.html#amici.runAmiciSimulation) routine. By default, the model does not contain any timepoints for which the model is to be simulated. Here we define a simulation timecourse with two timepoints at `0` and `1` and then run the simulation."
- ]
+ "source": "Model simulations can be executed using the [amici.run_simulation](https://amici.readthedocs.io/en/latest/generated/amici.html#amici.run_simulation) routine. By default, the model does not contain any timepoints for which the model is to be simulated. Here we define a simulation timecourse with two timepoints at `0` and `1` and then run the simulation."
},
{
"cell_type": "code",
@@ -123,8 +113,8 @@
"outputs": [],
"source": [
"# set timepoints\n",
- "model.setTimepoints([0, 1])\n",
- "rdata = amici.runAmiciSimulation(model, solver)"
+ "model.set_timepoints([0, 1])\n",
+ "rdata = amici.run_simulation(model, solver)"
]
},
{
@@ -158,9 +148,7 @@
{
"cell_type": "markdown",
"metadata": {},
- "source": [
- "All results attributes are always ordered according to the model. For species, this means that the columns of `rdata.x` match the ordering of species in the model, which can be accessed as [amici.Model.getStateNames](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html#amici.amici.Model.getStateNames)"
- ]
+ "source": "All results attributes are always ordered according to the model. For species, this means that the columns of `rdata.x` match the ordering of species in the model, which can be accessed as [amici.Model.get_state_names](https://amici.readthedocs.io/en/latest/generated/amici.amici.Model.html#amici.amici.Model.get_state_names)"
},
{
"cell_type": "code",
@@ -178,9 +166,7 @@
"output_type": "execute_result"
}
],
- "source": [
- "model.getStateNames()"
- ]
+ "source": "model.get_state_names()"
},
{
"cell_type": "markdown",
diff --git a/doc/examples/getting_started_extended/GettingStartedExtended.ipynb b/doc/examples/getting_started_extended/GettingStartedExtended.ipynb
index 2f0dd61857..5a1c814590 100644
--- a/doc/examples/getting_started_extended/GettingStartedExtended.ipynb
+++ b/doc/examples/getting_started_extended/GettingStartedExtended.ipynb
@@ -365,28 +365,17 @@
]
},
{
- "cell_type": "code",
- "execution_count": 9,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Model name: model_steadystate_scaled\n",
- "Model parameters: ('p1', 'p2', 'p3', 'p4', 'p5', 'scaling_x1', 'offset_x2', 'observable_x1withsigma_sigma')\n",
- "Model outputs: ('observable_x1', 'observable_x2', 'observable_x3', 'observable_x1_scaled', 'observable_x2_offsetted', 'observable_x1withsigma')\n",
- "Model states: ('x1', 'x2', 'x3')\n"
- ]
- }
- ],
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
"source": [
- "model = model_module.getModel()\n",
+ "model = model_module.get_model()\n",
"\n",
- "print(\"Model name: \", model.getName())\n",
- "print(\"Model parameters: \", model.getParameterIds())\n",
- "print(\"Model outputs: \", model.getObservableIds())\n",
- "print(\"Model state variables: \", model.getStateIds())"
+ "print(\"Model name: \", model.get_name())\n",
+ "print(\"Model parameters: \", model.get_parameter_ids())\n",
+ "print(\"Model outputs: \", model.get_observable_ids())\n",
+ "print(\"Model state variables: \", model.get_state_ids())"
]
},
{
@@ -397,49 +386,38 @@
"source": [
"## Running simulations and analyzing results\n",
"\n",
- "After importing the model, we can run simulations using `amici.runAmiciSimulation`. This requires a `Model` instance and a `Solver` instance. Optionally you can provide measurements inside an `ExpData` instance, as shown later in this notebook."
+ "After importing the model, we can run simulations using `amici.run_simulation`. This requires a `Model` instance and a `Solver` instance. Optionally you can provide measurements inside an `ExpData` instance, as shown later in this notebook."
]
},
{
"cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "scrolled": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"# Create Model instance\n",
- "model = model_module.getModel()\n",
+ "model = model_module.get_model()\n",
"\n",
"# set timepoints for which we want to simulate the model\n",
- "model.setTimepoints(np.linspace(0, 60, 60))\n",
+ "model.set_timepoints(np.linspace(0, 60, 60))\n",
"\n",
"# Create solver instance\n",
- "solver = model.getSolver()\n",
+ "solver = model.create_solver()\n",
"\n",
"# Run simulation using default model parameters and solver options\n",
- "rdata = amici.runAmiciSimulation(model, solver)"
+ "rdata = amici.run_simulation(model, solver)"
]
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Simulation was run using model default parameters as specified in the SBML model:\n",
- "(1.0, 0.5, 0.4, 2.0, 0.1, 2.0, 3.0, 0.2)\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"print(\n",
" \"Simulation was run using model default parameters as specified in the SBML model:\"\n",
")\n",
- "print(dict(zip(model.getParameterIds(), model.getParameters())))"
+ "print(dict(zip(model.get_parameter_ids(), model.get_parameters())))"
]
},
{
@@ -871,23 +849,27 @@
]
},
{
- "metadata": {},
"cell_type": "markdown",
+ "metadata": {},
"source": "Alternatively, those data can be accessed through `ReturnData.xr.*` as [xarray.DataArray](https://docs.xarray.dev/en/stable/index.html) objects, that contain additional metadata such as timepoints and identifiers. This allows for more convenient indexing and plotting of the results."
},
{
- "metadata": {},
"cell_type": "code",
- "source": "rdata.xr.x",
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
- "execution_count": null
+ "source": [
+ "rdata.xr.x"
+ ]
},
{
- "metadata": {},
"cell_type": "code",
- "source": "rdata.xr.x.to_pandas()",
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
- "execution_count": null
+ "source": [
+ "rdata.xr.x.to_pandas()"
+ ]
},
{
"cell_type": "markdown",
@@ -964,33 +946,25 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Log-likelihood -97.118555\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# Create model instance and set time points for simulation\n",
- "model = model_module.getModel()\n",
- "model.setTimepoints(np.linspace(0, 10, 11))\n",
+ "model = model_module.get_model()\n",
+ "model.set_timepoints(np.linspace(0, 10, 11))\n",
"\n",
"# Create solver instance, keep default options\n",
- "solver = model.getSolver()\n",
+ "solver = model.create_solver()\n",
"\n",
"# Run simulation without experimental data\n",
- "rdata = amici.runAmiciSimulation(model, solver)\n",
+ "rdata = amici.run_simulation(model, solver)\n",
"\n",
"# Create ExpData instance from simulation results\n",
"edata = amici.ExpData(rdata, 1.0, 0.0)\n",
"\n",
"# Re-run simulation, this time passing \"experimental data\"\n",
- "rdata = amici.runAmiciSimulation(model, solver, edata)\n",
+ "rdata = amici.run_simulation(model, solver, edata)\n",
"\n",
"print(f\"Log-likelihood {rdata['llh']:f}\")"
]
@@ -1015,42 +989,31 @@
"metadata": {},
"source": [
"### Simulation tolerances\n",
- "Numerical error tolerances are often critical to get accurate results. For the state variables, integration errors can be controlled using `setRelativeTolerance` and `setAbsoluteTolerance`. Similar functions exist for sensitivities, steadystates and quadratures. We initially compute a reference solution using extremely low tolerances and then assess the influence on integration error for different levels of absolute and relative tolerance."
+ "Numerical error tolerances are often critical to get accurate results. For the state variables, integration errors can be controlled using `set_relative_tolerance` and `set_absolute_tolerance`. Similar functions exist for sensitivities, steady states and quadratures. We initially compute a reference solution using extremely low tolerances and then assess the influence on integration error for different levels of absolute and relative tolerance."
]
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": "
",
- "text/plain": " time t_presim k0 k0_preeq k0_presim x1 x2 x3\n0 0.0 0.0 1.0 NaN NaN 0.100000 0.400000 0.700000\n1 0.5 0.0 1.0 NaN NaN 0.539367 0.684679 0.191491\n2 1.0 0.0 1.0 NaN NaN 0.580072 0.733287 0.096424\n3 1.5 0.0 1.0 NaN NaN 0.570399 0.730652 0.076076\n4 2.0 0.0 1.0 NaN NaN 0.560535 0.715836 0.069694\n5 2.5 0.0 1.0 NaN NaN 0.553056 0.698751 0.066301\n6 3.0 0.0 1.0 NaN NaN 0.546871 0.681963 0.063733\n7 3.5 0.0 1.0 NaN NaN 0.541360 0.666109 0.061506\n8 4.0 0.0 1.0 NaN NaN 0.536280 0.651302 0.059495\n9 4.5 0.0 1.0 NaN NaN 0.531538 0.637515 0.057653\n10 5.0 0.0 1.0 NaN NaN 0.527091 0.624681 0.055960\n11 5.5 0.0 1.0 NaN NaN 0.522914 0.612733 0.054400\n12 6.0 0.0 1.0 NaN NaN 0.518989 0.601603 0.052960\n13 6.5 0.0 1.0 NaN NaN 0.515299 0.591229 0.051629\n14 7.0 0.0 1.0 NaN NaN 0.511830 0.581555 0.050399\n15 7.5 0.0 1.0 NaN NaN 0.508568 0.572529 0.049259\n16 8.0 0.0 1.0 NaN NaN 0.505500 0.564103 0.048203\n17 8.5 0.0 1.0 NaN NaN 0.502615 0.556234 0.047224\n18 9.0 0.0 1.0 NaN NaN 0.499902 0.548881 0.046315\n19 9.5 0.0 1.0 NaN NaN 0.497350 0.542008 0.045471\n20 10.0 0.0 1.0 NaN NaN 0.494949 0.535581 0.044686"
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
"# look at the States in rdata as DataFrame\n",
- "amici.getSimulationStatesAsDataFrame(model, [edata], [rdata])"
+ "amici.get_simulation_states_as_data_frame(model, [edata], [rdata])"
]
}
],
diff --git a/doc/python_interface.rst b/doc/python_interface.rst
index 4ddb83348c..011e2d618b 100644
--- a/doc/python_interface.rst
+++ b/doc/python_interface.rst
@@ -171,10 +171,10 @@ An example using Antimony to specify the Lotka-Volterra equations is shown below
model_module = amici.import_model_module(
module_name=module_name, module_path=outdir
)
- amici_model = model_module.getModel()
- amici_model.setTimepoints(np.linspace(0, 100, 200))
- amici_solver = amici_model.getSolver()
- rdata = amici.runAmiciSimulation(amici_model, amici_solver)
+ amici_model = model_module.get_model()
+ amici_model.set_timepoints(np.linspace(0, 100, 200))
+ amici_solver = amici_model.create_solver()
+ rdata = amici.run_simulation(amici_model, amici_solver)
from amici.plotting import plot_state_trajectories
plot_state_trajectories(rdata, model=amici_model)
@@ -238,7 +238,7 @@ On Linux and OSX this is enabled by default. This can be verified using:
.. code-block:: python
import amici
- amici.compiledWithOpenMP()
+ amici.compiled_with_openmp()
If not already enabled by default, you can enable OpenMP support by setting
the environment variables ``AMICI_CXXFLAGS`` and ``AMICI_LDFLAGS`` to the
diff --git a/include/amici/abstract_model.h b/include/amici/abstract_model.h
index 56b54eaceb..35846ec0e3 100644
--- a/include/amici/abstract_model.h
+++ b/include/amici/abstract_model.h
@@ -27,10 +27,10 @@ class AbstractModel {
virtual ~AbstractModel() = default;
/**
- * @brief Retrieves the solver object
+ * @brief Creates a solver instance to simulate this model.
* @return The Solver instance
*/
- virtual std::unique_ptr getSolver() = 0;
+ virtual std::unique_ptr create_solver() = 0;
/**
* @brief Root function
@@ -210,13 +210,13 @@ class AbstractModel {
* @brief Returns the AMICI version that was used to generate the model
* @return AMICI version string
*/
- [[nodiscard]] virtual std::string getAmiciVersion() const;
+ [[nodiscard]] virtual std::string get_amici_version() const;
/**
* @brief Returns the AMICI commit that was used to generate the model
* @return AMICI commit string
*/
- [[nodiscard]] virtual std::string getAmiciCommit() const;
+ [[nodiscard]] virtual std::string get_amici_commit() const;
/**
* @brief Model-specific implementation of fx0
@@ -235,7 +235,7 @@ class AbstractModel {
* fixed parameters is permissible
*/
[[nodiscard]] virtual bool
- isFixedParameterStateReinitializationAllowed() const;
+ is_fixed_parameter_state_reinitialization_allowed() const;
/**
* @brief Model-specific implementation of fx0_fixedParameters
diff --git a/include/amici/amici.h b/include/amici/amici.h
index 93b8daed9b..fa6254d10a 100644
--- a/include/amici/amici.h
+++ b/include/amici/amici.h
@@ -18,12 +18,12 @@ namespace amici {
* @param rethrow rethrow integration exceptions?
* @return rdata pointer to return data object
*/
-std::unique_ptr runAmiciSimulation(
+std::unique_ptr run_simulation(
Solver& solver, ExpData const* edata, Model& model, bool rethrow = false
);
/**
- * @brief Same as runAmiciSimulation, but for multiple ExpData instances. When
+ * @brief Same as run_simulation, but for multiple ExpData instances. When
* compiled with OpenMP support, this function runs multi-threaded.
*
* @param solver Solver instance
@@ -33,7 +33,7 @@ std::unique_ptr runAmiciSimulation(
* @param num_threads number of threads for parallel execution
* @return vector of pointers to return data objects
*/
-std::vector> runAmiciSimulations(
+std::vector> run_simulations(
Solver const& solver, std::vector const& edatas,
Model const& model, bool failfast, int num_threads
);
diff --git a/include/amici/backwardproblem.h b/include/amici/backwardproblem.h
index 98201b8910..427b179fcb 100644
--- a/include/amici/backwardproblem.h
+++ b/include/amici/backwardproblem.h
@@ -13,7 +13,7 @@ class ExpData;
class Solver;
class Model;
class ForwardProblem;
-class SteadystateProblem;
+class SteadyStateProblem;
/**
* @brief The BwdSimWorkspace class is used to store temporary simulation
@@ -100,8 +100,9 @@ class EventHandlingBwdSimulator {
* @param disc The discontinuity to handle
* @param dJzdx State-derivative of event likelihood
*/
- void
- handleEventB(Discontinuity const& disc, std::vector const* dJzdx);
+ void handle_event_b(
+ Discontinuity const& disc, std::vector const* dJzdx
+ );
/**
* @brief Execute everything necessary for the handling of data
@@ -110,7 +111,7 @@ class EventHandlingBwdSimulator {
* @param it index of data point
* @param dJydx State-derivative of data likelihood
*/
- void handleDataPointB(int it, std::vector const* dJydx);
+ void handle_datapoint_b(int it, std::vector const* dJydx);
/**
* @brief Compute the next timepoint to integrate to.
@@ -121,7 +122,7 @@ class EventHandlingBwdSimulator {
* @param it index of next data point
* @return tnext next timepoint
*/
- realtype getTnext(int it);
+ realtype get_next_t(int it);
/** The model to simulate. */
Model* model_;
@@ -173,14 +174,14 @@ class SteadyStateBackwardProblem {
* @brief Get the CPU time taken to solve the backward problem.
* @return The CPU time in milliseconds.
*/
- [[nodiscard]] double getCPUTimeB() const { return cpu_timeB_; }
+ [[nodiscard]] double get_cpu_time_b() const { return cpu_time_b_; }
/**
* @brief Get the number of steps taken to find the steady state in the
* adjoint case.
* @return Number of steps.
*/
- [[nodiscard]] int getNumStepsB() const { return numstepsB_; }
+ [[nodiscard]] int get_num_steps_b() const { return num_steps_b_; }
/**
* @brief Return the adjoint state
@@ -190,7 +191,7 @@ class SteadyStateBackwardProblem {
*
* @return xB adjoint state
*/
- [[nodiscard]] AmiVector const& getAdjointState() const;
+ [[nodiscard]] AmiVector const& get_adjoint_state() const;
/**
* @brief Get the adjoint quadratures (xQB).
@@ -200,13 +201,13 @@ class SteadyStateBackwardProblem {
* @return xQB
*/
- [[nodiscard]] AmiVector const& getAdjointQuadrature() const;
+ [[nodiscard]] AmiVector const& get_adjoint_quadrature() const;
/**
* @brief Accessor for has_quadrature_
* @return has_quadrature_
*/
- [[nodiscard]] bool hasQuadrature() const { return has_quadrature_; }
+ [[nodiscard]] bool has_quadrature() const { return has_quadrature_; }
private:
/**
@@ -240,13 +241,13 @@ class SteadyStateBackwardProblem {
void compute_quadrature_by_simulation(realtype t0);
/** CPU time for solving the backward problem (milliseconds) */
- double cpu_timeB_{0.0};
+ double cpu_time_b_{0.0};
/** flag indicating whether backward mode was run */
bool has_quadrature_{false};
/** The employed number of backward steps */
- int numstepsB_{0};
+ int num_steps_b_{0};
/** integral over adjoint state vector */
AmiVector xQ_;
@@ -295,7 +296,7 @@ class BackwardProblem {
* @brief The adjoint state vector from before pre-equilibration.
* @return xB
*/
- [[nodiscard]] AmiVector const& getAdjointStatePrePreeq() const {
+ [[nodiscard]] AmiVector const& get_adjoint_state_pre_preeq() const {
return xB_pre_preeq_;
}
@@ -303,7 +304,7 @@ class BackwardProblem {
* @brief The quadrature state vector from before pre-equilibration.
* @return xQB
*/
- [[nodiscard]] AmiVector const& getAdjointQuadraturePrePreeq() const {
+ [[nodiscard]] AmiVector const& get_adjoint_quadrature_pre_preeq() const {
return xQB_pre_preeq_;
}
@@ -311,13 +312,13 @@ class BackwardProblem {
* @brief The final adjoint state vector
* @return xB
*/
- [[nodiscard]] AmiVector const& getAdjointState() const { return ws_.xB_; }
+ [[nodiscard]] AmiVector const& get_adjoint_state() const { return ws_.xB_; }
/**
* @brief The final quadrature state vector.
* @return xQB
*/
- [[nodiscard]] AmiVector const& getAdjointQuadrature() const {
+ [[nodiscard]] AmiVector const& get_adjoint_quadrature() const {
return ws_.xQB_;
}
@@ -326,7 +327,7 @@ class BackwardProblem {
* @return The postequilibration SteadyStateBackwardProblem, if any.
*/
[[nodiscard]] SteadyStateBackwardProblem const*
- getPostequilibrationBwdProblem() const {
+ get_posteq_bwd_problem() const {
if (posteq_problem_bwd_.has_value())
return &*posteq_problem_bwd_;
return nullptr;
@@ -337,14 +338,14 @@ class BackwardProblem {
* @return The preequilibration SteadyStateBackwardProblem, if any.
*/
[[nodiscard]] SteadyStateBackwardProblem const*
- getPreequilibrationBwdProblem() const {
+ get_preeq_bwd_problem() const {
if (preeq_problem_bwd_.has_value())
return &*preeq_problem_bwd_;
return nullptr;
}
private:
- void handlePostequilibration();
+ void handle_postequilibration();
Model* model_;
Solver* solver_;
@@ -368,10 +369,10 @@ class BackwardProblem {
std::vector const dJzdx_;
/** The preequilibration steadystate problem from the forward problem. */
- SteadystateProblem* preeq_problem_;
+ SteadyStateProblem* preeq_problem_;
/** The postequilibration steadystate problem from the forward problem. */
- SteadystateProblem* posteq_problem_;
+ SteadyStateProblem* posteq_problem_;
/** Presimulation results */
PeriodResult presim_result;
diff --git a/include/amici/edata.h b/include/amici/edata.h
index b0ee3a11a1..845bcbbfa0 100644
--- a/include/amici/edata.h
+++ b/include/amici/edata.h
@@ -58,11 +58,11 @@ class ExpData : public SimulationParameters {
* @param nztrue Number of event outputs
* @param nmaxevent Maximal number of events to track
* @param ts Timepoints (dimension: nt)
- * @param fixedParameters Model constants (dimension: nk)
+ * @param fixed_parameters Model constants (dimension: nk)
*/
ExpData(
int nytrue, int nztrue, int nmaxevent, std::vector ts,
- std::vector fixedParameters
+ std::vector fixed_parameters
);
/**
@@ -72,20 +72,20 @@ class ExpData : public SimulationParameters {
* @param nztrue Number of event outputs
* @param nmaxevent Maximal number of events to track
* @param ts Timepoints (dimension: nt)
- * @param observedData observed data (dimension: nt x nytrue, row-major)
- * @param observedDataStdDev standard deviation of observed data
+ * @param observed_data observed data (dimension: nt x nytrue, row-major)
+ * @param observed_data_std_dev standard deviation of observed data
* (dimension: nt x nytrue, row-major)
- * @param observedEvents observed events
- * (dimension: nmaxevents x nztrue, row-major)
- * @param observedEventsStdDev standard deviation of observed events/roots
+ * @param observed_events observed events
* (dimension: nmaxevents x nztrue, row-major)
+ * @param observed_events_std_dev standard deviation of observed
+ * events/roots (dimension: nmaxevents x nztrue, row-major)
*/
ExpData(
int nytrue, int nztrue, int nmaxevent, std::vector ts,
- std::vector const& observedData,
- std::vector const& observedDataStdDev,
- std::vector const& observedEvents,
- std::vector const& observedEventsStdDev
+ std::vector const& observed_data,
+ std::vector const& observed_data_std_dev,
+ std::vector const& observed_events,
+ std::vector const& observed_events_std_dev
);
/**
@@ -160,28 +160,28 @@ class ExpData : public SimulationParameters {
int nt() const;
/**
- * @brief Set output timepoints.
+ * @brief Set output ts.
*
* If the number of timepoint increases, this will grow the
* observation/sigma matrices and fill new entries with NaN.
- * If the number of timepoints decreases, this will shrink the
+ * If the number of ts decreases, this will shrink the
* observation/sigma matrices.
*
- * Note that the mapping from timepoints to measurements will not be
+ * Note that the mapping from ts to measurements will not be
* preserved. E.g., say there are measurements at t = 2, and this
* function is called with [1, 2], then the old measurements will belong to
* t = 1.
*
- * @param ts timepoints
+ * @param ts ts
*/
- void setTimepoints(std::vector const& ts);
+ void set_timepoints(std::vector const& ts);
/**
* @brief Get output timepoints.
*
* @return ExpData::ts
*/
- std::vector const& getTimepoints() const;
+ std::vector const& get_timepoints() const;
/**
* @brief Get timepoint for the given index
@@ -190,22 +190,22 @@ class ExpData : public SimulationParameters {
*
* @return timepoint timepoint at index
*/
- realtype getTimepoint(int it) const;
+ realtype get_timepoint(int it) const;
/**
* @brief Set all measurements.
*
- * @param observedData observed data (dimension: nt x nytrue, row-major)
+ * @param observed_data observed data (dimension: nt x nytrue, row-major)
*/
- void setObservedData(std::vector const& observedData);
+ void set_observed_data(std::vector const& observed_data);
/**
* @brief Set measurements for a given observable index
*
- * @param observedData observed data (dimension: nt)
+ * @param observed_data observed data (dimension: nt)
* @param iy observed data index
*/
- void setObservedData(std::vector const& observedData, int iy);
+ void set_observed_data(std::vector const& observed_data, int iy);
/**
* @brief Whether there is a measurement for the given time- and observable-
@@ -216,14 +216,14 @@ class ExpData : public SimulationParameters {
*
* @return boolean specifying if data was set
*/
- bool isSetObservedData(int it, int iy) const;
+ bool is_set_observed_data(int it, int iy) const;
/**
* @brief Get all measurements.
*
* @return observed data (dimension: nt x nytrue, row-major)
*/
- std::vector const& getObservedData() const;
+ std::vector const& get_observed_data() const;
/**
* @brief Get measurements for a given timepoint index.
@@ -232,22 +232,24 @@ class ExpData : public SimulationParameters {
*
* @return pointer to observed data at index (dimension: nytrue)
*/
- realtype const* getObservedDataPtr(int it) const;
+ realtype const* get_observed_data_ptr(int it) const;
/**
* @brief Set standard deviations for measurements.
*
- * @param observedDataStdDev standard deviation of observed data (dimension:
- * nt x nytrue, row-major)
+ * @param observed_data_std_dev standard deviation of observed data
+ * (dimension: nt x nytrue, row-major)
*/
- void setObservedDataStdDev(std::vector const& observedDataStdDev);
+ void set_observed_data_std_dev(
+ std::vector const& observed_data_std_dev
+ );
/**
* @brief Set identical standard deviation for all measurements.
*
* @param stdDev standard deviation (dimension: scalar)
*/
- void setObservedDataStdDev(realtype stdDev);
+ void set_observed_data_std_dev(realtype stdDev);
/**
* @brief Set standard deviations of observed data for a
@@ -257,7 +259,7 @@ class ExpData : public SimulationParameters {
* nt)
* @param iy observed data index
*/
- void setObservedDataStdDev(
+ void set_observed_data_std_dev(
std::vector const& observedDataStdDev, int iy
);
@@ -268,7 +270,7 @@ class ExpData : public SimulationParameters {
* @param stdDev standard deviation (dimension: scalar)
* @param iy observed data index
*/
- void setObservedDataStdDev(realtype stdDev, int iy);
+ void set_observed_data_std_dev(realtype stdDev, int iy);
/**
* @brief Whether standard deviation for a measurement at
@@ -278,14 +280,14 @@ class ExpData : public SimulationParameters {
* @param iy observable index
* @return boolean specifying if standard deviation of data was set
*/
- bool isSetObservedDataStdDev(int it, int iy) const;
+ bool is_set_observed_data_std_dev(int it, int iy) const;
/**
* @brief Get measurement standard deviations.
*
* @return standard deviation of observed data
*/
- std::vector const& getObservedDataStdDev() const;
+ std::vector const& get_observed_data_std_dev() const;
/**
* @brief Get pointer to measurement standard deviations.
@@ -293,7 +295,7 @@ class ExpData : public SimulationParameters {
* @param it timepoint index
* @return pointer to standard deviation of observed data at index
*/
- realtype const* getObservedDataStdDevPtr(int it) const;
+ realtype const* get_observed_data_std_dev_ptr(int it) const;
/**
* @brief Set observed event data.
@@ -301,7 +303,7 @@ class ExpData : public SimulationParameters {
* @param observedEvents observed data (dimension: nmaxevent x nztrue,
* row-major)
*/
- void setObservedEvents(std::vector const& observedEvents);
+ void set_observed_events(std::vector const& observedEvents);
/**
* @brief Set observed event data for specific event observable.
@@ -309,7 +311,8 @@ class ExpData : public SimulationParameters {
* @param observedEvents observed data (dimension: nmaxevent)
* @param iz observed event data index
*/
- void setObservedEvents(std::vector const& observedEvents, int iz);
+ void
+ set_observed_events(std::vector const& observedEvents, int iz);
/**
* @brief Check whether event data at specified indices has been set.
@@ -318,14 +321,14 @@ class ExpData : public SimulationParameters {
* @param iz event observable index
* @return boolean specifying if data was set
*/
- bool isSetObservedEvents(int ie, int iz) const;
+ bool is_set_observed_events(int ie, int iz) const;
/**
* @brief Get observed event data.
*
* @return observed event data
*/
- std::vector const& getObservedEvents() const;
+ std::vector const& get_observed_events() const;
/**
* @brief Get pointer to observed data at ie-th occurrence.
@@ -334,22 +337,23 @@ class ExpData : public SimulationParameters {
*
* @return pointer to observed event data at ie-th occurrence
*/
- realtype const* getObservedEventsPtr(int ie) const;
+ realtype const* get_observed_events_ptr(int ie) const;
/**
* @brief Set standard deviation of observed event data.
*
* @param observedEventsStdDev standard deviation of observed event data
*/
- void
- setObservedEventsStdDev(std::vector const& observedEventsStdDev);
+ void set_observed_events_std_dev(
+ std::vector const& observedEventsStdDev
+ );
/**
* @brief Set standard deviation of observed event data.
*
* @param stdDev standard deviation (dimension: scalar)
*/
- void setObservedEventsStdDev(realtype stdDev);
+ void set_observed_events_std_dev(realtype stdDev);
/**
* @brief Set standard deviation of observed data for a specific observable.
@@ -358,7 +362,7 @@ class ExpData : public SimulationParameters {
* (dimension: nmaxevent)
* @param iz observed data index
*/
- void setObservedEventsStdDev(
+ void set_observed_events_std_dev(
std::vector const& observedEventsStdDev, int iz
);
@@ -368,7 +372,7 @@ class ExpData : public SimulationParameters {
* @param stdDev standard deviation (dimension: scalar)
* @param iz observed data index
*/
- void setObservedEventsStdDev(realtype stdDev, int iz);
+ void set_observed_events_std_dev(realtype stdDev, int iz);
/**
* @brief Check whether standard deviation of event data
@@ -378,14 +382,14 @@ class ExpData : public SimulationParameters {
* @param iz event observable index
* @return boolean specifying if standard deviation of event data was set
*/
- bool isSetObservedEventsStdDev(int ie, int iz) const;
+ bool is_set_observed_events_std_dev(int ie, int iz) const;
/**
* @brief Get standard deviation of observed event data.
*
* @return standard deviation of observed event data
*/
- std::vector const& getObservedEventsStdDev() const;
+ std::vector const& get_observed_events_std_dev() const;
/**
* @brief Get pointer to standard deviation of
@@ -396,7 +400,7 @@ class ExpData : public SimulationParameters {
* @return pointer to standard deviation of observed event data at ie-th
* occurrence
*/
- realtype const* getObservedEventsStdDevPtr(int ie) const;
+ realtype const* get_observed_events_std_dev_ptr(int ie) const;
/**
* @brief Set all observations and their standard deviations to NaN.
@@ -415,17 +419,17 @@ class ExpData : public SimulationParameters {
* @brief resizes observedData, observedDataStdDev, observedEvents and
* observedEventsStdDev
*/
- void applyDimensions();
+ void apply_dimensions();
/**
* @brief resizes observedData and observedDataStdDev
*/
- void applyDataDimension();
+ void apply_data_dimension();
/**
* @brief resizes observedEvents and observedEventsStdDev
*/
- void applyEventDimension();
+ void apply_event_dimension();
/**
* @brief checker for dimensions of input observedData or observedDataStdDev
@@ -433,7 +437,7 @@ class ExpData : public SimulationParameters {
* @param input vector input to be checked
* @param fieldname name of the input
*/
- void checkDataDimension(
+ void check_data_dimension(
std::vector const& input, char const* fieldname
) const;
@@ -444,7 +448,7 @@ class ExpData : public SimulationParameters {
* @param input vector input to be checked
* @param fieldname name of the input
*/
- void checkEventsDimension(
+ void check_events_dimension(
std::vector const& input, char const* fieldname
) const;
@@ -546,7 +550,7 @@ class ConditionContext : public ContextManager {
* @param edata
* @param fpc flag indicating which fixedParameter from edata to apply
*/
- void applyCondition(ExpData const* edata, FixedParameterContext fpc);
+ void apply_condition(ExpData const* edata, FixedParameterContext fpc);
/**
* @brief Restore original settings on constructor-supplied amici::Model.
diff --git a/include/amici/forwardproblem.h b/include/amici/forwardproblem.h
index 61acb290f0..6774d36a04 100644
--- a/include/amici/forwardproblem.h
+++ b/include/amici/forwardproblem.h
@@ -14,7 +14,7 @@
namespace amici {
class ExpData;
class Solver;
-class SteadystateProblem;
+class SteadyStateProblem;
class FinalStateStorer;
/**
@@ -113,11 +113,11 @@ struct FwdSimWorkspace {
FwdSimWorkspace(
gsl::not_null const& model, gsl::not_null solver
)
- : sol(NAN, model->nx_solver, model->nplist(), solver->getSunContext())
- , x_old(model->nx_solver, solver->getSunContext())
- , xdot(model->nx_solver, solver->getSunContext())
- , xdot_old(model->nx_solver, solver->getSunContext())
- , sdx(model->nx_solver, model->nplist(), solver->getSunContext())
+ : sol(NAN, model->nx_solver, model->nplist(), solver->get_sun_context())
+ , x_old(model->nx_solver, solver->get_sun_context())
+ , xdot(model->nx_solver, solver->get_sun_context())
+ , xdot_old(model->nx_solver, solver->get_sun_context())
+ , sdx(model->nx_solver, model->nplist(), solver->get_sun_context())
, stau(model->nplist())
, roots_found(model->ne, 0)
, rval_tmp(gsl::narrow(model->ne), 0.0)
@@ -369,10 +369,10 @@ class EventHandlingSimulator {
};
/**
- * @brief The SteadystateProblem class solves a steady-state problem using
+ * @brief The SteadyStateProblem class solves a steady-state problem using
* Newton's method and falls back to integration on failure.
*/
-class SteadystateProblem {
+class SteadyStateProblem {
public:
/**
* @brief Constructor
@@ -383,7 +383,7 @@ class SteadystateProblem {
* @param is_preeq Whether this is a pre-equilibration (`true`) or
* post-equilibration problem (`false`).
*/
- explicit SteadystateProblem(
+ explicit SteadyStateProblem(
FwdSimWorkspace* ws, Solver const& solver, Model& model, bool is_preeq
);
@@ -398,13 +398,13 @@ class SteadystateProblem {
* @param it Index of the current output time point.
* @param t0 Initial time for the steady state simulation.
*/
- void workSteadyStateProblem(Solver& solver, int it, realtype t0);
+ void run(Solver& solver, int it, realtype t0);
/**
* @brief Return the stored SimulationState.
* @return stored SimulationState
*/
- [[nodiscard]] SimulationState const& getFinalSimulationState() const {
+ [[nodiscard]] SimulationState const& get_final_simulation_state() const {
return period_result_.final_state_;
}
@@ -412,7 +412,7 @@ class SteadystateProblem {
* @brief Return state at steady state
* @return x
*/
- [[nodiscard]] AmiVector const& getState() const {
+ [[nodiscard]] AmiVector const& get_state() const {
return period_result_.final_state_.sol.x;
}
@@ -420,7 +420,7 @@ class SteadystateProblem {
* @brief Return state sensitivity at steady state
* @return sx
*/
- [[nodiscard]] AmiVectorArray const& getStateSensitivity() const {
+ [[nodiscard]] AmiVectorArray const& get_state_sensitivity() const {
return period_result_.final_state_.sol.sx;
}
@@ -428,7 +428,7 @@ class SteadystateProblem {
* @brief Get the CPU time taken to solve the forward problem.
* @return The CPU time in milliseconds.
*/
- [[nodiscard]] double getCPUTime() const { return cpu_time_; }
+ [[nodiscard]] double get_cpu_time() const { return cpu_time_; }
/**
* @brief Get the steady state computation status.
@@ -436,7 +436,7 @@ class SteadystateProblem {
* [newton, simulation, newton].
*/
[[nodiscard]] std::vector const&
- getSteadyStateStatus() const {
+ get_steady_state_status() const {
return steady_state_status_;
}
@@ -444,7 +444,7 @@ class SteadystateProblem {
* @brief Get model time at which steady state was found through simulation.
* @return Time at which steady state was found (model time units).
*/
- [[nodiscard]] realtype getSteadyStateTime() const {
+ [[nodiscard]] realtype get_steady_state_time() const {
return period_result_.final_state_.sol.t;
}
@@ -452,14 +452,14 @@ class SteadystateProblem {
* @brief Get the weighted root mean square of the residuals.
* @return The weighted root-mean-square of the residuals.
*/
- [[nodiscard]] realtype getResidualNorm() const { return wrms_; }
+ [[nodiscard]] realtype get_residual_norm() const { return wrms_; }
/**
* @brief Get the number of steps taken to find the steady state.
* @return Number of steps taken to find the steady state as
* [newton, simulation, newton].
*/
- [[nodiscard]] std::vector const& getNumSteps() const {
+ [[nodiscard]] std::vector const& get_num_steps() const {
return numsteps_;
}
@@ -468,7 +468,7 @@ class SteadystateProblem {
* successful.
* @return Whether any approach to find the steady state was successful.
*/
- [[nodiscard]] bool checkSteadyStateSuccess() const;
+ [[nodiscard]] bool check_steady_state_success() const;
/**
* @brief Get the pre-equilibration solver.
@@ -493,14 +493,14 @@ class SteadystateProblem {
* @param it Index of the current output time point.
* @param t0 Initial time for the steady state simulation.
*/
- void findSteadyState(int it, realtype t0);
+ void find_steady_state(int it, realtype t0);
/**
* @brief Try to determine the steady state by using Newton's method.
* @param newton_retry Flag indicating whether Newton's method is being
* relaunched.
*/
- void findSteadyStateByNewtonsMethod(bool newton_retry);
+ void find_steady_state_by_newtons_method(bool newton_retry);
/**
* @brief Try to determine the steady state by using forward simulation.
@@ -509,7 +509,7 @@ class SteadystateProblem {
* @return SteadyStateStatus indicating whether the steady state was found
* successfully, or if it failed.
*/
- SteadyStateStatus findSteadyStateBySimulation(int it, realtype t0);
+ SteadyStateStatus find_steady_state_by_simulation(int it, realtype t0);
/**
* @brief Store state and throw an exception if equilibration failed
@@ -519,7 +519,7 @@ class SteadystateProblem {
* @param tried_newton_2 Whether any Newton step was attempted after
* simulation
*/
- [[noreturn]] void handleSteadyStateFailure(
+ [[noreturn]] void handle_steady_state_failure(
bool tried_newton_1, bool tried_simulation, bool tried_newton_2
) const;
@@ -528,32 +528,32 @@ class SteadystateProblem {
* @param wrms_computer_sx WRMSComputer instance for state sensitivities
* @return weighted root mean squared residuals of the RHS
*/
- realtype getWrmsFSA(WRMSComputer& wrms_computer_sx);
+ realtype get_wrms_fsa(WRMSComputer& wrms_computer_sx);
/**
* @brief Launch simulation if Newton solver or linear system solve
* fail or are disabled.
* simulation.
*/
- void runSteadystateSimulationFwd();
+ void run_steadystate_simulation_fwd();
/**
* @brief Update member variables to indicate that state_.x has been
* updated and xdot_, delta_, etc. need to be recomputed.
*/
- void flagUpdatedState();
+ void flag_updated_state();
/**
* @brief Retrieve simulation sensitivities from the provided solver and
* set the corresponding flag to indicate they are up to date
*/
- void updateSensiSimulation();
+ void update_sensi_simulation();
/**
* @brief Compute the right-hand side for the current state_.x and set the
* corresponding flag to indicate xdot_ is up to date.
*/
- void updateRightHandSide();
+ void update_rhs();
/** Whether this is a pre- or post-equilibration problem */
bool is_preeq_;
@@ -653,7 +653,7 @@ class ForwardProblem {
* If forward sensitivities are enabled this will also compute
* sensitivities.
*/
- void workForwardProblem();
+ void run();
/**
* @brief Computes adjoint updates dJydx according to the provided model
@@ -662,13 +662,14 @@ class ForwardProblem {
* @param edata experimental data
* @return dJydx
*/
- std::vector getAdjointUpdates(Model& model, ExpData const& edata);
+ std::vector
+ get_adjoint_updates(Model& model, ExpData const& edata);
/**
* @brief Accessor for sx
* @return sx
*/
- [[nodiscard]] AmiVectorArray const& getStateSensitivity() const {
+ [[nodiscard]] AmiVectorArray const& get_state_sensitivity() const {
return ws_.sol.sx;
}
@@ -676,7 +677,8 @@ class ForwardProblem {
* @brief Get information on the discontinuities encountered so far.
* @return The vector of discontinuities.
*/
- [[nodiscard]] std::vector const& getDiscontinuities() const {
+ [[nodiscard]] std::vector const&
+ get_discontinuities() const {
return main_simulator_.result.discs;
}
@@ -684,7 +686,7 @@ class ForwardProblem {
* @brief Accessor for dJzdx
* @return dJzdx
*/
- [[nodiscard]] std::vector const& getDJzdx() const {
+ [[nodiscard]] std::vector const& get_dJzdx() const {
return dJzdx_;
}
@@ -692,13 +694,13 @@ class ForwardProblem {
* @brief Accessor for it
* @return it
*/
- [[nodiscard]] int getCurrentTimeIteration() const { return it_; }
+ [[nodiscard]] int get_current_time_iteration() const { return it_; }
/**
* @brief Returns final time point for which simulations are available
* @return time point
*/
- [[nodiscard]] realtype getFinalTime() const {
+ [[nodiscard]] realtype get_final_time() const {
return main_simulator_.result.final_state_.sol.t;
}
@@ -706,7 +708,7 @@ class ForwardProblem {
* @brief Returns maximal event index for which simulations are available
* @return index
*/
- [[nodiscard]] int getEventCounter() const {
+ [[nodiscard]] int get_event_counter() const {
return main_simulator_.get_event_counter();
}
@@ -717,12 +719,12 @@ class ForwardProblem {
* @return state
*/
[[nodiscard]] SimulationState const&
- getSimulationStateTimepoint(int const it) const {
- if (model->getTimepoint(it)
+ get_simulation_state_timepoint(int const it) const {
+ if (model->get_timepoint(it)
== main_simulator_.result.initial_state_.sol.t)
- return getInitialSimulationState();
+ return get_initial_simulation_state();
auto const map_iter = main_simulator_.result.timepoint_states_.find(
- model->getTimepoint(it)
+ model->get_timepoint(it)
);
Ensures(map_iter != main_simulator_.result.timepoint_states_.end());
return map_iter->second;
@@ -735,7 +737,7 @@ class ForwardProblem {
* @return SimulationState
*/
[[nodiscard]] SimulationState const&
- getSimulationStateEvent(int const iroot) const {
+ get_simulation_state_event(int const iroot) const {
return main_simulator_.result.event_states_.at(iroot);
}
@@ -744,7 +746,7 @@ class ForwardProblem {
* initial timepoint
* @return SimulationState
*/
- [[nodiscard]] SimulationState const& getInitialSimulationState() const {
+ [[nodiscard]] SimulationState const& get_initial_simulation_state() const {
return main_simulator_.result.initial_state_;
}
@@ -753,46 +755,45 @@ class ForwardProblem {
* final timepoint (or when the simulation failed)
* @return SimulationState
*/
- [[nodiscard]] SimulationState const& getFinalSimulationState() const {
+ [[nodiscard]] SimulationState const& get_final_simulation_state() const {
return main_simulator_.result.final_state_;
}
/**
- * @brief Return the preequilibration SteadystateProblem.
- * @return The preequilibration SteadystateProblem, if any.
+ * @brief Return the preequilibration SteadyStateProblem.
+ * @return The preequilibration SteadyStateProblem, if any.
*/
- [[nodiscard]] SteadystateProblem* getPreequilibrationProblem() {
+ [[nodiscard]] SteadyStateProblem* get_preeq_problem() {
if (preeq_problem_.has_value())
return &*preeq_problem_;
return nullptr;
}
/**
- * @brief Return the preequilibration SteadystateProblem.
- * @return The preequilibration SteadystateProblem, if any.
+ * @brief Return the preequilibration SteadyStateProblem.
+ * @return The preequilibration SteadyStateProblem, if any.
*/
- [[nodiscard]] SteadystateProblem const* getPreequilibrationProblem() const {
+ [[nodiscard]] SteadyStateProblem const* get_preeq_problem() const {
if (preeq_problem_.has_value())
return &*preeq_problem_;
return nullptr;
}
/**
- * @brief Return the postequilibration SteadystateProblem.
- * @return The postequilibration SteadystateProblem, if any.
+ * @brief Return the postequilibration SteadyStateProblem.
+ * @return The postequilibration SteadyStateProblem, if any.
*/
- [[nodiscard]] SteadystateProblem* getPostequilibrationProblem() {
+ [[nodiscard]] SteadyStateProblem* get_posteq_problem() {
if (posteq_problem_.has_value())
return &*posteq_problem_;
return nullptr;
}
/**
- * @brief Return the postequilibration SteadystateProblem.
- * @return The postequilibration SteadystateProblem, if any.
+ * @brief Return the postequilibration SteadyStateProblem.
+ * @return The postequilibration SteadyStateProblem, if any.
*/
- [[nodiscard]] SteadystateProblem const*
- getPostequilibrationProblem() const {
+ [[nodiscard]] SteadyStateProblem const* get_posteq_problem() const {
if (posteq_problem_.has_value())
return &*posteq_problem_;
return nullptr;
@@ -823,13 +824,13 @@ class ForwardProblem {
private:
/**
- * @brief Handle preequilibration if necessary.
+ * @brief Handle pre-equilibration if necessary.
*
* Preequilibration starts at `Model::t0()`.
*
* So far, no event handling takes place during preequilibration.
*/
- void handlePreequilibration();
+ void handle_preequilibration();
/**
* @brief Handle pre-simulation if required.
@@ -838,7 +839,7 @@ class ForwardProblem {
*
* So far, no event handling takes place during presimulation.
*/
- void handlePresimulation();
+ void handle_presimulation();
/**
* @brief Handle the main simulation.
@@ -847,7 +848,7 @@ class ForwardProblem {
* During this period, events are processed and data points are
* handled.
*/
- void handleMainSimulation();
+ void handle_main_simulation();
/**
* @brief Handle postequilibration if necessary.
@@ -858,13 +859,14 @@ class ForwardProblem {
* So far, no event handling takes place during postequilibration.
* This also includes the processing of event observables.
*/
- void handlePostequilibration();
+ void handle_postequilibration();
/** state derivative of event likelihood
* (dimension nJ x nx x nMaxEvent, ordering =?) */
std::vector dJzdx_;
- /** flag to indicate whether solver was preeinitialized via preequilibration
+ /** flag to indicate whether solver was pre-initialized via
+ * pre-equilibration
*/
bool preequilibrated_{false};
@@ -875,10 +877,10 @@ class ForwardProblem {
bool uses_presimulation_{false};
/** The preequilibration steady-state problem, if any. */
- std::optional preeq_problem_;
+ std::optional preeq_problem_;
/** The postequilibration steady-state problem, if any. */
- std::optional posteq_problem_;
+ std::optional posteq_problem_;
FwdSimWorkspace ws_;
EventHandlingSimulator main_simulator_;
@@ -915,8 +917,8 @@ class FinalStateStorer : public ContextManager {
// timepoint_states if it's not present there.
// this may happen if there is an error just at
// (or indistinguishably before) an output timepoint
- auto const final_time = fwd_->getFinalTime();
- auto const timepoints = fwd_->model->getTimepoints();
+ auto const final_time = fwd_->get_final_time();
+ auto const timepoints = fwd_->model->get_timepoints();
if (!fwd_->main_simulator_.result.timepoint_states_.contains(
final_time
)
diff --git a/include/amici/hdf5.h b/include/amici/hdf5.h
index 8e1a462fe3..9861bdb81d 100644
--- a/include/amici/hdf5.h
+++ b/include/amici/hdf5.h
@@ -39,7 +39,7 @@ namespace hdf5 {
* @param hdf5filename File to open
* @return File object
*/
-H5::H5File createOrOpenForWriting(std::string const& hdf5filename);
+H5::H5File create_or_open_for_writing(std::string const& hdf5filename);
/**
* @brief Read solver options from HDF5 file.
@@ -47,7 +47,7 @@ H5::H5File createOrOpenForWriting(std::string const& hdf5filename);
* @param solver Solver to set options on
* @param datasetPath Path inside the HDF5 file
*/
-void readSolverSettingsFromHDF5(
+void read_solver_settings_from_hdf5(
const H5::H5File& file, Solver& solver, std::string const& datasetPath
);
@@ -57,7 +57,7 @@ void readSolverSettingsFromHDF5(
* @param solver Solver to write options from
* @param hdf5Location Path inside the HDF5 file
*/
-void writeSolverSettingsToHDF5(
+void write_solver_settings_to_hdf5(
Solver const& solver, std::string const& hdf5Filename,
std::string const& hdf5Location
);
@@ -68,7 +68,7 @@ void writeSolverSettingsToHDF5(
* @param solver Solver to write options from
* @param hdf5Location Path inside the HDF5 file
*/
-void writeSolverSettingsToHDF5(
+void write_solver_settings_to_hdf5(
Solver const& solver, H5::H5File const& file,
std::string const& hdf5Location
);
@@ -79,7 +79,7 @@ void writeSolverSettingsToHDF5(
* @param solver Solver to set options on
* @param datasetPath Path inside the HDF5 file
*/
-void readSolverSettingsFromHDF5(
+void read_solver_settings_from_hdf5(
std::string const& hdffile, Solver& solver, std::string const& datasetPath
);
@@ -89,7 +89,7 @@ void readSolverSettingsFromHDF5(
* @param model Model to set data on
* @param datasetPath Path inside the HDF5 file
*/
-void readModelDataFromHDF5(
+void read_model_data_from_hdf5(
std::string const& hdffile, Model& model, std::string const& datasetPath
);
@@ -99,7 +99,7 @@ void readModelDataFromHDF5(
* @param model Model to set data on
* @param datasetPath Path inside the HDF5 file
*/
-void readModelDataFromHDF5(
+void read_model_data_from_hdf5(
H5::H5File const& file, Model& model, std::string const& datasetPath
);
@@ -110,7 +110,7 @@ void readModelDataFromHDF5(
* @param hdf5Location Full dataset path inside the HDF5 file (will be created)
*/
-void writeReturnData(
+void write_return_data_to_hdf5(
ReturnData const& rdata, H5::H5File const& file,
std::string const& hdf5Location
);
@@ -122,7 +122,7 @@ void writeReturnData(
* @param hdf5Location Full dataset path inside the HDF5 file (will be created)
*/
-void writeReturnData(
+void write_return_data_to_hdf5(
ReturnData const& rdata, std::string const& hdf5Filename,
std::string const& hdf5Location
);
@@ -133,7 +133,7 @@ void writeReturnData(
* @param file HDF5 file to write to
* @param hdf5Location Full dataset path inside the HDF5 file (will be created)
*/
-void writeReturnDataDiagnosis(
+void write_return_data_diagnosis(
ReturnData const& rdata, H5::H5File const& file,
std::string const& hdf5Location
);
@@ -144,7 +144,7 @@ void writeReturnDataDiagnosis(
* @param logItems Log items to write
* @param hdf5Location Full dataset path inside the HDF5 file (will be created)
*/
-void writeLogItemsToHDF5(
+void write_log_items_to_hdf5(
H5::H5File const& file, std::vector const& logItems,
std::string const& hdf5Location
);
@@ -155,7 +155,7 @@ void writeLogItemsToHDF5(
* @param groupPath Path to the group to be created
* @param recursively Create intermediary groups
*/
-void createGroup(
+void create_group(
const H5::H5File& file, std::string const& groupPath,
bool recursively = true
);
@@ -168,7 +168,7 @@ void createGroup(
* @return ExpData created from data in the given location
*/
-std::unique_ptr readSimulationExpData(
+std::unique_ptr read_exp_data_from_hdf5(
std::string const& hdf5Filename, std::string const& hdf5Root,
Model const& model
);
@@ -180,7 +180,7 @@ std::unique_ptr readSimulationExpData(
* @param hdf5Location Path inside the HDF5 file
*/
-void writeSimulationExpData(
+void write_exp_data_to_hdf5(
ExpData const& edata, H5::H5File const& file,
std::string const& hdf5Location
);
@@ -191,7 +191,7 @@ void writeSimulationExpData(
* @param filepath Name of HDF5 file
* @param hdf5Location Path inside the HDF5 file
*/
-void writeSimulationExpData(
+void write_exp_data_to_hdf5(
ExpData const& edata, std::string const& filepath,
std::string const& hdf5Location
);
@@ -204,7 +204,7 @@ void writeSimulationExpData(
* @param attributeName Name of the attribute of interest
* @return `true` if attribute exists, `false` otherwise
*/
-bool attributeExists(
+bool attribute_exists(
H5::H5File const& file, std::string const& optionsObject,
std::string const& attributeName
);
@@ -216,7 +216,7 @@ bool attributeExists(
* @param attributeName Name of the attribute of interest
* @return `true` if attribute exists, `false` otherwise
*/
-bool attributeExists(
+bool attribute_exists(
H5::H5Object const& object, std::string const& attributeName
);
@@ -226,7 +226,7 @@ bool attributeExists(
* @param datasetName Name of dataset to create
* @param buffer Data to write to dataset
*/
-void createAndWriteInt1DDataset(
+void create_and_write_int_1d_dataset(
H5::H5File const& file, std::string const& datasetName,
gsl::span buffer
);
@@ -239,7 +239,7 @@ void createAndWriteInt1DDataset(
* @param m Number of rows in buffer
* @param n Number of columns buffer
*/
-void createAndWriteInt2DDataset(
+void create_and_write_int_2d_dataset(
H5::H5File const& file, std::string const& datasetName,
gsl::span buffer, hsize_t m, hsize_t n
);
@@ -250,7 +250,7 @@ void createAndWriteInt2DDataset(
* @param datasetName Name of dataset to create
* @param buffer Data to write to dataset
*/
-void createAndWriteDouble1DDataset(
+void create_and_write_double_1d_dataset(
H5::H5File const& file, std::string const& datasetName,
gsl::span buffer
);
@@ -264,7 +264,7 @@ void createAndWriteDouble1DDataset(
* @param n Number of columns buffer
*/
-void createAndWriteDouble2DDataset(
+void create_and_write_double_2d_dataset(
H5::H5File const& file, std::string const& datasetName,
gsl::span buffer, hsize_t m, hsize_t n
);
@@ -279,7 +279,7 @@ void createAndWriteDouble2DDataset(
* @param o Length of first dimension in buffer
*/
-void createAndWriteDouble3DDataset(
+void create_and_write_double_3d_dataset(
H5::H5File const& file, std::string const& datasetName,
gsl::span buffer, hsize_t m, hsize_t n, hsize_t o
);
@@ -291,7 +291,7 @@ void createAndWriteDouble3DDataset(
* @param attributeName Name of attribute to read
* @return Attribute value
*/
-std::string getStringAttribute(
+std::string get_string_attribute(
H5::H5File const& file, std::string const& optionsObject,
std::string const& attributeName
);
@@ -303,7 +303,7 @@ std::string getStringAttribute(
* @param attributeName Name of attribute to read
* @return Attribute value
*/
-double getDoubleScalarAttribute(
+double get_double_scalar_attribute(
const H5::H5File& file, std::string const& optionsObject,
std::string const& attributeName
);
@@ -316,7 +316,7 @@ double getDoubleScalarAttribute(
* @return Attribute value
*/
-int getIntScalarAttribute(
+int get_int_scalar_attribute(
const H5::H5File& file, std::string const& optionsObject,
std::string const& attributeName
);
@@ -328,7 +328,7 @@ int getIntScalarAttribute(
* @return Data read
*/
std::vector
-getIntDataset1D(const H5::H5File& file, std::string const& name);
+get_int_1d_dataset(const H5::H5File& file, std::string const& name);
/**
* @brief Read 1-dimensional native double dataset from HDF5 file.
@@ -338,7 +338,7 @@ getIntDataset1D(const H5::H5File& file, std::string const& name);
*/
std::vector
-getDoubleDataset1D(const H5::H5File& file, std::string const& name);
+get_double_1d_dataset(const H5::H5File& file, std::string const& name);
/**
* @brief Read 2-dimensional native double dataset from HDF5 file.
@@ -349,7 +349,7 @@ getDoubleDataset1D(const H5::H5File& file, std::string const& name);
* @return Flattened data (row-major)
*/
-std::vector getDoubleDataset2D(
+std::vector get_double_2d_dataset(
const H5::H5File& file, std::string const& name, hsize_t& m, hsize_t& n
);
@@ -363,7 +363,7 @@ std::vector getDoubleDataset2D(
* @return Flattened data (row-major)
*/
-std::vector getDoubleDataset3D(
+std::vector get_double_3d_dataset(
const H5::H5File& file, std::string const& name, hsize_t& m, hsize_t& n,
hsize_t& o
);
@@ -375,7 +375,7 @@ std::vector getDoubleDataset3D(
* @param location Location to test for
* @return `true` if exists, `false` otherwise
*/
-bool locationExists(std::string const& filename, std::string const& location);
+bool location_exists(std::string const& filename, std::string const& location);
/**
* @brief Check if the given location (group, link or dataset) exists in the
@@ -385,7 +385,7 @@ bool locationExists(std::string const& filename, std::string const& location);
* @return `true` if exists, `false` otherwise
*/
-bool locationExists(H5::H5File const& file, std::string const& location);
+bool location_exists(H5::H5File const& file, std::string const& location);
} // namespace hdf5
} // namespace amici
diff --git a/include/amici/misc.h b/include/amici/misc.h
index 3f9caf8b0c..240f0403a1 100644
--- a/include/amici/misc.h
+++ b/include/amici/misc.h
@@ -64,7 +64,7 @@ gsl::span slice(std::vector const& data, int index, unsigned size) {
* @param expected_size expected size of the buffer
*/
template
-void checkBufferSize(
+void check_buffer_size(
gsl::span buffer, typename gsl::span::index_type expected_size
) {
if (buffer.size() != expected_size)
@@ -84,8 +84,8 @@ void checkBufferSize(
* @param buffer buffer to which values are to be written
*/
template
-void writeSlice(gsl::span const slice, gsl::span buffer) {
- checkBufferSize(buffer, slice.size());
+void write_slice(gsl::span const slice, gsl::span buffer) {
+ check_buffer_size(buffer, slice.size());
std::copy(slice.begin(), slice.end(), buffer.data());
}
@@ -96,8 +96,8 @@ void writeSlice(gsl::span const slice, gsl::span buffer) {
* @param buffer buffer to which values are to be added
*/
template
-void addSlice(gsl::span const slice, gsl::span buffer) {
- checkBufferSize(buffer, slice.size());
+void add_slice(gsl::span const slice, gsl::span buffer) {
+ check_buffer_size(buffer, slice.size());
std::transform(
slice.begin(), slice.end(), buffer.begin(), buffer.begin(),
std::plus()
@@ -110,8 +110,9 @@ void addSlice(gsl::span const slice, gsl::span buffer) {
* @param s computed value
* @param b buffer to which values are to be written
*/
-template void writeSlice(std::vector const& s, std::vector& b) {
- writeSlice(
+template
+void write_slice(std::vector const& s, std::vector& b) {
+ write_slice(
gsl::make_span(s.data(), s.size()), gsl::make_span(b.data(), b.size())
);
}
@@ -122,8 +123,8 @@ template void writeSlice(std::vector const& s, std::vector& b) {
* @param s computed value
* @param b buffer to which values are to be written
*/
-template void writeSlice(std::vector const& s, gsl::span b) {
- writeSlice(gsl::make_span(s.data(), s.size()), b);
+template void write_slice(std::vector const& s, gsl::span b) {
+ write_slice(gsl::make_span(s.data(), s.size()), b);
}
/**
@@ -132,8 +133,8 @@ template void writeSlice(std::vector const& s, gsl::span b) {
* @param s computed value
* @param b buffer to which values are to be written
*/
-template void addSlice(std::vector const& s, gsl::span b) {
- addSlice(gsl::make_span(s.data(), s.size()), b);
+template void add_slice(std::vector const& s, gsl::span b) {
+ add_slice(gsl::make_span(s.data(), s.size()), b);
}
/**
@@ -142,7 +143,7 @@ template void addSlice(std::vector const& s, gsl::span b) {
* @param s computed value
* @param b buffer to which values are to be written
*/
-void writeSlice(AmiVector const& s, gsl::span b);
+void write_slice(AmiVector const& s, gsl::span b);
/**
* @brief Remove parameter scaling according to the parameter scaling in pscale
@@ -153,7 +154,7 @@ void writeSlice(AmiVector const& s, gsl::span b);
* @param pscale parameter scaling
* @param bufferUnscaled unscaled parameters are written to the array
*/
-void unscaleParameters(
+void unscale_parameters(
gsl::span bufferScaled,
gsl::span pscale, gsl::span bufferUnscaled
);
@@ -166,7 +167,7 @@ void unscaleParameters(
*
* @return Unscaled parameter
*/
-double getUnscaledParameter(double scaledParameter, ParameterScaling scaling);
+double unscale_parameter(double scaledParameter, ParameterScaling scaling);
/**
* @brief Apply parameter scaling according to `scaling`
@@ -174,7 +175,7 @@ double getUnscaledParameter(double scaledParameter, ParameterScaling scaling);
* @param scaling parameter scaling
* @return Scaled parameter
*/
-double getScaledParameter(double unscaledParameter, ParameterScaling scaling);
+double scale_parameter(double unscaledParameter, ParameterScaling scaling);
/**
* @brief Apply parameter scaling according to `scaling`
@@ -182,7 +183,7 @@ double getScaledParameter(double unscaledParameter, ParameterScaling scaling);
* @param pscale parameter scaling
* @param bufferScaled destination
*/
-void scaleParameters(
+void scale_parameters(
gsl::span bufferUnscaled,
gsl::span pscale, gsl::span bufferScaled
);
@@ -193,14 +194,14 @@ void scaleParameters(
* @param first_frame Index of first frame to include
* @return Backtrace
*/
-std::string backtraceString(int maxFrames, int first_frame = 0);
+std::string get_backtrace_string(int maxFrames, int first_frame = 0);
/**
* @brief Convert std::regex_constants::error_type to string
* @param err_type error type
* @return Error type as string
*/
-std::string regexErrorToString(std::regex_constants::error_type err_type);
+std::string regex_error_to_string(std::regex_constants::error_type err_type);
/**
* @brief Format printf-style arguments to std::string
@@ -208,7 +209,7 @@ std::string regexErrorToString(std::regex_constants::error_type err_type);
* @param ap Argument list pointer
* @return Formatted String
*/
-std::string printfToString(char const* fmt, va_list ap);
+std::string printf_to_string(char const* fmt, va_list ap);
/**
* @brief Generic implementation for a context manager, explicitly deletes copy
diff --git a/include/amici/model.h b/include/amici/model.h
index d2a229f1f5..1fc7bd1f78 100644
--- a/include/amici/model.h
+++ b/include/amici/model.h
@@ -251,7 +251,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param xQB Adjoint quadratures
* @param posteq Flag indicating whether postequilibration was performed
*/
- void initializeB(
+ void initialize_b(
AmiVector& xB, AmiVector& dxB, AmiVector& xQB, bool posteq
) const;
@@ -260,7 +260,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Initial timepoint
* @param x State vector to be initialized (size: nx_solver).
*/
- void initializeStates(realtype t, AmiVector& x);
+ void initialize_state(realtype t, AmiVector& x);
/**
* @brief Initialize initial state sensitivities.
@@ -268,19 +268,19 @@ class Model : public AbstractModel, public ModelDimensions {
* @param sx Reference to state variable sensitivities
* @param x Reference to state variables
*/
- void initializeStateSensitivities(
+ void initialize_state_sensitivities(
realtype t, AmiVectorArray& sx, AmiVector const& x
);
/**
* @brief Initialization of spline functions
*/
- void initializeSplines();
+ void initialize_splines();
/**
* @brief Initialization of spline sensitivity functions
*/
- void initializeSplineSensitivities();
+ void initialize_spline_sensitivities();
/**
* @brief Initialize the Heaviside variables `h` at the initial time `t0`.
@@ -293,7 +293,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param roots_found boolean indicators indicating whether roots were found
* at t0 by this fun
*/
- void initEvents(
+ void initialize_events(
realtype t, AmiVector const& x, AmiVector const& dx,
std::vector& roots_found
);
@@ -362,13 +362,13 @@ class Model : public AbstractModel, public ModelDimensions {
* @brief Get maximum number of events that may occur for each type.
* @return Maximum number of events that may occur for each type
*/
- int nMaxEvent() const;
+ int n_max_event() const;
/**
* @brief Set maximum number of events that may occur for each type.
* @param nmaxevent Maximum number of events that may occur for each type
*/
- void setNMaxEvent(int nmaxevent);
+ void set_n_max_event(int nmaxevent);
/**
* @brief Get number of timepoints.
@@ -380,7 +380,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @brief Get parameter scale for each parameter.
* @return Vector of parameter scales
*/
- std::vector const& getParameterScale() const;
+ std::vector const& get_parameter_scale() const;
/**
* @brief Set parameter scale for each parameter.
@@ -389,7 +389,7 @@ class Model : public AbstractModel, public ModelDimensions {
*
* @param pscale Scalar parameter scale to be set for all parameters
*/
- void setParameterScale(ParameterScaling pscale);
+ void set_parameter_scale(ParameterScaling pscale);
/**
* @brief Set parameter scale for each parameter.
@@ -398,40 +398,40 @@ class Model : public AbstractModel, public ModelDimensions {
*
* @param pscaleVec Vector of parameter scales
*/
- void setParameterScale(std::vector const& pscaleVec);
+ void set_parameter_scale(std::vector const& pscaleVec);
/**
* @brief Get parameters with transformation according to parameter scale
* applied.
* @return Unscaled parameters
*/
- std::vector const& getUnscaledParameters() const;
+ std::vector const& get_unscaled_parameters() const;
/**
* @brief Get parameter vector.
* @return The user-set parameters (see also `Model::getUnscaledParameters`)
*/
- std::vector const& getParameters() const;
+ std::vector const& get_parameters() const;
/**
* @brief Get value of first model parameter with the specified ID.
* @param par_id Parameter ID
* @return Parameter value
*/
- realtype getParameterById(std::string const& par_id) const;
+ realtype get_parameter_by_id(std::string const& par_id) const;
/**
* @brief Get value of first model parameter with the specified name.
* @param par_name Parameter name
* @return Parameter value
*/
- realtype getParameterByName(std::string const& par_name) const;
+ realtype get_parameter_by_name(std::string const& par_name) const;
/**
* @brief Set the parameter vector.
* @param p Vector of parameters
*/
- void setParameters(std::vector const& p);
+ void set_parameters(std::vector const& p);
/**
* @brief Set model parameters according to the parameter IDs and mapped
@@ -440,7 +440,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param ignoreErrors Ignore errors such as parameter IDs in p which are
* not model parameters
*/
- void setParameterById(
+ void set_parameter_by_id(
std::map const& p, bool ignoreErrors = false
);
@@ -449,7 +449,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param par_id Parameter ID
* @param value Parameter value
*/
- void setParameterById(std::string const& par_id, realtype value);
+ void set_parameter_by_id(std::string const& par_id, realtype value);
/**
* @brief Set all values of model parameters with IDs matching the specified
@@ -458,14 +458,15 @@ class Model : public AbstractModel, public ModelDimensions {
* @param value Parameter value
* @return Number of parameter IDs that matched the regex
*/
- int setParametersByIdRegex(std::string const& par_id_regex, realtype value);
+ int
+ set_parameters_by_id_regex(std::string const& par_id_regex, realtype value);
/**
* @brief Set value of first model parameter with the specified name.
* @param par_name Parameter name
* @param value Parameter value
*/
- void setParameterByName(std::string const& par_name, realtype value);
+ void set_parameter_by_name(std::string const& par_name, realtype value);
/**
* @brief Set model parameters according to the parameter name and mapped
@@ -474,7 +475,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param ignoreErrors Ignore errors such as parameter names in p which are
* not model parameters
*/
- void setParameterByName(
+ void set_parameter_by_name(
std::map const& p, bool ignoreErrors = false
);
@@ -485,22 +486,23 @@ class Model : public AbstractModel, public ModelDimensions {
* @param value Parameter value
* @return Number of fixed parameter names that matched the regex
*/
- int
- setParametersByNameRegex(std::string const& par_name_regex, realtype value);
+ int set_parameters_by_name_regex(
+ std::string const& par_name_regex, realtype value
+ );
/**
* @brief Get values of fixed parameters.
* @return Vector of fixed parameters with same ordering as in
* Model::getFixedParameterIds
*/
- std::vector const& getFixedParameters() const;
+ std::vector const& get_fixed_parameters() const;
/**
* @brief Get value of fixed parameter with the specified ID.
* @param par_id Parameter ID
* @return Parameter value
*/
- realtype getFixedParameterById(std::string const& par_id) const;
+ realtype get_fixed_parameter_by_id(std::string const& par_id) const;
/**
* @brief Get value of fixed parameter with the specified name.
@@ -511,20 +513,20 @@ class Model : public AbstractModel, public ModelDimensions {
* @param par_name Parameter name
* @return Parameter value
*/
- realtype getFixedParameterByName(std::string const& par_name) const;
+ realtype get_fixed_parameter_by_name(std::string const& par_name) const;
/**
* @brief Set values for constants.
* @param k Vector of fixed parameters
*/
- void setFixedParameters(std::vector const& k);
+ void set_fixed_parameters(std::vector const& k);
/**
* @brief Set value of first fixed parameter with the specified ID.
* @param par_id Fixed parameter id
* @param value Fixed parameter value
*/
- void setFixedParameterById(std::string const& par_id, realtype value);
+ void set_fixed_parameter_by_id(std::string const& par_id, realtype value);
/**
* @brief Set values of all fixed parameters with the ID matching the
@@ -533,7 +535,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param value Fixed parameter value
* @return Number of fixed parameter IDs that matched the regex
*/
- int setFixedParametersByIdRegex(
+ int set_fixed_parameters_by_id_regex(
std::string const& par_id_regex, realtype value
);
@@ -542,7 +544,8 @@ class Model : public AbstractModel, public ModelDimensions {
* @param par_name Fixed parameter ID
* @param value Fixed parameter value
*/
- void setFixedParameterByName(std::string const& par_name, realtype value);
+ void
+ set_fixed_parameter_by_name(std::string const& par_name, realtype value);
/**
* @brief Set value of all fixed parameters with name matching the specified
@@ -551,7 +554,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param value Fixed parameter value
* @return Number of fixed parameter names that matched the regex
*/
- int setFixedParametersByNameRegex(
+ int set_fixed_parameters_by_name_regex(
std::string const& par_name_regex, realtype value
);
@@ -559,7 +562,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @brief Get the model name.
* @return Model name
*/
- virtual std::string getName() const;
+ virtual std::string get_name() const;
/**
* @brief Report whether the model has parameter names set.
@@ -567,13 +570,13 @@ class Model : public AbstractModel, public ModelDimensions {
* @return Boolean indicating whether parameter names were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasParameterNames() const;
+ virtual bool has_parameter_names() const;
/**
* @brief Get names of the model parameters.
* @return The parameter names
*/
- virtual std::vector getParameterNames() const;
+ virtual std::vector get_parameter_names() const;
/**
* @brief Report whether the model has state names set.
@@ -581,155 +584,155 @@ class Model : public AbstractModel, public ModelDimensions {
* @return Boolean indicating whether state names were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasStateNames() const;
+ virtual bool has_state_names() const;
/**
* @brief Get names of the model states.
* @return State names
*/
- virtual std::vector getStateNames() const;
+ virtual std::vector get_state_names() const;
/**
* @brief Get names of the solver states.
* @return State names
*/
- virtual std::vector getStateNamesSolver() const;
+ virtual std::vector get_state_names_solver() const;
/**
* @brief Report whether the model has fixed parameter names set.
* @return Boolean indicating whether fixed parameter names were set. Also
* returns `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasFixedParameterNames() const;
+ virtual bool has_fixed_parameter_names() const;
/**
* @brief Get names of the fixed model parameters.
* @return Fixed parameter names
*/
- virtual std::vector getFixedParameterNames() const;
+ virtual std::vector get_fixed_parameter_names() const;
/**
* @brief Report whether the model has observable names set.
* @return Boolean indicating whether observable names were set. Also
* returns `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasObservableNames() const;
+ virtual bool has_observable_names() const;
/**
* @brief Get names of the observables.
* @return Observable names
*/
- virtual std::vector getObservableNames() const;
+ virtual std::vector get_observable_names() const;
/**
* @brief Report whether the model has expression names set.
* @return Boolean indicating whether expression names were set. Also
* returns `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasExpressionNames() const;
+ virtual bool has_expression_names() const;
/**
* @brief Get names of the expressions.
* @return Expression names
*/
- virtual std::vector getExpressionNames() const;
+ virtual std::vector get_expression_names() const;
/**
* @brief Report whether the model has parameter IDs set.
* @return Boolean indicating whether parameter IDs were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasParameterIds() const;
+ virtual bool has_parameter_ids() const;
/**
* @brief Get IDs of the model parameters.
* @return Parameter IDs
*/
- virtual std::vector getParameterIds() const;
+ virtual std::vector get_parameter_ids() const;
/**
* @brief Report whether the model has state IDs set.
* @return Boolean indicating whether state IDs were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasStateIds() const;
+ virtual bool has_state_ids() const;
/**
* @brief Get IDs of the model states.
* @return State IDs
*/
- virtual std::vector getStateIds() const;
+ virtual std::vector get_state_ids() const;
/**
* @brief Get IDs of the solver states.
* @return State IDs
*/
- virtual std::vector getStateIdsSolver() const;
+ virtual std::vector get_state_ids_solver() const;
/**
* @brief Report whether the model has fixed parameter IDs set.
* @return Boolean indicating whether fixed parameter IDs were set. Also
* returns `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasFixedParameterIds() const;
+ virtual bool has_fixed_parameter_ids() const;
/**
* @brief Get IDs of the fixed model parameters.
* @return Fixed parameter IDs
*/
- virtual std::vector getFixedParameterIds() const;
+ virtual std::vector get_fixed_parameter_ids() const;
/**
* @brief Report whether the model has observable IDs set.
* @return Boolean indicating whether observable ids were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasObservableIds() const;
+ virtual bool has_observable_ids() const;
/**
* @brief Get IDs of the observables.
* @return Observable IDs
*/
- virtual std::vector getObservableIds() const;
+ virtual std::vector get_observable_ids() const;
/**
* @brief Report whether the model has expression IDs set.
* @return Boolean indicating whether expression ids were set. Also returns
* `true` if the number of corresponding variables is just zero.
*/
- virtual bool hasExpressionIds() const;
+ virtual bool has_expression_ids() const;
/**
* @brief Get IDs of the expression.
* @return Expression IDs
*/
- virtual std::vector getExpressionIds() const;
+ virtual std::vector get_expression_ids() const;
/**
- * @brief Checks whether the defined noise model is gaussian, i.e., the nllh
+ * @brief Checks whether the defined noise model is Gaussian, i.e., the nllh
* is quadratic
* @return boolean flag
*/
- virtual bool hasQuadraticLLH() const;
+ virtual bool has_quadratic_llh() const;
/**
* @brief Get the timepoint vector.
* @return Timepoint vector
*/
- std::vector const& getTimepoints() const;
+ std::vector const& get_timepoints() const;
/**
* @brief Get simulation timepoint for time index `it`.
* @param it Time index
* @return Timepoint
*/
- realtype getTimepoint(int it) const;
+ realtype get_timepoint(int it) const;
/**
* @brief Set the timepoint vector.
* @param ts New timepoint vector
*/
- void setTimepoints(std::vector const& ts);
+ void set_timepoints(std::vector const& ts);
/**
* @brief Get simulation start time.
@@ -747,13 +750,13 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t0 Simulation start time
*/
- void setT0(double t0);
+ void set_t0(double t0);
/**
* @brief Get the initial time to use for pre-equilibration.
* @return Initial time, or NAN to use the model's t0.
*/
- double t0Preeq() const;
+ double t0_preeq() const;
/**
* @brief Set the initial time to use for pre-equilibration.
@@ -761,42 +764,42 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t0_preeq The initial time for pre-equilibration or NAN to use the
* model's t0.
*/
- void setT0Preeq(double t0_preeq);
+ void set_t0_preeq(double t0_preeq);
/**
* @brief Get flags indicating whether states should be treated as
* non-negative.
* @return Vector of flags
*/
- std::vector const& getStateIsNonNegative() const;
+ std::vector const& get_state_is_non_negative() const;
/**
* @brief Set flags indicating whether states should be treated as
* non-negative.
* @param stateIsNonNegative Vector of flags
*/
- void setStateIsNonNegative(std::vector const& stateIsNonNegative);
+ void set_state_is_non_negative(std::vector const& stateIsNonNegative);
/**
* @brief Set flags indicating that all states should be treated as
* non-negative.
*/
- void setAllStatesNonNegative();
+ void set_all_states_non_negative();
/**
* @brief Get the current model state.
* @return Current model state
*/
- ModelState const& getModelState() const { return state_; }
+ ModelState const& get_model_state() const { return state_; }
/**
* @brief Set the current model state.
* @param state Model state
*/
- void setModelState(ModelState const& state) {
- if (gsl::narrow(state.unscaledParameters.size()) != np())
+ void set_model_state(ModelState const& state) {
+ if (gsl::narrow(state.unscaled_parameters.size()) != np())
throw AmiException("Mismatch in parameter size");
- if (gsl::narrow(state.fixedParameters.size()) != nk())
+ if (gsl::narrow(state.fixed_parameters.size()) != nk())
throw AmiException("Mismatch in fixed parameter size");
if (gsl::narrow(state.h.size()) != ne)
throw AmiException("Mismatch in Heaviside size");
@@ -813,7 +816,7 @@ class Model : public AbstractModel, public ModelDimensions {
* ensure that log(sigma) + min_sigma > 0.
* @param min_sigma lower boundary
*/
- void setMinimumSigmaResiduals(double const min_sigma) {
+ void set_minimum_sigma_residuals(double const min_sigma) {
min_sigma_ = min_sigma;
}
@@ -821,7 +824,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @brief Gets the specified estimated lower boundary for sigma_y.
* @return lower boundary
*/
- [[nodiscard]] realtype getMinimumSigmaResiduals() const {
+ [[nodiscard]] realtype get_minimum_sigma_residuals() const {
return min_sigma_;
}
@@ -837,20 +840,22 @@ class Model : public AbstractModel, public ModelDimensions {
*
* @param sigma_res if true, additional residuals are added
*/
- void setAddSigmaResiduals(bool const sigma_res) { sigma_res_ = sigma_res; }
+ void set_add_sigma_residuals(bool const sigma_res) {
+ sigma_res_ = sigma_res;
+ }
/**
* @brief Checks whether residuals should be added to account for parameter
* dependent sigma.
* @return sigma_res
*/
- bool getAddSigmaResiduals() const { return sigma_res_; }
+ bool get_add_sigma_residuals() const { return sigma_res_; }
/**
* @brief Get the list of parameters for which sensitivities are computed.
* @return List of parameter indices
*/
- std::vector const& getParameterList() const;
+ std::vector const& get_parameter_list() const;
/**
* @brief Get entry in parameter list by index.
@@ -867,39 +872,41 @@ class Model : public AbstractModel, public ModelDimensions {
*
* @param plist List of parameter indices
*/
- void setParameterList(std::vector const& plist);
+ void set_parameter_list(std::vector const& plist);
/**
* @brief Get the initial state.
* @param t0 Custom t0 for which to get initial states.
* @return Initial state vector, before any events are executed.
*/
- std::vector getInitialStates(realtype t0);
+ std::vector get_initial_state(realtype t0);
/**
* @brief Get the initial state for Model::t0()`.
* @return Initial state vector, before any events are executed.
*/
- std::vector getInitialStates() { return getInitialStates(t0()); }
+ std::vector get_initial_state() {
+ return get_initial_state(t0());
+ }
/**
* @brief Set the pre-event initial state.
* @param x0 Initial state vector
*/
- void setInitialStates(std::vector const& x0);
+ void set_initial_state(std::vector const& x0);
/**
* @brief Return whether custom initial state have been set.
* @return `true` if has custom initial state, otherwise `false`
*/
- [[nodiscard]] bool hasCustomInitialStates() const;
+ [[nodiscard]] bool has_custom_initial_state() const;
/**
* @brief Get the initial state sensitivities.
* @return vector of initial state sensitivities
*/
- std::vector getInitialStateSensitivities() {
- return getInitialStateSensitivities(t0());
+ std::vector get_initial_state_sensitivities() {
+ return get_initial_state_sensitivities(t0());
}
/**
@@ -907,71 +914,72 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t0 Custom t0 for which to get initial states.
* @return vector of initial state sensitivities
*/
- std::vector getInitialStateSensitivities(realtype t0);
+ std::vector get_initial_state_sensitivities(realtype t0);
/**
* @brief Set the initial state sensitivities.
- * @param sx0 vector of initial state sensitivities with chainrule applied.
+ * @param sx0 vector of initial state sensitivities with chain rule applied.
* This could be a slice of ReturnData::sx or ReturnData::sx0
*/
- void setInitialStateSensitivities(std::vector const& sx0);
+ void set_initial_state_sensitivities(std::vector const& sx0);
/**
* @brief Return whether custom initial state sensitivities have been set.
* @return `true` if has custom initial state sensitivities, otherwise
* `false`.
*/
- bool hasCustomInitialStateSensitivities() const;
+ bool has_custom_initial_state_sensitivities() const;
/**
* @brief Set the initial state sensitivities.
- * @param sx0 Vector of initial state sensitivities without chainrule
- * applied. This could be the readin from a `model.sx0data` saved to HDF5.
+ * @param sx0 Vector of initial state sensitivities without chain rule
+ * applied. This could be the read-in from a `model.sx0data` saved to HDF5.
*/
- void setUnscaledInitialStateSensitivities(std::vector const& sx0);
+ void
+ set_unscaled_initial_state_sensitivities(std::vector const& sx0);
/**
- * @brief Set the mode how steady state is computed in the steadystate
+ * @brief Set the mode how steady state is computed in the steady state
* simulation.
- * @param mode Steadystate computation mode
+ * @param mode Steady state computation mode
*/
- void setSteadyStateComputationMode(SteadyStateComputationMode mode);
+ void set_steady_state_computation_mode(SteadyStateComputationMode mode);
/**
* @brief Gets the mode how steady state is computed in the steadystate
* simulation.
* @return Mode
*/
- SteadyStateComputationMode getSteadyStateComputationMode() const;
+ SteadyStateComputationMode get_steady_state_computation_mode() const;
/**
- * @brief Set the mode how sensitivities are computed in the steadystate
+ * @brief Set the mode how sensitivities are computed in the steady-state
* simulation.
- * @param mode Steadystate sensitivity mode
+ * @param mode Steady-state sensitivity mode
*/
- void setSteadyStateSensitivityMode(SteadyStateSensitivityMode mode);
+ void set_steady_state_sensitivity_mode(SteadyStateSensitivityMode mode);
/**
- * @brief Gets the mode how sensitivities are computed in the steadystate
+ * @brief Gets the mode how sensitivities are computed in the steady-state
* simulation.
* @return Mode
*/
[[nodiscard]] SteadyStateSensitivityMode
- getSteadyStateSensitivityMode() const;
+ get_steady_state_sensitivity_mode() const;
/**
* @brief Set whether initial states depending on fixed parameters are to be
* reinitialized after preequilibration and presimulation.
* @param flag Fixed parameters reinitialized?
*/
- void setReinitializeFixedParameterInitialStates(bool flag);
+ void set_reinitialize_fixed_parameter_initial_states(bool flag);
/**
* @brief Get whether initial states depending on fixedParameters are to be
* reinitialized after preequilibration and presimulation.
* @return flag `true` / `false`
*/
- [[nodiscard]] bool getReinitializeFixedParameterInitialStates() const;
+ [[nodiscard]] bool get_reinitialize_fixed_parameter_initial_states() const;
/**
* @brief Require computation of sensitivities for all parameters p [0..np[
@@ -979,7 +987,7 @@ class Model : public AbstractModel, public ModelDimensions {
*
* NOTE: Resets initial state sensitivities.
*/
- void requireSensitivitiesForAllParameters();
+ void require_sensitivities_for_all_parameters();
/**
* @brief Get time-resolved `w`.
@@ -987,7 +995,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Current timepoint
* @param x Current state
*/
- void getExpression(gsl::span w, realtype t, AmiVector const& x);
+ void get_expression(gsl::span w, realtype t, AmiVector const& x);
/**
* @brief Get time-resolved observables.
@@ -995,14 +1003,15 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Current timepoint
* @param x Current state
*/
- void getObservable(gsl::span y, realtype t, AmiVector const& x);
+ void get_observable(gsl::span y, realtype t, AmiVector const& x);
/**
* @brief Get scaling type for observable
* @param iy observable index
* @return scaling type
*/
- [[nodiscard]] virtual ObservableScaling getObservableScaling(int iy) const;
+ [[nodiscard]] virtual ObservableScaling
+ get_observable_scaling(int iy) const;
/**
* @brief Get sensitivity of time-resolved observables.
@@ -1014,7 +1023,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param sx State sensitivities
*/
- void getObservableSensitivity(
+ void get_observable_sensitivity(
gsl::span sy, realtype t, AmiVector const& x,
AmiVectorArray const& sx
);
@@ -1026,7 +1035,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param edata Pointer to experimental data instance (optional, pass
* `nullptr` to ignore)
*/
- void getObservableSigma(
+ void get_observable_sigma(
gsl::span sigmay, int it, ExpData const* edata
);
@@ -1041,7 +1050,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param edata Pointer to experimental data instance (optional, pass
* `nullptr` to ignore)
*/
- void getObservableSigmaSensitivity(
+ void get_observable_sigma_sensitivity(
gsl::span ssigmay, gsl::span sy, int it,
ExpData const* edata
);
@@ -1053,7 +1062,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void addObservableObjective(
+ void add_observable_objective(
realtype& Jy, int it, AmiVector const& x, ExpData const& edata
);
@@ -1068,7 +1077,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param sx State sensitivities
* @param edata Experimental data
*/
- void addObservableObjectiveSensitivity(
+ void add_observable_objective_sensitivity(
std::vector& sllh, std::vector& s2llh, int it,
AmiVector const& x, AmiVectorArray const& sx, ExpData const& edata
);
@@ -1086,13 +1095,13 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void addPartialObservableObjectiveSensitivity(
+ void add_partial_observable_objective_sensitivity(
std::vector& sllh, std::vector& s2llh, int it,
AmiVector const& x, ExpData const& edata
);
/**
- * @brief Get state sensitivity of the negative loglikelihood \f$ Jy \f$,
+ * @brief Get state sensitivity of the negative log-likelihood \f$ Jy \f$,
* partial derivative (to be used with adjoint sensitivities).
*
* @param dJydx Output buffer (shape `nJ` x `nx_solver`, row-major)
@@ -1100,7 +1109,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data instance
*/
- void getAdjointStateObservableUpdate(
+ void get_adjoint_state_observable_update(
gsl::span dJydx, int it, AmiVector const& x,
ExpData const& edata
);
@@ -1113,7 +1122,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
*/
void
- getEvent(gsl::span z, int ie, realtype t, AmiVector const& x);
+ get_event(gsl::span z, int ie, realtype t, AmiVector const& x);
/**
* @brief Get sensitivities of event-resolved observables.
*
@@ -1125,7 +1134,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param sx State sensitivities
*/
- void getEventSensitivity(
+ void get_event_sensitivity(
gsl::span sz, int ie, realtype t, AmiVector const& x,
AmiVectorArray const& sx
);
@@ -1138,7 +1147,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param sz Output buffer (shape `nz x nplist`, row-major)
* @param ie Event index
*/
- void getUnobservedEventSensitivity(gsl::span sz, int ie);
+ void get_unobserved_event_sensitivity(gsl::span sz, int ie);
/**
* @brief Get regularization for event-resolved observables.
@@ -1147,7 +1156,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Timepoint
* @param x State variables
*/
- void getEventRegularization(
+ void get_event_regularization(
gsl::span rz, int ie, realtype t, AmiVector const& x
);
@@ -1163,7 +1172,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param sx State sensitivities
*/
- void getEventRegularizationSensitivity(
+ void get_event_regularization_sensitivity(
gsl::span srz, int ie, realtype t, AmiVector const& x,
AmiVectorArray const& sx
);
@@ -1176,7 +1185,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param edata Pointer to experimental data (optional, pass
* `nullptr` to ignore)
*/
- void getEventSigma(
+ void get_event_sigma(
gsl::span sigmaz, int ie, int nroots, realtype t,
ExpData const* edata
);
@@ -1194,7 +1203,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param edata Pointer to experimental data (optional, pass
* `nullptr` to ignore)
*/
- void getEventSigmaSensitivity(
+ void get_event_sigma_sensitivity(
gsl::span ssigmaz, int ie, int nroots, realtype t,
ExpData const* edata
);
@@ -1208,7 +1217,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void addEventObjective(
+ void add_event_objective(
realtype& Jz, int ie, int nroots, realtype t, AmiVector const& x,
ExpData const& edata
);
@@ -1222,7 +1231,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void addEventObjectiveRegularization(
+ void add_event_objective_regularization(
realtype& Jrz, int ie, int nroots, realtype t, AmiVector const& x,
ExpData const& edata
);
@@ -1243,7 +1252,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param sx State sensitivities
* @param edata Experimental data
*/
- void addEventObjectiveSensitivity(
+ void add_event_objective_sensitivity(
std::vector& sllh, std::vector& s2llh, int ie,
int nroots, realtype t, AmiVector const& x, AmiVectorArray const& sx,
ExpData const& edata
@@ -1264,13 +1273,13 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void addPartialEventObjectiveSensitivity(
+ void add_partial_event_objective_sensitivity(
std::vector& sllh, std::vector& s2llh, int ie,
int nroots, realtype t, AmiVector const& x, ExpData const& edata
);
/**
- * @brief State sensitivity of the negative loglikelihood \f$ Jz \f$.
+ * @brief State sensitivity of the negative log-likelihood \f$ Jz \f$.
*
* Partial derivative (to be used with adjoint sensitivities).
*
@@ -1281,7 +1290,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x State variables
* @param edata Experimental data
*/
- void getAdjointStateEventUpdate(
+ void get_adjoint_state_event_update(
gsl::span dJzdx, int ie, int nroots, realtype t,
AmiVector const& x, ExpData const& edata
);
@@ -1298,7 +1307,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param sx State sensitivities
* @param dx Current derivative of state (DAE only)
*/
- void getEventTimeSensitivity(
+ void get_event_time_sensitivity(
std::vector& stau, realtype t, int ie, AmiVector const& x,
AmiVectorArray const& sx, AmiVector const& dx
);
@@ -1313,7 +1322,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x_old Current or old state from which to compute the state update
* @param state The model state based on which to compute the update.
*/
- void addStateEventUpdate(
+ void add_state_event_update(
AmiVector& x, int ie, realtype t, AmiVector const& xdot,
AmiVector const& xdot_old, AmiVector const& x_old,
ModelState const& state
@@ -1332,7 +1341,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param stau Timepoint sensitivity, to be computed with
* `Model::getEventTimeSensitivity`
*/
- void addStateSensitivityEventUpdate(
+ void add_state_sensitivity_event_update(
AmiVectorArray& sx, int ie, realtype t, AmiVector const& x,
AmiVector const& x_old, AmiVector const& xdot,
AmiVector const& xdot_old, AmiVectorArray const& sx_old,
@@ -1350,7 +1359,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x_old Pre-event state
* @param dx Current derivative of state (DAE only)
*/
- void addAdjointStateEventUpdate(
+ void add_adjoint_state_event_update(
AmiVector& xB, int ie, realtype t, AmiVector const& x,
AmiVector const& xdot, AmiVector const& xdot_old,
AmiVector const& x_old, AmiVector const& dx
@@ -1368,7 +1377,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param x_old Pre-event state
* @param dx Current derivative of state (DAE only)
*/
- void addAdjointQuadratureEventUpdate(
+ void add_adjoint_quadrature_event_update(
AmiVector& xQB, int ie, realtype t, AmiVector const& x,
AmiVector const& xB, AmiVector const& xdot, AmiVector const& xdot_old,
AmiVector const& x_old, AmiVector const& dx
@@ -1381,7 +1390,7 @@ class Model : public AbstractModel, public ModelDimensions {
* it will give the right update to the Heaviside variables (zero if no root
* was found)
*/
- void updateHeaviside(std::vector const& rootsfound);
+ void update_heaviside(std::vector const& rootsfound);
/**
* @brief Check if the given array has only finite elements.
@@ -1393,7 +1402,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Current timepoint
* @return
*/
- int checkFinite(
+ int check_finite(
gsl::span array, ModelQuantity model_quantity,
realtype t
) const;
@@ -1408,7 +1417,7 @@ class Model : public AbstractModel, public ModelDimensions {
* @param t Current timepoint
* @return
*/
- int checkFinite(
+ int check_finite(
gsl::span array, ModelQuantity model_quantity,
size_t num_cols, realtype t
) const;
@@ -1424,21 +1433,21 @@ class Model : public AbstractModel, public ModelDimensions {
* @return
*/
int
- checkFinite(SUNMatrix m, ModelQuantity model_quantity, realtype t) const;
+ check_finite(SUNMatrix m, ModelQuantity model_quantity, realtype t) const;
/**
* @brief Set whether the result of every call to `Model::f*` should be
* checked for finiteness.
* @param alwaysCheck
*/
- void setAlwaysCheckFinite(bool alwaysCheck);
+ void set_always_check_finite(bool alwaysCheck);
/**
* @brief Get setting of whether the result of every call to `Model::f*`
* should be checked for finiteness.
* @return that
*/
- [[nodiscard]] bool getAlwaysCheckFinite() const;
+ [[nodiscard]] bool get_always_check_finite() const;
/**
* @brief Compute/get pre-event initial state.
@@ -1510,14 +1519,15 @@ class Model : public AbstractModel, public ModelDimensions {
* constants / fixed parameters
* @param idxs Array of state indices
*/
- void setReinitializationStateIdxs(std::vector