diff --git a/.github/workflows/documentation-build.yml b/.github/workflows/documentation-build.yml index fd58996f..f85695bc 100644 --- a/.github/workflows/documentation-build.yml +++ b/.github/workflows/documentation-build.yml @@ -35,15 +35,9 @@ jobs: - name: Build documentation run: pixi run --environment dev docs-build - - # - name: Build and Commit - # uses: sphinx-notes/pages@master - # with: - # install_requirements: true - # documentation_path: docs/src - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./docs/_build/html + publish_dir: ./site diff --git a/Examples/base/README.md b/Examples/base/README.md new file mode 100644 index 00000000..3a98f70e --- /dev/null +++ b/Examples/base/README.md @@ -0,0 +1,3 @@ +# Subclassing Examples + +This section gathers examples which correspond to subclassing the `easyscience.base_classes.ObjBase` class. diff --git a/Examples/base/README.rst b/Examples/base/README.rst deleted file mode 100644 index 46da573a..00000000 --- a/Examples/base/README.rst +++ /dev/null @@ -1,6 +0,0 @@ -.. _base_examples: - -Subclassing Examples ------------------------- - -This section gathers examples which correspond to subclassing the :class:`easyscience.base_classes.ObjBase` class. diff --git a/Examples/base/plot_baseclass1.py b/Examples/base/plot_baseclass1.py index b87c559e..baa511ee 100644 --- a/Examples/base/plot_baseclass1.py +++ b/Examples/base/plot_baseclass1.py @@ -1,14 +1,14 @@ """ -Subclassing ObjBase - Simple Pendulum -===================================== -This example shows how to subclass :class:`easyscience.base_classes.ObjBase` with parameters from -:class:`EasyScience.variable.Parameter`. For this example a simple pendulum will be modeled. +# Subclassing ObjBase - Simple Pendulum -.. math:: +This example shows how to subclass `easyscience.base_classes.ObjBase` with parameters from +`EasyScience.variable.Parameter`. For this example a simple pendulum will be modeled. + +$$ y = A \sin (2 \pi f t + \phi ) +$$ -Imports -******* +## Imports Firstly the necessary imports. Notice that we import numpy from easyscience. This is not done for any reason other than saving time from multiple imports. @@ -21,8 +21,8 @@ from easyscience.variable import Parameter # %% -# Subclassing -# *********** +# ## Subclassing +# # To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your # rST and your code. This separates your example # into distinct text and code blocks. You can continue writing code below the @@ -53,8 +53,8 @@ def plot(self, time, axis=None, **kwargs): # %% -# Single Example -# ************** +# ## Single Example +# # To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your # rST and your code. This separates your example # into distinct text and code blocks. You can continue writing code below the @@ -82,8 +82,8 @@ def plot(self, time, axis=None, **kwargs): fig.show() # %% -# Multiple Examples -# ***************** +# ## Multiple Examples +# # To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your # rST and your code. This separates your example # into distinct text and code blocks. You can continue writing code below the diff --git a/Examples/fitting/README.rst b/Examples/fitting/README.md similarity index 66% rename from Examples/fitting/README.rst rename to Examples/fitting/README.md index 614960cb..ffea967e 100644 --- a/Examples/fitting/README.rst +++ b/Examples/fitting/README.md @@ -1,6 +1,3 @@ -.. _fitting_examples: - -Fitting Examples ----------------- +# Fitting Examples This section gathers examples which demonstrate fitting functionality using EasyScience's fitting capabilities. diff --git a/Examples/fitting/plot_fitting1.py b/Examples/fitting/plot_fitting1.py new file mode 100644 index 00000000..9e2afc5a --- /dev/null +++ b/Examples/fitting/plot_fitting1.py @@ -0,0 +1,80 @@ +""" +# Simple Fitting Example + +This example demonstrates a simple fitting procedure using `easyscience.fitting.Fitter`. +""" + +import numpy as np +import matplotlib.pyplot as plt + +from easyscience.fitting import Fitter +from easyscience.base_classes import ObjBase +from easyscience.variable import Parameter + +# %% +# ## Define the Model +# +# We define a simple linear model with parameters `m` (slope) and `c` (intercept). + + +class Line(ObjBase): + def __init__(self, m: Parameter, c: Parameter): + super().__init__('line', m=m, c=c) + + def __call__(self, x): + return self.c.value + self.m.value * x + + +# Initialize parameters +m = Parameter('m', 1) +c = Parameter('c', 1) +b = Line(m, c) + +# %% +# ## Define the Fitting Function +# +# The fitting function takes the independent variable `x` and returns the model prediction. + + +def fit_fun(x): + return b(x) + + +# %% +# ## Setup the Fitter +# +# Initialize the Fitter with the model object and the fitting function. + +f = Fitter(b, fit_fun) + +# %% +# ## Generate Data +# +# Create some synthetic data to fit. + +x = np.array([1, 2, 3]) +y = np.array([2, 4, 6]) - 1 +# x=1, y=1. x=2, y=3. x=3, y=5. +# Expected result: m=2, c=-1. + +# %% +# ## Perform Fit +# +# Run the fit. + +# We need to provide weights for the fit. Since we don't have experimental errors, we use equal weights. +weights = np.ones_like(x) +f_res = f.fit(x, y, weights=weights) + +print(f'Goodness of fit (chi2): {f_res.chi2}') +print(f'Reduced chi2: {f_res.reduced_chi}') +print(f'Fitted m: {b.m.value}') +print(f'Fitted c: {b.c.value}') + +# %% +# ## Plot Results + +plt.scatter(x, y, label='Data') +plt.plot(x, fit_fun(x), label='Fit', color='red') +plt.legend() +plt.show() diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 1a27587e..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = EasyScience -SOURCEDIR = ./src -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/assets/logo_light.svg b/docs/assets/logo_light.svg new file mode 100644 index 00000000..89b48f9f --- /dev/null +++ b/docs/assets/logo_light.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + Logo + + Main circle + + + Inner circles + + + + + + + + Text + + + + + \ No newline at end of file diff --git a/docs/base_examples/index.md b/docs/base_examples/index.md new file mode 100644 index 00000000..a5193a77 --- /dev/null +++ b/docs/base_examples/index.md @@ -0,0 +1,33 @@ +# Subclassing Examples + +This section gathers examples which correspond to subclassing the `easyscience.base_classes.ObjBase` class. + + + +
+ + Subclassing ObjBase - Simple Pendulum +

+ + + Subclassing ObjBase - Simple Pendulum + + + +

+ +
+ +
+ + + + + + +[:fontawesome-solid-download: Download all examples in Python source code: base_examples_python.zip](./base_examples_python.zip){ .md-button .center} + +[:fontawesome-solid-download: Download all examples in Jupyter notebooks: base_examples_jupyter.zip](./base_examples_jupyter.zip){ .md-button .center} + + +[Gallery generated by mkdocs-gallery](https://smarie.github.io/mkdocs-gallery){: .mkd-glr-signature } diff --git a/docs/base_examples/plot_baseclass1.ipynb b/docs/base_examples/plot_baseclass1.ipynb new file mode 100644 index 00000000..6fcc79aa --- /dev/null +++ b/docs/base_examples/plot_baseclass1.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Subclassing ObjBase - Simple Pendulum\n\nThis example shows how to subclass `easyscience.base_classes.ObjBase` with parameters from\n`EasyScience.variable.Parameter`. For this example a simple pendulum will be modeled.\n\n$$\n y = A \\sin (2 \\pi f t + \\phi )\n$$\n\n## Imports\n\nFirstly the necessary imports. Notice that we import numpy from easyscience. This is not done for any reason other than\nsaving time from multiple imports.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\nimport numpy as np\n\nfrom easyscience.base_classes import ObjBase\nfrom easyscience.variable import Parameter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subclassing\n\nTo include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your\nrST and your code. This separates your example\ninto distinct text and code blocks. You can continue writing code below the\nembedded rST text block:\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Pendulum(ObjBase):\n def __init__(self, A: Parameter, f: Parameter, p: Parameter):\n super(Pendulum, self).__init__('SimplePendulum', A=A, f=f, p=p)\n\n @classmethod\n def from_pars(cls, A: float = 1, f: float = 1, p: float = 0):\n A = Parameter('Amplitude', A)\n f = Parameter('Frequency', f)\n p = Parameter('Phase', p)\n return cls(A, f, p)\n\n def __call__(self, t):\n return self.A.value * np.sin(2 * np.pi * self.f.value * t + self.p.value)\n\n def plot(self, time, axis=None, **kwargs):\n if axis is None:\n axis = plt\n else:\n axis.set_title(f'A={self.A.value}, F={self.f.value}, P={self.p.value}')\n p = axis.plot(time, self(time), **kwargs)\n return p" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Single Example\n\nTo include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your\nrST and your code. This separates your example\ninto distinct text and code blocks. You can continue writing code below the\nembedded rST text block:\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "p1 = Pendulum.from_pars()\n# Another pendulum with Amplitude = 5\np2 = Pendulum.from_pars(A=5)\n# Another pendulum with Frequency = 4\np3 = Pendulum.from_pars(A=5, f=4)\n# Another pendulum with Phase = pi/2\np4 = Pendulum.from_pars(A=5, f=4, p=np.pi / 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.linspace(0, 3, 601)\nfig = plt.figure()\ngs = fig.add_gridspec(2, 2)\n(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row')\np1.plot(t, axis=ax1)\np2.plot(t, axis=ax2)\np3.plot(t, axis=ax3)\np4.plot(t, axis=ax4)\nfig.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple Examples\n\nTo include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your\nrST and your code. This separates your example\ninto distinct text and code blocks. You can continue writing code below the\nembedded rST text block:\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pendulum_array = [Pendulum.from_pars(p=phase) for phase in np.linspace(0, 1, 3)]\nfig = plt.figure()\nfor pendulum in pendulum_array:\n pendulum.plot(t, label=f'Phase = {pendulum.p}')\nplt.legend(loc='lower right')\nfig.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.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/base_examples/plot_baseclass1.py b/docs/base_examples/plot_baseclass1.py new file mode 100644 index 00000000..baa511ee --- /dev/null +++ b/docs/base_examples/plot_baseclass1.py @@ -0,0 +1,97 @@ +""" +# Subclassing ObjBase - Simple Pendulum + +This example shows how to subclass `easyscience.base_classes.ObjBase` with parameters from +`EasyScience.variable.Parameter`. For this example a simple pendulum will be modeled. + +$$ + y = A \sin (2 \pi f t + \phi ) +$$ + +## Imports + +Firstly the necessary imports. Notice that we import numpy from easyscience. This is not done for any reason other than +saving time from multiple imports. +""" + +import matplotlib.pyplot as plt +import numpy as np + +from easyscience.base_classes import ObjBase +from easyscience.variable import Parameter + +# %% +# ## Subclassing +# +# To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your +# rST and your code. This separates your example +# into distinct text and code blocks. You can continue writing code below the +# embedded rST text block: + + +class Pendulum(ObjBase): + def __init__(self, A: Parameter, f: Parameter, p: Parameter): + super(Pendulum, self).__init__('SimplePendulum', A=A, f=f, p=p) + + @classmethod + def from_pars(cls, A: float = 1, f: float = 1, p: float = 0): + A = Parameter('Amplitude', A) + f = Parameter('Frequency', f) + p = Parameter('Phase', p) + return cls(A, f, p) + + def __call__(self, t): + return self.A.value * np.sin(2 * np.pi * self.f.value * t + self.p.value) + + def plot(self, time, axis=None, **kwargs): + if axis is None: + axis = plt + else: + axis.set_title(f'A={self.A.value}, F={self.f.value}, P={self.p.value}') + p = axis.plot(time, self(time), **kwargs) + return p + + +# %% +# ## Single Example +# +# To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your +# rST and your code. This separates your example +# into distinct text and code blocks. You can continue writing code below the +# embedded rST text block: + +p1 = Pendulum.from_pars() +# Another pendulum with Amplitude = 5 +p2 = Pendulum.from_pars(A=5) +# Another pendulum with Frequency = 4 +p3 = Pendulum.from_pars(A=5, f=4) +# Another pendulum with Phase = pi/2 +p4 = Pendulum.from_pars(A=5, f=4, p=np.pi / 2) + +# %% +# Plotting + +t = np.linspace(0, 3, 601) +fig = plt.figure() +gs = fig.add_gridspec(2, 2) +(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row') +p1.plot(t, axis=ax1) +p2.plot(t, axis=ax2) +p3.plot(t, axis=ax3) +p4.plot(t, axis=ax4) +fig.show() + +# %% +# ## Multiple Examples +# +# To include embedded rST, use a line of >= 20 ``#``'s or ``#%%`` between your +# rST and your code. This separates your example +# into distinct text and code blocks. You can continue writing code below the +# embedded rST text block: + +pendulum_array = [Pendulum.from_pars(p=phase) for phase in np.linspace(0, 1, 3)] +fig = plt.figure() +for pendulum in pendulum_array: + pendulum.plot(t, label=f'Phase = {pendulum.p}') +plt.legend(loc='lower right') +fig.show() diff --git a/docs/base_examples/plot_baseclass1.py.md5 b/docs/base_examples/plot_baseclass1.py.md5 new file mode 100644 index 00000000..c87ff877 --- /dev/null +++ b/docs/base_examples/plot_baseclass1.py.md5 @@ -0,0 +1 @@ +f60c2a45eebfeb6af46a1231415c19e0 \ No newline at end of file diff --git a/docs/fitting/introduction.md b/docs/fitting/introduction.md new file mode 100644 index 00000000..a8bc0ea0 --- /dev/null +++ b/docs/fitting/introduction.md @@ -0,0 +1,339 @@ +# Fitting in EasyScience + +EasyScience provides a flexible and powerful fitting framework that supports multiple optimization backends. +This guide covers both basic usage for users wanting to fit their data, and advanced patterns for developers building scientific components. + +## Overview + +The EasyScience fitting system consists of: + +* **Parameters**: Scientific values with units, bounds, and fitting capabilities +* **Models**: Objects containing parameters, inheriting from `ObjBase` +* **Fitter**: The main fitting engine supporting multiple minimizers +* **Minimizers**: Backend optimization engines (LMFit, Bumps, DFO-LS) + +## Quick Start + +### Basic Parameter and Model Setup + +```python +import numpy as np +from easyscience import ObjBase, Parameter, Fitter + +# Create a simple model with fittable parameters +class SineModel(ObjBase): + def __init__(self, amplitude_val=1.0, frequency_val=1.0, phase_val=0.0): + amplitude = Parameter("amplitude", amplitude_val, min=0, max=10) + frequency = Parameter("frequency", frequency_val, min=0.1, max=5) + phase = Parameter("phase", phase_val, min=-np.pi, max=np.pi) + super().__init__("sine_model", amplitude=amplitude, frequency=frequency, phase=phase) + + def __call__(self, x): + return self.amplitude.value * np.sin(2 * np.pi * self.frequency.value * x + self.phase.value) +``` + +### Basic Fitting Example + +```python +# Create test data +x_data = np.linspace(0, 2, 100) +true_model = SineModel(amplitude_val=2.5, frequency_val=1.5, phase_val=0.5) +y_data = true_model(x_data) + 0.1 * np.random.normal(size=len(x_data)) + +# Create model to fit with initial guesses +fit_model = SineModel(amplitude_val=1.0, frequency_val=1.0, phase_val=0.0) + +# Set which parameters to fit (unfix them) +fit_model.amplitude.fixed = False +fit_model.frequency.fixed = False +fit_model.phase.fixed = False + +# Create fitter and perform fit +fitter = Fitter(fit_model, fit_model) +result = fitter.fit(x=x_data, y=y_data) + +# Access results +print(f"Chi-squared: {result.chi2}") +print(f"Fitted amplitude: {fit_model.amplitude.value} ± {fit_model.amplitude.error}") +print(f"Fitted frequency: {fit_model.frequency.value} ± {fit_model.frequency.error}") +``` + +## Available Minimizers + +EasyScience supports multiple optimization backends: + +```python +from easyscience import AvailableMinimizers + +# View all available minimizers +fitter = Fitter(model, model) +print(fitter.available_minimizers) +# Output: ['LMFit', 'LMFit_leastsq', 'LMFit_powell', 'Bumps', 'Bumps_simplex', 'DFO', 'DFO_leastsq'] +``` + +### Switching Minimizers + +```python +# Use LMFit (default) +fitter.switch_minimizer(AvailableMinimizers.LMFit) +result1 = fitter.fit(x=x_data, y=y_data) + +# Switch to Bumps +fitter.switch_minimizer(AvailableMinimizers.Bumps) +result2 = fitter.fit(x=x_data, y=y_data) + +# Use DFO for derivative-free optimization +fitter.switch_minimizer(AvailableMinimizers.DFO) +result3 = fitter.fit(x=x_data, y=y_data) +``` + +## Parameter Management + +### Setting Bounds and Constraints + +```python +# Parameter with bounds +param = Parameter(name="amplitude", value=1.0, min=0.0, max=10.0, unit="m") + +# Fix parameter (exclude from fitting) +param.fixed = True + +# Unfix parameter (include in fitting) +param.fixed = False + +# Change bounds dynamically +param.min = 0.5 +param.max = 8.0 +``` + +### Parameter Dependencies + +Parameters can depend on other parameters through expressions: + +```python +# Create independent parameters +length = Parameter("length", 10.0, unit="m", min=1, max=100) +width = Parameter("width", 5.0, unit="m", min=1, max=50) + +# Create dependent parameter +area = Parameter.from_dependency( + name="area", + dependency_expression="length * width", + dependency_map={"length": length, "width": width} +) + +# When length or width changes, area updates automatically +length.value = 15.0 +print(area.value) # Will be 75.0 (15 * 5) +``` + +### Using make_dependent_on() Method + +You can also make an existing parameter dependent on other parameters using the `make_dependent_on()` method. This is useful when you want to convert an independent parameter into a dependent one: + +```python +# Create independent parameters +radius = Parameter("radius", 5.0, unit="m", min=1, max=20) +height = Parameter("height", 10.0, unit="m", min=1, max=50) +volume = Parameter("volume", 100.0, unit="m³") # Initially independent +pi = Parameter("pi", 3.14159, fixed=True) # Constant parameter + +# Make volume dependent on radius and height +volume.make_dependent_on( + dependency_expression="pi * radius**2 * height", + dependency_map={"radius": radius, "height": height, "pi": pi} +) + +# Now volume automatically updates when radius or height changes +radius.value = 8.0 +print(f"New volume: {volume.value:.2f} m³") # Automatically calculated + +# The parameter becomes dependent and cannot be set directly +try: + volume.value = 200.0 # This will raise an AttributeError +except AttributeError: + print("Cannot set value of dependent parameter directly") +``` + +**What to expect:** + +- The parameter becomes **dependent** and its `independent` property becomes `False` +- You **cannot directly set** the value, bounds, or variance of a dependent parameter +- The parameter's value is **automatically recalculated** whenever any of its dependencies change +- Dependent parameters **cannot be fitted** (they are automatically fixed) +- The original value, unit, variance, min, and max are **overwritten** by the dependency calculation +- You can **revert to independence** using the `make_independent()` method if needed + +## Advanced Fitting Options + +### Setting Tolerances and Limits + +```python +fitter = Fitter(model, model) + +# Set convergence tolerance +fitter.tolerance = 1e-8 + +# Limit maximum function evaluations +fitter.max_evaluations = 1000 + +# Perform fit with custom settings +result = fitter.fit(x=x_data, y=y_data) +``` + +### Using Weights + +```python +# Define weights (inverse variance) +weights = 1.0 / errors**2 # where errors are your data uncertainties + +# Fit with weights +result = fitter.fit(x=x_data, y=y_data, weights=weights) +``` + +### Multidimensional Fitting + +```python +class AbsSin2D(ObjBase): + def __init__(self, offset_val=0.0, phase_val=0.0): + offset = Parameter("offset", offset_val) + phase = Parameter("phase", phase_val) + super().__init__("sin2D", offset=offset, phase=phase) + + def __call__(self, x): + X, Y = x[:, 0], x[:, 1] # x is 2D array + return np.abs(np.sin(self.phase.value * X + self.offset.value)) * \ + np.abs(np.sin(self.phase.value * Y + self.offset.value)) + +# Create 2D data +x_2d = np.column_stack([x_grid.ravel(), y_grid.ravel()]) + +# Fit 2D model +model_2d = AbsSin2D(offset_val=0.1, phase_val=1.0) +model_2d.offset.fixed = False +model_2d.phase.fixed = False + +fitter = Fitter(model_2d, model_2d) +result = fitter.fit(x=x_2d, y=z_data.ravel()) +``` + +## Accessing Fit Results + +The `FitResults` object contains comprehensive information about the fit: + +```python +result = fitter.fit(x=x_data, y=y_data) + +# Fit statistics +print(f"Chi-squared: {result.chi2}") +print(f"Reduced chi-squared: {result.reduced_chi}") +print(f"Number of parameters: {result.n_pars}") +print(f"Success: {result.success}") + +# Parameter values and uncertainties +for param_name, value in result.p.items(): + error = result.errors.get(param_name, 0.0) + print(f"{param_name}: {value} ± {error}") + +# Calculated values and residuals +y_calculated = result.y_calc +residuals = result.residual + +# Plot results +import matplotlib.pyplot as plt +plt.figure(figsize=(10, 4)) +plt.subplot(121) +plt.plot(x_data, y_data, 'o', label='Data') +plt.plot(x_data, y_calculated, '-', label='Fit') +plt.legend() +plt.subplot(122) +plt.plot(x_data, residuals, 'o') +plt.axhline(0, color='k', linestyle='--') +plt.ylabel('Residuals') +``` + +## Developer Guidelines + +### Creating Custom Models + +For developers building scientific components: + +```python +from easyscience import ObjBase, Parameter + +class CustomModel(ObjBase): + def __init__(self, param1_val=1.0, param2_val=0.0): + # Always create Parameters with appropriate bounds and units + param1 = Parameter("param1", param1_val, min=-10, max=10, unit="m/s") + param2 = Parameter("param2", param2_val, min=0, max=1, fixed=True) + + # Call parent constructor with named parameters + super().__init__("custom_model", param1=param1, param2=param2) + + def __call__(self, x): + # Implement your model calculation + return self.param1.value * x + self.param2.value + + def get_fit_parameters(self): + # This is automatically implemented by ObjBase + # Returns only non-fixed parameters + return super().get_fit_parameters() +``` + +### Best Practices + +1. **Always set appropriate bounds** on parameters to constrain the search space +2. **Use meaningful units** for physical parameters +3. **Fix parameters** that shouldn't be optimized +4. **Test with different minimizers** for robustness +5. **Validate results** by checking chi-squared and residuals + +### Error Handling + +```python +from easyscience.fitting.minimizers import FitError + +try: + result = fitter.fit(x=x_data, y=y_data) + if not result.success: + print(f"Fit failed: {result.message}") +except FitError as e: + print(f"Fitting error: {e}") +except Exception as e: + print(f"Unexpected error: {e}") +``` + +### Testing Patterns + +When writing tests for fitting code: + +```python +import pytest +from easyscience import global_object + +@pytest.fixture +def clear_global_map(): + """Clear global map before each test""" + global_object.map._clear() + yield + global_object.map._clear() + +def test_model_fitting(clear_global_map): + # Create model and test fitting + model = CustomModel() + model.param1.fixed = False + + # Generate test data + x_test = np.linspace(0, 10, 50) + y_test = 2.5 * x_test + 0.1 * np.random.normal(size=len(x_test)) + + # Fit and verify + fitter = Fitter(model, model) + result = fitter.fit(x=x_test, y=y_test) + + assert result.success + assert model.param1.value == pytest.approx(2.5, abs=0.1) +``` + +This comprehensive guide covers the essential aspects of fitting in EasyScience, from basic usage to advanced developer patterns. +The examples are drawn from the actual test suite and demonstrate real-world usage patterns. diff --git a/docs/fitting_examples/index.md b/docs/fitting_examples/index.md new file mode 100644 index 00000000..facfb25c --- /dev/null +++ b/docs/fitting_examples/index.md @@ -0,0 +1,33 @@ +# Fitting Examples + +This section gathers examples which demonstrate fitting functionality using EasyScience's fitting capabilities. + + + +
+ + Simple Fitting Example +

+ + + Simple Fitting Example + + + +

+ +
+ +
+ + + + + + +[:fontawesome-solid-download: Download all examples in Python source code: fitting_examples_python.zip](./fitting_examples_python.zip){ .md-button .center} + +[:fontawesome-solid-download: Download all examples in Jupyter notebooks: fitting_examples_jupyter.zip](./fitting_examples_jupyter.zip){ .md-button .center} + + +[Gallery generated by mkdocs-gallery](https://smarie.github.io/mkdocs-gallery){: .mkd-glr-signature } diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md new file mode 100644 index 00000000..45449e6c --- /dev/null +++ b/docs/getting-started/installation.md @@ -0,0 +1,26 @@ +# Installation + +**EasyScience** requires Python 3.11 or above. + +## Install via `pip` + +The easiest way of obtaining EasyScience and using it in your project is via pip. You can install directly by using: + +```console +$ pip install EasyScience +``` + +## Install as an EasyScience developer + +You can obtain the latest development source from our [Github repository](https://github.com/easyscience/corelib): + +```console +$ git clone https://github.com/easyscience/corelib +$ cd corelib +``` + +And install via pip: + +```console +$ pip install -e . +``` diff --git a/docs/getting-started/overview.md b/docs/getting-started/overview.md new file mode 100644 index 00000000..3bab96d3 --- /dev/null +++ b/docs/getting-started/overview.md @@ -0,0 +1,204 @@ +# Overview + +EasyScience is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. +It implements a descriptor-based object system with global state management, making it easy to create scientific models with parameters +that have units, bounds, and dependencies. + +## What is EasyScience? + +EasyScience serves as the core foundation for the EasyScience family of projects, offering: + +* **Scientific Parameters**: Values with units, uncertainties, bounds, and fitting capabilities +* **Model Building**: Base classes for creating complex scientific models +* **Multi-backend Fitting**: Support for LMFit, Bumps, and DFO-LS optimization engines +* **Parameter Dependencies**: Express relationships between parameters through mathematical expressions +* **Serialization**: Save and load complete model states including parameter relationships +* **Undo/Redo System**: Track and revert changes to model parameters +* **Global State Management**: Unified tracking of all objects and their relationships + +## Key Concepts + +### Descriptor-Based Architecture + +EasyScience uses a hierarchical descriptor system: + +```python +from easyscience import Parameter, ObjBase + +# Scientific parameter with units and bounds +temperature = Parameter( + name="temperature", + value=300.0, + unit="K", + min=0, + max=1000, + description="Sample temperature" +) + +# Model containing parameters +class ThermalModel(ObjBase): + def __init__(self, temp_val=300.0, coeff_val=1.0): + temperature = Parameter("temperature", temp_val, unit="K", min=0, max=1000) + coefficient = Parameter("coefficient", coeff_val, min=0, max=10) + super().__init__("thermal_model", temperature=temperature, coefficient=coefficient) +``` + +The hierarchy flows from: + +* `DescriptorBase` → `DescriptorNumber` → `Parameter` (fittable scientific values) +* `BasedBase` → `ObjBase` (containers for parameters and scientific models) +* `CollectionBase` (mutable sequences of scientific objects) + +### Units and Physical Quantities + +EasyScience integrates with [scipp](https://scipp.github.io/) for robust unit handling: + +```python +# Parameters automatically handle units +length = Parameter("length", 100, unit="cm", min=0, max=1000) + +# Unit conversions are automatic +length.convert_unit("m") +print(length.value) # 1.0 +print(length.unit) # m + +# Arithmetic operations preserve units +area = length * length # Results in m^2 +``` + +### Parameter Dependencies + +Parameters can depend on other parameters through mathematical expressions: + +```python +# Independent parameters +radius = Parameter("radius", 5.0, unit="m", min=0, max=100) +height = Parameter("height", 10.0, unit="m", min=0, max=200) + +# Dependent parameter using mathematical expression +volume = Parameter.from_dependency( + name="volume", + dependency_expression="3.14159 * radius**2 * height", + dependency_map={"radius": radius, "height": height} +) + +# Automatic updates +radius.value = 10.0 +print(volume.value) # Automatically recalculated +``` + +### Global State Management + +All EasyScience objects register with a global map for dependency tracking: + +```python +from easyscience import global_object + +# All objects are automatically tracked +param = Parameter("test", 1.0) +print(param.unique_name) # Automatically generated unique identifier + +# Access global registry +all_objects = global_object.map.vertices() + +# Clear for testing (important in unit tests) +global_object.map._clear() +``` + +### Fitting and Optimization + +EasyScience provides a unified interface to multiple optimization backends: + +```python +from easyscience import Fitter, AvailableMinimizers + +# Create fitter with model +fitter = Fitter(model, model) # model serves as both object and function + +# Switch between different optimizers +fitter.switch_minimizer(AvailableMinimizers.LMFit) # Levenberg-Marquardt +fitter.switch_minimizer(AvailableMinimizers.Bumps) # Bayesian inference +fitter.switch_minimizer(AvailableMinimizers.DFO) # Derivative-free + +# Perform fit +result = fitter.fit(x=x_data, y=y_data, weights=weights) +``` + +### Serialization and Persistence + +Complete model states can be saved and restored: + +```python +# Save model to dictionary +model_dict = model.as_dict() + +# Save to JSON +import json +with open('model.json', 'w') as f: + json.dump(model_dict, f, indent=2, default=str) + +# Restore model +with open('model.json', 'r') as f: + loaded_dict = json.load(f) + +new_model = Model.from_dict(loaded_dict) + +# Resolve parameter dependencies after loading +from easyscience.variable.parameter_dependency_resolver import resolve_all_parameter_dependencies +resolve_all_parameter_dependencies(new_model) +``` + +## Use Cases + +EasyScience is designed for: + +### Scientific Modeling + +* Creating physics-based models with parameters that have physical meaning +* Handling units consistently throughout calculations +* Managing complex parameter relationships and constraints + +### Data Fitting and Analysis + +* Fitting experimental data to theoretical models +* Comparing different optimization algorithms +* Uncertainty quantification and error propagation + +### Software Development + +* Building domain-specific scientific applications +* Creating reusable model components +* Implementing complex scientific workflows + +### Research and Education + +* Reproducible scientific computing +* Teaching scientific programming concepts +* Collaborative model development + +## Architecture Benefits + +**Type Safety**: Strong typing with unit checking prevents common errors + +**Flexibility**: Multiple optimization backends allow algorithm comparison + +**Extensibility**: Descriptor pattern makes it easy to add new parameter types + +**Reproducibility**: Complete serialization enables exact state restoration + +**Performance**: Efficient observer pattern minimizes unnecessary recalculations + +**Testing**: Global state management with cleanup utilities supports robust testing + +## Getting Started + +The best way to learn EasyScience is through examples: + +1. **Basic Usage**: Start with simple parameters and models +2. **Fitting Tutorial**: Learn the fitting system with real data +3. **Advanced Features**: Explore parameter dependencies and serialization +4. **Development Guide**: Build your own scientific components + +See the [installation](installation.md) guide to get started, then explore the [fitting introduction](../fitting/introduction.md) for practical examples. + +EasyScience forms the foundation for more specialized packages in the EasyScience ecosystem, providing the core abstractions that make scientific computing more accessible and reliable. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..63c6dd04 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,125 @@ +# Welcome to EasyScience's documentation! + +**EasyScience** is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. +It implements a descriptor-based object system with global state management, making it easier to create scientific models with parameters +that have units, bounds, and dependencies. + +```python +from easyscience import Parameter, ObjBase, Fitter + +# Create a model with scientific parameters +class SineModel(ObjBase): + def __init__(self, amplitude=1.0, frequency=1.0, phase=0.0): + amp = Parameter("amplitude", amplitude, min=0, max=10, unit="V") + freq = Parameter("frequency", frequency, min=0.1, max=5, unit="Hz") + phase = Parameter("phase", phase, min=-3.14, max=3.14, unit="rad") + super().__init__("sine_model", amplitude=amp, frequency=freq, phase=phase) + + def __call__(self, x): + return self.amplitude.value * np.sin(2*np.pi*self.frequency.value*x + self.phase.value) + +# Fit to experimental data +model = SineModel() +model.amplitude.fixed = False # Allow fitting +fitter = Fitter(model, model) +result = fitter.fit(x=x_data, y=y_data) +``` + +## Key Features + +**Scientific Parameters with Units** +: Parameters automatically handle physical units, bounds, and uncertainties using [scipp](https://scipp.github.io/) integration. + +**Parameter Dependencies** +: Express mathematical relationships between parameters that update automatically when dependencies change. + +**Multi-Backend Fitting** +: Unified interface to LMFit, Bumps, and DFO-LS optimization engines with easy algorithm comparison. + +**Complete Serialization** +: Save and restore entire model states including parameter relationships and dependencies. + +**Global State Management** +: Automatic tracking of all objects and their relationships with built-in undo/redo capabilities. + +**Developer-Friendly** +: Clean APIs, comprehensive testing utilities, and extensive documentation for building scientific applications. + +## Why EasyScience? + +**Type Safety & Units** +: Prevent common scientific computing errors with automatic unit checking and strong typing. + +**Reproducible Research** +: Complete state serialization ensures exact reproducibility of scientific analyses. + +**Algorithm Flexibility** +: Compare different optimization approaches without changing your model code. + +**Extensible Architecture** +: Descriptor pattern makes it easy to create new parameter types and model components. + +## Open Source & Cross-Platform + +EasyScience is free and open-source software with the source code openly shared on [GitHub repository](https://github.com/easyScience/EasyScience). + +* **Cross-platform** - Written in Python and available for Windows, macOS, and Linux +* **Well-tested** - Comprehensive test suite ensuring reliability across platforms +* **Community-driven** - Open to contributions and feature requests +* **Production-ready** - Used in multiple scientific applications worldwide + +## Projects Built with EasyScience + +EasyScience serves as the foundation for several scientific applications: + +**easyDiffraction** + +easyDiffraction + +Scientific software for modeling and analysis of neutron diffraction data, providing an intuitive interface for crystallographic refinement. + +[Visit easyDiffraction](https://easydiffraction.org) + +**easyReflectometry** + +easyReflectometry + +Scientific software for modeling and analysis of neutron reflectometry data, enabling detailed study of thin film structures. + +[Visit easyReflectometry](https://easyreflectometry.org) + + +EasyScience's flexible architecture makes it ideal for building domain-specific scientific applications. The comprehensive API and documentation help you get started quickly. + +## Quick Start + +Ready to begin? Here's how to get started: + +1. **Install EasyScience**: `pip install easyscience` +2. **Read the Overview**: Understand the core concepts and architecture +3. **Try the Examples**: Work through practical fitting examples +4. **Explore the API**: Dive into the comprehensive reference documentation + +```bash +pip install easyscience +``` + +Then explore the tutorials and examples to learn the key concepts! + +## Need Help? + +* **GitHub Issues**: Report bugs or request features on [GitHub Issues](https://github.com/easyScience/EasyScience/issues) +* **Discussions**: Ask questions in [GitHub Discussions](https://github.com/easyScience/EasyScience/discussions) +* **API Reference**: Complete documentation of all classes and methods +* **Examples**: Practical tutorials and code samples + +## Contributing + +EasyScience is developed openly and welcomes contributions! Whether you're fixing bugs, adding features, improving documentation, or sharing usage examples, your contributions help make scientific computing more accessible. + +Visit our [GitHub repository](https://github.com/easyScience/EasyScience) to: + +* Report issues or suggest features +* Submit pull requests +* Join discussions about development +* Help improve documentation diff --git a/docs/javascripts/mathjax.js b/docs/javascripts/mathjax.js new file mode 100644 index 00000000..80e81ba5 --- /dev/null +++ b/docs/javascripts/mathjax.js @@ -0,0 +1,12 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 135acda3..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=./src -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docs/reference/base.md b/docs/reference/base.md new file mode 100644 index 00000000..dd044fe3 --- /dev/null +++ b/docs/reference/base.md @@ -0,0 +1,245 @@ +# API Reference + +This reference provides detailed documentation for all EasyScience classes and functions. + +## Core Variables and Descriptors + +### Descriptor Base Classes + +::: easyscience.variable.DescriptorBase + options: + members: true + +::: easyscience.variable.DescriptorNumber + options: + members: true + +::: easyscience.variable.DescriptorArray + options: + members: true + +::: easyscience.variable.DescriptorStr + options: + members: true + +::: easyscience.variable.DescriptorBool + options: + members: true + +::: easyscience.variable.DescriptorAnyType + options: + members: true + +### Parameters + +::: easyscience.variable.Parameter + options: + members: true + +The Parameter class extends DescriptorNumber with fitting capabilities, bounds, and dependency relationships. + +## Base Classes for Models + +### BasedBase + +::: easyscience.base_classes.BasedBase + options: + members: true + +Base class providing serialization, global object registration, and interface management. + +### ObjBase + +::: easyscience.base_classes.ObjBase + options: + members: true + +Container class for creating scientific models with parameters. All user-defined models should inherit from this class. + +### Collections + +::: easyscience.base_classes.CollectionBase + options: + members: true + +Mutable sequence container for scientific objects with automatic parameter tracking. + +## Fitting and Optimization + +### Fitter + +::: easyscience.fitting.Fitter + options: + members: true + +Main fitting engine supporting multiple optimization backends. + +### Available Minimizers + +::: easyscience.fitting.AvailableMinimizers + options: + members: true + +Enumeration of available optimization backends. + +### Fit Results + +::: easyscience.fitting.FitResults + options: + members: true + +Container for fitting results including parameters, statistics, and diagnostics. + +### Minimizer Base Classes + +::: easyscience.fitting.minimizers.MinimizerBase + options: + members: true + +Abstract base class for all minimizer implementations. + +::: easyscience.fitting.minimizers.LMFit + options: + members: true + +LMFit-based minimizer implementation. + +::: easyscience.fitting.minimizers.Bumps + options: + members: true + +Bumps-based minimizer implementation. + +::: easyscience.fitting.minimizers.DFO + options: + members: true + +DFO-LS-based minimizer implementation. + +## Global State Management + +### Global Object + +::: easyscience.global_object.GlobalObject + options: + members: true + +Singleton managing global state, logging, and object tracking. + +### Object Map + +::: easyscience.global_object.Map + options: + members: true + +Graph-based registry for tracking object relationships and dependencies. + +### Undo/Redo System + +::: easyscience.global_object.undo_redo.UndoStack + options: + members: true + +Stack-based undo/redo system for parameter changes. + +## Serialization and I/O + +### Serializer Components + +::: easyscience.io.SerializerComponent + options: + members: true + +Base class providing serialization capabilities. + +::: easyscience.io.SerializerDict + options: + members: true + +Dictionary-based serialization implementation. + +::: easyscience.io.SerializerBase + options: + members: true + +Base serialization functionality. + +## Models and Examples + +### Polynomial Model + +::: easyscience.models.Polynomial + options: + members: true + +Built-in polynomial model for demonstration and testing. + +## Job Management + +### Analysis and Experiments + +::: easyscience.job.AnalysisBase + options: + members: true + +::: easyscience.job.ExperimentBase + options: + members: true + +::: easyscience.job.JobBase + options: + members: true + +::: easyscience.job.TheoreticalModelBase + options: + members: true + +## Utility Functions + +### Decorators + +::: easyscience.global_object.undo_redo.property_stack + +Decorator for properties that should be tracked in the undo/redo system. + +### Class Tools + +::: easyscience.utils.classTools.addLoggedProp + +Utility for adding logged properties to classes. + +### String Utilities + +::: easyscience.utils.string + options: + members: true + +### Parameter Dependencies + +::: easyscience.variable.parameter_dependency_resolver.resolve_all_parameter_dependencies + +Resolve all pending parameter dependencies after deserialization. + +::: easyscience.variable.parameter_dependency_resolver.get_parameters_with_pending_dependencies + +Find parameters that have unresolved dependencies. + +## Constants and Enumerations + +The `easyscience.global_object` is a global singleton instance managing application state. + +## Exception Classes + +::: easyscience.fitting.minimizers.FitError + +Exception raised when fitting operations fail. + +## Usage Examples + +For practical usage examples and tutorials, see: + +* [Overview](../getting-started/overview.md) - Introduction and key concepts +* [Fitting Introduction](../fitting/introduction.md) - Comprehensive fitting guide +* [Installation](../getting-started/installation.md) - Installation instructions + +The API reference covers all public classes and methods. For implementation details and advanced usage patterns, refer to the source code and test suites in the repository. diff --git a/docs/src/_static/ec_logo_single.png b/docs/src/_static/ec_logo_single.png deleted file mode 100644 index 77c1f9a4..00000000 Binary files a/docs/src/_static/ec_logo_single.png and /dev/null differ diff --git a/docs/src/_static/ec_sidebar.png b/docs/src/_static/ec_sidebar.png deleted file mode 100644 index a8bb6c7b..00000000 Binary files a/docs/src/_static/ec_sidebar.png and /dev/null differ diff --git a/docs/src/_static/ec_sidebar_w.png b/docs/src/_static/ec_sidebar_w.png deleted file mode 100644 index d1f407a3..00000000 Binary files a/docs/src/_static/ec_sidebar_w.png and /dev/null differ diff --git a/docs/src/_static/favicon.ico b/docs/src/_static/favicon.ico deleted file mode 100644 index 9281805b..00000000 Binary files a/docs/src/_static/favicon.ico and /dev/null differ diff --git a/docs/src/conf.py b/docs/src/conf.py deleted file mode 100644 index f8445631..00000000 --- a/docs/src/conf.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/env python - -# SPDX-FileCopyrightText: 2021 EasyScience contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021 Contributors to the EasyScience project - -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -# import toml -from pathlib import Path -import easyscience -# sys.path.insert(0, os.path.abspath('.')) -main_root = Path(__file__).parents[2] -sys.path.append(str(main_root)) - -import datetime - -# project_info = toml.load(os.path.join(main_root, 'pyproject.toml')) - -# -- Project information ----------------------------------------------------- - -project = 'EasyScience' -copyright = f"{datetime.date.today().year}, EasyScience Contributors" -author = "EasyScience Contributors" -# copyright = f"2021, {project_info['tool']['poetry']['authors'][0]}" -# author = project_info['tool']['poetry']['authors'][0] - -# # The short X.Y version -# version = '' -# # The full version, including alpha/beta/rc tags -# release = project_info['tool']['poetry']['version'] -# The short X.Y version. -#version = project_info['project']['version'] -# The full version, including alpha/beta/rc tags. -#version = project_info['project']['version'] -version = easyscience.__version__ - - -intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), - 'numpy': ('https://numpy.org/doc/stable/', None) -} - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.githubpages', - 'sphinx.ext.napoleon', - 'sphinx.ext.autodoc', - 'sphinx_autodoc_typehints', - 'sphinx.ext.viewcode', - 'sphinx.ext.mathjax', - 'sphinx.ext.intersphinx', - 'sphinx_gallery.gen_gallery', -] -autoclass_content = 'init' - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' -highlight_language = 'python3' - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_book_theme' -html_logo = os.path.join('_static', 'ec_sidebar_w.png') -html_favicon = os.path.join('_static', 'favicon.ico') -html_theme_options = {} -# html_theme_options = { -# 'logo': os.path.join('ec_logo_single.png'), -# 'github_user': project_info['tool']['github']['info']['organization'], -# 'github_repo': project_info['tool']['github']['info']['repo'], -# } - - - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'easySciencedoc' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'EasyScience.tex', 'EasyScience Documentation', - 'Simon Ward', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'EasyScience', 'EasyScience Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'EasyScience', 'EasyScience Documentation', - author, 'EasyScience', 'One line description of project.', - 'Miscellaneous'), -] - - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] - - -sphinx_gallery_conf = { - 'examples_dirs': [os.path.join(main_root, 'Examples', 'base'), - os.path.join(main_root, 'Examples', 'fitting')], # path to your example scripts - 'gallery_dirs': ['base_examples', 'fitting_examples'], # path to where to save gallery generated output - 'backreferences_dir': 'gen_modules/backreferences', # directory where function/class granular galleries are stored - # Modules for which function/class level galleries are created. In - # this case sphinx_gallery and numpy in a tuple of strings. - 'doc_module': ('sphinx_gallery', 'numpy', 'EasyScience'), -} \ No newline at end of file diff --git a/docs/src/fitting/introduction.rst b/docs/src/fitting/introduction.rst deleted file mode 100644 index 0a694090..00000000 --- a/docs/src/fitting/introduction.rst +++ /dev/null @@ -1,362 +0,0 @@ -====================== -Fitting in EasyScience -====================== - -EasyScience provides a flexible and powerful fitting framework that supports multiple optimization backends. -This guide covers both basic usage for users wanting to fit their data, and advanced patterns for developers building scientific components. - -Overview --------- - -The EasyScience fitting system consists of: - -* **Parameters**: Scientific values with units, bounds, and fitting capabilities -* **Models**: Objects containing parameters, inheriting from ``ObjBase`` -* **Fitter**: The main fitting engine supporting multiple minimizers -* **Minimizers**: Backend optimization engines (LMFit, Bumps, DFO-LS) - -Quick Start ------------ - -Basic Parameter and Model Setup -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - import numpy as np - from easyscience import ObjBase, Parameter, Fitter - - # Create a simple model with fittable parameters - class SineModel(ObjBase): - def __init__(self, amplitude_val=1.0, frequency_val=1.0, phase_val=0.0): - amplitude = Parameter("amplitude", amplitude_val, min=0, max=10) - frequency = Parameter("frequency", frequency_val, min=0.1, max=5) - phase = Parameter("phase", phase_val, min=-np.pi, max=np.pi) - super().__init__("sine_model", amplitude=amplitude, frequency=frequency, phase=phase) - - def __call__(self, x): - return self.amplitude.value * np.sin(2 * np.pi * self.frequency.value * x + self.phase.value) - -Basic Fitting Example -~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Create test data - x_data = np.linspace(0, 2, 100) - true_model = SineModel(amplitude_val=2.5, frequency_val=1.5, phase_val=0.5) - y_data = true_model(x_data) + 0.1 * np.random.normal(size=len(x_data)) - - # Create model to fit with initial guesses - fit_model = SineModel(amplitude_val=1.0, frequency_val=1.0, phase_val=0.0) - - # Set which parameters to fit (unfix them) - fit_model.amplitude.fixed = False - fit_model.frequency.fixed = False - fit_model.phase.fixed = False - - # Create fitter and perform fit - fitter = Fitter(fit_model, fit_model) - result = fitter.fit(x=x_data, y=y_data) - - # Access results - print(f"Chi-squared: {result.chi2}") - print(f"Fitted amplitude: {fit_model.amplitude.value} ± {fit_model.amplitude.error}") - print(f"Fitted frequency: {fit_model.frequency.value} ± {fit_model.frequency.error}") - -Available Minimizers --------------------- - -EasyScience supports multiple optimization backends: - -.. code-block:: python - - from easyscience import AvailableMinimizers - - # View all available minimizers - fitter = Fitter(model, model) - print(fitter.available_minimizers) - # Output: ['LMFit', 'LMFit_leastsq', 'LMFit_powell', 'Bumps', 'Bumps_simplex', 'DFO', 'DFO_leastsq'] - -Switching Minimizers -~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Use LMFit (default) - fitter.switch_minimizer(AvailableMinimizers.LMFit) - result1 = fitter.fit(x=x_data, y=y_data) - - # Switch to Bumps - fitter.switch_minimizer(AvailableMinimizers.Bumps) - result2 = fitter.fit(x=x_data, y=y_data) - - # Use DFO for derivative-free optimization - fitter.switch_minimizer(AvailableMinimizers.DFO) - result3 = fitter.fit(x=x_data, y=y_data) - -Parameter Management --------------------- - -Setting Bounds and Constraints -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - # Parameter with bounds - param = Parameter(name="amplitude", value=1.0, min=0.0, max=10.0, unit="m") - - # Fix parameter (exclude from fitting) - param.fixed = True - - # Unfix parameter (include in fitting) - param.fixed = False - - # Change bounds dynamically - param.min = 0.5 - param.max = 8.0 - -Parameter Dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -Parameters can depend on other parameters through expressions: - -.. code-block:: python - - # Create independent parameters - length = Parameter("length", 10.0, unit="m", min=1, max=100) - width = Parameter("width", 5.0, unit="m", min=1, max=50) - - # Create dependent parameter - area = Parameter.from_dependency( - name="area", - dependency_expression="length * width", - dependency_map={"length": length, "width": width} - ) - - # When length or width changes, area updates automatically - length.value = 15.0 - print(area.value) # Will be 75.0 (15 * 5) - -Using make_dependent_on() Method -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can also make an existing parameter dependent on other parameters using the ``make_dependent_on()`` method. This is useful when you want to convert an independent parameter into a dependent one: - -.. code-block:: python - - # Create independent parameters - radius = Parameter("radius", 5.0, unit="m", min=1, max=20) - height = Parameter("height", 10.0, unit="m", min=1, max=50) - volume = Parameter("volume", 100.0, unit="m³") # Initially independent - pi = Parameter("pi", 3.14159, fixed=True) # Constant parameter - - # Make volume dependent on radius and height - volume.make_dependent_on( - dependency_expression="pi * radius**2 * height", - dependency_map={"radius": radius, "height": height, "pi": pi} - ) - - # Now volume automatically updates when radius or height changes - radius.value = 8.0 - print(f"New volume: {volume.value:.2f} m³") # Automatically calculated - - # The parameter becomes dependent and cannot be set directly - try: - volume.value = 200.0 # This will raise an AttributeError - except AttributeError: - print("Cannot set value of dependent parameter directly") - -**What to expect:** - -- The parameter becomes **dependent** and its ``independent`` property becomes ``False`` -- You **cannot directly set** the value, bounds, or variance of a dependent parameter -- The parameter's value is **automatically recalculated** whenever any of its dependencies change -- Dependent parameters **cannot be fitted** (they are automatically fixed) -- The original value, unit, variance, min, and max are **overwritten** by the dependency calculation -- You can **revert to independence** using the ``make_independent()`` method if needed - -Advanced Fitting Options ------------------------- - -Setting Tolerances and Limits -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - fitter = Fitter(model, model) - - # Set convergence tolerance - fitter.tolerance = 1e-8 - - # Limit maximum function evaluations - fitter.max_evaluations = 1000 - - # Perform fit with custom settings - result = fitter.fit(x=x_data, y=y_data) - -Using Weights -~~~~~~~~~~~~~ - -.. code-block:: python - - # Define weights (inverse variance) - weights = 1.0 / errors**2 # where errors are your data uncertainties - - # Fit with weights - result = fitter.fit(x=x_data, y=y_data, weights=weights) - -Multidimensional Fitting -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: python - - class AbsSin2D(ObjBase): - def __init__(self, offset_val=0.0, phase_val=0.0): - offset = Parameter("offset", offset_val) - phase = Parameter("phase", phase_val) - super().__init__("sin2D", offset=offset, phase=phase) - - def __call__(self, x): - X, Y = x[:, 0], x[:, 1] # x is 2D array - return np.abs(np.sin(self.phase.value * X + self.offset.value)) * \ - np.abs(np.sin(self.phase.value * Y + self.offset.value)) - - # Create 2D data - x_2d = np.column_stack([x_grid.ravel(), y_grid.ravel()]) - - # Fit 2D model - model_2d = AbsSin2D(offset_val=0.1, phase_val=1.0) - model_2d.offset.fixed = False - model_2d.phase.fixed = False - - fitter = Fitter(model_2d, model_2d) - result = fitter.fit(x=x_2d, y=z_data.ravel()) - -Accessing Fit Results ---------------------- - -The ``FitResults`` object contains comprehensive information about the fit: - -.. code-block:: python - - result = fitter.fit(x=x_data, y=y_data) - - # Fit statistics - print(f"Chi-squared: {result.chi2}") - print(f"Reduced chi-squared: {result.reduced_chi}") - print(f"Number of parameters: {result.n_pars}") - print(f"Success: {result.success}") - - # Parameter values and uncertainties - for param_name, value in result.p.items(): - error = result.errors.get(param_name, 0.0) - print(f"{param_name}: {value} ± {error}") - - # Calculated values and residuals - y_calculated = result.y_calc - residuals = result.residual - - # Plot results - import matplotlib.pyplot as plt - plt.figure(figsize=(10, 4)) - plt.subplot(121) - plt.plot(x_data, y_data, 'o', label='Data') - plt.plot(x_data, y_calculated, '-', label='Fit') - plt.legend() - plt.subplot(122) - plt.plot(x_data, residuals, 'o') - plt.axhline(0, color='k', linestyle='--') - plt.ylabel('Residuals') - -Developer Guidelines ---------------------- - -Creating Custom Models -~~~~~~~~~~~~~~~~~~~~~~ - -For developers building scientific components: - -.. code-block:: python - - from easyscience import ObjBase, Parameter - - class CustomModel(ObjBase): - def __init__(self, param1_val=1.0, param2_val=0.0): - # Always create Parameters with appropriate bounds and units - param1 = Parameter("param1", param1_val, min=-10, max=10, unit="m/s") - param2 = Parameter("param2", param2_val, min=0, max=1, fixed=True) - - # Call parent constructor with named parameters - super().__init__("custom_model", param1=param1, param2=param2) - - def __call__(self, x): - # Implement your model calculation - return self.param1.value * x + self.param2.value - - def get_fit_parameters(self): - # This is automatically implemented by ObjBase - # Returns only non-fixed parameters - return super().get_fit_parameters() - -Best Practices -~~~~~~~~~~~~~~ - -1. **Always set appropriate bounds** on parameters to constrain the search space -2. **Use meaningful units** for physical parameters -3. **Fix parameters** that shouldn't be optimized -4. **Test with different minimizers** for robustness -5. **Validate results** by checking chi-squared and residuals - -Error Handling -~~~~~~~~~~~~~~ - -.. code-block:: python - - from easyscience.fitting.minimizers import FitError - - try: - result = fitter.fit(x=x_data, y=y_data) - if not result.success: - print(f"Fit failed: {result.message}") - except FitError as e: - print(f"Fitting error: {e}") - except Exception as e: - print(f"Unexpected error: {e}") - -Testing Patterns -~~~~~~~~~~~~~~~~ - -When writing tests for fitting code: - -.. code-block:: python - - import pytest - from easyscience import global_object - - @pytest.fixture - def clear_global_map(): - """Clear global map before each test""" - global_object.map._clear() - yield - global_object.map._clear() - - def test_model_fitting(clear_global_map): - # Create model and test fitting - model = CustomModel() - model.param1.fixed = False - - # Generate test data - x_test = np.linspace(0, 10, 50) - y_test = 2.5 * x_test + 0.1 * np.random.normal(size=len(x_test)) - - # Fit and verify - fitter = Fitter(model, model) - result = fitter.fit(x=x_test, y=y_test) - - assert result.success - assert model.param1.value == pytest.approx(2.5, abs=0.1) - -This comprehensive guide covers the essential aspects of fitting in EasyScience, from basic usage to advanced developer patterns. -The examples are drawn from the actual test suite and demonstrate real-world usage patterns. - diff --git a/docs/src/getting-started/installation.rst b/docs/src/getting-started/installation.rst deleted file mode 100644 index 4d0cef44..00000000 --- a/docs/src/getting-started/installation.rst +++ /dev/null @@ -1,33 +0,0 @@ -************ -Installation -************ - -**EasyScience** requires Python 3.11 or above. - -Install via ``pip`` -------------------- - -The easiest way of obtaining EasyScience and using it in your project is via pip. You can install directly by using: - -.. code-block:: console - - $ pip install EasyScience - -Install as an EasyScience developer ------------------------------------ - -You can obtain the latest development source from our `Github repository -`_.: - -.. code-block:: console - - $ git clone https://github.com/easyscience/corelib - $ cd corelib - -And install via pip: - -.. code-block:: console - - $ pip install -e . - -.. installation-end-content \ No newline at end of file diff --git a/docs/src/getting-started/overview.rst b/docs/src/getting-started/overview.rst deleted file mode 100644 index d5516a1c..00000000 --- a/docs/src/getting-started/overview.rst +++ /dev/null @@ -1,224 +0,0 @@ -.. _overview: - -Overview -======== - -EasyScience is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. -It implements a descriptor-based object system with global state management, making it easy to create scientific models with parameters -that have units, bounds, and dependencies. - -What is EasyScience? --------------------- - -EasyScience serves as the core foundation for the EasyScience family of projects, offering: - -* **Scientific Parameters**: Values with units, uncertainties, bounds, and fitting capabilities -* **Model Building**: Base classes for creating complex scientific models -* **Multi-backend Fitting**: Support for LMFit, Bumps, and DFO-LS optimization engines -* **Parameter Dependencies**: Express relationships between parameters through mathematical expressions -* **Serialization**: Save and load complete model states including parameter relationships -* **Undo/Redo System**: Track and revert changes to model parameters -* **Global State Management**: Unified tracking of all objects and their relationships - -Key Concepts ------------- - -Descriptor-Based Architecture -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience uses a hierarchical descriptor system: - -.. code-block:: python - - from easyscience import Parameter, ObjBase - - # Scientific parameter with units and bounds - temperature = Parameter( - name="temperature", - value=300.0, - unit="K", - min=0, - max=1000, - description="Sample temperature" - ) - - # Model containing parameters - class ThermalModel(ObjBase): - def __init__(self, temp_val=300.0, coeff_val=1.0): - temperature = Parameter("temperature", temp_val, unit="K", min=0, max=1000) - coefficient = Parameter("coefficient", coeff_val, min=0, max=10) - super().__init__("thermal_model", temperature=temperature, coefficient=coefficient) - -The hierarchy flows from: - -* ``DescriptorBase`` → ``DescriptorNumber`` → ``Parameter`` (fittable scientific values) -* ``BasedBase`` → ``ObjBase`` (containers for parameters and scientific models) -* ``CollectionBase`` (mutable sequences of scientific objects) - -Units and Physical Quantities -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience integrates with `scipp `_ for robust unit handling: - -.. code-block:: python - - # Parameters automatically handle units - length = Parameter("length", 100, unit="cm", min=0, max=1000) - - # Unit conversions are automatic - length.convert_unit("m") - print(length.value) # 1.0 - print(length.unit) # m - - # Arithmetic operations preserve units - area = length * length # Results in m^2 - -Parameter Dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -Parameters can depend on other parameters through mathematical expressions: - -.. code-block:: python - - # Independent parameters - radius = Parameter("radius", 5.0, unit="m", min=0, max=100) - height = Parameter("height", 10.0, unit="m", min=0, max=200) - - # Dependent parameter using mathematical expression - volume = Parameter.from_dependency( - name="volume", - dependency_expression="3.14159 * radius**2 * height", - dependency_map={"radius": radius, "height": height} - ) - - # Automatic updates - radius.value = 10.0 - print(volume.value) # Automatically recalculated - -Global State Management -~~~~~~~~~~~~~~~~~~~~~~~ - -All EasyScience objects register with a global map for dependency tracking: - -.. code-block:: python - - from easyscience import global_object - - # All objects are automatically tracked - param = Parameter("test", 1.0) - print(param.unique_name) # Automatically generated unique identifier - - # Access global registry - all_objects = global_object.map.vertices() - - # Clear for testing (important in unit tests) - global_object.map._clear() - -Fitting and Optimization -~~~~~~~~~~~~~~~~~~~~~~~~~ - -EasyScience provides a unified interface to multiple optimization backends: - -.. code-block:: python - - from easyscience import Fitter, AvailableMinimizers - - # Create fitter with model - fitter = Fitter(model, model) # model serves as both object and function - - # Switch between different optimizers - fitter.switch_minimizer(AvailableMinimizers.LMFit) # Levenberg-Marquardt - fitter.switch_minimizer(AvailableMinimizers.Bumps) # Bayesian inference - fitter.switch_minimizer(AvailableMinimizers.DFO) # Derivative-free - - # Perform fit - result = fitter.fit(x=x_data, y=y_data, weights=weights) - -Serialization and Persistence -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Complete model states can be saved and restored: - -.. code-block:: python - - # Save model to dictionary - model_dict = model.as_dict() - - # Save to JSON - import json - with open('model.json', 'w') as f: - json.dump(model_dict, f, indent=2, default=str) - - # Restore model - with open('model.json', 'r') as f: - loaded_dict = json.load(f) - - new_model = Model.from_dict(loaded_dict) - - # Resolve parameter dependencies after loading - from easyscience.variable.parameter_dependency_resolver import resolve_all_parameter_dependencies - resolve_all_parameter_dependencies(new_model) - -Use Cases ---------- - -EasyScience is designed for: - -Scientific Modeling -~~~~~~~~~~~~~~~~~~~~ - -* Creating physics-based models with parameters that have physical meaning -* Handling units consistently throughout calculations -* Managing complex parameter relationships and constraints - -Data Fitting and Analysis -~~~~~~~~~~~~~~~~~~~~~~~~~ - -* Fitting experimental data to theoretical models -* Comparing different optimization algorithms -* Uncertainty quantification and error propagation - -Software Development -~~~~~~~~~~~~~~~~~~~~ - -* Building domain-specific scientific applications -* Creating reusable model components -* Implementing complex scientific workflows - -Research and Education -~~~~~~~~~~~~~~~~~~~~~~ - -* Reproducible scientific computing -* Teaching scientific programming concepts -* Collaborative model development - -Architecture Benefits ---------------------- - -**Type Safety**: Strong typing with unit checking prevents common errors - -**Flexibility**: Multiple optimization backends allow algorithm comparison - -**Extensibility**: Descriptor pattern makes it easy to add new parameter types - -**Reproducibility**: Complete serialization enables exact state restoration - -**Performance**: Efficient observer pattern minimizes unnecessary recalculations - -**Testing**: Global state management with cleanup utilities supports robust testing - -Getting Started ---------------- - -The best way to learn EasyScience is through examples: - -1. **Basic Usage**: Start with simple parameters and models -2. **Fitting Tutorial**: Learn the fitting system with real data -3. **Advanced Features**: Explore parameter dependencies and serialization -4. **Development Guide**: Build your own scientific components - -See the :doc:`installation` guide to get started, then explore the :doc:`../fitting/introduction` for practical examples. - -EasyScience forms the foundation for more specialized packages in the EasyScience ecosystem, providing the core abstractions that make scientific computing more accessible and reliable. - - diff --git a/docs/src/index.rst b/docs/src/index.rst deleted file mode 100644 index 10f795a8..00000000 --- a/docs/src/index.rst +++ /dev/null @@ -1,181 +0,0 @@ -======================================= -Welcome to EasyScience's documentation! -======================================= - -**EasyScience** is a foundational Python library that provides the building blocks for scientific data simulation, analysis, and fitting. -It implements a descriptor-based object system with global state management, making it easier to create scientific models with parameters -that have units, bounds, and dependencies. - -.. code-block:: python - - from easyscience import Parameter, ObjBase, Fitter - - # Create a model with scientific parameters - class SineModel(ObjBase): - def __init__(self, amplitude=1.0, frequency=1.0, phase=0.0): - amp = Parameter("amplitude", amplitude, min=0, max=10, unit="V") - freq = Parameter("frequency", frequency, min=0.1, max=5, unit="Hz") - phase = Parameter("phase", phase, min=-3.14, max=3.14, unit="rad") - super().__init__("sine_model", amplitude=amp, frequency=freq, phase=phase) - - def __call__(self, x): - return self.amplitude.value * np.sin(2*np.pi*self.frequency.value*x + self.phase.value) - - # Fit to experimental data - model = SineModel() - model.amplitude.fixed = False # Allow fitting - fitter = Fitter(model, model) - result = fitter.fit(x=x_data, y=y_data) - -Key Features -============ - -**Scientific Parameters with Units** - Parameters automatically handle physical units, bounds, and uncertainties using `scipp `_ integration. - -**Parameter Dependencies** - Express mathematical relationships between parameters that update automatically when dependencies change. - -**Multi-Backend Fitting** - Unified interface to LMFit, Bumps, and DFO-LS optimization engines with easy algorithm comparison. - -**Complete Serialization** - Save and restore entire model states including parameter relationships and dependencies. - -**Global State Management** - Automatic tracking of all objects and their relationships with built-in undo/redo capabilities. - -**Developer-Friendly** - Clean APIs, comprehensive testing utilities, and extensive documentation for building scientific applications. - -Why EasyScience? -================ - -**Type Safety & Units** - Prevent common scientific computing errors with automatic unit checking and strong typing. - -**Reproducible Research** - Complete state serialization ensures exact reproducibility of scientific analyses. - -**Algorithm Flexibility** - Compare different optimization approaches without changing your model code. - -**Extensible Architecture** - Descriptor pattern makes it easy to create new parameter types and model components. - -Open Source & Cross-Platform -============================ - -EasyScience is free and open-source software with the source code openly shared on `GitHub repository `_. - -* **Cross-platform** - Written in Python and available for Windows, macOS, and Linux -* **Well-tested** - Comprehensive test suite ensuring reliability across platforms -* **Community-driven** - Open to contributions and feature requests -* **Production-ready** - Used in multiple scientific applications worldwide - - -Projects Built with EasyScience -=============================== - -EasyScience serves as the foundation for several scientific applications: - -**easyDiffraction** - .. image:: https://raw.githubusercontent.com/easyScience/easyDiffractionWww/master/assets/img/card.png - :target: https://easydiffraction.org - :width: 300px - - Scientific software for modeling and analysis of neutron diffraction data, providing an intuitive interface for crystallographic refinement. - -**easyReflectometry** - .. image:: https://raw.githubusercontent.com/easyScience/easyReflectometryWww/master/assets/img/card.png - :target: https://easyreflectometry.org - :width: 300px - - Scientific software for modeling and analysis of neutron reflectometry data, enabling detailed study of thin film structures. - -**Your Project Here** - EasyScience's flexible architecture makes it ideal for building domain-specific scientific applications. The comprehensive API and documentation help you get started quickly. - -Quick Start -=========== - -Ready to begin? Here's how to get started: - -1. **Install EasyScience**: ``pip install easyscience`` -2. **Read the Overview**: Understand the core concepts and architecture -3. **Try the Examples**: Work through practical fitting examples -4. **Explore the API**: Dive into the comprehensive reference documentation - -.. code-block:: bash - - pip install easyscience - -Then explore the tutorials and examples to learn the key concepts! - -Documentation Guide -=================== - -.. toctree:: - :caption: Getting Started - :maxdepth: 2 - :titlesonly: - - getting-started/overview - getting-started/installation - -New to EasyScience? Start with the :doc:`getting-started/overview` to understand the core concepts, then follow the :doc:`getting-started/installation` guide. - -.. toctree:: - :caption: User Guides - :maxdepth: 2 - :titlesonly: - - fitting/introduction - -Learn how to use EasyScience for scientific modeling and data fitting with comprehensive examples and best practices. - -.. toctree:: - :caption: API Reference - :maxdepth: 2 - :titlesonly: - - reference/base - -Complete API documentation for all classes, methods, and functions in EasyScience. - -.. toctree:: - :caption: Examples - :maxdepth: 2 - :titlesonly: - - base_examples/index - fitting_examples/index - -Practical examples and tutorials demonstrating real-world usage patterns. - -Need Help? -========== - -* **GitHub Issues**: Report bugs or request features on `GitHub Issues `_ -* **Discussions**: Ask questions in `GitHub Discussions `_ -* **API Reference**: Complete documentation of all classes and methods -* **Examples**: Practical tutorials and code samples - -Contributing -============ - -EasyScience is developed openly and welcomes contributions! Whether you're fixing bugs, adding features, improving documentation, or sharing usage examples, your contributions help make scientific computing more accessible. - -Visit our `GitHub repository `_ to: - -* Report issues or suggest features -* Submit pull requests -* Join discussions about development -* Help improve documentation - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` \ No newline at end of file diff --git a/docs/src/reference/base.rst b/docs/src/reference/base.rst deleted file mode 100644 index 1d91803c..00000000 --- a/docs/src/reference/base.rst +++ /dev/null @@ -1,323 +0,0 @@ -============== -API Reference -============== - -This reference provides detailed documentation for all EasyScience classes and functions. - -Core Variables and Descriptors -============================== - -Descriptor Base Classes ------------------------ - -.. autoclass:: easyscience.variable.DescriptorBase - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorNumber - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorArray - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorStr - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorBool - :members: - :inherited-members: - :show-inheritance: - -.. autoclass:: easyscience.variable.DescriptorAnyType - :members: - :inherited-members: - :show-inheritance: - -Parameters ----------- - -.. autoclass:: easyscience.variable.Parameter - :members: - :inherited-members: - :show-inheritance: - - The Parameter class extends DescriptorNumber with fitting capabilities, bounds, and dependency relationships. - - **Key Methods:** - - .. automethod:: from_dependency - :noindex: - .. automethod:: make_dependent_on - :noindex: - .. automethod:: make_independent - :noindex: - .. automethod:: resolve_pending_dependencies - :noindex: - -Base Classes for Models -======================= - -BasedBase ---------- - -.. autoclass:: easyscience.base_classes.BasedBase - :members: - :inherited-members: - :show-inheritance: - - Base class providing serialization, global object registration, and interface management. - -ObjBase -------- - -.. autoclass:: easyscience.base_classes.ObjBase - :members: - :inherited-members: - :show-inheritance: - - Container class for creating scientific models with parameters. All user-defined models should inherit from this class. - - **Key Methods:** - - .. automethod:: get_fit_parameters - :noindex: - .. automethod:: get_parameters - :noindex: - .. automethod:: _add_component - -Collections ------------ - -.. autoclass:: easyscience.base_classes.CollectionBase - :members: - :inherited-members: - :show-inheritance: - - Mutable sequence container for scientific objects with automatic parameter tracking. - -Fitting and Optimization -========================= - -Fitter -------- - -.. autoclass:: easyscience.fitting.Fitter - :members: - :show-inheritance: - - Main fitting engine supporting multiple optimization backends. - - **Key Methods:** - - .. autoproperty:: fit - :noindex: - .. automethod:: switch_minimizer - :noindex: - .. automethod:: make_model - .. automethod:: evaluate - -Available Minimizers --------------------- - -.. autoclass:: easyscience.fitting.AvailableMinimizers - :members: - :show-inheritance: - - Enumeration of available optimization backends. - -Fit Results ------------ - -.. autoclass:: easyscience.fitting.FitResults - :members: - :show-inheritance: - - Container for fitting results including parameters, statistics, and diagnostics. - -Minimizer Base Classes ----------------------- - -.. autoclass:: easyscience.fitting.minimizers.MinimizerBase - :members: - :show-inheritance: - - Abstract base class for all minimizer implementations. - -.. autoclass:: easyscience.fitting.minimizers.LMFit - :members: - :show-inheritance: - - LMFit-based minimizer implementation. - -.. autoclass:: easyscience.fitting.minimizers.Bumps - :members: - :show-inheritance: - - Bumps-based minimizer implementation. - -.. autoclass:: easyscience.fitting.minimizers.DFO - :members: - :show-inheritance: - - DFO-LS-based minimizer implementation. - -Global State Management -======================== - -Global Object -------------- - -.. autoclass:: easyscience.global_object.GlobalObject - :members: - :show-inheritance: - - Singleton managing global state, logging, and object tracking. - -Object Map ----------- - -.. autoclass:: easyscience.global_object.Map - :members: - :show-inheritance: - - Graph-based registry for tracking object relationships and dependencies. - -Undo/Redo System ----------------- - -.. autoclass:: easyscience.global_object.undo_redo.UndoStack - :members: - :show-inheritance: - - Stack-based undo/redo system for parameter changes. - -Serialization and I/O -===================== - -Serializer Components ---------------------- - -.. autoclass:: easyscience.io.SerializerComponent - :members: - :show-inheritance: - - Base class providing serialization capabilities. - -.. autoclass:: easyscience.io.SerializerDict - :members: - :show-inheritance: - - Dictionary-based serialization implementation. - -.. autoclass:: easyscience.io.SerializerBase - :members: - :show-inheritance: - - Base serialization functionality. - -Models and Examples -=================== - -Polynomial Model ----------------- - -.. autoclass:: easyscience.models.Polynomial - :members: - :show-inheritance: - - Built-in polynomial model for demonstration and testing. - -Job Management -============== - -Analysis and Experiments ------------------------- - -.. autoclass:: easyscience.job.AnalysisBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.ExperimentBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.JobBase - :members: - :show-inheritance: - -.. autoclass:: easyscience.job.TheoreticalModelBase - :members: - :show-inheritance: - -Utility Functions -================= - -Decorators ----------- - -.. autofunction:: easyscience.global_object.undo_redo.property_stack - - Decorator for properties that should be tracked in the undo/redo system. - -Class Tools ------------ - -.. autofunction:: easyscience.utils.classTools.addLoggedProp - - Utility for adding logged properties to classes. - -String Utilities ----------------- - -.. automodule:: easyscience.utils.string - :members: - -Parameter Dependencies ------------------------ - -.. autofunction:: easyscience.variable.parameter_dependency_resolver.resolve_all_parameter_dependencies - - Resolve all pending parameter dependencies after deserialization. - -.. autofunction:: easyscience.variable.parameter_dependency_resolver.get_parameters_with_pending_dependencies - - Find parameters that have unresolved dependencies. - -Constants and Enumerations -=========================== - -.. autodata:: easyscience.global_object - :annotation: GlobalObject - - Global singleton instance managing application state. - -Exception Classes -================= - -.. autoclass:: easyscience.fitting.minimizers.FitError - :show-inheritance: - - Exception raised when fitting operations fail. - -.. autoclass:: scipp.UnitError - :show-inheritance: - - Exception raised for unit-related errors (from scipp dependency). - -Usage Examples -============== - -For practical usage examples and tutorials, see: - -* :doc:`../getting-started/overview` - Introduction and key concepts -* :doc:`../fitting/introduction` - Comprehensive fitting guide -* :doc:`../getting-started/installation` - Installation instructions - -The API reference covers all public classes and methods. For implementation details and advanced usage patterns, refer to the source code and test suites in the repository. diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 00000000..68d02641 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,4 @@ +.md-header__button.md-logo img { + height: 2rem; + width: auto; +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..b274e615 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,88 @@ +site_name: EasyScience +site_url: https://easyscience.github.io/EasyScience/ +repo_url: https://github.com/EasyScience/EasyScience +repo_name: EasyScience/EasyScience +edit_uri: edit/master/docs/ + +theme: + name: material + custom_dir: overrides + features: + - navigation.tabs + - navigation.sections + - navigation.expand + - toc.integrate + - content.code.copy + palette: + - scheme: default + primary: indigo + accent: indigo + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/brightness-4 + name: Switch to light mode + +plugins: + - search + - mkdocstrings: + handlers: + python: + options: + docstring_style: numpy + show_source: true + show_root_heading: true + members_order: source + separate_signature: true + show_bases: true + paths: [src] + # Gallery plugin commented out - needs sphinx-gallery integration or alternative + # The examples can be manually added to docs/base_examples and docs/fitting_examples + - gallery: + examples_dirs: + - Examples/base + - Examples/fitting + gallery_dirs: + - docs/base_examples + - docs/fitting_examples + matplotlib_animations: true + image_scrapers: matplotlib + abort_on_example_error: false + +markdown_extensions: + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.arithmatex: + generic: true + - attr_list + - md_in_html + +extra_css: + - stylesheets/extra.css + +extra_javascript: + - javascripts/mathjax.js + - https://polyfill.io/v3/polyfill.min.js?features=es6 + - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js + +nav: + - Home: index.md + - Getting Started: + - Overview: getting-started/overview.md + - Installation: getting-started/installation.md + - User Guides: + - Fitting Introduction: fitting/introduction.md + - API Reference: + - Base Classes: reference/base.md + - Examples: + - Base Examples: base_examples/index.md + - Fitting Examples: fitting_examples/index.md diff --git a/overrides/partials/logo.html b/overrides/partials/logo.html new file mode 100644 index 00000000..b4bfa2b2 --- /dev/null +++ b/overrides/partials/logo.html @@ -0,0 +1,3 @@ + diff --git a/pixi.lock b/pixi.lock index 00863b1e..3c1c7651 100644 --- a/pixi.lock +++ b/pixi.lock @@ -340,11 +340,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl @@ -354,6 +352,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -365,6 +364,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl @@ -378,8 +378,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl @@ -388,13 +386,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d9/69/4402ea66272dacc10b298cca18ed73e1c0791ff2ae9ed218d3859f9698ac/h5py-3.15.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl @@ -418,11 +417,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/22/ff/6425bf5c20d79aa5b959d1ce9e65f599632345391381c9a104133fe0b171/matplotlib-3.10.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/b3/f6aa253503b3147238747672322503b2b529f390861f6184838d18abd51a/mkdocs_gallery-0.10.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -431,10 +440,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl @@ -452,9 +461,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -466,15 +475,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/77/34/1956aed61c4abb91926f9513330afac4654cc2a711ecb73085dc4e2e5c1d/scipp-25.11.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -485,26 +492,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -513,6 +509,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl @@ -536,11 +533,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h7cca4af_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl @@ -551,6 +546,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -562,6 +558,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl @@ -575,8 +572,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl @@ -585,13 +580,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/b3/40207e0192415cbff7ea1d37b9f24b33f6d38a5a2f5d18a678de78f967ae/h5py-3.15.1-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl @@ -615,11 +611,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/02/9c/207547916a02c78f6bdd83448d9b21afbc42f6379ed887ecf610984f3b4e/matplotlib-3.10.7-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/b3/f6aa253503b3147238747672322503b2b529f390861f6184838d18abd51a/mkdocs_gallery-0.10.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl @@ -628,10 +634,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl @@ -649,9 +655,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -663,15 +669,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/71/f2/18d5be10ac890ce7490451eb55d41bf9d96e481751362a30ed1a8bc176fa/scipp-25.11.0-cp313-cp313-macosx_11_0_x86_64.whl @@ -682,26 +686,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -710,6 +703,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl @@ -734,11 +728,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl @@ -749,6 +741,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -760,6 +753,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl @@ -773,8 +767,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl @@ -783,13 +775,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/96/ba99a003c763998035b0de4c299598125df5fc6c9ccf834f152ddd60e0fb/h5py-3.15.1-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl @@ -813,11 +806,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bc/d0/b3d3338d467d3fc937f0bb7f256711395cae6f78e22cef0656159950adf0/matplotlib-3.10.7-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/b3/f6aa253503b3147238747672322503b2b529f390861f6184838d18abd51a/mkdocs_gallery-0.10.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl @@ -826,10 +829,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl @@ -847,9 +850,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -861,15 +864,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/cd/fa/1ef2f8537272a2f383d72b9301c3ef66a49710b3bb7dcb2bd138cf2920d1/python_socketio-5.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/64/7c/d8a343b0a622987335a1ac848084079c47c21e44fcc450f9c145b11a56f6/scipp-25.11.0-cp313-cp313-macosx_11_0_arm64.whl @@ -880,26 +881,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -908,6 +898,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl @@ -933,11 +924,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_32.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_32.conda - - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl @@ -947,6 +936,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl @@ -958,6 +948,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/af/02/18785edcdf6266cdd6c6dc7635f1cbeefd9a5b4c3bb8aff8bd681e9dd095/codecov-2.1.13-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl @@ -971,8 +962,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/68/49/869b49db0bad6fba7c7471d612c356e745929d14e0de63acbc53e88f2a50/dfo_ls-1.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl @@ -981,13 +970,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e5/ea/fbb258a98863f99befb10ed727152b4ae659f322e1d9c0576f8a62754e81/h5py-3.15.1-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/04/35/aa8738d6674aba09d3f0c77a1c40aee1dbf10e1b26d03cbd987aa6642e86/hatchling-1.21.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl @@ -1011,11 +1001,21 @@ environments: - pypi: https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/e1/b6/23064a96308b9aeceeffa65e96bcde459a2ea4934d311dee20afde7407a0/matplotlib-3.10.7-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/00/b3/f6aa253503b3147238747672322503b2b529f390861f6184838d18abd51a/mkdocs_gallery-0.10.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl @@ -1024,10 +1024,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl @@ -1043,9 +1043,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl @@ -1058,15 +1058,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/f6/f3/9d1bb423a2dc0bbebfc98191095dd410a1268397b9c692d76a3ea971c790/scipp-25.11.0-cp313-cp313-win_amd64.whl @@ -1077,26 +1075,15 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/fd/9e/8d50f3b3fc4af8c73154f64d4a2293bfa2d517a19000e70ef2d614254084/tox_gh_actions-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/49/f6/73c4aa003d1237ee9bea8a46f49dc38c45dfe95af4f0da7e60678d388011/trove_classifiers-2025.11.14.15-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl @@ -1105,6 +1092,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl @@ -1134,21 +1122,6 @@ packages: purls: [] size: 23621 timestamp: 1650670423406 -- pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - name: accessible-pygments - version: 0.0.5 - sha256: 88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7 - requires_dist: - - pygments>=1.5 - - pillow ; extra == 'dev' - - pkginfo>=1.10 ; extra == 'dev' - - playwright ; extra == 'dev' - - pre-commit ; extra == 'dev' - - setuptools ; extra == 'dev' - - twine>=5.0 ; extra == 'dev' - - hypothesis ; extra == 'tests' - - pytest ; extra == 'tests' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl name: aiohappyeyeballs version: 2.6.1 @@ -1234,11 +1207,6 @@ packages: - frozenlist>=1.1.0 - typing-extensions>=4.2 ; python_full_version < '3.13' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - name: alabaster - version: 1.0.0 - sha256: fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl name: anyio version: 4.11.0 @@ -1366,6 +1334,13 @@ packages: - pytz ; extra == 'dev' - setuptools ; extra == 'dev' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl + name: backrefs + version: '6.1' + sha256: 4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05 + requires_dist: + - regex ; extra == 'extras' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl name: beautifulsoup4 version: 4.14.2 @@ -1559,6 +1534,13 @@ packages: version: 3.4.4 sha256: a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894 requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl + name: click + version: 8.3.1 + sha256: 981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 + requires_dist: + - colorama ; sys_platform == 'win32' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl name: cloudpickle version: 3.1.2 @@ -1771,26 +1753,10 @@ packages: name: distlib version: 0.4.0 sha256: 9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16 -- pypi: https://files.pythonhosted.org/packages/a2/e9/90b7d243364d3dce38c8c2a1b8c103d7a8d1383c2b24c735fae0eee038dd/doc8-2.0.0-py3-none-any.whl - name: doc8 - version: 2.0.0 - sha256: 9862710027f793c25f9b1899150660e4bf1d4c9a6738742e71f32011e2e3f590 - requires_dist: - - docutils>=0.19,<=0.21.2 - - restructuredtext-lint>=0.7 - - stevedore - - tomli ; python_full_version < '3.11' - - pygments - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl - name: docutils - version: 0.21.2 - sha256: dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 - requires_python: '>=3.9' - pypi: ./ name: easyscience - version: 2.0.0 - sha256: 3e1433dc7b46ccbb4a5d63a22de63b3113897cd66b602a368db0c08b09b3659c + version: 2.1.0 + sha256: cd57ac2c61d499cf0162d47794f65bd0dbe1a39e85be9a9c814a417df821ae63 requires_dist: - asteval - bumps @@ -1811,11 +1777,10 @@ packages: - pytest-cov ; extra == 'dev' - ruff ; extra == 'dev' - tox-gh-actions ; extra == 'dev' - - doc8 ; extra == 'docs' - - readme-renderer ; extra == 'docs' - - sphinx-autodoc-typehints ; extra == 'docs' - - sphinx-book-theme ; extra == 'docs' - - sphinx-gallery ; extra == 'docs' + - mkdocs ; extra == 'docs' + - mkdocs-gallery ; extra == 'docs' + - mkdocs-material ; extra == 'docs' + - mkdocstrings[python] ; extra == 'docs' - toml ; extra == 'docs' requires_python: '>=3.11' editable: true @@ -2027,6 +1992,26 @@ packages: version: 1.8.0 sha256: 878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231 requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl + name: ghp-import + version: 2.1.0 + sha256: 8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 + requires_dist: + - python-dateutil>=2.8.1 + - twine ; extra == 'dev' + - markdown ; extra == 'dev' + - flake8 ; extra == 'dev' + - wheel ; extra == 'dev' +- pypi: https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl + name: griffe + version: 1.15.0 + sha256: 6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3 + requires_dist: + - colorama>=0.4 + - pip>=24.0 ; extra == 'pypi' + - platformdirs>=4.2 ; extra == 'pypi' + - wheel>=0.42 ; extra == 'pypi' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl name: h11 version: 0.16.0 @@ -2134,11 +2119,6 @@ packages: - pytest>=8.3.2 ; extra == 'all' - flake8>=7.1.1 ; extra == 'all' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl - name: imagesize - version: 1.4.1 - sha256: 0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl name: iniconfig version: 2.3.0 @@ -3028,6 +3008,21 @@ packages: - pytest-cov ; extra == 'test' - lmfit[dev,doc,test] ; extra == 'all' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl + name: markdown + version: '3.10' + sha256: b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c + requires_dist: + - coverage ; extra == 'testing' + - pyyaml ; extra == 'testing' + - mkdocs>=1.6 ; extra == 'docs' + - mkdocs-nature>=0.6 ; extra == 'docs' + - mdx-gh-links>=0.2 ; extra == 'docs' + - mkdocstrings[python] ; extra == 'docs' + - mkdocs-gen-files ; extra == 'docs' + - mkdocs-section-index ; extra == 'docs' + - mkdocs-literate-nav ; extra == 'docs' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl name: markupsafe version: 3.0.3 @@ -3141,6 +3136,11 @@ packages: version: 0.7.0 sha256: 6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl + name: mergedeep + version: 1.3.4 + sha256: 70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 + requires_python: '>=3.6' - pypi: https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl name: mistune version: 3.1.4 @@ -3148,6 +3148,124 @@ packages: requires_dist: - typing-extensions ; python_full_version < '3.11' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl + name: mkdocs + version: 1.6.1 + sha256: db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e + requires_dist: + - click>=7.0 + - colorama>=0.4 ; sys_platform == 'win32' + - ghp-import>=1.0 + - importlib-metadata>=4.4 ; python_full_version < '3.10' + - jinja2>=2.11.1 + - markdown>=3.3.6 + - markupsafe>=2.0.1 + - mergedeep>=1.3.4 + - mkdocs-get-deps>=0.2.0 + - packaging>=20.5 + - pathspec>=0.11.1 + - pyyaml-env-tag>=0.1 + - pyyaml>=5.1 + - watchdog>=2.0 + - babel>=2.9.0 ; extra == 'i18n' + - babel==2.9.0 ; extra == 'min-versions' + - click==7.0 ; extra == 'min-versions' + - colorama==0.4 ; sys_platform == 'win32' and extra == 'min-versions' + - ghp-import==1.0 ; extra == 'min-versions' + - importlib-metadata==4.4 ; python_full_version < '3.10' and extra == 'min-versions' + - jinja2==2.11.1 ; extra == 'min-versions' + - markdown==3.3.6 ; extra == 'min-versions' + - markupsafe==2.0.1 ; extra == 'min-versions' + - mergedeep==1.3.4 ; extra == 'min-versions' + - mkdocs-get-deps==0.2.0 ; extra == 'min-versions' + - packaging==20.5 ; extra == 'min-versions' + - pathspec==0.11.1 ; extra == 'min-versions' + - pyyaml-env-tag==0.1 ; extra == 'min-versions' + - pyyaml==5.1 ; extra == 'min-versions' + - watchdog==2.0 ; extra == 'min-versions' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl + name: mkdocs-autorefs + version: 1.4.3 + sha256: 469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9 + requires_dist: + - markdown>=3.3 + - markupsafe>=2.0.1 + - mkdocs>=1.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/00/b3/f6aa253503b3147238747672322503b2b529f390861f6184838d18abd51a/mkdocs_gallery-0.10.4-py2.py3-none-any.whl + name: mkdocs-gallery + version: 0.10.4 + sha256: 8669d162b412714c52792f2959d4d211bf92bf5f820f5916c0686ff1ccd89806 + requires_dist: + - mkdocs>=1,<2 + - mkdocs-material + - tqdm + - packaging +- pypi: https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl + name: mkdocs-get-deps + version: 0.2.0 + sha256: 2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134 + requires_dist: + - importlib-metadata>=4.3 ; python_full_version < '3.10' + - mergedeep>=1.3.4 + - platformdirs>=2.2.0 + - pyyaml>=5.1 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl + name: mkdocs-material + version: 9.7.0 + sha256: da2866ea53601125ff5baa8aa06404c6e07af3c5ce3d5de95e3b52b80b442887 + requires_dist: + - babel>=2.10 + - backrefs>=5.7.post1 + - colorama>=0.4 + - jinja2>=3.1 + - markdown>=3.2 + - mkdocs-material-extensions>=1.3 + - mkdocs>=1.6 + - paginate>=0.5 + - pygments>=2.16 + - pymdown-extensions>=10.2 + - requests>=2.26 + - mkdocs-git-committers-plugin-2>=1.1,<3 ; extra == 'git' + - mkdocs-git-revision-date-localized-plugin~=1.2,>=1.2.4 ; extra == 'git' + - cairosvg~=2.6 ; extra == 'imaging' + - pillow>=10.2,<12.0 ; extra == 'imaging' + - mkdocs-minify-plugin~=0.7 ; extra == 'recommended' + - mkdocs-redirects~=1.2 ; extra == 'recommended' + - mkdocs-rss-plugin~=1.6 ; extra == 'recommended' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl + name: mkdocs-material-extensions + version: 1.3.1 + sha256: adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl + name: mkdocstrings + version: 1.0.0 + sha256: 4c50eb960bff6e05dfc631f6bc00dfabffbcb29c5ff25f676d64daae05ed82fa + requires_dist: + - jinja2>=3.1 + - markdown>=3.6 + - markupsafe>=1.1 + - mkdocs>=1.6 + - mkdocs-autorefs>=1.4 + - pymdown-extensions>=6.3 + - mkdocstrings-crystal>=0.3.4 ; extra == 'crystal' + - mkdocstrings-python-legacy>=0.2.1 ; extra == 'python-legacy' + - mkdocstrings-python>=1.16.2 ; extra == 'python' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl + name: mkdocstrings-python + version: 2.0.1 + sha256: 66ecff45c5f8b71bf174e11d49afc845c2dfc7fc0ab17a86b6b337e0f24d8d90 + requires_dist: + - mkdocstrings>=0.30 + - mkdocs-autorefs>=1.4 + - griffe>=1.13 + - typing-extensions>=4.0 ; python_full_version < '3.11' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/5b/69/93b34728cc386efdde0c342f8c680b9187dea7beb7adaf6b58a0713be101/mpld3-0.5.12-py3-none-any.whl name: mpld3 version: 0.5.12 @@ -3362,21 +3480,6 @@ packages: version: 1.6.0 sha256: 87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/42/0f/c76bf3dba22c73c38e9b1113b017cf163f7696f50e003404ec5ecdb1e8a6/nh3-0.3.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: nh3 - version: 0.3.2 - sha256: 7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/64/9a/1a1c154f10a575d20dd634e5697805e589bbdb7673a0ad00e8da90044ba7/nh3-0.3.2-cp38-abi3-win_amd64.whl - name: nh3 - version: 0.3.2 - sha256: 562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b6/3e/f5a5cc2885c24be13e9b937441bd16a012ac34a657fe05e58927e8af8b7a/nh3-0.3.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl - name: nh3 - version: 0.3.2 - sha256: 7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e - requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl name: notebook-shim version: 0.2.4 @@ -3460,6 +3563,14 @@ packages: version: '25.0' sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl + name: paginate + version: 0.5.7 + sha256: b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591 + requires_dist: + - pytest ; extra == 'dev' + - tox ; extra == 'dev' + - black ; extra == 'lint' - pypi: https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl name: pandas version: 2.3.3 @@ -4276,59 +4387,6 @@ packages: version: '2.23' sha256: e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e7/d3/c622950d87a2ffd1654208733b5bd1c5645930014abed8f4c0d74863988b/pydata_sphinx_theme-0.15.4-py3-none-any.whl - name: pydata-sphinx-theme - version: 0.15.4 - sha256: 2136ad0e9500d0949f96167e63f3e298620040aea8f9c74621959eda5d4cf8e6 - requires_dist: - - sphinx>=5 - - beautifulsoup4 - - docutils!=0.17.0 - - packaging - - babel - - pygments>=2.7 - - accessible-pygments - - typing-extensions - - numpydoc ; extra == 'doc' - - linkify-it-py ; extra == 'doc' - - rich ; extra == 'doc' - - sphinxext-rediraffe ; extra == 'doc' - - sphinx-sitemap ; extra == 'doc' - - sphinx-autoapi>=3.0.0 ; extra == 'doc' - - myst-parser ; extra == 'doc' - - ablog>=0.11.8 ; extra == 'doc' - - jupyter-sphinx ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpy ; extra == 'doc' - - xarray ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - jupyterlite-sphinx ; extra == 'doc' - - sphinxcontrib-youtube>=1.4.1 ; extra == 'doc' - - sphinx-favicon>=1.0.1 ; extra == 'doc' - - ipykernel ; extra == 'doc' - - nbsphinx ; extra == 'doc' - - ipyleaflet ; extra == 'doc' - - colorama ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - graphviz ; extra == 'doc' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx[test] ; extra == 'test' - - pyyaml ; extra == 'dev' - - pre-commit ; extra == 'dev' - - pydata-sphinx-theme[doc,test] ; extra == 'dev' - - tox ; extra == 'dev' - - pandoc ; extra == 'dev' - - sphinx-theme-builder[cli] ; extra == 'dev' - - pytest-playwright ; extra == 'a11y' - - babel ; extra == 'i18n' - - jinja2 ; extra == 'i18n' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl name: pyflakes version: 3.4.0 @@ -4341,6 +4399,15 @@ packages: requires_dist: - colorama>=0.4.6 ; extra == 'windows-terminal' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl + name: pymdown-extensions + version: '10.18' + sha256: 090bca72be43f7d3186374e23c782899dbef9dc153ef24c59dcd3c346f9ffcae + requires_dist: + - markdown>=3.6 + - pyyaml + - pygments>=2.19.1 ; extra == 'extra' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl name: pyparsing version: 3.2.5 @@ -4597,6 +4664,13 @@ packages: version: 6.0.3 sha256: 8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl + name: pyyaml-env-tag + version: '1.1' + sha256: 17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04 + requires_dist: + - pyyaml + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl name: pyzmq version: 27.1.0 @@ -4649,16 +4723,6 @@ packages: purls: [] size: 252359 timestamp: 1740379663071 -- pypi: https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl - name: readme-renderer - version: '44.0' - sha256: 2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 - requires_dist: - - nh3>=0.2.14 - - docutils>=0.21.2 - - pygments>=2.5.1 - - cmarkgfm>=0.8.0 ; extra == 'md' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl name: referencing version: 0.37.0 @@ -4680,12 +4744,6 @@ packages: - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/af/63/ac52b32b33ae62f2076ed5c4f6b00e065e3ccbb2063e9a2e813b2bfc95bf/restructuredtext_lint-2.0.2-py3-none-any.whl - name: restructuredtext-lint - version: 2.0.2 - sha256: 374c0d3e7e0867b2335146a145343ac619400623716b211b9a010c94426bbed7 - requires_dist: - - docutils>=0.11,<1.0 - pypi: https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl name: rfc3339-validator version: 0.1.4 @@ -4706,16 +4764,6 @@ packages: - lark>=1.2.2 - pytest>=8.3.5 ; extra == 'testing' requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl - name: roman-numerals-py - version: 3.1.0 - sha256: 9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c - requires_dist: - - mypy==1.15.0 ; extra == 'lint' - - ruff==0.9.7 ; extra == 'lint' - - pyright==1.1.394 ; extra == 'lint' - - pytest>=8 ; extra == 'test' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl name: rpds-py version: 0.29.0 @@ -5134,209 +5182,11 @@ packages: version: 1.3.1 sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl - name: snowballstemmer - version: 3.0.1 - sha256: 6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*' - pypi: https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl name: soupsieve version: '2.8' sha256: 0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl - name: sphinx - version: 8.2.3 - sha256: 4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3 - requires_dist: - - sphinxcontrib-applehelp>=1.0.7 - - sphinxcontrib-devhelp>=1.0.6 - - sphinxcontrib-htmlhelp>=2.0.6 - - sphinxcontrib-jsmath>=1.0.1 - - sphinxcontrib-qthelp>=1.0.6 - - sphinxcontrib-serializinghtml>=1.1.9 - - jinja2>=3.1 - - pygments>=2.17 - - docutils>=0.20,<0.22 - - snowballstemmer>=2.2 - - babel>=2.13 - - alabaster>=0.7.14 - - imagesize>=1.3 - - requests>=2.30.0 - - roman-numerals-py>=1.0.0 - - packaging>=23.0 - - colorama>=0.4.6 ; sys_platform == 'win32' - - sphinxcontrib-websupport ; extra == 'docs' - - ruff==0.9.9 ; extra == 'lint' - - mypy==1.15.0 ; extra == 'lint' - - sphinx-lint>=0.9 ; extra == 'lint' - - types-colorama==0.4.15.20240311 ; extra == 'lint' - - types-defusedxml==0.7.0.20240218 ; extra == 'lint' - - types-docutils==0.21.0.20241128 ; extra == 'lint' - - types-pillow==10.2.0.20240822 ; extra == 'lint' - - types-pygments==2.19.0.20250219 ; extra == 'lint' - - types-requests==2.32.0.20241016 ; extra == 'lint' - - types-urllib3==1.26.25.14 ; extra == 'lint' - - pyright==1.1.395 ; extra == 'lint' - - pytest>=8.0 ; extra == 'lint' - - pypi-attestations==0.0.21 ; extra == 'lint' - - betterproto==2.0.0b6 ; extra == 'lint' - - pytest>=8.0 ; extra == 'test' - - pytest-xdist[psutil]>=3.4 ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' - - cython>=3.0 ; extra == 'test' - - setuptools>=70.0 ; extra == 'test' - - typing-extensions>=4.9 ; extra == 'test' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/05/f2/9657c98a66973b7c35bfd48ba65d1922860de9598fbb535cd96e3f58a908/sphinx_autodoc_typehints-3.5.2-py3-none-any.whl - name: sphinx-autodoc-typehints - version: 3.5.2 - sha256: 0accd043619f53c86705958e323b419e41667917045ac9215d7be1b493648d8c - requires_dist: - - sphinx>=8.2.3 - - furo>=2025.9.25 ; extra == 'docs' - - covdefaults>=2.3 ; extra == 'testing' - - coverage>=7.10.7 ; extra == 'testing' - - defusedxml>=0.7.1 ; extra == 'testing' - - diff-cover>=9.7.1 ; extra == 'testing' - - pytest-cov>=7 ; extra == 'testing' - - pytest>=8.4.2 ; extra == 'testing' - - sphobjinv>=2.3.1.3 ; extra == 'testing' - - typing-extensions>=4.15 ; extra == 'testing' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/51/9e/c41d68be04eef5b6202b468e0f90faf0c469f3a03353f2a218fd78279710/sphinx_book_theme-1.1.4-py3-none-any.whl - name: sphinx-book-theme - version: 1.1.4 - sha256: 843b3f5c8684640f4a2d01abd298beb66452d1b2394cd9ef5be5ebd5640ea0e1 - requires_dist: - - sphinx>=6.1 - - pydata-sphinx-theme==0.15.4 - - pre-commit ; extra == 'code-style' - - ablog ; extra == 'doc' - - ipywidgets ; extra == 'doc' - - folium ; extra == 'doc' - - numpy ; extra == 'doc' - - matplotlib ; extra == 'doc' - - numpydoc ; extra == 'doc' - - myst-nb ; extra == 'doc' - - nbclient ; extra == 'doc' - - pandas ; extra == 'doc' - - plotly ; extra == 'doc' - - sphinx-design ; extra == 'doc' - - sphinx-examples ; extra == 'doc' - - sphinx-copybutton ; extra == 'doc' - - sphinx-tabs ; extra == 'doc' - - sphinx-togglebutton ; extra == 'doc' - - sphinx-thebe ; extra == 'doc' - - sphinxcontrib-bibtex ; extra == 'doc' - - sphinxcontrib-youtube ; extra == 'doc' - - sphinxext-opengraph ; extra == 'doc' - - beautifulsoup4 ; extra == 'test' - - coverage ; extra == 'test' - - defusedxml ; extra == 'test' - - myst-nb ; extra == 'test' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-regressions ; extra == 'test' - - sphinx-thebe ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl - name: sphinx-gallery - version: 0.19.0 - sha256: 4c28751973f81769d5bbbf5e4ebaa0dc49dff8c48eb7f11131eb5f6e4aa25f0e - requires_dist: - - pillow - - sphinx>=5 - - sphinxcontrib-video ; extra == 'animations' - - absl-py ; extra == 'dev' - - graphviz ; extra == 'dev' - - intersphinx-registry ; extra == 'dev' - - ipython ; extra == 'dev' - - joblib ; extra == 'dev' - - jupyterlite-sphinx>=0.17.1 ; extra == 'dev' - - lxml ; extra == 'dev' - - matplotlib ; extra == 'dev' - - numpy ; extra == 'dev' - - packaging ; extra == 'dev' - - plotly ; extra == 'dev' - - pydata-sphinx-theme ; extra == 'dev' - - pytest ; extra == 'dev' - - pytest-coverage ; extra == 'dev' - - seaborn ; extra == 'dev' - - sphinxcontrib-video ; extra == 'dev' - - statsmodels ; extra == 'dev' - - jupyterlite-sphinx ; extra == 'jupyterlite' - - joblib ; extra == 'parallel' - - numpy ; extra == 'recommender' - - graphviz ; extra == 'show-api-usage' - - memory-profiler ; extra == 'show-memory' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-applehelp - version: 2.0.0 - sha256: 4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-devhelp - version: 2.0.0 - sha256: aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl - name: sphinxcontrib-htmlhelp - version: 2.1.0 - sha256: 166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - html5lib ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - name: sphinxcontrib-jsmath - version: 1.0.1 - sha256: 2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 - requires_dist: - - pytest ; extra == 'test' - - flake8 ; extra == 'test' - - mypy ; extra == 'test' - requires_python: '>=3.5' -- pypi: https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl - name: sphinxcontrib-qthelp - version: 2.0.0 - sha256: b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - - defusedxml>=0.7.1 ; extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl - name: sphinxcontrib-serializinghtml - version: 2.0.0 - sha256: 6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 - requires_dist: - - ruff==0.5.5 ; extra == 'lint' - - mypy ; extra == 'lint' - - types-docutils ; extra == 'lint' - - sphinx>=5 ; extra == 'standalone' - - pytest ; extra == 'test' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl name: stack-data version: 0.6.3 @@ -5350,11 +5200,6 @@ packages: - pygments ; extra == 'tests' - littleutils ; extra == 'tests' - cython ; extra == 'tests' -- pypi: https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl - name: stevedore - version: 5.6.0 - sha256: 4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820 - requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl name: terminado version: 0.18.1 @@ -5487,6 +5332,22 @@ packages: - pytest-mock>=3 ; extra == 'testing' - pytest-randomly>=3 ; extra == 'testing' requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl + name: tqdm + version: 4.67.1 + sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 + requires_dist: + - colorama ; sys_platform == 'win32' + - pytest>=6 ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-timeout ; extra == 'dev' + - pytest-asyncio>=0.24 ; extra == 'dev' + - nbval ; extra == 'dev' + - requests ; extra == 'discord' + - slack-sdk ; extra == 'slack' + - requests ; extra == 'telegram' + - ipywidgets>=6 ; extra == 'notebook' + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl name: traitlets version: 5.14.3 @@ -5652,6 +5513,34 @@ packages: - setuptools>=68 ; extra == 'test' - time-machine>=2.10 ; platform_python_implementation == 'CPython' and extra == 'test' requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: 76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl + name: watchdog + version: 6.0.0 + sha256: 20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl + name: watchdog + version: 6.0.0 + sha256: cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl + name: watchdog + version: 6.0.0 + sha256: a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b + requires_dist: + - pyyaml>=3.10 ; extra == 'watchmedo' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl name: wcwidth version: 0.2.14 diff --git a/pixi.toml b/pixi.toml index a7a8897b..e379be08 100644 --- a/pixi.toml +++ b/pixi.toml @@ -45,8 +45,9 @@ update-lock = "pixi update" tox = "tox" # Documentation tasks -docs-build = "sphinx-build -b html docs/src docs/_build/html" -docs-clean = "rm -rf docs/_build/" +docs-build = "mkdocs build" +docs-serve = "mkdocs serve" +docs-clean = "rm -rf site/" [pypi-dependencies] # == [feature.default.pypi-dependencies] # Editable install of the package itself diff --git a/pyproject.toml b/pyproject.toml index 3cdb977c..d535db26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,11 +55,10 @@ dev = [ "jupyterlab" ] docs = [ - "doc8", - "readme-renderer", - "sphinx_autodoc_typehints", - "sphinx_book_theme", - "sphinx_gallery", + "mkdocs", + "mkdocs-material", + "mkdocstrings[python]", + "mkdocs-gallery", "toml" ] diff --git a/src/easyscience/__init__.py b/src/easyscience/__init__.py index e3d4b084..3c798ad9 100644 --- a/src/easyscience/__init__.py +++ b/src/easyscience/__init__.py @@ -14,11 +14,11 @@ from .variable import Parameter # noqa: E402 __all__ = [ - __version__, - global_object, - ObjBase, - AvailableMinimizers, - Fitter, - DescriptorNumber, - Parameter, + '__version__', + 'global_object', + 'ObjBase', + 'AvailableMinimizers', + 'Fitter', + 'DescriptorNumber', + 'Parameter', ] diff --git a/src/easyscience/base_classes/__init__.py b/src/easyscience/base_classes/__init__.py index 9f3ba080..b43e85b9 100644 --- a/src/easyscience/base_classes/__init__.py +++ b/src/easyscience/base_classes/__init__.py @@ -5,9 +5,9 @@ from .obj_base import ObjBase __all__ = [ - BasedBase, - CollectionBase, - ObjBase, - ModelBase, - NewBase, + 'BasedBase', + 'CollectionBase', + 'ObjBase', + 'ModelBase', + 'NewBase', ] diff --git a/src/easyscience/io/__init__.py b/src/easyscience/io/__init__.py index b21e648c..a52aa287 100644 --- a/src/easyscience/io/__init__.py +++ b/src/easyscience/io/__init__.py @@ -6,7 +6,7 @@ from .serializer_dict import SerializerDict __all__ = [ - SerializerBase, - SerializerComponent, - SerializerDict, + 'SerializerBase', + 'SerializerComponent', + 'SerializerDict', ] diff --git a/src/easyscience/models/polynomial.py b/src/easyscience/models/polynomial.py index 9ea2576e..308faadb 100644 --- a/src/easyscience/models/polynomial.py +++ b/src/easyscience/models/polynomial.py @@ -23,8 +23,8 @@ class Polynomial(ObjBase): ---------- name : str The name of the model. - degree : int - The degree of the polynomial. + coefficients : Optional[Union[Iterable[Union[float, Parameter]], CollectionBase]] + The coefficients of the polynomial. """ coefficients: ClassVar[CollectionBase] diff --git a/src/easyscience/variable/__init__.py b/src/easyscience/variable/__init__.py index 96094cab..25a96597 100644 --- a/src/easyscience/variable/__init__.py +++ b/src/easyscience/variable/__init__.py @@ -7,11 +7,11 @@ from .parameter import Parameter __all__ = [ - DescriptorAnyType, - DescriptorArray, - DescriptorBase, - DescriptorBool, - DescriptorNumber, - DescriptorStr, - Parameter, + 'DescriptorAnyType', + 'DescriptorArray', + 'DescriptorBase', + 'DescriptorBool', + 'DescriptorNumber', + 'DescriptorStr', + 'Parameter', ]