{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "expmkveO04pw" }, "source": [ "## Parameter Estimation with Adam in PyBOP\n", "\n", "In this notebook, we demonstrate an example of parameter estimation for a single-particle model using the Adam optimiser [1]. The ADAM optimiser is an algorithm for gradient-based optimisation, combining the advantages of the Adaptive Gradient Algorithm (AdaGrad) and Root Mean Square Propagation (RMSProp).\n", "\n", "[[1]: Adam: A Method for Stochastic Optimization](https://arxiv.org/abs/1412.6980)\n", "\n", "### Setting up the Environment\n", "\n", "Before we begin, we need to ensure that we have all the necessary tools. We will install PyBOP from its development branch and upgrade some dependencies:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "execution": { "iopub.execute_input": "2024-04-04T13:51:40.337833Z", "iopub.status.busy": "2024-04-04T13:51:40.337689Z", "iopub.status.idle": "2024-04-04T13:51:41.935008Z", "shell.execute_reply": "2024-04-04T13:51:41.934618Z" }, "id": "X87NUGPW04py", "outputId": "0d785b07-7cff-4aeb-e60a-4ff5a669afbf" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pip in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (24.0)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: ipywidgets in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (8.1.2)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: comm>=0.1.3 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipywidgets) (0.2.2)\r\n", "Requirement already satisfied: ipython>=6.1.0 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipywidgets) (8.23.0)\r\n", "Requirement already satisfied: traitlets>=4.3.1 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipywidgets) (5.14.2)\r\n", "Requirement already satisfied: widgetsnbextension~=4.0.10 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipywidgets) (4.0.10)\r\n", "Requirement already satisfied: jupyterlab-widgets~=3.0.10 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipywidgets) (3.0.10)\r\n", "Requirement already satisfied: decorator in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (5.1.1)\r\n", "Requirement already satisfied: jedi>=0.16 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.19.1)\r\n", "Requirement already satisfied: matplotlib-inline in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.1.6)\r\n", "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (3.0.43)\r\n", "Requirement already satisfied: pygments>=2.4.0 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (2.17.2)\r\n", "Requirement already satisfied: stack-data in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (0.6.3)\r\n", "Requirement already satisfied: typing-extensions in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (4.10.0)\r\n", "Requirement already satisfied: pexpect>4.3 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets) (4.9.0)\r\n", "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets) (0.8.3)\r\n", "Requirement already satisfied: ptyprocess>=0.5 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets) (0.7.0)\r\n", "Requirement already satisfied: wcwidth in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets) (0.2.13)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: executing>=1.2.0 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (2.0.1)\r\n", "Requirement already satisfied: asttokens>=2.1.0 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (2.4.1)\r\n", "Requirement already satisfied: pure-eval in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets) (0.2.2)\r\n", "Requirement already satisfied: six>=1.12.0 in /home/engs2510/.pyenv/versions/pybop/lib/python3.11/site-packages (from asttokens>=2.1.0->stack-data->ipython>=6.1.0->ipywidgets) (1.16.0)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install --upgrade pip ipywidgets\n", "%pip install pybop -q" ] }, { "cell_type": "markdown", "metadata": { "id": "jAvD5fk104p0" }, "source": [ "### Importing Libraries\n", "\n", "With the environment set up, we can now import PyBOP alongside other libraries we will need:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:41.936561Z", "iopub.status.busy": "2024-04-04T13:51:41.936439Z", "iopub.status.idle": "2024-04-04T13:51:42.508083Z", "shell.execute_reply": "2024-04-04T13:51:42.507654Z" }, "id": "SQdt4brD04p1" }, "outputs": [], "source": [ "import numpy as np\n", "\n", "import pybop" ] }, { "cell_type": "markdown", "metadata": { "id": "5XU-dMtU04p2" }, "source": [ "### Generate Synthetic Data\n", "\n", "To demonstrate parameter estimation, we first need some data. We will generate synthetic data using the PyBOP forward model, which requires defining a parameter set and the model itself.\n", "\n", "#### Defining Parameters and Model\n", "\n", "We start by creating an example parameter set and then instantiate the single-particle model (SPM):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.509591Z", "iopub.status.busy": "2024-04-04T13:51:42.509437Z", "iopub.status.idle": "2024-04-04T13:51:42.534794Z", "shell.execute_reply": "2024-04-04T13:51:42.534452Z" } }, "outputs": [], "source": [ "parameter_set = pybop.ParameterSet.pybamm(\"Chen2020\")\n", "model = pybop.lithium_ion.SPM(parameter_set=parameter_set)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simulating Forward Model\n", "\n", "We can then simulate the model using the `predict` method, with a default constant current to generate voltage data." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.536154Z", "iopub.status.busy": "2024-04-04T13:51:42.536069Z", "iopub.status.idle": "2024-04-04T13:51:42.610305Z", "shell.execute_reply": "2024-04-04T13:51:42.609892Z" }, "id": "sBasxv8U04p3" }, "outputs": [], "source": [ "t_eval = np.arange(0, 900, 2)\n", "values = model.predict(t_eval=t_eval)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding Noise to Voltage Data\n", "\n", "To make the parameter estimation more realistic, we add Gaussian noise to the data." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.611946Z", "iopub.status.busy": "2024-04-04T13:51:42.611728Z", "iopub.status.idle": "2024-04-04T13:51:42.621525Z", "shell.execute_reply": "2024-04-04T13:51:42.621156Z" } }, "outputs": [], "source": [ "sigma = 0.001\n", "corrupt_values = values[\"Voltage [V]\"].data + np.random.normal(0, sigma, len(t_eval))" ] }, { "cell_type": "markdown", "metadata": { "id": "X8-tubYY04p_" }, "source": [ "## Identify the Parameters" ] }, { "cell_type": "markdown", "metadata": { "id": "PQqhvSZN04p_" }, "source": [ "We will now set up the parameter estimation process by defining the datasets for optimisation and selecting the model parameters we wish to estimate." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating Optimisation Dataset\n", "\n", "The dataset for optimisation is composed of time, current, and the noisy voltage data:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.622671Z", "iopub.status.busy": "2024-04-04T13:51:42.622478Z", "iopub.status.idle": "2024-04-04T13:51:42.628864Z", "shell.execute_reply": "2024-04-04T13:51:42.628519Z" }, "id": "zuvGHWID04p_" }, "outputs": [], "source": [ "dataset = pybop.Dataset(\n", " {\n", " \"Time [s]\": t_eval,\n", " \"Current function [A]\": values[\"Current [A]\"].data,\n", " \"Voltage [V]\": corrupt_values,\n", " }\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "ffS3CF_704qA" }, "source": [ "### Defining Parameters to Estimate\n", "\n", "We select the parameters for estimation and set up their prior distributions and bounds:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.629987Z", "iopub.status.busy": "2024-04-04T13:51:42.629809Z", "iopub.status.idle": "2024-04-04T13:51:42.631895Z", "shell.execute_reply": "2024-04-04T13:51:42.631621Z" }, "id": "WPCybXIJ04qA" }, "outputs": [], "source": [ "parameters = [\n", " pybop.Parameter(\n", " \"Negative electrode active material volume fraction\",\n", " prior=pybop.Gaussian(0.6, 0.02),\n", " bounds=[0.5, 0.8],\n", " ),\n", " pybop.Parameter(\n", " \"Positive electrode active material volume fraction\",\n", " prior=pybop.Gaussian(0.48, 0.02),\n", " bounds=[0.4, 0.7],\n", " ),\n", "]" ] }, { "cell_type": "markdown", "metadata": { "id": "n4OHa-aF04qA" }, "source": [ "### Setting up the Optimisation Problem\n", "\n", "With the datasets and parameters defined, we can set up the optimisation problem, its cost function, and the optimiser." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.632931Z", "iopub.status.busy": "2024-04-04T13:51:42.632782Z", "iopub.status.idle": "2024-04-04T13:51:42.705454Z", "shell.execute_reply": "2024-04-04T13:51:42.705066Z" }, "id": "etMzRtx404qA" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NOTE: Boundaries ignored by Adam\n" ] } ], "source": [ "problem = pybop.FittingProblem(model, parameters, dataset)\n", "cost = pybop.SumSquaredError(problem)\n", "optim = pybop.Optimisation(cost, optimiser=pybop.Adam)\n", "optim.set_max_unchanged_iterations(40)\n", "optim.set_max_iterations(150)" ] }, { "cell_type": "markdown", "metadata": { "id": "caprp-bV04qB" }, "source": [ "### Running the Optimisation\n", "\n", "We proceed to run the Adam optimisation algorithm to estimate the parameters:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:42.706564Z", "iopub.status.busy": "2024-04-04T13:51:42.706469Z", "iopub.status.idle": "2024-04-04T13:51:50.537424Z", "shell.execute_reply": "2024-04-04T13:51:50.537032Z" }, "id": "-9OVt0EQ04qB" }, "outputs": [], "source": [ "x, final_cost = optim.run()" ] }, { "cell_type": "markdown", "metadata": { "id": "-4pZsDmS04qC" }, "source": [ "### Viewing the Estimated Parameters\n", "\n", "After the optimisation, we can examine the estimated parameter values:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "execution": { "iopub.execute_input": "2024-04-04T13:51:50.538815Z", "iopub.status.busy": "2024-04-04T13:51:50.538619Z", "iopub.status.idle": "2024-04-04T13:51:50.541683Z", "shell.execute_reply": "2024-04-04T13:51:50.541465Z" }, "id": "Hgz8SV4i04qC", "outputId": "e1e42ae7-5075-4c47-dd68-1b22ecc170f6" }, "outputs": [ { "data": { "text/plain": [ "array([0.76496615, 0.66254367])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x # This will output the estimated parameters" ] }, { "cell_type": "markdown", "metadata": { "id": "KxKURtH704qC" }, "source": [ "## Plotting and Visualisation\n", "\n", "PyBOP provides various plotting utilities to visualise the results of the optimisation." ] }, { "cell_type": "markdown", "metadata": { "id": "-cWCOiqR04qC" }, "source": [ "### Comparing System Response\n", "\n", "We can quickly plot the system's response using the estimated parameters compared to the target:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 467 }, "execution": { "iopub.execute_input": "2024-04-04T13:51:50.542618Z", "iopub.status.busy": "2024-04-04T13:51:50.542472Z", "iopub.status.idle": "2024-04-04T13:51:50.986055Z", "shell.execute_reply": "2024-04-04T13:51:50.985844Z" }, "id": "tJUJ80Ve04qD", "outputId": "855fbaa2-1e09-4935-eb1a-8caf7f99eb75" }, "outputs": [ { "data": { "image/svg+xml": [ "02004006008003.83.853.93.9544.05ReferenceModelOptimised ComparisonTime / sVoltage / V" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pybop.quick_plot(problem, parameter_values=x, title=\"Optimised Comparison\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Convergence and Parameter Trajectories\n", "\n", "To assess the optimisation process, we can plot the convergence of the cost function and the trajectories of the parameters:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:50.987237Z", "iopub.status.busy": "2024-04-04T13:51:50.986963Z", "iopub.status.idle": "2024-04-04T13:51:52.766386Z", "shell.execute_reply": "2024-04-04T13:51:52.766178Z" }, "id": "N5XYkevi04qD" }, "outputs": [ { "data": { "image/svg+xml": [ "2040608010012014000.511.522.533.54ConvergenceIterationCost" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "0501000.60.650.70.750.80.850501000.50.550.60.650.7Negative electrode active material volume fractionPositive electrode active material volume fractionParameter ConvergenceFunction CallFunction CallNegative electrode active material volume fractionPositive electrode active material volume fraction" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pybop.plot_convergence(optim)\n", "pybop.plot_parameters(optim);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cost Landscape\n", "\n", "Finally, we can visualise the cost landscape and the path taken by the optimiser:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2024-04-04T13:51:52.767346Z", "iopub.status.busy": "2024-04-04T13:51:52.767261Z", "iopub.status.idle": "2024-04-04T13:51:57.666000Z", "shell.execute_reply": "2024-04-04T13:51:57.665745Z" } }, "outputs": [ { "data": { "image/svg+xml": [ "0.50.550.60.650.70.750.80.40.450.50.550.60.650.70246810Cost LandscapeNegative electrode active material volume fractionPositive electrode active material volume fraction" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "0.60.650.70.750.80.850.90.50.550.60.650.70.750.80.40.81.21.622.4Cost LandscapeNegative electrode active material volume fractionPositive electrode active material volume fraction" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the cost landscape\n", "pybop.plot2d(cost, steps=15)\n", "# Plot the cost landscape with optimisation path and updated bounds\n", "bounds = np.array([[0.6, 0.9], [0.5, 0.8]])\n", "pybop.plot2d(optim, bounds=bounds, steps=15);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conclusion\n", "\n", "This notebook illustrates how to perform parameter estimation using Adam in PyBOP, providing insights into the optimisation process through various visualisations." ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.8" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "06f2374f91c8455bb63252092512f2ed": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "423bffea3a1c42b49a9ad71218e5811b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "56ff19291e464d63b23e63b8e2ac9ea3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "SliderStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "SliderStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "StyleView", "description_width": "", "handle_color": null } }, "646a8670cb204a31bb56bc2380898093": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7d46516469314b88be3500e2afcafcf6": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_646a8670cb204a31bb56bc2380898093", "msg_id": "", "outputs": [], "tabbable": null, "tooltip": null } }, "8d003c14da5f4fa68284b28c15cee6e6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "VBoxModel", "state": { "_dom_classes": [ "widget-interact" ], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "VBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "VBoxView", "box_style": "", "children": [ "IPY_MODEL_aef2fa7adcc14ad0854b73d5910ae3b4", "IPY_MODEL_7d46516469314b88be3500e2afcafcf6" ], "layout": "IPY_MODEL_423bffea3a1c42b49a9ad71218e5811b", "tabbable": null, "tooltip": null } }, "aef2fa7adcc14ad0854b73d5910ae3b4": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatSliderModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "2.0.0", "_model_name": "FloatSliderModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "2.0.0", "_view_name": "FloatSliderView", "behavior": "drag-tap", "continuous_update": true, "description": "t", "description_allow_html": false, "disabled": false, "layout": "IPY_MODEL_06f2374f91c8455bb63252092512f2ed", "max": 1.1333333333333333, "min": 0, "orientation": "horizontal", "readout": true, "readout_format": ".2f", "step": 0.011333333333333332, "style": "IPY_MODEL_56ff19291e464d63b23e63b8e2ac9ea3", "tabbable": null, "tooltip": null, "value": 0 } } } } }, "nbformat": 4, "nbformat_minor": 4 }