From 588cc2c9e3a73d56e6b486042e42cef3afaa0197 Mon Sep 17 00:00:00 2001 From: Petr Karnakov Date: Tue, 9 Jan 2024 16:40:38 -0500 Subject: [PATCH] doc: upd with alabaster theme --- doc/.buildinfo | 4 + .../auto_examples_python.zip | Bin 22205 -> 23796 bytes .../plot_1d.ipynb | 4 +- .../fields.ipynb | 4 +- .../infer_constant_adv.ipynb | 2 +- .../plot_1d.py | 10 +- .../auto_examples_jupyter.zip | Bin 26919 -> 29536 bytes .../fields.py | 2 +- .../poisson.ipynb | 2 +- .../harmonic_oscillator.py | 44 + .../harmonic_oscillator.ipynb | 54 ++ ...716ccfb45e4bb9bd5a80d0c9cc97871344b62a.svg | 17 + ...a66331941f83e8be152ad2fcb91c9f1057715d.svg | 24 + ...2c8cda5f3cdc10ba0ffdc503312e546d210c61.svg | 24 + ...e4a0033de7f4df87acc17bcea0967c1494b0db.svg | 15 + ...34c789e8b1c2b72af933bb766e788c6d675136.svg | 30 + ...f30ebe40c40f3224a357783e2ffc5315274c34.svg | 15 + .../sphx_glr_harmonic_oscillator_thumb.png | Bin 0 -> 26794 bytes doc/_images/sphx_glr_plot_1d_001.png | Bin 20860 -> 19786 bytes doc/_images/sphx_glr_plot_1d_thumb.png | Bin 14192 -> 15692 bytes .../auto_examples/basic/fields.rst.txt | 3 +- .../basic/harmonic_oscillator.rst.txt | 79 ++ .../auto_examples/basic/index.rst.txt | 22 +- doc/_sources/auto_examples/index.rst.txt | 23 +- .../infer_constant/infer_constant_adv.rst.txt | 1 + .../auto_examples/poisson/index.rst.txt | 2 +- .../auto_examples/poisson/plot_1d.rst.txt | 11 +- .../auto_examples/poisson/poisson.rst.txt | 1 + .../poisson/sg_execution_times.rst.txt | 4 +- doc/_static/alabaster.css | 703 ++++++++++++++ doc/_static/basic.css | 907 ++++++++++++++++-- doc/_static/custom.css | 1 + doc/_static/doctools.js | 156 +++ doc/_static/documentation_options.js | 13 + doc/_static/file.png | Bin 0 -> 286 bytes doc/_static/language_data.js | 14 + doc/_static/minus.png | Bin 0 -> 90 bytes doc/_static/plus.png | Bin 0 -> 90 bytes doc/_static/searchtools.js | 574 +++++++++++ doc/_static/sphinx_highlight.js | 154 +++ doc/auto_examples/basic/fields.html | 126 ++- .../basic/harmonic_oscillator.html | 169 ++++ doc/auto_examples/basic/index.html | 120 ++- doc/auto_examples/index.html | 129 ++- doc/auto_examples/infer_constant/index.html | 111 ++- .../infer_constant/infer_constant_adv.html | 126 ++- doc/auto_examples/poisson/index.html | 113 ++- doc/auto_examples/poisson/plot_1d.html | 131 ++- doc/auto_examples/poisson/poisson.html | 124 ++- .../poisson/sg_execution_times.html | 111 ++- doc/genindex.html | 105 ++ doc/index.html | 109 ++- doc/objects.inv | Bin 593 -> 653 bytes 53 files changed, 4183 insertions(+), 210 deletions(-) create mode 100644 doc/.buildinfo create mode 100644 doc/_downloads/e2351dd27667554a422ac2d62b6aca00/harmonic_oscillator.py create mode 100644 doc/_downloads/e30c667c9801d5417694b836d4b76169/harmonic_oscillator.ipynb create mode 100644 doc/_images/math/0f716ccfb45e4bb9bd5a80d0c9cc97871344b62a.svg create mode 100644 doc/_images/math/0fa66331941f83e8be152ad2fcb91c9f1057715d.svg create mode 100644 doc/_images/math/232c8cda5f3cdc10ba0ffdc503312e546d210c61.svg create mode 100644 doc/_images/math/27e4a0033de7f4df87acc17bcea0967c1494b0db.svg create mode 100644 doc/_images/math/3934c789e8b1c2b72af933bb766e788c6d675136.svg create mode 100644 doc/_images/math/ddf30ebe40c40f3224a357783e2ffc5315274c34.svg create mode 100644 doc/_images/sphx_glr_harmonic_oscillator_thumb.png create mode 100644 doc/_sources/auto_examples/basic/harmonic_oscillator.rst.txt create mode 100644 doc/_static/alabaster.css create mode 100644 doc/_static/custom.css create mode 100644 doc/_static/doctools.js create mode 100644 doc/_static/documentation_options.js create mode 100644 doc/_static/file.png create mode 100644 doc/_static/language_data.js create mode 100644 doc/_static/minus.png create mode 100644 doc/_static/plus.png create mode 100644 doc/_static/searchtools.js create mode 100644 doc/_static/sphinx_highlight.js create mode 100644 doc/auto_examples/basic/harmonic_oscillator.html create mode 100644 doc/genindex.html diff --git a/doc/.buildinfo b/doc/.buildinfo new file mode 100644 index 0000000..56eb79c --- /dev/null +++ b/doc/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 838cceab9bf6970cab9bdd64855333e1 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/doc/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip index 611cf4a3ed81537b43e6cf315273c395d2f494a9..2e81542a85eec2fe8f968104b91c617a5b6f1def 100644 GIT binary patch delta 1873 zcmaJ?O>f*p81~X6m8KFzZ8%VI7(~mC!)D@jX^>Xzp;CoFMctrAC{@xrQ+qbHYLDIV zxa*}v7UDzVi1x&Z3*v%uKotih_zC=gO5Bh*&?`p{yyK5`Hndn8d*=Ok-j8`^{OfV& z@1HwwZ{Ikxv}WjsY-yeVZWXUk}cok&#SQ@ySK9f-_0@sOCHwZ(fVmZU3i-+BA z7rj^OaH~VZ|2|0DA{0bPEEN`6luR*8u}B&bV7mUof(lWZh}mzKUn^?Qh$$Z-kB?8p zBVG?rtRBwI0mAT1@DOV|nm&+<#_@M zybiGNDk`BHr$oEI2|-HDW)-QHR~VA3ObR@OdMmGpiHwC#%DG4S_7$@hr(8Ku3ClwG zs%gSWWj+pLrmjG;WnGYvO|7DbZHrncpXV0_B2Adf2~^(i;j5Nq?hShQW-Ry}q|0bG zq-_w&9S>>-ZN6s>Y-`ZBz_^i3TUqWT{uK5;t>YCwJr&Tt+Qy@jKga^fQ|C}J&mlW9 z<0gt?kB8td1ib}%E>yrm0;>-K!I>nGb$`q3Y5fipKB=aSa%(|bJWFkwC{9!m1s`)+ z=jqc@La%u&B4q+JVUk5$ahd7}p&a)41~eD?)D#C!uyDfQJ}2|SO*D=r4sal_WTH6a z1X^s>6q|>o5IQcaCN+Wl1X3v@pTyF<^zz<3OO~lv_loKlnfeLPw`q9~>vVe9m7FQA z!4tn2Rz0n7?B@aL5dVvF0;b(yFSmiwHZWTA-ODw-Etr)r$PG?SfpHk8ZNnnY1SwCG z&Zz1%)T_y5!eOf@W$GgbV9@Zl0Iog^+Ov*5Kav`o-ed0l36oyk$+pL-;yVdQlTgtl zj1_?@r;E$F;U@LCVs1&6?nbw=N&R>N-tA5II^1;M-u&vXug`CF-u?0YZ&sHcPR!lM zf36PJmOjz5OP8ORFJAlH+x9nDubziS@>NyZ3G zd@ea2=!Q~DU1WmgokSHY{BvXL-q`V69f=$SwW`LrH^lo zK3plD^&cpI5b*l$Q$2g`Ux6mm?HipJ*3MLal%~%=tQv+MFEubF(uL&)X&ms-OKWG+ zcS9F+VWBHtMyJHw%?CIsd>;5#D delta 213 zcmeyelX34_Mxg+2W)=|!5RjUg5&n&>EMu}Ns~Kb3<`~wQ0xTf0%|Au0L|9}%EOV`! zntUL!jBdl~QZ@#LQntx*A^MXGv{)twg@|o-3=LpYfSI#efPn#o`N5_`h%Jo_43mFH z%YqG_EE6NavZe8cz+{UUBd`UN^S~lvs*}576u<@{EMi~~LNVyG-{eyl diff --git a/doc/_downloads/1d585bf137ffd9906e08a8ecc825a674/plot_1d.ipynb b/doc/_downloads/1d585bf137ffd9906e08a8ecc825a674/plot_1d.ipynb index ed3ac93..49e8de8 100644 --- a/doc/_downloads/1d585bf137ffd9906e08a8ecc825a674/plot_1d.ipynb +++ b/doc/_downloads/1d585bf137ffd9906e08a8ecc825a674/plot_1d.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# 1D Poisson\n" + "\n# 1D Poisson\n\nThis example solves the Poisson equation in 1D\n\n\\begin{align}\\frac{\\partial^2 u}{\\partial x^2} = f\\end{align}\n\nwhere $f=\\frac{\\partial^2 u_\\mathrm{ref}}{\\partial x^2}$ and\n$u_\\mathrm{ref}$ is a reference solution.\n" ] }, { @@ -46,7 +46,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/doc/_downloads/24eaf8dd253be2821d2f6eb64c3d9de4/fields.ipynb b/doc/_downloads/24eaf8dd253be2821d2f6eb64c3d9de4/fields.ipynb index cf7bf84..bbb1977 100644 --- a/doc/_downloads/24eaf8dd253be2821d2f6eb64c3d9de4/fields.ipynb +++ b/doc/_downloads/24eaf8dd253be2821d2f6eb64c3d9de4/fields.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# field\n" + "\n# Field\n" ] }, { @@ -46,7 +46,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/doc/_downloads/319ebb28fc2a00a84a4950112fc7bbca/infer_constant_adv.ipynb b/doc/_downloads/319ebb28fc2a00a84a4950112fc7bbca/infer_constant_adv.ipynb index eaef38a..539f3b9 100644 --- a/doc/_downloads/319ebb28fc2a00a84a4950112fc7bbca/infer_constant_adv.ipynb +++ b/doc/_downloads/319ebb28fc2a00a84a4950112fc7bbca/infer_constant_adv.ipynb @@ -46,7 +46,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/doc/_downloads/42f8fd27774caacd783cf240e9bb5909/plot_1d.py b/doc/_downloads/42f8fd27774caacd783cf240e9bb5909/plot_1d.py index 39f32f7..0d16d06 100644 --- a/doc/_downloads/42f8fd27774caacd783cf240e9bb5909/plot_1d.py +++ b/doc/_downloads/42f8fd27774caacd783cf240e9bb5909/plot_1d.py @@ -1,7 +1,15 @@ #!/usr/bin/env python3 -""" +r""" 1D Poisson ========== + +This example solves the Poisson equation in 1D + +.. math:: + \frac{\partial^2 u}{\partial x^2} = f + +where :math:`f=\frac{\partial^2 u_\mathrm{ref}}{\partial x^2}` and +:math:`u_\mathrm{ref}` is a reference solution. """ import odil diff --git a/doc/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/doc/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip index db0b2757f212e6af3ca485f2889c12cb395ac5b3..8457e384c6a459969455748bad4a4ab791d60ed0 100644 GIT binary patch delta 1892 zcmah~-)kI29N%jbNeBq7Nh~Njnn-uAm+9W7Ng)ul_yaW}fd&b7(_^wbdpmS@b~C%z z+cSovAbs-feDDt__~3(-6MXSSU-G06g70F%_k#H1i{J15xNXt~_n5hv?~l*-=gfTb zTjP(v8rQeC&QHy2_`RMPyTAYa$)n>LO~dgj(Dqp(oU1-lVI+mqi4sQy0ZSwGu=#1@ zh4)K3sp+G~i$9MtbN*$JaeP~fFpgA8@*S0uu!KlC`q5k(mYk5KAZAOKdr!dVZj1EI z7RihaTN3#CWRsvMO%7D5_swS0A}hp&Kcf(ceNl<9lu1ipL5Pw$09N4w&tl+^CK+Z1 z%mvYj5*_ugfSD%PBv%VtCA|buJnbn-2I#FV3(b(p9t%1N=dRwiRzb3$Cp_&yM64IU ze>#Y{UeLWDV(BXSJj^2mzbp!IS|&AZnN8dbgiK=Qa2l!>XG;vH zPI;XxKkkg1E_9tmQic1wn-H~=n2J>PFFFvqwlC5 zhakepDL%oGcG%2k3U0=3!ZE0|yT=*YPyMK3f7}MbR9IX9|wL6?&Q{UxC#w)panghCw>T-ZxQsV zMI6Oh$`L>IH_Ox(K-O7EXk${r|HG*Z?PeBqxrP0YhrrFS=S^7U6S!AI7eq;&w~#Zb z7j$&0NI3+Joo2uxEZWP!qX=k_`D=hz9uHJ4t=C5t(do^7=G^HshhF1d1qZ-8UMqN8&mBzT_0Uoc=N&%Txj3l|MlC&1x>?oarBzM z@X*|8Our|1;Eo?J&Naqgof}-7sLb5$8@sFHcdw0i7w%uG$)5vx_N{qmY|uw^LVo`3 zFO1#e*Cz`aV~@OP0OO zXCZWK8}CmQ9xCn~oyJ=xOuDvQ?wu4{CJ+iEpaIa*$;0WP?-cL(@zcR^NV;CV6NzqU|;}Ybrf}OqLXJAnJU2C z^jnXC0fd3(!NHbBalOeOij;j(U5Kv8HI{*)AV0IXI6qInASb^h-Y`Wkv!F6BDZrbR R4P+P#5K1#LFnmh~@c<$=Q`Z0h diff --git a/doc/_downloads/a059939c07979526d721d26d4ede54b1/fields.py b/doc/_downloads/a059939c07979526d721d26d4ede54b1/fields.py index b129b81..b02c98d 100644 --- a/doc/_downloads/a059939c07979526d721d26d4ede54b1/fields.py +++ b/doc/_downloads/a059939c07979526d721d26d4ede54b1/fields.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -field +Field ===== """ diff --git a/doc/_downloads/ba280f66aff03682481a6b490d9023f6/poisson.ipynb b/doc/_downloads/ba280f66aff03682481a6b490d9023f6/poisson.ipynb index e917276..a9cacd0 100644 --- a/doc/_downloads/ba280f66aff03682481a6b490d9023f6/poisson.ipynb +++ b/doc/_downloads/ba280f66aff03682481a6b490d9023f6/poisson.ipynb @@ -46,7 +46,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/doc/_downloads/e2351dd27667554a422ac2d62b6aca00/harmonic_oscillator.py b/doc/_downloads/e2351dd27667554a422ac2d62b6aca00/harmonic_oscillator.py new file mode 100644 index 0000000..d42e788 --- /dev/null +++ b/doc/_downloads/e2351dd27667554a422ac2d62b6aca00/harmonic_oscillator.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +''' +Harmonic oscillator +=================== +''' + + +import numpy as np +import torch +import torch.nn as nn +import matplotlib.pyplot as plt +import math + +def oscillator(d, w0, x): + w = math.sqrt(w0**2 - d**2) + phi = math.atan2(-d, w) + y = torch.exp(-d * x) * torch.cos(phi + w * x) / math.cos(phi) + return y + + +torch.manual_seed(123) +torch.set_default_dtype(torch.float32) +d, w0 = 2.0, 20.0 +x = torch.linspace(0, 1, 500)[:, None] +y = oscillator(d, w0, x) +x_data = x[0:20:10] +y_data = y[0:20:10] +x_physics = torch.linspace(0, 1, 25)[:, None].requires_grad_(True) +model = nn.Sequential(nn.Linear(1, 16), nn.Tanh(), nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 1)) +optimizer = torch.optim.Adam(model.parameters(), lr=1e-2) +ones = torch.ones_like(x_physics) +for i in range(5000): + optimizer.zero_grad() + yhp = model(x_physics) + dx, = torch.autograd.grad(yhp, x_physics, ones, create_graph=True) + dx2, = torch.autograd.grad(dx, x_physics, ones, create_graph=True) + physics = dx2 + 2 * d * dx + w0 * w0 * yhp + loss = torch.mean( + (model(x_data) - y_data)**2) + 1e-4 * torch.mean(physics**2) + loss.backward() + optimizer.step() +plt.plot(x, y) +plt.plot(x, model(x).detach(), '-') +plt.show() diff --git a/doc/_downloads/e30c667c9801d5417694b836d4b76169/harmonic_oscillator.ipynb b/doc/_downloads/e30c667c9801d5417694b836d4b76169/harmonic_oscillator.ipynb new file mode 100644 index 0000000..8df4291 --- /dev/null +++ b/doc/_downloads/e30c667c9801d5417694b836d4b76169/harmonic_oscillator.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%pip install -q git+https://github.com/cselab/odil" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Harmonic oscillator\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\nimport torch\nimport torch.nn as nn\nimport matplotlib.pyplot as plt\nimport math\n\ndef oscillator(d, w0, x):\n w = math.sqrt(w0**2 - d**2)\n phi = math.atan2(-d, w)\n y = torch.exp(-d * x) * torch.cos(phi + w * x) / math.cos(phi)\n return y\n\n\ntorch.manual_seed(123)\ntorch.set_default_dtype(torch.float32)\nd, w0 = 2.0, 20.0\nx = torch.linspace(0, 1, 500)[:, None]\ny = oscillator(d, w0, x)\nx_data = x[0:20:10]\ny_data = y[0:20:10]\nx_physics = torch.linspace(0, 1, 25)[:, None].requires_grad_(True)\nmodel = nn.Sequential(nn.Linear(1, 16), nn.Tanh(), nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 1))\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-2)\nones = torch.ones_like(x_physics)\nfor i in range(5000):\n optimizer.zero_grad()\n yhp = model(x_physics)\n dx, = torch.autograd.grad(yhp, x_physics, ones, create_graph=True)\n dx2, = torch.autograd.grad(dx, x_physics, ones, create_graph=True)\n physics = dx2 + 2 * d * dx + w0 * w0 * yhp\n loss = torch.mean(\n (model(x_data) - y_data)**2) + 1e-4 * torch.mean(physics**2)\n loss.backward()\n optimizer.step()\nplt.plot(x, y)\nplt.plot(x, model(x).detach(), '-')\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/doc/_images/math/0f716ccfb45e4bb9bd5a80d0c9cc97871344b62a.svg b/doc/_images/math/0f716ccfb45e4bb9bd5a80d0c9cc97871344b62a.svg new file mode 100644 index 0000000..f134961 --- /dev/null +++ b/doc/_images/math/0f716ccfb45e4bb9bd5a80d0c9cc97871344b62a.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/math/0fa66331941f83e8be152ad2fcb91c9f1057715d.svg b/doc/_images/math/0fa66331941f83e8be152ad2fcb91c9f1057715d.svg new file mode 100644 index 0000000..b7875a7 --- /dev/null +++ b/doc/_images/math/0fa66331941f83e8be152ad2fcb91c9f1057715d.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/math/232c8cda5f3cdc10ba0ffdc503312e546d210c61.svg b/doc/_images/math/232c8cda5f3cdc10ba0ffdc503312e546d210c61.svg new file mode 100644 index 0000000..b62d98d --- /dev/null +++ b/doc/_images/math/232c8cda5f3cdc10ba0ffdc503312e546d210c61.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/math/27e4a0033de7f4df87acc17bcea0967c1494b0db.svg b/doc/_images/math/27e4a0033de7f4df87acc17bcea0967c1494b0db.svg new file mode 100644 index 0000000..c67f4eb --- /dev/null +++ b/doc/_images/math/27e4a0033de7f4df87acc17bcea0967c1494b0db.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/math/3934c789e8b1c2b72af933bb766e788c6d675136.svg b/doc/_images/math/3934c789e8b1c2b72af933bb766e788c6d675136.svg new file mode 100644 index 0000000..18ed908 --- /dev/null +++ b/doc/_images/math/3934c789e8b1c2b72af933bb766e788c6d675136.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/math/ddf30ebe40c40f3224a357783e2ffc5315274c34.svg b/doc/_images/math/ddf30ebe40c40f3224a357783e2ffc5315274c34.svg new file mode 100644 index 0000000..1f39ea9 --- /dev/null +++ b/doc/_images/math/ddf30ebe40c40f3224a357783e2ffc5315274c34.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/_images/sphx_glr_harmonic_oscillator_thumb.png b/doc/_images/sphx_glr_harmonic_oscillator_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/doc/_images/sphx_glr_plot_1d_001.png b/doc/_images/sphx_glr_plot_1d_001.png index 74a5422240a21a009d48e900c0e92a009118521f..1b643bcc2d22a0178fd076b2b87e6e13e186b511 100644 GIT binary patch literal 19786 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 diff --git a/doc/_images/sphx_glr_plot_1d_thumb.png b/doc/_images/sphx_glr_plot_1d_thumb.png index 7cff57d5446bd8d05c92cbab2e1225c4947acddb..46dd8efd0a96e053a159c814ab83dadb3ad39cc0 100644 GIT binary patch literal 15692 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 G|Gxme40kaA literal 14192 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 bR|M~Y7pWe` .. raw:: html + Open In Colab diff --git a/doc/_sources/auto_examples/basic/harmonic_oscillator.rst.txt b/doc/_sources/auto_examples/basic/harmonic_oscillator.rst.txt new file mode 100644 index 0000000..7c3d387 --- /dev/null +++ b/doc/_sources/auto_examples/basic/harmonic_oscillator.rst.txt @@ -0,0 +1,79 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/basic/harmonic_oscillator.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_basic_harmonic_oscillator.py: + + +Harmonic oscillator +=================== + +.. GENERATED FROM PYTHON SOURCE LINES 6-45 + +.. code-block:: default + + + + import numpy as np + import torch + import torch.nn as nn + import matplotlib.pyplot as plt + import math + + def oscillator(d, w0, x): + w = math.sqrt(w0**2 - d**2) + phi = math.atan2(-d, w) + y = torch.exp(-d * x) * torch.cos(phi + w * x) / math.cos(phi) + return y + + + torch.manual_seed(123) + torch.set_default_dtype(torch.float32) + d, w0 = 2.0, 20.0 + x = torch.linspace(0, 1, 500)[:, None] + y = oscillator(d, w0, x) + x_data = x[0:20:10] + y_data = y[0:20:10] + x_physics = torch.linspace(0, 1, 25)[:, None].requires_grad_(True) + model = nn.Sequential(nn.Linear(1, 16), nn.Tanh(), nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 1)) + optimizer = torch.optim.Adam(model.parameters(), lr=1e-2) + ones = torch.ones_like(x_physics) + for i in range(5000): + optimizer.zero_grad() + yhp = model(x_physics) + dx, = torch.autograd.grad(yhp, x_physics, ones, create_graph=True) + dx2, = torch.autograd.grad(dx, x_physics, ones, create_graph=True) + physics = dx2 + 2 * d * dx + w0 * w0 * yhp + loss = torch.mean( + (model(x_data) - y_data)**2) + 1e-4 * torch.mean(physics**2) + loss.backward() + optimizer.step() + plt.plot(x, y) + plt.plot(x, model(x).detach(), '-') + plt.show() + + +.. _sphx_glr_download_auto_examples_basic_harmonic_oscillator.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: harmonic_oscillator.py ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: harmonic_oscillator.ipynb ` + + .. raw:: html + + + Open In Colab + diff --git a/doc/_sources/auto_examples/basic/index.rst.txt b/doc/_sources/auto_examples/basic/index.rst.txt index 7a848f0..c9e4ce6 100644 --- a/doc/_sources/auto_examples/basic/index.rst.txt +++ b/doc/_sources/auto_examples/basic/index.rst.txt @@ -12,7 +12,24 @@ .. raw:: html -

+
+ +.. only:: html + + .. image:: /auto_examples/basic/images/thumb/sphx_glr_harmonic_oscillator_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_basic_harmonic_oscillator.py` + +.. raw:: html + +
Harmonic oscillator
+
+ + +.. raw:: html + +
.. only:: html @@ -23,7 +40,7 @@ .. raw:: html -
field
+
Field
@@ -35,5 +52,6 @@ .. toctree:: :hidden: + /auto_examples/basic/harmonic_oscillator /auto_examples/basic/fields diff --git a/doc/_sources/auto_examples/index.rst.txt b/doc/_sources/auto_examples/index.rst.txt index 9bf62e2..783cd55 100644 --- a/doc/_sources/auto_examples/index.rst.txt +++ b/doc/_sources/auto_examples/index.rst.txt @@ -25,7 +25,24 @@ Below is a gallery of examples .. raw:: html -
+
+ +.. only:: html + + .. image:: /auto_examples/basic/images/thumb/sphx_glr_harmonic_oscillator_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_basic_harmonic_oscillator.py` + +.. raw:: html + +
Harmonic oscillator
+
+ + +.. raw:: html + +
.. only:: html @@ -36,7 +53,7 @@ Below is a gallery of examples .. raw:: html -
field
+
Field
@@ -83,7 +100,7 @@ Below is a gallery of examples .. raw:: html -
+
.. only:: html diff --git a/doc/_sources/auto_examples/infer_constant/infer_constant_adv.rst.txt b/doc/_sources/auto_examples/infer_constant/infer_constant_adv.rst.txt index 90abb91..a58856c 100644 --- a/doc/_sources/auto_examples/infer_constant/infer_constant_adv.rst.txt +++ b/doc/_sources/auto_examples/infer_constant/infer_constant_adv.rst.txt @@ -216,6 +216,7 @@ infer_constant_adv :download:`Download Jupyter notebook: infer_constant_adv.ipynb ` .. raw:: html + Open In Colab diff --git a/doc/_sources/auto_examples/poisson/index.rst.txt b/doc/_sources/auto_examples/poisson/index.rst.txt index 901ee59..a0e51cc 100644 --- a/doc/_sources/auto_examples/poisson/index.rst.txt +++ b/doc/_sources/auto_examples/poisson/index.rst.txt @@ -12,7 +12,7 @@ .. raw:: html -
+
.. only:: html diff --git a/doc/_sources/auto_examples/poisson/plot_1d.rst.txt b/doc/_sources/auto_examples/poisson/plot_1d.rst.txt index fa68096..dbc4f1a 100644 --- a/doc/_sources/auto_examples/poisson/plot_1d.rst.txt +++ b/doc/_sources/auto_examples/poisson/plot_1d.rst.txt @@ -13,7 +13,15 @@ 1D Poisson ========== -.. GENERATED FROM PYTHON SOURCE LINES 6-61 +This example solves the Poisson equation in 1D + +.. math:: + \frac{\partial^2 u}{\partial x^2} = f + +where :math:`f=\frac{\partial^2 u_\mathrm{ref}}{\partial x^2}` and +:math:`u_\mathrm{ref}` is a reference solution. + +.. GENERATED FROM PYTHON SOURCE LINES 14-69 @@ -100,6 +108,7 @@ :download:`Download Jupyter notebook: plot_1d.ipynb ` .. raw:: html + Open In Colab diff --git a/doc/_sources/auto_examples/poisson/poisson.rst.txt b/doc/_sources/auto_examples/poisson/poisson.rst.txt index a78b3ef..1786ae5 100644 --- a/doc/_sources/auto_examples/poisson/poisson.rst.txt +++ b/doc/_sources/auto_examples/poisson/poisson.rst.txt @@ -375,6 +375,7 @@ poisson :download:`Download Jupyter notebook: poisson.ipynb ` .. raw:: html + Open In Colab diff --git a/doc/_sources/auto_examples/poisson/sg_execution_times.rst.txt b/doc/_sources/auto_examples/poisson/sg_execution_times.rst.txt index cf21512..5f25839 100644 --- a/doc/_sources/auto_examples/poisson/sg_execution_times.rst.txt +++ b/doc/_sources/auto_examples/poisson/sg_execution_times.rst.txt @@ -6,10 +6,10 @@ Computation times ================= -**00:03.583** total execution time for **auto_examples_poisson** files: +**00:04.747** total execution time for **auto_examples_poisson** files: +-------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_poisson_plot_1d.py` (``plot_1d.py``) | 00:03.583 | 0.0 MB | +| :ref:`sphx_glr_auto_examples_poisson_plot_1d.py` (``plot_1d.py``) | 00:04.747 | 0.0 MB | +-------------------------------------------------------------------+-----------+--------+ | :ref:`sphx_glr_auto_examples_poisson_poisson.py` (``poisson.py``) | 00:00.000 | 0.0 MB | +-------------------------------------------------------------------+-----------+--------+ diff --git a/doc/_static/alabaster.css b/doc/_static/alabaster.css new file mode 100644 index 0000000..517d0b2 --- /dev/null +++ b/doc/_static/alabaster.css @@ -0,0 +1,703 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/doc/_static/basic.css b/doc/_static/basic.css index 2444bf5..30fee9d 100644 --- a/doc/_static/basic.css +++ b/doc/_static/basic.css @@ -1,131 +1,244 @@ -body { - margin: auto; - max-width: 44em; - font-family: Verdana, sans-serif; +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; } -ol.simple p, ul.simple p { - margin-bottom: 0; +div.section::after { + display: block; + content: ''; + clear: left; } -ol.simple > li:not(:first-child) > p, ul.simple > li:not(:first-child) > p { +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { margin-top: 0; + margin-bottom: 0; } -a { - color: #0082BB; +div.sphinxsidebar form { + margin-top: 10px; } -h1, h2, h3, h4, h5 { - color: #009ADE; - padding-bottom: 2px; - border-bottom: 1px solid black; +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; } -pre { - border: 1px dotted gray; +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; padding: 0.25em; + box-sizing: border-box; } -img.math { - vertical-align: middle; +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; } -img.align-center { - display: block; - margin-left: auto; - margin-right: auto; + +img { + border: 0; + max-width: 100%; } -div.body div.math p { - text-align: center; +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; } -span.eqno { - float: right; +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; } -span.eqno a.headerlink { - position: absolute; - z-index: 1; +ul.search li a { + font-weight: bold; } -div.math:hover a.headerlink { - visibility: visible; +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; } -table.align-center { +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; margin-left: auto; margin-right: auto; } -dt code { - font-weight: bold; +table.contentstable p.biglink { + line-height: 150%; } -dl.citation > dt { - float: left; - margin-right: 0.5em; +a.biglink { + font-size: 1.3em; } -dl.citation > dd { - margin-bottom: 0em; +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; } -dl.citation > dd:after { - content: ""; - clear: both; +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; } -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; +table.indextable td { + text-align: left; + vertical-align: top; } -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; } -dl.field-list > dt:after { - content: ":"; +table.indextable > tbody > tr > td > ul { + padding-left: 0em; } -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; +table.indextable tr.pcap { + height: 10px; } -dl { - margin-bottom: 15px; +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; } -a.headerlink { - visibility: hidden; +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; } -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; border-collapse: collapse; } -table.align-default { - margin-left: auto; - margin-right: auto; +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; } -body div.math p { - text-align: center; +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; } -div.math:hover a.headerlink { - visibility: visible; +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -141,6 +254,174 @@ div.code-block-caption:hover > a.headerlink { visibility: visible; } +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; @@ -149,6 +430,20 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + th > :first-child, td > :first-child { margin-top: 0px; @@ -158,3 +453,473 @@ th > :last-child, td > :last-child { margin-bottom: 0px; } + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/doc/_static/custom.css b/doc/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/doc/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/doc/_static/doctools.js b/doc/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/doc/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/doc/_static/documentation_options.js b/doc/_static/documentation_options.js new file mode 100644 index 0000000..7e4c114 --- /dev/null +++ b/doc/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/doc/_static/file.png b/doc/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/doc/_static/language_data.js b/doc/_static/language_data.js new file mode 100644 index 0000000..4b9549b --- /dev/null +++ b/doc/_static/language_data.js @@ -0,0 +1,14 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ; + diff --git a/doc/_static/minus.png b/doc/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/doc/_static/plus.png b/doc/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/doc/_static/searchtools.js b/doc/_static/searchtools.js new file mode 100644 index 0000000..7918c3f --- /dev/null +++ b/doc/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/doc/_static/sphinx_highlight.js b/doc/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/doc/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/doc/auto_examples/basic/fields.html b/doc/auto_examples/basic/fields.html index c39ce22..aa3e1f0 100644 --- a/doc/auto_examples/basic/fields.html +++ b/doc/auto_examples/basic/fields.html @@ -1,18 +1,40 @@ - + + - - - - ODIL documentation - - - - - + + + 1.2. Field — Python documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
-

1.1. field

+

1.2. Field

import argparse
 import numpy as np
 
@@ -161,9 +183,89 @@
 
-
+ + Open In Colab +
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/doc/auto_examples/basic/harmonic_oscillator.html b/doc/auto_examples/basic/harmonic_oscillator.html new file mode 100644 index 0000000..d93a0ac --- /dev/null +++ b/doc/auto_examples/basic/harmonic_oscillator.html @@ -0,0 +1,169 @@ + + + + + + + + 1.1. Harmonic oscillator — Python documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

1.1. Harmonic oscillator

+
import numpy as np
+import torch
+import torch.nn as nn
+import matplotlib.pyplot as plt
+import math
+
+def oscillator(d, w0, x):
+    w = math.sqrt(w0**2 - d**2)
+    phi = math.atan2(-d, w)
+    y = torch.exp(-d * x) * torch.cos(phi + w * x) / math.cos(phi)
+    return y
+
+
+torch.manual_seed(123)
+torch.set_default_dtype(torch.float32)
+d, w0 = 2.0, 20.0
+x = torch.linspace(0, 1, 500)[:, None]
+y = oscillator(d, w0, x)
+x_data = x[0:20:10]
+y_data = y[0:20:10]
+x_physics = torch.linspace(0, 1, 25)[:, None].requires_grad_(True)
+model = nn.Sequential(nn.Linear(1, 16), nn.Tanh(), nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 1))
+optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)
+ones = torch.ones_like(x_physics)
+for i in range(5000):
+    optimizer.zero_grad()
+    yhp = model(x_physics)
+    dx, = torch.autograd.grad(yhp, x_physics, ones, create_graph=True)
+    dx2, = torch.autograd.grad(dx, x_physics, ones, create_graph=True)
+    physics = dx2 + 2 * d * dx + w0 * w0 * yhp
+    loss = torch.mean(
+        (model(x_data) - y_data)**2) + 1e-4 * torch.mean(physics**2)
+    loss.backward()
+    optimizer.step()
+plt.plot(x, y)
+plt.plot(x, model(x).detach(), '-')
+plt.show()
+
+
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/doc/auto_examples/basic/index.html b/doc/auto_examples/basic/index.html index d9759c6..2315ca0 100644 --- a/doc/auto_examples/basic/index.html +++ b/doc/auto_examples/basic/index.html @@ -1,22 +1,116 @@ - + + - - - - ODIL documentation - - - - - -
-

field

-
field
+ + + <no title> — Python documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Harmonic oscillator

+
Harmonic oscillator
+
+

Field

+
Field
+
+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/doc/auto_examples/index.html b/doc/auto_examples/index.html index 63e4cbc..a205b02 100644 --- a/doc/auto_examples/index.html +++ b/doc/auto_examples/index.html @@ -1,26 +1,51 @@ - + + - - - - ODIL documentation - - - - - + + + 1. Gallery — Python documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+