diff --git a/notes/1.ipynb b/notes/1.ipynb index 13568e8..5ab72ac 100644 --- a/notes/1.ipynb +++ b/notes/1.ipynb @@ -18,7 +18,9 @@ "source": [ "# Floating Point\n", "\n", - "**Double Precision Floating Point Number Representation**\n", + "$$s\\times M \\times B^{e-E}$$\n", + "\n", + "**IEEE-754 Double Precision Floating Point Number Representation**\n", "\n", "$$(-1)^s \\times 2^{c-1023} \\times (1+f)$$\n", "\n", @@ -31,13 +33,35 @@ "cell_type": "markdown", "id": "9c0b5413", "metadata": {}, - "source": [] + "source": [ + "## Machine Accuracy\n", + "\n", + "$$\\epsilon = b^{1-m}$$\n", + "\n", + "(typically $b = 2$, $m: \\text {bit for matissa}$)\n" + ] }, { "cell_type": "markdown", "id": "964d247f", "metadata": {}, - "source": [] + "source": [ + "# Errors\n", + "\n", + "* **Round-off Error**\n", + "\n", + "* **Truncation Error**\n", + "\n", + "Taylor Series\n", + "\n", + "approximations: zero order, first order(recommended), second order, etc..\n", + "\n", + "let $v_t$: true value, and $v_a$: approximation\n", + "Absolute error: $(v_t - v_a)$\n", + "Relative error: $(v_t - v_a) / v_t$\n", + "\n", + "so stopping condition is $e_a < e_s$ where $e_s$ is desired.\n" + ] }, { "cell_type": "markdown", @@ -48,8 +72,7 @@ "\n", "When there is no or hard to find analytic solution.\n", "\n", - "* General procedure of root finding\n", - "\n", + "General procedure of root finding\n", "\n", "## Incremental Search\n", "\n", diff --git a/notes/2.ipynb b/notes/2.ipynb index eae2e2e..adaed1c 100644 --- a/notes/2.ipynb +++ b/notes/2.ipynb @@ -29,18 +29,75 @@ { "cell_type": "code", "execution_count": null, - "id": "3bed3d44", + "id": "e7357276", "metadata": {}, "outputs": [], "source": [] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", + "id": "1113de3c", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "3bed3d44", + "metadata": {}, + "source": [ + "## Gauss Elimination\n", + "\n", + "## Gauss-Jordan Elimination" + ] + }, + { + "cell_type": "markdown", "id": "a5239ed9", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## LU decomposition\n", + "\n", + "$$A = LU$$\n", + "\n", + "$$Ax = b \\Rightarrow LUx = b \\Rightarrow \\\\\n", + "L^{-1}LUx = L^{-1}b \n", + "$$\n", + "\n", + "At that time, $Ux = c$ is easy to compute.\n", + "and compute $Lc = b$ to easily get $x$.\n", + "\n", + "\n", + "Various LUdcmps\n", + "* Doolittle $L_{ii} = 1$\n", + "* Crout $U_{ii} = 1$\n", + "* Cholesky $L_{ii} = U_{ii}$, which is appropriate for symmetric, positive-definite matrix\n", + "\n", + "### Crout Implementation\n", + "\n", + "$$\\begin{bmatrix}\n", + "a_{11} & a_{12} & \\cdots a_{1n} \\\\\n", + "a_{21} & a_{22} & \\cdots a_{2n} \\\\\n", + "\\vdots & \\vdots & \\ddots \\vdots \\\\\n", + "a_{n1} & a_{n2} & \\cdots a_{nn}\n", + "\\end{bmatrix} = \\begin{bmatrix}\n", + "l_{11} & 0 & \\cdots 0 \\\\\n", + "l_{21} & l_{22} & \\cdots 0 \\\\\n", + "\\vdots & \\vdots & \\ddots \\vdots \\\\\n", + "l_{n1} & l_{n2} & \\cdots l_{nn}\n", + "\\end{bmatrix}\\begin{bmatrix}\n", + "1 & u_{12} & \\cdots u_{1n} \\\\\n", + "0 & 1 & \\cdots u_{2n} \\\\\n", + "\\vdots & \\vdots & \\ddots \\vdots \\\\\n", + "0 & 0 & \\cdots 1\n", + "\\end{bmatrix}$$\n", + "\n", + "$$\\begin{align*}\n", + "l_{i1} &= a_{i1} & (i = 1, 2, \\cdots, n) \\\\\n", + "u_{1j} &= a_{1j} / l_{11} & (j = 2, 3, \\cdots, n) \\\\\n", + "l_{ij} &= a_{ij} - \\sum_{k=1}^{j-1} {l_{ik} u_{kj}} & (j \\leq i, i = 2,3,\\cdots, n) \\\\\n", + "u_{ij} &= (a_{ij} - \\sum_{k=1}^{i-1} {l_{ik} u_{kj}}) / l_{ii} & (j > i, j = 3,4,\\cdots, n)\n", + "\\end{align*}$$" + ] }, { "cell_type": "markdown", @@ -111,6 +168,14 @@ "\n", "\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "733012d2", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notes/3.ipynb b/notes/3.ipynb new file mode 100644 index 0000000..89bc0d7 --- /dev/null +++ b/notes/3.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "af0a5571", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "sys.path.append(\"../modules\")\n", + "\n", + "import fixed" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8a865027", + "metadata": {}, + "outputs": [], + "source": [ + "from fixed.c_fixedpoint import FixedPoint" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "802380cd", + "metadata": {}, + "outputs": [ + { + "ename": "SystemError", + "evalue": "invalid format string: %.8f, frac_bits=%d)", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mSystemError\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/uworkspace/2025-02-Numerical/.venv/lib/python3.12/site-packages/IPython/core/formatters.py:770\u001b[39m, in \u001b[36mPlainTextFormatter.__call__\u001b[39m\u001b[34m(self, obj)\u001b[39m\n\u001b[32m 763\u001b[39m stream = StringIO()\n\u001b[32m 764\u001b[39m printer = pretty.RepresentationPrinter(stream, \u001b[38;5;28mself\u001b[39m.verbose,\n\u001b[32m 765\u001b[39m \u001b[38;5;28mself\u001b[39m.max_width, \u001b[38;5;28mself\u001b[39m.newline,\n\u001b[32m 766\u001b[39m max_seq_length=\u001b[38;5;28mself\u001b[39m.max_seq_length,\n\u001b[32m 767\u001b[39m singleton_pprinters=\u001b[38;5;28mself\u001b[39m.singleton_printers,\n\u001b[32m 768\u001b[39m type_pprinters=\u001b[38;5;28mself\u001b[39m.type_printers,\n\u001b[32m 769\u001b[39m deferred_pprinters=\u001b[38;5;28mself\u001b[39m.deferred_printers)\n\u001b[32m--> \u001b[39m\u001b[32m770\u001b[39m \u001b[43mprinter\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpretty\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 771\u001b[39m printer.flush()\n\u001b[32m 772\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m stream.getvalue()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/uworkspace/2025-02-Numerical/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py:411\u001b[39m, in \u001b[36mRepresentationPrinter.pretty\u001b[39m\u001b[34m(self, obj)\u001b[39m\n\u001b[32m 400\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m meth(obj, \u001b[38;5;28mself\u001b[39m, cycle)\n\u001b[32m 401\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m 402\u001b[39m \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mobject\u001b[39m\n\u001b[32m 403\u001b[39m \u001b[38;5;66;03m# check if cls defines __repr__\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 409\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(_safe_getattr(\u001b[38;5;28mcls\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33m__repr__\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[32m 410\u001b[39m ):\n\u001b[32m--> \u001b[39m\u001b[32m411\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_repr_pprint\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcycle\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 413\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m _default_pprint(obj, \u001b[38;5;28mself\u001b[39m, cycle)\n\u001b[32m 414\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/uworkspace/2025-02-Numerical/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py:786\u001b[39m, in \u001b[36m_repr_pprint\u001b[39m\u001b[34m(obj, p, cycle)\u001b[39m\n\u001b[32m 784\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"A pprint that just redirects to the normal repr function.\"\"\"\u001b[39;00m\n\u001b[32m 785\u001b[39m \u001b[38;5;66;03m# Find newlines and replace them with p.break_()\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m786\u001b[39m output = \u001b[38;5;28;43mrepr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 787\u001b[39m lines = output.splitlines()\n\u001b[32m 788\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m p.group():\n", + "\u001b[31mSystemError\u001b[39m: invalid format string: %.8f, frac_bits=%d)" + ] + } + ], + "source": [ + "FixedPoint(1.0, frac_bits=4)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "2025-02-Numerical (3.12.11)", + "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": 5 +} diff --git a/notes/4.ipynb b/notes/4.ipynb new file mode 100644 index 0000000..b233de7 --- /dev/null +++ b/notes/4.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "db67ff8c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6e4ebb4e", + "metadata": {}, + "source": [ + "# Eigen\n", + "\n", + "$$Ax = \\lambda x$$\n", + "\n", + "$$(A-\\lambda I) x = 0$$\n", + "\n", + "$$\\lambda$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a5a8e9b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notes/7.ipynb b/notes/7.ipynb new file mode 100644 index 0000000..c2fed43 --- /dev/null +++ b/notes/7.ipynb @@ -0,0 +1,225 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "159a812b", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import sympy as sp\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "38083811", + "metadata": {}, + "source": [ + "# Interpolation\n", + "\n", + "Fitting\n", + "\n", + "* Exact Fit\n", + " * Interpolation\n", + " * Extrapolation\n", + "* Approximate fit?\n", + "\n", + "## Weierstrass Approximation Theorem\n", + "\n", + "> Suppose that $f$ is defined and continuous on $[a, \\,b]$.\n", + "> Foreach $\\epsilon > 0$, there exists a polynomial $P(x)$ defined on $[a,\\, b]$, with the property that\n", + "> $$|f(x)-P(x)| < \\epsilon,\\quad \\forall x \\in [a,\\,b]$$" + ] + }, + { + "cell_type": "markdown", + "id": "1f9175f6", + "metadata": {}, + "source": [ + "## Lagrange Interpolating Polynomial\n", + "\n", + "Think about $L_i(x)$\n", + "\n", + "$P_n(x) = \\sum_{i=0}^{n} {L_i(x)f_i}$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bbc6b078", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = sp.Symbol(\"x\")\n", + "f = [0, np.sin(1.0), np.sin(2.4), np.sin(3.2)]\n", + "p = [0, 1.0, 2.4, 3.2]\n", + "\n", + "L0 = (x - p[1]) / (p[0] - p[1]) * (x - p[2]) / (p[0] - p[2]) * (x - p[3]) / (p[0] - p[3])\n", + "L1 = (x - p[0]) / (p[1] - p[0]) * (x - p[2]) / (p[1] - p[2]) * (x - p[3]) / (p[1] - p[3])\n", + "L2 = (x - p[0]) / (p[2] - p[0]) * (x - p[1]) / (p[2] - p[1]) * (x - p[3]) / (p[2] - p[3])\n", + "L3 = (x - p[0]) / (p[3] - p[0]) * (x - p[1]) / (p[3] - p[1]) * (x - p[2]) / (p[3] - p[2])\n", + "\n", + "P = L0 * f[0] + L1 * f[1] + L2 * f[2] + L3 * f[3]\n", + "\n", + "l = np.linspace(-0.4, 3.6)\n", + "plt.plot(l, np.sin(l), color='blue', label=\"sin(x)\")\n", + "plt.scatter(p, f, color='blue')\n", + "plt.plot(l, [P.subs({x : t}) for t in l], color='red', label='lagrange polynomial')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2d80e723", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "224c1596", + "metadata": {}, + "source": [ + "## Differences\n", + "\n", + "### Divided Differences" + ] + }, + { + "cell_type": "markdown", + "id": "36c82e32", + "metadata": {}, + "source": [ + "## Newton's Forward Difference" + ] + }, + { + "cell_type": "markdown", + "id": "cc03cbcd", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "c2f87bb8", + "metadata": {}, + "source": [ + "## Spline Interpolation\n", + "\n", + "* linear spline\n", + "* quadratic spline\n", + "* cubic spline\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a02b146a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.array([0, 1, 2, 5])\n", + "y = np.array([3, 5, 2, 4])\n", + "\n", + "t = np.linspace(0, 1)\n", + "\n", + "spline1 = lambda x, i, t: x[i + 1] * (t) + x[i] * (1 - t)\n", + "\n", + "\n", + "def get_spline2s(x, y):\n", + " n = len(x) - 1\n", + "\n", + " A = np.zeros(n)\n", + " B = np.zeros(n)\n", + " C = np.zeros(n)\n", + "\n", + " dx = np.diff(x)\n", + " dy = np.diff(y)\n", + "\n", + " z = np.zeros(n + 1)\n", + " z[0] = 6\n", + " for i in range(n):\n", + " slope = dy[i] / dx[i]\n", + " z[i + 1] = 2 * slope - z[i]\n", + "\n", + " for i in range(n):\n", + " C[i] = y[i]\n", + " B[i] = z[i]\n", + " A[i] = (dy[i] - z[i] * dx[i]) / (dx[i] ** 2)\n", + "\n", + " return A, B, C\n", + "\n", + "def spline2(i, t, A, B, C, x_knots):\n", + " h_i = x_knots[i+1] - x_knots[i]\n", + " \n", + " x_val = x_knots[i] * (1 - t) + x_knots[i+1] * t\n", + " \n", + " dx_t = h_i * t\n", + " y_val = A[i] * dx_t**2 + B[i] * dx_t + C[i]\n", + " \n", + " return x_val, y_val\n", + "\n", + "A, B, C = get_spline2s(x, y)\n", + "\n", + "for i in range(len(x) - 1):\n", + " plt.plot(spline1(x, i, t), spline1(y, i, t), color=\"blue\")\n", + " plt.plot(spline2(i, t, A, B, C, x)[0], spline2(i, t, A, B, C, x)[1], color='orange')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d2a605c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "2025-02-Numerical (3.12.11)", + "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": 5 +} diff --git a/notes/8.ipynb b/notes/8.ipynb new file mode 100644 index 0000000..cb632b2 --- /dev/null +++ b/notes/8.ipynb @@ -0,0 +1,70 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "62ac3700", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(\"../modules\")\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "3d7375ae", + "metadata": {}, + "source": [ + "# Data Fitting\n", + "\n", + "It is approximate fit, which allows some errors depending on noise model.\n", + "\n", + "## Least-Square Data Fitting\n", + "\n", + "Given $N$ data points and a models has $M$ adjustable parameters.\n", + "\n", + "find $\\mathbf{a} = \\begin{bmatrix}a_1, a_2, \\cdots, a_M\\end{bmatrix}$ that minimizes $$S = \\sum_{i=1}^N{[y_i - y(x_i; \\mathbf{a})]^2}$$\n", + "\n", + "It is also equivalent to **maximum likelihood estimation** if $e_i$ is **independently distributed Gaussian**.\n", + "\n", + "\n", + "### Line Fitting\n", + "\n", + "$y = a + bx, \\quad e_i = y_i - (a + bx)$\n", + "\n", + "$S(a, b) = \\sum_{i = 1}^{N}e_i^2$\n", + "\n", + "$$\\begin{align*}\n", + "\\frac{\\partial S}{\\partial a} &= 2\\sum_{i = 1}^N [y_i-a-bx_i](-1) = 0\\\\\n", + "\\frac{\\partial S}{\\partial b} &= 2\\sum_{i = 1}^N [y_i =a - bx_i](-x_i) = 0\\\\\n", + "\\end{align*}$$\n", + "\n", + "$$\\begin{align*}\n", + "a\\sum 1 + b\\sum x_i &= \\sum y_i\\\\\n", + "a\\sum x_i + b \\sum x_i^2 &= \\sum x_iy_i\n", + "\\end{align*}$$\n", + "\n", + "$$\\therefore \\begin{bmatrix}\n", + "a \\\\ b\n", + "\\end{bmatrix} = \\begin{bmatrix}\n", + "\\sum 1 & \\sum x_i \\\\\n", + "\\sum x_i & \\sum x_i^2 \\\\\n", + "\\end{bmatrix}^{-1} \\begin{bmatrix}\n", + " \\sum y_i \\\\ \\sum x_i y_i\n", + "\\end{bmatrix}$$\n", + "\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pdf/L5_Sim.pdf b/pdf/L5_Sim.pdf new file mode 100644 index 0000000..7778474 Binary files /dev/null and b/pdf/L5_Sim.pdf differ diff --git a/pdf/L6_Eigen.pdf b/pdf/L6_Eigen.pdf new file mode 100644 index 0000000..97baffb Binary files /dev/null and b/pdf/L6_Eigen.pdf differ diff --git a/pdf/L7_Interpolation.pdf b/pdf/L7_Interpolation.pdf new file mode 100644 index 0000000..c82174f Binary files /dev/null and b/pdf/L7_Interpolation.pdf differ diff --git a/pdf/L8_DataFitting.pdf b/pdf/L8_DataFitting.pdf new file mode 100644 index 0000000..8f891cb Binary files /dev/null and b/pdf/L8_DataFitting.pdf differ diff --git a/pyproject.toml b/pyproject.toml index 14900c2..5288981 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,4 +8,6 @@ dependencies = [ "jupyter>=1.1.1", "matplotlib>=3.10.6", "numpy>=2.3.2", + "scipy", + "sympy>=1.14.0", ] diff --git a/uv.lock b/uv.lock index b86d2f6..2db0c5d 100644 --- a/uv.lock +++ b/uv.lock @@ -14,6 +14,8 @@ dependencies = [ { name = "jupyter" }, { name = "matplotlib" }, { name = "numpy" }, + { name = "scipy" }, + { name = "sympy" }, ] [package.metadata] @@ -21,6 +23,8 @@ requires-dist = [ { name = "jupyter", specifier = ">=1.1.1" }, { name = "matplotlib", specifier = ">=3.10.6" }, { name = "numpy", specifier = ">=2.3.2" }, + { name = "scipy" }, + { name = "sympy", specifier = ">=1.14.0" }, ] [[package]] @@ -1082,6 +1086,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, ] +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + [[package]] name = "nbclient" version = "0.10.2" @@ -1692,6 +1705,67 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/7d/97119da51cb1dd3f2f3c0805f155a3aa4a95fa44fe7d78ae15e69edf4f34/rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772", size = 230097, upload-time = "2025-08-27T12:15:03.961Z" }, ] +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + [[package]] name = "send2trash" version = "1.8.3" @@ -1751,6 +1825,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + [[package]] name = "terminado" version = "0.18.1"