diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..2a6d471 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 42647dab2a9c89d69feefbcf6c6f1d6d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api/analysis.doctree b/.doctrees/api/analysis.doctree new file mode 100644 index 0000000..2ac9aff Binary files /dev/null and b/.doctrees/api/analysis.doctree differ diff --git a/.doctrees/api/dataloading.doctree b/.doctrees/api/dataloading.doctree new file mode 100644 index 0000000..1a71c74 Binary files /dev/null and b/.doctrees/api/dataloading.doctree differ diff --git a/.doctrees/api/estimation.doctree b/.doctrees/api/estimation.doctree new file mode 100644 index 0000000..e0deb2a Binary files /dev/null and b/.doctrees/api/estimation.doctree differ diff --git a/.doctrees/api/functions.doctree b/.doctrees/api/functions.doctree new file mode 100644 index 0000000..a5b5b7e Binary files /dev/null and b/.doctrees/api/functions.doctree differ diff --git a/.doctrees/api/generated/folie.BrownianMotion.doctree b/.doctrees/api/generated/folie.BrownianMotion.doctree new file mode 100644 index 0000000..84d3805 Binary files /dev/null and b/.doctrees/api/generated/folie.BrownianMotion.doctree differ diff --git a/.doctrees/api/generated/folie.DrozdovDensity.doctree b/.doctrees/api/generated/folie.DrozdovDensity.doctree new file mode 100644 index 0000000..a2bcace Binary files /dev/null and b/.doctrees/api/generated/folie.DrozdovDensity.doctree differ diff --git a/.doctrees/api/generated/folie.ELBOEstimator.doctree b/.doctrees/api/generated/folie.ELBOEstimator.doctree new file mode 100644 index 0000000..6ee9506 Binary files /dev/null and b/.doctrees/api/generated/folie.ELBOEstimator.doctree differ diff --git a/.doctrees/api/generated/folie.EMEstimator.doctree b/.doctrees/api/generated/folie.EMEstimator.doctree new file mode 100644 index 0000000..d7a9d46 Binary files /dev/null and b/.doctrees/api/generated/folie.EMEstimator.doctree differ diff --git a/.doctrees/api/generated/folie.ElerianDensity.doctree b/.doctrees/api/generated/folie.ElerianDensity.doctree new file mode 100644 index 0000000..75dce2a Binary files /dev/null and b/.doctrees/api/generated/folie.ElerianDensity.doctree differ diff --git a/.doctrees/api/generated/folie.EulerDensity.doctree b/.doctrees/api/generated/folie.EulerDensity.doctree new file mode 100644 index 0000000..e631a7d Binary files /dev/null and b/.doctrees/api/generated/folie.EulerDensity.doctree differ diff --git a/.doctrees/api/generated/folie.ExactDensity.doctree b/.doctrees/api/generated/folie.ExactDensity.doctree new file mode 100644 index 0000000..264b771 Binary files /dev/null and b/.doctrees/api/generated/folie.ExactDensity.doctree differ diff --git a/.doctrees/api/generated/folie.KesslerDensity.doctree b/.doctrees/api/generated/folie.KesslerDensity.doctree new file mode 100644 index 0000000..e9fd9ef Binary files /dev/null and b/.doctrees/api/generated/folie.KesslerDensity.doctree differ diff --git a/.doctrees/api/generated/folie.KramersMoyalEstimator.doctree b/.doctrees/api/generated/folie.KramersMoyalEstimator.doctree new file mode 100644 index 0000000..7c497d4 Binary files /dev/null and b/.doctrees/api/generated/folie.KramersMoyalEstimator.doctree differ diff --git a/.doctrees/api/generated/folie.LikelihoodEstimator.doctree b/.doctrees/api/generated/folie.LikelihoodEstimator.doctree new file mode 100644 index 0000000..cdca194 Binary files /dev/null and b/.doctrees/api/generated/folie.LikelihoodEstimator.doctree differ diff --git a/.doctrees/api/generated/folie.OrnsteinUhlenbeck.doctree b/.doctrees/api/generated/folie.OrnsteinUhlenbeck.doctree new file mode 100644 index 0000000..5e904d2 Binary files /dev/null and b/.doctrees/api/generated/folie.OrnsteinUhlenbeck.doctree differ diff --git a/.doctrees/api/generated/folie.Overdamped.doctree b/.doctrees/api/generated/folie.Overdamped.doctree new file mode 100644 index 0000000..60741f7 Binary files /dev/null and b/.doctrees/api/generated/folie.Overdamped.doctree differ diff --git a/.doctrees/api/generated/folie.OverdampedSplines1D.doctree b/.doctrees/api/generated/folie.OverdampedSplines1D.doctree new file mode 100644 index 0000000..f7e7569 Binary files /dev/null and b/.doctrees/api/generated/folie.OverdampedSplines1D.doctree differ diff --git a/.doctrees/api/generated/folie.OzakiDensity.doctree b/.doctrees/api/generated/folie.OzakiDensity.doctree new file mode 100644 index 0000000..db86831 Binary files /dev/null and b/.doctrees/api/generated/folie.OzakiDensity.doctree differ diff --git a/.doctrees/api/generated/folie.ShojiOzakiDensity.doctree b/.doctrees/api/generated/folie.ShojiOzakiDensity.doctree new file mode 100644 index 0000000..12c0bcc Binary files /dev/null and b/.doctrees/api/generated/folie.ShojiOzakiDensity.doctree differ diff --git a/.doctrees/api/generated/folie.Trajectories.doctree b/.doctrees/api/generated/folie.Trajectories.doctree new file mode 100644 index 0000000..61e12fb Binary files /dev/null and b/.doctrees/api/generated/folie.Trajectories.doctree differ diff --git a/.doctrees/api/generated/folie.analysis.free_energy_profile_1d.doctree b/.doctrees/api/generated/folie.analysis.free_energy_profile_1d.doctree new file mode 100644 index 0000000..069c291 Binary files /dev/null and b/.doctrees/api/generated/folie.analysis.free_energy_profile_1d.doctree differ diff --git a/.doctrees/api/generated/folie.analysis.mfpt_1d.doctree b/.doctrees/api/generated/folie.analysis.mfpt_1d.doctree new file mode 100644 index 0000000..0ec2a3f Binary files /dev/null and b/.doctrees/api/generated/folie.analysis.mfpt_1d.doctree differ diff --git a/.doctrees/api/generated/folie.functions.BSplinesFunction.doctree b/.doctrees/api/generated/folie.functions.BSplinesFunction.doctree new file mode 100644 index 0000000..653b497 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.BSplinesFunction.doctree differ diff --git a/.doctrees/api/generated/folie.functions.Constant.doctree b/.doctrees/api/generated/folie.functions.Constant.doctree new file mode 100644 index 0000000..a9e16a7 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.Constant.doctree differ diff --git a/.doctrees/api/generated/folie.functions.FiniteElement.doctree b/.doctrees/api/generated/folie.functions.FiniteElement.doctree new file mode 100644 index 0000000..377b0c3 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.FiniteElement.doctree differ diff --git a/.doctrees/api/generated/folie.functions.Fourier.doctree b/.doctrees/api/generated/folie.functions.Fourier.doctree new file mode 100644 index 0000000..20e5bc5 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.Fourier.doctree differ diff --git a/.doctrees/api/generated/folie.functions.KernelFunction.doctree b/.doctrees/api/generated/folie.functions.KernelFunction.doctree new file mode 100644 index 0000000..ff636bc Binary files /dev/null and b/.doctrees/api/generated/folie.functions.KernelFunction.doctree differ diff --git a/.doctrees/api/generated/folie.functions.Linear.doctree b/.doctrees/api/generated/folie.functions.Linear.doctree new file mode 100644 index 0000000..d1c62d2 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.Linear.doctree differ diff --git a/.doctrees/api/generated/folie.functions.ModelOverlay.doctree b/.doctrees/api/generated/folie.functions.ModelOverlay.doctree new file mode 100644 index 0000000..3e3fa72 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.ModelOverlay.doctree differ diff --git a/.doctrees/api/generated/folie.functions.Polynomial.doctree b/.doctrees/api/generated/folie.functions.Polynomial.doctree new file mode 100644 index 0000000..3843c18 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.Polynomial.doctree differ diff --git a/.doctrees/api/generated/folie.functions.sklearnBSplines.doctree b/.doctrees/api/generated/folie.functions.sklearnBSplines.doctree new file mode 100644 index 0000000..3d92660 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.sklearnBSplines.doctree differ diff --git a/.doctrees/api/generated/folie.functions.sklearnTransformer.doctree b/.doctrees/api/generated/folie.functions.sklearnTransformer.doctree new file mode 100644 index 0000000..3440337 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.sklearnTransformer.doctree differ diff --git a/.doctrees/api/generated/folie.functions.sklearnWrapper.doctree b/.doctrees/api/generated/folie.functions.sklearnWrapper.doctree new file mode 100644 index 0000000..b163ec7 Binary files /dev/null and b/.doctrees/api/generated/folie.functions.sklearnWrapper.doctree differ diff --git a/.doctrees/api/models.doctree b/.doctrees/api/models.doctree new file mode 100644 index 0000000..ab8c500 Binary files /dev/null and b/.doctrees/api/models.doctree differ diff --git a/.doctrees/auto_examples/example_em.doctree b/.doctrees/auto_examples/example_em.doctree new file mode 100644 index 0000000..ef2c842 Binary files /dev/null and b/.doctrees/auto_examples/example_em.doctree differ diff --git a/.doctrees/auto_examples/index.doctree b/.doctrees/auto_examples/index.doctree new file mode 100644 index 0000000..05ad0f7 Binary files /dev/null and b/.doctrees/auto_examples/index.doctree differ diff --git a/.doctrees/auto_examples/plot_biasedOU.doctree b/.doctrees/auto_examples/plot_biasedOU.doctree new file mode 100644 index 0000000..7492a2b Binary files /dev/null and b/.doctrees/auto_examples/plot_biasedOU.doctree differ diff --git a/.doctrees/auto_examples/plot_example.doctree b/.doctrees/auto_examples/plot_example.doctree new file mode 100644 index 0000000..d3b0c0c Binary files /dev/null and b/.doctrees/auto_examples/plot_example.doctree differ diff --git a/.doctrees/auto_examples/plot_fem.doctree b/.doctrees/auto_examples/plot_fem.doctree new file mode 100644 index 0000000..cd2dd6c Binary files /dev/null and b/.doctrees/auto_examples/plot_fem.doctree differ diff --git a/.doctrees/auto_examples/plot_functions.doctree b/.doctrees/auto_examples/plot_functions.doctree new file mode 100644 index 0000000..d955988 Binary files /dev/null and b/.doctrees/auto_examples/plot_functions.doctree differ diff --git a/.doctrees/auto_examples/plot_likelihood.doctree b/.doctrees/auto_examples/plot_likelihood.doctree new file mode 100644 index 0000000..a9b1883 Binary files /dev/null and b/.doctrees/auto_examples/plot_likelihood.doctree differ diff --git a/.doctrees/auto_examples/sg_execution_times.doctree b/.doctrees/auto_examples/sg_execution_times.doctree new file mode 100644 index 0000000..4c62d83 Binary files /dev/null and b/.doctrees/auto_examples/sg_execution_times.doctree differ diff --git a/.doctrees/auto_examples/toy_models/index.doctree b/.doctrees/auto_examples/toy_models/index.doctree new file mode 100644 index 0000000..7aa49b9 Binary files /dev/null and b/.doctrees/auto_examples/toy_models/index.doctree differ diff --git a/.doctrees/auto_examples/toy_models/plot_1D_Double_Well.doctree b/.doctrees/auto_examples/toy_models/plot_1D_Double_Well.doctree new file mode 100644 index 0000000..33dcad2 Binary files /dev/null and b/.doctrees/auto_examples/toy_models/plot_1D_Double_Well.doctree differ diff --git a/.doctrees/auto_examples/toy_models/plot_2D_Double_Well.doctree b/.doctrees/auto_examples/toy_models/plot_2D_Double_Well.doctree new file mode 100644 index 0000000..2d3314c Binary files /dev/null and b/.doctrees/auto_examples/toy_models/plot_2D_Double_Well.doctree differ diff --git a/.doctrees/auto_examples/toy_models/plot_biased_1D_Double_Well.doctree b/.doctrees/auto_examples/toy_models/plot_biased_1D_Double_Well.doctree new file mode 100644 index 0000000..87c7bdd Binary files /dev/null and b/.doctrees/auto_examples/toy_models/plot_biased_1D_Double_Well.doctree differ diff --git a/.doctrees/auto_examples/toy_models/plot_biased_2D_Double_Well.doctree b/.doctrees/auto_examples/toy_models/plot_biased_2D_Double_Well.doctree new file mode 100644 index 0000000..ad7fa56 Binary files /dev/null and b/.doctrees/auto_examples/toy_models/plot_biased_2D_Double_Well.doctree differ diff --git a/.doctrees/auto_examples/toy_models/sg_execution_times.doctree b/.doctrees/auto_examples/toy_models/sg_execution_times.doctree new file mode 100644 index 0000000..daf59c6 Binary files /dev/null and b/.doctrees/auto_examples/toy_models/sg_execution_times.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000..5d338f3 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/for_developper.doctree b/.doctrees/for_developper.doctree new file mode 100644 index 0000000..cc14f2e Binary files /dev/null and b/.doctrees/for_developper.doctree differ diff --git a/.doctrees/howto.doctree b/.doctrees/howto.doctree new file mode 100644 index 0000000..f2ba0fb Binary files /dev/null and b/.doctrees/howto.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000..a5fc7d1 Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/nbsphinx/notebooks/analysis_committor.ipynb b/.doctrees/nbsphinx/notebooks/analysis_committor.ipynb new file mode 100644 index 0000000..657a908 --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/analysis_committor.ipynb @@ -0,0 +1,33 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analysis of obtained models\n", + "\n", + "\n", + "Once we have obtained a model, we can extract useful quantities" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.doctrees/nbsphinx/notebooks/estimation.ipynb b/.doctrees/nbsphinx/notebooks/estimation.ipynb new file mode 100644 index 0000000..f56842a --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/estimation.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "# Estimation of overdamped model\n", + "First download the data and load the trajectories. Don't forget to adapt the location of the file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "819a042b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "\n", + "data = fl.Trajectories(dt=1.0e-3)\n", + "n=1 # Let's use the first molecule.\n", + "trj = np.loadtxt(f\"DATA\")\n", + "data.append(trj.reshape(-1,1))\n", + "print(data) #Let's check what we have" + ] + }, + { + "cell_type": "markdown", + "id": "95cee9f0", + "metadata": {}, + "source": [ + "Then define a model, here we are going to use the default 1D overdamped model. We can then fit the model. To start we use a simple KramersMoyal estimation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3b3661c5", + "metadata": {}, + "outputs": [], + "source": [ + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min , data.stats.max , 10).ravel())\n", + "model = fl.models.OverdampedSplines1D(domain=domain)\n", + "estimator = fl.KramersMoyalEstimator(model)\n", + "model = estimator.fit_fetch(data)" + ] + }, + { + "cell_type": "markdown", + "id": "57265806", + "metadata": {}, + "source": [ + "We can then plot the force and diffusion profile" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d32093da", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "xfa = np.linspace(np.min(trj),np.max(trj),75)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Force plot\n", + "ax.set_title(\"Force\")\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$F(x)$\")\n", + "ax.grid()\n", + "ax.plot(xfa, model.force(xfa.reshape(-1, 1)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7c552423", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"Diffusion\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$D(x)$\")\n", + "ax.plot(xfa, model.diffusion(xfa.reshape(-1, 1)))" + ] + }, + { + "cell_type": "markdown", + "id": "550cf6a2", + "metadata": {}, + "source": [ + "But also obtain the free energy profile. The free energy profile $V(x)$ is related to the force $F(x)$ and the diffusion $D(x)$ from\n", + "\n", + "$$ F(x) = -D(x) \\nabla V(x) + \\mathrm{div} D(x)$$\n", + "\n", + "The relation can then be inverted to obtain the free energy profile." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "568edcc2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pmf=fl.analysis.free_energy_profile_1d(model, xfa)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"PMF\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$\\\\beta U(x)$\")\n", + "ax.plot(xfa, pmf)" + ] + }, + { + "cell_type": "markdown", + "id": "ce0d9688-9d66-4231-92ee-1c4c053e13ec", + "metadata": {}, + "source": [ + "Since there is two well, we can also compute the mean first passage time to go from point x to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9944b6d8-5317-4ff2-a436-983d7bccffa7", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'fl' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m x_mfpt, mfpt \u001b[38;5;241m=\u001b[39m \u001b[43mfl\u001b[49m\u001b[38;5;241m.\u001b[39manalysis\u001b[38;5;241m.\u001b[39mmfpt_1d(model_simu, \u001b[38;5;241m0\u001b[39m, [\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m20.0\u001b[39m, \u001b[38;5;241m50.0\u001b[39m], Npoints\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m500\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'fl' is not defined" + ] + } + ], + "source": [ + "x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, 0, [-20.0, 50.0], Npoints=500)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# MFPT plot\n", + "ax.set_title(\"MFPT from x to 0\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$MFPT(x,0)$\")\n", + "ax.plot(x_mfpt, mfpt)" + ] + }, + { + "cell_type": "markdown", + "id": "24ed7493", + "metadata": {}, + "source": [ + "## Parallel execution\n", + "\n", + "\n", + "See https://scikit-learn.org/stable/computing/parallelism.html for an overview of available options.\n", + "\n", + "Likelihood estimator are parallelized using n_jobs= with computation of likelihood being parallelized over trajectories." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/simulations.ipynb b/.doctrees/nbsphinx/notebooks/simulations.ipynb new file mode 100644 index 0000000..efe4e97 --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/simulations.ipynb @@ -0,0 +1,153 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "# Models simulations\n", + "folie has some simulations capabilities. However, due to python performance, they are mostly orinented towards short validations runs and examples runs.\n", + "\n", + "For more efficient and longuer simulations, please turn to LangevinIntegrators.jl or StochasticDiffEq.jl. In the future we are also planning to write more efficient simulators within folie frameworks.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3af8aef8", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "a9bb72df", + "metadata": {}, + "source": [ + "Let's first define some models and instanciate the simulation. This require the definition of a stepper, i.e. the choice of a transition probability. We choose here to use the EulerStepper." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "819a042b", + "metadata": {}, + "outputs": [], + "source": [ + "model_simu = fl.models.OrnsteinUhlenbeck(0.0, 1.2, 2.0)\n", + "stepper = fl.simulations.EulerStepper(model_simu)\n", + "simulator = fl.simulations.Simulator(stepper, dt=1e-3)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d0bbe9ac", + "metadata": {}, + "source": [ + "We can then obtain somes trajectories, with normally distributted starting points." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3a8d3da2", + "metadata": {}, + "outputs": [], + "source": [ + "data = simulator.run(5000,x0= np.random.randn(25))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c56e4519", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 1)\n", + "for n, trj in enumerate(data):\n", + " axs.plot(trj[\"x\"])" + ] + }, + { + "cell_type": "markdown", + "id": "ff628e0d", + "metadata": {}, + "source": [ + "There is also the possibility to run biased simulations for tests. Let's run adiabatic biased modelcular dynamics (ABMD) simulations. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "af101ce9", + "metadata": {}, + "outputs": [], + "source": [ + "simulator = fl.simulations.ABMD_Simulator(stepper, 1e-3, k=10.0, xstop=6.0)\n", + "data_biased = simulator.run(5000, np.zeros((25,)), 25)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "21ecfc70", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xmax = np.concatenate(simulator.xmax_hist, axis=1).T\n", + "fig, axs = plt.subplots(1, 2)\n", + "for n, trj in enumerate(data_biased):\n", + " axs[0].plot(trj[\"x\"])\n", + " axs[1].plot(xmax[:, n])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedOU.ipynb b/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedOU.ipynb new file mode 100644 index 0000000..c48276f --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedOU.ipynb @@ -0,0 +1,129 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "718db51f", + "metadata": {}, + "source": [ + "# Overdamped" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9e03f944-d2c1-48ba-88ec-494c9e7c40ea", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "82c19e11-896e-48de-ae8d-4c614545b4e8", + "metadata": {}, + "source": [ + "Let's first simulate some trajectories with various timestep" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8bf9d6de-29f8-4bc7-8b0c-92f68b262b7d", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "could not broadcast input array from shape (25,25) into shape (25,1)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m dt \u001b[38;5;129;01min\u001b[39;00m list_dts:\n\u001b[1;32m 6\u001b[0m simulator \u001b[38;5;241m=\u001b[39m fl\u001b[38;5;241m.\u001b[39mSimulator(fl\u001b[38;5;241m.\u001b[39mExactDensity(model_simu), dt)\n\u001b[0;32m----> 7\u001b[0m data_dts\u001b[38;5;241m.\u001b[39mappend(\u001b[43msimulator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m5000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m25\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m25\u001b[39;49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m~/Projets/folie/folie/simulations/__init__.py:34\u001b[0m, in \u001b[0;36mSimulator.run\u001b[0;34m(self, nsteps, x0, ntrajs, save_every, **kwargs)\u001b[0m\n\u001b[1;32m 32\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransition\u001b[38;5;241m.\u001b[39mrun_step(x, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdt, dW[:, n])\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;241m%\u001b[39m save_every \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 34\u001b[0m \u001b[43mx_val\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msave_every\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m x\n\u001b[1;32m 35\u001b[0m data \u001b[38;5;241m=\u001b[39m Trajectories(dt\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdt \u001b[38;5;241m*\u001b[39m save_every)\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(ntrajs):\n", + "\u001b[0;31mValueError\u001b[0m: could not broadcast input array from shape (25,25) into shape (25,1)" + ] + } + ], + "source": [ + "model_simu = fl.models.OrnsteinUhlenbeck()\n", + "model_simu.coefficients = np.array([0.1, 1.2, 2.0])\n", + "data_dts = []\n", + "list_dts = [1e-3, 5e-3, 1e-2, 5e-2]\n", + "for dt in list_dts:\n", + " simulator = fl.Simulator(fl.simulations.ExactStepper(model_simu), dt)\n", + " data_dts.append(simulator.run(5000, np.zeros((25,)), 25))" + ] + }, + { + "cell_type": "markdown", + "id": "fc477114-844e-415c-88a4-f5a19c088057", + "metadata": {}, + "source": [ + "We can then run the estimation for various likelihood at all timesteps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7756920-1780-47f4-bef7-7296d8ea127f", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, len(model_simu.coefficients))\n", + "\n", + "for name, transitioncls in zip(\n", + " [\"Exact\", \"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n", + " [\n", + " fl.ExactDensity,\n", + " fl.EulerDensity,\n", + " fl.OzakiDensity,\n", + " fl.ShojiOzakiDensity,\n", + " fl.ElerianDensity,\n", + " fl.KesslerDensity,\n", + " fl.DrozdovDensity,\n", + " ],\n", + "):\n", + " model = fl.models.OrnsteinUhlenbeck()\n", + " estimator = fl.LikelihoodEstimator(transitioncls(model))\n", + " coeffs_vals = np.empty((len(data_dts), len(model.coefficients)))\n", + " for n, data in enumerate(data_dts):\n", + " res = estimator.fit_fetch(data)\n", + " coeffs_vals[n, :] = res.coefficients\n", + " for n in range(len(axs)):\n", + " axs[n].plot(list_dts, np.abs(coeffs_vals[:, n] - model_simu.coefficients[n]), \"-+\", label=name)\n", + " print(coeffs_vals)\n", + "for n in range(len(axs)):\n", + " axs[n].legend()\n", + " axs[n].set_yscale(\"log\")\n", + " axs[n].grid()\n", + " axs[n].set_xlabel(r\"$\\Delta t$\")\n", + " axs[n].set_ylabel(r\"$|c-c_{real}|$\")\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedhiddenOU.ipynb b/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedhiddenOU.ipynb new file mode 100644 index 0000000..a054725 --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/statistical_performances/overdampedhiddenOU.ipynb @@ -0,0 +1,111 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2199d582", + "metadata": {}, + "source": [ + "# Overdamped with hidden variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad5f8a73-e432-41db-bf0b-625ff80db5b6", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt\n" + ] + }, + { + "cell_type": "markdown", + "id": "0191d59f-9793-4efc-9fe7-fc53cd46f4d1", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1a4b8c2-948a-4bcd-b4b2-6208c1684260", + "metadata": {}, + "outputs": [], + "source": [ + "model_simu = model_simu = fl.models.OrnsteinUhlenbeck(dim=3)\n", + "data_dts = []\n", + "list_dts = [1e-3, 5e-3, 1e-2, 5e-2]\n", + "for dt in list_dts:\n", + " simulator = fl.Simulator(fl.simulations.ExactStepper(model_simu), dt, keep_dim=1)\n", + " data_dts.append(simulator.run(5000, np.random.normal(loc=0.0, scale=1.0, size=(25, 3)), 25))" + ] + }, + { + "cell_type": "markdown", + "id": "a1d5f7af-d2e2-4511-aea2-e61c32f0929b", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "473bb54a-7291-4019-9004-a6b260e9c599", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, len(model_simu.coefficients))\n", + "\n", + "for name, transitioncls in zip(\n", + " [\"Euler\"],\n", + " [\n", + " fl.EulerDensity,\n", + " ],\n", + "):\n", + " fun_lin = fl.functions.Linear().fit(data_dts[0])\n", + " fun_frct = fl.functions.Constant().fit(data_dts[0])\n", + " fun_cst = fl.functions.Constant().fit(data_dts[0])\n", + " model = fl.models.OverdampedHidden(fun_lin, fun_frct, fun_cst, dim=1, dim_h=2)\n", + " estimator = fl.EMEstimator(transitioncls(model), max_iter=15, verbose=2, verbose_interval=1)\n", + " coeffs_vals = np.empty((len(data_dts), len(model.coefficients)))\n", + " for n, data in enumerate(data_dts):\n", + " res = estimator.fit_fetch(\n", + " data[\n", + " :,\n", + " ]\n", + " )\n", + " coeffs_vals[n, :] = res.coefficients\n", + " for n in range(len(axs)):\n", + " axs[n].plot(list_dts, np.abs(coeffs_vals[:, n] - model_simu.coefficients[n]), \"-+\", label=name)\n", + "for n in range(len(axs)):\n", + " axs[n].legend()\n", + " axs[n].set_yscale(\"log\")\n", + " axs[n].grid()\n", + " axs[n].set_xlabel(\"$\\\\Delta t\")\n", + " axs[n].set_ylabel(\"$|c-c_{real}|$\")\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/tutorials/1D_DoubleWell_estimation.ipynb b/.doctrees/nbsphinx/notebooks/tutorials/1D_DoubleWell_estimation.ipynb new file mode 100644 index 0000000..9614acf --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/tutorials/1D_DoubleWell_estimation.ipynb @@ -0,0 +1,605 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1D Double Well estimation \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import folie as fl\n", + "import csv\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from copy import deepcopy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1D UNBIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) The model \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function $V(q)= \\sum_{i=0}^4 c_iq^i$ and choose a constant diffusion coefficient $D(q)=q$ :\n", + "\n", + "The force parameter to pass to the simulator will then be : $F = - \\frac{dV(q)}{dq}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "coeff=0.1*np.array([0,0,-4.5,0,0.1]) # coefficients of the free energy\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]]) #coefficients of the free energy\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-7, 7, 100)\n", + "fig, axs = plt.subplots(1, 2)\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ntraj=30\n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=0\n", + "# Calculate Trajectory\n", + "time_steps=10000\n", + "data = simulator.run(time_steps, q0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the trajecories\n", + "fig, axs = plt.subplots(1,1)\n", + "for n, trj in enumerate(data):\n", + " axs.plot(trj[\"x\"])\n", + " axs.set_title(\"Trajectory\")\n", + " axs.set_xlabel(\"$timestep$\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Model Training " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Training using same functional form of true force and diffusion " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodel=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(data)\n", + "Eul_res=Eul_estimator.fit_fetch(data)\n", + "Eln_res=Eln_estimator.fit_fetch(data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data)\n", + "Drz_res=Drz_estimator.fit_fetch(data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Training using splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min , data.stats.max , n_knots).ravel())\n", + "trainmodel = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=Eul_estimator.fit_fetch(data)\n", + "Eul_res=Eul_estimator.fit_fetch(data)\n", + "Eln_res=Eln_estimator.fit_fetch(data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data)\n", + "Drz_res=Drz_estimator.fit_fetch(data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of OVerdamped( spline, constant)\n", + "fig, axs = plt.subplots(1, 2, figsize=(10, 6))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "#Plot inferred quantities \n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the methods are returning all the the same results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1D BIASED Double Well Potential\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function $V(q)= \\sum_{i=0}^4 c_iq^i$ and choose a constant diffusion coefficient $D(q)=D$ : $\\newline$\n", + "The force parameter to pass to the simulator will then be : $F = - \\frac{dV(q)}{dq}$ $\\newline$\n", + "Adiabaic bias used : $V_{bias}(q)=\\frac{1}{2}k(q-q_0)^2 \\longmapsto$ ABMD_Simulator $\\newline$\n", + "The center of the parabola, $q_0$, is choosen as : $max(q,q_0)$ at every iteration " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coeff=0.1*np.array([0,0,-4.5,0,0.1]) # coefficients of the free energy\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]]) #coefficients of the free energy\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-7, 7, 100)\n", + "fig, axs = plt.subplots(1, 2)\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "biased_model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "biased_simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(biased_model_simu), dt, k=10.0, xstop=6.0) \n", + "ntraj=30\n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=-6.0\n", + "# Calculate Trajectory\n", + "time_steps=35000\n", + "biased_data = biased_simulator.run(time_steps, q0, 1)\n", + "xmax = np.concatenate(biased_simulator.xmax_hist, axis=1).T # if you rerun simulator.run without reinializing the simulator object it will probably append the results making xmax twice as long " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the trajecories\n", + "fig, axs = plt.subplots(1,2,figsize=(10,6))\n", + "for n, trj in enumerate(biased_data):\n", + " axs[0].plot(trj[\"x\"])\n", + " axs[0].set_title(\"Trajectory\")\n", + " axs[0].set_xlabel(\"$timestep$\")\n", + " axs[0].set_ylabel(\"q(t)\")\n", + " axs[1].plot(xmax)\n", + " axs[1].set_title(\"q_0\")\n", + " axs[1].set_xlabel(\"$timesteps$\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Model Training " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Training using same functional form of true force and diffusion " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodel=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(biased_data)\n", + "Eul_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eln_res=Eln_estimator.fit_fetch(biased_data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(biased_data)\n", + "Drz_res=Drz_estimator.fit_fetch(biased_data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "biased_model_simu.remove_bias()\n", + "axs[0].plot(xfa, biased_model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, biased_model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Training using splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(biased_data.stats.min , biased_data.stats.max , n_knots).ravel())\n", + "trainmodel = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eul_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eln_res=Eln_estimator.fit_fetch(biased_data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(biased_data)\n", + "Drz_res=Drz_estimator.fit_fetch(biased_data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of OVerdamped( spline, constant)\n", + "fig, axs = plt.subplots(1, 2, figsize=(10, 6))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "biased_model_simu.remove_bias()\n", + "axs[0].plot(xfa, biased_model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, biased_model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "#Plot inferred quantities \n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "with zip\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axb = plt.subplots(1, 2, figsize=(10, 6))\n", + "\n", + "n_knots= 4\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(biased_data.stats.min , biased_data.stats.max , n_knots).ravel())\n", + "bias_spline_trainmodel = fl.models.Overdamped(fl.functions.BSplinesFunction(domain), fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=True)\n", + "\n", + "name = \"KM\"\n", + "estimator = fl.KramersMoyalEstimator(deepcopy(bias_spline_trainmodel))\n", + "res = estimator.fit_fetch(biased_data)\n", + "print('has bias True',name,res.coefficients)\n", + "axb[0].plot(xfa, res.force(xfa.reshape(-1, 1)), label=name)\n", + "axb[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), label=name)\n", + "\n", + "\n", + "for name, marker, transitioncls in zip(\n", + " [\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n", + " [\"+\",\"1\",\"2\",\"3\",\"|\",\"x\"],\n", + " [\n", + " fl.EulerDensity,\n", + " fl.ElerianDensity,\n", + " fl.KesslerDensity,\n", + " fl.DrozdovDensity,\n", + " ],\n", + "):\n", + " estimator = fl.LikelihoodEstimator(transitioncls(deepcopy(bias_spline_trainmodel)), n_jobs=4)\n", + " res = estimator.fit_fetch(biased_data)\n", + "\n", + " axb[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker, label=name)\n", + " axb[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker, label=name)\n", + " print('has bias true',name,res.coefficients)\n", + "\n", + "axb[0].legend()\n", + "axb[1].legend()\n", + "plt.show() " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "folie", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.doctrees/nbsphinx/notebooks/tutorials/2D_DoubleWell_estimation.ipynb b/.doctrees/nbsphinx/notebooks/tutorials/2D_DoubleWell_estimation.ipynb new file mode 100644 index 0000000..fdfedab --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/tutorials/2D_DoubleWell_estimation.ipynb @@ -0,0 +1,1155 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D Double Well estimation " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import folie as fl\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from copy import deepcopy\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D UNBIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) The Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function along x and a parabola along y $V(x,y)= a(x^2-1)^2 + \\frac{1}{2}by^2$\n", + "and constant diffusion matrix $D= d\\begin{bmatrix} 1 \\ \\ 0 \\\\\\ 0 \\ \\ 1 \\end{bmatrix}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(-1.8,1.8,36)\n", + "y = np.linspace(-1.8,1.8,36)\n", + "input=np.transpose(np.array([x,y]))\n", + "\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]) * np.eye(2,2))\n", + "a,b = 5.0, 10.0\n", + "quartic2d= fl.functions.Quartic2D(a=a,b=b)\n", + "X,Y =np.meshgrid(x,y)\n", + "\n", + "# Plot potential surface \n", + "pot = quartic2d.potential_plot(X,Y)\n", + "fig = plt.figure()\n", + "ax = plt.axes(projection='3d')\n", + "ax.plot_surface(X,Y,pot, rstride=1, cstride=1,cmap='jet', edgecolor = 'none')\n", + "\n", + "# Plot Force function\n", + "ff=quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\n", + "U,V = np.meshgrid(ff[:,0],ff[:,1])\n", + "fig, ax =plt.subplots()\n", + "ax.quiver(x,y,U,V)\n", + "ax.set_title('Force')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dt = 1e-3\n", + "model_simu=fl.models.overdamped.Overdamped(force=quartic2d,diffusion=diff_function)\n", + "simulator=fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize positions \n", + "ntraj=30\n", + "q0= np.empty(shape=[ntraj,2])\n", + "for i in range(ntraj):\n", + " for j in range(2):\n", + " q0[i][j]=0.0000\n", + "time_steps=10000\n", + "data_2d_unbias = simulator.run(time_steps, q0,save_every=1) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the resulting trajectories\n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " axs.plot(trj[\"x\"][:,0],trj[\"x\"][:,1])\n", + " axs.spines['left'].set_position('center')\n", + " axs.spines['right'].set_color('none')\n", + " axs.spines['bottom'].set_position('center')\n", + " axs.spines['top'].set_color('none')\n", + " axs.xaxis.set_ticks_position('bottom')\n", + " axs.yaxis.set_ticks_position('left')\n", + " axs.set_xlabel(\"$X(t)$\")\n", + " axs.set_ylabel(\"$Y(t)$\")\n", + " axs.set_title(\"X-Y Trajectory\")\n", + " axs.grid()\n", + "\n", + "# plot x,y Trajectories in separate subplots\n", + "fig,bb = plt.subplots(1,2)\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " bb[0].plot(trj[\"x\"][:,0])\n", + " bb[1].plot(trj[\"x\"][:,1])\n", + "\n", + "# Set visible axis\n", + " bb[0].spines['right'].set_color('none')\n", + " bb[0].spines['bottom'].set_position('center')\n", + " bb[0].spines['top'].set_color('none')\n", + " bb[0].xaxis.set_ticks_position('bottom')\n", + " bb[0].yaxis.set_ticks_position('left')\n", + " bb[0].set_xlabel(\"$timestep$\")\n", + " bb[0].set_ylabel(\"$X(t)$\")\n", + "\n", + "# Set visible axis\n", + " bb[1].spines['right'].set_color('none')\n", + " bb[1].spines['bottom'].set_position('center')\n", + " bb[1].spines['top'].set_color('none')\n", + " bb[1].xaxis.set_ticks_position('bottom')\n", + " bb[1].yaxis.set_ticks_position('left')\n", + " bb[1].set_xlabel(\"$timestep$\")\n", + " bb[1].set_ylabel(\"$Y(t)$\")\n", + "\n", + " bb[0].set_title(\"X Dynamics\")\n", + " bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.1) 1D Simulation with same coefficients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coeff=a*np.array([1,0,-2,0,1])\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]])\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))\n", + "\n", + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-1.5, 1.5, 100)\n", + "fig, axs = plt.subplots(1, 2, figsize=(14,6))\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()\n", + "\n", + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) \n", + "\n", + "# initialize positions \n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=0.000\n", + "# Calculate Trajectory, n_traj and timesteps is the same as that of the 2D simulation\n", + "data_1D_unbias = simulator.run(time_steps, q0, 1)\n", + "\n", + "fig, axs = plt.subplots(figsize=(14,8))\n", + "for n, trj in enumerate(data_1D_unbias):\n", + " axs.plot(trj[\"x\"])\n", + " axs.set_title(\"Trajectory\")\n", + " # axs[1].plot(xmax[:, n])\n", + " axs.set_xlabel(\"$timestep$\")\n", + " axs.set_ylabel(\"$x(t)$\")\n", + " axs.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Fitting " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Projecting onto the x Coordinate and comparison with 1D simulation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xdata = fl.data.trajectories.Trajectories(dt=dt) \n", + "for n, trj in enumerate(data_2d_unbias):\n", + " xdata.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,0].reshape(len(trj[\"x\"][:,0]),1)))\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "xforce = -4*a*(xfa** 3 - xfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.1) Fitting with exact model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "fitting of the 1D data \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = trainforce,diffusion=traindiff, has_bias=False)\n", + "\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs =4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs =4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs =4) # made by the previous estimator. So in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs =4)\n", + "\n", + "\n", + "Eul_res=Eul_estimator.fit_fetch(data_1D_unbias)\n", + "Eln_res=Eln_estimator.fit_fetch(data_1D_unbias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data_1D_unbias)\n", + "Drz_res=Drz_estimator.fit_fetch(data_1D_unbias)\n", + "res_vec = [Eul_res,Eln_res,Ksl_res,Drz_res] # makes a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig,ax = plt.subplots(1,2,figsize=(14,8))\n", + "ax[0].plot(xfa, xforce,label='Exact')\n", + "ax[1].plot(xfa,0.5*np.ones(xfa.shape), label = 'Exact')\n", + "\n", + "for name, res in zip(\n", + " [\"Euler\", \"Elerian\",\"Kessler\", \"Drozdov\"], res_vec,\n", + "):\n", + " ax[0].plot(xfa, res.force(xfa.reshape(-1, 1)), label=name)\n", + " ax[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), label=name)\n", + " print(name, res.coefficients)\n", + "ax[0].set_title('Force function')\n", + "ax[1].set_title('Diffusion coefficient')\n", + "ax[0].legend()\n", + "ax[1].legend()\n", + "fig.suptitle('Order 3 Polynomial fitting of 1D data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.2) Fitting with B-splines" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fitting with 4-knots B-splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(xdata.stats.min,xdata.stats.max , n_knots).ravel())\n", + "splines_trainmodelx = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain), diffusion= fl.functions.BSplinesFunction(domain), has_bias = None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "fitting of the 1D data with Bsplines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(data_1D_unbias.stats.min,data_1D_unbias.stats.max , n_knots).ravel())\n", + "splines_trainmodelx_1d = fl.models.OverdampedSplines1D(domain=domain)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx_1d), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(data_1D_unbias)\n", + "Eul_res=Eul_estimator.fit_fetch(data_1D_unbias)\n", + "Eln_res=Eln_estimator.fit_fetch(data_1D_unbias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data_1D_unbias)\n", + "Drz_res=Drz_estimator.fit_fetch(data_1D_unbias)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "fig.suptitle('1D data B-spline Fitting with '+str(n_knots)+ ' knots')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Projection onto y coordinate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ydata = fl.data.trajectories.Trajectories(dt=dt) \n", + "for n, trj in enumerate(data_2d_unbias):\n", + " ydata.append(fl.data.trajectories.Trajectory(dt,trj[\"x\"][:,1].reshape(len(trj[\"x\"][:,1]),1)))\n", + "yfa = np.linspace(-1.3, 1.3, 75)\n", + "yforce= -b*yfa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.2.1) Fitting with exact Ornstein–Uhlenbeck model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Parameters of the training\n", + "\n", + "trainmodely=fl.models.overdamped.OrnsteinUhlenbeck(has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodely), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(ydata))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(ydata))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(ydata))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(ydata))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(ydata))\n", + "res_vecy = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, yforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecy[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecy[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecy[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3) Projecting onto $1^{st}$ and $3^{rd}$ quadrant bisectrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = np.pi/4\n", + "u = np.array([np.cos(theta),np.sin(theta)])\n", + "u_norm = (1/np.linalg.norm(u,2))*u\n", + "qdata = fl.data.trajectories.Trajectories(dt=dt) \n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " proj_traj = (1/np.linalg.norm(u,2))*(trj[\"x\"][:,0]+trj[\"x\"][:,1]).reshape(len(trj[\"x\"][:,0]),1)\n", + " qdata.append(fl.data.trajectories.Trajectory(dt, proj_traj ))\n", + " axs.plot(qdata[n][\"x\"])\n", + " axs.set_xlabel('timestep')\n", + " axs.set_ylabel('q')\n", + " axs.set_title('Dynamics along u'+str(u_norm)+'direction')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.3.1) Fitting with splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "qfa = np.linspace(qdata.stats.min , qdata.stats.max,75)\n", + "n_knots= 4\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(qdata.stats.min , qdata.stats.max , n_knots).ravel())\n", + "trainmodelq = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion =fl.functions.BSplinesFunction(domain), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelq), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelq)), n_jobs=4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelq)), n_jobs=4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelq)), n_jobs=4) # made by the previuos estimator and so in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelq)), n_jobs=4) # which is the reason why the loop checking if the values are different in the following cell exists\n", + "\n", + "KM_res=KM_estimator.fit_fetch(qdata)\n", + "Eul_res=Eul_estimator.fit_fetch(qdata)\n", + "Eln_res=Eln_estimator.fit_fetch(qdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(qdata)\n", + "Drz_res=Drz_estimator.fit_fetch(qdata)\n", + "\n", + "res_vecq = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vecq[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecq[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecq[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D BIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) Model " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function along x and a parabola along y $V(x,y)= a(x^2-1)^2 + \\frac{1}{2}by^2$\n", + "and constant diffusion matrix $D= d\\begin{bmatrix} 1 \\ \\ 0 \\\\\\ 0 \\ \\ 1 \\end{bmatrix} $ \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(-1.8,1.8,36)\n", + "y = np.linspace(-1.8,1.8,36)\n", + "input=np.transpose(np.array([x,y]))\n", + "\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]) * np.eye(2,2))\n", + "a,b = 0.5, 1.0\n", + "\n", + "quartic2d = fl.functions.Quartic2D(a=a, b=b)\n", + "X, Y = np.meshgrid(x, y)\n", + "\n", + "# Plot potential surface\n", + "pot = quartic2d.potential_plot(X, Y)\n", + "fig = plt.figure()\n", + "ax = plt.axes(projection=\"3d\")\n", + "ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap=\"jet\", edgecolor=\"none\")\n", + "\n", + "# Plot Force function\n", + "ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\n", + "U, V = np.meshgrid(ff[:, 0], ff[:, 1])\n", + "fig, ax = plt.subplots()\n", + "ax.quiver(x, y, U, V)\n", + "ax.set_title(\"Force\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On top of that we apply a linear bias along the chosen collective variable $q(x,y)= x+y$ feeding to the biased 1DColval simulator class the collective variable as a function and its gradient as an explicit array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to bias with ABMD along a selected collective variable $\\textit{colvar} : \\: q(x,y)$ user must provide both the function of original variables and its gradient " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def colvar (x,y):\n", + " gradient = np.array([1,1])\n", + " return x + y , gradient\n", + "dt = 1e-3\n", + "model_simu=fl.models.overdamped.Overdamped(force=quartic2d,diffusion=diff_function)\n", + "simulator=fl.simulations.ABMD_2D_to_1DColvar_Simulator(fl.simulations.EulerStepper(model_simu), dt,colvar=colvar,k=10.0,qstop=1.5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize positions \n", + "ntraj=30\n", + "q0= np.empty(shape=[ntraj,2])\n", + "for i in range(ntraj):\n", + " for j in range(2):\n", + " q0[i][j]=-1.2\n", + "time_steps=5000\n", + "data_2d_bias = simulator.run(time_steps, q0,save_every=1) \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the resulting trajectories\n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_bias):\n", + " axs.plot(trj[\"x\"][:,0],trj[\"x\"][:,1])\n", + " axs.spines['left'].set_position('center')\n", + " axs.spines['right'].set_color('none')\n", + " axs.spines['bottom'].set_position('center')\n", + " axs.spines['top'].set_color('none')\n", + " axs.xaxis.set_ticks_position('bottom')\n", + " axs.yaxis.set_ticks_position('left')\n", + " axs.set_xlabel(\"$X(t)$\")\n", + " axs.set_ylabel(\"$Y(t)$\")\n", + " axs.set_title(\"X-Y Trajectory\")\n", + " axs.grid()\n", + "\n", + "# plot x,y Trajectories in separate subplots\n", + "fig,bb = plt.subplots(1,2)\n", + "for n, trj in enumerate(data_2d_bias):\n", + " bb[0].plot(trj[\"x\"][:,0])\n", + " bb[1].plot(trj[\"x\"][:,1])\n", + "\n", + "\n", + "# Set visible axis\n", + " bb[0].spines['right'].set_color('none')\n", + " bb[0].spines['bottom'].set_position('center')\n", + " bb[0].spines['top'].set_color('none')\n", + " bb[0].xaxis.set_ticks_position('bottom')\n", + " bb[0].yaxis.set_ticks_position('left')\n", + " bb[0].set_xlabel(\"$timestep$\")\n", + " bb[0].set_ylabel(\"$X(t)$\")\n", + "\n", + "# Set visible axis\n", + " bb[1].spines['right'].set_color('none')\n", + " bb[1].spines['bottom'].set_position('center')\n", + " bb[1].spines['top'].set_color('none')\n", + " bb[1].xaxis.set_ticks_position('bottom')\n", + " bb[1].yaxis.set_ticks_position('left')\n", + " bb[1].set_xlabel(\"$timestep$\")\n", + " bb[1].set_ylabel(\"$Y(t)$\")\n", + "\n", + " bb[0].set_title(\"X Dynamics\")\n", + " bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Fitting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Projecting onto the x Coordinate \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xdata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "\n", + "for n, trj in enumerate(data_2d_bias):\n", + " xdata_bias.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,0].reshape(len(trj[\"x\"][:,0]),1), bias=trj[\"bias\"][:,:1].reshape(len(trj[\"bias\"][:,1]),1)))\n", + "\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "xforce = -4*a*(xfa** 3 - xfa)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.1) Fitting with exact model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.2) Fitting with splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(xdata_bias.stats.min, xdata_bias.stats.max , n_knots).ravel())\n", + "splines_trainmodelx = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain), diffusion= fl.functions.BSplinesFunction(domain), has_bias = True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata_bias)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata_bias)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata_bias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata_bias)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata_bias)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Projecting along y coordinate " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ydata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "\n", + "for n, trj in enumerate(data_2d_bias):\n", + " ydata_bias.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,1].reshape(len(trj[\"x\"][:,1]),1), bias=trj[\"bias\"][:,1].reshape(len(trj[\"bias\"][:,1]),1)))\n", + "\n", + "yfa = np.linspace(-1.3, 1.3, 75)\n", + "yforce = -b*yfa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Parameters of the training\n", + "\n", + "trainmodely=fl.models.overdamped.OrnsteinUhlenbeck(has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodely), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "\n", + "res_vecy = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, yforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecy[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecy[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecy[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3) Projecting along biased coordinate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = np.pi/4\n", + "u = np.array([np.cos(theta),np.sin(theta)])\n", + "u_norm = (1/np.linalg.norm(u,2))*u\n", + "qdata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_bias):\n", + " proj_bias=(trj[\"bias\"][:,0]+trj[\"bias\"][:,1]).reshape(len(trj[\"bias\"][:,0]),1)\n", + " proj_traj = (1/np.linalg.norm(u,2))*(trj[\"x\"][:,0]+trj[\"x\"][:,1]).reshape(len(trj[\"x\"][:,0]),1)\n", + " qdata_bias.append(fl.data.trajectories.Trajectory(dt, proj_traj, bias = proj_bias))\n", + " axs.plot(qdata_bias[n][\"x\"])\n", + " axs.set_xlabel('timestep')\n", + " axs.set_ylabel('q')\n", + " axs.set_title('Dynamics along u'+str(u_norm)+'direction')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "qfa = np.linspace(qdata_bias.stats.min , qdata_bias.stats.max,75)\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(qdata_bias.stats.min , qdata_bias.stats.max , n_knots).ravel())\n", + "trainmodelq = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain),has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelq), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelq)), n_jobs=4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelq)), n_jobs=4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelq)), n_jobs=4) # made by the previuos estimator and so in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelq)), n_jobs=4) # which is the reason why the loop checking if the values are different in the following cell exists\n", + "\n", + "KM_res=KM_estimator.fit_fetch(qdata_bias)\n", + "Eul_res=Eul_estimator.fit_fetch(qdata_bias)\n", + "Eln_res=Eln_estimator.fit_fetch(qdata_bias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(qdata_bias)\n", + "Drz_res=Drz_estimator.fit_fetch(qdata_bias)\n", + "\n", + "res_vecq = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecq[i].force(qfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecq[i].diffusion(qfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecq[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "folie", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.doctrees/nbsphinx/notebooks/tutorials/DNAhairpin.ipynb b/.doctrees/nbsphinx/notebooks/tutorials/DNAhairpin.ipynb new file mode 100644 index 0000000..3dec521 --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/tutorials/DNAhairpin.ipynb @@ -0,0 +1,271 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ba1ffbb6", + "metadata": {}, + "source": [ + "# DNA Hairpin\n", + "\n", + "In this tutorial we are going to infer Langevin model on experimental data of DNA hairpin.\n", + "The data are from the following article:\n", + "Quantifying the Properties of Nonproductive Attempts at Thermally Activated Energy-Barrier Crossing through Direct Observation, Aaron Lyons, Anita Devi, Noel Q. Hoffer, and Michael T. Woodside. Phys. Rev. X 14, 011017.\n", + "The trajectories are available at https://doi.org/10.6084/m9.figshare.24794955." + ] + }, + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "First download the data and load the trajectories. Don't forget to adapt the location of the file" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "819a042b", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule 1/HP_CF_Mol1_SampleTrajectory.txt not found.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_11040/347796182.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrajectories\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.0e-3\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Sampling frequency was 1MHz from the article, using then ms time unit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;31m# Let's use the first molecule.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mtrj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloadtxt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule {n}/HP_CF_Mol{n}_SampleTrajectory.txt\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#Let's check what we have\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mloadtxt\u001b[0;34m(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding, max_rows, quotechar, like)\u001b[0m\n\u001b[1;32m 1371\u001b[0m \u001b[0mdelimiter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'latin1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1372\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1373\u001b[0;31m arr = _read(fname, dtype=dtype, comment=comment, delimiter=delimiter,\n\u001b[0m\u001b[1;32m 1374\u001b[0m \u001b[0mconverters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mconverters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskiplines\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mskiprows\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0musecols\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1375\u001b[0m \u001b[0munpack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0munpack\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mndmin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mndmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(fname, delimiter, comment, quote, imaginary_unit, usecols, skiplines, max_rows, converters, ndmin, unpack, dtype, encoding)\u001b[0m\n\u001b[1;32m 990\u001b[0m \u001b[0mfname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 991\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 992\u001b[0;31m \u001b[0mfh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_datasource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 993\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 994\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'encoding'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'latin1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataSource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdestpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 193\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnewline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 194\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 195\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m 531\u001b[0m encoding=encoding, newline=newline)\n\u001b[1;32m 532\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 533\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mFileNotFoundError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{path} not found.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 534\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 535\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: ../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule 1/HP_CF_Mol1_SampleTrajectory.txt not found." + ] + } + ], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "\n", + "data = fl.Trajectories(dt=1.0e-3) # Sampling frequency was 1MHz from the article, using then ms time unit\n", + "n=1 # Let's use the first molecule.\n", + "trj = np.loadtxt(f\"../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule {n}/HP_CF_Mol{n}_SampleTrajectory.txt\")\n", + "data.append(trj.reshape(-1,1))\n", + "print(data) #Let's check what we have" + ] + }, + { + "cell_type": "markdown", + "id": "95cee9f0", + "metadata": {}, + "source": [ + "Then define a model, here we are going to use the default 1D overdamped model. We can then fit the model. To start we use a simple KramersMoyal estimation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3b3661c5", + "metadata": {}, + "outputs": [], + "source": [ + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min, data.stats.max, 10).ravel())\n", + "model = fl.models.OverdampedSplines1D(domain)\n", + "estimator = fl.KramersMoyalEstimator(model)\n", + "model = estimator.fit_fetch(data)" + ] + }, + { + "cell_type": "markdown", + "id": "57265806", + "metadata": {}, + "source": [ + "We can then plot the force and diffusion profile" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d32093da", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "xfa = np.linspace(np.min(trj),np.max(trj),75)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Force plot\n", + "ax.set_title(\"Force\")\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$F(x)$\")\n", + "ax.grid()\n", + "ax.plot(xfa, model.force(xfa.reshape(-1, 1)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7c552423", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvh0lEQVR4nO3deXxV5bn3/8+VmQyEhECYEyDMCGiAIA4FcaK11lOpdUaPyNFaa+1pq62d7e956vGp1daqdapaB6yiFnFWQFRIkJkwk4QhEAhJSEJC5ly/P/ZOmoMJhJC91trJ9X699su991qs/b0h7ivrvte6b1FVjDHGGIAQtwMYY4zxDisKxhhjmllRMMYY08yKgjHGmGZWFIwxxjSzomCMMaaZFQVjjiMiT4jIL1u8vl1EDolIhYj0FpFzRGSn//UVp/E574nI3E4JbUwnEbtPwXQ3IrIbSAbqgQZgC/AC8KSqNh63bzhQDkxT1Q3+9z4BFqnqI07mNsYJdqZguqtvqmockAL8AbgHeKaV/ZKBKGBzi/dSjnttTJdhRcF0a6papqqLgO8Cc0VkvIg8JyK/F5GRwHb/rqUiskREcoBhwNv+7qNIEdktIhc2HVNEfiMiL/qfR4nIiyJSLCKlIvKliCT7ty0TkXn+5yEi8gsR2SMihSLygojE+7elioiKyFwR2SsiRSJyn3N/S6Y7saJgDKCqq4B84LwW7+0Axvlf9lLVC1R1OLAX35lGrKrWnOTQc4F4YDDQG7gNqGplv5v8j5n4ik4s8Ohx+5wLjAJmAb8SkTHtbZ8x7WVFwZh/OwAkdvIx6/AVgzRVbVDVNapa3sp+1wEPqWquqlYAPwOuFpGwFvv8VlWr/GMbG4CJnZzVGCsKxrQwECjp5GP+A/gAWCAiB0Tkf/yD18cbAOxp8XoPEIZvTKPJwRbPj+E7mzCmU1lRMAYQkSn4isLnHfjjlUB0i9f9mp6oap2q/lZVxwLTgcuAG1s5xgF8A9hNhuC7OupQB/IY02FWFEy3JiI9ReQyYAHwoqpu6sBh1uPr6gkXkcnAnBbHnykiZ4hIKL5LW+uAxlaO8Qpwt4gMFZFY4P8Ar6pqfQfyGNNhYSffxZgu6W0Rqcf3Bb0FeAh4ooPH+iW+L/UjwKfAy/x7bKKf/7iDgArgVXxdSsd7Fl8X0nJ8l8B+ANzZwTzGdJjdvGaMMaaZdR8ZY4xpZkXBGGNMMysKxhhjmllRMMYY0yyorz5KSkrS1NRUt2N0SGVlJTExMW7HOC3B3oZgzw/WBq8ItjasWbOmSFX7tLYtqItCamoqq1evdjtGhyxbtowZM2a4HeO0BHsbgj0/WBu8ItjaICJ72tpm3UfGGGOaWVEwxhjTzIqCMcaYZlYUjDHGNLOiYIwxppkVBWOMMc2sKBhjjGlmRcEYY4LMwx/vYMWuooAc24qCMcYEkdJjtTzyyU5W7zkSkONbUTDGmCCSmVuCKpw9vHdAjm9FwRhjgkhmbjE9wkOZOKhXQI5vRcEYY4LIypxiJqcmEBEWmK9vKwrGGBMkiitq2H7oKNOGBabrCKwoGGNM0MjMLQECN54AVhSMMSZorMwtIiYilDMGxgfsM6woGGNMkFiZU8yUoYmEhwbuq9uKgjHGBIHC8mpyDldydgDHE8ChoiAig0VkqYhsEZHNInJXK/tcJyIbRWSTiKwQkYlOZDPGmGCwMrcYCOx4Aji3HGc98N+qulZE4oA1IvKRqm5psU8e8DVVPSIis4EngQyH8hljjKdl5hYTFxXGuAGBG08Ah4qCqhYABf7nR0VkKzAQ2NJinxUt/kgmMMiJbMYYEwxW5hSTMTSR0BAJ6OeIqgb0A77ygSKpwHJgvKqWt7HPj4HRqjqvlW3zgfkAycnJ6QsWLAhg2sCpqKggNjbW7RinJdjbEOz5wdrgFYFuQ0l1Iz9aVsU1oyO4JDX8tI83c+bMNao6udWNqurYA4gF1gDfPsE+M4GtQO+THS89PV2D1dKlS92OcNqCvQ3Bnl/V2uAVgW7DwjX7NOWexZq9v7RTjges1ja+V50aU0BEwoGFwEuq+kYb+0wAngZmq2qxU9mMMcbLVuYU0ys6nDH9egb8s5y6+kiAZ4CtqvpQG/sMAd4AblDVHU7kMsaYYJCZ5xtPCAnweAI4d/XROcANwCYRWe9/7+fAEABVfQL4FdAbeMxXQ6jXtvq8jDGmm8g/cox9JVXccs5QRz7PqauPPgdOWOLUN6j8lYFlY4zpzrL88x1NC/D9CU3sjmZjjPGwzFzfeMLIvnGOfJ4VBWOM8bCsvBKmpjozngBWFIwxxrMOlFaxt+RYQNdPOJ4VBWOM8aisPN+V+RnDEh37TCsKxhjjUZk5JcT3cOb+hCZWFIwxxqOy8oqZ4uB4AlhRMMYYTzpYVs3u4mNMc7DrCKwoGGOMJzWNJzg5yAxWFIwxxpMyc0uIiwpjTH/nxhPAioIxxnhSVm4xU1MDv37C8awoGGOMxxSWV5NbVOnopahNrCgYY4zHZOb55jvKGOrseAJYUTDGGM/Jyi0mNjKMcQOcHU8AKwrGGOM5mbnFTE5NICzU+a9oKwrGGOMhh4/WkHO40vFLUZtYUTDGGA9Z5R9PmDrU+UFmsKJgjDGekpVXTHREKGcMjHfl860oGGOMh6zKKyE9JYFwF8YTwIqCMcZ4xpHKWrYdPEqGS11HYEXBGGM8Y9XupvEEdwaZwYqCMcZ4xqq8EiLDQpg42J3xBLCiYIwxnpGVV8yZQ3oRGRbqWgYrCsYY4wHl1XVsOVDuytQWLVlRMMYYD1iz+wiNiquDzGBFwRhjPCEzr5jwUOHMIQmu5rCiYIwxHpCVW8LEQb3oEeHeeAJYUTDGGNdV1tSTvb/MtaktWrKiYIwxLlu79wj1jUqGS5PgteRIURCRwSKyVES2iMhmEbmrlX1ERP4sIrtEZKOInOVENmOMcVtWbgmhIUJ6irvjCQBhDn1OPfDfqrpWROKANSLykapuabHPbGCE/5EBPO7/rzHGdGmr8koYP6AnsZFOfSW3zZEzBVUtUNW1/udHga3AwON2+xbwgvpkAr1EpL8T+Ywxxi3VdQ2s31fqia4jcO5MoZmIpAJnAlnHbRoI7GvxOt//XsFxf34+MB8gOTmZZcuWBSpqQFVUVARt9ibB3oZgzw/WBq84nTZsLW6gtqGR6Ir9LFt2qHODdYCjRUFEYoGFwA9Vtbwjx1DVJ4EnASZPnqwzZszovIAOWrZsGcGavUmwtyHY84O1wStOpw0bPt6JyA5uvuxrxEeHd26wDnDs6iMRCcdXEF5S1Tda2WU/MLjF60H+94wxpsvKyitmTL+enigI4NzVRwI8A2xV1Yfa2G0RcKP/KqRpQJmqFrSxrzHGBL3a+kbW7j1CxjD3709o4lT30TnADcAmEVnvf+/nwBAAVX0CeBf4OrALOAbc7FA2Y4xxxab9pVTXNbo+31FLjhQFVf0ckJPso8AdTuQxxhgvyMx1f1Gd49kdzcYY45KsvBJGJseSGBPhdpRmVhSMMcYF9Q2NrNld4on5jlqyomCMMS7YfKCcytoG1xfVOZ4VBWOMcUFWXjHg/qI6x7OiYIwxLliVV8LQpBj69oxyO8r/YkXBGGMc1tCorMor8dxZAlhRMMYYx207WE55db2nblprYkXBGGMctirPe/cnNLGiYIwxDsvKLWFQQg8G9urhdpSvsKJgjDEOUlVW7S7x3KWoTawoGGOMg3YVVlBSWevJQWawomCMMY7K9I8neHGQGawoGGOMo7Jyi+nXM4ohidFuR2mVFQVjjHGIqpKZW0LGsER8y8x4jxUFY4xxSG5RJUUVNUwb5s1BZrCiYIwxjsnyr5/g1UFmsKJgjDGOycwtpk9cJEOTYtyO0iYrCsYY4wBVJSuvmGnDent2PAG6aVGormvgzXX5+FYANcaYwNtTfIxD5TWe7jqCbloUFq0/wN2vbmDZ9sNuRzHGdBOZub71E6Z59P6EJt2yKPzHWQMZkhjNgx9sp7HRzhaMMYGXlVdCUmwEw/vEuh3lhLplUQgPDeHui0awpaCc97IPuh3HGNPF+e5PKCZjqLfHE6CbFgWAyycOZGRyLH/8aDv1DY1uxzHGdGH7SqooKKv27NQWLXXbohAaIvzoolHkHq7kjXX73Y5jjOnCMvOaxhO8e9Nak25bFAAuGZfMhEHxPPLxTmrqG9yOY4zpojJzi0mMiWBEX2+PJ0A3Lwoiwk8uGcX+0ioWrNrndhxjTBeVlVvC1FTvznfUUrcuCgDnpiWRMTSRvyzZxbHaerfjGGO6mH0lx9hfWuX5S1GbdPui0HS2UFRRw4uZe9yOY4zpYrKa10/w/ngCWFEAYHJqIueNSOJvn+ba2YIxplNl5hbTKzqcUclxbkdpF0eKgog8KyKFIpLdxvZ4EXlbRDaIyGYRudmJXC398MIRFFfW8lLmXqc/2hjTha3MKSZjaCIhId4fTwDnzhSeAy49wfY7gC2qOhGYAfxRRCIcyNUsPcV/trA8x84WjDGdomk84ewg6ToCh4qCqi4HSk60CxAnvqH5WP++jn8z3zVrBEUVdrZgjOkcK/3zHZ09PMnlJO0nTs0UKiKpwGJVHd/KtjhgETAaiAO+q6rvtHGc+cB8gOTk5PQFCxZ0as4Hv6xi39FGHvxaNJGhgTvdq6ioIDbW+9csn0iwtyHY84O1wSvaasOTG2vYVFTPn2dGe+py1JkzZ65R1cmtblRVRx5AKpDdxrY5wJ8AAdKAPKDnyY6Znp6unW1VXrGm3LNYn1qe0+nHbmnp0qUBPb4Tgr0NwZ5f1drgFa21obGxUaf9n4/1ey+ucT7QSQCrtY3vVa9cfXQz8IY/7y58RWG0G0GmpCZyTlpvnvg0l6pau8vZGNMxe4qPUVBWzbThwTOeAB0YUxCRGBEJ7eQce4FZ/uMnA6OA3E7+jHb74YUjKaqo4aUsu2/BGNMxzeMJQTTIDO0oCiISIiLXisg7IlIIbAMKRGSLiDwoImntOMYrwEpglIjki8gtInKbiNzm3+V+YLqIbAI+Ae5R1aKON+v0TElNZNqwRJ76LNfmRDLGdEjTeszD+3h3PebWhLVjn6XAx8DP8I0JNAKISCIwE3hARN5U1RfbOoCqXnOiD1DVA8DF7U7tgDsvGMF1T2fx+pp8rstIcTuOMSaIqCorc7y/HnNr2lMULlTVuuPfVNUSYCGwUETCOz2Zy6YP782kwb14fFkOV00eTHioV4ZfjDFel1tUSeHRmqDrOoJ2dB81FQQReUTaKHmtFY1gJyLceUEa+UeqWLT+gNtxjDFBZGVO0/0JXbAotHAUWCQiMQAicomIfBGYWN5wwei+jOnfk78u20WDreVsjGmnlbnF9OsZRWrvaLejnLJ2FwVV/QXwCrDMXwx+BNwbqGBeICJ8f2YauYcreS+7wO04xpggoKpk5RZz9vDgG0+AUygKIjILuBWoBJKAH6jqZ4EK5hWXju/H8D4xPLpkV9ONdsYY06ZdhRUUVdQG5XgCnFr30X3AL1V1Br47kF8VkQsCkspDQkOE781IY9vBo3yytdDtOMYYj/v3fEddvCio6gWq+rn/+SZgNvD7QAXzkssnDWBwYg/+uszOFowxJ7Yyp5iBvXowODH4xhOgfTevtXXFUQH/vgs5+DrOTkF4aAjzzx/Our2lZOaeaLJXY0x31tCorMwtZnqQniVA+84UlorInSIypOWb/vUOzhaR54G5AUnnId9JH0RSbCSPLdvldhRjjEdtOVBO6bE6zh0RPFNlH689ReFSoAF4RUQO+Ke3yAN2AtcAD6vqcwHM6AlR4aHccu5QPttZxKb8MrfjGGM86Isc3+w8wTqeAO27ea1aVR8DrsZXIC4BzlTVFFW9VVXXBTqkV1w/bQhxUWF2tmCMadUXu4oYmRxL37got6N0WHvGFFJFZC2QCbyBb0K8f4jIyECH85q4qHBuPDuF9zcfZFdhhdtxjDEeUlPfwJe7S5geRKustaY93UcPAH9T1YGqmgbEA28D74nIiICm86CbzxlKRGgIf/s0x+0oxhgPWbunlOq6Rs5N6/pFYaSq/q3pharWq+qTwO3ArwKWzKOSYiO5ZuoQ3ly3nwOlVW7HMcZ4xIqcIkJDhIxhiW5HOS3tKQqtXpivqh8CYzo3TnC49fxhADz1mWvrABljPObzXUVMGBRPXFRwTxrdnqLQz78oToaIHL8ydbe8k2tgrx58a9JAFqzaR0llrdtxjDEuq6pXNuaXcU6QjydA+4rCb4BJwP8Ae0Rkt4gsFpE/AP0CmM3TbvvaMKrqGnh+xW63oxhjXLatpIGGRmV6WvBeitrkpIvs+McPmonIIOAMYALwaYByed6I5DguGpvMcyt2M//8YcREtme9ImNMV7SluIGo8BDOGpLgdpTTdsrLialqvqq+p6oPqOr1gQgVLG6fMZyyqjpeWbXX7SjGGBdtKW5gSmoiUeGhbkc5bbbG5Gk4a0gC04Yl8vRnedTWN7odxxjjgsKj1eyv0KC/P6GJFYXTdPuMNA6WV/PW+v1uRzHGuKBp6c1zusB4AlhROG3nj0hi3ICePPFpDo22ZKcx3c7nO4uICYdxA+LdjtIprCicJhHh9hnDyT1cyYdbDrodxxjjIFXl811FjE4MJTSka6wgYEWhE8we35/U3tE8tizHFuExphvJOVxBQVk1ZyQF/wBzEysKnSA0RJh//nA25pexwt+/aIzp+j7d4Zsqe7wVBXO8K9MH0jfOFuExpjtZvuMww/rEkNSj63yVdp2WuCwyLJR55w3li13FbNhX6nYcY0yAVdc1kJVXzPkj+rgdpVNZUehE12ak0DMqjMeX2bTaxnR1q3cfobqukfNHdo37E5o4UhRE5FkRKRSR7BPsM0NE1ovIZhEJyukzYiPDmDs9lQ+22CI8xnR1y3ceJiI0hGnDusb9CU2cOlN4Dt9Snq0SkV7AY8DlqjoO+I4zsTrfTdNTiQwL4QlbhMeYLm35jsNMTk0gOqJrzXvmSFFQ1eVAyQl2uRZ4Q1X3+vcvdCJXIPSOjeTqKUN4a91+9tsiPMZ0SYXl1Ww7eJTzuth4AoA4dV29iKQCi1V1fCvbHgbCgXFAHPCIqr7QxnHmA/MBkpOT0xcsWBCoyB1WXNXIT5dXccGQMK4bE9nqPhUVFcTGHr88RXAJ9jYEe36wNrjl8/11PL2plt9OjyKlZ2jQtWHmzJlrVHVyqxtV1ZEHkApkt7HtUSATiAGSgJ34lgE94THT09PVq3706nod9Yt3tehodavbly5d6mygAAj2NgR7flVrg1vufHmtpt//kTY0NKpq8LUBWK1tfK965eqjfOADVa1U1SJgOTDR5Uyn5fYZw6mpb+TZL/LcjmKM6USNjb6pLc4fkURIF5naoiWvFIV/AeeKSJiIRAMZwFaXM52WtL6xzB7fjxdW7KGsqs7tOMaYTrL5QDkllbWc18UuRW3i1CWprwArgVEiku9f8/k2EbkNQFW3Au8DG4FVwNOq2ublq8HiezPSOFpTz4uZe9yOYozpJMt3HgbokoPM0I7lODuDql7Tjn0eBB50II5jxg+MZ8aoPjzzeR43n5Pa5S5dM6Y7+nTHYcYN6ElSbOsXkQQ7r3QfdVnfn5lGSWUtr6za53YUY8xpKquqY82eI3xtZNc8SwArCgE3OTWRjKGJPLU8l5r6BrfjGGNOw2c7D9PQqMwa09ftKAFjRcEB37/At2TnG2ttyU5jgtmSrYUkRIczaXCC21ECxoqCA85NS2LCoHgeX5ZDfUOj23GMMR3Q0Kgs3V7IjFF9u8wqa62xouAAEeH7M9PYW3KMRRsOuB3HGNMB6/eVcuRYHReM7rpdR2BFwTEXjU1mTP+ePLpkFw2NtmSnMcFmybZDhIYI53fhQWawouAYEeGuWWnkFlWyeKOdLRgTbD7ZWsjklATie4S7HSWgrCg46OKx/RiVHMdfluyi0aGJCI0xp+9AaRXbDh7t8l1HYEXBUSEhwp2z0thVWMHqg3Z5qjHBYsk232z+XflS1CZWFBw2e3x/0vrGsiinlkYbWzAmKCzdVsiQxGiG9wme6bE7yoqCw0JDhDsvSCO/Qvlwy0G34xhjTqKqtoHPdxVxwei+iHTdS1GbWFFwwWUTBtAvWnjkk11N60kYYzxqZW4RNfWN3WI8AawouCI0RPjm8HC2FpTzwWY7WzDGy5ZsKyQ6IpSMYYluR3GEFQWXnD0gjGF9Ynjoox1234IxHqWqLNlayLlpSUSGhbodxxFWFFwSIsLdF45kx6EKu2/BGI/K3l/OgbJqLhyb7HYUx1hRcNE3zujP6H5xPPLxTpsTyRgPei+7gNAQ4aIxVhSMA0JChLsvGkluUSVvrbezBWO8RFV5P/sg04YlkhAT4XYcx1hRcNnFY5M5Y2A8j3yygzo7WzDGM3YWVpBbVMml4/u7HcVRVhRcJiL86OKR7Cup4rXV+W7HMcb4vZ99EBG4pBuNJ4AVBU+YMbIPZw3pxV+W7KS6zqa/MMYL3ss+yFlDEujbM8rtKI6youABIsKPLx5FQVk1L2bucTuOMd3enuJKthaUM3t8P7ejOM6KgkdMT0vi/JF9eHTpLsqq6tyOY0y39n6276bSS8ZZUTAuuvfS0ZRV1fH4shy3oxjTrb2/+SDjB/ZkcGK021EcZ0XBQ8YO6Ml/TBrI37/I40BpldtxjOmWCsqqWLe3lEu74VkCWFHwnB9dPBJVeOijHW5HMaZb+nDzIYBudylqEysKHjMoIZq501NYuDafbQfL3Y5jTLfzXnYBaX1jSevb9ddOaI0VBQ+6Y2YacZFhPPDeNrejGNOtFFXUsCqvpNt2HQGEuR3AfFWv6Ai+NzONP7y3jRW7ipieluR2JNOFNTQqK3OKeS+7gGO1DSTGRJAYE0FCdARThyaQ1jfO7YiOeXvDARoVLp80wO0ornGkKIjIs8BlQKGqjj/BflOAlcDVqvq6E9m86qbpqbyYuYffvr2Fd35wLmGhdlJnOtfG/FIWrsnnnU0HKaqoISYilISYCI5U1lJZ67uJMjREuGFaCndfOJL46HCXEwfeW+v2M7Z/T0Ymd59CeDynzhSeAx4FXmhrBxEJBR4APnQok6dFhYfyi2+M5bYX1/BS1l7mTk91O5LpIipq6vm/727lpay9RISFMGt0Xy6fOICZo/sSFe5bM6C6roHDR2t4cnkuL6zczaINB/jJJaO4avJgQkO65pKUOYcr2JBfxi++McbtKK5ypCio6nIRST3JbncCC4EpgU8UHC4Zl8y5aUn88cPtfHPiABK70UyNJjBW5BTx09c3sr+0ilvPG8oPZo0gLuqrZwBR4aEMTozm/ivGc83UIfxm0WZ+9sYm3lq3n2dvmkJMZNfreX5r3X5CBL45sft2HQGIU2sE+4vC4ta6j0RkIPAyMBN41r9fq91HIjIfmA+QnJycvmDBgoBlDqSKigpiY09+dcP+ikZ++UUVXxsUxtxxkQ4ka7/2tsGrgj0/tL8N9Y3KK9tq+WRvPcnRwrwzIhmR0P6VxFSVz/bX8/fsWkYnhnB3ehQRoZ1zxuCFfwdV5SfLq0iOFn4ypccp/3kvtOFUzJw5c42qTm51o6o68gBSgew2tr0GTPM/fw6Y055jpqena7BaunRpu/f9zaJsTb13sW7KLw1coA44lTZ4UbDnV21fG8qravW6pzI15Z7F+ptF2Xqspr7Dn7dwzT5NvXex3vRsltbUNXT4OC154d9hVV6xptyzWBeu2dehP++FNpwKYLW28b3qldHLycACEdkNzAEeE5ErXE3kIT+8cCQJ0RH89u3NTUXUmHYpPFrN1U9mkplbzB+/M5Fff3McPSI6vtbwt88axO+vGM/S7Ye5a8G6LrNi4Jvr9tMjPLRbznV0PE8UBVUdqqqpqpoKvA58T1XfcjeVd8T3COcnl4ziy91H+Jet0GbaKfdwBVc+voK8okqenjuZK9MHdcpxr8tI4RffGMN72Qe5Z+GmoP9Fpaa+gXc2FnDJuOQuOVZyqhwpCiLyCr5LTUeJSL6I3CIit4nIbU58fldw1eTBTBrci98t3kJJZa3bcYzHbTlQzpwnVlJZ08Art05jxqi+nXr8eecN465ZI1i4Np+XV+3t1GM7bem2w5RV1XHFmQPdjuIJjhQFVb1GVfurariqDlLVZ1T1CVV9opV9b9Jufo9Ca0JDhAeunMDR6jruX7zF7TjGw3YcOsr1z2QRGRbCwtunM3Fwr4B8zl2zRnD+yD787u0tQT0ly1vr9pMUG8m5dpMo4JHuI9M+o/rFcfuMNN5ct59l2wvdjmM8KOdwBdc+lUVYiPDyrdMYmhQTsM8KCREeumoiPXuE8/2X13Gstj5gnxUoZcfqWLKtkMsnDrAbRP3sbyHI3DFzOGl9Y7nvzWwqaoLvf0ITOHuKK7n2qUxAefnWjIAWhCZJsZE8/N1J5Byu4DeLNgf88zrb62vzqW1o5NtnWddREysKQSYyLJQHrjyDA2VV/L8Ptrsdx3hE/pFjXPtUFrX1jbw4L8PR+YrOSUvijhlp/HN1Pv9av9+xzz1djY3Ki5l7OGtIL8YPjHc7jmdYUQhC6SmJ3DgthedX7mbNnhK34xiXFR6t5vqnsyivruMft2Qwul9PxzP88MIRTE5J4L43s8k/cszxz++IL3KKyCuq5MazU92O4ilWFILUTy4dzYD4Htz96gaOVtuazt1VRa1yw9OrKDxaw3M3T3XtN96w0BAevnoSqsrP38wOistUX1i5h94xEcw+w+5NaMmKQpCKjQzjz9dMYn9pFfcFyf+EpnNV1NTz0Jpq8ooqefKGyaSnJLiaZ1BCNPfMHs3yHYd5fU2+q1lOZn9pFZ9sPcTVUwcTGdbxm/m6IisKQSw9JZEfzhrBog0HWLg2ePpyzemrrmvg1udXs7u8kUevPZNzR3jjcsrrM1KYmprI/Yu3cKi82u04bXopcw8A12akuJzEe6woBLnvzUwjY2giv/pXNrmHK9yOYxxQXdfA/H+sITOvmHlnRHKxh6ZmCAkRHpgzgZr6Rs+ewdbUN/Dql/u4cEwyA3ud+uR3XZ0VhSAXGiI8fPUkIsJCuPOVddTUN7gdyQRQdV0Dt76wms92HuYP3z6D6QO8Ny3D0KQYfnzxKD7eeoi3Nxa4Hecr3t1UQHFlrQ0wt8GKQhfQP74HD86ZyOYD5fx+8Va345gAqaptYN7zq/l8VxEPXDmB704Z4nakNv3nuUOZOLgXv/5XNsUVNW7H+V9eWLmHYUkxTB/e2+0onmRFoYu4aGwyt543lH9k7uG5L/LcjmM6WVVtA/Ne+JIvcor4nysncNXkwW5HOqHQEOHBOROoqKnndx6almVTfhnr9pZy/bQUQrroCnKny4pCF3Lv7DFcNDaZ3y3ewpJth9yOYzrJ4aM1XPd0JityinlwzkS+4/GC0GRkchx3zEzjX+sPeObn8c9LdtIzKow5kztnxtiuyIpCFxIaIjxy9STGDYjn+y+vY/OBMrcjdbra+kYKy6s5WFZNQVkVBWVVHCyrprKm3pODmqdr84EyvvXo52wpKOexa89iTidNf+2U781IY2Syb1oWt++n2ZRfxkdbDnHrecPo2coSpMbHe6NU5rRER4Tx9NzJXPHXL7jludW8dcc59IuPcjvWKamua2D7waNsKShn84Eydh6q4HBFDUVHayivbnu+p4jQEOKjw0mIDmdArx4MSYxufqT1jSWld0xQLTr/fnYBd7+6gV7R4bx+2/SgnIohIiyEP1w5gSsfX8H/vL+d+6/4ymq8jvnTxzvoFR3OTeekupYhGFhR6IKSe0bx7E1TmPP4Cm58NosXb8mgb0/vFgZVZVdhBR9vLWTJtkOs3VtKQ6Pvt/64yDBG9otjdL84ktKSSIqNJCEmgjD/l7sAjQrl1XWUHquj9FgtJZW17C+tYs3uIxxtMWlgj/BQRvWLY0z/OMYPjKehvIH6hkbPzY5ZVdvAX5bs5LFlOUwa3Isnb0j39L/fyZw1JIGbpqfy9y92c/mkAUxJTXQ8w7q9R1iyrZCfXjqKODtLOCErCl3UmP49eWruZOY9v5o5T6zkpXkZDE6MdjvW/5J7uILX1uTzzsYC9pb45ssZN6An/3X+MCYMimds/3gGJ/ZApGO/3asqpcfq2FNyjB3+M49tB8t5d9NBXlm1D4A/rP6QCYPiSU9JYEpqIukpCa59aagqH2w+xP2Lt7C/tIrvpA/i/ivGExUe/Hfc/vjiUXy4+RD3LNzIuz84z/E2/enjnSTGRDDXLkM9KSsKXdj04Um8NC+Dm/7+JXOeWMGLt2QwItm52TNbc6y2nnc2FvDP1fv4cvcRQkOE80Yk8V9fG8as0cmd2tUlIiTERJAQE8GkFgvNqCp7S47x0gcrqYnpx7p9pTzxaS5/XZpDiMC4AfFMSU0kY1giU1MTSYiJ6LRMbdlx6Cj3L97CZzuLGJUcx4L505g2rOtcMhkTGcb//fYZ3PjsKv744Xbu+8ZYxz579e4Slu84zM+/PtqW22wH+xvq4s4cksA//+tsrn8mi6v+tpLn/3MqEwb1cjxH7uEK/pG5h9fX5HO0up5hSTHcO3s03z5zoONdIyJCSu8Ypg8IY8YMXx93ZU096/aWsmp3Cavyinkpaw/P+i/tHd0vjqlDEzlrSAJnDUk4rbOXlipq6nln4wH+uTqfNXuOEBcZxq8uG8uNZ6d4rkurM5w/sg/XTxvCU5/lMXNUX6Y7tNLZQx/tICk2khumpTryecHOikI3MKpfHK/919lc93QW33liJT+9dDQ3T08N+HXa9Q2NLN1+mBdW7uaznUWEhwpfP6M/109LYXJKQqd8sXaWmMgwzh2R1DyHUE19Axvzy8jKLSYrr4TX1+TzwkrffDlJsb4zj5HJcYxIjmVE3ziG94mlR8SJu0TKqurYfKCMzfvLWZ9fypKthVTVNTC8j69AzkkfRFJsZMDb6qb7vj6WFbuK+e/XNvD+XecTHx3YrroVOUWsyCnml5eNPem/j/GxotBNpCbF8NYd53Dvwo3cv3gLH205yINzJgZknOFgWTWvfrmPBV/upaCsmn49o/jRRSO5eupg+sYFx4BpZFgoU1ITmZKayPeBhkZl+8GjrN17hHV7S9mYX8qy7Yepb/z3ZbAxEaG+7qroCHpFh1Nb30hVXQPHahuoqK7nYIsJ4vrHR3HFmQOYkz6Ys4b08lSBDKQeEaH86buTuPLxFfzyX9n8+ZozA/ZZVbUN3PdmNgN79eC6DO/e/e01VhS6kT5xkTw9dzKvrc7nt29vZvYjnzX/hnq6A3/Hauv5eGshi9YfYOn2QhoalfNGJPHrb45j1pi+hAd5d0hoiDB2QE/GDujJ9dN8M2vWNTSyp7iSHYcqyCuqpLiiliPHfI/SY3VEhIWQGBPBoIRQoiPCGJoUw/iB8Ywb0LPLnxGcyMTBvfjBrBE89NEOZo3pS6AutP1/H24nr6iSl+ZldInBeqdYUehmRISrpgzm7OG9+fFrG/jFW9n88cPtXDV5MNdMHULqKazrW1ajvLOxgHezC5q7QvrGRTLvvKFcO3UIKb0Dv0awm8JDQ0jrG+fo0pddxfdmDGfp9kJ+8VY2v87o/C6kL3eX8OwXeVw/bQjnODR20VVYUeimBidG88qt01iZW8yLmXt4+vM8/rY8l6lDExnbvydDk2IYmhTDwIQeVNU2UFZVR1lVHUUVNazfV8raPUfYXXwMWEtiTARXpg/ksgm+a9CD6QYx446w0BAe/u4kLvvz5zy8pppLZtZ12qXAVbUN/OS1DQzs1YOfzR7TKcfsTqwodGMhIcI5aUmck5bEoXLfOMCHWw7y2up9VNa2PQV375gI0lMSmJpUx3cvmMzEQb265NUyJrBSesfw1+vO4qa/r+L7L6/jmbmTO+Xn6MEPtrO7+Bgv35phl6B2gP2NGcB3F/QPZo3gB7NGoKocrqgh73AlBWXVREeEEt8jnJ49wkmIjiC5ZyQiwrJly0hPcf7uVNN1nD+yDzeOjeC5zYf59aLN/P6K8ac16J6ZW8zfV+Rxw7QUpg+3bqOOsKJgvkJE6BsXFTRXCpngNmNwOJFJg/jbp7kMTYph3nnDOnScNXtKmPf8alJ7+y7xNR1jRcEY47p7LhnNvpJj/H/vbiUuKuyUFxDKyi3m5ue+JLlnlHUbnSbrCDbGuC4kRHjoqkmcMzyJexZu4sevbeBYbdsz4rb0xa4i5v59Ff3jo3h1/jT6x9u6y6fDioIxxhOiwkN5/j+n8oNZI1i4Np9vPfoFOw8dbXP/2vpGXl+Tz38+9yUpiTEsmH92UM8m6xWOnGOJyLPAZUChqn5lQnURuQ64B99MyEeB21V1gxPZjDHeERoi/OiikUxJTeCHC9Zz+aNfcG3GECYMiueMgfGk9o5hf2kVr6zayz9X76OoopYJg+J57uapJDowcWF34FTH23PAo8ALbWzPA76mqkdEZDbwJJDhUDZjjMecN6IP7951Hj9/YxP/yNxDbX0jALGRYVTW1iPABaOTuX7aEM4f0cfWW+5EjhQFVV0uIqkn2L6ixctMILjWHDTGdLrknlE8c9MU6hoa2XHoKNn7y8jeX05iTARXTRnMwF42dhAI4tS6tv6isLi17qPj9vsxMFpV57WxfT4wHyA5OTl9wYIFnR3VERUVFcTGxrod47QEexuCPT9YG7wi2Nowc+bMNao6udWNqurIA0gFsk+yz0xgK9C7PcdMT0/XYLV06VK3I5y2YG9DsOdXtTZ4RbC1AVitbXyveuZiXhGZADwNzFbVYrfzGGNMd+SJS1JFZAjwBnCDqu5wO48xxnRXTl2S+gowA0gSkXzg10A4gKo+AfwK6A085p/3pF7b6u8yxhgTME5dfXTNSbbPA1odWDbGGOMcT3QfGWOM8QYrCsYYY5pZUTDGGNPMsZvXAkFEDgN73M7RQUlAkdshTlOwtyHY84O1wSuCrQ0pqtqntQ1BXRSCmYisDvYrrIK9DcGeH6wNXtEV2tDEuo+MMcY0s6JgjDGmmRUF9zzpdoBOEOxtCPb8YG3wiq7QBsDGFIwxxrRgZwrGGGOaWVEwxhjTzIqCw0TkOyKyWUQaRWTycdt+JiK7RGS7iFziVsaTEZFL/Rl3ici9budpDxF5VkQKRSS7xXuJIvKRiOz0/zfBzYwnIyKDRWSpiGzx/wzd5X8/KNohIlEiskpENvjz/9b//lARyfL/PL0qIp5fbFlEQkVknYgs9r8Ouja0xYqC87KBbwPLW74pImOBq4FxwKX4ZowNdT7eifkz/RWYDYwFrvFn97rn8P29tnQv8ImqjgA+8b/2snrgv1V1LDANuMP/dx8s7agBLlDVicAk4FIRmQY8APxJVdOAI8At7kVst7vwLQjWJBjb0CorCg5T1a2qur2VTd8CFqhqjarmAbuAqc6ma5epwC5VzVXVWmABvuyepqrLgZLj3v4W8Lz/+fPAFU5mOlWqWqCqa/3Pj+L7UhpIkLTDv+hXhf9luP+hwAXA6/73PZu/iYgMAr6Bb1EwxDfff1C14USsKHjHQGBfi9f5/ve8Jlhytkeyqhb4nx8Ekt0Mcyr8a56fCWQRRO3wd7usBwqBj4AcoFRV6/27BMPP08PAT4FG/+veBF8b2mRFIQBE5GMRyW7l4fnfqLsr/7q1QXF9tojEAguBH6pqecttXm+Hqjao6iRgEL6zztHuJjo1InIZUKiqa9zOEiieWaO5K1HVCzvwx/YDg1u8HuR/z2uCJWd7HBKR/qpaICL98f326mkiEo6vILykqm/43w66dqhqqYgsBc4GeolImP83ba//PJ0DXC4iXweigJ7AIwRXG07IzhS8YxFwtYhEishQYASwyuVMrfkSGOG/2iIC3+D4IpczddQiYK7/+VzgXy5mOSl/3/UzwFZVfajFpqBoh4j0EZFe/uc9gIvwjYssBeb4d/NsfgBV/ZmqDlLVVHw/+0tU9TqCqA0npar2cPAB/Ae+Psca4BDwQYtt9+HrY90OzHY76wna8HVghz/rfW7naWfmV4ACoM7/938Lvr7gT4CdwMdAots5T9KGc/F1DW0E1vsfXw+WdgATgHX+/NnAr/zvD8P3C9Au4DUg0u2s7WzPDGBxMLehtYdNc2GMMaaZdR8ZY4xpZkXBGGNMMysKxhhjmllRMMYY08yKgjHGmGZWFIwxxjSzomCMMaaZFQVjOpF/vYOL/M9/LyJ/cTuTMafC5j4ypnP9GvidiPTFN4vp5S7nMeaU2B3NxnQyEfkUiAVmqG/dA2OChnUfGdOJROQMoD9QawXBBCMrCsZ0Ev+01S/hWwmtQkSOX/7TGM+zomBMJxCRaOANfGsobwXuxze+YExQsTEFY4wxzexMwRhjTDMrCsYYY5pZUTDGGNPMioIxxphmVhSMMcY0s6JgjDGmmRUFY4wxzf5/qpLUDKiJLBIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"Diffusion\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$D(x)$\")\n", + "ax.plot(xfa, model.diffusion(xfa.reshape(-1, 1)))" + ] + }, + { + "cell_type": "markdown", + "id": "550cf6a2", + "metadata": {}, + "source": [ + "But also obtain the free energy profile" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "568edcc2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pmf=fl.analysis.free_energy_profile_1d(model, xfa)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"PMF\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$\\\\beta U(x)$\")\n", + "ax.plot(xfa, pmf)" + ] + }, + { + "cell_type": "markdown", + "id": "24391587", + "metadata": {}, + "source": [ + "The next step is to compute the folding/unfolding rate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb9c4345", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "719ba0e9", + "metadata": {}, + "source": [ + "And we can also access the committor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb9cf80a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/tutorials/Maximizing_likelihood.ipynb b/.doctrees/nbsphinx/notebooks/tutorials/Maximizing_likelihood.ipynb new file mode 100644 index 0000000..97918bf --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/tutorials/Maximizing_likelihood.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0a83b53b", + "metadata": {}, + "source": [ + "# Likelihood maximization\n", + "In this notebook, we are going to look over likelihood maximisation and how it is implemented in folie" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82e99a68", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c54830e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "87ee8978", + "metadata": {}, + "source": [ + "The next step is to choose a discretisation of the likelihood" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "818a3130", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7758897a", + "metadata": {}, + "outputs": [], + "source": [ + "for trj in data:\n", + " transition.preprocess_traj(trj)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "68b4662a", + "metadata": {}, + "outputs": [], + "source": [ + "def log_likelihood_negative(coefficients, data):\n", + " weightsum = data.weights.sum()\n", + " return np.sum([transition(weight, coefficients)[0] * weight / weightsum for weight, trj in zip(data.weights, data)])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7daed34d", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + " \n", + " \n", + "KramersMoyalEstimator(self.model).fit(data)\n", + "coefficients0 = self.model.coefficients\n", + "\n", + "\n", + "transition.use_jac = False\n", + "res = minimize(log_likelihood_negative, coefficients0, args=(data,), callback=callback, **minimize_kwargs)\n", + "\n", + "self.model.coefficients = res.x\n" + ] + }, + { + "cell_type": "markdown", + "id": "00ecd0a3", + "metadata": {}, + "source": [ + "We can also use the jacobian" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80e96301", + "metadata": {}, + "outputs": [], + "source": [ + "def log_likelihood_negative_w_jac(transition, weights, data, coefficients):\n", + " weightsum = weights.sum()\n", + " array_res = [transition(weight, trj, coefficients, jac=True) * weight / weightsum for weight, trj in zip(data.weights, data)]\n", + " likelihood = np.sum([val[0] for val in array_res])\n", + " likelihood_jac = np.sum([val[1] for val in array_res], axis=0)\n", + " return likelihood,likelihood_jac" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2fa7c64", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "res = minimize(log_likelihood_negative_w_jac, coefficients0, args=(data,), jac=True, **minimize_kwargs)\n", + "self.model.coefficients = res.x\n" + ] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks/tutorials/alanine_dipeptide.ipynb b/.doctrees/nbsphinx/notebooks/tutorials/alanine_dipeptide.ipynb new file mode 100644 index 0000000..b4838a5 --- /dev/null +++ b/.doctrees/nbsphinx/notebooks/tutorials/alanine_dipeptide.ipynb @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ee54748c", + "metadata": {}, + "source": [ + "# Alanine Dipeptide\n", + "\n", + "This example we study the Alanine Dipeptide molecule. Alanine Dipeptide is an example for a small peptide exhibiting rare-events in solution at room temperature. The ϕ and ψ dihedral angles of the molecule have been identified as the two relevant coordinates for the slowest kinetic processes of the system under equilibrium conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ab45cc9e", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import folie as fl\n", + "\n", + "import mdshare # for trajectory data" + ] + }, + { + "cell_type": "markdown", + "id": "d162d270", + "metadata": {}, + "source": [ + "Obtain the data via mdshare (thanks for the Computational Molecular Biology Group, Freie Universität Berlin (GER) providing the data):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1346fe2f", + "metadata": {}, + "outputs": [], + "source": [ + "dihedral_file = mdshare.fetch(\n", + " \"alanine-dipeptide-3x250ns-backbone-dihedrals.npz\", working_directory=\"data\"\n", + ")\n", + "with np.load(dihedral_file) as fh:\n", + " dihedral = [fh[f\"arr_{i}\"] for i in range(3)]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c4d96356", + "metadata": {}, + "source": [ + "Since the dynamics of the molecule are completely described by its position in the dihedral plane, we can use these two variables to visualize the state population." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7cc4f2f1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUcAAAD8CAYAAADkM2ZpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAsTAAALEwEAmpwYAAB/WUlEQVR4nO2dd7wcVdnHv8/M7O4t6dXQiXSQIh0RRKVJtSCCSgdBsCOgqKBiRfQVEBQUAUURRBQRKaIgSA0dAoFQQgIBkpB6y+7MnOf945zZnd27N9kkt23u/D6fuWfnzMw5Z2buPvv0R1SVDBkyZMhQDW+wF5AhQ4YMQxEZccyQIUOGOsiIY4YMGTLUQUYcM2TIkKEOMuKYIUOGDHWQEccMGTJkqIOMOGbIkKHfISLrish/RGS6iDwjIl9w/eeLyHMi8qSI3CgiY1z/BiLSJSKPu+2XqbG2F5GnRGSmiFwoItIva878HDNkyNDfEJEpwBRVfVRERgKPAIcC6wD/VtVIRH4EoKpnisgGwM2qulWdsR4CPg88CNwCXKiq/+zrNWecY4YMGfodqjpXVR91n5cCzwJrq+rtqhq50x7AEste4YjsKFV9QC1ndzWWyPY5gv4YdEWYMGGCbrDBBoMxdYYMwwKPPPLIfFWduDpj7LtXuy54O25svieLzwDdqa7LVPWyeuc6rnA7LOeXxnHAn1L7G4rIY8AS4Buqeg+wNjAndc4c19fnGBTiuMEGGzBt2rTBmDpDhmEBEZm1umPMfzvmwduWy8iVkZvyYreq7tDAukYANwBfVNUlqf6zgQi4xnXNBdZT1QUisj3wVxHZcmXvYXUwKMQxQ4YMzQAlVtNno4lIDksYr1HVv6T6jwEOBD7gRGVUtQgU3edHRORFYBPgNapF73VcX58j0zlmyJChLhQwaEPbiuAsyr8BnlXVn6b69wPOAA5W1c5U/0QR8d3nqcDGwEuqOhdYIiK7uDGPAv7Wh7ddRsY5ZsiQoVcY+oxzfA/waeApEXnc9X0duBAoAHc4j5wHVPVkYA/gOyISAgY4WVXfdtd9FrgSaAX+6bY+R0YcM2TIUBeKEvaRWK2q9wL1/BFv6eX8G7AieL1j04AeLj59jYw4ZsiQoS4UiBsQmddUZMQxQ4YMvaIRfeKaiiFJHFWVJ++ezqT1JjBl6mRUlcfufIq1N5nCnBlzWW/ztZk1fQ7rb7kOrzw9h6lbr8eLT89ho3ety8ynZrPxNuvz/FOz2XSbdXnu8dlstt36PPf4LDbbbj2effRVtnj3+kyf9gpb7LAB0x9+mS12msozD77IljtuyPSHX2KLHacy/cEX2Xznd/LsQy+x+Y5TefbhF9l8x6k8N+1lNtt+Q2Y88jIbv3tDXnj8FTbaej1efGo2U9+1Li8/8xobbL4Wrz7/Butt+g5mz3yLtTecwOsvz2fKBhN487WFTJwyhvlzFzF+8mgWzlvKmAkjWLxgGaPGtLFscSdtI1roWtZNS2ueYneJXC4giiI8zwNVjDH4gc87t9lgsF9Vv2PB3IW89MQr7LDvtqSjxN6cNY/XX3yDbffain6KHhv2UCAexhF0Q5I4/ubr1/DXi/4JCj+757v88zd3cvtVdxGWYoJcQBwrQT4gNkpQyBGLR9CSL/dHnk/QkicKI3K5gNBALh8QJvtdRXJ5n7CzZPuLIUHOJ+oqEuR8wq4iQd634+UCwu4SQd4nKsX2vG53fmRsG8Z2PSIEuYAoVoKcR4SH7wtxMcLP+8R+Dt8XTCnG8wUTK54HpljCEzBRjKCY7tC2YQiqEMWgiqpBFQTF8z3O+t3nee9Hdh7s19VveOvVeRy/5ZdQhfccuiNf+/0XAHj56Vf53C5fA2D/Ez7Aqf933GAuc41G3znyNB+GJHGcNX0Oxc4ShbY8rzwzm/v//gjFzhJ4PqXuEMnnKJVivNYWSrEiI1ooqqJjRhCFIfHYEYTdIWZEO6VSSDyqhWJHhBnTTrGjhBk5gtKyEmbiSMJlRXTcCKJl3TCqnbC7BGNGEXd2I+0F4mIJRo6gVCzCiBZK3UVob6MURTCqjWIphPZW4mIIbS1EUYy25wmjGNNWQMIQM6oViQ3xiAJed4iOLkAYoy0BXmcJxhbwlpSQwEM6ikihgC7rwvN9THcRfNDuEqhBjft3DQ23/fY/7HLg9uTyQ/I1rjSm3f4E9/3tITbbaSNmPPwiI8eNoNgdorFh2u1PcMuv/8UrT8/GGENYijCRYdb0OSseOMMqQdFM57g6EJEW4L9Yc3wA/FlVz1mdMY/73pEsfHMx62+xDndddz8L31yM+AF4gvg++B5SKCC+j7S1gu9jxrRB4BO2BeB7GAUEooIHnsAYu8+oFgQwI1oRQNvtvgQ5O/mINtu2tti2vdVyb66VQsH+u+R8VMR6iooAavcDHzwhznmubUd9IS54CBCbVlTABIKoIqYNr2QIWg1eGCOFFiiGeOJDGOIhaKkEQQyxFR+TZCGP/ftp/vmbOzn4lH1X53EPCbw5ax7fOuSHRGHM3395O+IJGCvaIR5LF3byfydfhoiU779tdCsn/fjTg7ruNRmqEA5f2tgnTuBF4P2qug2wLbCfiOyyOgNuuNV6XPzADzjo5H156r/PYmJF3S9Y1btyqqayyindygr2e2tFejoc9HK+JOe7TkFABHX9mh4vrRfzelmfJ72sNXVt6mNYjLjxwn+yYO5Cmh3iCahrATXqiKB778agRjGxbVEwsSEsRssZdc3AjRfewhHrncxNl942wDMLcYPbmojVJo5qsczt5tzWJ783l5/5e7qWdtkviTpW0Cj4gZ0gnwffJy7kUFWigk+c8wgLQrHdo3ukR/doodgmdI71KLYLnRN8SgWhe4xPmIfSqIDYF4qjcsQFn7DNJ877hCPzmJxHVAgwOZ+oxbVtBUw+sP2+RxT49rrWHHHeI8x7xC0+pTaPsM2ne4RH2OpRbIPiSKFjnEdxlNA5VugeI3SOF7rHeXRM8OkeG9A9Jkc4poVoRB5tK2DyeWjJQz6P+glVtU9YVXn9xTe44+q7WbpwGV0d3b0/zCGOSetO4Ae3fYMDP7MPJ/7wU3he5T5R495/BapK97IiV5z9h4Ff7ADjki/+lvlzFnDx534zoPMq9uvWyLYmok+UVS7M5xFgI+AXqlqbbWOl8Y/L7+Dpe58FcdyEeIjnQc5HAh/a26Ctlbg9j2nNEbUFxK0+pZEeYbsQB4LJYbk3z7VW+qVrskfQDWI8/KKABuQ6lVJsbH+seDEU23Pg24u8EGKjiCNKJu/ZMQPH7amgopRG+xgPNCcYT4hbwXjY1geTt/fnhXZNcYtdU64TJIJch+KVlNaFLXjdhrZ53WhXiL9gCRpFUCyikYGwhIljTGy46tzruPrb11FoyXP+v89ho203XN3HP+DoWtbFhZ+9nNkzXqdtZCsmrvONE88RSXvMDzw23eGdA7vQQcCUd07mjZffQo3yrUN/xHf+euaAzb2mcoWNoE9iq1U1VtVtsUHgO4lIvQSVJ4nINBGZNm/evOWOZ4zh75fcjomNJYiA+K4NLD2XQt6KroUARDAFH0SIWq1oa3I4UZVqUTXZV+z1dnGI28cxqG7RlY2afk8qLZZAqi+oZ/vUE9TDbj7g27nFPXFx/eKBmEqLCF5sx/BDY9cWOtExUaQak1oMRKWIsDukq6Obu67933Kf7VDFW7MX8MYrlgB0LHEhtr19L13/hHXGs9cRu/O/vz6EMWuuXfWyJy+wqgTgoVseG7B5rRN4Jlb3CVR1EfAfYL86xy5T1R1UdYeJE5efZu7SL13JrGetFbJsnU3ayOWXK5YsHStGtg2tu6rfbfWTXqLM96zVDT+9D5p3bc79E7h94/bVd4vxKm3SX8vTWAILxLZNNACYSr+K5ThVFPUU41tVgXqKBnY/zinGh6hguc2o1cd4grbkLdH1fTteYBcnCaV1C4rDmBt/fgsP/XPgvkB9hSlTJ7PlbpviBx5TNpyMn/OZuPb4+ie7+503ZwGf3eFMfvCpC/nFF347cIsdYBRa8ux77F54vseBJ+89YPMqEKrX0LYmoi+s1ROBUFUXiUgrsDfwo9UZ861X5xOVHLekCp5nCWAuQD0PaW3F+D5aCIgDj9LoHHFBKI7xiHNCcSyYQIlGWcV9nLfiMB5IKIiBsCRIKPgl8IsQhYIXgV8SvJIVozVwXJ0Bv+g4QRHL8cWgnlru04c4B+EIj9izorMGYFqUqNVgWhTyMdKiBPmIoDUiECXwY9r9ErlczMJl7WCEzsUFvMijODeP3+0RthbIdeUotHp4XSHBwhwSRihqOUqN0ZiyTk5R3m5CA02+kOOAE/emfUw7x373CKZMncQ13/8L13z3z5Vfo5o4XxPZ/WJnkbdeXb400swQEfb+9J4sXbiMvT6x+4DNqwjxME7c1Rc6xynAVU7v6AHXqerNqzPgZ35yFNPvf57F85ZY1x0RJJezbVsrANrWgiBEYwqICKWR9rzSGMCHcKzlFo2vlpsri9eKIkgEFECKloskFjQnaASmYK8F971UtSIvYHJOJvftP48GgvEhHOmIZ94+BS3Yz/FIkJwi7YYgiGltLRH4hpYgoi0XMr6lg644wPg+XaUcJd8nXpIjHiX4EZg2Hw3d/UaCtBo07rA/FLFBfB/VGNTDE2HzXTdlz4/vujqPf1Aw9+U3+dHRFxGVYl6dPodvXPslrv/x31Zo2hMRRk0YyckXHD0wCx0ExHHMmft8lziKeeT2J7l52e8HbG6ja6bI3AhWmziq6pPYlOd9hrXe+Q522Hcb7vrTfcSxWlWgutYYa5CxoSKIWicfMZbooWUaWEZZxehaL9UPKZViqq1SPVadp4lbY10VZVXby/0J6haoiCg+BsHge8Ye8xLx2+pE1bn4VKSX+hMYVebPWUDHki5aR7T2+nyHInIFpyQWmPP8XH541EWUukO8wEMTV646hNLP+eyw7zasvdGUAV/zQOF337meOIrxfI9Ca37A5k10jsMVQ5Zn/tJlJzNhnfFW56hAFFmdm6rVucUxccGHSAlbLPEM261uL2w1To8Yoy0R2hLBiBLqx9AWomKI2gxRYOgea4hEKbVB5ENxBIQ5oTQC4gDCPMSeUGqFKIDYh8gXwoLdD3NWpDaixL69JvYhyhkrzgcRfkvEiNZOJoxYxsaj32TbsXN4z/gX2Grk67x7xMu8Z8xMPjjhGXYbP5N3jZvDmHFLyY/rpDgponOC0jVOKLYLcXtAlPOgrQWCAHI58Lyy0QpjeHPWPO7+U/MZZSasNY6vXfN5xBNMbHjpyVkAtI1q5fgfHIkX+HWvm7z+BL58+SkDudQBxzXftZm7TGz41ePnD+DMQqxeQ9uaiCF7Vzf94lbemjWvwoY5sRoRG3rneXixFXMFj7jFQz2I2xTTIphWg+adSFuw3J7XavV+jImgxWDaFD8WtEUgsG41fozVTYoQt4qNyMgL2uIRtdt9wbrqxC0ept1ayE1erAtPwYrl0SiI2hVvhCFoCVln3BLWHr2Ibca9ziaj32Sj9vnsNPplPjx6OgeOeoYPjp7B/uOeZo/JM9lvnWd4x7oLmbDeQrrWUZauDx3rBCxZN084ZSSl8W0wciTS1moje3wf8XzwPOJI+e23ruOFR18azNe3Sth2r60YPWEUQd4vh0QuW9jB1edehwkrhZ7EE3KFgFwhx95HvY98ITdYSx4QTN1m/bK3xQ8+deGAzWszgXsNbSvCcupWjxORO0TkBdeOdf3ialLPdDWt350a62h3/gsi0m/6lCEblDvt9icwscHL2X98yTkXHt9xEC1WvDCttt+0iGvtYc1ZGazsOpNIB4kcHFsRTpzdR1y/1HiESPqDll0aSUTA8rHETQjnoiOJwQYKQYwn0OqHeAK+GESEkV7JGbU9RIRuzSEiLIla8YCwmEMQgqKdJGm9khV21FnuE3WB0z8QhTF3XnMPrzw9m0nrT2CbPQe0LtEqY+TYEfzuxYt57YU3WLa4g6/tex6l7rAcBZOEDo6fMpZfTPsRHYs6WHfTfik8N6Rw0YM/4ICWIwF45n8zBmxeVaGk9Tn2VUAEfCVdt1pE7gCOAe5U1R+KyFnAWcCZwP7Y0ggbAzsDlwI7i8g44BxgB+y//SMicpOq9rkVcshyjh//6iHkCjnUOI6hVMKant0XpasbBXJLreU212H1UsEyQBWv6CiXsaRDEhcbxLY5q8PSPBVFpFL9c1FWVKb0XW4cUXUtYKz1GmfZJsK69URALHSWcpQin2VRgVLsE6mPh7I4LmBUKEhMDsNov4sWKbFOy0La/SJtI7vxg5hwJKivlEZY7tiMyFv9Y0vBEsQgcATavs44jPnLz2/hZyf9krM/9H0evfOpPn8//YVCa4GpW6/PZjtuxHYfeBdto1rZcOv1aB/dxlobTQZg0VuL+cXnrxgWhBEgn89x2OkHUWjLc8TXPzKgc1tt+Iq3FaG3utXAIcBV7rSrqNSgPgS42kXgPQCMcTWr9wXuUNW3HUG8gzqug32BIcs5Tpk6mfaxI1g8b7H1DzSKZxSNDbR4iFHExEjo4UcBcdHgGQ+vJPhdQOwhkWIKIDmBlgiw1mgNfST0CJZ61p2nGzAQJOV9BCRS/NDRTQVi5zupWEu2cYxa6I4rkAMTWQ7H71Zr2TaKeEp35FMIPJZFeXJeRLt0WWLoCSO8gAm+EKphgjebzkLAvNIoXs2NpeMdBTqX5Sl2tBHkheJSjyAIyI1oQXxBSm0QRZaGx7El3iZGY0NYMogn3HTJrWy1+2ZNJX7mCjm2+8C7CEsRG261HrOmz2GvI97DhadcTliMWPr2shUPsgbhpB8fxUk/PmpA57QGmb7nn2rqVk92RbMA3gAmu89rA7NTlyX1qXvr73MMWeJ4yRevZPG8JS6UBLwgsGJtPg9G0VwOL1Li1gAvgmiEhxcLmgMvFis1RwJ5S8BMIUY8MKEPCMESz4qsnZbp8l2bcIp+qSItOwNyORQRsG5FCYFM93vJNR7ixZBX8kFMPmco+DF535CXGBFo96BNhDweLV6OThMywo94vnMSHdpCR1jAiOB3+0Ti4ZcUDTz8Ysk+F+fnhyOKZRN6CmqUabc9zoP/eLSpcj+++MQrXHH2Hyl1lXjsX0+hKMsWLePY845g+v0zODHLxjMAkJUxtkwQkXQx+stU9bIeI9bUrU4nKlZVFUn7mQwuhqRY/fCtjzHttsfLHCPOlQcoh1ElETPiYnAlVksfTIpO1O4nekXqtAm0/n7ZZSc5rlq9j+MgqbgRibG+PsZ4KEpk7OOOnB7H6nOUWJ2rkpPZWyQClJzvVAq+AdRG7QgY37n21GYQcvPWJm8udpb49Vm/Z+Gbi3p54kMP7aPbQJVcS87qbVvzjBo/kruvv5+Hbn28KQ1OzYaVNMjMTyLg3FaPMNarW/2mE5dx7Vuu/zVg3dTlSX3q3vr7HEOSc/zrRf8kKoWOazTg+2gptA7P3d1IfiQUI7QQECwqUip4tLwFnVOEYDFEo4XA2GQPXihoi6IlK1L6Rc/GMcfgdWJD/ELbBCEQ2lctJcVTQY3axBexwVOBSCEQPKOYFs9mSs4JfgymIATLIG6316sIvB1QHC3MWzSCUrvPTBnHO1o7MMawtLAU0ZjxfjdCRF585sftqBfT7nXSnmuhYEI6pBVPDXHgYeIYDXyML3iteejqti5OUU3qLk+q0qXMf20BD/7jUfY77v0D8g5XF1M2nMwvHzuf6fc/z0bbbcBLT7zKmEmj+M5hF9DdUeT337med713c96eu4ipW68/2MtdYxH3kRN4b3WrgZuAo4EfuvZvqf7TRORarEFmsarOFZHbgO8nVm1gH+BrfbLIGgxJ4rjLQTuUrdXlTCy+h0YRks9BsWi9epYVMaNbyS+JCNt9Rs6FznEeQSyU2sXqDEWQZaCObUw4wNwS8BIjCiChNbLkOkGMDR8UY6zo7LJJlh3Oi2pF6W5D1CpoCcJ2Qbot1+hHwChBYyX0c2jks1SFYjGH7ysLw3ZezY1lXNCBP+555sSjAPAxtHlF5pVG8mZpLG93tjG/cwQUPTz18Ax4+CAh6vuoOvHa96xRxiiEkfV7VEWlkuqr1BVy8eevYLOdN2aDLdet89SHHtbddO2y0eWd22zI/NcWkG/J0d1R5JVn5nDEOp/B8z0OP/NQjjrn44O82jUPihBqn5GI3upW/xC4TkSOB2YByYu8BfgQMBPoBI4FUNW3ReS7wMPuvO+k6ln3KYYkcTzo5H2460//48m7p1ey8STZeVxWHhKXnrxrA3vc5O0vXeKBUPndk6p9qbjNVZ+n1W2PKJlUm7j0WLWMlJWUiZpGnf5RnbztBzYTRbKS9qCE4pFkqPCIUTyWxq0oHp2lgtVdlmwiXb9oRXm/ZFtJdI6JHJ2s2bm8lC30Ujn22gtzm4Y4Ajx1z7M8+d/pvHPb9Xn5yVc54DP7cN35fyMOY1SFKIx55n/PDfYy10j0pUFmOXWrAT5Q53wFTu1lrCuAK/pkYcvBkCSOAMd//0jO3Oc8il0l8DxrdAgCtFRCWlqsa09LC/7SItGYVvzOiKg9oLDY0D3GI7dMCEdY15okgUQ6YYR4VkT2YpuH0br8YLWwkeUey9k+cddX6Fj5XD+0Lj1+UYnyNnGF5sAvWcLk5cCIhxQ9ujVHdyGHabHTvM4o1m9pZ1TQRYxPgEd3nKPNKxLGwohCNx7G+XDaCKCWtyFs88ktjdHWPHR0Wa4xjCBnxWsVu1BNqKIjjFO3Xp9t39/vtdD7DLOencOZ+3wXjQ2xMXi+RxzFiAj5lhwbbz+Vt+cu5KhzDx/spa6RUKTPxOpmxJAljlvsuinv/uDWPHDLo5jIoKp4iWFGioAiQYAUwV8EXkuAVzT43T5BV0CcF3gTK/Z6lgAGRTCBzcKjvuJFICa2GXjUEHQr6hlynYoRrOuQgBcpJucyVxi1cdy+rQFjAo882OS3CtGIwKYdG+nZMMJ2MIFHtCSPSo75o1pQ3+CPL+H7Ma8tGovnGUa1FImMUIoDOsMcXd15isUc8nYer9sn6LDuQV5o120hEOQsIfetcSfJzYMklNyd6Qmjxo9oqmJcUSlCBGJnfFNjnec9z2PrPbfgB//8xiCvcM1HI9EvayqG9Dfli786iVN2OJMFry10NZuxYrZRm6XHpTPzYiV2bRj4eM7IgjgvFwWv6Fx2Qje4oxu+6/c6FVGbhVtUbVIeVevCA4g6Z/KEk4wtIUryRnqR5Sw9Q9mhXNx1YuxxE9g0acaDMLSlXJeELQR+TFzyiWIhigNKoUdYykGnj4Y+QZflXHMdVk8adMeIgiRp3coVCZ2uoKwaqOgG1CiP/+dpHrnjSXY9aIf+eF19jqlbr89Xf3sqj/zrSaZuvT4vP/Uq62+5LrOfe42jzjlssJe3xkOVNTZuuhEMaeL46L+eZKHLTahGEd9Zj33r8Cy+b8VeD4htK7FBkwQVSYbvlP7QcqCJTq5GD5mevOzCU1HaVR93PoXpVhMx1p1vM9y6FltNT61obxQ0ttE6aqSiNkzmdd7nguVSwXK9ACYpQlWTpaeHBFSji1SjjF9rLM0CEeF9h7+H9x3+nsFeyrCENcj0Wfhg02HIEkdV5c8X/N1ZrMUSQ89ZrH0f7ewGBMIYaW/BW2ow7Xly82PMiJytVNfqIx02cYSEpqxn1MCD2CCILYcagxQjm1QitA7aGjvjSRQjvod2GAh8NIpdDkXF8z2MGrx8YDV8uRxBFKEtAdKtaEuAv1jRdo9Sh2BaPaSkUPAIu3NIXikt9IkKSrcY/ABCI7byQqeHH3l4i4RcEXKLDEEJpDvCixSKIRIphCHEsa0vY1IUNtE1Onrt53wOP+NQNtl+za+5kqHvkCW7HYK4/Mzf88ozLkrIcWdqnFEmjq2OrasbCnno7EbyOfylBm3J4S82tlJfMSbOe1D0IHYMnlFEYtRFt0hXaPmuKLaOPqFJOX0r6vJJJtmAiBUkcjkWBS/w0TjC8zy0VMIrBGgY4ec8tDsiyHtolyFo8zAdhtJImzk8nxNMIIQjvPIt4kGQA4kg32lFcb8IQbdSWAR+yeAXwe8M8UsxlEIbLVS+Gax/o4ozHEmZe4zDmD/9+K/sduiOTVmAK8PAQ5Fhnex2yP4svPLMbKuQdyJkjzYRiZNchklbTsODo3CSimrp2Za3dD91zksy25b7pdJfhlT2U8W70nWsK448loYlp6cT8Erie+nm9yKqon28JCoo0TX2FnBVoy8Qz+OtV+f3cnKGDD0R4zW0rYkYspzj8d8/kkVvLmb8WmN54u7pdHd0WwITRUiQs2J24KNhCPk8UgohF0BXEVrzNpLF9/G6I0zOt3HIgYtH9j3HAbrJjIHYUh5V4/SUTpdoYktwo8i2ZYJkLEEuhTb5rrHGISlFaM634rnn4UmM5n28kgEjqG/QgiAq+M69yDgXI8+5ESG2dKvE4IW2+JYYG/8oscEEHr5x9+GMUuX1km6dxdp1bbmb9QDIkKERWE+2NZPwNYIhSxzjKKZUDCkVQ9QYp0Zznnuh5Sg1ipG8SflAelY/2F3Ey/lorHj5AA+x+kpAxMZrC4qG1meOMKoQGGMqWcfBmeziyvGk35PqWO3EOb2Qt7+jhaAc2RMDZkwrBsi32LrWpmCt7yZnOdC4YMdLbDpebH0tg5IikZJbGiFRjNdRtIR3Sacl3GEEsUFLoV27wYracUzaEpVryXHY6QfT0lYYkPeXYU3Amlt2tREMWeJ45TevZdYzs3n12Tku+USt2JwuAI21TNsORBUiU5OoxiV2SBJUhFFZ1wg4a7MzcCT7UOEUa+sia22bWK2piPSKXUfOrzBy6lyLYnvYDy3n6MeVSzHWJUgixz0WjU2sUYxt212qcLuKzXGZzjZRU6XP930+dMIH2X7vjGvM0DgUhrW1esjyzBu9e0MKrXk8T/CTglpQrmNdbuPq/SqfGEhZcFcwYW0qm96OL68tb9X9EjsfHmOt8BiqzpOkX2vHteNVwhGlqk1uquxklDyjGj/HOIq58w/38MYrScKTDBlWDFXBqNfQtiZiyHKOx513JLscuAOT1h3P1z/0fV5+6lWcUhA0sTYHEJZQE9hwwnzeclSFPCC2tEIY2qQVsdPRmZSOLuH2oqjCGcZOxxg6K0hsKhluPM+NVyHWGOMycYt1UC+WkEIOLWJ1kSpI4BPMi9F8zhK2gm+jFfMBsWcd231RJPDQMLbZf0qxdUQvOsGmO8SLDXR0QxRbXatTAWgUWw7Y2NRmlfyOFZS6QmY++jJTNpxMhgyNInMCH6LYYpdNADjirA/zkxMuZfSEUcx/faF14E6s0zb8wxIu42TTYhEKBduf6AyLYYVgeClLc+J1XUqn/KoRoRPxtUxAa46bEPK5Sn93yeoyS6ElnFGE+AFaiqCQg1KE73toV4SfCyxn6HsQh1Z0Ts3rhVFFhA4jKJUsMYzdpmqPlcV+SXyWqpY4esJINt91k5V+BxmGL2zcwvDVOa72z0JvVcX6EnsdsTt/XXglP7vnO4wc2+70iBWXmfJ+2tWmZr9+26jIXbvf84J0RuPKcUlt1HyuM35ZP5qcrRX9Zb0bkKomfWEVCq15PnPBUUxYa1zPuTNk6BXDuzRrX3COdauKqer0Phi7jFw+x/nH/KJcO8RE1pVHNALxy47hAtblp1iy4rUx1RRH3Z+0bs/znNuOcYktasIC3TFr8U7pBtPHnbgt6iwvGlccs33fZv1RhVCcuB2XOVjxxa0Tyw0mOkmoiMtpw5EntoCXCNZ64/aTG0zdr3jCNnttyS4HbN+XryPDMIB15Rm+nONqE0dXHGeu+7xURJKqYn1KHAFaRrTg+UIcxs7n0REYsaGAmvj+IWV9XOLCY3VxKb1jWqQ2WtErJu48CcfmV6x1GkWOULrz08/BuGwXyflJ60R9CQJLOH1nXW9tLRPyMsFTwHfjh6Fbj7HW+tC6NBGG1UYfo86YYyzhNu5esY8hVwjYdq93ccymn2e9zdbmG3/6MiPGtPf1q8mwBmK4x1b3KT9cU1Ws9thJIjJNRKbNmzdvlcb/xrVfYuzk0cmIrqncQm+/cQIVfWBV/HFqP00YoY4oS/X5jaKHCK+VaB6c6Fw+7j4n1u3kmrJu0WWsSNZaHrN+pEwQ+Bxy6v48+q8nmTd7AU//bwZP3PXMyq0/w7DGStSQWS5E5AoReUtEnk71/UlEHnfbK0mGcBHZQES6Usd+mbpmexF5SkRmisiFUqXP6lv0GXGsrSpWe1xVL0uK70ycOHGV5mhpK/C+w3fDSyJDSLn09HDd0er+ykJWbtJa4oYud1+15niPFkuAHTHUMlFObWU/Sa1wuUAP8t9DRVC9Vj/wef8Ru7PN+7Yg35LD8z3W2XStlbv/DMMWNmWZNLQ1gCupqS+tqoer6raqui2WdvwldfjF5JiqnpzqvxQ4EdjYbf1Ssxr6yFrdS1WxfsGx5x3Jv373Xxa95eivUVIpXssirF2Y3VfPel9LckIiahuTIjCV89MJG2z4IBXdZTlcL3V+Ku7b1o4WVATP9+1pzpVIArfvCdrRgQSBTeCaRPtgiav4HhrFdmlRhWtUY6o4XE1zjPbiMv3MFQKO+8GRbLTdhmy03YbsevCOjJ00mlHjR/b1K8mwBqOvdI6q+l8nWfaA4/4+Diy3+purTjhKVR9w+1cDhwL/7JNF1mC1ieNyqor1C847/KcsW9Tp9ixVKNO0JCONI3ZlemHiClFSbKGs2GaVVhO7mivW4qye51KWpTjMXrlARxQT4uQ4PxVsWjMTI55vCavnjEaeVxnbpV+zYX8VnaGWVQAuPLCsYzRlPWT59strpHzfAOPXGsceH9u1fHj9zddZjaeeYTjCZuXp27rVveC9wJuq+kKqb0MReQxYAnxDVe/B2jLmpM6Z4/r6BX3BOdatKqaqt/TB2D2wZP5Sa5CBMsdkDcQ1oXtU07I0M6g1IrBtpcd5ZfTY1ypdZ5I4t0qEr+dK1GPYSu3r9P2U7Sma0HoBsUlzldQiq9x8KKsbcoUcH/78h7j0i79l7Y2n8KlvHUa+kKu/iAwZeoECYePEcb6qrmqK+SOAP6b25wLrqeoCEdke+KuIbLmKY68y+sJavbyqYn2O0397Kp/b+WssW9SRLKDsB15OApHo6BIjh3iO4KXE5wRlamiPaZKFR2spVg2SCZPx04YapZypXE0S460ussblojQGVFATViJxnMtQMr4mOkd3vRWjtWq9CXUUT9hq982ZsPY4Jq8/gekPPM+9Nz5ErhCw0XYbVnGRGTI0hpXiHFdtBpEA+AhQ9jVT1SJQdJ8fEZEXgU2A14C0CLSO6+sXNJ335jobT2Gr3TfDz6VcDKqIm81IoyZOxVvXK2GaiKeaGsbYDEBRVP6cuiB1nnWfUecXaTPgVEMSl5/kXFU0DNFiiHZ0oaUS2l20YnPRZfMOQzQK7bGi28IQUyphSqHVQ8bWtUfL8dlujtjw2guvc+x5n+C47x3JhCljyRUCVMn0jBlWGQZpaFsNfBB4TlXL4rKITBQR332eijW8vOTcBpeIyC5OnXcU8LfVmXx5aDriCPCtP3+FsZNG1/TWs+TWdtSJYulNhO5FFG78POllt1r0Tgf6pPUAkhadV7QId87i+Uv5z7X/A+CknxzFV684lfP/9S223at5yrFmGDroS2u1iPwRuB/YVETmiMjx7tAnqBapAfYAnnRquj8DJ6vq2+7YZ4FfAzOBF+knYwwM8djq3pDL59jn6Pfxxx/eWBFnE4VhDcrdvUjHK0Qv467wvNqJa4lp2RVJ07sk1nJNrOMN+FUmWYuiUsTvvn09W++xBVvutil7fny3Bm4wQ4be0Vditaoe0Uv/MXX6bsB6v9Q7fxowIL/2Tck5Ahx73hFMmZrOMOPE5Dp+jVYMNe64E52N9th6cpH1zy37IJJslMe34nyMiUL7OYytmB9GdqzkmkTkjmNMFFmxuRTa86K4/nxqqjesrvHT3zqMPVKE8JWnX+3bh51hWCKpIdPItiaiKTnHBJ/92TGc+5HziaMYTVt6a1oRa+W1kqrg+WJjs1MlWsvH08lsnEVakhhpEk6vQhTBqxTgSlyIBPD8yilJrWtDJY47sa4bY12LapPppm7DLcItoELBRWDyBhPZ+6g9Wbawg5mPvsyYiaPY7ZAdV/GJZshQgQLRGppUohE0NXEcPXEUfs4niqpde2pFWE0s2j1cfLTu8Vr0cNWpMWTXm7ax39IGFJw17joIeJ4AQpDz+egXD2TSuhOYtO4Erpj+fw3NmiFDo1hTE9k2gqYmjj896ZcUO0vVnbW+hlWHtHcdYj2KlhpLY1Pj4pMcsC49Vd1KOfIl7ROpavMyiu/bpD2eVFx2NBk/GS+xwCcUuMJZbrHrpmy+y8a0jWzlQyd8YDlPqHnQ3VnM6tsMNazBInMjaOqfhSkbTibI1csaUrHyiid2E6mIx72yiEmbEp0lJUKn6kOL71dE5Drj2WS8UuUsjsvnqLElkhrWuABpEieelFVIXHWqRe4Xn5jFXp/YnU998zDyLfneHk9TICyFnL7XORwy+ih+f96fB3s5GVJQBsSVZ8iiKYmjqvLYv5/icxcfT9uo1l7O6uWFrdj4m0yynPPruAStCDW5I8p1tx2xrs0t0VuuCYDuZd089M/HGpt3iGPe7AVMf/AFTGy4+Ze3D/ZyMtQgM8g0GX5y3CXcff19RMWI3t9LL5q/Wh3eKqMRR0ip3k21FX0nznVHa473nCbIB/iBT5Dz2e79a4bv4oS1x7H+5uvw0pOz+MAn3zvYy8mQgpIlu206vPTkrJ66xlo43aI24CdYPr/sVF1Ht1g+L6l6WH++8m4SDlguGVtjVXFmbY0r19kl1ETzpPDhz+/Pp8/5OACt7S2N3dcQxtP/e467r7uPc244nZb2AmMmjgbgkTue4KF/PsbHv3oI46eMHeRVDl8oQmSaUrjsEzQlcTz158dy5r7nEXaHZUszSWGpchbv1C9eQ9xiQhiXY7buDVL+U6e74uLjfH7cdKn5AMRDUFTTcrWSRMtMWn8Ch562/xpBFAEWz1/CGR/4NnFsePAfj3L1zIsBeP3FN/jmwT/ExMpT9zzLJQ//aJBXOryxpuoTG0FT/ixstfvmbPLuqXj+Cl5c7eHl6PEaOr7S6BP5nSDvs/9x72fSequWJHgwceOFt/DpqafyvSN/xqennsq//3gPqsr1P7mJsBRhjOGtV+fx7cN+wlEbncbPP/trwlJk3aeAi077Ncdu/gWe/G+fV93IsCLo8NY5NiVxBDjnL6fTPrrN7pQjSOr4IS63TSzBqeuS3Ikrg7Q4nO5WbJafMtfoTi6751TWXBU9UxPts9lOG3PYVw9ZyUUNPkrFkEu/dCVvvPIWd117H2+88hY/O/FXLJi7kD//7GZ7kkIcGe694UHmvvQmj97xBCi0tBf41LcO49bf/ps5M17nolMvH9ybGYZIdI4ZcWwyjJk4mh323dbGFUOK6/PcVv+FiVjXHrfjXG1SLVCXOpbHTW1pFjOJpvGkptuuRXwf8QPED2zKMje3+F7FvcikvModgpzP3kfv2ZT5GP3AY8I648m35vF8D/GE7s4iJ2/31UpOTqhWNzh0Lunix0dfTKkrBGDW9Ne4/oKbBnD1GaD5iaOIrC0iu4nIHsnW6LVNSRzjOOaeGx7gU9/6GG2jE1eeGmLVGwbqPUrNh7JuMdmtdeWpPW7b3T+yM/sf15yO3r7vc+H93+PQ0/bjgv9+u0z0F8+rLTFU/6UsW9xR/qyq3HnNPf200gz1oAix8RrahiJE5EfA/4BvAF912+mNXt+UBpnvH/lzHvzHo4TdpVSJ1ITdWjH1Kxtx6onPtQaZuuel3HR6G6e2T6u5wipXntR+2pUn35rnkFP7rX5QvyOOY07e9nS6Oopc95ObXBq25VxQ++zTr8ETDvrsvv221gz10eQGmUOBTV3y3JXG0CT5K8AbL79JsbOIMYqJUq4vdaJJSJJCpBNHpLx2qs+tY6ku6yfT81CJltFqkTCJw0aolGAVqhJWVKRIlyi3NvbQTbrOJlPYcOv1G3soQxBP3j2dxfOXUuoqOTXqctyjkkQcvXwZ20a10bGog58cfwnz5izotzVnqECb3yDzErDK+qimJI5f+tXJtI5oqf89qtU1imf1fo0YWZbnwpOEATrfxR774LyJXHih5+MloYuelHWPuLDDcjhjefhkX8rE/NXpc/jj9/u1mGO/IY5jvrb/96o7e9HXip/ojVPPtkZ33LG4g1+fdQ3/+t3d/PiYiwfoLjKoSkPbitBL3epzReS1VH3qD6WOfc3Vpp4hIvum+vdzfTNF5KwVTNsJPC4iv3I1ri8UkQsbvfemJI5vv7GIsBT2UOtVpSqr7Set56vf9prUtpy0dvmQHp96axuAs+Le+tt/M+vZOSs+f4jhD9+7oY7RpUZdUW51xY/GcZ4mVp753wwe+/dTfbreDPXQp/kcr6R+jemfpepT3wIgIltgM4Rv6a65RER8VzrhF8D+wBbAEe7c3nAT8F3gPuCR1NYQmpI4XvH1PxCV4p4hdur+pPfVlB3Dy3o+E2Oz4SSJHmqjV2qQqtVS5TJU97SKWKxozdhaqX8tYs/yvNTRWr2jsnjeUm65/F8reiRDCqrK1edeX9tJ9QtzXLKCxoog5a5qVHeoKmEx5PIzf98va89Qjb7iHFX1v8DbKzzR4hDgWlUtqurL2JIIO7ltpqq+pKol4Fp3bm9zXlVva3ANzUkc37XH5uRbcgT5oOKWk0DSomxFdBXfw8sF1qUmyNnW86rOregne3PZSfkh9gKbjce66Ijn27rViNWpJWKjq0QoQWCP+zV2MRE83yfIB+Rb82y600Z98twGEhtstS5BPiDIBykuMeXbqabyLoIAxMMLfOfyVHk39p309ER48fFX+NP5fxvo2xpWUIXYSEMbrm51ajupwWlOE5Enndg91vWtDcxOnZPUp+6tvwoicp1rn3JjV22N3n+fWKtF5ArgQOAtVe33jAgn/vjTjBjTzrbv34pvf/QnLH17WWUttcQy6R9wH55aok2FYUpaY0V6NaaSTNcd32znjTn4lH3oXNrFXoe/Z4DW3jcQEX7wz7O54Wf/YLcP78iX9/hWcoRq0br2naxAfZF6diY2PHDzIxzehM7xzYSVsFavSt3qS7Fir7r2AuC4lRyjHr7g2gNXZ5C+cuW5ErgYuLqPxlsuvvOxn/DYv5/mmvNuQGpDCBVUtEIMU1+oKhee3mKoa4lYMmg94lav7Q31VACJFbtOlvEZDz3P+Q+/QJDz6VrWzcdPP3hFj2XIQFU58V1fodhd4s8//TviuwQbCXq4S7n95Bl6AlXnU/EScPBzfkYY+xkKDYnMqzy+6pvJZxG5HHBhU7wGrJs6NV2furf+9LhzXTtLRN6BFccVeFhV32h0fX0iVq+kPmG1MOf513n6fzModZVQTbnyJGsxpkIYnYiLH1RectkdUlKuNlZsE3FWZN+3fZ7LzlO2djt3E/FShh+xInRynZdcnxx3Yri483wfAr/awo21boufiJJKHBniMCYsRixZsLRfnmV/onNpF2G3jW6pEEYtqy28fN7eby5AAh/J58DzkULeqhzyOWvV93yrGkms/e4dtI9u4/H/PMV3DvsJb86aN2j3uWajfwtsiciU1O6HgcSSfRPwCREpiMiG2LrVDwEPAxuLyIYikscabXoNmxKRE9x1HwE+BjwgIg1zpk3nBP6T4y6hMxU5UQvxvEqbFLJKsXdpA4mIoGmXHPuhfMzqBj3HcXrVx8shiNXXS3o/VZah7K4CVKVHS4ZUK/qrKKLWfVKA9TZbu6m4RrDP7ts3nsE3D/5h7REAPN89o+RdpV15AAm8iqrBspKQxJu757ZkwVL+8vNbAAiLEd+9aUVeHRlWBSuboKo3uLrV78PqJucA5wDvE5FtsS/1FeAzdk59xukNpwMRcKqqTRIoIqcBtwE+cIWqPrOcab8KbKeqC9y147GW6ysaWfOAEUenoD0JYL311lvlcUZPHEW+JU+pO8QLPOIwrkhlzgKc+BOnS7gk6RatRJ2qNkjvEnZyoKq4VnK9JgSy4jskibtK3VDB9HlUfNVT81aM7XZeFXhr9nzeenU+o8aPXOVnNhh49M4avXfyLD2v/A7K+66tPl0qPuG17lnut0VVyeUDRk0Y1c93M3zRV2J1L3Wrf7Oc878HfK9O/y3ALQ1OuwBIi11LXV9DGDBrtapepqo7qOoOEyeueuqts6/9EqdeeBwXPfB92ke1ubHtCywLbypg1BG8pHUuB+UvnWBcxEYPwljv/yHlZlJRRVa79Sg1JVY9H4IADQJL8MpfcCuyi+9ZCp4QDCpEPpmoc0kXf734nyvxhAYfqsqNP7+ltpPEWUnjyjPStBM9lHXDirPo+4FVVZSPV7+c8WuP48uXfaY/bmPYw1qrmy+2WkS+LCJfxroAPeiczc8BHgCeb3ScoXVXDSBfyLH/8R/g9qvvYtmiDkgiSjwbCSNJVEXgu+w31ZEs4ntWx5W40vh13EfSKOsjpZzRp+r7nIiCHil9pZQpneQqbkNlPSYJAUydbxQ1SW3tamp95zX3cPf19/fXI+0XbLbzxj07PVvjO9EnlnW6ucBuLQWkkMcr5JF8vlzEzOppgxpVhv08b/Z8/vjDGwfuxoYZ6rn4Nuj2O5gY6bYXgb9S4Wf+Brzc6CB95crTQ5+gqr2yzKuLrmVd3HPDg5ikXCopbqs26qXnYvt4NTWuO2ndZdqvMX16yrotzmJd5cpjqq3jUSlixsMz2fOwXft47f0DEeHMq0/j2E2/UNPv2qrOVH86MUWPGPf6HgNxZLjz9//l46cf3PSVGIci+tNa3V9Q1W/3xTh9Za0+QlWnqGpOVdfpT8IIcO5Hf8KS+Unaq7ICqhyX4hZVzYHVvuNkP80pJtxlKlFF1bF6+8v730n/rPY4T8qn4EmV11B6LkEYM2k0+x33/uVMNLSgqpzy7jN6cuHa40PVxzKSH5XEUFN2oK8xnrlr33jlLX72mV/10eozJFAai45pRgLaCJrOWj3z8Zd59oEXiNPZeJKEsoli0EtE3ZQrDlptSU5aVZepx4X1RbHVcZXD/Ox5GsdUUbhED+YMCgD4qUgOSSzXziLklia+b8+Poqp1iOfZBD9xEo9sr/FyPh868YOst1mPQIAhjbAU9cjCo0btz7FRJBAIArycE7F9t4kHJrblwo0BzUMY2s/dLvOUMfZZueFNrBQ7VykrVYYVYOhJzAOHptM5/vyUy+la2lXeT3wMkwwu4oiWDc2z+iqrK/QrHAlUfS5nzYEKJ5noLp2xpPa/JG0gEM9zXE6K40uuTwhyYnpNu/gkA9VaY1OnbrjVehx+RnM5O4sIP7r9m/UO2N8KxxF6gfttTvw+g8AZqPyKTrJKwavVY7nucVPG8LlfnNh/NzRcoaBGGtrWRDQdcZyy4SQbr+ugZf2cli2dVdEwUHW8vN9om76OSn8l2qb+cbe6Gt1Zxe+xNlKmR9i2O/XVZ2fz0pOzlvtMhiLe9d7NGTNpVMqIQuUduX2t6a//jtJcPjXvxrZvv7GIp+99tt/vaTiimcVqEZkoIl8Xkctc7PYVLtS5ITQdcTzj6s8xYmy725MUQUkTIXEimdv1PMudlEVeL/Vls/Ju9RAJV+I4S8RZv72KU3kSrVFeR2r+hNtMImWSpxwE1bTUS+KqK0spu/I415dSV4l7bnhglZ/XYMHzPH71xAUV0br8gAUthbYNQ8tEx3FVXR08D3J5KBQQ53UgYC3WifdAoqdQMJHhuiwJRb+gSa3VCf4GjAb+BfwjtTWEptM5XnTqr12iiURJ7w44dxygosx3opk4nSN+RYeYcHDqdHxiPKd/NI6J0TJzgmpFB5kgEcPL+ka/2tk70T962DbnjgdOtGzxrJU6NrbFKsATp+hkriAfsON+2/XPw+xnjJ00mm332orH/5NEhdnnLkFgdbstgdWxFlqthT4fUIlqwvZ5gpRCNAiQKLbvIzb2sZc5cGXmY69w1Tl/4uhvHz4Yt7pGQmlOa3UKbap65qpe3FSc45K3l/LA36fZJKo1LjtlnWFtf01YYIV7rP/SK9KcVO33OK/m+h7z1Lj09DjuiTMCgTUWJQSbKvFyo3dvyNZ7Li+f59CFiHDseZ/oISJXPQmRcttDlIaUW1ONK0/NQFEpYubjDbuwZWgECqg0tg1N3JzOLr6yaCri+P0jf87i+Uk0UE38nYktx+U4OVsHGlRNRbcFWDNoCr6fMo6kuJaEw0zQm+tOjwJf9VDnmFJxUhdxpWhq9GvAi4+9xLVN6uQchRGnv//cHi48xlhuvVw/x5hKWwuvWgpIIorSEGwiimO+84n+upVhiyYXq7+AJZBdIrJERJaKSG3py17RNGL1sw++wDP3zSAuu9RYQmJjnD0bngdUomWc2O171goqUBVk7VxsBJzIFpXFbRVBjMs0bgxS/i+gQjQ1lb06pU8rc0dByjouqS+0YLmhZMzAZvIhDO14sYDndHOqhKWI2678D/sesxeT11/1sMvBQt0vjlGUGM/zQGIrWhsDOacX9j3Uc+/OCBL6ld8kP3bitpaLlilUJTbO0Fdobku0qq5WQoKm4Rx/dfpVdC/rxvr/VV5YOguPOLeasmsP2EzTKVefsnuIVxlH0m4jnufEPK+auCWELzEc1PrcpIpBVY3fw3UoOb9yOWmjRVp0dJRl3qsL+Pult/XtAx0ABLmAC/59borbrlGBpLnu5MerzEGnuPjUtVWsSoryLlvYwZXfurY/bmN4QxvchhBEZDPXvrve1ug4TcM5Tt16fWY8NJMorDaMqFHEs1xWEoIntcdrE+JCte5qZdCQDGGjc6oiRFJGlvL8SeuJTcxUXpc4XZttg4LPups3lxN4gk132ojxU8ayYO6iihEseVeAqE0MIukfiLK7kzXIVCXjSLj/5FzXBvmADd+16tmeMtSBNq1B5svYDGAX1DmmQEPhZk3DOX7u4hOYMnUy9o2ZijEj+aLEpvKF8lPJJ4SKC05CrFLZcHAJastuNy6ixuop3fmJU3IQVLjHxD0oiexIxheBQt4eC3JuLZVxAedWRDmxghcEdmzfL6fzstZye2/veu8W7Hv0XgPxmPscfuBzybQfuUfpuL44BhQtlSwtDCPbdhetWsMdJzY2I3gusKJ24Ntn4tkEItZNyr6jd2wwKdM59geakHNU1ZNcu1edreE43KYhjiLCx796cKXoUuLjmBAwR3BIwtEC3+qhcpbokMvZLZ+zhCgIKpl7cjn7BSwUoKUA+RxSKNjMMLkckrMZqiWfs32By16dZALyPHt+SwvS1lopGuU5cdt3Ywc28wxBUF5nFbfrInrUWbcTPepT90zn5svuGIzH3icYM2k0uxzgpBmpGMwAGxqoaluAUglRkNggxnKU4s4V8dCce7Zl1ymLN2e9xWVn/G7A7mn4QBrcVjBK/brV54vIc67w1Y0iMsb1b+CMKI+77Zepa7Z3hbNmiq1D3W+sbdMQR4Ad9tuOUeNGVBHFRHSV2n1wImvNLaZ1gOUT6xxPI02Ee3sXPcaV6mP1Ij16ZJrRysJTbVSKuOOqu+jq6K4/9xCH53mcefXn8AKv8ixTonLyt7yXPBOoI0JrzbOyl4TFiHv/8mBTlpQY0jANbivGlfSsW30HsJWqbo3Ns/i11LEXU/WsT071XwqciC2dsHGdMfsMTUUcf/Tpi1iyMKk06GpOJzWpHXeROHWXuf3IKfNW9PtSazhJDAN+L4+obFRIG2J6OS/5cU3E+kT8Lud4TO+nCKnjjlXh+WkvcsPPbq4zQXOgfXQ7n/nJUXZHU+8uEaNTLZETqxMXn7QRJuHG00Yxd2je7Pn84gsNR4dlWBEU+srPsV6dKVW9XVUTbfsD2IJZvcLVnBmlqg+ozfZyNXDoKtxZQ2gq4phvzVv3DyyfYSPNPPB8vHJC1Ir1mlyukvYqcf0JPLQlhxYCtCVnozJyAbTkyyJ1WQTPBdDaAu1trj+obIW8PdZSgJaWiojekodWO47m82hbC6a9DTOyFTOy1bqr+F5FxC+4eb1UrWs/cDWvk+S4QhwZbv7l7bz+YsPF04Yc9j/u/eQKzq1KU4QxjtFSybpTFUv2B627ZHWOkXP1iSIIIyhFZWIpfuAyhbtn5Mq1zpj24mDf6hqDlfBzXNW61QmOA9Ip7zcUkcdE5G4Rea/rWxtbqzpB3brVCUTkPSLS7j5/SkR+KiLrN7qgpiKOZ//xi1ashvIXojruViocXdKfcGEJ55H4HzouTcu+idVcCMm1aRedqn7pebzW1Schbr4z3pQt3VKeTgSIY7tbLxqk7LWiLHh9ITf/qnl1j60jWvnhbd/EW+7zrKPDKvuFmkpLz9PAlpW4+tw/9cv6hyUaN8jMT8qguO2yRqcQkbOx/hrXuK65wHqquh3W8vwHEVmVQkGXAp0isg3wFWxm8KsbvbipiONfL/oni+ZZB/eyGF0Wp90XJqkLkyj8a11vanIMrhArdN1JHa8NF0j746XcUip6RrefjqdO6eTqffn/etEtPHrnUyt3D0MIm+20EePWGuscC9y7cs9HEzee9HProautaaFHO+32J7j9qv8MzA2t6ejn8EEROQY4EPikE5VR1WJSMVBVH8EStU2wNarTonfdutUpRG7MQ4CLVfUX2PIJDaGpiON9f3soleXFUY+E24ojq6MyxuqlyslqPSviBj6a8+13T6SyeWACD+OByfmYQFBfUN9Dc0GlAJQT2xPrdvm476GtecyIVrvlfExrnnhkCzqihbglQAsBBjtm3JYnHtlK1N6CthUwLXmkkLMZaAp58L1Khb6aeHGwhodn/vfcQD/6PkO+Jc9P7/6OVYMYg6qizlKt3d2YMMR0dFoxulSCyFmxRVBPSIq1WmLqXLqce08CExkeuuWxAb+3NRGijW2rNLbIfsAZwMGq2pnqnygivvs8FWt4eUlV5wJLRGQXZ6U+Cpt5pzcsFZGvAZ8G/iE2pVOu0fU1FXE87KuH2JrHgvM9lEr4ne+TfElE1YnVat1yfM9mxcn5UMhV0mAFPuQDJO/aXJIuy+oOpeDcfQLnDxn4Vk+YD6xesSUHLXk08JzOMg+FnN3P+WghgJYc2pqHlgDNB1DIgSd4jjh7ng9eUCkm5fSkIp5lnNKpvMRj5LgR7P6RnQf7VawWJq03gV0O3gEbvikVVx5ViCP7oxA53aKpsIWC/WGzRNWUj1WVdRXIt+Q46LP7Dvh9rXFQAdPgtgK4OlP3A5uKyBwROR64GMvJ3VHjsrMH8KSIPA78GThZVRNjzmeBX2MrC75ItZ6yFocDReA4VX0Dy2me3+jtN02EDMCeH9uVv/zsZp594PmyaJoUZUrCpRNRNaktXRZdoX5bdZ5WXIAk5S2SFtu8yvnVOsT0vhvPtcl+clxT3dWuO1TpHHtK2cJaG09h0noTVu9BDjJ83+fzF5/Ag/94jKgUpSKcACT1bFJfuvI70Or9NAQ8Ed7z4Z3ZZs8t+239wwqryBX2GGYl6lar6g3ADb0cmwZs1eCcb4jIDVjOE2A+cGMj10KTcY4Ap1/xWdpGt9usO6qoc9VR1Ko+Eh1kkkiiVHIciXvLSY2WhAjFcUWnrFRqk7iIG/U9VATjW7HOOHtBWRftvsDqInbUAzzB+KC+u04oi+smEAgEk/PQnI/JOU41ibZBykYjTVx5krWpMvORF/n7Jc0XZ12Lce8Yw0k//qR9ZomeOIzAxJhiEY2NTYprYvsu47j8zi1q9LnuQY1bexwn/uhTg3JPayQaN8gMOYjIiVjOM6m+tja2VGtDaBrO8b6bHub8Y37B+LXH0rWsyzEVBhHPFmxyLj0S+GgiMvtOHFYqPwM5H/U9K3ILIO4R+B6KIrFXNhAAVs/ooKqIcYYD33GGgSWemvdtJhlHYLXgY0TAd/uBJZKeS1AujtgVFofEkSEIAogM0tUNUYxELlNNFJVbVSWODH/+2c3sduhOTVd0Kw1jDE/991mnG3aJf0XR0FruNe5GggAtAbmg8k5iK06LwWVSl7K/JMCS+UuZ+9KbTFxn/GDe3pqDIUr4GsSpwE7AgwCq+oKITGr04qbhHK/94V9ZtqiDV599DRMl9arF6h6h4s+YhJWVy3pWZ4DRRIeXkm0lOV4vqqV205rjLsegJs7iAnhYQum4SKsTlbJRwZ4veLETn50je9mIFMU1Lj3V+oAl85c2ZemENOa/9jYP/H1aTa/UtNUfgeova80xEaHUVeLGC2/pm0UOd1jRqF+t1f2MoqqWkh0RCVgJct8nxFFE9hORGS7e8ay+GLMWO31oO3KFgHwhZ3VUPVx54qq2nDi11qUnOb92gkS0q+1fkSuPOrk3fZ5J9btB08JgeXPcp/qe40ZdeF3g1ygbU3pLIMj7bL7LJstf1xDH6AkjmbBuwt0tRymcfrZOF1y9n9LlquIHHjvsu03/38AwQX9aqwcAd4vI14FWEdkbuB74e6MXrzZxdCb3XwD7A1sAR4hIn+f1/9Q3PsZvnvk/fv/KJYyemPIHTfRNCVGMXBtXiKImOkLfiuBEMUS2dktZZWJMJUY0IUZGIYydKGcPxoFgWnLEOR+T94mdHlFVMXmPqOARjQiI8kLUKpRaIGwVwhYojvIojhTbjoDu0R5dY3KURucIR+aJ2/PEidW7tQVpyYOIFcFJFips+8FtmP/aAu6+/v6UDq65UGgt8IN/nk2QC0gcuzWOUTVoFKNRjAlDNIrQYgkthWipBGFozzMGE8WVH0OHbffaigNO3HuQ7moNRBPrHIGzgHnAU8BngFuAbzR6cV/oHHcCZqrqSwAici3W6XJ6H4xdhSlTJ3P2Ad9n2dvLqIp/Rm16MMGG5QmVdGVeJdu3zYKD84NUPFUMtta1dZdUZ2BxLIr1tLKTi1S7DiXisRPH1bfjaq5yTDwgEDSAsN0l0Y3tuo3v48WKiId0G4IQ1Ivwi4F1RQoCW+zLpTHzUFQMGhseue1xHrv9cfycT9fSLvY7ruEsTEMKU6ZOZs9P7Madv/svSWSMuEdfVnjUcotpJH1i32uhNc9R5358gFY/PDCEucIVQlUNcLnbVhp9IVavDcxO7deNdxSRk5K4y3nz5q3UBLOmz+b095/LBSdcytP/e44oinsmr0lcetx+IxEV9aS4Hq475bbGJSjtAkRN677Q7rKeKhln8S5/Thau6f2k8BTlNjnfxIYoiil1h/z9V3ewbFFH4w9zCMHzPI7/3pHk8kGVaJxue76MZLf2Wyu0jmxl7OQx/bXc4Ykm1jmKyIEuPvvtVakhM2AGGVW9LIm7nDhx5WqhXPy53/DEXc9w62//TeeSLqvDS+kcFTBJlEUYAWqTFEDZmVi6Qysax87qmVibjbExF4470di46Jme+mh3I5ZAgSOAlX0jEKOYAKIATABhALEPsa9EeSi1uH3PHo9yELV4FFs9ovaAqMVHCzlMYHMX4vmoV53qK9nUKC8+9hK3Xfmf1Xk1g4qJ64znlP87xgkANXpkYy3TGkW2dWI3uOeewEXLLHxzEZef9fuBvoU1F42K1EOXu/w/4GhgvKqOUtWRqtpwjHZfiNWvAeum9lcU77jSmLT+RPyc70qyAnjlXICIFZElcNl4EqOGYHWLeZtWXwCiJMEqrpgTrpiWulKpiqhiwhgKflnfl4bEiolivFYniifGlMCJ0wXBeIKHJZjRKOvrGLeC8QAPIgUvglgFaYdiLBRaPIqhoa3gE5ZiWgIfLYV4iTsPWL2qOq7Kua/EkeEP593Ajvtt15SuPWEp5K4/3ee47eS32hJC8X0Xcw4aVesWBesNoCkfxyAfMLnJHeSHHIYu4WsEs4GndRUV833BOT4MbCwiG4pIHvgEcFMfjFvGV359CuPeMcbtpVxmUh8k8UdMXHXKuRPt+erVsP61MjWUObOaoWuuq6g5q87zbJy2jf91p+awHKqfWrb0bD1XUNGPbOuVnGtPKbJtXGNxT7LSuP/czqVdTLvt8TqLHfp49dnXmH7f89Wdtf/KPSXo6tZh6rvW46Tzj+rD1WWw2dhXvA1RnAHcIiJfE5EvJ1ujF682cXTJKk8DbgOeBa5T1WdWd9w0fnX61bw9d6Gb0CTzuqN23zgxumy9TA6XXXtq+H9NnVROTEflC7c8cUGpJq5uXwxVxFZceLBo6nSsiO7SJdg2sJ/jwIr6Ju9q2OQcwQ9qfDal+rUF+YCtdt+sl8UOXXQu7eKrH/w2UcIZr5Aq1nSnWs/3OPjU/SoSRYa+QXOL1d8DOoEWbAx3sjWEPomQUdVbsGbyPkfH4g7u+csDxFHNz1NaB+d7rvaxZ7PC+b7dTxy1gwCJY1uDt8xVKsRYn8kk0QFU6rcUne7SESJNrNxOjKcEkvNRiSHw0Vjt0zSgOSH2LOcoJbUW7BjIW32jBkro2V8mCcEzglEl3y10xULQ6kOYIxcIlFqRUmjvp1Ry4Y3V/5E77LMN79x2g/54/P2KpW8vs+V2y0QuuS/nAWBMD2Kn6V8ZKP9YTnQ+k9d87wY++qUDaWkr9Pv613QMcR/GRrCWqjYUh10PQz5C5vzjLuHtuYvsTuK6k7jouGw84klFrA5cdp4kKWo+XyaSIiAuBFCM2hef1LtOhgdQxYuMdbVJkkAgVoRwMdrie245Hp6Cp84fMeeyBgV2Tg+rfySwg5dz4+Ysx0jOit3aKkRtYNpseCOFHJrzkUIO8X0kFyBBgJcLXMZwr/wsHvrnY9xx9X8H6I30HSatN4GPfulAJq0/ge332dp2lt+V1OUCy55W5Q77Lzxv9gJ+euIvuea8G7jkC7/t/8UPFzSxtRorUu+zqhcPeeJoYlP+MqRfQZXnS+3BtNhVr79R9OJFUusKtMLxV/C/Uz5cu97lDZgS/8NSxF8vuqXpikuJCMd//5Nc8/KlfOlXJ9sSCmWs4sNEMWboKsGaDs0tVp8C3OoqGQ5dV55VxelXfJaxzhiTzhRdLs6UCg9UxEZUxKZi3ezqriROTWBcbRJjoJiqTVKuWeI0gqo2CURsoBiW+0QVKUWWqwyte5BXjJBICZbFNolCqDbbTOzE9yJWtI6wisbY6R59JU7cfXIQ+RC2CWEeorY8ceCh+cCK/rmgYslJq0+NMmv6bO760339+Cb6F5PXn8hpFx1vGUF1GZfi2LZG3b6pJDvGnpeI1RPWGcepPz+Wj33lIE752TGDcg9rIpo5fNC57niq2roqrjxDnjiOGjeS3Q7egUJbAT/w8AKfMuek6upYO4IRx9YtxxjbldQeCaOKMcMYRwRtMScphUhXyYrZoc2GI6XI7uNefhTjOV9J5x2JiOCFMUExwuso4UUGvyvCLxnyi2P8UAm6rSXaKypBCEGnE91jsWJ4jM1E7ivkIC6AaYOwDUrjArrG+0Tj2wnHtiH5ApIv4LW04rW2lpPjJhARprxz8gC+mb5Fd2eRGy+8xepuxasQ/3KMvGNRtPJjmMb8OW/TPqad4847kvZRbQO27jUa2nfW6l7qVo8TkTtE5AXXjnX94mpSz3Q1rd+duuZod/4LInJ0A/OOFZGdRGSPZGv09oc8cQQ47aLjOe/vZ3HlCxcxdtJogIo+qrYudW1pgVTBLaBnDZlyCFpPjmy5SOnDJNGFevVawKkHNVV7K92KutPcP5nnbElBySaA9YqJn2MqV2VqsZ7v8f4j30u+JcdLT85q8AaGFt6cNW/FlRVrXXhSrYkN//7DPf20umGMvhOrr6RnjemzgDtVdWPgTrcPNk9DUpf6JGyhLERkHHAOsDM2bPmchKDWg4icAPwX60nzbdee29BqaRLiKCJsu9dWXH3un1k03+rVymFmJq623tbLwuPE4x7xgeX91HVJfzqJaro/4Uarzsf2x87QEykSKxJbA44YwDh/RvdZU20SjWMcU2wClx+j4Fx7WvPWT9O59Egu556LfX0mNtx+9V18bb/z+PyuX+eRO55Y9Yc9SHjHBhPZYIt1l39SrQ441fqBx77H7NVPqxvG6CPiWK9uNTYHw1Xu81VUalAfAlytFg8AY1zN6n2BO1T1bVVdCNxBT4KbxheAHYFZqroXsB2waMWrtWiaZLcArz3/OnHJudgoNqltbADPEqvAt5EVLou2+F4lo04U2cS1ZQ9u55IjLodinHCa4rKAUy7fmkCSjD4uQ7g9bt2BRNVakSODF3hIyWByHlL0MQVQ40FO8BWCQIi77FxxoGUp0jMVeq2AekLsg+Q94pEt+N0lW0gsEij5EGrZbUljJYxtyYFbr/g32+61FX7iH9kEKLQW+OpVp/HZ7c8gTDjlBJr6IRKp3ncYv9Y4tt1rlb02MvSCldAnThCRdILOyxoozzrZFc0CeANI9EK95WtoKI9DCt2q2u08Hwqq+pyIbLrCO3FoCs4xwecuPp7WkS3WzcMVoRLfEbwk/tiz4YLlJLiJyJuI1YnTdrqKYeL2k2Saxl2TcIhxXDHgOIOMJ4KniufcgrzEHcjzEMUSwVgJDAQx+EYIDPgIXgx+bCNigljwQyEogR+Cp7bfA4KSwVfBi9TqWkVc8amYpOCWeBUibW9Huf+madx9/f0D9l76Cutvvg4HfGafqpzDCUSw79zzyveexoLXF3LRaXVLkmQYGKxy3WoA1VoxrU8wR0TGYEsj3CEifwMa1js1Fee4bFEHURIJk9LbVxerospYkxzXcn+F7pXzpNb6BVWNs5zjNUhKH5SLe5VljpQ+s3a89L9Dj3+N3iaS6vXVGCcUbKabJoMxhkVvLq66Hc+3JRSq/Z2qj4MVq6tdgTL0CfrXEv2miExR1blObH7L9feWr+E14H01/Xf1Nriqfth9PFdE/gOMBm5tdHFNxTle+pWrCLtDl3ghrrh7GJso1cbgxS5JbYhxRZpM7I5HsU2WGrlok9jYkqCJ9TqO0VLJJlvt6rYZfopF547jXHyKJSiF0NFlr+0uWgt3ZxG6S8iyblsLJoqRSPG6IrwuQ25xRNCh5BbFeJ2K32GQInjd2CiZoiIRSLciIRA5Fx/U1tSODSpJkovAlWfoWddaRNjr8N3Y8j2b0rWsazBe0yrj1Wdf476bHq7qaxvVytHf+bj9wYmtm1RZYYt1JD/72i9xzHc/wRcuPXEQVr0Gow+t1b3gJmzWHFz7t1T/Uc5qvQuw2InftwH7OAv0WGAf19cDIuKLSLnAu6rerao3pcsmrAhN81N77Y9u5JVaS2yiG4ydGG3UVfCjIl4DhFElogTAxOV+PHFFrBTVyH7xSmHluO/ZbD4ua0/5lzSfg25TGT/wLXPTUkDDLgg8DOC3FjASkWvPYZbEmLYAQ4zJC8aLKY1OInogyR7kxUrQCV6oBAnR9DzwrR5VjVUrlCFAbMPt1Ch3/uEe7vzDvbS0F/i/e77L+isydAwRjJ8ylkJLjlJ3qfycly3q4Nof/tUGA0DlnSp4gccHjtydPT66y+AseDigjzhHV7f6fVjd5Bys1fmHwHWuhvUsIMlUfAvwIWxt6k7gWABVfVtEvotNdgPwnVQ96+plq8audMt6qvrqqqy5aYjjfX+bhkm74TidU+LSIy7rTlUqs0aQyNfl/QYX1KtiLMXFJWJ9OUOQlFWgHjbRRCLae25qD5DYJRMPrSuPxMalXOtZAsLNVGkU4jC27p2+xwuPvtw0xHHU+JF89+9f46sf+DZhMSzfT3dnsfpE1z9x7fHscvCO3PWn//Hej+2C7zePAaoZkPj59gV6qVsN8IE65yq2cmC9ca4Armhw2rHAMyLyEFDOCK2qBzdycdMQx49++UC+f8T/VTiI2lg7Yyz3qDYNqqizYpf1euroYKJwdP1JQflkzFo9YBpV+kFj50/OTyoHxnGFazWuX60FXFTQ2GWcMNYAE0dqa12Xb8vuq1FMTqAT1Hf3mQtAitalpxRW6x7LH7RMM8dMGs22ezVXcfuN370hW++xOU/+dzrj1x7HGy+91fN9uP15ry3gC7udTa4Q8MRdz/CFS08a8PWu8ehfnWO/wFmmi8A3V2ecpiGOe35sV278+T945n8zbIfj+DRJVJtkj1Zby1pj46r52ZrWJgk39FIJbAXrFmOMqx0Dilrx3NWeMbHzj/R9W0LVlWKl21Q4N2umtoS3FNp6y75LjFEKrb6slMPzPLTD6grjnAe+R7DEEnCTE+sErs43MjJ4qhBan0lKERI6fWo5WsRZ042mdHFuSQIbvXvD6mJkTYB8S54f3vZN4jjmqnP+xB+/f2Ov55rIIJ4QdocsSFLaZeg7aN9xjgOM+4F3Ayeo6qdXdZCmIY4AX778FL6w29ksW9xBwi6VRdYkUW0iZvtJ1hp3vFylLqV7VEiHo5UzbJNmONUNn+ZSU14HybyeVHwjjRODjSAY1LfZxhWDxIKqIRBBjStg79vsPQnEKJ6x4jUGvFKElxiPEnejlKm9XqJjBR6+9XHu+9s09jxs15V/2IOMV56ezQ0/vbn3E8SK4e/7+G7Mm70gi6fuLzRnDo+8iBwJ7CYiH6k9qKp/aWSQpiKO6222NlvtvhnTbn+CqBRbV54kvrrGtafs4pOSvqtqbdVx6albk6t8PJknpaMUAE2J6okCMS26K+IIWNnVx7U2NCa136vuM+WLpHWO96oGUNpHN2ecceuIlio3Kz/wMca45wa5XMC7P7A1n7v4hMFe6hqNJuUcTwY+CYwBDqo5psCaRxwBvnndl/nkhqew6M0l5ei+cgJY9UGNZQbDCAp5m7VHPMshKqAxJvCtKO1XdJRlXaExNgOOia2obdSNn/TbSByMsY7lqrafGHwPiaJyv+TzaBQjJrDcXuCDFyOBj/oxXj6AUlxmcCXn26AdAYqxy/oTA4oJQ7woQl3iW03E/YTzFbEPwj0LP/DZ/4QPssM+2wzCW1p9rPXOd3DqRcdx0WcvJ44MYyaN4rDTD+bXZ11DVIqYsM44zriqrs4+Q1+iCYmjqt4L3Csi01R1lSMDmsrPEeCqc69jyfxldqccP40lknHsYq2di08UlX0biSvprUhyRCbpyeIkOiautElkTOJmA+64E2+NWgKchCa6LD9EsW2NQbuL0F1El3YgSzuQRUvwlnUii5fhL+3GW7CMYGk3/uIucgs78ectI7e4m+DtLnJLuvAXd+Iv6cBb3IHXXXKEMYLYpUtLifxlVyXXF4cxt17xb2Y+/vIAvZm+xcK3FnPF1/5A7PSK7z/yvbz3IzvTOqKFXCFgn2P2IpfPDfYy12zoSmxDEKtDGKEJieNj/3rSWqzL0SrVLjW1rj3Untagh0/qypVeY93rEh+eqj6pXldZF6qVNm09r02qUdZ7UrdVVV55Oh2K2jyYdtvjdC7pBGDkuBHsuP92/O9vD/PVK0/j8DMP5eOnV3tjPPqvJ/nHZXeUI6gy9A2aOZ/j6qLpxOqjv304PznuEiZtMJEXH3uFuOzaUyE8io1/TtR0lSQ8WoncS+kJy/3l0L90m3IBcgMl/SkqVFFUprMBpQ1CCaeX9BsbH61xmiDGldtIuNy0ZTpdUdFEVl1Q8QGq7LulvWODSWzfhGL13Jfe5Kcn/rJcN2jZwg7O3Ps7+IFPHMXk8gGvPD2bc/58OgCP3vkU3zrkRyjwwqMv8cVffmYQV7+GoQkJn4i8R1X/l3LpWSU0HXHc+YDtuf7N3zDz8Zf58h7fomtZd+WgVCy3JpVAwqoMxUnIVgdZG+duHGFTRzSTEqvGOV6XCa3nWcJrEj/HlPEFHLETxHMcTLk0rHNaD0M7mLOmSy5AkYrYn+gxE0t6YtyJDKrGivKO+KmqDYXURK9QeRT5lhwHfmZvzj/2F6y76Voc//0jybfk++Yl9DOKXaWyEQzsuxQR4sjWro3CmM4lldDI7mXdIBCXYjqXdvcyaoZVwRAuu7o8XAhsT8WlZ5XQdMQxwQUnXFpDGF2T+CuaRB+XuijJMGvPqB4wLcpCmZOsPgek6voa7rFyZUoULn9IrSF1qWK5yMTVSNLXOMKYEM7I+Tm67OcaRal1V5bp+R47fejdPPnf6Uy77XGevPsZttp9c977kZ1pBqy/xTocefZH+d23r8fEhhFj2jnsqwfxytOzWX+LdXj12dc4/gefLJ+/8wHv5uhzD+fV517juO8fOYgrX8MwhPWJK0AoIpcBa4vIhbUHVfXzjQyyWjpHETlMRJ4RESMiO6zOWCuLieuMJ0gyz6RcdjSdwDa9n6JjvbbUuW55/YmVvGqc2vnqHMddlxbDy8rt9H6KyJZZ19Q5PfYtTGyYfv/zjBw7wnKLCmMnj6ZZICLs/ek9yeUDCm15ttp9M4782kc57aLjufcvD3HvjQ9VggGwbj6HnX4wX/n1KeVM8RlWH7IS2xDDgcC/gW7gkTpbQ1hdzvFp4CPAr1ZznJXGOX8+nU9u8FkWvP42SXhg4jeoZaLiuMjYubyol9IP1hg7EpSvTZ1XiTUEE6GJa1A5d6RUODo1iOdjNEbUA41txIxRxBdMZJPxEsWIJ8TdNlejxtYViFAR3/r0CeoM71opLOUs6naJKQt8ArfUZQs72GK3TdjlwO2ZtP4ENtp2w355D/2FyetP5PKnfsqzD77AHh+ziSVmPvoyc55/nVJXib9edAt7feI9g7zKYYAm5BxVdT5wrYg8q6pPrOo4q0UcVfVZqIiyAwk/8PnQCe/nD9+/kZb2At0d3bSObGPZoo4UQatarcvG05ujNZQdJ6v2UyeWo2kSY0liXHGnOQKmcVwmlEC55ovGWH0nWAIY2SzlJopslh2XLci4xLrl2WvWVSaUdTJiJ3kcC615Nt9546ZJOlEPU6ZOZsrUStGw9bdclxFj2onCmD2aMOqnGdHklugFInIjkPyK3gN8QVXnNHJx0+ocAQ45bX+WLupgq90356n/TmebPbfkx8f+winoeyHYfU7H6w/Y6zRpkbucxFXq96/kP6bne7z3Y7tyyk+PpqW9hZa2wsoNMMQxfspYrn7xYpYt7GDs5DGDvZzhgeYmjr8F/gAc5vY/5fr2buTiFRJHEfkX8I46h85W1b81uEhE5CRsJTHWW2+9Ri9bLs459MfMeHgmf7voVjzf42+/uBWvnD7fZcNJOUb3QK2I3SDEE7Z9/1Y89q+nqPz3pAeo15eak9SayiqBZN8RyuVZCcuEs5qCGmO49y8PsssB26+xImcun8sI40BBm9ZanWCSqv42tX+liHyx0YtXSBxV9YOrsqo641wGXAawww479MnvURy74u9o2bKsCVWpJTqVhVAJutYaItUYPN9j70/vydP3PEsUxm7utLiuVs9ZD2VrulRZrDWpklhXH1ptSbceRIJ4FU2BiOB54lwom/s/OsMQQh9xjq6w1Z9SXVOBb2Hjn08E5rn+r6vqLe6arwHHAzHweVWtm/V7OZgvIp8C/uj2jwAWNHpx00XIpHHODadz4Mn78JVfn8IBJ32Q03/zWQptLcu9RkT40i9PxPN6EYdF+PLlpyyXk4zDmF+f9Xu+87ezOOCkvTn63I+Xa5m4UZazgjoEO+mvamuGSl0jCNvutSWb7rgRCHiexy4Hbc/HzziUE3/0Kd53+G7LmT9DhsbRVxEyqjpDVbdV1W2xPoidwI3u8M+SYynCuAXwCWBLbPnVS0RkZbMZH4fNLv4GMBf4GC6reCNYLZ2jiHwYuAiYCPxDRB5X1X1XZ8yVwYS1xnHahccDsN+x7wfg33+8l+n3zaDUHZIrBITFyOagdTG6o8aN4IOf3oM//+xmXnthbhWX5fkek9efyN5H7cFvv/EHOpd0EZYignxAVIrI5QPCUkSukGOdTdZih322Ycv3bMrndv66zfvYiGxesbLY82tpYr22B/OrPPvACxz6+Q/x0pOzUIUDTvggOx+w/Uo9vwwZVoj+0Tl+AHhRVWctx5h7CHCti3B5WURmAjthHbsbgqrOAhrK+l0Pq2utvpEK9R8S+P4tX+ehWx5js5024tkHX2DzXTbm0+88lTgqISL85O5v8+A/HuWCu87lE2tVh5mZ2HD5UxcQ5AKufP4iHrvzKdbfal1u/fW/OejUfXnxsZfZfOeNefbBF9j5Q9bx/vmHZ/LazLlOFNb6/0y1onLZP9KdX/d4nTaF7s4iXUu7OP/Oc2lpL7DhVn2jx82QIY1+slZ/goqoC3CaiBwFTAO+oqoLsfWoH0ids6Ia1X2Ophar68H3fXY9aAfGTh7DbgfvyNhJYzjgpL3LRpTzPv4zfnT0xZy09Vd4/yd3R0SYuM54RGCvI3an0GotvG0jW9lxv235wq5n89eL/8m5h/7YjufG9QOfRfMW882Df0QcWhec0RN7cUB2uSDHTBxFrhDQPrrd9VeOV+9X2iAfVIX95VtyBIUAFG65/E4WvP52Rhgz9A8UV+qjgc0WzpqW2urWrBCRPJabu951XQq8E9gWK/pe0E93s9JoaleeRnHKBcdw1Dkfp31UGweN/DTFziJhMeTAk/dBjXLo5/Zn3c3Wpn1UdWLYUndIx+JO4ihm7stv9hh3yYJlxJE1yLxjw0l849ov8eX3nUOpq9QjgcWYSaO59JEf0zaqlYf+8SjnH/sLil2lMlfoeYIxWmEinU70Qyd+kHHvGGND6YzhsNMPJiyGXH/B31FjmPvSWz3WlSFDX0BYKc5xvqo2EiW3P/Coqr4JkLQAInI5kKR/76129YBhWBBHoEz4zrz6NK785rUc+rn9OWvf8yh2FLn7uvv5R9c1Pa4ZMaadk396NDf/6g6OrxOzu+6ma3H4mYfyv78+xGf/71g2eveGfPhz+zPt9idYb7O1mT3jdUaObefx/zzD4vlLuOCES/n+P77Ozgduz5bv2ZRH73wKgNETRjFxvfHMfOxlAMatNYaNtt2QKIw5/KsHk2vJM+PhmcSR4aBT9kWN4eWnXiXfmmfvo/box6eWYdij78XqI0iJ1CIyxdWkBvgwNuoObO3qP4jIT4G1gI2Bh1ZmIhH5hqqe5z6vdIYeqVd/pL+xww476LRp0wZ83locOu5oupcV8QOPvy/7PZ7X91qGZx98gdPffy5qDDvutx3fvvEMOhZ3cNZ+32PGQy/g5wL2/vSebL/PNpx/7MWogYM+uw8n/+ToPl9LhuEDEXmkQU6uV7RPXFc3P+RLDZ37yG++ssL5RKQdeBWYqqqLXd/vsCK1Aq8An0mIpYicjbU4R8AXVfWfjaxFRM4E/gtc6qzjiMijqrpSGXqGDedYD5dO+zH/uPxf7HvM+/qFMAJsvvPGnHvD6Tz/yEt8+PMfAmDa7U/y8lPWyrz2Ru/g1AuPJd+Sx8SGt+cu5KDPDpjBP0OG3lHHU2K1hlPtAMbX9PVaHVBVvwd8bxWmeg4bFTNVRO5x++NFZFNVnbH8SysY1sRxytTJnJBKfdVf2HG/7dhxv+3K++tsMgURId+a5/2ffG/ZCLSmRrVkaF40aWz1IuDrwPvctjmwD3CWI5ANOQIPa+I4WHjnNhtw5fMXseitxbxzmw0GezkZMvSKJg0f3BcbffNO4KfAk0CHqjbsAA4ZcRw0jJ8ylvFTxg72MjJkWD6akHNU1a8DiMgTwO+w2cAnisi9wEJVrS3XWhcZccyQIUN9NBgaOIRxm6pOA6aJyCmquruITGj04ow4ZsiQoXc0MXFU1TNSu8e4vvmNXp8RxwwZMtTFSjqBD2msSkbwjDhmyJChV4hZQ6jjKiAjjhkyZKiPPvZzbDZkxDFDhgy9okldefoEGXHMkCFD78g4xwwZMmToiTXFILMqyIhjhgwZ6kPpvTjdMEBGHDNkyNArMp1jhgwZMtRgTfJzXBVkxDFDhgz1ob1VyhweyIhjhgwZesVw5hzXuAJbGTJk6ENog1sDEJFXROQpEXlcRKa5vnEicoeIvODasa5fRORCEZkpIk+KyEpl8e4LZMQxQ4YMvUK0sW0lsJeqbpsqqXAWcKeqbgzc6fbBFuLa2G0nYasUDihWiziKyPki8pyj7DeKyJg+WleGDBkGGwrE2ti26jgEuMp9vgo4NNV/tVo8AIwRkSmrM9HKYnU5xzuArVR1a+B54Gurv6QMGTIMFawE59hI3WoFbheRR1LHJ6eqD74BTHaf1wZmp66d4/oGDKtlkFHV21O7DwAfW73lZMiQYUihcWt1I3Wrd1fV10RkEnCHiDxXPZWqyNAxAfWlzvE4oNfSiSJyUvKrMm/evD6cNkOGDP2FvtQ5quprrn0LuBHYCXgzEZdd+5Y7/TVg3dTl67i+AcMKiaOI/EtEnq6zHZI652xsbdlrehtHVS9T1R1UdYeJEyf2zeozZMjQf2jUUt0AcRSRdhEZmXzGVgN8GrgJSIq0Hw38zX2+CTjKWa13ARanxO8BwQrFalX94PKOi8gxwIHAB1SHscdohgxrGASQ1TO2pDEZuFFEwNKdP6jqrSLyMHCdiBwPzAI+7s6/BfgQMBPoBFaqcmBfYLV0jiKyH3AGsKeqdvbNkjJkyDBUIH3E76jqS8A2dfoXAB+o06/AqX0y+SpidSNkLgYKWOUqwAOqevJqrypDhgyDjywT+KpDVTfqq4VkyJBhqCGLrc6QIUOGuhg6jjUDj4w4ZsiQoXdknGOGDBky1ED71FrddMiIY4YMGXrH8KWNWVaeerjsjN9xyJijuO4nf1vxyRlWGcYYfnL8JRw69mhuveLfg72cDHUgqg1tayIy4liDYleRP//073Qu6eKqb/1psJezRuOtV+fz7z/cS8fiTq74xh8HezkZ6iHJBr6ibQ1ERhxrEOQD1tt8HXL5gM132WSwl7NGY/TEUYydPJpcIWCb92052MvJUAsFTIPbGohM51gD3/f51ePn8/KTr/LObTcY7OWs0Whtb+HK5y9k9nOvM3Xr9Qd7ORlqIKy5InMjyIhjHfi+z0bbbTjYyxgWyOVzGWEcyjBrKFvYANZY4jj9/hn85ut/YPNdNmb6/c+z5W6b8cx9z3HgSXvz/iPf2+t19974IDf838188uyPscM+PUJBMwwQVJUbfnYzD9/6OJ/5yVEZAR0MJGL1MIUMRiKdHXbYQadNm9avcxyx3meYP+ftHv1+4HHDvCtoHdmK51VUrsYYTGw4oO2TmNhQaMtz87JrMMbgeV6vbS2MMYgIqlpua89T1ar+2v3hDmMMLz05iy+85xuUukq8c9sN+OWj5w/2spoKIvJIA8lnl4vRbWvprpuc0NC5tz3x3dWeb6hhjeUcx04ew8I3FxOHcYpYQRwZPr/b2cx5fi57H70nX7n8FH7xhSu46ZLbWHeztTCxJW7FzhInbPUlZs94nXU3XYvZz7/OOpusxZznX2edjdfi9ZlzOf6Hn+RjXzoIsFbusw/4Ac/cP4PJ603krdnzmbjOeBa8/jZf+c1n2evw9wCw8M1FnLXvebzxyluc/ccvseG71uPMfb7LwjcXce4NXx3WholSMeRbB/+QJ+56hgnrjKPUVQKBl56cxe1X38U+R71vsJc4/DCMdY5Nz6qoKtPvn8GyxR08c98MOpd2AfDTu79DvhCUz7GtvebVZ1/DxIbbfvsflry9lL/94jbUKK9Of63q/FnT52BiY9vI8GrSPjuHKIz5w/f/QseSTp65bwbPPvgC0++fQVSMeO2FuYTdIa/PfINiZ4lrvvtnFs1bzAuPvsSDtzzK7Odfp3NJF3+9+J/cc8MDzH35TZYt7ODmy+4Y4Kc3tPDaC3N56t7niMKYN1522eIV1Ch/vuDvg7u4YYkG3XjWUALa9JzjT467hLuuuw8Tx3ieR0t7gd/OuJBR40ay58ffs1znYkH4xDonI56HxnGP4+1j2uhc2kXriBY6F3f1OL5sYQcfm3Q84gkaG6Kw5xgAs2e8zhHrfAbxPExsiKMYz/d45zbr85uv/4GoGOEFHjsfMOCleYcUJq03gTGTRvPWrOoyGiKw+4d3GqRVDWMk1Qf7ACKyLnA1NumtApep6s9F5FzgRCB56V9X1VvcNV8Djgdi4POqelufLKZBND1xnP7A81b8AiAmjgz//fP9LHjtbfY4bFfuvOYewmJY91pVJSpG9ttXA/GEb1z7Je67aRpbvWczfvjpC1FT/Y+iRolK0QrXaGJjjX4a2/TKwFa7b0apKySOLEHdef9388FP7tHwfa9pmPHwTB64eRof/dKBXHb6VcSRsc9KYe2Np3DUuYcP9hKHJfrQlScCvqKqj7pyCY+ISCIq/UxVf1I1r8gWwCeALYG1gH+JyCaqWp8D6Qc0PXE8+YKjOfcjP7Zcm0Icx/z85Mvxcz5xpPXoXjV6Oa6qfG2/7+EFHn+/5LZez2sYqf+xlhEt7HbIjlxx9h8wkaF9dBtHnfvx3q9dwzH/9bf50h7fdFy1QTzBDzy23nNL5jz/Op/9+XGDvcThi77LBD4XmOs+LxWRZ1l+qdVDgGtVtQi8LCIzsQW57u+TBTWAptM5zpj2IqfudBaXnfE74ihmxJh2PN+vEB8FkDLnYbvFcoeeh4gHfgDiUaZ4Qvl4GW4cE5mq/R5EUqSK8xRP7NhJv9Q+Yo8gF/Df6x+g1B2iKEE+4HffuZ6vfuDbzH3pzdV+Rs0GExvXJrphxQ98jjr34/xh1i/Zcd9tB3F1wxgKGG1sa6xuNQAisgGwHfCg6zpNRJ4UkStEZKzrG/S61U1HHC867dc8P+1FbrrkVp598AUuOOHSlFhNmTCJ5yHiqKMIIm7fdy2UCZi486tQy3ImBI8UUQV7Xfpc8dxhSZ1XPdayhR08++DzZYK+eN4SHrh5Gk/c9QxXnXsdURhR6i4xXDBp3Qmcc8NX2ffYvfj0tz6G53mUukN+euKlqCpdy3rqezMMBFbKIDM/qS7qtsvqjSgiI4AbgC+q6hLgUuCdwLZYzvKCgbm3FaPpiOM6G0+hpa0AwEO3PsbsGa9X0x6tcB9lCGhCiZSeNKteW3tezXjlcVV77teijkhe1l+6xsTW1/Gua+/lsHecwGGTT+DRO5/qeeEaip0/9G6+8utTOOAz+5BvydHSVuAdG0zi5O2+yofHH8tfL75lsJc4PNGH1moRyWEJ4zWq+hc7vL6pqrGqGuByrOgMzVC3eqjhq1eeyuFnHsr5/z6Xf/3uv+7luIOSEnvLfYDnp7g79zIFy016XvlcwYnWabEYAa3lIqtFZiG1b7TMmZa5Uc8Hz0cCq+IV33G3vlcZz601jgwdizvpXNrF3y+5tY+eWvNg/JSx/Py+7/HRLx/Ih076ILNnvE4cxvz5pzfX/+HJ0H9QIDaNbSuA2C/Fb4BnVfWnqf4pqdM+jK1lDbZu9SdEpCAiGwIbAw/11a01gqYzyPz0hF9y9/X387vvXO+IULXOz+5W+r1CzrrqhKH7hXOitGfSF6BqQLVSMyP5IvoVTlTSesny99SOKUEixqsjfOIkerc2r1p8F9+3Y9awlZ4HQc6n2FniwVse5eZf3c6Bn9mnrx7fkMfbbyzki7t/gzg0RGFU1kcueO1tzj/2F5xx5WmDvMLhBAXts/jB9wCfBp4Skcdd39eBI0RkWzsZrwCfAVDVZ0TkOmA61tJ96kBaqqHJiOOieYt5+NbHKHYWK501Bg9JcWGuw7aq1f01SCTp1EBV4kKZG3TRNtVXpueV5V5fdZnRahFeYd3N12GtDSfxwM2PEBYjbr/6bvY+ak8KrYX6C29yPHHXM9x9/X1sseumTH/geSauNZZiZ6lMFME+uyiMeeWZ2csZKUO/oO+s1fdS/9vXq75EVb8HfK9PFrAKWC3iKCLfxZrcDfAWcIyqvt4XC6uHH3zy5yyev7SXxVBN3RLu0RjU9yEIII4ta2a0QrzSTKeI1U2mxfQyUa0mdj2paS/9nmd/fctEUKo4WHtusq+8+tzrNhLHZUN54ZGX+OMPbuSY73yioWfUTFj45iLO2u884iji75febp3pa3xJcy05djlge+a8MJfTLsxcegYUibV6mGJ1OcfzVfWbACLyeeBbwMmrvape4NVYmiXRDyaWaU/A95FczqZaUnVyqo8YgxVi1dImdftqUPEQE9v9OCpzdKpYJ9gqdx0nejuXHVGtpnlOQS2+l9Jh1roACahBjD1XVcHEqFE0NqgmVnElDiNu++1/2PeYvZgydXJ/PdrBgYjzovJQMZUfp9QPjBqlq6Ob7qXdXP3t63jj5Xmc/ptT2Gr3zQdz5cMHw1jPu1oGGWeKT9BOfV6qT7DwrcWccdVpjBw/AiClu6u46CCCl89XDCEiSODb44krT2KE8Tzrk+j7Fd9EqHB3SEXHWCbEFV2meL7z2JHyuFUidbLvpVrPc+sk1V8rllPF0apaJ+kbL7yFjiWddCzp7K9HPOAYO2k0F9z9HT725YP49o1ncNhXDuLknx2N71f+LaNSxCO3PcHcl9/k0Tue4rUX5nLZGb+nVAxZNG/xIK5+mGAYx1avdsoyEfkecBSwGNhLVef1ct5JwEkA66233vazZs1qeI4bL7qFy776O/IteTqXdZXFYkvk/Arh8gTJ562xI3JhfYE7Xhv6V6tojo3l4KJewgFrdZeeV8MMOl2ksSK0eL7t913rpc5OLOzufFWF2HKOxHFlHMuK2mFyPn7g4/se5938NbbeY4uGn18zYeFbizlmk8/RuaS+b6Of83n/kbvzyO1PsmTBUj77s2M46JR9B3iVQx99krIsN0l3m3BYQ+fe+sYla1zKshVyjiLyLxF5us52CICqnq2q6wLXAL2aElX1ssRBdOLEiSu1yLuvu5+oFNG5tBuMtfRacTmwRCufg3wOaW21xKiQh7YWaG+FfB5tKaCFPNrWgrbk0dYWaClASwvk85DLWSLaUoCWAtLq+gt5yAXueIDk83bOXM5ygLnArsONIQU7prS12vFbW91a2uznEa5tb7PnjWiD9la8dnu+11qAfB6vkLfryQVlrjMODaWuEl3Lurn9yrtW6vk1C96aPZ9H73iS0y4+Hj+o/685euIo3vuRXehc0klUirj7+gGLJhueGMac4wp1jqr6wQbHugZreTpntVZUB4ecuh/PPvACRhXxLScoQeCIpBNhCwUk8C2h9P2yrlB9J86K0x0aZ/wwxnJ+oeMUjYFEx4giUVzm7Mq+koAk2XvSnGTKlzLxYUxceggC1BPI+W5eyzVKHNkWBaN4uQiMwS/EaBThex6aJM41BkRtq8p/rr2Xbfbakr0/vWdfP+pBw8K3FnPc5l9EjSEsRb36NC6Zv5Tbr76LKVMn8/qLb3LwqRnX2K9YQwlfI1gtnaOIbJzaPQR4bvWWUx9b7b4ZoyaMtMREanR0iStNIram9I1VbS+hfBVI74e1Tn/aNUfpOV/ZUbzGF1PSvjtuwpooG0c1HYFPLc21YckaabrTLk1Njo7FnRhjbLx52rE/BfGEqBSx8I3F7H/CB3jvx3Zmi103HfjFDhvoysRWr3FYXWv1D0VkU6wrzyz6yVL90xMvZck8a/sxUWw5xLAEuTxijOXOikXLPXZ1W1HWGMvNxbEVf6PYcm9hDIFvdYueZ4+D23e6St+rHDfG2rjDyHKoYWS51SiyCSxMbKlWGFrdZuzGN2rHMcaK+iau7Itn95XU/LE9FkVlfaQmrj6J5dY9DzXKM/fN4JbL/sVHvnhAfzzyAcfaG72D479/JP+9/n4mbzCR//zxf1XHW0cUeP+R72XO83P5wKfeyy8+/1vCUsjSBcs47+9fG6RVr+HQOrr5YYTVIo6q+tG+Wsjy0DqilSDvE4YxfhBgYtvGUYyf94lVCXwhjiOCXEBULBHkfKJSiVzOJ+rstvvLXH9naNuuIrl8QNjR5fq7yOV8ws6iTXlWKuHnfExkXH8nQeATlWJ7fmjHi8PInl+M8HMepjvGz1k9oZfzMKHB9wXTbfByAUYMHmCKJTxPbGkGFI1sFI+GkRWnBQh8TJRE7niobxlJP7CJfdcUiAgf/eKBfPSLBzL3pTe59y8PoUaJo5igELD5LpvyxV9+BrA5PFWVIPBpHdE6yCtfw9FAaOCaiqaIkDnz6tO45dd3sv7ma/PKM6+x4bvW46UnZ/HObTfgxSdmsfG7p/L846+wyfZTmfHYK2yxw1SmP2LbZ6a9yFY7bcRTD87kXbtsxFMPzGTrXTbmiftfYJtdN+aJ+59n61024sn/Pc82u23ME/97nm1235Qn7n2Od+22CU/d9zzbvGdTnrzvBbbaZSOevm8G79p1E55+4AW22Hljnn34RTbbYSozHnmZTd69AS88PouNtl6PF5+ew9St1uGV515nvU3WYvaLb7L2hhN5/ZV5TNlwEm/OWcCkd4xh3usLGf+O0bz9xmLGjB/B4gVLGDm6jWWLOmgb2UZ3Z5F83icKIzxPUAOKksvn2ONjuwz2q+kXTJk6mf+797s8cdczbLz9VGY+9jIHnLR3+fgWu2zC92/5Oi8/9SofOuEDg7jSNRyJzn2YYo2tPpghw3BGn7jy+BN01/aDGjr3tqVXrnGuPE3BOWbIkGFwoMOYc8yIY4YMGXrBmuvD2Agy4pghQ4b6yBJPZMiQIUNPKNQtWTxckBHHDBky1IdqXya7bTpkxDFDhgy9oja/5nBCRhwzZMjQO4Yx5zgofo4iMg8bbriymADM7+PlNMv82b0PHprx3tdX1ZVLf1UDEbnVzd8I5qvqfqsz31DDoBDHVYWITBtMR9PBnD+79+zeMwwsmq40a4YMGTIMBDLimCFDhgx10GzE8bJhPH9278Nz/sG+92GLptI5ZsiQIcNAodk4xwwZMmQYEGTEMUOGDBnqoOmIo4h8V0SeFJHHReR2EVlrAOc+X0Sec/PfKCJjBmpuN/9hIvKMiBgRGRD3DhHZT0RmiMhMETlrIOZMzX2FiLwlIk8P5Lxu7nVF5D8iMt098y8M8PwtIvKQiDzh5v/2QM6foQl1jiIySlWXuM+fB7ZQ1X6pXVNn7n2Af6tqJCI/AlDVMwdibjf/5th6Pb8CTlfVfs0YLCI+8DywNzAHeBg4QlWn9+e8qfn3AJYBV6vqVgMxZ2ruKcAUVX1UREYCjwCHDuC9C9CuqstEJAfcC3xBVR8YiPkzNCHnmBBGh3bq1qnrt7lvV1VXy5UHgHUGam43/7OqOmMAp9wJmKmqL6lqCbgWW2VyQKCq/wXeHqj5auaeq6qPus9LgWeBtQdwflXVZW4357bm4mSaHE1HHAFE5HsiMhv4JPCtQVrGccA/B2nugcLawOzU/hwGkEAMFYjIBsB2wIMDPK8vIo8DbwF3qOqAzj/cMSSJo4j8S0SerrMdAqCqZ6vqusA1wGkDObc752wgcvP3KRqZP8PAQURGADcAX6yRWvodqhqr6rZYCWUnERlQ1cJwx5DMyqOqH2zw1GuAW4BzBmpuETkGOBD4gPaDwnYl7n0g8Bqwbmp/Hdc3LOB0fTcA16jqXwZrHaq6SET+A+wHDLhxarhiSHKOy4OIbJzaPQR4bgDn3g84AzhYVTsHat5BxMPAxiKyoYjkgU8ANw3ymgYEziDyG+BZVf3pIMw/MfGGEJFWrFFswP7XMzSntfoGYFOs1XYWcLKqDgg3IyIzgQKwwHU9MFCWcjf/h4GLgInAIuBxVd23n+f8EPB/gA9coarf68/5aub+I/A+bNqsN4FzVPU3AzT37sA9wFPY/zWAr6vqLQM0/9bAVdjn7gHXqep3BmLuDBZNRxwzZMiQYSDQdGJ1hgwZMgwEMuKYIUOGDHWQEccMGTJkqIOMOGbIkCFDHWTEMUOGDBnqICOOGTJkyFAHGXHMkCFDhjr4f5/nHq4LIb/XAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f, ax = plt.subplots(1, 1)\n", + "hb = ax.hexbin(*np.concatenate(dihedral).T, mincnt=5)\n", + "ax.set_aspect('equal')\n", + "cb = f.colorbar(hb, ax=ax)\n", + "cb.set_label('# of frames in bin')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a7478c68", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(250000, 2)\n", + "(250000, 2)\n", + "(250000, 2)\n", + "Trajectory of length 250000 and dimension 2.\n", + "Trajectory of length 250000 and dimension 2.\n", + "Trajectory of length 250000 and dimension 2.\n", + "\n" + ] + } + ], + "source": [ + "data = fl.Trajectories(dt=1.0) # Timestep is 1ps\n", + "for trj in dihedral:\n", + " print(trj.shape)\n", + " data.append(trj)\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "id": "3df0692a", + "metadata": {}, + "source": [ + "We are going to use finite elements for building a 2D model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "795a355d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24318dc9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6be42dc3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.doctrees/nbsphinx/notebooks_estimation_5_1.png b/.doctrees/nbsphinx/notebooks_estimation_5_1.png new file mode 100644 index 0000000..8aa5f7c Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_estimation_5_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_estimation_6_1.png b/.doctrees/nbsphinx/notebooks_estimation_6_1.png new file mode 100644 index 0000000..af176fd Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_estimation_6_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_estimation_8_1.png b/.doctrees/nbsphinx/notebooks_estimation_8_1.png new file mode 100644 index 0000000..ef81350 Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_estimation_8_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_simulations_6_0.png b/.doctrees/nbsphinx/notebooks_simulations_6_0.png new file mode 100644 index 0000000..3c84377 Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_simulations_6_0.png differ diff --git a/.doctrees/nbsphinx/notebooks_simulations_9_0.png b/.doctrees/nbsphinx/notebooks_simulations_9_0.png new file mode 100644 index 0000000..866fbd1 Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_simulations_9_0.png differ diff --git a/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_6_1.png b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_6_1.png new file mode 100644 index 0000000..8aa5f7c Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_6_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_7_1.png b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_7_1.png new file mode 100644 index 0000000..af176fd Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_7_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_9_1.png b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_9_1.png new file mode 100644 index 0000000..ef81350 Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_tutorials_DNAhairpin_9_1.png differ diff --git a/.doctrees/nbsphinx/notebooks_tutorials_alanine_dipeptide_5_0.png b/.doctrees/nbsphinx/notebooks_tutorials_alanine_dipeptide_5_0.png new file mode 100644 index 0000000..aa74787 Binary files /dev/null and b/.doctrees/nbsphinx/notebooks_tutorials_alanine_dipeptide_5_0.png differ diff --git a/.doctrees/notebooks/analysis_committor.doctree b/.doctrees/notebooks/analysis_committor.doctree new file mode 100644 index 0000000..cb39c51 Binary files /dev/null and b/.doctrees/notebooks/analysis_committor.doctree differ diff --git a/.doctrees/notebooks/estimation.doctree b/.doctrees/notebooks/estimation.doctree new file mode 100644 index 0000000..d982f01 Binary files /dev/null and b/.doctrees/notebooks/estimation.doctree differ diff --git a/.doctrees/notebooks/simulations.doctree b/.doctrees/notebooks/simulations.doctree new file mode 100644 index 0000000..47d22ec Binary files /dev/null and b/.doctrees/notebooks/simulations.doctree differ diff --git a/.doctrees/notebooks/statistical_performances/overdampedOU.doctree b/.doctrees/notebooks/statistical_performances/overdampedOU.doctree new file mode 100644 index 0000000..c2a3650 Binary files /dev/null and b/.doctrees/notebooks/statistical_performances/overdampedOU.doctree differ diff --git a/.doctrees/notebooks/statistical_performances/overdampedhiddenOU.doctree b/.doctrees/notebooks/statistical_performances/overdampedhiddenOU.doctree new file mode 100644 index 0000000..50ef3dd Binary files /dev/null and b/.doctrees/notebooks/statistical_performances/overdampedhiddenOU.doctree differ diff --git a/.doctrees/notebooks/tutorials/1D_DoubleWell_estimation.doctree b/.doctrees/notebooks/tutorials/1D_DoubleWell_estimation.doctree new file mode 100644 index 0000000..6228273 Binary files /dev/null and b/.doctrees/notebooks/tutorials/1D_DoubleWell_estimation.doctree differ diff --git a/.doctrees/notebooks/tutorials/2D_DoubleWell_estimation.doctree b/.doctrees/notebooks/tutorials/2D_DoubleWell_estimation.doctree new file mode 100644 index 0000000..7b3647d Binary files /dev/null and b/.doctrees/notebooks/tutorials/2D_DoubleWell_estimation.doctree differ diff --git a/.doctrees/notebooks/tutorials/DNAhairpin.doctree b/.doctrees/notebooks/tutorials/DNAhairpin.doctree new file mode 100644 index 0000000..c7e35ec Binary files /dev/null and b/.doctrees/notebooks/tutorials/DNAhairpin.doctree differ diff --git a/.doctrees/notebooks/tutorials/Maximizing_likelihood.doctree b/.doctrees/notebooks/tutorials/Maximizing_likelihood.doctree new file mode 100644 index 0000000..793225a Binary files /dev/null and b/.doctrees/notebooks/tutorials/Maximizing_likelihood.doctree differ diff --git a/.doctrees/notebooks/tutorials/alanine_dipeptide.doctree b/.doctrees/notebooks/tutorials/alanine_dipeptide.doctree new file mode 100644 index 0000000..e016342 Binary files /dev/null and b/.doctrees/notebooks/tutorials/alanine_dipeptide.doctree differ diff --git a/.doctrees/sg_execution_times.doctree b/.doctrees/sg_execution_times.doctree new file mode 100644 index 0000000..9d8c113 Binary files /dev/null and b/.doctrees/sg_execution_times.doctree differ diff --git a/.doctrees/statistical_performances.doctree b/.doctrees/statistical_performances.doctree new file mode 100644 index 0000000..787c79a Binary files /dev/null and b/.doctrees/statistical_performances.doctree differ diff --git a/.doctrees/tutorials.doctree b/.doctrees/tutorials.doctree new file mode 100644 index 0000000..3b0587c Binary files /dev/null and b/.doctrees/tutorials.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_downloads/0541da993454af5e0289eabbf47cbc23/plot_likelihood.ipynb b/_downloads/0541da993454af5e0289eabbf47cbc23/plot_likelihood.ipynb new file mode 100644 index 0000000..eae8e8f --- /dev/null +++ b/_downloads/0541da993454af5e0289eabbf47cbc23/plot_likelihood.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Likelihood functions\n\nA set of likelihood functions used for estimation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport folie as fl\n\n# Trouver comment on rentre les donn\u00e9es\ntrj = np.loadtxt(\"datasets/example_2d.trj\")\ndata = fl.Trajectories(dt=trj[1, 0] - trj[0, 0])\ndata.append(trj[:, 1:2])\n\nmodel = fl.models.BrownianMotion()\n\nfig, axs = plt.subplots(1, 2)\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$f$\")\naxs[0].set_ylabel(\"$L(f,1.0)$\")\naxs[0].grid()\n\n\naxs[1].set_title(\"Diffusion\")\naxs[1].grid()\naxs[1].set_xlabel(\"$\\\\sigma$\")\naxs[1].set_ylabel(\"$L(1.0,\\\\sigma)$\")\n\n\nforce_range = np.linspace(-1, 1, 25)\ndiff_range = np.linspace(0.5, 2, 25)\n\n\nfor name, transitioncls in zip(\n [\"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n [\n fl.EulerDensity,\n fl.OzakiDensity,\n fl.ShojiOzakiDensity,\n fl.ElerianDensity,\n fl.KesslerDensity,\n fl.DrozdovDensity,\n ],\n):\n likelihood = transitioncls(model)\n likelihood.preprocess_traj(data[0])\n likelihood_vals_force = np.zeros_like(force_range)\n for n, f in enumerate(force_range):\n likelihood_vals_force[n] = likelihood(1.0, data[0], np.array([f, 1.0]))[0]\n axs[0].plot(force_range, likelihood_vals_force, label=name)\n likelihood_vals_diff = np.zeros_like(diff_range)\n for n, d in enumerate(diff_range):\n likelihood_vals_diff[n] = likelihood(1.0, data[0], np.array([1.0, d]))[0]\n\n axs[1].plot(diff_range, likelihood_vals_diff, label=name)\n\naxs[0].legend()\naxs[1].legend()\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/06ea7db86d76538651ce447c4676348d/plot_biasedOU.ipynb b/_downloads/06ea7db86d76538651ce447c4676348d/plot_biasedOU.ipynb new file mode 100644 index 0000000..e50c899 --- /dev/null +++ b/_downloads/06ea7db86d76538651ce447c4676348d/plot_biasedOU.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# ABMD biased dynamics\n\nEstimation of an overdamped Langevin in presence of biased dynamics.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport folie as fl\nimport matplotlib.pyplot as plt\n\n\n# First let's generate some biased trajectories\n\nmodel_simu = fl.models.OrnsteinUhlenbeck(0.0, 1.2, 2.0)\nsimulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0)\ndata = simulator.run(5000, np.zeros((25,)), 1)\nxmax = np.concatenate(simulator.xmax_hist, axis=1).T\n\n# Plot the resulting trajectories\n# sphinx_gallery_thumbnail_number = 1\nfig, axs = plt.subplots(1, 2)\nfor n, trj in enumerate(data):\n axs[0].plot(trj[\"x\"])\n axs[1].plot(xmax[:, n])\n\nfig, axs = plt.subplots(1, 2)\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\n\naxs[1].set_title(\"Diffusion\")\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\naxs[1].grid()\n\n\nxfa = np.linspace(-7.0, 7.0, 75)\nmodel_simu.remove_bias()\naxs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\naxs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n\nname = \"KramersMoyal\"\nestimator = fl.KramersMoyalEstimator(fl.models.OrnsteinUhlenbeck(has_bias=True))\nres = estimator.fit_fetch(data)\nprint(name, res.coefficients, res.is_biased)\nres.remove_bias()\naxs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), \"--\", label=name)\naxs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), \"--\", label=name)\n\nfor name, marker, transitioncls in zip(\n [\"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n [\"+\", \"x\", \"P\", \"1\", \"2\", \"3\"],\n [\n fl.EulerDensity,\n fl.OzakiDensity,\n fl.ShojiOzakiDensity,\n fl.ElerianDensity,\n fl.KesslerDensity,\n fl.DrozdovDensity,\n ],\n):\n estimator = fl.LikelihoodEstimator(transitioncls(fl.models.OrnsteinUhlenbeck(has_bias=True)))\n res = estimator.fit_fetch(data)\n print(name, res.coefficients, res.is_biased)\n res.remove_bias()\n axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker, label=name)\n axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker, label=name)\naxs[0].legend()\naxs[1].legend()\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip new file mode 100644 index 0000000..fcb74dc Binary files /dev/null and b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip differ diff --git a/_downloads/1e20388cba9a750a97082557b5eaaea2/plot_fem.py b/_downloads/1e20388cba9a750a97082557b5eaaea2/plot_fem.py new file mode 100644 index 0000000..c0817d2 --- /dev/null +++ b/_downloads/1e20388cba9a750a97082557b5eaaea2/plot_fem.py @@ -0,0 +1,55 @@ +#!python3 +# -*- coding: utf-8 -*- + +""" +================================ +Overdamped Langevin Estimation +================================ + +How to run a simple estimation with FEM functions +""" + +import numpy as np +import matplotlib.pyplot as plt + +import folie as fl +import skfem + +# Trouver comment on rentre les données +trj = np.loadtxt("datasets/example_2d.trj") +data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) +for i in range(1, trj.shape[1]): + data.append(trj[:, i : i + 1]) + +fig, axs = plt.subplots(1, 2) +# Force plot +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() + +# Diffusion plot +axs[1].set_title("Diffusion") +axs[1].grid() +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") + +xfa = np.linspace(data.stats.min, data.stats.max, 75) + + +n_knots = 10 +epsilon = 1e-10 +domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min - epsilon, data.stats.max + epsilon, n_knots)) + +fem = fl.functions.FiniteElement(domain, element=skfem.ElementLineP1()) +bsplines = fl.functions.BSplinesFunction(domain=domain) +for fun in [bsplines, fem]: + model = fl.models.Overdamped(fun, dim=1) + estimator = fl.KramersMoyalEstimator(model) + + model = estimator.fit_fetch(data) + + axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + axs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1))) + +plt.show() diff --git a/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb b/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb new file mode 100644 index 0000000..0e6b483 --- /dev/null +++ b/_downloads/28bf5b885c707f7863eaed624722ca82/plot_example.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Overdamped Langevin Estimation\n\nHow to run a simple estimation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport folie as fl\n\n# Trouver comment on rentre les donn\u00e9es\ntrj = np.loadtxt(\"datasets/example_2d.trj\")\ndata = fl.Trajectories(dt=trj[1, 0] - trj[0, 0])\nfor i in range(1, trj.shape[1]):\n data.append(trj[:, i : i + 1])\n\nfun = fl.functions.Linear()\nmodel = fl.models.Overdamped(fun)\nestimator = fl.LikelihoodEstimator(fl.EulerDensity(model))\nmodel = estimator.fit_fetch(data)\n\n# To find a correct parametrization of the space\nbins = np.histogram_bin_edges(data[0][\"x\"], bins=15)\nxfa = (bins[1:] + bins[:-1]) / 2.0\n\n\nfig, axs = plt.subplots(1, 2)\n# Force plot\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\naxs[0].plot(xfa, model.force(xfa.reshape(-1, 1)))\n\n# Diffusion plot\naxs[1].set_title(\"Diffusion\")\naxs[1].grid()\naxs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1)))\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/2e5867fd261f97e944b67fd63ed339de/plot_1D_Double_Well.ipynb b/_downloads/2e5867fd261f97e944b67fd63ed339de/plot_1D_Double_Well.ipynb new file mode 100644 index 0000000..4dc63fc --- /dev/null +++ b/_downloads/2e5867fd261f97e944b67fd63ed339de/plot_1D_Double_Well.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 1D Double Well\n\nEstimation of an overdamped Langevin.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\nimport folie as fl\n\ncoeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1])\nfree_energy = np.polynomial.Polynomial(coeff)\nD = 0.5\nforce_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]])\n\nforce_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff)\ndiff_function = fl.functions.Polynomial(deg=0, coefficients=np.array(D))\n\n# Plot of Free Energy and Force\nx_values = np.linspace(-7, 7, 100)\n# fig, axs = plt.subplots(1, 2)\n# axs[0].plot(x_values, free_energy(x_values))\n# axs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1)))\n# axs[0].set_title(\"Potential\")\n# axs[0].set_xlabel(\"$x$\")\n# axs[0].set_ylabel(\"$V(x)$\")\n# axs[0].grid()\n# axs[1].set_title(\"Force\")\n# axs[1].set_xlabel(\"$x$\")\n# axs[1].set_ylabel(\"$F(x)$\")\n# axs[1].grid()\n\n# Define model to simulate and type of simulator to use\ndt = 1e-3\nmodel_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function)\nsimulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)\n\n\n# initialize positions\nntraj = 30\nq0 = np.empty(ntraj)\nfor i in range(len(q0)):\n q0[i] = 0\n# Calculate Trajectory\ntime_steps = 10000\ndata = simulator.run(time_steps, q0, save_every=1)\n\n# Plot resulting Trajectories\nfig, axs = plt.subplots()\nfor n, trj in enumerate(data):\n axs.plot(trj[\"x\"])\n axs.set_title(\"Trajectory\")\n\n\nfig, axs = plt.subplots(1, 2)\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\n\naxs[1].set_title(\"Diffusion Coefficient\")\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\naxs[1].grid()\n\nxfa = np.linspace(-7.0, 7.0, 75)\naxs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\naxs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\ntrainforce = fl.functions.Polynomial(deg=3, coefficients=np.array([0, 0, 0, 0]))\ntrainmodel = fl.models.Overdamped(force=trainforce, diffusion=fl.functions.Polynomial(deg=0, coefficients=np.asarray([0.9])), has_bias=False)\n\nfor name, marker, transitioncls in zip(\n [\"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n [\"x\", \"|\", \".\", \"1\", \"2\", \"3\"],\n [\n fl.EulerDensity,\n fl.OzakiDensity,\n fl.ShojiOzakiDensity,\n fl.ElerianDensity,\n fl.KesslerDensity,\n fl.DrozdovDensity,\n ],\n):\n estimator = fl.LikelihoodEstimator(transitioncls(trainmodel))\n res = estimator.fit_fetch(data)\n # print(res.coefficients)\n axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker=marker, label=name)\n axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker=marker, label=name)\n\n\nname = \"Kramers Moyal\"\nres = fl.KramersMoyalEstimator(trainmodel).fit_fetch(data)\naxs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), \"--\", label=name)\naxs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), \"--\", label=name)\n\n\naxs[0].legend()\naxs[1].legend()\n\n# Compute MFPT from one well to another\nplt.figure()\n\nx_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, -5.0, [-10.0, 10.0], Npoints=500)\nplt.plot(x_mfpt, mfpt, label=\"Right to left\")\nx_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, 5.0, [-10.0, 10.0], Npoints=500)\nplt.plot(x_mfpt, mfpt, label=\"Left to right\")\n\nx_mfpt, mfpt = fl.analysis.mfpt_1d(res, -5.0, [-10.0, 10.0], Npoints=500)\nplt.plot(x_mfpt, mfpt, label=\"Right to left Estimation\")\nx_mfpt, mfpt = fl.analysis.mfpt_1d(res, 5.0, [-10.0, 10.0], Npoints=500)\nplt.plot(x_mfpt, mfpt, label=\"Left to right Estimation\")\nplt.legend()\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/2efaff5f5c4e7014569acde91bdaa3e4/plot_1D_Double_Well.py b/_downloads/2efaff5f5c4e7014569acde91bdaa3e4/plot_1D_Double_Well.py new file mode 100644 index 0000000..dc4f3f3 --- /dev/null +++ b/_downloads/2efaff5f5c4e7014569acde91bdaa3e4/plot_1D_Double_Well.py @@ -0,0 +1,115 @@ +""" +================================ +1D Double Well +================================ + +Estimation of an overdamped Langevin. +""" + +import numpy as np +import matplotlib.pyplot as plt +import folie as fl + +coeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1]) +free_energy = np.polynomial.Polynomial(coeff) +D = 0.5 +force_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]]) + +force_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff) +diff_function = fl.functions.Polynomial(deg=0, coefficients=np.array(D)) + +# Plot of Free Energy and Force +x_values = np.linspace(-7, 7, 100) +# fig, axs = plt.subplots(1, 2) +# axs[0].plot(x_values, free_energy(x_values)) +# axs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1))) +# axs[0].set_title("Potential") +# axs[0].set_xlabel("$x$") +# axs[0].set_ylabel("$V(x)$") +# axs[0].grid() +# axs[1].set_title("Force") +# axs[1].set_xlabel("$x$") +# axs[1].set_ylabel("$F(x)$") +# axs[1].grid() + +# Define model to simulate and type of simulator to use +dt = 1e-3 +model_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function) +simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) + + +# initialize positions +ntraj = 30 +q0 = np.empty(ntraj) +for i in range(len(q0)): + q0[i] = 0 +# Calculate Trajectory +time_steps = 10000 +data = simulator.run(time_steps, q0, save_every=1) + +# Plot resulting Trajectories +fig, axs = plt.subplots() +for n, trj in enumerate(data): + axs.plot(trj["x"]) + axs.set_title("Trajectory") + + +fig, axs = plt.subplots(1, 2) +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() + +axs[1].set_title("Diffusion Coefficient") +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") +axs[1].grid() + +xfa = np.linspace(-7.0, 7.0, 75) +axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") +axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") +trainforce = fl.functions.Polynomial(deg=3, coefficients=np.array([0, 0, 0, 0])) +trainmodel = fl.models.Overdamped(force=trainforce, diffusion=fl.functions.Polynomial(deg=0, coefficients=np.asarray([0.9])), has_bias=False) + +for name, marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["x", "|", ".", "1", "2", "3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], +): + estimator = fl.LikelihoodEstimator(transitioncls(trainmodel)) + res = estimator.fit_fetch(data) + # print(res.coefficients) + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker=marker, label=name) + + +name = "Kramers Moyal" +res = fl.KramersMoyalEstimator(trainmodel).fit_fetch(data) +axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), "--", label=name) +axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), "--", label=name) + + +axs[0].legend() +axs[1].legend() + +# Compute MFPT from one well to another +plt.figure() + +x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, -5.0, [-10.0, 10.0], Npoints=500) +plt.plot(x_mfpt, mfpt, label="Right to left") +x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, 5.0, [-10.0, 10.0], Npoints=500) +plt.plot(x_mfpt, mfpt, label="Left to right") + +x_mfpt, mfpt = fl.analysis.mfpt_1d(res, -5.0, [-10.0, 10.0], Npoints=500) +plt.plot(x_mfpt, mfpt, label="Right to left Estimation") +x_mfpt, mfpt = fl.analysis.mfpt_1d(res, 5.0, [-10.0, 10.0], Npoints=500) +plt.plot(x_mfpt, mfpt, label="Left to right Estimation") +plt.legend() +plt.show() diff --git a/_downloads/38e15dfb62c2deeeb4068ae89c8ca28c/plot_fem.ipynb b/_downloads/38e15dfb62c2deeeb4068ae89c8ca28c/plot_fem.ipynb new file mode 100644 index 0000000..1a27f8d --- /dev/null +++ b/_downloads/38e15dfb62c2deeeb4068ae89c8ca28c/plot_fem.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Overdamped Langevin Estimation\n\nHow to run a simple estimation with FEM functions\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport folie as fl\nimport skfem\n\n# Trouver comment on rentre les donn\u00e9es\ntrj = np.loadtxt(\"datasets/example_2d.trj\")\ndata = fl.Trajectories(dt=trj[1, 0] - trj[0, 0])\nfor i in range(1, trj.shape[1]):\n data.append(trj[:, i : i + 1])\n\nfig, axs = plt.subplots(1, 2)\n# Force plot\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\n\n# Diffusion plot\naxs[1].set_title(\"Diffusion\")\naxs[1].grid()\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\n\nxfa = np.linspace(data.stats.min, data.stats.max, 75)\n\n\nn_knots = 10\nepsilon = 1e-10\ndomain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min - epsilon, data.stats.max + epsilon, n_knots))\n\nfem = fl.functions.FiniteElement(domain, element=skfem.ElementLineP1())\nbsplines = fl.functions.BSplinesFunction(domain=domain)\nfor fun in [bsplines, fem]:\n model = fl.models.Overdamped(fun, dim=1)\n estimator = fl.KramersMoyalEstimator(model)\n\n model = estimator.fit_fetch(data)\n\n axs[0].plot(xfa, model.force(xfa.reshape(-1, 1)))\n axs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1)))\n\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/3c77303b3aa28e3e1361767201f6f9aa/plot_likelihood.py b/_downloads/3c77303b3aa28e3e1361767201f6f9aa/plot_likelihood.py new file mode 100644 index 0000000..fa2115c --- /dev/null +++ b/_downloads/3c77303b3aa28e3e1361767201f6f9aa/plot_likelihood.py @@ -0,0 +1,66 @@ +#!python3 +# -*- coding: utf-8 -*- + +""" +=========================== +Likelihood functions +=========================== + +A set of likelihood functions used for estimation +""" + +import numpy as np +import matplotlib.pyplot as plt + +import folie as fl + +# Trouver comment on rentre les données +trj = np.loadtxt("datasets/example_2d.trj") +data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) +data.append(trj[:, 1:2]) + +model = fl.models.BrownianMotion() + +fig, axs = plt.subplots(1, 2) +axs[0].set_title("Force") +axs[0].set_xlabel("$f$") +axs[0].set_ylabel("$L(f,1.0)$") +axs[0].grid() + + +axs[1].set_title("Diffusion") +axs[1].grid() +axs[1].set_xlabel("$\\sigma$") +axs[1].set_ylabel("$L(1.0,\\sigma)$") + + +force_range = np.linspace(-1, 1, 25) +diff_range = np.linspace(0.5, 2, 25) + + +for name, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], +): + likelihood = transitioncls(model) + likelihood.preprocess_traj(data[0]) + likelihood_vals_force = np.zeros_like(force_range) + for n, f in enumerate(force_range): + likelihood_vals_force[n] = likelihood(1.0, data[0], np.array([f, 1.0]))[0] + axs[0].plot(force_range, likelihood_vals_force, label=name) + likelihood_vals_diff = np.zeros_like(diff_range) + for n, d in enumerate(diff_range): + likelihood_vals_diff[n] = likelihood(1.0, data[0], np.array([1.0, d]))[0] + + axs[1].plot(diff_range, likelihood_vals_diff, label=name) + +axs[0].legend() +axs[1].legend() +plt.show() diff --git a/_downloads/41d2fe6defd798a4f411bf98a001982c/plot_biasedOU.py b/_downloads/41d2fe6defd798a4f411bf98a001982c/plot_biasedOU.py new file mode 100644 index 0000000..6f72aa6 --- /dev/null +++ b/_downloads/41d2fe6defd798a4f411bf98a001982c/plot_biasedOU.py @@ -0,0 +1,73 @@ +""" +================================ +ABMD biased dynamics +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. +""" + +import numpy as np +import folie as fl +import matplotlib.pyplot as plt + + +# First let's generate some biased trajectories + +model_simu = fl.models.OrnsteinUhlenbeck(0.0, 1.2, 2.0) +simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0) +data = simulator.run(5000, np.zeros((25,)), 1) +xmax = np.concatenate(simulator.xmax_hist, axis=1).T + +# Plot the resulting trajectories +# sphinx_gallery_thumbnail_number = 1 +fig, axs = plt.subplots(1, 2) +for n, trj in enumerate(data): + axs[0].plot(trj["x"]) + axs[1].plot(xmax[:, n]) + +fig, axs = plt.subplots(1, 2) +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() + +axs[1].set_title("Diffusion") +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") +axs[1].grid() + + +xfa = np.linspace(-7.0, 7.0, 75) +model_simu.remove_bias() +axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") +axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") + +name = "KramersMoyal" +estimator = fl.KramersMoyalEstimator(fl.models.OrnsteinUhlenbeck(has_bias=True)) +res = estimator.fit_fetch(data) +print(name, res.coefficients, res.is_biased) +res.remove_bias() +axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), "--", label=name) +axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), "--", label=name) + +for name, marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["+", "x", "P", "1", "2", "3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], +): + estimator = fl.LikelihoodEstimator(transitioncls(fl.models.OrnsteinUhlenbeck(has_bias=True))) + res = estimator.fit_fetch(data) + print(name, res.coefficients, res.is_biased) + res.remove_bias() + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker, label=name) +axs[0].legend() +axs[1].legend() +plt.show() diff --git a/_downloads/6230afd613d130bddf1486cda6522012/plot_biased_1D_Double_Well.ipynb b/_downloads/6230afd613d130bddf1486cda6522012/plot_biased_1D_Double_Well.ipynb new file mode 100644 index 0000000..2dde70d --- /dev/null +++ b/_downloads/6230afd613d130bddf1486cda6522012/plot_biased_1D_Double_Well.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 1D Biased Double Well\n\nEstimation of an overdamped Langevin in presence of biased dynamics.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\nimport folie as fl\nfrom copy import deepcopy\n\ncoeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1])\nfree_energy = np.polynomial.Polynomial(coeff)\nD= np.array([0.5])\n\nforce_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]])\nforce_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff)\ndiff_function = fl.functions.Polynomial(deg=0, coefficients=D)\n\n# Plot of Free Energy and Force\nx_values = np.linspace(-7, 7, 100)\nfig, axs = plt.subplots(1, 2)\naxs[0].plot(x_values, free_energy(x_values))\naxs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1)))\naxs[0].set_title(\"Potential\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$V(x)$\")\naxs[0].grid()\naxs[1].set_title(\"Force\")\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$F(x)$\")\naxs[1].grid()\n\n# Define model to simulate and type of simulator to use\nmodel_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function)\nsimulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0)\n\n# initialize positions\nntraj = 30\nq0 = np.empty(ntraj)\nfor i in range(len(q0)):\n q0[i] = -6\n# Calculate Trajectory\ntime_steps = 25000\ndata = simulator.run(time_steps, q0, save_every=1)\nxmax = np.concatenate(simulator.xmax_hist, axis=1).T\n\n# Plot the resulting trajectories\nfig, axs = plt.subplots(1, 2)\nfor n, trj in enumerate(data):\n axs[0].plot(trj[\"x\"])\n axs[1].plot(xmax[:, n])\n axs[1].set_xlabel(\"$timestep$\")\n axs[1].set_ylabel(\"$x(t)$\")\n axs[1].grid()\n\nfig, axs = plt.subplots(1, 2)\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\n\naxs[1].set_title(\"Diffusion Coefficient\") # i think should be diffusion coefficient\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\naxs[1].grid()\n\nxfa = np.linspace(-7.0, 7.0, 75)\nmodel_simu.remove_bias()\naxs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\naxs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n\ndomain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min, data.stats.max, 4).ravel())\ntrainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True)\n\nfor name,marker, transitioncls in zip(\n [\"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n [\"x\", \"|\",\".\",\"1\",\"2\",\"3\"],\n [\n fl.EulerDensity,\n fl.OzakiDensity,\n fl.ShojiOzakiDensity,\n fl.ElerianDensity,\n fl.KesslerDensity,\n fl.DrozdovDensity,\n ],\n):\n trainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True)\n estimator = fl.LikelihoodEstimator(transitioncls(trainmodel),n_jobs=4) \n\n\n res = estimator.fit_fetch(deepcopy(data))\n\n print(name, res.coefficients)\n res.remove_bias()\n axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name)\n axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name)\naxs[0].legend()\naxs[1].legend()\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/6bb2e5b5a4388ea422e39a398dce267b/plot_biased_1D_Double_Well.py b/_downloads/6bb2e5b5a4388ea422e39a398dce267b/plot_biased_1D_Double_Well.py new file mode 100644 index 0000000..d7ccf4b --- /dev/null +++ b/_downloads/6bb2e5b5a4388ea422e39a398dce267b/plot_biased_1D_Double_Well.py @@ -0,0 +1,102 @@ +""" +================================ +1D Biased Double Well +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. +""" + +import numpy as np +import matplotlib.pyplot as plt +import folie as fl +from copy import deepcopy + +coeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1]) +free_energy = np.polynomial.Polynomial(coeff) +D= np.array([0.5]) + +force_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]]) +force_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff) +diff_function = fl.functions.Polynomial(deg=0, coefficients=D) + +# Plot of Free Energy and Force +x_values = np.linspace(-7, 7, 100) +fig, axs = plt.subplots(1, 2) +axs[0].plot(x_values, free_energy(x_values)) +axs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1))) +axs[0].set_title("Potential") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$V(x)$") +axs[0].grid() +axs[1].set_title("Force") +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$F(x)$") +axs[1].grid() + +# Define model to simulate and type of simulator to use +model_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function) +simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0) + +# initialize positions +ntraj = 30 +q0 = np.empty(ntraj) +for i in range(len(q0)): + q0[i] = -6 +# Calculate Trajectory +time_steps = 25000 +data = simulator.run(time_steps, q0, save_every=1) +xmax = np.concatenate(simulator.xmax_hist, axis=1).T + +# Plot the resulting trajectories +fig, axs = plt.subplots(1, 2) +for n, trj in enumerate(data): + axs[0].plot(trj["x"]) + axs[1].plot(xmax[:, n]) + axs[1].set_xlabel("$timestep$") + axs[1].set_ylabel("$x(t)$") + axs[1].grid() + +fig, axs = plt.subplots(1, 2) +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() + +axs[1].set_title("Diffusion Coefficient") # i think should be diffusion coefficient +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") +axs[1].grid() + +xfa = np.linspace(-7.0, 7.0, 75) +model_simu.remove_bias() +axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") +axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") + +domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min, data.stats.max, 4).ravel()) +trainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True) + +for name,marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["x", "|",".","1","2","3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], +): + trainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True) + estimator = fl.LikelihoodEstimator(transitioncls(trainmodel),n_jobs=4) + + + res = estimator.fit_fetch(deepcopy(data)) + + print(name, res.coefficients) + res.remove_bias() + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name) +axs[0].legend() +axs[1].legend() +plt.show() diff --git a/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip new file mode 100644 index 0000000..b2a3781 Binary files /dev/null and b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip differ diff --git a/_downloads/77a81bd228c71fd6d8fde52bc83877a9/plot_functions.ipynb b/_downloads/77a81bd228c71fd6d8fde52bc83877a9/plot_functions.ipynb new file mode 100644 index 0000000..a0bbbc2 --- /dev/null +++ b/_downloads/77a81bd228c71fd6d8fde52bc83877a9/plot_functions.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Functional set\n\nIn this example, we present a subset of implemented functions.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport folie.functions as ff\nimport folie as fl\n\nfrom scipy.interpolate import splrep\n\nx_range = np.linspace(-2, 2, 30).reshape(-1, 1)\n\ndomain = fl.MeshedDomain.create_from_range(np.linspace(-2, 2, 6))\n\n\nt, c, k = splrep(x_range, x_range**4 - 2 * x_range**2 + 0.5 * x_range)\n\nfun_set = {\n \"Linear\": ff.Linear(domain=domain),\n \"Polynom\": ff.Polynomial(3, domain=domain),\n \"Hermite Polynom\": ff.Polynomial(3, np.polynomial.Hermite, domain=domain),\n \"Fourier\": ff.Fourier(order=2, freq=1.0, domain=domain),\n \"B Splines\": ff.BSplinesFunction(domain=domain, k=3),\n}\n\nfig_kernel, axs = plt.subplots(2, 3)\nm = 0\nfor key, fun in fun_set.items():\n axs[m // 3][m % 3].set_title(key)\n axs[m // 3][m % 3].set_xlabel(\"$x$\")\n axs[m // 3][m % 3].set_ylabel(\"$h_k(x)$\")\n axs[m // 3][m % 3].grid()\n y = fun.grad_coeffs(x_range)\n\n for n in range(y.shape[1]):\n axs[m // 3][m % 3].plot(x_range[:, 0], y[:, n])\n m += 1\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/7b4223b0046df8851de26a4d299de310/example_em.ipynb b/_downloads/7b4223b0046df8851de26a4d299de310/example_em.ipynb new file mode 100644 index 0000000..0ee8439 --- /dev/null +++ b/_downloads/7b4223b0046df8851de26a4d299de310/example_em.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Hidden Overdamped Langevin Estimation\n\nHow to run a simple estimation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\n\nimport folie as fl\n\n# Trouver comment on rentre les donn\u00e9es\ntrj = np.loadtxt(\"datasets/example_2d.trj\")\ndata = fl.Trajectories(dt=trj[1, 0] - trj[0, 0])\n# for i in range(1, trj.shape[1]):\ndata.append(trj[:, 1:2])\n\nfun_lin = fl.functions.Linear()\nfun_cst = fl.functions.Constant()\nmodel = fl.models.OverdampedHidden(fun_lin, fun_lin.copy(), fun_cst, dim=1, dim_h=2)\nestimator = fl.EMEstimator(fl.EulerDensity(model), max_iter=3, verbose=2, verbose_interval=1)\nmodel = estimator.fit_fetch(data)\n\n# To find a correct parametrization of the space\nbins = np.histogram_bin_edges(data[0][\"x\"], bins=15)\nxfa = (bins[1:] + bins[:-1]) / 2.0\n\n\nfig, axs = plt.subplots(1, 3)\n# Force plot\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\naxs[0].plot(xfa, model.force(xfa.reshape(-1, 1)))\n\n\n# Friction plot\naxs[1].set_title(\"Friction\")\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$E_2(x)$\")\naxs[1].grid()\naxs[1].plot(xfa, model.friction(xfa.reshape(-1, 1))[:, 0, :])\n\n# Diffusion plot\naxs[2].set_title(\"Diffusion\")\naxs[2].grid()\naxs[2].plot(xfa, model.diffusion(xfa.reshape(-1, 1))[:, 0, 0])\naxs[2].set_xlabel(\"$x$\")\naxs[2].set_ylabel(\"$D(x)$\")\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py b/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py new file mode 100644 index 0000000..116c1dc --- /dev/null +++ b/_downloads/7edd55a52439250dd2a454d660d32ddf/plot_example.py @@ -0,0 +1,47 @@ +#!python3 +# -*- coding: utf-8 -*- + +""" +================================ +Overdamped Langevin Estimation +================================ + +How to run a simple estimation +""" + +import numpy as np +import matplotlib.pyplot as plt + +import folie as fl + +# Trouver comment on rentre les données +trj = np.loadtxt("datasets/example_2d.trj") +data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) +for i in range(1, trj.shape[1]): + data.append(trj[:, i : i + 1]) + +fun = fl.functions.Linear() +model = fl.models.Overdamped(fun) +estimator = fl.LikelihoodEstimator(fl.EulerDensity(model)) +model = estimator.fit_fetch(data) + +# To find a correct parametrization of the space +bins = np.histogram_bin_edges(data[0]["x"], bins=15) +xfa = (bins[1:] + bins[:-1]) / 2.0 + + +fig, axs = plt.subplots(1, 2) +# Force plot +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() +axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + +# Diffusion plot +axs[1].set_title("Diffusion") +axs[1].grid() +axs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1))) +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") +plt.show() diff --git a/_downloads/acd7518a7bb9aef77ff26dece9eebeab/plot_biased_2D_Double_Well.ipynb b/_downloads/acd7518a7bb9aef77ff26dece9eebeab/plot_biased_2D_Double_Well.ipynb new file mode 100644 index 0000000..9d6ab8d --- /dev/null +++ b/_downloads/acd7518a7bb9aef77ff26dece9eebeab/plot_biased_2D_Double_Well.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 2D Biased Double Well\n\nEstimation of an overdamped Langevin in presence of biased dynamics.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\nimport folie as fl\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom copy import deepcopy\nimport time\n\ncheckpoint1 = time.time()\nx = np.linspace(-1.8, 1.8, 36)\ny = np.linspace(-1.8, 1.8, 36)\ninput = np.transpose(np.array([x, y]))\n\nD=0.5\ndiff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2))\na,b = 5, 10\ndrift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ###\nquartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ###\n\nX, Y = np.meshgrid(x, y)\n\n# Plot potential surface\npot = quartic2d.potential_plot(X, Y)\nfig = plt.figure()\nax = plt.axes(projection=\"3d\")\nax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap=\"jet\", edgecolor=\"none\")\n\n# Plot Force function\nff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\nU, V = np.meshgrid(ff[:, 0], ff[:, 1])\nfig, ax = plt.subplots()\nax.quiver(x, y, U, V)\nax.set_title(\"Force\")\n\n\n##Definition of the Collective variable function of old coordinates\ndef colvar(x, y):\n gradient = np.array([1, 1])\n return x + y, gradient # need to return both colvar function q=q(x,y) and gradient (dq/dx,dq/dy)\n\n\ndt = 1e-3\nmodel_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function)\nsimulator = fl.simulations.ABMD_2D_to_1DColvar_Simulator(fl.simulations.EulerStepper(model_simu), dt, colvar=colvar, k=25.0, qstop=1.2)\n\n# Choose number of trajectories and initialize positions\nntraj = 20\nq0 = np.empty(shape=[ntraj, 2])\nfor i in range(ntraj):\n for j in range(2):\n q0[i][j] = -1.2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## # CALCULATE TRAJECTORY ##\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "time_steps = 10000\ndata = simulator.run(time_steps, q0, save_every=1)\n\n# Plot the resulting trajectories\nfig, axs = plt.subplots()\nfor n, trj in enumerate(data):\n axs.plot(trj[\"x\"][:, 0], trj[\"x\"][:, 1])\n axs.spines[\"left\"].set_position(\"center\")\n axs.spines[\"right\"].set_color(\"none\")\n axs.spines[\"bottom\"].set_position(\"center\")\n axs.spines[\"top\"].set_color(\"none\")\n axs.xaxis.set_ticks_position(\"bottom\")\n axs.yaxis.set_ticks_position(\"left\")\n axs.set_xlabel(\"$X(t)$\")\n axs.set_ylabel(\"$Y(t)$\")\n axs.set_title(\"X-Y Trajectory\")\n axs.set_xlim(-1.8, 1.8)\n axs.set_ylim(-1.8, 1.8)\n axs.grid()\n\n# plot x,y Trajectories in separate subplots\nfig, bb = plt.subplots(1, 2)\nfor n, trj in enumerate(data):\n bb[0].plot(trj[\"x\"][:, 0])\n bb[1].plot(trj[\"x\"][:, 1])\n\n # Set visible axis\n bb[0].spines[\"right\"].set_color(\"none\")\n bb[0].spines[\"bottom\"].set_position(\"center\")\n bb[0].spines[\"top\"].set_color(\"none\")\n bb[0].xaxis.set_ticks_position(\"bottom\")\n bb[0].yaxis.set_ticks_position(\"left\")\n bb[0].set_xlabel(\"$timestep$\")\n bb[0].set_ylabel(\"$X(t)$\")\n\n # Set visible axis\n bb[1].spines[\"right\"].set_color(\"none\")\n bb[1].spines[\"bottom\"].set_position(\"center\")\n bb[1].spines[\"top\"].set_color(\"none\")\n bb[1].xaxis.set_ticks_position(\"bottom\")\n bb[1].yaxis.set_ticks_position(\"left\")\n bb[1].set_xlabel(\"$timestep$\")\n bb[1].set_ylabel(\"$Y(t)$\")\n\n bb[0].set_title(\"X Dynamics\")\n bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PROJECTION ALONG CHOSEN COORDINATE #\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Choose unit versor of direction\nu = np.array([1, 1])\nu_norm = (1 / np.linalg.norm(u, 2)) * u\nw = np.empty_like(trj[\"x\"][:, 0])\nb = np.empty_like(trj[\"x\"][:, 0])\nproj_data = fl.data.trajectories.Trajectories(dt=dt) # create new Trajectory object in which to store the projected trajectory dictionaries\nfig, axs = plt.subplots()\nfor n, trj in enumerate(data):\n for i in range(len(trj[\"x\"])):\n w[i] = np.dot(trj[\"x\"][i], u_norm)\n b[i] = np.dot(trj[\"bias\"][i], u_norm)\n proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj[\"x\"][:, 0]), 1)), bias=deepcopy(b.reshape(len(trj[\"bias\"][:, 0]), 1))))\n axs.plot(proj_data[n][\"x\"])\n axs.set_xlabel(\"$timesteps$\")\n axs.set_ylabel(\"$w(t)$\")\n axs.set_title(\"trajectory projected along $u =$\" + str(u) + \" direction\")\n axs.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## # MODEL TRAINING ##\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "checkpoint2 = time.time()\n\ndomain = fl.MeshedDomain.create_from_range(np.linspace(proj_data.stats.min, proj_data.stats.max, 4).ravel())\ntrainmodel = fl.models.OverdampedSplines1D(domain=domain)\n\nxfa = np.linspace(proj_data.stats.min, proj_data.stats.max, 75)\nforce_exact = (xfa**2 - 1.0) ** 2\n\nfig, axs = plt.subplots(1, 2)\naxs[0].set_title(\"Force\")\naxs[0].set_xlabel(\"$x$\")\naxs[0].set_ylabel(\"$F(x)$\")\naxs[0].grid()\naxs[1].set_title(\"Diffusion\")\naxs[1].set_xlabel(\"$x$\")\naxs[1].set_ylabel(\"$D(x)$\")\naxs[1].grid()\n\n\nKM_Estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel))\nres_KM = KM_Estimator.fit_fetch(proj_data)\n\naxs[0].plot(xfa, res_KM.force(xfa.reshape(-1, 1)), marker=\"x\",label=\"KramersMoyal\")\naxs[1].plot(xfa, res_KM.diffusion(xfa.reshape(-1, 1)), marker=\"x\",label=\"KramersMoyal\")\nprint(\"KramersMoyal \", res_KM.coefficients)\nfor name,marker, transitioncls in zip(\n [\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n [\"|\",\"1\",\"2\",\"3\"],\n [\n fl.EulerDensity,\n fl.ElerianDensity,\n fl.KesslerDensity,\n fl.DrozdovDensity,\n ],\n):\n estimator = fl.LikelihoodEstimator(transitioncls(deepcopy(trainmodel)))\n res = estimator.fit_fetch(deepcopy(proj_data))\n print(name, res.coefficients)\n axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name)\n axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name)\n\naxs[0].legend()\naxs[1].legend()\ncheckpoint3 = time.time()\n\nprint(\"Training time =\", checkpoint3 - checkpoint2, \"seconds\")\nprint(\"Overall time =\", checkpoint3 - checkpoint1, \"seconds\")\n\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/be0bae8da11dbbebae230b2930be48f3/plot_2D_Double_Well.ipynb b/_downloads/be0bae8da11dbbebae230b2930be48f3/plot_2D_Double_Well.ipynb new file mode 100644 index 0000000..6c88976 --- /dev/null +++ b/_downloads/be0bae8da11dbbebae230b2930be48f3/plot_2D_Double_Well.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 2D Double Well\n\nEstimation of an overdamped Langevin.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport matplotlib.pyplot as plt\nimport folie as fl\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom copy import deepcopy\n\n\"\"\" Script for simulation of 2D double well and projection along user provided direction, No fitting is carried out \"\"\"\nx = np.linspace(-1.8, 1.8, 36)\ny = np.linspace(-1.8, 1.8, 36)\ninput = np.transpose(np.array([x, y]))\n\nD=0.5\ndiff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2))\na,b = 5, 10\ndrift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ###\nquartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ###\n\nX, Y = np.meshgrid(x, y)\n\n# Plot potential surface\npot = quartic2d.potential_plot(X, Y)\n\nfig = plt.figure()\nax = plt.axes(projection=\"3d\")\nax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap=\"jet\", edgecolor=\"none\")\n\n# Plot Force function\nff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\nU, V = np.meshgrid(ff[:, 0], ff[:, 1])\nfig, ax = plt.subplots()\nax.quiver(x, y, U, V)\nax.set_title(\"Force\")\n\ndt= 5e-4\nmodel_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function)\nsimulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)\n\n# initialize positions\nntraj = 30\nq0 = np.empty(shape=[ntraj, 2])\nfor i in range(ntraj):\n for j in range(2):\n q0[i][j] = 0.000\n\n# Calculate Trajectory\ntime_steps = 3000\ndata = simulator.run(time_steps, q0, save_every=1)\n\n# Plot the resulting trajectories\nfig, axs = plt.subplots()\nfor n, trj in enumerate(data):\n axs.plot(trj[\"x\"][:, 0], trj[\"x\"][:, 1])\n axs.spines[\"left\"].set_position(\"center\")\n axs.spines[\"right\"].set_color(\"none\")\n axs.spines[\"bottom\"].set_position(\"center\")\n axs.spines[\"top\"].set_color(\"none\")\n axs.xaxis.set_ticks_position(\"bottom\")\n axs.yaxis.set_ticks_position(\"left\")\n axs.set_xlabel(\"$X(t)$\")\n axs.set_ylabel(\"$Y(t)$\")\n axs.set_title(\"X-Y Trajectory\")\n axs.grid()\n\n# plot Trajectories\nfig, bb = plt.subplots(1, 2)\nfor n, trj in enumerate(data):\n bb[0].plot(trj[\"x\"][:, 0])\n bb[1].plot(trj[\"x\"][:, 1])\n\n # Set visible axis\n bb[0].spines[\"right\"].set_color(\"none\")\n bb[0].spines[\"bottom\"].set_position(\"center\")\n bb[0].spines[\"top\"].set_color(\"none\")\n bb[0].xaxis.set_ticks_position(\"bottom\")\n bb[0].yaxis.set_ticks_position(\"left\")\n bb[0].set_xlabel(\"$timestep$\")\n bb[0].set_ylabel(\"$X(t)$\")\n\n # Set visible axis\n bb[1].spines[\"right\"].set_color(\"none\")\n bb[1].spines[\"bottom\"].set_position(\"center\")\n bb[1].spines[\"top\"].set_color(\"none\")\n bb[1].xaxis.set_ticks_position(\"bottom\")\n bb[1].yaxis.set_ticks_position(\"left\")\n bb[1].set_xlabel(\"$timestep$\")\n bb[1].set_ylabel(\"$Y(t)$\")\n\n bb[0].set_title(\"X Dynamics\")\n bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PROJECTION ALONG CHOSEN COORDINATE #\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Choose unit versor of direction\nu = np.array([1, 1])\nu_norm = (1 / np.linalg.norm(u, 2)) * u\nw = np.empty_like(trj[\"x\"][:, 0])\nproj_data = fl.Trajectories(dt=1e-3)\nfig, axs = plt.subplots()\nfor n, trj in enumerate(data):\n for i in range(len(trj[\"x\"])):\n w[i] = np.dot(trj[\"x\"][i], u_norm)\n proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj[\"x\"][:, 0]), 1))))\n axs.plot(proj_data[n][\"x\"])\n axs.set_xlabel(\"$timesteps$\")\n axs.set_ylabel(\"$w(t)$\")\n axs.set_title(\"trajectory projected along $u =$\" + str(u) + \" direction\")\n axs.grid()\n\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/c014d82536cd739a6f743f1c6ab12a79/example_em.py b/_downloads/c014d82536cd739a6f743f1c6ab12a79/example_em.py new file mode 100644 index 0000000..3302b43 --- /dev/null +++ b/_downloads/c014d82536cd739a6f743f1c6ab12a79/example_em.py @@ -0,0 +1,56 @@ +#!python3 +# -*- coding: utf-8 -*- + +""" +======================================= +Hidden Overdamped Langevin Estimation +======================================= + +How to run a simple estimation +""" + +import numpy as np +import matplotlib.pyplot as plt + +import folie as fl + +# Trouver comment on rentre les données +trj = np.loadtxt("datasets/example_2d.trj") +data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) +# for i in range(1, trj.shape[1]): +data.append(trj[:, 1:2]) + +fun_lin = fl.functions.Linear() +fun_cst = fl.functions.Constant() +model = fl.models.OverdampedHidden(fun_lin, fun_lin.copy(), fun_cst, dim=1, dim_h=2) +estimator = fl.EMEstimator(fl.EulerDensity(model), max_iter=3, verbose=2, verbose_interval=1) +model = estimator.fit_fetch(data) + +# To find a correct parametrization of the space +bins = np.histogram_bin_edges(data[0]["x"], bins=15) +xfa = (bins[1:] + bins[:-1]) / 2.0 + + +fig, axs = plt.subplots(1, 3) +# Force plot +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() +axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + + +# Friction plot +axs[1].set_title("Friction") +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$E_2(x)$") +axs[1].grid() +axs[1].plot(xfa, model.friction(xfa.reshape(-1, 1))[:, 0, :]) + +# Diffusion plot +axs[2].set_title("Diffusion") +axs[2].grid() +axs[2].plot(xfa, model.diffusion(xfa.reshape(-1, 1))[:, 0, 0]) +axs[2].set_xlabel("$x$") +axs[2].set_ylabel("$D(x)$") +plt.show() diff --git a/_downloads/c16f20a830bbd5ffd989ee3baa4cb246/plot_biased_2D_Double_Well.py b/_downloads/c16f20a830bbd5ffd989ee3baa4cb246/plot_biased_2D_Double_Well.py new file mode 100644 index 0000000..84af45a --- /dev/null +++ b/_downloads/c16f20a830bbd5ffd989ee3baa4cb246/plot_biased_2D_Double_Well.py @@ -0,0 +1,184 @@ +""" +================================ +2D Biased Double Well +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. +""" + +import numpy as np +import matplotlib.pyplot as plt +import folie as fl +from mpl_toolkits.mplot3d import Axes3D +from copy import deepcopy +import time + +checkpoint1 = time.time() +x = np.linspace(-1.8, 1.8, 36) +y = np.linspace(-1.8, 1.8, 36) +input = np.transpose(np.array([x, y])) + +D=0.5 +diff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2)) +a,b = 5, 10 +drift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ### +quartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ### + +X, Y = np.meshgrid(x, y) + +# Plot potential surface +pot = quartic2d.potential_plot(X, Y) +fig = plt.figure() +ax = plt.axes(projection="3d") +ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap="jet", edgecolor="none") + +# Plot Force function +ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1] +U, V = np.meshgrid(ff[:, 0], ff[:, 1]) +fig, ax = plt.subplots() +ax.quiver(x, y, U, V) +ax.set_title("Force") + + +##Definition of the Collective variable function of old coordinates +def colvar(x, y): + gradient = np.array([1, 1]) + return x + y, gradient # need to return both colvar function q=q(x,y) and gradient (dq/dx,dq/dy) + + +dt = 1e-3 +model_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function) +simulator = fl.simulations.ABMD_2D_to_1DColvar_Simulator(fl.simulations.EulerStepper(model_simu), dt, colvar=colvar, k=25.0, qstop=1.2) + +# Choose number of trajectories and initialize positions +ntraj = 20 +q0 = np.empty(shape=[ntraj, 2]) +for i in range(ntraj): + for j in range(2): + q0[i][j] = -1.2 + +#################################### +## CALCULATE TRAJECTORY ## +#################################### + +time_steps = 10000 +data = simulator.run(time_steps, q0, save_every=1) + +# Plot the resulting trajectories +fig, axs = plt.subplots() +for n, trj in enumerate(data): + axs.plot(trj["x"][:, 0], trj["x"][:, 1]) + axs.spines["left"].set_position("center") + axs.spines["right"].set_color("none") + axs.spines["bottom"].set_position("center") + axs.spines["top"].set_color("none") + axs.xaxis.set_ticks_position("bottom") + axs.yaxis.set_ticks_position("left") + axs.set_xlabel("$X(t)$") + axs.set_ylabel("$Y(t)$") + axs.set_title("X-Y Trajectory") + axs.set_xlim(-1.8, 1.8) + axs.set_ylim(-1.8, 1.8) + axs.grid() + +# plot x,y Trajectories in separate subplots +fig, bb = plt.subplots(1, 2) +for n, trj in enumerate(data): + bb[0].plot(trj["x"][:, 0]) + bb[1].plot(trj["x"][:, 1]) + + # Set visible axis + bb[0].spines["right"].set_color("none") + bb[0].spines["bottom"].set_position("center") + bb[0].spines["top"].set_color("none") + bb[0].xaxis.set_ticks_position("bottom") + bb[0].yaxis.set_ticks_position("left") + bb[0].set_xlabel("$timestep$") + bb[0].set_ylabel("$X(t)$") + + # Set visible axis + bb[1].spines["right"].set_color("none") + bb[1].spines["bottom"].set_position("center") + bb[1].spines["top"].set_color("none") + bb[1].xaxis.set_ticks_position("bottom") + bb[1].yaxis.set_ticks_position("left") + bb[1].set_xlabel("$timestep$") + bb[1].set_ylabel("$Y(t)$") + + bb[0].set_title("X Dynamics") + bb[1].set_title("Y Dynamics") + +######################################### +# PROJECTION ALONG CHOSEN COORDINATE # +######################################### + +# Choose unit versor of direction +u = np.array([1, 1]) +u_norm = (1 / np.linalg.norm(u, 2)) * u +w = np.empty_like(trj["x"][:, 0]) +b = np.empty_like(trj["x"][:, 0]) +proj_data = fl.data.trajectories.Trajectories(dt=dt) # create new Trajectory object in which to store the projected trajectory dictionaries +fig, axs = plt.subplots() +for n, trj in enumerate(data): + for i in range(len(trj["x"])): + w[i] = np.dot(trj["x"][i], u_norm) + b[i] = np.dot(trj["bias"][i], u_norm) + proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj["x"][:, 0]), 1)), bias=deepcopy(b.reshape(len(trj["bias"][:, 0]), 1)))) + axs.plot(proj_data[n]["x"]) + axs.set_xlabel("$timesteps$") + axs.set_ylabel("$w(t)$") + axs.set_title("trajectory projected along $u =$" + str(u) + " direction") + axs.grid() + +####################################### +## MODEL TRAINING ## +####################################### +checkpoint2 = time.time() + +domain = fl.MeshedDomain.create_from_range(np.linspace(proj_data.stats.min, proj_data.stats.max, 4).ravel()) +trainmodel = fl.models.OverdampedSplines1D(domain=domain) + +xfa = np.linspace(proj_data.stats.min, proj_data.stats.max, 75) +force_exact = (xfa**2 - 1.0) ** 2 + +fig, axs = plt.subplots(1, 2) +axs[0].set_title("Force") +axs[0].set_xlabel("$x$") +axs[0].set_ylabel("$F(x)$") +axs[0].grid() +axs[1].set_title("Diffusion") +axs[1].set_xlabel("$x$") +axs[1].set_ylabel("$D(x)$") +axs[1].grid() + + +KM_Estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel)) +res_KM = KM_Estimator.fit_fetch(proj_data) + +axs[0].plot(xfa, res_KM.force(xfa.reshape(-1, 1)), marker="x",label="KramersMoyal") +axs[1].plot(xfa, res_KM.diffusion(xfa.reshape(-1, 1)), marker="x",label="KramersMoyal") +print("KramersMoyal ", res_KM.coefficients) +for name,marker, transitioncls in zip( + ["Euler", "Elerian", "Kessler", "Drozdov"], + ["|","1","2","3"], + [ + fl.EulerDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], +): + estimator = fl.LikelihoodEstimator(transitioncls(deepcopy(trainmodel))) + res = estimator.fit_fetch(deepcopy(proj_data)) + print(name, res.coefficients) + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name) + +axs[0].legend() +axs[1].legend() +checkpoint3 = time.time() + +print("Training time =", checkpoint3 - checkpoint2, "seconds") +print("Overall time =", checkpoint3 - checkpoint1, "seconds") + +plt.show() diff --git a/_downloads/c260cb6d072e814474137988cf15ecb4/plot_2D_Double_Well.py b/_downloads/c260cb6d072e814474137988cf15ecb4/plot_2D_Double_Well.py new file mode 100644 index 0000000..41fbb4e --- /dev/null +++ b/_downloads/c260cb6d072e814474137988cf15ecb4/plot_2D_Double_Well.py @@ -0,0 +1,120 @@ +""" +================================ +2D Double Well +================================ + +Estimation of an overdamped Langevin. +""" + +import numpy as np +import matplotlib.pyplot as plt +import folie as fl +from mpl_toolkits.mplot3d import Axes3D +from copy import deepcopy + +""" Script for simulation of 2D double well and projection along user provided direction, No fitting is carried out """ +x = np.linspace(-1.8, 1.8, 36) +y = np.linspace(-1.8, 1.8, 36) +input = np.transpose(np.array([x, y])) + +D=0.5 +diff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2)) +a,b = 5, 10 +drift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ### +quartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ### + +X, Y = np.meshgrid(x, y) + +# Plot potential surface +pot = quartic2d.potential_plot(X, Y) + +fig = plt.figure() +ax = plt.axes(projection="3d") +ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap="jet", edgecolor="none") + +# Plot Force function +ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1] +U, V = np.meshgrid(ff[:, 0], ff[:, 1]) +fig, ax = plt.subplots() +ax.quiver(x, y, U, V) +ax.set_title("Force") + +dt= 5e-4 +model_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function) +simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) + +# initialize positions +ntraj = 30 +q0 = np.empty(shape=[ntraj, 2]) +for i in range(ntraj): + for j in range(2): + q0[i][j] = 0.000 + +# Calculate Trajectory +time_steps = 3000 +data = simulator.run(time_steps, q0, save_every=1) + +# Plot the resulting trajectories +fig, axs = plt.subplots() +for n, trj in enumerate(data): + axs.plot(trj["x"][:, 0], trj["x"][:, 1]) + axs.spines["left"].set_position("center") + axs.spines["right"].set_color("none") + axs.spines["bottom"].set_position("center") + axs.spines["top"].set_color("none") + axs.xaxis.set_ticks_position("bottom") + axs.yaxis.set_ticks_position("left") + axs.set_xlabel("$X(t)$") + axs.set_ylabel("$Y(t)$") + axs.set_title("X-Y Trajectory") + axs.grid() + +# plot Trajectories +fig, bb = plt.subplots(1, 2) +for n, trj in enumerate(data): + bb[0].plot(trj["x"][:, 0]) + bb[1].plot(trj["x"][:, 1]) + + # Set visible axis + bb[0].spines["right"].set_color("none") + bb[0].spines["bottom"].set_position("center") + bb[0].spines["top"].set_color("none") + bb[0].xaxis.set_ticks_position("bottom") + bb[0].yaxis.set_ticks_position("left") + bb[0].set_xlabel("$timestep$") + bb[0].set_ylabel("$X(t)$") + + # Set visible axis + bb[1].spines["right"].set_color("none") + bb[1].spines["bottom"].set_position("center") + bb[1].spines["top"].set_color("none") + bb[1].xaxis.set_ticks_position("bottom") + bb[1].yaxis.set_ticks_position("left") + bb[1].set_xlabel("$timestep$") + bb[1].set_ylabel("$Y(t)$") + + bb[0].set_title("X Dynamics") + bb[1].set_title("Y Dynamics") + + +######################################### +# PROJECTION ALONG CHOSEN COORDINATE # +######################################### + +# Choose unit versor of direction +u = np.array([1, 1]) +u_norm = (1 / np.linalg.norm(u, 2)) * u +w = np.empty_like(trj["x"][:, 0]) +proj_data = fl.Trajectories(dt=1e-3) +fig, axs = plt.subplots() +for n, trj in enumerate(data): + for i in range(len(trj["x"])): + w[i] = np.dot(trj["x"][i], u_norm) + proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj["x"][:, 0]), 1)))) + axs.plot(proj_data[n]["x"]) + axs.set_xlabel("$timesteps$") + axs.set_ylabel("$w(t)$") + axs.set_title("trajectory projected along $u =$" + str(u) + " direction") + axs.grid() + +plt.show() diff --git a/_downloads/cfc0ebf3b0506f67c01960afbf90cae2/plot_functions.py b/_downloads/cfc0ebf3b0506f67c01960afbf90cae2/plot_functions.py new file mode 100644 index 0000000..6b3011c --- /dev/null +++ b/_downloads/cfc0ebf3b0506f67c01960afbf90cae2/plot_functions.py @@ -0,0 +1,47 @@ +#!python3 +# -*- coding: utf-8 -*- + +""" +=========================== +Functional set +=========================== + +In this example, we present a subset of implemented functions. +""" + +import numpy as np +import matplotlib.pyplot as plt + +import folie.functions as ff +import folie as fl + +from scipy.interpolate import splrep + +x_range = np.linspace(-2, 2, 30).reshape(-1, 1) + +domain = fl.MeshedDomain.create_from_range(np.linspace(-2, 2, 6)) + + +t, c, k = splrep(x_range, x_range**4 - 2 * x_range**2 + 0.5 * x_range) + +fun_set = { + "Linear": ff.Linear(domain=domain), + "Polynom": ff.Polynomial(3, domain=domain), + "Hermite Polynom": ff.Polynomial(3, np.polynomial.Hermite, domain=domain), + "Fourier": ff.Fourier(order=2, freq=1.0, domain=domain), + "B Splines": ff.BSplinesFunction(domain=domain, k=3), +} + +fig_kernel, axs = plt.subplots(2, 3) +m = 0 +for key, fun in fun_set.items(): + axs[m // 3][m % 3].set_title(key) + axs[m // 3][m % 3].set_xlabel("$x$") + axs[m // 3][m % 3].set_ylabel("$h_k(x)$") + axs[m // 3][m % 3].grid() + y = fun.grad_coeffs(x_range) + + for n in range(y.shape[1]): + axs[m // 3][m % 3].plot(x_range[:, 0], y[:, n]) + m += 1 +plt.show() diff --git a/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png b/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png new file mode 100644 index 0000000..61e1778 Binary files /dev/null and b/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png differ diff --git a/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png.map b/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png.map new file mode 100644 index 0000000..4feb5e2 --- /dev/null +++ b/_images/inheritance-cc06340979a6f651a309c3867cf1d4a198054bae.png.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_images/notebooks_estimation_5_1.png b/_images/notebooks_estimation_5_1.png new file mode 100644 index 0000000..8aa5f7c Binary files /dev/null and b/_images/notebooks_estimation_5_1.png differ diff --git a/_images/notebooks_estimation_6_1.png b/_images/notebooks_estimation_6_1.png new file mode 100644 index 0000000..af176fd Binary files /dev/null and b/_images/notebooks_estimation_6_1.png differ diff --git a/_images/notebooks_estimation_8_1.png b/_images/notebooks_estimation_8_1.png new file mode 100644 index 0000000..ef81350 Binary files /dev/null and b/_images/notebooks_estimation_8_1.png differ diff --git a/_images/notebooks_simulations_6_0.png b/_images/notebooks_simulations_6_0.png new file mode 100644 index 0000000..3c84377 Binary files /dev/null and b/_images/notebooks_simulations_6_0.png differ diff --git a/_images/notebooks_simulations_9_0.png b/_images/notebooks_simulations_9_0.png new file mode 100644 index 0000000..866fbd1 Binary files /dev/null and b/_images/notebooks_simulations_9_0.png differ diff --git a/_images/notebooks_tutorials_DNAhairpin_6_1.png b/_images/notebooks_tutorials_DNAhairpin_6_1.png new file mode 100644 index 0000000..8aa5f7c Binary files /dev/null and b/_images/notebooks_tutorials_DNAhairpin_6_1.png differ diff --git a/_images/notebooks_tutorials_DNAhairpin_7_1.png b/_images/notebooks_tutorials_DNAhairpin_7_1.png new file mode 100644 index 0000000..af176fd Binary files /dev/null and b/_images/notebooks_tutorials_DNAhairpin_7_1.png differ diff --git a/_images/notebooks_tutorials_DNAhairpin_9_1.png b/_images/notebooks_tutorials_DNAhairpin_9_1.png new file mode 100644 index 0000000..ef81350 Binary files /dev/null and b/_images/notebooks_tutorials_DNAhairpin_9_1.png differ diff --git a/_images/notebooks_tutorials_alanine_dipeptide_5_0.png b/_images/notebooks_tutorials_alanine_dipeptide_5_0.png new file mode 100644 index 0000000..aa74787 Binary files /dev/null and b/_images/notebooks_tutorials_alanine_dipeptide_5_0.png differ diff --git a/_images/sphx_glr_example_em_thumb.png b/_images/sphx_glr_example_em_thumb.png new file mode 100644 index 0000000..8a5fed5 Binary files /dev/null and b/_images/sphx_glr_example_em_thumb.png differ diff --git a/_images/sphx_glr_plot_1D_Double_Well_001.png b/_images/sphx_glr_plot_1D_Double_Well_001.png new file mode 100644 index 0000000..eca2ce9 Binary files /dev/null and b/_images/sphx_glr_plot_1D_Double_Well_001.png differ diff --git a/_images/sphx_glr_plot_1D_Double_Well_002.png b/_images/sphx_glr_plot_1D_Double_Well_002.png new file mode 100644 index 0000000..a968712 Binary files /dev/null and b/_images/sphx_glr_plot_1D_Double_Well_002.png differ diff --git a/_images/sphx_glr_plot_1D_Double_Well_003.png b/_images/sphx_glr_plot_1D_Double_Well_003.png new file mode 100644 index 0000000..46aea33 Binary files /dev/null and b/_images/sphx_glr_plot_1D_Double_Well_003.png differ diff --git a/_images/sphx_glr_plot_1D_Double_Well_thumb.png b/_images/sphx_glr_plot_1D_Double_Well_thumb.png new file mode 100644 index 0000000..3096c53 Binary files /dev/null and b/_images/sphx_glr_plot_1D_Double_Well_thumb.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_001.png b/_images/sphx_glr_plot_2D_Double_Well_001.png new file mode 100644 index 0000000..2e27870 Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_001.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_002.png b/_images/sphx_glr_plot_2D_Double_Well_002.png new file mode 100644 index 0000000..4d0ea9b Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_002.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_003.png b/_images/sphx_glr_plot_2D_Double_Well_003.png new file mode 100644 index 0000000..49006af Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_003.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_004.png b/_images/sphx_glr_plot_2D_Double_Well_004.png new file mode 100644 index 0000000..a7f2f5b Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_004.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_005.png b/_images/sphx_glr_plot_2D_Double_Well_005.png new file mode 100644 index 0000000..2a6a29f Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_005.png differ diff --git a/_images/sphx_glr_plot_2D_Double_Well_thumb.png b/_images/sphx_glr_plot_2D_Double_Well_thumb.png new file mode 100644 index 0000000..91dc84a Binary files /dev/null and b/_images/sphx_glr_plot_2D_Double_Well_thumb.png differ diff --git a/_images/sphx_glr_plot_biasedOU_001.png b/_images/sphx_glr_plot_biasedOU_001.png new file mode 100644 index 0000000..2397363 Binary files /dev/null and b/_images/sphx_glr_plot_biasedOU_001.png differ diff --git a/_images/sphx_glr_plot_biasedOU_002.png b/_images/sphx_glr_plot_biasedOU_002.png new file mode 100644 index 0000000..0891045 Binary files /dev/null and b/_images/sphx_glr_plot_biasedOU_002.png differ diff --git a/_images/sphx_glr_plot_biasedOU_thumb.png b/_images/sphx_glr_plot_biasedOU_thumb.png new file mode 100644 index 0000000..99240fe Binary files /dev/null and b/_images/sphx_glr_plot_biasedOU_thumb.png differ diff --git a/_images/sphx_glr_plot_biased_1D_Double_Well_001.png b/_images/sphx_glr_plot_biased_1D_Double_Well_001.png new file mode 100644 index 0000000..bdf5eb8 Binary files /dev/null and b/_images/sphx_glr_plot_biased_1D_Double_Well_001.png differ diff --git a/_images/sphx_glr_plot_biased_1D_Double_Well_002.png b/_images/sphx_glr_plot_biased_1D_Double_Well_002.png new file mode 100644 index 0000000..7b1bbc3 Binary files /dev/null and b/_images/sphx_glr_plot_biased_1D_Double_Well_002.png differ diff --git a/_images/sphx_glr_plot_biased_1D_Double_Well_003.png b/_images/sphx_glr_plot_biased_1D_Double_Well_003.png new file mode 100644 index 0000000..8ea5512 Binary files /dev/null and b/_images/sphx_glr_plot_biased_1D_Double_Well_003.png differ diff --git a/_images/sphx_glr_plot_biased_1D_Double_Well_thumb.png b/_images/sphx_glr_plot_biased_1D_Double_Well_thumb.png new file mode 100644 index 0000000..b514cff Binary files /dev/null and b/_images/sphx_glr_plot_biased_1D_Double_Well_thumb.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_001.png b/_images/sphx_glr_plot_biased_2D_Double_Well_001.png new file mode 100644 index 0000000..2e27870 Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_001.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_002.png b/_images/sphx_glr_plot_biased_2D_Double_Well_002.png new file mode 100644 index 0000000..4d0ea9b Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_002.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_003.png b/_images/sphx_glr_plot_biased_2D_Double_Well_003.png new file mode 100644 index 0000000..923e4da Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_003.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_004.png b/_images/sphx_glr_plot_biased_2D_Double_Well_004.png new file mode 100644 index 0000000..c9dc5bc Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_004.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_005.png b/_images/sphx_glr_plot_biased_2D_Double_Well_005.png new file mode 100644 index 0000000..2d7c3f1 Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_005.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_006.png b/_images/sphx_glr_plot_biased_2D_Double_Well_006.png new file mode 100644 index 0000000..ffd068a Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_006.png differ diff --git a/_images/sphx_glr_plot_biased_2D_Double_Well_thumb.png b/_images/sphx_glr_plot_biased_2D_Double_Well_thumb.png new file mode 100644 index 0000000..91dc84a Binary files /dev/null and b/_images/sphx_glr_plot_biased_2D_Double_Well_thumb.png differ diff --git a/_images/sphx_glr_plot_example_001.png b/_images/sphx_glr_plot_example_001.png new file mode 100644 index 0000000..08ab6de Binary files /dev/null and b/_images/sphx_glr_plot_example_001.png differ diff --git a/_images/sphx_glr_plot_example_thumb.png b/_images/sphx_glr_plot_example_thumb.png new file mode 100644 index 0000000..d9792fd Binary files /dev/null and b/_images/sphx_glr_plot_example_thumb.png differ diff --git a/_images/sphx_glr_plot_fem_001.png b/_images/sphx_glr_plot_fem_001.png new file mode 100644 index 0000000..fdbd9f0 Binary files /dev/null and b/_images/sphx_glr_plot_fem_001.png differ diff --git a/_images/sphx_glr_plot_fem_thumb.png b/_images/sphx_glr_plot_fem_thumb.png new file mode 100644 index 0000000..3bb7558 Binary files /dev/null and b/_images/sphx_glr_plot_fem_thumb.png differ diff --git a/_images/sphx_glr_plot_functions_001.png b/_images/sphx_glr_plot_functions_001.png new file mode 100644 index 0000000..ee27e66 Binary files /dev/null and b/_images/sphx_glr_plot_functions_001.png differ diff --git a/_images/sphx_glr_plot_functions_thumb.png b/_images/sphx_glr_plot_functions_thumb.png new file mode 100644 index 0000000..70285a4 Binary files /dev/null and b/_images/sphx_glr_plot_functions_thumb.png differ diff --git a/_images/sphx_glr_plot_likelihood_001.png b/_images/sphx_glr_plot_likelihood_001.png new file mode 100644 index 0000000..a744c75 Binary files /dev/null and b/_images/sphx_glr_plot_likelihood_001.png differ diff --git a/_images/sphx_glr_plot_likelihood_thumb.png b/_images/sphx_glr_plot_likelihood_thumb.png new file mode 100644 index 0000000..bde9118 Binary files /dev/null and b/_images/sphx_glr_plot_likelihood_thumb.png differ diff --git a/_sources/api/analysis.rst.txt b/_sources/api/analysis.rst.txt new file mode 100644 index 0000000..0d6cacd --- /dev/null +++ b/_sources/api/analysis.rst.txt @@ -0,0 +1,18 @@ +================= +Analysis +================= + +.. currentmodule:: folie + + +Overdamped 1D models +========================= +.. autosummary:: + :toctree: generated/ + :template: function.rst + + analysis.free_energy_profile_1d + + analysis.mfpt_1d + + diff --git a/_sources/api/dataloading.rst.txt b/_sources/api/dataloading.rst.txt new file mode 100644 index 0000000..4045269 --- /dev/null +++ b/_sources/api/dataloading.rst.txt @@ -0,0 +1,14 @@ +================= +Data loading +================= + +.. currentmodule:: folie + + +Loading trajectories +========================= +.. autosummary:: + :toctree: generated/ + :template: function.rst + + Trajectories diff --git a/_sources/api/estimation.rst.txt b/_sources/api/estimation.rst.txt new file mode 100644 index 0000000..cae27dc --- /dev/null +++ b/_sources/api/estimation.rst.txt @@ -0,0 +1,47 @@ +================= +Estimation +================= + +.. currentmodule:: folie + + +Direct estimation +========================= +.. autosummary:: + :toctree: generated/ + :template: class.rst + + KramersMoyalEstimator + +Likelihood estimation +========================= + + .. autosummary:: + :toctree: generated/ + :template: class.rst + + LikelihoodEstimator + + ELBOEstimator + + EMEstimator + +Overdamped Transition density +-------------------------------- +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ExactDensity + + EulerDensity + + OzakiDensity + + ShojiOzakiDensity + + ElerianDensity + + KesslerDensity + + DrozdovDensity diff --git a/_sources/api/functions.rst.txt b/_sources/api/functions.rst.txt new file mode 100644 index 0000000..9d1bc34 --- /dev/null +++ b/_sources/api/functions.rst.txt @@ -0,0 +1,41 @@ +=================== +Spatial dependence +=================== + +.. currentmodule:: folie.functions + + + +Parameteric Functions +========================= + .. autosummary:: + :toctree: generated/ + :template: class.rst + + Constant + + Linear + + Polynomial + + Fourier + + BSplinesFunction + + sklearnBSplines + + sklearnTransformer + + FiniteElement + + ModelOverlay + +Non Parametric Functions +========================= +.. autosummary:: + :toctree: generated/ + :template: class.rst + + sklearnWrapper + + KernelFunction diff --git a/_sources/api/generated/folie.BrownianMotion.rst.txt b/_sources/api/generated/folie.BrownianMotion.rst.txt new file mode 100644 index 0000000..9ac90b3 --- /dev/null +++ b/_sources/api/generated/folie.BrownianMotion.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.BrownianMotion +================================== + +.. currentmodule:: folie + +.. autoclass:: BrownianMotion + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.BrownianMotion.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.DrozdovDensity.rst.txt b/_sources/api/generated/folie.DrozdovDensity.rst.txt new file mode 100644 index 0000000..4a8cd8e --- /dev/null +++ b/_sources/api/generated/folie.DrozdovDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.DrozdovDensity +================================== + +.. currentmodule:: folie + +.. autoclass:: DrozdovDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.DrozdovDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.ELBOEstimator.rst.txt b/_sources/api/generated/folie.ELBOEstimator.rst.txt new file mode 100644 index 0000000..d783b9e --- /dev/null +++ b/_sources/api/generated/folie.ELBOEstimator.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.ELBOEstimator +================================= + +.. currentmodule:: folie + +.. autoclass:: ELBOEstimator + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.ELBOEstimator.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.EMEstimator.rst.txt b/_sources/api/generated/folie.EMEstimator.rst.txt new file mode 100644 index 0000000..bda63d9 --- /dev/null +++ b/_sources/api/generated/folie.EMEstimator.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.EMEstimator +=============================== + +.. currentmodule:: folie + +.. autoclass:: EMEstimator + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.EMEstimator.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.ElerianDensity.rst.txt b/_sources/api/generated/folie.ElerianDensity.rst.txt new file mode 100644 index 0000000..2908e86 --- /dev/null +++ b/_sources/api/generated/folie.ElerianDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.ElerianDensity +================================== + +.. currentmodule:: folie + +.. autoclass:: ElerianDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.ElerianDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.EulerDensity.rst.txt b/_sources/api/generated/folie.EulerDensity.rst.txt new file mode 100644 index 0000000..402b16e --- /dev/null +++ b/_sources/api/generated/folie.EulerDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.EulerDensity +================================ + +.. currentmodule:: folie + +.. autoclass:: EulerDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.EulerDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.ExactDensity.rst.txt b/_sources/api/generated/folie.ExactDensity.rst.txt new file mode 100644 index 0000000..49e8f55 --- /dev/null +++ b/_sources/api/generated/folie.ExactDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.ExactDensity +================================ + +.. currentmodule:: folie + +.. autoclass:: ExactDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.ExactDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.KesslerDensity.rst.txt b/_sources/api/generated/folie.KesslerDensity.rst.txt new file mode 100644 index 0000000..4a7173a --- /dev/null +++ b/_sources/api/generated/folie.KesslerDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.KesslerDensity +================================== + +.. currentmodule:: folie + +.. autoclass:: KesslerDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.KesslerDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.KramersMoyalEstimator.rst.txt b/_sources/api/generated/folie.KramersMoyalEstimator.rst.txt new file mode 100644 index 0000000..0a3b88a --- /dev/null +++ b/_sources/api/generated/folie.KramersMoyalEstimator.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.KramersMoyalEstimator +========================================= + +.. currentmodule:: folie + +.. autoclass:: KramersMoyalEstimator + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.KramersMoyalEstimator.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.LikelihoodEstimator.rst.txt b/_sources/api/generated/folie.LikelihoodEstimator.rst.txt new file mode 100644 index 0000000..06b6baf --- /dev/null +++ b/_sources/api/generated/folie.LikelihoodEstimator.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.LikelihoodEstimator +======================================= + +.. currentmodule:: folie + +.. autoclass:: LikelihoodEstimator + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.LikelihoodEstimator.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.OrnsteinUhlenbeck.rst.txt b/_sources/api/generated/folie.OrnsteinUhlenbeck.rst.txt new file mode 100644 index 0000000..38ab6e7 --- /dev/null +++ b/_sources/api/generated/folie.OrnsteinUhlenbeck.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.OrnsteinUhlenbeck +===================================== + +.. currentmodule:: folie + +.. autoclass:: OrnsteinUhlenbeck + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.OrnsteinUhlenbeck.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.Overdamped.rst.txt b/_sources/api/generated/folie.Overdamped.rst.txt new file mode 100644 index 0000000..0353e22 --- /dev/null +++ b/_sources/api/generated/folie.Overdamped.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.Overdamped +============================== + +.. currentmodule:: folie + +.. autoclass:: Overdamped + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.Overdamped.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.OverdampedSplines1D.rst.txt b/_sources/api/generated/folie.OverdampedSplines1D.rst.txt new file mode 100644 index 0000000..547c19c --- /dev/null +++ b/_sources/api/generated/folie.OverdampedSplines1D.rst.txt @@ -0,0 +1,12 @@ +:mod:`folie`.OverdampedSplines1D +============================================= + +.. currentmodule:: folie + +.. autofunction:: OverdampedSplines1D + +.. include:: folie.OverdampedSplines1D.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.OzakiDensity.rst.txt b/_sources/api/generated/folie.OzakiDensity.rst.txt new file mode 100644 index 0000000..4d753eb --- /dev/null +++ b/_sources/api/generated/folie.OzakiDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.OzakiDensity +================================ + +.. currentmodule:: folie + +.. autoclass:: OzakiDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.OzakiDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.ShojiOzakiDensity.rst.txt b/_sources/api/generated/folie.ShojiOzakiDensity.rst.txt new file mode 100644 index 0000000..c021731 --- /dev/null +++ b/_sources/api/generated/folie.ShojiOzakiDensity.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie`.ShojiOzakiDensity +===================================== + +.. currentmodule:: folie + +.. autoclass:: ShojiOzakiDensity + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.ShojiOzakiDensity.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.Trajectories.rst.txt b/_sources/api/generated/folie.Trajectories.rst.txt new file mode 100644 index 0000000..b906004 --- /dev/null +++ b/_sources/api/generated/folie.Trajectories.rst.txt @@ -0,0 +1,12 @@ +:mod:`folie`.Trajectories +====================================== + +.. currentmodule:: folie + +.. autofunction:: Trajectories + +.. include:: folie.Trajectories.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.analysis.free_energy_profile_1d.rst.txt b/_sources/api/generated/folie.analysis.free_energy_profile_1d.rst.txt new file mode 100644 index 0000000..eee4747 --- /dev/null +++ b/_sources/api/generated/folie.analysis.free_energy_profile_1d.rst.txt @@ -0,0 +1,12 @@ +:mod:`folie.analysis`.free_energy_profile_1d +========================================================= + +.. currentmodule:: folie.analysis + +.. autofunction:: free_energy_profile_1d + +.. include:: folie.analysis.free_energy_profile_1d.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.analysis.mfpt_1d.rst.txt b/_sources/api/generated/folie.analysis.mfpt_1d.rst.txt new file mode 100644 index 0000000..5d915c4 --- /dev/null +++ b/_sources/api/generated/folie.analysis.mfpt_1d.rst.txt @@ -0,0 +1,12 @@ +:mod:`folie.analysis`.mfpt_1d +========================================== + +.. currentmodule:: folie.analysis + +.. autofunction:: mfpt_1d + +.. include:: folie.analysis.mfpt_1d.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.BSplinesFunction.rst.txt b/_sources/api/generated/folie.functions.BSplinesFunction.rst.txt new file mode 100644 index 0000000..755e7c3 --- /dev/null +++ b/_sources/api/generated/folie.functions.BSplinesFunction.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.BSplinesFunction +============================================== + +.. currentmodule:: folie.functions + +.. autoclass:: BSplinesFunction + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.BSplinesFunction.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.Constant.rst.txt b/_sources/api/generated/folie.functions.Constant.rst.txt new file mode 100644 index 0000000..d892240 --- /dev/null +++ b/_sources/api/generated/folie.functions.Constant.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.Constant +====================================== + +.. currentmodule:: folie.functions + +.. autoclass:: Constant + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.Constant.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.FiniteElement.rst.txt b/_sources/api/generated/folie.functions.FiniteElement.rst.txt new file mode 100644 index 0000000..94ad6d1 --- /dev/null +++ b/_sources/api/generated/folie.functions.FiniteElement.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.FiniteElement +=========================================== + +.. currentmodule:: folie.functions + +.. autoclass:: FiniteElement + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.FiniteElement.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.Fourier.rst.txt b/_sources/api/generated/folie.functions.Fourier.rst.txt new file mode 100644 index 0000000..97f0a8a --- /dev/null +++ b/_sources/api/generated/folie.functions.Fourier.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.Fourier +===================================== + +.. currentmodule:: folie.functions + +.. autoclass:: Fourier + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.Fourier.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.KernelFunction.rst.txt b/_sources/api/generated/folie.functions.KernelFunction.rst.txt new file mode 100644 index 0000000..a37e314 --- /dev/null +++ b/_sources/api/generated/folie.functions.KernelFunction.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.KernelFunction +============================================ + +.. currentmodule:: folie.functions + +.. autoclass:: KernelFunction + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.KernelFunction.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.Linear.rst.txt b/_sources/api/generated/folie.functions.Linear.rst.txt new file mode 100644 index 0000000..9dc482e --- /dev/null +++ b/_sources/api/generated/folie.functions.Linear.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.Linear +==================================== + +.. currentmodule:: folie.functions + +.. autoclass:: Linear + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.Linear.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.ModelOverlay.rst.txt b/_sources/api/generated/folie.functions.ModelOverlay.rst.txt new file mode 100644 index 0000000..eb610a3 --- /dev/null +++ b/_sources/api/generated/folie.functions.ModelOverlay.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.ModelOverlay +========================================== + +.. currentmodule:: folie.functions + +.. autoclass:: ModelOverlay + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.ModelOverlay.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.Polynomial.rst.txt b/_sources/api/generated/folie.functions.Polynomial.rst.txt new file mode 100644 index 0000000..77b55fc --- /dev/null +++ b/_sources/api/generated/folie.functions.Polynomial.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.Polynomial +======================================== + +.. currentmodule:: folie.functions + +.. autoclass:: Polynomial + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.Polynomial.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.sklearnBSplines.rst.txt b/_sources/api/generated/folie.functions.sklearnBSplines.rst.txt new file mode 100644 index 0000000..ba1e31c --- /dev/null +++ b/_sources/api/generated/folie.functions.sklearnBSplines.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.sklearnBSplines +============================================= + +.. currentmodule:: folie.functions + +.. autoclass:: sklearnBSplines + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.sklearnBSplines.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.sklearnTransformer.rst.txt b/_sources/api/generated/folie.functions.sklearnTransformer.rst.txt new file mode 100644 index 0000000..4cd5504 --- /dev/null +++ b/_sources/api/generated/folie.functions.sklearnTransformer.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.sklearnTransformer +================================================ + +.. currentmodule:: folie.functions + +.. autoclass:: sklearnTransformer + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.sklearnTransformer.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/generated/folie.functions.sklearnWrapper.rst.txt b/_sources/api/generated/folie.functions.sklearnWrapper.rst.txt new file mode 100644 index 0000000..fe1a07b --- /dev/null +++ b/_sources/api/generated/folie.functions.sklearnWrapper.rst.txt @@ -0,0 +1,15 @@ +:mod:`folie.functions`.sklearnWrapper +============================================ + +.. currentmodule:: folie.functions + +.. autoclass:: sklearnWrapper + :members: + :inherited-members: + :special-members: __init__ + +.. include:: folie.functions.sklearnWrapper.examples + +.. raw:: html + +
\ No newline at end of file diff --git a/_sources/api/models.rst.txt b/_sources/api/models.rst.txt new file mode 100644 index 0000000..652cf77 --- /dev/null +++ b/_sources/api/models.rst.txt @@ -0,0 +1,22 @@ +================================== +Models of Langevin dynamics +================================== + +.. currentmodule:: folie + + +Available models of Langevin equation +======================================= + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + Overdamped + + BrownianMotion + + OrnsteinUhlenbeck + + :template: function.rst + OverdampedSplines1D diff --git a/_sources/auto_examples/example_em.rst.txt b/_sources/auto_examples/example_em.rst.txt new file mode 100644 index 0000000..638a8bf --- /dev/null +++ b/_sources/auto_examples/example_em.rst.txt @@ -0,0 +1,98 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_em.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_em.py: + + +======================================= +Hidden Overdamped Langevin Estimation +======================================= + +How to run a simple estimation + +.. GENERATED FROM PYTHON SOURCE LINES 11-57 + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + + import folie as fl + + # Trouver comment on rentre les données + trj = np.loadtxt("datasets/example_2d.trj") + data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) + # for i in range(1, trj.shape[1]): + data.append(trj[:, 1:2]) + + fun_lin = fl.functions.Linear() + fun_cst = fl.functions.Constant() + model = fl.models.OverdampedHidden(fun_lin, fun_lin.copy(), fun_cst, dim=1, dim_h=2) + estimator = fl.EMEstimator(fl.EulerDensity(model), max_iter=3, verbose=2, verbose_interval=1) + model = estimator.fit_fetch(data) + + # To find a correct parametrization of the space + bins = np.histogram_bin_edges(data[0]["x"], bins=15) + xfa = (bins[1:] + bins[:-1]) / 2.0 + + + fig, axs = plt.subplots(1, 3) + # Force plot + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + + + # Friction plot + axs[1].set_title("Friction") + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$E_2(x)$") + axs[1].grid() + axs[1].plot(xfa, model.friction(xfa.reshape(-1, 1))[:, 0, :]) + + # Diffusion plot + axs[2].set_title("Diffusion") + axs[2].grid() + axs[2].plot(xfa, model.diffusion(xfa.reshape(-1, 1))[:, 0, 0]) + axs[2].set_xlabel("$x$") + axs[2].set_ylabel("$D(x)$") + plt.show() + + +.. _sphx_glr_download_auto_examples_example_em.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_em.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_em.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/index.rst.txt b/_sources/auto_examples/index.rst.txt new file mode 100644 index 0000000..ce1184f --- /dev/null +++ b/_sources/auto_examples/index.rst.txt @@ -0,0 +1,251 @@ +:orphan: + +.. _general_examples: + +General examples +================ + +Introductory examples. + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_plot_example_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_plot_example.py` + +.. raw:: html + +
Overdamped Langevin Estimation
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_plot_functions_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_plot_functions.py` + +.. raw:: html + +
Functional set
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_plot_fem_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_plot_fem.py` + +.. raw:: html + +
Overdamped Langevin Estimation
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_em_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_em.py` + +.. raw:: html + +
Hidden Overdamped Langevin Estimation
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_plot_likelihood_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_plot_likelihood.py` + +.. raw:: html + +
Likelihood functions
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_plot_biasedOU_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_plot_biasedOU.py` + +.. raw:: html + +
ABMD biased dynamics
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_example + /auto_examples/plot_functions + /auto_examples/plot_fem + /auto_examples/example_em + /auto_examples/plot_likelihood + /auto_examples/plot_biasedOU + + +Toys models +================ + +A set examples for 1D/2D double well potential. + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_biased_1D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_biased_1D_Double_Well.py` + +.. raw:: html + +
1D Biased Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_1D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_1D_Double_Well.py` + +.. raw:: html + +
1D Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_2D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_2D_Double_Well.py` + +.. raw:: html + +
2D Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_biased_2D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_biased_2D_Double_Well.py` + +.. raw:: html + +
2D Biased Double Well
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + :includehidden: + + + /auto_examples/toy_models/index.rst + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: auto_examples_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/plot_biasedOU.rst.txt b/_sources/auto_examples/plot_biasedOU.rst.txt new file mode 100644 index 0000000..a27d905 --- /dev/null +++ b/_sources/auto_examples/plot_biasedOU.rst.txt @@ -0,0 +1,170 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/plot_biasedOU.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_plot_biasedOU.py: + + +================================ +ABMD biased dynamics +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. + +.. GENERATED FROM PYTHON SOURCE LINES 8-74 + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/images/sphx_glr_plot_biasedOU_001.png + :alt: plot biasedOU + :srcset: /auto_examples/images/sphx_glr_plot_biasedOU_001.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/images/sphx_glr_plot_biasedOU_002.png + :alt: Force, Diffusion + :srcset: /auto_examples/images/sphx_glr_plot_biasedOU_002.png + :class: sphx-glr-multi-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + KramersMoyal [-7.00062709 -1.0219242 2.02065013] True + Euler [-6.73599914 0.14711447 2.01329581] True + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:190: RuntimeWarning: invalid value encountered in log + Kt = (2 / dt) * np.log(1 + temp / x.ravel()) + Ozaki [-7.00062709 -1.0219242 2.02065013] True + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:212: RuntimeWarning: invalid value encountered in sqrt + sig = np.sqrt(2 * self._model.diffusion(x, **kwargs).ravel()) + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:221: RuntimeWarning: overflow encountered in exp + B = sig * np.sqrt((np.exp(2 * Lt * dt) - 1) / (2 * Lt)) + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:223: RuntimeWarning: overflow encountered in exp + elt = np.exp(Lt * dt) - 1 + ShojiOzaki [-7.00062709 -1.0219242 2.02065013] True + Elerian [ 0.44816208 -1.23794105 2.0069151 ] True + Kessler [ 0.44169102 -1.23768858 2.0093377 ] True + Drozdov [ 0.43729797 -1.23683966 2.00936134] True + + + + + + +| + +.. code-block:: Python + + + import numpy as np + import folie as fl + import matplotlib.pyplot as plt + + + # First let's generate some biased trajectories + + model_simu = fl.models.OrnsteinUhlenbeck(0.0, 1.2, 2.0) + simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0) + data = simulator.run(5000, np.zeros((25,)), 1) + xmax = np.concatenate(simulator.xmax_hist, axis=1).T + + # Plot the resulting trajectories + # sphinx_gallery_thumbnail_number = 1 + fig, axs = plt.subplots(1, 2) + for n, trj in enumerate(data): + axs[0].plot(trj["x"]) + axs[1].plot(xmax[:, n]) + + fig, axs = plt.subplots(1, 2) + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + + axs[1].set_title("Diffusion") + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + axs[1].grid() + + + xfa = np.linspace(-7.0, 7.0, 75) + model_simu.remove_bias() + axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") + axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") + + name = "KramersMoyal" + estimator = fl.KramersMoyalEstimator(fl.models.OrnsteinUhlenbeck(has_bias=True)) + res = estimator.fit_fetch(data) + print(name, res.coefficients, res.is_biased) + res.remove_bias() + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), "--", label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), "--", label=name) + + for name, marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["+", "x", "P", "1", "2", "3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], + ): + estimator = fl.LikelihoodEstimator(transitioncls(fl.models.OrnsteinUhlenbeck(has_bias=True))) + res = estimator.fit_fetch(data) + print(name, res.coefficients, res.is_biased) + res.remove_bias() + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker, label=name) + axs[0].legend() + axs[1].legend() + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 7.511 seconds) + + +.. _sphx_glr_download_auto_examples_plot_biasedOU.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_biasedOU.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_biasedOU.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/plot_example.rst.txt b/_sources/auto_examples/plot_example.rst.txt new file mode 100644 index 0000000..26f4326 --- /dev/null +++ b/_sources/auto_examples/plot_example.rst.txt @@ -0,0 +1,116 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/plot_example.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_plot_example.py: + + +================================ +Overdamped Langevin Estimation +================================ + +How to run a simple estimation + +.. GENERATED FROM PYTHON SOURCE LINES 11-48 + + + +.. image-sg:: /auto_examples/images/sphx_glr_plot_example_001.png + :alt: Force, Diffusion + :srcset: /auto_examples/images/sphx_glr_plot_example_001.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + /home/runner/work/folie/folie/folie/estimation/transitionDensity.py:20: RuntimeWarning: invalid value encountered in log + ll = -0.5 * ((xt.ravel() - E) ** 2 / V) - 0.5 * np.log(np.sqrt(2 * np.pi) * V) + + + + + + +| + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + + import folie as fl + + # Trouver comment on rentre les données + trj = np.loadtxt("datasets/example_2d.trj") + data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) + for i in range(1, trj.shape[1]): + data.append(trj[:, i : i + 1]) + + fun = fl.functions.Linear() + model = fl.models.Overdamped(fun) + estimator = fl.LikelihoodEstimator(fl.EulerDensity(model)) + model = estimator.fit_fetch(data) + + # To find a correct parametrization of the space + bins = np.histogram_bin_edges(data[0]["x"], bins=15) + xfa = (bins[1:] + bins[:-1]) / 2.0 + + + fig, axs = plt.subplots(1, 2) + # Force plot + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + + # Diffusion plot + axs[1].set_title("Diffusion") + axs[1].grid() + axs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1))) + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 7.378 seconds) + + +.. _sphx_glr_download_auto_examples_plot_example.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_example.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_example.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/plot_fem.rst.txt b/_sources/auto_examples/plot_fem.rst.txt new file mode 100644 index 0000000..80c64cb --- /dev/null +++ b/_sources/auto_examples/plot_fem.rst.txt @@ -0,0 +1,113 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/plot_fem.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_plot_fem.py: + + +================================ +Overdamped Langevin Estimation +================================ + +How to run a simple estimation with FEM functions + +.. GENERATED FROM PYTHON SOURCE LINES 11-56 + + + +.. image-sg:: /auto_examples/images/sphx_glr_plot_fem_001.png + :alt: Force, Diffusion + :srcset: /auto_examples/images/sphx_glr_plot_fem_001.png + :class: sphx-glr-single-img + + + + + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + + import folie as fl + import skfem + + # Trouver comment on rentre les données + trj = np.loadtxt("datasets/example_2d.trj") + data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) + for i in range(1, trj.shape[1]): + data.append(trj[:, i : i + 1]) + + fig, axs = plt.subplots(1, 2) + # Force plot + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + + # Diffusion plot + axs[1].set_title("Diffusion") + axs[1].grid() + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + + xfa = np.linspace(data.stats.min, data.stats.max, 75) + + + n_knots = 10 + epsilon = 1e-10 + domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min - epsilon, data.stats.max + epsilon, n_knots)) + + fem = fl.functions.FiniteElement(domain, element=skfem.ElementLineP1()) + bsplines = fl.functions.BSplinesFunction(domain=domain) + for fun in [bsplines, fem]: + model = fl.models.Overdamped(fun, dim=1) + estimator = fl.KramersMoyalEstimator(model) + + model = estimator.fit_fetch(data) + + axs[0].plot(xfa, model.force(xfa.reshape(-1, 1))) + axs[1].plot(xfa, model.diffusion(xfa.reshape(-1, 1))) + + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 0.983 seconds) + + +.. _sphx_glr_download_auto_examples_plot_fem.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_fem.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_fem.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/plot_functions.rst.txt b/_sources/auto_examples/plot_functions.rst.txt new file mode 100644 index 0000000..b418004 --- /dev/null +++ b/_sources/auto_examples/plot_functions.rst.txt @@ -0,0 +1,105 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/plot_functions.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_plot_functions.py: + + +=========================== +Functional set +=========================== + +In this example, we present a subset of implemented functions. + +.. GENERATED FROM PYTHON SOURCE LINES 11-48 + + + +.. image-sg:: /auto_examples/images/sphx_glr_plot_functions_001.png + :alt: Linear, Polynom, Hermite Polynom, Fourier, B Splines + :srcset: /auto_examples/images/sphx_glr_plot_functions_001.png + :class: sphx-glr-single-img + + + + + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + + import folie.functions as ff + import folie as fl + + from scipy.interpolate import splrep + + x_range = np.linspace(-2, 2, 30).reshape(-1, 1) + + domain = fl.MeshedDomain.create_from_range(np.linspace(-2, 2, 6)) + + + t, c, k = splrep(x_range, x_range**4 - 2 * x_range**2 + 0.5 * x_range) + + fun_set = { + "Linear": ff.Linear(domain=domain), + "Polynom": ff.Polynomial(3, domain=domain), + "Hermite Polynom": ff.Polynomial(3, np.polynomial.Hermite, domain=domain), + "Fourier": ff.Fourier(order=2, freq=1.0, domain=domain), + "B Splines": ff.BSplinesFunction(domain=domain, k=3), + } + + fig_kernel, axs = plt.subplots(2, 3) + m = 0 + for key, fun in fun_set.items(): + axs[m // 3][m % 3].set_title(key) + axs[m // 3][m % 3].set_xlabel("$x$") + axs[m // 3][m % 3].set_ylabel("$h_k(x)$") + axs[m // 3][m % 3].grid() + y = fun.grad_coeffs(x_range) + + for n in range(y.shape[1]): + axs[m // 3][m % 3].plot(x_range[:, 0], y[:, n]) + m += 1 + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 0.224 seconds) + + +.. _sphx_glr_download_auto_examples_plot_functions.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_functions.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_functions.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/plot_likelihood.rst.txt b/_sources/auto_examples/plot_likelihood.rst.txt new file mode 100644 index 0000000..d3d068f --- /dev/null +++ b/_sources/auto_examples/plot_likelihood.rst.txt @@ -0,0 +1,135 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/plot_likelihood.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_plot_likelihood.py: + + +=========================== +Likelihood functions +=========================== + +A set of likelihood functions used for estimation + +.. GENERATED FROM PYTHON SOURCE LINES 11-67 + + + +.. image-sg:: /auto_examples/images/sphx_glr_plot_likelihood_001.png + :alt: Force, Diffusion + :srcset: /auto_examples/images/sphx_glr_plot_likelihood_001.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:187: RuntimeWarning: invalid value encountered in divide + temp = mu * (np.exp(mu_x * dt) - 1) / mu_x + + + + + + +| + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + + import folie as fl + + # Trouver comment on rentre les données + trj = np.loadtxt("datasets/example_2d.trj") + data = fl.Trajectories(dt=trj[1, 0] - trj[0, 0]) + data.append(trj[:, 1:2]) + + model = fl.models.BrownianMotion() + + fig, axs = plt.subplots(1, 2) + axs[0].set_title("Force") + axs[0].set_xlabel("$f$") + axs[0].set_ylabel("$L(f,1.0)$") + axs[0].grid() + + + axs[1].set_title("Diffusion") + axs[1].grid() + axs[1].set_xlabel("$\\sigma$") + axs[1].set_ylabel("$L(1.0,\\sigma)$") + + + force_range = np.linspace(-1, 1, 25) + diff_range = np.linspace(0.5, 2, 25) + + + for name, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], + ): + likelihood = transitioncls(model) + likelihood.preprocess_traj(data[0]) + likelihood_vals_force = np.zeros_like(force_range) + for n, f in enumerate(force_range): + likelihood_vals_force[n] = likelihood(1.0, data[0], np.array([f, 1.0]))[0] + axs[0].plot(force_range, likelihood_vals_force, label=name) + likelihood_vals_diff = np.zeros_like(diff_range) + for n, d in enumerate(diff_range): + likelihood_vals_diff[n] = likelihood(1.0, data[0], np.array([1.0, d]))[0] + + axs[1].plot(diff_range, likelihood_vals_diff, label=name) + + axs[0].legend() + axs[1].legend() + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 0.959 seconds) + + +.. _sphx_glr_download_auto_examples_plot_likelihood.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_likelihood.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_likelihood.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/sg_execution_times.rst.txt b/_sources/auto_examples/sg_execution_times.rst.txt new file mode 100644 index 0000000..64f7469 --- /dev/null +++ b/_sources/auto_examples/sg_execution_times.rst.txt @@ -0,0 +1,52 @@ + +:orphan: + +.. _sphx_glr_auto_examples_sg_execution_times: + + +Computation times +================= +**00:17.055** total execution time for 6 files **from auto_examples**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_plot_biasedOU.py` (``plot_biasedOU.py``) + - 00:07.511 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_example.py` (``plot_example.py``) + - 00:07.378 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_fem.py` (``plot_fem.py``) + - 00:00.983 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_likelihood.py` (``plot_likelihood.py``) + - 00:00.959 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_functions.py` (``plot_functions.py``) + - 00:00.224 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_em.py` (``example_em.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/toy_models/index.rst.txt b/_sources/auto_examples/toy_models/index.rst.txt new file mode 100644 index 0000000..1cf94af --- /dev/null +++ b/_sources/auto_examples/toy_models/index.rst.txt @@ -0,0 +1,102 @@ + + +.. _sphx_glr_auto_examples_toy_models: + +.. _toy_models: + +Toys models +================ + +A set examples for 1D/2D double well potential. + + + +.. raw:: html + +
+ +.. thumbnail-parent-div-open + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_biased_1D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_biased_1D_Double_Well.py` + +.. raw:: html + +
1D Biased Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_1D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_1D_Double_Well.py` + +.. raw:: html + +
1D Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_2D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_2D_Double_Well.py` + +.. raw:: html + +
2D Double Well
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/toy_models/images/thumb/sphx_glr_plot_biased_2D_Double_Well_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_toy_models_plot_biased_2D_Double_Well.py` + +.. raw:: html + +
2D Biased Double Well
+
+ + +.. thumbnail-parent-div-close + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/toy_models/plot_biased_1D_Double_Well + /auto_examples/toy_models/plot_1D_Double_Well + /auto_examples/toy_models/plot_2D_Double_Well + /auto_examples/toy_models/plot_biased_2D_Double_Well + diff --git a/_sources/auto_examples/toy_models/plot_1D_Double_Well.rst.txt b/_sources/auto_examples/toy_models/plot_1D_Double_Well.rst.txt new file mode 100644 index 0000000..ec3eab4 --- /dev/null +++ b/_sources/auto_examples/toy_models/plot_1D_Double_Well.rst.txt @@ -0,0 +1,210 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/toy_models/plot_1D_Double_Well.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_toy_models_plot_1D_Double_Well.py: + + +================================ +1D Double Well +================================ + +Estimation of an overdamped Langevin. + +.. GENERATED FROM PYTHON SOURCE LINES 8-116 + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_001.png + :alt: Trajectory + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_001.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_002.png + :alt: Force, Diffusion Coefficient + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_002.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_003.png + :alt: plot 1D Double Well + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_1D_Double_Well_003.png + :class: sphx-glr-multi-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:191: RuntimeWarning: invalid value encountered in sqrt + Vt = np.sqrt(sig * (np.exp(Kt * dt) - 1) / Kt) + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:190: RuntimeWarning: invalid value encountered in log + Kt = (2 / dt) * np.log(1 + temp / x.ravel()) + /home/runner/work/folie/folie/folie/estimation/overdamped_transitionDensity.py:212: RuntimeWarning: invalid value encountered in sqrt + sig = np.sqrt(2 * self._model.diffusion(x, **kwargs).ravel()) + + + + + + +| + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + import folie as fl + + coeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1]) + free_energy = np.polynomial.Polynomial(coeff) + D = 0.5 + force_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]]) + + force_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff) + diff_function = fl.functions.Polynomial(deg=0, coefficients=np.array(D)) + + # Plot of Free Energy and Force + x_values = np.linspace(-7, 7, 100) + # fig, axs = plt.subplots(1, 2) + # axs[0].plot(x_values, free_energy(x_values)) + # axs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1))) + # axs[0].set_title("Potential") + # axs[0].set_xlabel("$x$") + # axs[0].set_ylabel("$V(x)$") + # axs[0].grid() + # axs[1].set_title("Force") + # axs[1].set_xlabel("$x$") + # axs[1].set_ylabel("$F(x)$") + # axs[1].grid() + + # Define model to simulate and type of simulator to use + dt = 1e-3 + model_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function) + simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) + + + # initialize positions + ntraj = 30 + q0 = np.empty(ntraj) + for i in range(len(q0)): + q0[i] = 0 + # Calculate Trajectory + time_steps = 10000 + data = simulator.run(time_steps, q0, save_every=1) + + # Plot resulting Trajectories + fig, axs = plt.subplots() + for n, trj in enumerate(data): + axs.plot(trj["x"]) + axs.set_title("Trajectory") + + + fig, axs = plt.subplots(1, 2) + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + + axs[1].set_title("Diffusion Coefficient") + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + axs[1].grid() + + xfa = np.linspace(-7.0, 7.0, 75) + axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") + axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") + trainforce = fl.functions.Polynomial(deg=3, coefficients=np.array([0, 0, 0, 0])) + trainmodel = fl.models.Overdamped(force=trainforce, diffusion=fl.functions.Polynomial(deg=0, coefficients=np.asarray([0.9])), has_bias=False) + + for name, marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["x", "|", ".", "1", "2", "3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], + ): + estimator = fl.LikelihoodEstimator(transitioncls(trainmodel)) + res = estimator.fit_fetch(data) + # print(res.coefficients) + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), marker=marker, label=name) + + + name = "Kramers Moyal" + res = fl.KramersMoyalEstimator(trainmodel).fit_fetch(data) + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)), "--", label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), "--", label=name) + + + axs[0].legend() + axs[1].legend() + + # Compute MFPT from one well to another + plt.figure() + + x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, -5.0, [-10.0, 10.0], Npoints=500) + plt.plot(x_mfpt, mfpt, label="Right to left") + x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, 5.0, [-10.0, 10.0], Npoints=500) + plt.plot(x_mfpt, mfpt, label="Left to right") + + x_mfpt, mfpt = fl.analysis.mfpt_1d(res, -5.0, [-10.0, 10.0], Npoints=500) + plt.plot(x_mfpt, mfpt, label="Right to left Estimation") + x_mfpt, mfpt = fl.analysis.mfpt_1d(res, 5.0, [-10.0, 10.0], Npoints=500) + plt.plot(x_mfpt, mfpt, label="Left to right Estimation") + plt.legend() + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 16.210 seconds) + + +.. _sphx_glr_download_auto_examples_toy_models_plot_1D_Double_Well.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_1D_Double_Well.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_1D_Double_Well.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/toy_models/plot_2D_Double_Well.rst.txt b/_sources/auto_examples/toy_models/plot_2D_Double_Well.rst.txt new file mode 100644 index 0000000..d644060 --- /dev/null +++ b/_sources/auto_examples/toy_models/plot_2D_Double_Well.rst.txt @@ -0,0 +1,225 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/toy_models/plot_2D_Double_Well.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_toy_models_plot_2D_Double_Well.py: + + +================================ +2D Double Well +================================ + +Estimation of an overdamped Langevin. + +.. GENERATED FROM PYTHON SOURCE LINES 8-100 + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + import folie as fl + from mpl_toolkits.mplot3d import Axes3D + from copy import deepcopy + + """ Script for simulation of 2D double well and projection along user provided direction, No fitting is carried out """ + x = np.linspace(-1.8, 1.8, 36) + y = np.linspace(-1.8, 1.8, 36) + input = np.transpose(np.array([x, y])) + + D=0.5 + diff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2)) + a,b = 5, 10 + drift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ### + quartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ### + + X, Y = np.meshgrid(x, y) + + # Plot potential surface + pot = quartic2d.potential_plot(X, Y) + + fig = plt.figure() + ax = plt.axes(projection="3d") + ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap="jet", edgecolor="none") + + # Plot Force function + ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1] + U, V = np.meshgrid(ff[:, 0], ff[:, 1]) + fig, ax = plt.subplots() + ax.quiver(x, y, U, V) + ax.set_title("Force") + + dt= 5e-4 + model_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function) + simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) + + # initialize positions + ntraj = 30 + q0 = np.empty(shape=[ntraj, 2]) + for i in range(ntraj): + for j in range(2): + q0[i][j] = 0.000 + + # Calculate Trajectory + time_steps = 3000 + data = simulator.run(time_steps, q0, save_every=1) + + # Plot the resulting trajectories + fig, axs = plt.subplots() + for n, trj in enumerate(data): + axs.plot(trj["x"][:, 0], trj["x"][:, 1]) + axs.spines["left"].set_position("center") + axs.spines["right"].set_color("none") + axs.spines["bottom"].set_position("center") + axs.spines["top"].set_color("none") + axs.xaxis.set_ticks_position("bottom") + axs.yaxis.set_ticks_position("left") + axs.set_xlabel("$X(t)$") + axs.set_ylabel("$Y(t)$") + axs.set_title("X-Y Trajectory") + axs.grid() + + # plot Trajectories + fig, bb = plt.subplots(1, 2) + for n, trj in enumerate(data): + bb[0].plot(trj["x"][:, 0]) + bb[1].plot(trj["x"][:, 1]) + + # Set visible axis + bb[0].spines["right"].set_color("none") + bb[0].spines["bottom"].set_position("center") + bb[0].spines["top"].set_color("none") + bb[0].xaxis.set_ticks_position("bottom") + bb[0].yaxis.set_ticks_position("left") + bb[0].set_xlabel("$timestep$") + bb[0].set_ylabel("$X(t)$") + + # Set visible axis + bb[1].spines["right"].set_color("none") + bb[1].spines["bottom"].set_position("center") + bb[1].spines["top"].set_color("none") + bb[1].xaxis.set_ticks_position("bottom") + bb[1].yaxis.set_ticks_position("left") + bb[1].set_xlabel("$timestep$") + bb[1].set_ylabel("$Y(t)$") + + bb[0].set_title("X Dynamics") + bb[1].set_title("Y Dynamics") + + + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_001.png + :alt: plot 2D Double Well + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_001.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_002.png + :alt: Force + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_002.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_003.png + :alt: X-Y Trajectory + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_003.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_004.png + :alt: X Dynamics, Y Dynamics + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_004.png + :class: sphx-glr-multi-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 101-103 + +PROJECTION ALONG CHOSEN COORDINATE # +######################################## + +.. GENERATED FROM PYTHON SOURCE LINES 103-121 + +.. code-block:: Python + + + # Choose unit versor of direction + u = np.array([1, 1]) + u_norm = (1 / np.linalg.norm(u, 2)) * u + w = np.empty_like(trj["x"][:, 0]) + proj_data = fl.Trajectories(dt=1e-3) + fig, axs = plt.subplots() + for n, trj in enumerate(data): + for i in range(len(trj["x"])): + w[i] = np.dot(trj["x"][i], u_norm) + proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj["x"][:, 0]), 1)))) + axs.plot(proj_data[n]["x"]) + axs.set_xlabel("$timesteps$") + axs.set_ylabel("$w(t)$") + axs.set_title("trajectory projected along $u =$" + str(u) + " direction") + axs.grid() + + plt.show() + + + +.. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_005.png + :alt: trajectory projected along $u =$[1 1] direction + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_2D_Double_Well_005.png + :class: sphx-glr-single-img + + + + + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 1.348 seconds) + + +.. _sphx_glr_download_auto_examples_toy_models_plot_2D_Double_Well.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_2D_Double_Well.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_2D_Double_Well.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/toy_models/plot_biased_1D_Double_Well.rst.txt b/_sources/auto_examples/toy_models/plot_biased_1D_Double_Well.rst.txt new file mode 100644 index 0000000..281791d --- /dev/null +++ b/_sources/auto_examples/toy_models/plot_biased_1D_Double_Well.rst.txt @@ -0,0 +1,203 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/toy_models/plot_biased_1D_Double_Well.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_toy_models_plot_biased_1D_Double_Well.py: + + +================================ +1D Biased Double Well +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. + +.. GENERATED FROM PYTHON SOURCE LINES 8-103 + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_001.png + :alt: Potential, Force + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_001.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_002.png + :alt: plot biased 1D Double Well + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_002.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_003.png + :alt: Force, Diffusion Coefficient + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_1D_Double_Well_003.png + :class: sphx-glr-multi-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Euler [ 2.18511138 -13.43809953 11.0487866 -7.47618824 0.50539539 + 0.49629294 0.50648098 0.50229967] + Ozaki [ 2.18387217 -13.43945663 11.0470978 -7.47984192 0.5043238 + 0.49515728 0.50490884 0.49874808] + ShojiOzaki [ 2.18387217 -13.43945663 11.0470978 -7.47984192 0.5043238 + 0.49515728 0.50490884 0.49874808] + Elerian [ 3.97471585 -11.64784742 12.49023615 -5.55285883 0.50417949 + 0.49323943 0.50513973 0.49779388] + Kessler [ 3.97675874 -11.64289477 12.49774956 -5.56114197 0.50590107 + 0.49201942 0.50404364 0.49986558] + Drozdov [ 3.97522157 -11.64808398 12.49023298 -5.56306489 0.50626007 + 0.49165133 0.50432039 0.49979716] + + + + + + +| + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + import folie as fl + from copy import deepcopy + + coeff = 0.2 * np.array([0, 0, -4.5, 0, 0.1]) + free_energy = np.polynomial.Polynomial(coeff) + D= np.array([0.5]) + + force_coeff = D*np.array([-coeff[1], -2 * coeff[2], -3 * coeff[3], -4 * coeff[4]]) + force_function = fl.functions.Polynomial(deg=3, coefficients=force_coeff) + diff_function = fl.functions.Polynomial(deg=0, coefficients=D) + + # Plot of Free Energy and Force + x_values = np.linspace(-7, 7, 100) + fig, axs = plt.subplots(1, 2) + axs[0].plot(x_values, free_energy(x_values)) + axs[1].plot(x_values, force_function(x_values.reshape(len(x_values), 1))) + axs[0].set_title("Potential") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$V(x)$") + axs[0].grid() + axs[1].set_title("Force") + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$F(x)$") + axs[1].grid() + + # Define model to simulate and type of simulator to use + model_simu = fl.models.overdamped.Overdamped(force_function, diffusion=diff_function) + simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(model_simu), 1e-3, k=10.0, xstop=6.0) + + # initialize positions + ntraj = 30 + q0 = np.empty(ntraj) + for i in range(len(q0)): + q0[i] = -6 + # Calculate Trajectory + time_steps = 25000 + data = simulator.run(time_steps, q0, save_every=1) + xmax = np.concatenate(simulator.xmax_hist, axis=1).T + + # Plot the resulting trajectories + fig, axs = plt.subplots(1, 2) + for n, trj in enumerate(data): + axs[0].plot(trj["x"]) + axs[1].plot(xmax[:, n]) + axs[1].set_xlabel("$timestep$") + axs[1].set_ylabel("$x(t)$") + axs[1].grid() + + fig, axs = plt.subplots(1, 2) + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + + axs[1].set_title("Diffusion Coefficient") # i think should be diffusion coefficient + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + axs[1].grid() + + xfa = np.linspace(-7.0, 7.0, 75) + model_simu.remove_bias() + axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label="Exact") + axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label="Exact") + + domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min, data.stats.max, 4).ravel()) + trainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True) + + for name,marker, transitioncls in zip( + ["Euler", "Ozaki", "ShojiOzaki", "Elerian", "Kessler", "Drozdov"], + ["x", "|",".","1","2","3"], + [ + fl.EulerDensity, + fl.OzakiDensity, + fl.ShojiOzakiDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], + ): + trainmodel = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain),has_bias=True) + estimator = fl.LikelihoodEstimator(transitioncls(trainmodel),n_jobs=4) + + + res = estimator.fit_fetch(deepcopy(data)) + + print(name, res.coefficients) + res.remove_bias() + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name) + axs[0].legend() + axs[1].legend() + plt.show() + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (2 minutes 50.169 seconds) + + +.. _sphx_glr_download_auto_examples_toy_models_plot_biased_1D_Double_Well.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_biased_1D_Double_Well.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_biased_1D_Double_Well.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/toy_models/plot_biased_2D_Double_Well.rst.txt b/_sources/auto_examples/toy_models/plot_biased_2D_Double_Well.rst.txt new file mode 100644 index 0000000..8ef0308 --- /dev/null +++ b/_sources/auto_examples/toy_models/plot_biased_2D_Double_Well.rst.txt @@ -0,0 +1,340 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/toy_models/plot_biased_2D_Double_Well.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_toy_models_plot_biased_2D_Double_Well.py: + + +================================ +2D Biased Double Well +================================ + +Estimation of an overdamped Langevin in presence of biased dynamics. + +.. GENERATED FROM PYTHON SOURCE LINES 8-60 + +.. code-block:: Python + + + import numpy as np + import matplotlib.pyplot as plt + import folie as fl + from mpl_toolkits.mplot3d import Axes3D + from copy import deepcopy + import time + + checkpoint1 = time.time() + x = np.linspace(-1.8, 1.8, 36) + y = np.linspace(-1.8, 1.8, 36) + input = np.transpose(np.array([x, y])) + + D=0.5 + diff_function= fl.functions.Polynomial(deg=0,coefficients=D * np.eye(2,2)) + a,b = 5, 10 + drift_quartic2d= fl.functions.Quartic2D(a=D*a,b=D*b) # simple way to multiply D*Potential here force is the SDE force (meandispl) ## use this when you need the drift ### + quartic2d= fl.functions.Quartic2D(a=a,b=b) # Real potential , here force is just -grad pot ## use this when you need the potential energy ### + + X, Y = np.meshgrid(x, y) + + # Plot potential surface + pot = quartic2d.potential_plot(X, Y) + fig = plt.figure() + ax = plt.axes(projection="3d") + ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap="jet", edgecolor="none") + + # Plot Force function + ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1] + U, V = np.meshgrid(ff[:, 0], ff[:, 1]) + fig, ax = plt.subplots() + ax.quiver(x, y, U, V) + ax.set_title("Force") + + + ##Definition of the Collective variable function of old coordinates + def colvar(x, y): + gradient = np.array([1, 1]) + return x + y, gradient # need to return both colvar function q=q(x,y) and gradient (dq/dx,dq/dy) + + + dt = 1e-3 + model_simu = fl.models.overdamped.Overdamped(force=drift_quartic2d, diffusion=diff_function) + simulator = fl.simulations.ABMD_2D_to_1DColvar_Simulator(fl.simulations.EulerStepper(model_simu), dt, colvar=colvar, k=25.0, qstop=1.2) + + # Choose number of trajectories and initialize positions + ntraj = 20 + q0 = np.empty(shape=[ntraj, 2]) + for i in range(ntraj): + for j in range(2): + q0[i][j] = -1.2 + + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_001.png + :alt: plot biased 2D Double Well + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_001.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_002.png + :alt: Force + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_002.png + :class: sphx-glr-multi-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 61-63 + +# CALCULATE TRAJECTORY ## +################################### + +.. GENERATED FROM PYTHON SOURCE LINES 63-111 + +.. code-block:: Python + + + time_steps = 10000 + data = simulator.run(time_steps, q0, save_every=1) + + # Plot the resulting trajectories + fig, axs = plt.subplots() + for n, trj in enumerate(data): + axs.plot(trj["x"][:, 0], trj["x"][:, 1]) + axs.spines["left"].set_position("center") + axs.spines["right"].set_color("none") + axs.spines["bottom"].set_position("center") + axs.spines["top"].set_color("none") + axs.xaxis.set_ticks_position("bottom") + axs.yaxis.set_ticks_position("left") + axs.set_xlabel("$X(t)$") + axs.set_ylabel("$Y(t)$") + axs.set_title("X-Y Trajectory") + axs.set_xlim(-1.8, 1.8) + axs.set_ylim(-1.8, 1.8) + axs.grid() + + # plot x,y Trajectories in separate subplots + fig, bb = plt.subplots(1, 2) + for n, trj in enumerate(data): + bb[0].plot(trj["x"][:, 0]) + bb[1].plot(trj["x"][:, 1]) + + # Set visible axis + bb[0].spines["right"].set_color("none") + bb[0].spines["bottom"].set_position("center") + bb[0].spines["top"].set_color("none") + bb[0].xaxis.set_ticks_position("bottom") + bb[0].yaxis.set_ticks_position("left") + bb[0].set_xlabel("$timestep$") + bb[0].set_ylabel("$X(t)$") + + # Set visible axis + bb[1].spines["right"].set_color("none") + bb[1].spines["bottom"].set_position("center") + bb[1].spines["top"].set_color("none") + bb[1].xaxis.set_ticks_position("bottom") + bb[1].yaxis.set_ticks_position("left") + bb[1].set_xlabel("$timestep$") + bb[1].set_ylabel("$Y(t)$") + + bb[0].set_title("X Dynamics") + bb[1].set_title("Y Dynamics") + + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_003.png + :alt: X-Y Trajectory + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_003.png + :class: sphx-glr-multi-img + + * + + .. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_004.png + :alt: X Dynamics, Y Dynamics + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_004.png + :class: sphx-glr-multi-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 112-114 + +PROJECTION ALONG CHOSEN COORDINATE # +######################################## + +.. GENERATED FROM PYTHON SOURCE LINES 114-133 + +.. code-block:: Python + + + # Choose unit versor of direction + u = np.array([1, 1]) + u_norm = (1 / np.linalg.norm(u, 2)) * u + w = np.empty_like(trj["x"][:, 0]) + b = np.empty_like(trj["x"][:, 0]) + proj_data = fl.data.trajectories.Trajectories(dt=dt) # create new Trajectory object in which to store the projected trajectory dictionaries + fig, axs = plt.subplots() + for n, trj in enumerate(data): + for i in range(len(trj["x"])): + w[i] = np.dot(trj["x"][i], u_norm) + b[i] = np.dot(trj["bias"][i], u_norm) + proj_data.append(fl.Trajectory(1e-3, deepcopy(w.reshape(len(trj["x"][:, 0]), 1)), bias=deepcopy(b.reshape(len(trj["bias"][:, 0]), 1)))) + axs.plot(proj_data[n]["x"]) + axs.set_xlabel("$timesteps$") + axs.set_ylabel("$w(t)$") + axs.set_title("trajectory projected along $u =$" + str(u) + " direction") + axs.grid() + + + + +.. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_005.png + :alt: trajectory projected along $u =$[1 1] direction + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_005.png + :class: sphx-glr-single-img + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 134-136 + +# MODEL TRAINING ## +###################################### + +.. GENERATED FROM PYTHON SOURCE LINES 136-185 + +.. code-block:: Python + + checkpoint2 = time.time() + + domain = fl.MeshedDomain.create_from_range(np.linspace(proj_data.stats.min, proj_data.stats.max, 4).ravel()) + trainmodel = fl.models.OverdampedSplines1D(domain=domain) + + xfa = np.linspace(proj_data.stats.min, proj_data.stats.max, 75) + force_exact = (xfa**2 - 1.0) ** 2 + + fig, axs = plt.subplots(1, 2) + axs[0].set_title("Force") + axs[0].set_xlabel("$x$") + axs[0].set_ylabel("$F(x)$") + axs[0].grid() + axs[1].set_title("Diffusion") + axs[1].set_xlabel("$x$") + axs[1].set_ylabel("$D(x)$") + axs[1].grid() + + + KM_Estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel)) + res_KM = KM_Estimator.fit_fetch(proj_data) + + axs[0].plot(xfa, res_KM.force(xfa.reshape(-1, 1)), marker="x",label="KramersMoyal") + axs[1].plot(xfa, res_KM.diffusion(xfa.reshape(-1, 1)), marker="x",label="KramersMoyal") + print("KramersMoyal ", res_KM.coefficients) + for name,marker, transitioncls in zip( + ["Euler", "Elerian", "Kessler", "Drozdov"], + ["|","1","2","3"], + [ + fl.EulerDensity, + fl.ElerianDensity, + fl.KesslerDensity, + fl.DrozdovDensity, + ], + ): + estimator = fl.LikelihoodEstimator(transitioncls(deepcopy(trainmodel))) + res = estimator.fit_fetch(deepcopy(proj_data)) + print(name, res.coefficients) + axs[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker=marker, label=name) + axs[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker=marker, label=name) + + axs[0].legend() + axs[1].legend() + checkpoint3 = time.time() + + print("Training time =", checkpoint3 - checkpoint2, "seconds") + print("Overall time =", checkpoint3 - checkpoint1, "seconds") + + plt.show() + + + +.. image-sg:: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_006.png + :alt: Force, Diffusion + :srcset: /auto_examples/toy_models/images/sphx_glr_plot_biased_2D_Double_Well_006.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + KramersMoyal [ 34.12454839 -47.29333768 48.30051582 -22.80611377 0.58151965 + 0.45892292 0.53983301 0.48483553] + Euler [ 34.12455366 -47.293338 48.3005147 -22.80611855 0.58148844 + 0.4589213 0.53982283 0.4848899 ] + Elerian [ 34.12455356 -47.29333808 48.30051443 -22.80611895 0.5814876 + 0.45892073 0.53982206 0.48489088] + Kessler [ 34.12493304 -47.29318571 48.30059196 -22.80667587 0.60672136 + 0.45371782 0.51543791 0.51987379] + Drozdov [ 34.12487646 -47.29318183 48.30060703 -22.80658737 0.61010357 + 0.45373688 0.51361162 0.52115415] + Training time = 12.379078149795532 seconds + Overall time = 15.38785719871521 seconds + + + + + +.. rst-class:: sphx-glr-timing + + **Total running time of the script:** (0 minutes 15.498 seconds) + + +.. _sphx_glr_download_auto_examples_toy_models_plot_biased_2D_Double_Well.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: plot_biased_2D_Double_Well.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: plot_biased_2D_Double_Well.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/toy_models/sg_execution_times.rst.txt b/_sources/auto_examples/toy_models/sg_execution_times.rst.txt new file mode 100644 index 0000000..c14d4c2 --- /dev/null +++ b/_sources/auto_examples/toy_models/sg_execution_times.rst.txt @@ -0,0 +1,46 @@ + +:orphan: + +.. _sphx_glr_auto_examples_toy_models_sg_execution_times: + + +Computation times +================= +**03:23.226** total execution time for 4 files **from auto_examples/toy_models**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_toy_models_plot_biased_1D_Double_Well.py` (``plot_biased_1D_Double_Well.py``) + - 02:50.169 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_1D_Double_Well.py` (``plot_1D_Double_Well.py``) + - 00:16.210 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_biased_2D_Double_Well.py` (``plot_biased_2D_Double_Well.py``) + - 00:15.498 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_2D_Double_Well.py` (``plot_2D_Double_Well.py``) + - 00:01.348 + - 0.0 diff --git a/_sources/for_developper.rst.txt b/_sources/for_developper.rst.txt new file mode 100644 index 0000000..52380ec --- /dev/null +++ b/_sources/for_developper.rst.txt @@ -0,0 +1,165 @@ +####################################################### +For developper +####################################################### + + +Run + >>> git clone git@github.com:langevinmodel/folie.git + >>> cd folie + >>> pip install -e . + +to install the package for local developpement. + + +Input of trajectories data +============================== + + + +Building an estimator of Langevin dynamics +============================================ + + +Likelihood estimation: using Transition density +-------------------------------------------------- + +The list of implemented transition density and their relations + +.. inheritance-diagram:: folie.EulerDensity folie.OzakiDensity folie.ShojiOzakiDensity folie.ElerianDensity folie.KesslerDensity folie.DrozdovDensity + :top-classes: folie.estimation.transitionDensity.TransitionDensity + :parts: 1 + + + +Writing a new estimator +----------------------------------- + +Estimator should generically inherit from :class`Estimator` and implement a fit method. Since most estimator of folie are flexible they generally take as argument the model to be estimated, but if your estimator is model specific you are not force to follow this approach. + + +.. inheritance-diagram:: folie.estimation + :top-classes: folie.base.Estimator + :parts: 1 + + +Model of Langevin Dynamics +============================= + +Folie holds a number of models for Langevin Dynamics. The main models simply contain reference to functions that describe the spatial dependences as well as the associated coefficients. + +There is also some + + +Writing a new model +----------------------------------- + +A model in folie represent a model of Langevin evolution. As such, it is mainly a collections of folie functions. + +Most of the time, the spatial dependencies of the model are described by folie functions and can simply be set as model attributes. + +When more complicated behavior are necessary (for exemple the mean displacement of a Langevin model is the sum of its force and its friction times the velocity), the is a mecanism of :py:class:`~folie.functions.ModelOverlay`. + +:py:class:`~folie.functions.ModelOverlay` is a particular type of functions. This is an interface for model methods adn as such it allow for easy composition of functions. + +.. code-block:: python + + model.mycomponent = ModelOverlay("_mycomponent") + +allow to access to the method of the models as if there was function attributes. This means that we can use + +.. code-block:: python + + model.mycomponent.grad_coeffs() + +as a call to + +.. code-block:: python + + model._mycomponent_coeffs() + +This allows to have an unified interface to components of a model, irrespective of theirs definitions as model methods or as folie functions. + + +.. inheritance-diagram:: folie.models + :top-classes: folie.base.Model + :parts: 1 + + +Writing a new function +--------------------------------- +Functions are the core part of folie for the description of spatial dependences. +Functions can be parametric functions (i.e. with coefficients to be optimized) or non-parametric. + + +.. inheritance-diagram:: folie.functions + :parts: 1 + + + + + +Documenting the code +============================= + +When documenting your code, `numpydoc style `__ should be used. Going back to the example +of the :code:`MeanEstimator`, this style of documentation would look like the following: + +.. code-block:: python + + class SimpleEstimator(folie.base.Estimator): + r""" A simple estimator. It estimates the mean using a complicated algorithm + :footcite:`author1991`. + + Parameters + ---------- + axis : int, optional, default=-1 + The axis over which to compute the mean. Defaults to -1, which refers to the last axis. + + References + ---------- + .. footbibliography:: + + See Also + -------- + Overdamped + """ + + def __init__(self, axis=-1): + super().__init__() + self.axis = axis + + def fit(self, data): + r""" Performs the estimation. + + Parameters + ---------- + data : ndarray + Array over which the mean should be estimated. + + Returns + ------- + self : MeanEstimator + Reference to self. + """ + self._model = MeanModel(np.mean(data, axis=self.axis)) + return self + +Note the specific style of using citations. For citations there is a package-global BibTeX file under +:code:`docs/references.bib`. These references can then be included into the documentation website +using the citation key as defined in the references file. + +The documentation website is hosted via GitHub pages. Please see the +`README `__ on GitHub for instructions on how to build +it. + + + +Organisation of the examples folder +---------------------------------------- + + +folie use sphinx gallery to automatically generate plot of the examples. To be inclued into the Generals examples list, the script shoub be nammed as plot_*.py and be placed in to the examples foler. + +The tutorials folder contain more complex examples on the form of Jupyter notebooks, anything in the tutorials folder will be inclued into the corresponding documentation section. The name of the snippset will be the title of the jupyter notebook. + +The statistical_performances folder aims to contains Jupyter notebook that explore more systematically the peformance of the estimation with respect to number of data, choice of the estimator and so forth. diff --git a/_sources/howto.rst.txt b/_sources/howto.rst.txt new file mode 100644 index 0000000..2082f64 --- /dev/null +++ b/_sources/howto.rst.txt @@ -0,0 +1,44 @@ +============= +How-to guides +============= + +This section contains goal-oriented guides on the features of folie + + + + +Estimation +------------- + +.. + Dans cette partie il va falloir avoir: + - Un exemple tout simple d'estimation + - Estimation avec du biais + - Que faire pour pour des données trop lourdes ou accélérer les calculs + - Modèles avec mémoires (Hidden et Kernel) + - Utilisation de Pytorch +.. + +.. toctree:: + :maxdepth: 2 + + notebooks/estimation + + + +Analysis +------------ + +Once we have obtained a model, we can extract useful quantities + +.. toctree:: + :maxdepth: 2 + + notebooks/analysis_committor + notebooks/simulations +.. + Dans cette partie il va falloir avoir: + Un calcul de committor et mfpt + Un example 2d avec éléments finis + +.. \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..9e291dd --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,93 @@ +.. folie documentation master file, created by + sphinx-quickstart on Wed Dec 6 14:27:31 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to folie's documentation! +================================= + + + + + +folie (Finding Optimal Langevin Inferred Equations) intends to provide a simple to use module for inference of Langevin equations from trajectories of collectives variables. Please refer to the documentation for a more complete description. + + +Installation +-------------- + +Installing the library is as simple as running + +.. code-block:: bash + + pip install git+https://github.com/langevinmodel/folie.git + + +If you also want to install optionnal dependencies, run for the torch dependency + + +.. code-block:: bash + + pip install git+https://github.com/langevinmodel/folie.git[deep-learning] + +or + +.. code-block:: bash + + pip install git+https://github.com/langevinmodel/folie.git[finite-element] + +to install dependencies for the finite element part of the library. + + +Getting Started +------------------ + +The general pattern of using folie is defining a model, loading trajectories data, fit the model and analyse the resulting model. + + + + + +Table of contents +================= + +.. toctree:: + :maxdepth: 2 + :caption: Documentation + + self + howto + for_developper + +.. toctree:: + :maxdepth: 2 + :hidden: + :caption: Examples + + auto_examples/index + + tutorials.rst + +.. toctree:: + :maxdepth: 2 + :hidden: + :caption: Performances + + statistical_performances.rst + +.. toctree:: + :caption: API docs + :maxdepth: 2 + + api/dataloading + api/models + api/functions + api/estimation + api/analysis + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/notebooks/analysis_committor.ipynb.txt b/_sources/notebooks/analysis_committor.ipynb.txt new file mode 100644 index 0000000..657a908 --- /dev/null +++ b/_sources/notebooks/analysis_committor.ipynb.txt @@ -0,0 +1,33 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analysis of obtained models\n", + "\n", + "\n", + "Once we have obtained a model, we can extract useful quantities" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/notebooks/estimation.ipynb.txt b/_sources/notebooks/estimation.ipynb.txt new file mode 100644 index 0000000..f56842a --- /dev/null +++ b/_sources/notebooks/estimation.ipynb.txt @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "# Estimation of overdamped model\n", + "First download the data and load the trajectories. Don't forget to adapt the location of the file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "819a042b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "\n", + "data = fl.Trajectories(dt=1.0e-3)\n", + "n=1 # Let's use the first molecule.\n", + "trj = np.loadtxt(f\"DATA\")\n", + "data.append(trj.reshape(-1,1))\n", + "print(data) #Let's check what we have" + ] + }, + { + "cell_type": "markdown", + "id": "95cee9f0", + "metadata": {}, + "source": [ + "Then define a model, here we are going to use the default 1D overdamped model. We can then fit the model. To start we use a simple KramersMoyal estimation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3b3661c5", + "metadata": {}, + "outputs": [], + "source": [ + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min , data.stats.max , 10).ravel())\n", + "model = fl.models.OverdampedSplines1D(domain=domain)\n", + "estimator = fl.KramersMoyalEstimator(model)\n", + "model = estimator.fit_fetch(data)" + ] + }, + { + "cell_type": "markdown", + "id": "57265806", + "metadata": {}, + "source": [ + "We can then plot the force and diffusion profile" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d32093da", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "xfa = np.linspace(np.min(trj),np.max(trj),75)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Force plot\n", + "ax.set_title(\"Force\")\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$F(x)$\")\n", + "ax.grid()\n", + "ax.plot(xfa, model.force(xfa.reshape(-1, 1)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7c552423", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"Diffusion\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$D(x)$\")\n", + "ax.plot(xfa, model.diffusion(xfa.reshape(-1, 1)))" + ] + }, + { + "cell_type": "markdown", + "id": "550cf6a2", + "metadata": {}, + "source": [ + "But also obtain the free energy profile. The free energy profile $V(x)$ is related to the force $F(x)$ and the diffusion $D(x)$ from\n", + "\n", + "$$ F(x) = -D(x) \\nabla V(x) + \\mathrm{div} D(x)$$\n", + "\n", + "The relation can then be inverted to obtain the free energy profile." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "568edcc2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pmf=fl.analysis.free_energy_profile_1d(model, xfa)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"PMF\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$\\\\beta U(x)$\")\n", + "ax.plot(xfa, pmf)" + ] + }, + { + "cell_type": "markdown", + "id": "ce0d9688-9d66-4231-92ee-1c4c053e13ec", + "metadata": {}, + "source": [ + "Since there is two well, we can also compute the mean first passage time to go from point x to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9944b6d8-5317-4ff2-a436-983d7bccffa7", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'fl' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m x_mfpt, mfpt \u001b[38;5;241m=\u001b[39m \u001b[43mfl\u001b[49m\u001b[38;5;241m.\u001b[39manalysis\u001b[38;5;241m.\u001b[39mmfpt_1d(model_simu, \u001b[38;5;241m0\u001b[39m, [\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m20.0\u001b[39m, \u001b[38;5;241m50.0\u001b[39m], Npoints\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m500\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'fl' is not defined" + ] + } + ], + "source": [ + "x_mfpt, mfpt = fl.analysis.mfpt_1d(model_simu, 0, [-20.0, 50.0], Npoints=500)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# MFPT plot\n", + "ax.set_title(\"MFPT from x to 0\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$MFPT(x,0)$\")\n", + "ax.plot(x_mfpt, mfpt)" + ] + }, + { + "cell_type": "markdown", + "id": "24ed7493", + "metadata": {}, + "source": [ + "## Parallel execution\n", + "\n", + "\n", + "See https://scikit-learn.org/stable/computing/parallelism.html for an overview of available options.\n", + "\n", + "Likelihood estimator are parallelized using n_jobs= with computation of likelihood being parallelized over trajectories." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/simulations.ipynb.txt b/_sources/notebooks/simulations.ipynb.txt new file mode 100644 index 0000000..efe4e97 --- /dev/null +++ b/_sources/notebooks/simulations.ipynb.txt @@ -0,0 +1,153 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "# Models simulations\n", + "folie has some simulations capabilities. However, due to python performance, they are mostly orinented towards short validations runs and examples runs.\n", + "\n", + "For more efficient and longuer simulations, please turn to LangevinIntegrators.jl or StochasticDiffEq.jl. In the future we are also planning to write more efficient simulators within folie frameworks.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3af8aef8", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "a9bb72df", + "metadata": {}, + "source": [ + "Let's first define some models and instanciate the simulation. This require the definition of a stepper, i.e. the choice of a transition probability. We choose here to use the EulerStepper." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "819a042b", + "metadata": {}, + "outputs": [], + "source": [ + "model_simu = fl.models.OrnsteinUhlenbeck(0.0, 1.2, 2.0)\n", + "stepper = fl.simulations.EulerStepper(model_simu)\n", + "simulator = fl.simulations.Simulator(stepper, dt=1e-3)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d0bbe9ac", + "metadata": {}, + "source": [ + "We can then obtain somes trajectories, with normally distributted starting points." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3a8d3da2", + "metadata": {}, + "outputs": [], + "source": [ + "data = simulator.run(5000,x0= np.random.randn(25))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c56e4519", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 1)\n", + "for n, trj in enumerate(data):\n", + " axs.plot(trj[\"x\"])" + ] + }, + { + "cell_type": "markdown", + "id": "ff628e0d", + "metadata": {}, + "source": [ + "There is also the possibility to run biased simulations for tests. Let's run adiabatic biased modelcular dynamics (ABMD) simulations. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "af101ce9", + "metadata": {}, + "outputs": [], + "source": [ + "simulator = fl.simulations.ABMD_Simulator(stepper, 1e-3, k=10.0, xstop=6.0)\n", + "data_biased = simulator.run(5000, np.zeros((25,)), 25)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "21ecfc70", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xmax = np.concatenate(simulator.xmax_hist, axis=1).T\n", + "fig, axs = plt.subplots(1, 2)\n", + "for n, trj in enumerate(data_biased):\n", + " axs[0].plot(trj[\"x\"])\n", + " axs[1].plot(xmax[:, n])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/statistical_performances/overdampedOU.ipynb.txt b/_sources/notebooks/statistical_performances/overdampedOU.ipynb.txt new file mode 100644 index 0000000..c48276f --- /dev/null +++ b/_sources/notebooks/statistical_performances/overdampedOU.ipynb.txt @@ -0,0 +1,129 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "718db51f", + "metadata": {}, + "source": [ + "# Overdamped" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9e03f944-d2c1-48ba-88ec-494c9e7c40ea", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "82c19e11-896e-48de-ae8d-4c614545b4e8", + "metadata": {}, + "source": [ + "Let's first simulate some trajectories with various timestep" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8bf9d6de-29f8-4bc7-8b0c-92f68b262b7d", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "could not broadcast input array from shape (25,25) into shape (25,1)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m dt \u001b[38;5;129;01min\u001b[39;00m list_dts:\n\u001b[1;32m 6\u001b[0m simulator \u001b[38;5;241m=\u001b[39m fl\u001b[38;5;241m.\u001b[39mSimulator(fl\u001b[38;5;241m.\u001b[39mExactDensity(model_simu), dt)\n\u001b[0;32m----> 7\u001b[0m data_dts\u001b[38;5;241m.\u001b[39mappend(\u001b[43msimulator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m5000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mzeros\u001b[49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m25\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m25\u001b[39;49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m~/Projets/folie/folie/simulations/__init__.py:34\u001b[0m, in \u001b[0;36mSimulator.run\u001b[0;34m(self, nsteps, x0, ntrajs, save_every, **kwargs)\u001b[0m\n\u001b[1;32m 32\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransition\u001b[38;5;241m.\u001b[39mrun_step(x, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdt, dW[:, n])\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m n \u001b[38;5;241m%\u001b[39m save_every \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m---> 34\u001b[0m \u001b[43mx_val\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msave_every\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m x\n\u001b[1;32m 35\u001b[0m data \u001b[38;5;241m=\u001b[39m Trajectories(dt\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdt \u001b[38;5;241m*\u001b[39m save_every)\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(ntrajs):\n", + "\u001b[0;31mValueError\u001b[0m: could not broadcast input array from shape (25,25) into shape (25,1)" + ] + } + ], + "source": [ + "model_simu = fl.models.OrnsteinUhlenbeck()\n", + "model_simu.coefficients = np.array([0.1, 1.2, 2.0])\n", + "data_dts = []\n", + "list_dts = [1e-3, 5e-3, 1e-2, 5e-2]\n", + "for dt in list_dts:\n", + " simulator = fl.Simulator(fl.simulations.ExactStepper(model_simu), dt)\n", + " data_dts.append(simulator.run(5000, np.zeros((25,)), 25))" + ] + }, + { + "cell_type": "markdown", + "id": "fc477114-844e-415c-88a4-f5a19c088057", + "metadata": {}, + "source": [ + "We can then run the estimation for various likelihood at all timesteps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7756920-1780-47f4-bef7-7296d8ea127f", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, len(model_simu.coefficients))\n", + "\n", + "for name, transitioncls in zip(\n", + " [\"Exact\", \"Euler\", \"Ozaki\", \"ShojiOzaki\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n", + " [\n", + " fl.ExactDensity,\n", + " fl.EulerDensity,\n", + " fl.OzakiDensity,\n", + " fl.ShojiOzakiDensity,\n", + " fl.ElerianDensity,\n", + " fl.KesslerDensity,\n", + " fl.DrozdovDensity,\n", + " ],\n", + "):\n", + " model = fl.models.OrnsteinUhlenbeck()\n", + " estimator = fl.LikelihoodEstimator(transitioncls(model))\n", + " coeffs_vals = np.empty((len(data_dts), len(model.coefficients)))\n", + " for n, data in enumerate(data_dts):\n", + " res = estimator.fit_fetch(data)\n", + " coeffs_vals[n, :] = res.coefficients\n", + " for n in range(len(axs)):\n", + " axs[n].plot(list_dts, np.abs(coeffs_vals[:, n] - model_simu.coefficients[n]), \"-+\", label=name)\n", + " print(coeffs_vals)\n", + "for n in range(len(axs)):\n", + " axs[n].legend()\n", + " axs[n].set_yscale(\"log\")\n", + " axs[n].grid()\n", + " axs[n].set_xlabel(r\"$\\Delta t$\")\n", + " axs[n].set_ylabel(r\"$|c-c_{real}|$\")\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/statistical_performances/overdampedhiddenOU.ipynb.txt b/_sources/notebooks/statistical_performances/overdampedhiddenOU.ipynb.txt new file mode 100644 index 0000000..a054725 --- /dev/null +++ b/_sources/notebooks/statistical_performances/overdampedhiddenOU.ipynb.txt @@ -0,0 +1,111 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2199d582", + "metadata": {}, + "source": [ + "# Overdamped with hidden variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad5f8a73-e432-41db-bf0b-625ff80db5b6", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "import matplotlib.pyplot as plt\n" + ] + }, + { + "cell_type": "markdown", + "id": "0191d59f-9793-4efc-9fe7-fc53cd46f4d1", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1a4b8c2-948a-4bcd-b4b2-6208c1684260", + "metadata": {}, + "outputs": [], + "source": [ + "model_simu = model_simu = fl.models.OrnsteinUhlenbeck(dim=3)\n", + "data_dts = []\n", + "list_dts = [1e-3, 5e-3, 1e-2, 5e-2]\n", + "for dt in list_dts:\n", + " simulator = fl.Simulator(fl.simulations.ExactStepper(model_simu), dt, keep_dim=1)\n", + " data_dts.append(simulator.run(5000, np.random.normal(loc=0.0, scale=1.0, size=(25, 3)), 25))" + ] + }, + { + "cell_type": "markdown", + "id": "a1d5f7af-d2e2-4511-aea2-e61c32f0929b", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "473bb54a-7291-4019-9004-a6b260e9c599", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, len(model_simu.coefficients))\n", + "\n", + "for name, transitioncls in zip(\n", + " [\"Euler\"],\n", + " [\n", + " fl.EulerDensity,\n", + " ],\n", + "):\n", + " fun_lin = fl.functions.Linear().fit(data_dts[0])\n", + " fun_frct = fl.functions.Constant().fit(data_dts[0])\n", + " fun_cst = fl.functions.Constant().fit(data_dts[0])\n", + " model = fl.models.OverdampedHidden(fun_lin, fun_frct, fun_cst, dim=1, dim_h=2)\n", + " estimator = fl.EMEstimator(transitioncls(model), max_iter=15, verbose=2, verbose_interval=1)\n", + " coeffs_vals = np.empty((len(data_dts), len(model.coefficients)))\n", + " for n, data in enumerate(data_dts):\n", + " res = estimator.fit_fetch(\n", + " data[\n", + " :,\n", + " ]\n", + " )\n", + " coeffs_vals[n, :] = res.coefficients\n", + " for n in range(len(axs)):\n", + " axs[n].plot(list_dts, np.abs(coeffs_vals[:, n] - model_simu.coefficients[n]), \"-+\", label=name)\n", + "for n in range(len(axs)):\n", + " axs[n].legend()\n", + " axs[n].set_yscale(\"log\")\n", + " axs[n].grid()\n", + " axs[n].set_xlabel(\"$\\\\Delta t\")\n", + " axs[n].set_ylabel(\"$|c-c_{real}|$\")\n", + "plt.show()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.8", + "language": "python", + "name": "python3.8" + }, + "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.8.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/tutorials/1D_DoubleWell_estimation.ipynb.txt b/_sources/notebooks/tutorials/1D_DoubleWell_estimation.ipynb.txt new file mode 100644 index 0000000..9614acf --- /dev/null +++ b/_sources/notebooks/tutorials/1D_DoubleWell_estimation.ipynb.txt @@ -0,0 +1,605 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1D Double Well estimation \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import folie as fl\n", + "import csv\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from copy import deepcopy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1D UNBIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) The model \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function $V(q)= \\sum_{i=0}^4 c_iq^i$ and choose a constant diffusion coefficient $D(q)=q$ :\n", + "\n", + "The force parameter to pass to the simulator will then be : $F = - \\frac{dV(q)}{dq}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "coeff=0.1*np.array([0,0,-4.5,0,0.1]) # coefficients of the free energy\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]]) #coefficients of the free energy\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-7, 7, 100)\n", + "fig, axs = plt.subplots(1, 2)\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ntraj=30\n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=0\n", + "# Calculate Trajectory\n", + "time_steps=10000\n", + "data = simulator.run(time_steps, q0, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the trajecories\n", + "fig, axs = plt.subplots(1,1)\n", + "for n, trj in enumerate(data):\n", + " axs.plot(trj[\"x\"])\n", + " axs.set_title(\"Trajectory\")\n", + " axs.set_xlabel(\"$timestep$\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Model Training " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Training using same functional form of true force and diffusion " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodel=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(data)\n", + "Eul_res=Eul_estimator.fit_fetch(data)\n", + "Eln_res=Eln_estimator.fit_fetch(data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data)\n", + "Drz_res=Drz_estimator.fit_fetch(data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Training using splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min , data.stats.max , n_knots).ravel())\n", + "trainmodel = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=Eul_estimator.fit_fetch(data)\n", + "Eul_res=Eul_estimator.fit_fetch(data)\n", + "Eln_res=Eln_estimator.fit_fetch(data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data)\n", + "Drz_res=Drz_estimator.fit_fetch(data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of OVerdamped( spline, constant)\n", + "fig, axs = plt.subplots(1, 2, figsize=(10, 6))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "#Plot inferred quantities \n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check if the methods are returning all the the same results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1D BIASED Double Well Potential\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function $V(q)= \\sum_{i=0}^4 c_iq^i$ and choose a constant diffusion coefficient $D(q)=D$ : $\\newline$\n", + "The force parameter to pass to the simulator will then be : $F = - \\frac{dV(q)}{dq}$ $\\newline$\n", + "Adiabaic bias used : $V_{bias}(q)=\\frac{1}{2}k(q-q_0)^2 \\longmapsto$ ABMD_Simulator $\\newline$\n", + "The center of the parabola, $q_0$, is choosen as : $max(q,q_0)$ at every iteration " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coeff=0.1*np.array([0,0,-4.5,0,0.1]) # coefficients of the free energy\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]]) #coefficients of the free energy\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-7, 7, 100)\n", + "fig, axs = plt.subplots(1, 2)\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "biased_model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "biased_simulator = fl.simulations.ABMD_Simulator(fl.simulations.EulerStepper(biased_model_simu), dt, k=10.0, xstop=6.0) \n", + "ntraj=30\n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=-6.0\n", + "# Calculate Trajectory\n", + "time_steps=35000\n", + "biased_data = biased_simulator.run(time_steps, q0, 1)\n", + "xmax = np.concatenate(biased_simulator.xmax_hist, axis=1).T # if you rerun simulator.run without reinializing the simulator object it will probably append the results making xmax twice as long " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the trajecories\n", + "fig, axs = plt.subplots(1,2,figsize=(10,6))\n", + "for n, trj in enumerate(biased_data):\n", + " axs[0].plot(trj[\"x\"])\n", + " axs[0].set_title(\"Trajectory\")\n", + " axs[0].set_xlabel(\"$timestep$\")\n", + " axs[0].set_ylabel(\"q(t)\")\n", + " axs[1].plot(xmax)\n", + " axs[1].set_title(\"q_0\")\n", + " axs[1].set_xlabel(\"$timesteps$\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Model Training " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Training using same functional form of true force and diffusion " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodel=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(biased_data)\n", + "Eul_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eln_res=Eln_estimator.fit_fetch(biased_data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(biased_data)\n", + "Drz_res=Drz_estimator.fit_fetch(biased_data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "biased_model_simu.remove_bias()\n", + "axs[0].plot(xfa, biased_model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, biased_model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Training using splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(biased_data.stats.min , biased_data.stats.max , n_knots).ravel())\n", + "trainmodel = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodel), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodel)),n_jobs=4)\n", + "\n", + "KM_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eul_res=Eul_estimator.fit_fetch(biased_data)\n", + "Eln_res=Eln_estimator.fit_fetch(biased_data)\n", + "Ksl_res=Ksl_estimator.fit_fetch(biased_data)\n", + "Drz_res=Drz_estimator.fit_fetch(biased_data)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot of OVerdamped( spline, constant)\n", + "fig, axs = plt.subplots(1, 2, figsize=(10, 6))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n", + "xfa = np.linspace(-7.0, 7.0, 75)\n", + "\n", + "#Plot exact quantities \n", + "biased_model_simu.remove_bias()\n", + "axs[0].plot(xfa, biased_model_simu.force(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "axs[1].plot(xfa, biased_model_simu.diffusion(xfa.reshape(-1, 1)), label=\"Exact\")\n", + "#Plot inferred quantities \n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " res_vec[i].remove_bias()\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "with zip\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, axb = plt.subplots(1, 2, figsize=(10, 6))\n", + "\n", + "n_knots= 4\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(biased_data.stats.min , biased_data.stats.max , n_knots).ravel())\n", + "bias_spline_trainmodel = fl.models.Overdamped(fl.functions.BSplinesFunction(domain), fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0])), has_bias=True)\n", + "\n", + "name = \"KM\"\n", + "estimator = fl.KramersMoyalEstimator(deepcopy(bias_spline_trainmodel))\n", + "res = estimator.fit_fetch(biased_data)\n", + "print('has bias True',name,res.coefficients)\n", + "axb[0].plot(xfa, res.force(xfa.reshape(-1, 1)), label=name)\n", + "axb[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), label=name)\n", + "\n", + "\n", + "for name, marker, transitioncls in zip(\n", + " [\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"],\n", + " [\"+\",\"1\",\"2\",\"3\",\"|\",\"x\"],\n", + " [\n", + " fl.EulerDensity,\n", + " fl.ElerianDensity,\n", + " fl.KesslerDensity,\n", + " fl.DrozdovDensity,\n", + " ],\n", + "):\n", + " estimator = fl.LikelihoodEstimator(transitioncls(deepcopy(bias_spline_trainmodel)), n_jobs=4)\n", + " res = estimator.fit_fetch(biased_data)\n", + "\n", + " axb[0].plot(xfa, res.force(xfa.reshape(-1, 1)),marker, label=name)\n", + " axb[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)),marker, label=name)\n", + " print('has bias true',name,res.coefficients)\n", + "\n", + "axb[0].legend()\n", + "axb[1].legend()\n", + "plt.show() " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "folie", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/notebooks/tutorials/2D_DoubleWell_estimation.ipynb.txt b/_sources/notebooks/tutorials/2D_DoubleWell_estimation.ipynb.txt new file mode 100644 index 0000000..fdfedab --- /dev/null +++ b/_sources/notebooks/tutorials/2D_DoubleWell_estimation.ipynb.txt @@ -0,0 +1,1155 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D Double Well estimation " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import folie as fl\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from copy import deepcopy\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D UNBIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) The Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function along x and a parabola along y $V(x,y)= a(x^2-1)^2 + \\frac{1}{2}by^2$\n", + "and constant diffusion matrix $D= d\\begin{bmatrix} 1 \\ \\ 0 \\\\\\ 0 \\ \\ 1 \\end{bmatrix}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(-1.8,1.8,36)\n", + "y = np.linspace(-1.8,1.8,36)\n", + "input=np.transpose(np.array([x,y]))\n", + "\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]) * np.eye(2,2))\n", + "a,b = 5.0, 10.0\n", + "quartic2d= fl.functions.Quartic2D(a=a,b=b)\n", + "X,Y =np.meshgrid(x,y)\n", + "\n", + "# Plot potential surface \n", + "pot = quartic2d.potential_plot(X,Y)\n", + "fig = plt.figure()\n", + "ax = plt.axes(projection='3d')\n", + "ax.plot_surface(X,Y,pot, rstride=1, cstride=1,cmap='jet', edgecolor = 'none')\n", + "\n", + "# Plot Force function\n", + "ff=quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\n", + "U,V = np.meshgrid(ff[:,0],ff[:,1])\n", + "fig, ax =plt.subplots()\n", + "ax.quiver(x,y,U,V)\n", + "ax.set_title('Force')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dt = 1e-3\n", + "model_simu=fl.models.overdamped.Overdamped(force=quartic2d,diffusion=diff_function)\n", + "simulator=fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize positions \n", + "ntraj=30\n", + "q0= np.empty(shape=[ntraj,2])\n", + "for i in range(ntraj):\n", + " for j in range(2):\n", + " q0[i][j]=0.0000\n", + "time_steps=10000\n", + "data_2d_unbias = simulator.run(time_steps, q0,save_every=1) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the resulting trajectories\n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " axs.plot(trj[\"x\"][:,0],trj[\"x\"][:,1])\n", + " axs.spines['left'].set_position('center')\n", + " axs.spines['right'].set_color('none')\n", + " axs.spines['bottom'].set_position('center')\n", + " axs.spines['top'].set_color('none')\n", + " axs.xaxis.set_ticks_position('bottom')\n", + " axs.yaxis.set_ticks_position('left')\n", + " axs.set_xlabel(\"$X(t)$\")\n", + " axs.set_ylabel(\"$Y(t)$\")\n", + " axs.set_title(\"X-Y Trajectory\")\n", + " axs.grid()\n", + "\n", + "# plot x,y Trajectories in separate subplots\n", + "fig,bb = plt.subplots(1,2)\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " bb[0].plot(trj[\"x\"][:,0])\n", + " bb[1].plot(trj[\"x\"][:,1])\n", + "\n", + "# Set visible axis\n", + " bb[0].spines['right'].set_color('none')\n", + " bb[0].spines['bottom'].set_position('center')\n", + " bb[0].spines['top'].set_color('none')\n", + " bb[0].xaxis.set_ticks_position('bottom')\n", + " bb[0].yaxis.set_ticks_position('left')\n", + " bb[0].set_xlabel(\"$timestep$\")\n", + " bb[0].set_ylabel(\"$X(t)$\")\n", + "\n", + "# Set visible axis\n", + " bb[1].spines['right'].set_color('none')\n", + " bb[1].spines['bottom'].set_position('center')\n", + " bb[1].spines['top'].set_color('none')\n", + " bb[1].xaxis.set_ticks_position('bottom')\n", + " bb[1].yaxis.set_ticks_position('left')\n", + " bb[1].set_xlabel(\"$timestep$\")\n", + " bb[1].set_ylabel(\"$Y(t)$\")\n", + "\n", + " bb[0].set_title(\"X Dynamics\")\n", + " bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.1) 1D Simulation with same coefficients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coeff=a*np.array([1,0,-2,0,1])\n", + "free_energy = np.polynomial.Polynomial(coeff)\n", + "\n", + "force_coeff=np.array([-coeff[1],-2*coeff[2],-3*coeff[3],-4*coeff[4]])\n", + "force_function = fl.functions.Polynomial(deg=3,coefficients=force_coeff)\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]))\n", + "\n", + "# Plot of Free Energy and Force\n", + "x_values = np.linspace(-1.5, 1.5, 100)\n", + "fig, axs = plt.subplots(1, 2, figsize=(14,6))\n", + "axs[0].plot(x_values,free_energy(x_values))\n", + "axs[1].plot(x_values,force_function(x_values.reshape(len(x_values),1)))\n", + "axs[0].set_title(\"Potential\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$V(x)$\")\n", + "axs[0].grid()\n", + "axs[1].set_title(\"Force\") \n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$F(x)$\") \n", + "axs[1].grid()\n", + "\n", + "# Define model to simulate and type of simulator to use\n", + "dt=1e-3\n", + "model_simu = fl.models.overdamped.Overdamped(force_function,diffusion=diff_function)\n", + "simulator = fl.simulations.Simulator(fl.simulations.EulerStepper(model_simu), dt) \n", + "\n", + "# initialize positions \n", + "q0= np.empty(ntraj)\n", + "for i in range(len(q0)):\n", + " q0[i]=0.000\n", + "# Calculate Trajectory, n_traj and timesteps is the same as that of the 2D simulation\n", + "data_1D_unbias = simulator.run(time_steps, q0, 1)\n", + "\n", + "fig, axs = plt.subplots(figsize=(14,8))\n", + "for n, trj in enumerate(data_1D_unbias):\n", + " axs.plot(trj[\"x\"])\n", + " axs.set_title(\"Trajectory\")\n", + " # axs[1].plot(xmax[:, n])\n", + " axs.set_xlabel(\"$timestep$\")\n", + " axs.set_ylabel(\"$x(t)$\")\n", + " axs.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Fitting " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Projecting onto the x Coordinate and comparison with 1D simulation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xdata = fl.data.trajectories.Trajectories(dt=dt) \n", + "for n, trj in enumerate(data_2d_unbias):\n", + " xdata.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,0].reshape(len(trj[\"x\"][:,0]),1)))\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "xforce = -4*a*(xfa** 3 - xfa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.1) Fitting with exact model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "fitting of the 1D data \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = trainforce,diffusion=traindiff, has_bias=False)\n", + "\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs =4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs =4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs =4) # made by the previous estimator. So in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs =4)\n", + "\n", + "\n", + "Eul_res=Eul_estimator.fit_fetch(data_1D_unbias)\n", + "Eln_res=Eln_estimator.fit_fetch(data_1D_unbias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data_1D_unbias)\n", + "Drz_res=Drz_estimator.fit_fetch(data_1D_unbias)\n", + "res_vec = [Eul_res,Eln_res,Ksl_res,Drz_res] # makes a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig,ax = plt.subplots(1,2,figsize=(14,8))\n", + "ax[0].plot(xfa, xforce,label='Exact')\n", + "ax[1].plot(xfa,0.5*np.ones(xfa.shape), label = 'Exact')\n", + "\n", + "for name, res in zip(\n", + " [\"Euler\", \"Elerian\",\"Kessler\", \"Drozdov\"], res_vec,\n", + "):\n", + " ax[0].plot(xfa, res.force(xfa.reshape(-1, 1)), label=name)\n", + " ax[1].plot(xfa, res.diffusion(xfa.reshape(-1, 1)), label=name)\n", + " print(name, res.coefficients)\n", + "ax[0].set_title('Force function')\n", + "ax[1].set_title('Diffusion coefficient')\n", + "ax[0].legend()\n", + "ax[1].legend()\n", + "fig.suptitle('Order 3 Polynomial fitting of 1D data')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.2) Fitting with B-splines" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Fitting with 4-knots B-splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(xdata.stats.min,xdata.stats.max , n_knots).ravel())\n", + "splines_trainmodelx = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain), diffusion= fl.functions.BSplinesFunction(domain), has_bias = None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "fitting of the 1D data with Bsplines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(data_1D_unbias.stats.min,data_1D_unbias.stats.max , n_knots).ravel())\n", + "splines_trainmodelx_1d = fl.models.OverdampedSplines1D(domain=domain)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx_1d), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx_1d)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(data_1D_unbias)\n", + "Eul_res=Eul_estimator.fit_fetch(data_1D_unbias)\n", + "Eln_res=Eln_estimator.fit_fetch(data_1D_unbias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(data_1D_unbias)\n", + "Drz_res=Drz_estimator.fit_fetch(data_1D_unbias)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "fig.suptitle('1D data B-spline Fitting with '+str(n_knots)+ ' knots')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Projection onto y coordinate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ydata = fl.data.trajectories.Trajectories(dt=dt) \n", + "for n, trj in enumerate(data_2d_unbias):\n", + " ydata.append(fl.data.trajectories.Trajectory(dt,trj[\"x\"][:,1].reshape(len(trj[\"x\"][:,1]),1)))\n", + "yfa = np.linspace(-1.3, 1.3, 75)\n", + "yforce= -b*yfa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.2.1) Fitting with exact Ornstein–Uhlenbeck model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Parameters of the training\n", + "\n", + "trainmodely=fl.models.overdamped.OrnsteinUhlenbeck(has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodely), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(ydata))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(ydata))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(ydata))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(ydata))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(ydata))\n", + "res_vecy = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, yforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecy[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecy[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecy[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3) Projecting onto $1^{st}$ and $3^{rd}$ quadrant bisectrix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = np.pi/4\n", + "u = np.array([np.cos(theta),np.sin(theta)])\n", + "u_norm = (1/np.linalg.norm(u,2))*u\n", + "qdata = fl.data.trajectories.Trajectories(dt=dt) \n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_unbias):\n", + " proj_traj = (1/np.linalg.norm(u,2))*(trj[\"x\"][:,0]+trj[\"x\"][:,1]).reshape(len(trj[\"x\"][:,0]),1)\n", + " qdata.append(fl.data.trajectories.Trajectory(dt, proj_traj ))\n", + " axs.plot(qdata[n][\"x\"])\n", + " axs.set_xlabel('timestep')\n", + " axs.set_ylabel('q')\n", + " axs.set_title('Dynamics along u'+str(u_norm)+'direction')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.3.1) Fitting with splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "qfa = np.linspace(qdata.stats.min , qdata.stats.max,75)\n", + "n_knots= 4\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(qdata.stats.min , qdata.stats.max , n_knots).ravel())\n", + "trainmodelq = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain), diffusion =fl.functions.BSplinesFunction(domain), has_bias=None)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelq), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelq)), n_jobs=4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelq)), n_jobs=4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelq)), n_jobs=4) # made by the previuos estimator and so in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelq)), n_jobs=4) # which is the reason why the loop checking if the values are different in the following cell exists\n", + "\n", + "KM_res=KM_estimator.fit_fetch(qdata)\n", + "Eul_res=Eul_estimator.fit_fetch(qdata)\n", + "Eln_res=Eln_estimator.fit_fetch(qdata)\n", + "Ksl_res=Ksl_estimator.fit_fetch(qdata)\n", + "Drz_res=Drz_estimator.fit_fetch(qdata)\n", + "\n", + "res_vecq = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vecq[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecq[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecq[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D BIASED Double Well Potential" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) Model " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we model the double well potential as a quartic function along x and a parabola along y $V(x,y)= a(x^2-1)^2 + \\frac{1}{2}by^2$\n", + "and constant diffusion matrix $D= d\\begin{bmatrix} 1 \\ \\ 0 \\\\\\ 0 \\ \\ 1 \\end{bmatrix} $ \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = np.linspace(-1.8,1.8,36)\n", + "y = np.linspace(-1.8,1.8,36)\n", + "input=np.transpose(np.array([x,y]))\n", + "\n", + "diff_function= fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.5]) * np.eye(2,2))\n", + "a,b = 0.5, 1.0\n", + "\n", + "quartic2d = fl.functions.Quartic2D(a=a, b=b)\n", + "X, Y = np.meshgrid(x, y)\n", + "\n", + "# Plot potential surface\n", + "pot = quartic2d.potential_plot(X, Y)\n", + "fig = plt.figure()\n", + "ax = plt.axes(projection=\"3d\")\n", + "ax.plot_surface(X, Y, pot, rstride=1, cstride=1, cmap=\"jet\", edgecolor=\"none\")\n", + "\n", + "# Plot Force function\n", + "ff = quartic2d.force(input) # returns x and y components of the force : x_comp =ff[:,0] , y_comp =ff[:,1]\n", + "U, V = np.meshgrid(ff[:, 0], ff[:, 1])\n", + "fig, ax = plt.subplots()\n", + "ax.quiver(x, y, U, V)\n", + "ax.set_title(\"Force\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On top of that we apply a linear bias along the chosen collective variable $q(x,y)= x+y$ feeding to the biased 1DColval simulator class the collective variable as a function and its gradient as an explicit array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) Simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to bias with ABMD along a selected collective variable $\\textit{colvar} : \\: q(x,y)$ user must provide both the function of original variables and its gradient " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def colvar (x,y):\n", + " gradient = np.array([1,1])\n", + " return x + y , gradient\n", + "dt = 1e-3\n", + "model_simu=fl.models.overdamped.Overdamped(force=quartic2d,diffusion=diff_function)\n", + "simulator=fl.simulations.ABMD_2D_to_1DColvar_Simulator(fl.simulations.EulerStepper(model_simu), dt,colvar=colvar,k=10.0,qstop=1.5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize positions \n", + "ntraj=30\n", + "q0= np.empty(shape=[ntraj,2])\n", + "for i in range(ntraj):\n", + " for j in range(2):\n", + " q0[i][j]=-1.2\n", + "time_steps=5000\n", + "data_2d_bias = simulator.run(time_steps, q0,save_every=1) \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the resulting trajectories\n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_bias):\n", + " axs.plot(trj[\"x\"][:,0],trj[\"x\"][:,1])\n", + " axs.spines['left'].set_position('center')\n", + " axs.spines['right'].set_color('none')\n", + " axs.spines['bottom'].set_position('center')\n", + " axs.spines['top'].set_color('none')\n", + " axs.xaxis.set_ticks_position('bottom')\n", + " axs.yaxis.set_ticks_position('left')\n", + " axs.set_xlabel(\"$X(t)$\")\n", + " axs.set_ylabel(\"$Y(t)$\")\n", + " axs.set_title(\"X-Y Trajectory\")\n", + " axs.grid()\n", + "\n", + "# plot x,y Trajectories in separate subplots\n", + "fig,bb = plt.subplots(1,2)\n", + "for n, trj in enumerate(data_2d_bias):\n", + " bb[0].plot(trj[\"x\"][:,0])\n", + " bb[1].plot(trj[\"x\"][:,1])\n", + "\n", + "\n", + "# Set visible axis\n", + " bb[0].spines['right'].set_color('none')\n", + " bb[0].spines['bottom'].set_position('center')\n", + " bb[0].spines['top'].set_color('none')\n", + " bb[0].xaxis.set_ticks_position('bottom')\n", + " bb[0].yaxis.set_ticks_position('left')\n", + " bb[0].set_xlabel(\"$timestep$\")\n", + " bb[0].set_ylabel(\"$X(t)$\")\n", + "\n", + "# Set visible axis\n", + " bb[1].spines['right'].set_color('none')\n", + " bb[1].spines['bottom'].set_position('center')\n", + " bb[1].spines['top'].set_color('none')\n", + " bb[1].xaxis.set_ticks_position('bottom')\n", + " bb[1].yaxis.set_ticks_position('left')\n", + " bb[1].set_xlabel(\"$timestep$\")\n", + " bb[1].set_ylabel(\"$Y(t)$\")\n", + "\n", + " bb[0].set_title(\"X Dynamics\")\n", + " bb[1].set_title(\"Y Dynamics\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) Fitting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1) Projecting onto the x Coordinate \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xdata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "\n", + "for n, trj in enumerate(data_2d_bias):\n", + " xdata_bias.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,0].reshape(len(trj[\"x\"][:,0]),1), bias=trj[\"bias\"][:,:1].reshape(len(trj[\"bias\"][:,1]),1)))\n", + "\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "xforce = -4*a*(xfa** 3 - xfa)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.1) Fitting with exact model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parameters of the training\n", + "\n", + "trainforce =fl.functions.Polynomial(deg=3,coefficients=np.asarray([1,1,1,1]))\n", + "traindiff = fl.functions.Polynomial(deg=0,coefficients=np.asarray([0.0]))\n", + "trainmodelx=fl.models.Overdamped(force = deepcopy(trainforce),diffusion=deepcopy(traindiff), has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(xdata_bias))\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.1.2) Fitting with splines" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "n_knots=4\n", + "xfa = np.linspace(-1.3, 1.3, 75)\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(xdata_bias.stats.min, xdata_bias.stats.max , n_knots).ravel())\n", + "splines_trainmodelx = fl.models.Overdamped(force = fl.functions.BSplinesFunction(domain), diffusion= fl.functions.BSplinesFunction(domain), has_bias = True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(splines_trainmodelx), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(splines_trainmodelx)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(xdata_bias)\n", + "Eul_res=Eul_estimator.fit_fetch(xdata_bias)\n", + "Eln_res=Eln_estimator.fit_fetch(xdata_bias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(xdata_bias)\n", + "Drz_res=Drz_estimator.fit_fetch(xdata_bias)\n", + "\n", + "res_vec = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, xforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + "\n", + " axs[0].plot(xfa, res_vec[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vec[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vec[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n", + "\n", + "fig.suptitle('B-spline Fitting with '+str(n_knots)+ ' knots')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2) Projecting along y coordinate " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ydata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "\n", + "for n, trj in enumerate(data_2d_bias):\n", + " ydata_bias.append(fl.data.trajectories.Trajectory(dt, trj[\"x\"][:,1].reshape(len(trj[\"x\"][:,1]),1), bias=trj[\"bias\"][:,1].reshape(len(trj[\"bias\"][:,1]),1)))\n", + "\n", + "yfa = np.linspace(-1.3, 1.3, 75)\n", + "yforce = -b*yfa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Parameters of the training\n", + "\n", + "trainmodely=fl.models.overdamped.OrnsteinUhlenbeck(has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodely), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodely)),n_jobs=4)\n", + "\n", + "KM_res=KM_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Eul_res=Eul_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Eln_res=Eln_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Ksl_res=Ksl_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "Drz_res=Drz_estimator.fit_fetch(deepcopy(ydata_bias))\n", + "\n", + "res_vecy = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "#Plot exact quantities \n", + "\n", + "axs[0].plot(xfa, yforce, label=\"Exact\")\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecy[i].force(xfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecy[i].diffusion(xfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecy[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3) Projecting along biased coordinate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theta = np.pi/4\n", + "u = np.array([np.cos(theta),np.sin(theta)])\n", + "u_norm = (1/np.linalg.norm(u,2))*u\n", + "qdata_bias = fl.data.trajectories.Trajectories(dt=dt) \n", + "fig, axs = plt.subplots()\n", + "for n, trj in enumerate(data_2d_bias):\n", + " proj_bias=(trj[\"bias\"][:,0]+trj[\"bias\"][:,1]).reshape(len(trj[\"bias\"][:,0]),1)\n", + " proj_traj = (1/np.linalg.norm(u,2))*(trj[\"x\"][:,0]+trj[\"x\"][:,1]).reshape(len(trj[\"x\"][:,0]),1)\n", + " qdata_bias.append(fl.data.trajectories.Trajectory(dt, proj_traj, bias = proj_bias))\n", + " axs.plot(qdata_bias[n][\"x\"])\n", + " axs.set_xlabel('timestep')\n", + " axs.set_ylabel('q')\n", + " axs.set_title('Dynamics along u'+str(u_norm)+'direction')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "qfa = np.linspace(qdata_bias.stats.min , qdata_bias.stats.max,75)\n", + "n_knots= 5\n", + "domain = fl.MeshedDomain.create_from_range(np.linspace(qdata_bias.stats.min , qdata_bias.stats.max , n_knots).ravel())\n", + "trainmodelq = fl.models.Overdamped(force=fl.functions.BSplinesFunction(domain),has_bias=True)\n", + "\n", + "KM_estimator = fl.KramersMoyalEstimator(deepcopy(trainmodelq), n_jobs=4)\n", + "Eul_estimator = fl.LikelihoodEstimator(fl.EulerDensity(deepcopy(trainmodelq)), n_jobs=4) # deepcopy is used because the estimator modifies the model when fit method is called\n", + "Eln_estimator = fl.LikelihoodEstimator(fl.ElerianDensity(deepcopy(trainmodelq)), n_jobs=4) # and when the second estimator uses the object trainmodel this will already have the modifications\n", + "Ksl_estimator = fl.LikelihoodEstimator(fl.KesslerDensity(deepcopy(trainmodelq)), n_jobs=4) # made by the previuos estimator and so in the end they will return the exact same results\n", + "Drz_estimator = fl.LikelihoodEstimator(fl.DrozdovDensity(deepcopy(trainmodelq)), n_jobs=4) # which is the reason why the loop checking if the values are different in the following cell exists\n", + "\n", + "KM_res=KM_estimator.fit_fetch(qdata_bias)\n", + "Eul_res=Eul_estimator.fit_fetch(qdata_bias)\n", + "Eln_res=Eln_estimator.fit_fetch(qdata_bias)\n", + "Ksl_res=Ksl_estimator.fit_fetch(qdata_bias)\n", + "Drz_res=Drz_estimator.fit_fetch(qdata_bias)\n", + "\n", + "res_vecq = [KM_res,Eul_res,Eln_res,Ksl_res,Drz_res] # made a list of all the trained estimators \n", + "\n", + "# PLOT OF THE RESULTS \n", + "\n", + "\n", + "fig, axs = plt.subplots(1, 2, figsize=(14, 8))\n", + "axs[0].set_title(\"Force\")\n", + "axs[0].set_xlabel(\"$x$\")\n", + "axs[0].set_ylabel(\"$F(x)$\")\n", + "axs[0].grid()\n", + "\n", + "axs[1].set_title(\"Diffusion Coefficient\")\n", + "axs[1].set_xlabel(\"$x$\")\n", + "axs[1].set_ylabel(\"$D(x)$\") \n", + "axs[1].grid()\n", + "\n", + "\n", + "# #Plot inferred quantities \n", + "\n", + "names = [\"KM\",\"Euler\", \"Elerian\", \"Kessler\", \"Drozdov\"]\n", + "markers = [\"x\", \"1\",\"2\",\"3\",\"|\"]\n", + "for i in range(len(names)):\n", + " \n", + " axs[0].plot(xfa, res_vecq[i].force(qfa.reshape(-1, 1)), markers[i],label=names[i] )\n", + " axs[1].plot(xfa, res_vecq[i].diffusion(qfa.reshape(-1, 1)), markers[i],label=names[i])\n", + " print(names[i],res_vecq[i].coefficients)\n", + "axs[0].legend()\n", + "axs[1].legend()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "folie", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/notebooks/tutorials/DNAhairpin.ipynb.txt b/_sources/notebooks/tutorials/DNAhairpin.ipynb.txt new file mode 100644 index 0000000..3dec521 --- /dev/null +++ b/_sources/notebooks/tutorials/DNAhairpin.ipynb.txt @@ -0,0 +1,271 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ba1ffbb6", + "metadata": {}, + "source": [ + "# DNA Hairpin\n", + "\n", + "In this tutorial we are going to infer Langevin model on experimental data of DNA hairpin.\n", + "The data are from the following article:\n", + "Quantifying the Properties of Nonproductive Attempts at Thermally Activated Energy-Barrier Crossing through Direct Observation, Aaron Lyons, Anita Devi, Noel Q. Hoffer, and Michael T. Woodside. Phys. Rev. X 14, 011017.\n", + "The trajectories are available at https://doi.org/10.6084/m9.figshare.24794955." + ] + }, + { + "cell_type": "markdown", + "id": "324d299f", + "metadata": {}, + "source": [ + "First download the data and load the trajectories. Don't forget to adapt the location of the file" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "819a042b", + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule 1/HP_CF_Mol1_SampleTrajectory.txt not found.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_11040/347796182.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrajectories\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.0e-3\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Sampling frequency was 1MHz from the article, using then ms time unit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;31m# Let's use the first molecule.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mtrj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloadtxt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule {n}/HP_CF_Mol{n}_SampleTrajectory.txt\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#Let's check what we have\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mloadtxt\u001b[0;34m(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin, encoding, max_rows, quotechar, like)\u001b[0m\n\u001b[1;32m 1371\u001b[0m \u001b[0mdelimiter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'latin1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1372\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1373\u001b[0;31m arr = _read(fname, dtype=dtype, comment=comment, delimiter=delimiter,\n\u001b[0m\u001b[1;32m 1374\u001b[0m \u001b[0mconverters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mconverters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskiplines\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mskiprows\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0musecols\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1375\u001b[0m \u001b[0munpack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0munpack\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mndmin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mndmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(fname, delimiter, comment, quote, imaginary_unit, usecols, skiplines, max_rows, converters, ndmin, unpack, dtype, encoding)\u001b[0m\n\u001b[1;32m 990\u001b[0m \u001b[0mfname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 991\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 992\u001b[0;31m \u001b[0mfh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_datasource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 993\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 994\u001b[0m \u001b[0mencoding\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'encoding'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'latin1'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataSource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdestpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 193\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnewline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 194\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 195\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m 531\u001b[0m encoding=encoding, newline=newline)\n\u001b[1;32m 532\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 533\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mFileNotFoundError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{path} not found.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 534\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 535\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: ../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule 1/HP_CF_Mol1_SampleTrajectory.txt not found." + ] + } + ], + "source": [ + "import numpy as np\n", + "import folie as fl\n", + "\n", + "data = fl.Trajectories(dt=1.0e-3) # Sampling frequency was 1MHz from the article, using then ms time unit\n", + "n=1 # Let's use the first molecule.\n", + "trj = np.loadtxt(f\"../../Lyons_etal_PRX_2023_Data/Hairpin Constant Force Data/Molecule {n}/HP_CF_Mol{n}_SampleTrajectory.txt\")\n", + "data.append(trj.reshape(-1,1))\n", + "print(data) #Let's check what we have" + ] + }, + { + "cell_type": "markdown", + "id": "95cee9f0", + "metadata": {}, + "source": [ + "Then define a model, here we are going to use the default 1D overdamped model. We can then fit the model. To start we use a simple KramersMoyal estimation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3b3661c5", + "metadata": {}, + "outputs": [], + "source": [ + "domain = fl.MeshedDomain.create_from_range(np.linspace(data.stats.min, data.stats.max, 10).ravel())\n", + "model = fl.models.OverdampedSplines1D(domain)\n", + "estimator = fl.KramersMoyalEstimator(model)\n", + "model = estimator.fit_fetch(data)" + ] + }, + { + "cell_type": "markdown", + "id": "57265806", + "metadata": {}, + "source": [ + "We can then plot the force and diffusion profile" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d32093da", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "xfa = np.linspace(np.min(trj),np.max(trj),75)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Force plot\n", + "ax.set_title(\"Force\")\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$F(x)$\")\n", + "ax.grid()\n", + "ax.plot(xfa, model.force(xfa.reshape(-1, 1)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7c552423", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"Diffusion\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$D(x)$\")\n", + "ax.plot(xfa, model.diffusion(xfa.reshape(-1, 1)))" + ] + }, + { + "cell_type": "markdown", + "id": "550cf6a2", + "metadata": {}, + "source": [ + "But also obtain the free energy profile" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "568edcc2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pmf=fl.analysis.free_energy_profile_1d(model, xfa)\n", + "fig, ax = plt.subplots(1, 1)\n", + "# Diffusion plot\n", + "ax.set_title(\"PMF\")\n", + "ax.grid()\n", + "ax.set_xlabel(\"$x$\")\n", + "ax.set_ylabel(\"$\\\\beta U(x)$\")\n", + "ax.plot(xfa, pmf)" + ] + }, + { + "cell_type": "markdown", + "id": "24391587", + "metadata": {}, + "source": [ + "The next step is to compute the folding/unfolding rate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb9c4345", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "719ba0e9", + "metadata": {}, + "source": [ + "And we can also access the committor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb9cf80a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/tutorials/Maximizing_likelihood.ipynb.txt b/_sources/notebooks/tutorials/Maximizing_likelihood.ipynb.txt new file mode 100644 index 0000000..97918bf --- /dev/null +++ b/_sources/notebooks/tutorials/Maximizing_likelihood.ipynb.txt @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0a83b53b", + "metadata": {}, + "source": [ + "# Likelihood maximization\n", + "In this notebook, we are going to look over likelihood maximisation and how it is implemented in folie" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82e99a68", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c54830e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "87ee8978", + "metadata": {}, + "source": [ + "The next step is to choose a discretisation of the likelihood" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "818a3130", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7758897a", + "metadata": {}, + "outputs": [], + "source": [ + "for trj in data:\n", + " transition.preprocess_traj(trj)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "68b4662a", + "metadata": {}, + "outputs": [], + "source": [ + "def log_likelihood_negative(coefficients, data):\n", + " weightsum = data.weights.sum()\n", + " return np.sum([transition(weight, coefficients)[0] * weight / weightsum for weight, trj in zip(data.weights, data)])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7daed34d", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + " \n", + " \n", + "KramersMoyalEstimator(self.model).fit(data)\n", + "coefficients0 = self.model.coefficients\n", + "\n", + "\n", + "transition.use_jac = False\n", + "res = minimize(log_likelihood_negative, coefficients0, args=(data,), callback=callback, **minimize_kwargs)\n", + "\n", + "self.model.coefficients = res.x\n" + ] + }, + { + "cell_type": "markdown", + "id": "00ecd0a3", + "metadata": {}, + "source": [ + "We can also use the jacobian" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "80e96301", + "metadata": {}, + "outputs": [], + "source": [ + "def log_likelihood_negative_w_jac(transition, weights, data, coefficients):\n", + " weightsum = weights.sum()\n", + " array_res = [transition(weight, trj, coefficients, jac=True) * weight / weightsum for weight, trj in zip(data.weights, data)]\n", + " likelihood = np.sum([val[0] for val in array_res])\n", + " likelihood_jac = np.sum([val[1] for val in array_res], axis=0)\n", + " return likelihood,likelihood_jac" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2fa7c64", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "res = minimize(log_likelihood_negative_w_jac, coefficients0, args=(data,), jac=True, **minimize_kwargs)\n", + "self.model.coefficients = res.x\n" + ] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/notebooks/tutorials/alanine_dipeptide.ipynb.txt b/_sources/notebooks/tutorials/alanine_dipeptide.ipynb.txt new file mode 100644 index 0000000..b4838a5 --- /dev/null +++ b/_sources/notebooks/tutorials/alanine_dipeptide.ipynb.txt @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ee54748c", + "metadata": {}, + "source": [ + "# Alanine Dipeptide\n", + "\n", + "This example we study the Alanine Dipeptide molecule. Alanine Dipeptide is an example for a small peptide exhibiting rare-events in solution at room temperature. The ϕ and ψ dihedral angles of the molecule have been identified as the two relevant coordinates for the slowest kinetic processes of the system under equilibrium conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ab45cc9e", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import folie as fl\n", + "\n", + "import mdshare # for trajectory data" + ] + }, + { + "cell_type": "markdown", + "id": "d162d270", + "metadata": {}, + "source": [ + "Obtain the data via mdshare (thanks for the Computational Molecular Biology Group, Freie Universität Berlin (GER) providing the data):" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1346fe2f", + "metadata": {}, + "outputs": [], + "source": [ + "dihedral_file = mdshare.fetch(\n", + " \"alanine-dipeptide-3x250ns-backbone-dihedrals.npz\", working_directory=\"data\"\n", + ")\n", + "with np.load(dihedral_file) as fh:\n", + " dihedral = [fh[f\"arr_{i}\"] for i in range(3)]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c4d96356", + "metadata": {}, + "source": [ + "Since the dynamics of the molecule are completely described by its position in the dihedral plane, we can use these two variables to visualize the state population." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7cc4f2f1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f, ax = plt.subplots(1, 1)\n", + "hb = ax.hexbin(*np.concatenate(dihedral).T, mincnt=5)\n", + "ax.set_aspect('equal')\n", + "cb = f.colorbar(hb, ax=ax)\n", + "cb.set_label('# of frames in bin')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a7478c68", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(250000, 2)\n", + "(250000, 2)\n", + "(250000, 2)\n", + "Trajectory of length 250000 and dimension 2.\n", + "Trajectory of length 250000 and dimension 2.\n", + "Trajectory of length 250000 and dimension 2.\n", + "\n" + ] + } + ], + "source": [ + "data = fl.Trajectories(dt=1.0) # Timestep is 1ps\n", + "for trj in dihedral:\n", + " print(trj.shape)\n", + " data.append(trj)\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "id": "3df0692a", + "metadata": {}, + "source": [ + "We are going to use finite elements for building a 2D model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "795a355d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24318dc9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6be42dc3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/sg_execution_times.rst.txt b/_sources/sg_execution_times.rst.txt new file mode 100644 index 0000000..e1248c5 --- /dev/null +++ b/_sources/sg_execution_times.rst.txt @@ -0,0 +1,64 @@ + +:orphan: + +.. _sphx_glr_sg_execution_times: + + +Computation times +================= +**03:40.281** total execution time for 10 files **from all galleries**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_toy_models_plot_biased_1D_Double_Well.py` (``../examples/toy_models/plot_biased_1D_Double_Well.py``) + - 02:50.169 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_1D_Double_Well.py` (``../examples/toy_models/plot_1D_Double_Well.py``) + - 00:16.210 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_biased_2D_Double_Well.py` (``../examples/toy_models/plot_biased_2D_Double_Well.py``) + - 00:15.498 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_biasedOU.py` (``../examples/plot_biasedOU.py``) + - 00:07.511 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_example.py` (``../examples/plot_example.py``) + - 00:07.378 + - 0.0 + * - :ref:`sphx_glr_auto_examples_toy_models_plot_2D_Double_Well.py` (``../examples/toy_models/plot_2D_Double_Well.py``) + - 00:01.348 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_fem.py` (``../examples/plot_fem.py``) + - 00:00.983 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_likelihood.py` (``../examples/plot_likelihood.py``) + - 00:00.959 + - 0.0 + * - :ref:`sphx_glr_auto_examples_plot_functions.py` (``../examples/plot_functions.py``) + - 00:00.224 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_em.py` (``../examples/example_em.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/statistical_performances.rst.txt b/_sources/statistical_performances.rst.txt new file mode 100644 index 0000000..f99d4e0 --- /dev/null +++ b/_sources/statistical_performances.rst.txt @@ -0,0 +1,8 @@ +============================== +Statistical performances +============================== +Notebooks that explore the inference with respect to timestep or number of data points. + +.. nbgallery:: + notebooks/statistical_performances/overdampedOU.ipynb + notebooks/statistical_performances/overdampedhiddenOU.ipynb diff --git a/_sources/tutorials.rst.txt b/_sources/tutorials.rst.txt new file mode 100644 index 0000000..8a7d7e5 --- /dev/null +++ b/_sources/tutorials.rst.txt @@ -0,0 +1,9 @@ +========== +Tutorials +========== +Notebooks containing some longer example systems. + +.. nbgallery:: + :glob: + + notebooks/tutorials/* diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..f316efc --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/binder_badge_logo.svg b/_static/binder_badge_logo.svg new file mode 100644 index 0000000..327f6b6 --- /dev/null +++ b/_static/binder_badge_logo.svg @@ -0,0 +1 @@ + launchlaunchbinderbinder \ No newline at end of file diff --git a/_static/broken_example.png b/_static/broken_example.png new file mode 100644 index 0000000..4fea24e Binary files /dev/null and b/_static/broken_example.png differ diff --git a/_static/debug.css b/_static/debug.css new file mode 100644 index 0000000..74d4aec --- /dev/null +++ b/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..715f749 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0+untagged.1.g2ab3175', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/graphviz.css b/_static/graphviz.css new file mode 100644 index 0000000..027576e --- /dev/null +++ b/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/_static/js/copybutton.js b/_static/js/copybutton.js new file mode 100644 index 0000000..d87f569 --- /dev/null +++ b/_static/js/copybutton.js @@ -0,0 +1,63 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-pycon .highlight,' + + '.highlight-default .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); diff --git a/_static/jupyterlite_badge_logo.svg b/_static/jupyterlite_badge_logo.svg new file mode 100644 index 0000000..5de36d7 --- /dev/null +++ b/_static/jupyterlite_badge_logo.svg @@ -0,0 +1,3 @@ + + +launchlaunchlitelite \ No newline at end of file diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/nbsphinx-broken-thumbnail.svg b/_static/nbsphinx-broken-thumbnail.svg new file mode 100644 index 0000000..4919ca8 --- /dev/null +++ b/_static/nbsphinx-broken-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/_static/nbsphinx-code-cells.css b/_static/nbsphinx-code-cells.css new file mode 100644 index 0000000..a3fb27c --- /dev/null +++ b/_static/nbsphinx-code-cells.css @@ -0,0 +1,259 @@ +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nbinput.container div.prompt pre > code { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre, +/* for sphinx_immaterial theme: */ +div.nboutput.container div.prompt pre > code { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars and line breaks on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; + white-space: pre; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copy button on prompts for 'sphinx_copybutton' extension ... */ +.prompt .copybtn, +/* ... and 'sphinx_immaterial' theme */ +.prompt .md-clipboard.md-icon { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +.jp-RenderedHTMLCommon table, +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +.jp-RenderedHTMLCommon thead, +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +.jp-RenderedHTMLCommon tr, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon td, +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.jp-RenderedHTMLCommon th, +div.rendered_html th { + font-weight: bold; +} +.jp-RenderedHTMLCommon tbody tr:nth-child(odd), +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +.jp-RenderedHTMLCommon tbody tr:hover, +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + diff --git a/_static/nbsphinx-gallery.css b/_static/nbsphinx-gallery.css new file mode 100644 index 0000000..365c27a --- /dev/null +++ b/_static/nbsphinx-gallery.css @@ -0,0 +1,31 @@ +.nbsphinx-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 5px; + margin-top: 1em; + margin-bottom: 1em; +} + +.nbsphinx-gallery > a { + padding: 5px; + border: 1px dotted currentColor; + border-radius: 2px; + text-align: center; +} + +.nbsphinx-gallery > a:hover { + border-style: solid; +} + +.nbsphinx-gallery img { + max-width: 100%; + max-height: 100%; +} + +.nbsphinx-gallery > a > div:first-child { + display: flex; + align-items: start; + justify-content: center; + height: 120px; + margin-bottom: 5px; +} diff --git a/_static/nbsphinx-no-thumbnail.svg b/_static/nbsphinx-no-thumbnail.svg new file mode 100644 index 0000000..9dca758 --- /dev/null +++ b/_static/nbsphinx-no-thumbnail.svg @@ -0,0 +1,9 @@ + + + + diff --git a/_static/no_image.png b/_static/no_image.png new file mode 100644 index 0000000..8c2d48d Binary files /dev/null and b/_static/no_image.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..02b4b12 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,258 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ +.highlight .gp { color: #8f5902 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #204a87 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ +.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ +.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ +.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ +.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #404040 } +body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ +body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } +body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #ff3a3a } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/_static/scripts/furo-extensions.js b/_static/scripts/furo-extensions.js new file mode 100644 index 0000000..e69de29 diff --git a/_static/scripts/furo.js b/_static/scripts/furo.js new file mode 100644 index 0000000..0267c7e --- /dev/null +++ b/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={856:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(856),e=n.n(t),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;const s=64;function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function a(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",l)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+2.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),a()}))})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/_static/scripts/furo.js.LICENSE.txt b/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 0000000..1632189 --- /dev/null +++ b/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/_static/scripts/furo.js.map b/_static/scripts/furo.js.map new file mode 100644 index 0000000..c3b37aa --- /dev/null +++ b/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 2.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..92da3f8 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sg_gallery-binder.css b/_static/sg_gallery-binder.css new file mode 100644 index 0000000..420005d --- /dev/null +++ b/_static/sg_gallery-binder.css @@ -0,0 +1,11 @@ +/* CSS for binder integration */ + +div.binder-badge { + margin: 1em auto; + vertical-align: middle; +} + +div.lite-badge { + margin: 1em auto; + vertical-align: middle; +} diff --git a/_static/sg_gallery-dataframe.css b/_static/sg_gallery-dataframe.css new file mode 100644 index 0000000..fac74c4 --- /dev/null +++ b/_static/sg_gallery-dataframe.css @@ -0,0 +1,47 @@ +/* Pandas dataframe css */ +/* Taken from: https://github.com/spatialaudio/nbsphinx/blob/fb3ba670fc1ba5f54d4c487573dbc1b4ecf7e9ff/src/nbsphinx.py#L587-L619 */ +html[data-theme="light"] { + --sg-text-color: #000; + --sg-tr-odd-color: #f5f5f5; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); +} +html[data-theme="dark"] { + --sg-text-color: #fff; + --sg-tr-odd-color: #373737; + --sg-tr-hover-color: rgba(30, 81, 122, 0.2); +} + +table.dataframe { + border: none !important; + border-collapse: collapse; + border-spacing: 0; + border-color: transparent; + color: var(--sg-text-color); + font-size: 12px; + table-layout: fixed; + width: auto; +} +table.dataframe thead { + border-bottom: 1px solid var(--sg-text-color); + vertical-align: bottom; +} +table.dataframe tr, +table.dataframe th, +table.dataframe td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +table.dataframe th { + font-weight: bold; +} +table.dataframe tbody tr:nth-child(odd) { + background: var(--sg-tr-odd-color); +} +table.dataframe tbody tr:hover { + background: var(--sg-tr-hover-color); +} diff --git a/_static/sg_gallery-rendered-html.css b/_static/sg_gallery-rendered-html.css new file mode 100644 index 0000000..93dc2ff --- /dev/null +++ b/_static/sg_gallery-rendered-html.css @@ -0,0 +1,224 @@ +/* Adapted from notebook/static/style/style.min.css */ +html[data-theme="light"] { + --sg-text-color: #000; + --sg-background-color: #ffffff; + --sg-code-background-color: #eff0f1; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); + --sg-tr-odd-color: #f5f5f5; +} +html[data-theme="dark"] { + --sg-text-color: #fff; + --sg-background-color: #121212; + --sg-code-background-color: #2f2f30; + --sg-tr-hover-color: rgba(66, 165, 245, 0.2); + --sg-tr-odd-color: #1f1f1f; +} + +.rendered_html { + color: var(--sg-text-color); + /* any extras will just be numbers: */ +} +.rendered_html em { + font-style: italic; +} +.rendered_html strong { + font-weight: bold; +} +.rendered_html u { + text-decoration: underline; +} +.rendered_html :link { + text-decoration: underline; +} +.rendered_html :visited { + text-decoration: underline; +} +.rendered_html h1 { + font-size: 185.7%; + margin: 1.08em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h2 { + font-size: 157.1%; + margin: 1.27em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h3 { + font-size: 128.6%; + margin: 1.55em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h4 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; +} +.rendered_html h5 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; + font-style: italic; +} +.rendered_html h6 { + font-size: 100%; + margin: 2em 0 0 0; + font-weight: bold; + line-height: 1.0; + font-style: italic; +} +.rendered_html h1:first-child { + margin-top: 0.538em; +} +.rendered_html h2:first-child { + margin-top: 0.636em; +} +.rendered_html h3:first-child { + margin-top: 0.777em; +} +.rendered_html h4:first-child { + margin-top: 1em; +} +.rendered_html h5:first-child { + margin-top: 1em; +} +.rendered_html h6:first-child { + margin-top: 1em; +} +.rendered_html ul:not(.list-inline), +.rendered_html ol:not(.list-inline) { + padding-left: 2em; +} +.rendered_html ul { + list-style: disc; +} +.rendered_html ul ul { + list-style: square; + margin-top: 0; +} +.rendered_html ul ul ul { + list-style: circle; +} +.rendered_html ol { + list-style: decimal; +} +.rendered_html ol ol { + list-style: upper-alpha; + margin-top: 0; +} +.rendered_html ol ol ol { + list-style: lower-alpha; +} +.rendered_html ol ol ol ol { + list-style: lower-roman; +} +.rendered_html ol ol ol ol ol { + list-style: decimal; +} +.rendered_html * + ul { + margin-top: 1em; +} +.rendered_html * + ol { + margin-top: 1em; +} +.rendered_html hr { + color: var(--sg-text-color); + background-color: var(--sg-text-color); +} +.rendered_html pre { + margin: 1em 2em; + padding: 0px; + background-color: var(--sg-background-color); +} +.rendered_html code { + background-color: var(--sg-code-background-color); +} +.rendered_html p code { + padding: 1px 5px; +} +.rendered_html pre code { + background-color: var(--sg-background-color); +} +.rendered_html pre, +.rendered_html code { + border: 0; + color: var(--sg-text-color); + font-size: 100%; +} +.rendered_html blockquote { + margin: 1em 2em; +} +.rendered_html table { + margin-left: auto; + margin-right: auto; + border: none; + border-collapse: collapse; + border-spacing: 0; + color: var(--sg-text-color); + font-size: 12px; + table-layout: fixed; +} +.rendered_html thead { + border-bottom: 1px solid var(--sg-text-color); + vertical-align: bottom; +} +.rendered_html tr, +.rendered_html th, +.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +.rendered_html th { + font-weight: bold; +} +.rendered_html tbody tr:nth-child(odd) { + background: var(--sg-tr-odd-color); +} +.rendered_html tbody tr:hover { + color: var(--sg-text-color); + background: var(--sg-tr-hover-color); +} +.rendered_html * + table { + margin-top: 1em; +} +.rendered_html p { + text-align: left; +} +.rendered_html * + p { + margin-top: 1em; +} +.rendered_html img { + display: block; + margin-left: auto; + margin-right: auto; +} +.rendered_html * + img { + margin-top: 1em; +} +.rendered_html img, +.rendered_html svg { + max-width: 100%; + height: auto; +} +.rendered_html img.unconfined, +.rendered_html svg.unconfined { + max-width: none; +} +.rendered_html .alert { + margin-bottom: initial; +} +.rendered_html * + .alert { + margin-top: 1em; +} +[dir="rtl"] .rendered_html p { + text-align: right; +} diff --git a/_static/sg_gallery.css b/_static/sg_gallery.css new file mode 100644 index 0000000..7222783 --- /dev/null +++ b/_static/sg_gallery.css @@ -0,0 +1,342 @@ +/* +Sphinx-Gallery has compatible CSS to fix default sphinx themes +Tested for Sphinx 1.3.1 for all themes: default, alabaster, sphinxdoc, +scrolls, agogo, traditional, nature, haiku, pyramid +Tested for Read the Docs theme 0.1.7 */ + +/* Define light colors */ +:root, html[data-theme="light"], body[data-theme="light"]{ + --sg-tooltip-foreground: black; + --sg-tooltip-background: rgba(250, 250, 250, 0.9); + --sg-tooltip-border: #ccc transparent; + --sg-thumb-box-shadow-color: #6c757d40; + --sg-thumb-hover-border: #0069d9; + --sg-script-out: #888; + --sg-script-pre: #fafae2; + --sg-pytb-foreground: #000; + --sg-pytb-background: #ffe4e4; + --sg-pytb-border-color: #f66; + --sg-download-a-background-color: #ffc; + --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); + --sg-download-a-border-color: 1px solid #c2c22d; + --sg-download-a-color: #000; + --sg-download-a-hover-background-color: #d5d57e; + --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); +} +@media(prefers-color-scheme: light) { + :root[data-theme="auto"], html[data-theme="auto"], body[data-theme="auto"] { + --sg-tooltip-foreground: black; + --sg-tooltip-background: rgba(250, 250, 250, 0.9); + --sg-tooltip-border: #ccc transparent; + --sg-thumb-box-shadow-color: #6c757d40; + --sg-thumb-hover-border: #0069d9; + --sg-script-out: #888; + --sg-script-pre: #fafae2; + --sg-pytb-foreground: #000; + --sg-pytb-background: #ffe4e4; + --sg-pytb-border-color: #f66; + --sg-download-a-background-color: #ffc; + --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); + --sg-download-a-border-color: 1px solid #c2c22d; + --sg-download-a-color: #000; + --sg-download-a-hover-background-color: #d5d57e; + --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); + } +} + +html[data-theme="dark"], body[data-theme="dark"] { + --sg-tooltip-foreground: white; + --sg-tooltip-background: rgba(10, 10, 10, 0.9); + --sg-tooltip-border: #333 transparent; + --sg-thumb-box-shadow-color: #79848d40; + --sg-thumb-hover-border: #003975; + --sg-script-out: rgb(179, 179, 179); + --sg-script-pre: #2e2e22; + --sg-pytb-foreground: #fff; + --sg-pytb-background: #1b1717; + --sg-pytb-border-color: #622; + --sg-download-a-background-color: #443; + --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); + --sg-download-a-border-color: 1px solid #3a3a0d; + --sg-download-a-color: #fff; + --sg-download-a-hover-background-color: #616135; + --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); +} +@media(prefers-color-scheme: dark){ + html[data-theme="auto"], body[data-theme="auto"] { + --sg-tooltip-foreground: white; + --sg-tooltip-background: rgba(10, 10, 10, 0.9); + --sg-tooltip-border: #333 transparent; + --sg-thumb-box-shadow-color: #79848d40; + --sg-thumb-hover-border: #003975; + --sg-script-out: rgb(179, 179, 179); + --sg-script-pre: #2e2e22; + --sg-pytb-foreground: #fff; + --sg-pytb-background: #1b1717; + --sg-pytb-border-color: #622; + --sg-download-a-background-color: #443; + --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); + --sg-download-a-border-color: 1px solid #3a3a0d; + --sg-download-a-color: #fff; + --sg-download-a-hover-background-color: #616135; + --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); + --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); + } +} + +.sphx-glr-thumbnails { + width: 100%; + margin: 0px 0px 20px 0px; + + /* align thumbnails on a grid */ + justify-content: space-between; + display: grid; + /* each grid column should be at least 160px (this will determine + the actual number of columns) and then take as much of the + remaining width as possible */ + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 15px; +} +.sphx-glr-thumbnails .toctree-wrapper { + /* hide empty toctree divs added to the DOM + by sphinx even though the toctree is hidden + (they would fill grid places with empty divs) */ + display: none; +} +.sphx-glr-thumbcontainer { + background: transparent; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + box-shadow: 0 0 10px var(--sg-thumb-box-shadow-color); + + /* useful to absolutely position link in div */ + position: relative; + + /* thumbnail width should include padding and borders + and take all available space */ + box-sizing: border-box; + width: 100%; + padding: 10px; + border: 1px solid transparent; + + /* align content in thumbnail */ + display: flex; + flex-direction: column; + align-items: center; + gap: 7px; +} +.sphx-glr-thumbcontainer p { + position: absolute; + top: 0; + left: 0; +} +.sphx-glr-thumbcontainer p, +.sphx-glr-thumbcontainer p a { + /* link should cover the whole thumbnail div */ + width: 100%; + height: 100%; +} +.sphx-glr-thumbcontainer p a span { + /* text within link should be masked + (we are just interested in the href) */ + display: none; +} +.sphx-glr-thumbcontainer:hover { + border: 1px solid; + border-color: var(--sg-thumb-hover-border); + cursor: pointer; +} +.sphx-glr-thumbcontainer a.internal { + bottom: 0; + display: block; + left: 0; + box-sizing: border-box; + padding: 150px 10px 0; + position: absolute; + right: 0; + top: 0; +} +/* Next one is to avoid Sphinx traditional theme to cover all the +thumbnail with its default link Background color */ +.sphx-glr-thumbcontainer a.internal:hover { + background-color: transparent; +} + +.sphx-glr-thumbcontainer p { + margin: 0 0 0.1em 0; +} +.sphx-glr-thumbcontainer .figure { + margin: 10px; + width: 160px; +} +.sphx-glr-thumbcontainer img { + display: inline; + max-height: 112px; + max-width: 160px; +} +.sphx-glr-thumbcontainer[tooltip]:hover:after { + background: var(--sg-tooltip-background); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: var(--sg-tooltip-foreground); + content: attr(tooltip); + padding: 10px; + z-index: 98; + width: 100%; + height: 100%; + position: absolute; + pointer-events: none; + top: 0; + box-sizing: border-box; + overflow: hidden; + backdrop-filter: blur(3px); +} + +.sphx-glr-script-out { + color: var(--sg-script-out); + display: flex; + gap: 0.5em; +} +.sphx-glr-script-out::before { + content: "Out:"; + /* These numbers come from the pre style in the pydata sphinx theme. This + * turns out to match perfectly on the rtd theme, but be a bit too low for + * the pydata sphinx theme. As I could not find a dimension to use that was + * scaled the same way, I just picked one option that worked pretty close for + * both. */ + line-height: 1.4; + padding-top: 10px; +} +.sphx-glr-script-out .highlight { + background-color: transparent; + /* These options make the div expand... */ + flex-grow: 1; + /* ... but also keep it from overflowing its flex container. */ + overflow: auto; +} +.sphx-glr-script-out .highlight pre { + background-color: var(--sg-script-pre); + border: 0; + max-height: 30em; + overflow: auto; + padding-left: 1ex; + /* This margin is necessary in the pydata sphinx theme because pre has a box + * shadow which would be clipped by the overflow:auto in the parent div + * above. */ + margin: 2px; + word-break: break-word; +} +.sphx-glr-script-out + p { + margin-top: 1.8em; +} +blockquote.sphx-glr-script-out { + margin-left: 0pt; +} +.sphx-glr-script-out.highlight-pytb .highlight pre { + color: var(--sg-pytb-foreground); + background-color: var(--sg-pytb-background); + border: 1px solid var(--sg-pytb-border-color); + margin-top: 10px; + padding: 7px; +} + +div.sphx-glr-footer { + text-align: center; +} + +div.sphx-glr-download { + margin: 1em auto; + vertical-align: middle; +} + +div.sphx-glr-download a { + background-color: var(--sg-download-a-background-color); + background-image: var(--sg-download-a-background-image); + border-radius: 4px; + border: 1px solid var(--sg-download-a-border-color); + color: var(--sg-download-a-color); + display: inline-block; + font-weight: bold; + padding: 1ex; + text-align: center; +} + +div.sphx-glr-download code.download { + display: inline-block; + white-space: normal; + word-break: normal; + overflow-wrap: break-word; + /* border and background are given by the enclosing 'a' */ + border: none; + background: none; +} + +div.sphx-glr-download a:hover { + box-shadow: inset 0 1px 0 var(--sg-download-a-hover-box-shadow-1), 0 1px 5px var(--sg-download-a-hover-box-shadow-2); + text-decoration: none; + background-image: none; + background-color: var(--sg-download-a-hover-background-color); +} + +.sphx-glr-example-title:target::before { + display: block; + content: ""; + margin-top: -50px; + height: 50px; + visibility: hidden; +} + +ul.sphx-glr-horizontal { + list-style: none; + padding: 0; +} +ul.sphx-glr-horizontal li { + display: inline; +} +ul.sphx-glr-horizontal img { + height: auto !important; +} + +.sphx-glr-single-img { + margin: auto; + display: block; + max-width: 100%; +} + +.sphx-glr-multi-img { + max-width: 42%; + height: auto; +} + +div.sphx-glr-animation { + margin: auto; + display: block; + max-width: 100%; +} +div.sphx-glr-animation .animation { + display: block; +} + +p.sphx-glr-signature a.reference.external { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + padding: 3px; + font-size: 75%; + text-align: right; + margin-left: auto; + display: table; +} + +.sphx-glr-clear { + clear: both; +} + +a.sphx-glr-backref-instance { + text-decoration: none; +} diff --git a/_static/skeleton.css b/_static/skeleton.css new file mode 100644 index 0000000..467c878 --- /dev/null +++ b/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css new file mode 100644 index 0000000..bc447f2 --- /dev/null +++ b/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map new file mode 100644 index 0000000..9ba5637 --- /dev/null +++ b/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/styles/furo.css b/_static/styles/furo.css new file mode 100644 index 0000000..e3d4e57 --- /dev/null +++ b/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#6b6f76;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#0a4bff;--color-brand-content:#2757dd;--color-brand-visited:#872ee0;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-api-added:#21632c;--color-api-added-border:#38a84d;--color-api-changed:#046172;--color-api-changed-border:#06a1bc;--color-api-deprecated:#605706;--color-api-deprecated-border:#f0d90f;--color-api-removed:#b30000;--color-api-removed-border:#ff5c5c;--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link--hover:var(--color-brand-content);--color-link-underline--hover:var(--color-foreground-border);--color-link--visited:var(--color-brand-visited);--color-link-underline--visited:var(--color-background-border);--color-link--visited--hover:var(--color-brand-visited);--color-link-underline--visited--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:block}@media(prefers-color-scheme:dark){body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-dark{display:block}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:none}}body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-family:var(--font-stack--headings);font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:visited{color:var(--color-link--visited);text-decoration-color:var(--color-link-underline--visited)}a:visited:hover{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link:hover:visited{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{height:100%}.skip-to-content,body,html{background:var(--color-background-primary);color:var(--color-foreground-primary)}.skip-to-content{border-radius:1rem;left:.25rem;padding:1rem;position:fixed;top:.25rem;transform:translateY(-200%);transition:transform .3s ease-in-out;z-index:40}.skip-to-content:focus-within{transform:translateY(0)}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1.25rem;vertical-align:middle;width:1.25rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.25rem;width:1.25rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg,.content-icon-container .view-this-page svg{color:inherit;height:1.25rem;width:1.25rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.25rem;width:1.25rem}:target{scroll-margin-top:calc(var(--header-height) + 2.5rem)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:4.25rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}div.deprecated,div.versionadded,div.versionchanged,div.versionremoved{border-left:.1875rem solid;border-radius:.125rem;padding-left:.75rem}div.deprecated p,div.versionadded p,div.versionchanged p,div.versionremoved p{margin-bottom:.125rem;margin-top:.125rem}div.versionadded{border-color:var(--color-api-added-border)}div.versionadded .versionmodified{color:var(--color-api-added)}div.versionchanged{border-color:var(--color-api-changed-border)}div.versionchanged .versionmodified{color:var(--color-api-changed)}div.deprecated{border-color:var(--color-api-deprecated-border)}div.deprecated .versionmodified{color:var(--color-api-deprecated)}div.versionremoved{border-color:var(--color-api-removed-border)}div.versionremoved .versionmodified{color:var(--color-api-removed)}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>:not(span),div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:2.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(2.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(2.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover);color:var(--color-sidebar-link-text)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23607D8B' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' viewBox='0 0 24 24'%3E%3Cpath stroke='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree a.reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo.css.map b/_static/styles/furo.css.map new file mode 100644 index 0000000..6e02d0b --- /dev/null +++ b/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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AEE,CAJJ,gBAEE,CAJE,iBAMA,yFAQA,aACA,eEpbJ,cACE,iBACA,YAEA,CAFA,iBAEA,+DAGA,mBAKA,gCAGA,CARA,SAIA,SACA,CALA,0EAIA,CAJA,OAQA,0CACE,UAGF,iDAGF,CAHE,UAGF,8CAEE,CAFF,UAEE,CACA,uCAEA,WACA,WAFA,UAEA,6CAIA,yCACA,WAGA,WAJA,UAIA,gDACE,aASF,0CACE,CAFF,mBAEE,wEACA,CATA,YACA,CAKF,kBACA,CALE,MAGJ,CAII,eACA,CAJF,iCALE,cACA,CAHA,oBACA,CAKJ,SAKI,2BADA,UACA,6BAEJ,WACE,0DACA,kBACE,gCACA,mBADA,YACA,oEACA,2CAMF,mDAII,CAJJ,aADF,cACE,kBAII,kEACA,iBACE,mEACA,6BACE,wBADF,cACE,mCACA,qDANN,kCACE,6BAEE,mBADF,0CACE,CAFF,eACA,MACE,0DACA,wCACE,sGACA,WANN,yBACE,uCACA,CAFF,UAEE,2CACE,0FACA,cACE,kEACA,mEANN,yBACE,4DACA,sBACE,+EAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCrEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kEAGA,8CAEA,uDAIF,gEAIE,6BACA,gEAIA,+CACE,0EAIF,sDAEE,+DAGF,sCACA,8BACE,oC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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/variables/_layout.scss","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto-light\n display: block\n\n @media (prefers-color-scheme: dark)\n .theme-toggle svg.theme-icon-when-auto-dark\n display: block\n .theme-toggle svg.theme-icon-when-auto-light\n display: none\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n --font-stack--headings: var(--font-stack);\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #6b6f76; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #0a4bff;\n --color-brand-content: #2757dd;\n --color-brand-visited: #872ee0;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n\n --color-api-added: #21632c;\n --color-api-added-border: #38a84d;\n --color-api-changed: #046172;\n --color-api-changed-border: #06a1bc;\n --color-api-deprecated: #605706;\n --color-api-deprecated-border: #f0d90f;\n --color-api-removed: #b30000;\n --color-api-removed-border: #ff5c5c;\n\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline--hover: var(--color-foreground-border);\n\n --color-link--visited: var(--color-brand-visited);\n --color-link-underline--visited: var(--color-background-border);\n --color-link--visited--hover: var(--color-brand-visited);\n --color-link-underline--visited--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #cfd0d0; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #3d94ff;\n --color-brand-content: #5ca5ff;\n --color-brand-visited: #b27aeb;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n --color-api-added: #3db854;\n --color-api-added-border: #267334;\n --color-api-changed: #09b0ce;\n --color-api-changed-border: #056d80;\n --color-api-deprecated: #b1a10b;\n --color-api-deprecated-border: #6e6407;\n --color-api-removed: #ff7575;\n --color-api-removed-border: #b03b3b;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-family: var(--font-stack--headings)\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:visited\n color: var(--color-link--visited)\n text-decoration-color: var(--color-link-underline--visited)\n &:hover\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &:visited\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\n$icon-size: 1.25rem\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n.skip-to-content\n position: fixed\n padding: 1rem\n border-radius: 1rem\n left: 0.25rem\n top: 0.25rem\n z-index: 40\n background: var(--color-background-primary)\n color: var(--color-foreground-primary)\n\n transform: translateY(-200%)\n transition: transform 300ms ease-in-out\n\n &:focus-within\n transform: translateY(0%)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: $icon-size\n width: $icon-size\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: $icon-size\n width: $icon-size\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page, .view-this-page\n svg\n color: inherit\n height: $icon-size\n width: $icon-size\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: $icon-size\n width: $icon-size\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: calc(var(--header-height) + 2.5rem)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","// Overall Layout Variables\n//\n// Because CSS variables can't be used in media queries. The fact that this\n// makes the layout non-user-configurable is a good thing.\n$content-padding: 3em;\n$content-padding--small: 1em;\n$content-width: 46em;\n$sidebar-width: 15em;\n$full-width: $content-width + 2 * ($content-padding + $sidebar-width);\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 4.25rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\ndiv.versionadded,\ndiv.versionchanged,\ndiv.deprecated,\ndiv.versionremoved\n border-left: 0.1875rem solid\n border-radius: 0.125rem\n\n padding-left: 0.75rem\n\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\ndiv.versionadded\n border-color: var(--color-api-added-border)\n .versionmodified\n color: var(--color-api-added)\n\ndiv.versionchanged\n border-color: var(--color-api-changed-border)\n .versionmodified\n color: var(--color-api-changed)\n\ndiv.deprecated\n border-color: var(--color-api-deprecated-border)\n .versionmodified\n color: var(--color-api-deprecated)\n\ndiv.versionremoved\n border-color: var(--color-api-removed-border)\n .versionmodified\n color: var(--color-api-removed)\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > *:not(span),\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 2.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(2.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(2.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n color: var(--color-sidebar-link-text)\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the