splinekit 0.2.5__tar.gz → 0.2.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {splinekit-0.2.5 → splinekit-0.2.7}/.github/workflows/release.yml +0 -35
- splinekit-0.2.7/.virtual_documents/dev/Jupyter/spline_plot.ipynb +323 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/PKG-INFO +9 -1
- {splinekit-0.2.5 → splinekit-0.2.7}/README.md +8 -0
- splinekit-0.2.7/dev/Accelerated/dispatch.sh +7 -0
- {splinekit-0.2.5 → splinekit-0.2.7/dev/Accelerated}/pyproject.toml +1 -3
- splinekit-0.2.7/dev/Accelerated/release.yml +105 -0
- {splinekit-0.2.5/src/splinekit → splinekit-0.2.7/dev/Accelerated}/spline_padding.py +2 -2
- splinekit-0.2.7/dev/Jupyter/bspline/members/bspline_member.ipynb +109 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/stability}/bspline_numeric_stability.ipynb +6 -3
- splinekit-0.2.7/dev/Jupyter/padding/change-basis/padding_bases.ipynb +222 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/padding/padding}/padding_data.ipynb +6 -2
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/padding/padding}/padding_speed.ipynb +2 -1
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/bounds}/spline_bounds.ipynb +4 -1
- splinekit-0.2.7/dev/Jupyter/periodic-spline/eval/spline_at_array.ipynb +149 -0
- splinekit-0.2.7/dev/Jupyter/periodic-spline/eval/spline_at_scalar.ipynb +162 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/eval}/spline_evaluation_speed.ipynb +8 -4
- splinekit-0.2.7/dev/Jupyter/periodic-spline/fourier/spline_fourier.ipynb +186 -0
- splinekit-0.2.7/dev/Jupyter/periodic-spline/ops/spline_simple_ops.ipynb +192 -0
- splinekit-0.2.7/dev/Jupyter/periodic-spline/plot/spline_plot.ipynb +562 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/poly}/spline_polynomials.ipynb +5 -2
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/random-1d}/spline_random_1d.ipynb +5 -2
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/random-2d}/spline_random_2d.ipynb +7 -4
- splinekit-0.2.7/dev/Jupyter/periodic-spline/stats/spline_stats.ipynb +218 -0
- splinekit-0.2.7/dev/PurePython/dispatch.sh +10 -0
- splinekit-0.2.7/dev/PurePython/pyproject.toml +97 -0
- splinekit-0.2.7/dev/PurePython/release.yml +36 -0
- {splinekit-0.2.5/dev/PythonSrc → splinekit-0.2.7/dev}/PurePython/spline_padding.py +37 -10
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_bases.rst +20 -21
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_inverse.rst +2 -2
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_m_scale.rst +3 -2
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_members.rst +4 -5
- splinekit-0.2.7/docs/demos/bspline/bspline_numeric_stability.ipynb.gz +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_poles.rst +2 -2
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_stability.rst +3 -4
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/bspline_vs_pi.rst +2 -2
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/hello_bspline.rst +4 -5
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/spline_engineer_func.rst +7 -9
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/spline_vs_poly.rst +5 -5
- splinekit-0.2.7/docs/demos/padding/change_basis.rst +127 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/padding/index.rst +1 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/padding/padding.rst +20 -18
- splinekit-0.2.7/docs/demos/padding/padding_speed.ipynb.gz +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/bounds.rst +2 -2
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/constructors.rst +4 -4
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/evaluation.rst +5 -5
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/index.rst +3 -0
- splinekit-0.2.7/docs/demos/spline1d/plot.rst +23 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/polynomials.rst +3 -3
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/random1d.rst +4 -4
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/spline1d/random2d.rst +1 -1
- splinekit-0.2.7/docs/demos/spline1d/simple_ops.rst +41 -0
- splinekit-0.2.7/docs/demos/spline1d/spline_evaluation_speed.ipynb.gz +0 -0
- splinekit-0.2.7/docs/demos/spline1d/stats.rst +47 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/glossary/glossary-numbers.rst +2 -2
- splinekit-0.2.7/pyproject.toml +100 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/bases.py +9 -7
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/periodic_spline_1d.py +4 -4
- {splinekit-0.2.5/dev/PythonSrc/Accelerated → splinekit-0.2.7/src/splinekit}/spline_padding.py +2 -2
- splinekit-0.2.5/dev/Jupyter/padding_bases.ipynb +0 -335
- splinekit-0.2.5/dev/Jupyter/spline_at_array.ipynb +0 -365
- splinekit-0.2.5/dev/Jupyter/spline_at_scalar.ipynb +0 -1107
- splinekit-0.2.5/dev/cpJupyter.sh +0 -6
- splinekit-0.2.5/dev/gzJupyter.sh +0 -10
- splinekit-0.2.5/dev/sk.numbers +0 -0
- splinekit-0.2.5/dev/zipJupyter.sh +0 -11
- splinekit-0.2.5/docs/demos/bspline/bspline_numeric_stability.ipynb.gz +0 -0
- splinekit-0.2.5/docs/demos/padding/padding_speed.ipynb.gz +0 -0
- splinekit-0.2.5/docs/demos/spline1d/spline_evaluation_speed.ipynb.gz +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/.github/workflows/deploy-docs.yml +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/.github/workflows/test.yml +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/.gitignore +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/.jupyterlite.doit.db +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/CMakeLists.txt +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/LICENSE +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/api/translations/all.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/api/translations/en.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/api/workspaces/all.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/bootstrap.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/config-utils.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/consoles/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/consoles/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/consoles/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/consoles/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/consoles/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/doc/tree/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/doc/workspaces/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/edit/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/edit/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/edit/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/edit/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/edit/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/install.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/package.json.orig +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/schemas/jupyterlab-jupytext/plugin.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/48.0570848d2b31a5354b7d.js.LICENSE.txt +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/509.d51a8122d1920ac82323.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/720.094c38d70b1dec0ceea7.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/remoteEntry.94495aac41d2fef6ad41.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/style.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab-jupytext/static/third-party-licenses.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/install.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/static/568.1e2faa2ba0bbe59c4780.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/static/747.67662283a5707eeb4d4c.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/static/remoteEntry.5cbb9d2323598fbda535.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/static/style.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/extensions/jupyterlab_pygments/static/third-party-licenses.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/icon-120x120.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/icon-512x512.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/jupyterlite.schema.v0.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/tree/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/lab/workspaces/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/manifest.webmanifest +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/notebooks/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/notebooks/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/notebooks/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/notebooks/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/notebooks/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/repl/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/repl/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/repl/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/repl/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/service-worker.js +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-busy-1.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-busy-2.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-busy-3.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-file.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-notebook.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon-terminal.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/static/favicons/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/tree/favicon.ico +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/tree/index.html +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/tree/jupyter-lite.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/tree/jupyter-lite.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/_output/tree/package.json +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/ansi_c/spline_padding/src/spline_padding.c +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/ansi_c/spline_padding/src/spline_padding.h +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_cmake/CMakeLists.txt +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_cmake/spline_padding.c +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_cmake/spline_padding.h +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/libspline_padding.dylib +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.c +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.h +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.pbxproj +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/project.xcworkspace/xcuserdata/pthevena.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/ANSI-C/spline_padding_xcode/spline_padding.xcodeproj/xcuserdata/pthevena.xcuserdatad/xcschemes/xcschememanagement.plist +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_cardinal.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_dual.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_dual_property.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_member.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_ortho.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_ortho_property.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/bases}/bspline_sinc.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/hello}/bspline_hello.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/hello}/bspline_hello_grad.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/hello}/bspline_hello_integral.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/inverse}/bspline_inv.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/inverse}/bspline_periodic_inv.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/m-scale}/bspline_m_scale.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_gauss_exo.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_trigo_exo.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_vs_cos.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_vs_erf.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_vs_exp.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/mathfunc}/bspline_vs_sin.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/members}/bspline_member_diff.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/members}/bspline_member_integral.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/poles}/bspline_annihilate.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/poles}/bspline_poles.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/poly}/bspline_convolve_mono.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/poly}/bspline_partition_mono.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/poly}/bspline_spline_poly.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/vs-pi}/bspline_vs_pi_as_sum.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/bspline/vs-pi}/bspline_vs_pi_at0.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/construct}/spline_approximation.ipynb +0 -0
- {splinekit-0.2.5/dev/Jupyter → splinekit-0.2.7/dev/Jupyter/periodic-spline/construct}/spline_interpolation.ipynb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Bspline Poles.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/IntervalChecks.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/PeriodicSplinesChecks.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/SplinePaddingChecks.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Test BSplines.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Test PeriodicNonuniformPiecewise.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Test PeriodicSpline1D.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Test SplinePadding.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Test SplineUtilities.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/Verify doc.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/dev/Wolfram/rescued Test SplinePadding.nb +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/.jupyterlite.doit.db +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/_static/custom.css +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bases/01_bases.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bases/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bases/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bsplines/01_bsplines.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bsplines/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/bsplines/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/conf.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/bspline/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/demos/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/environment.yml +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/glossary/glossary-polynomials.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/glossary/glossary-splines.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/glossary/glossary-terminology.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/glossary/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/installation/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/01_bounded.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/02_open.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/03_open_closed.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/04_closed.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/05_closed_open.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/bounded/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/degenerate/01_degenerate.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/degenerate/02_singleton.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/degenerate/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/degenerate/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/01_half_bounded.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/02_above.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/03_not_below.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/04_not_above.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/05_below.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/half_bounded/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/interval/01_interval.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/interval/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/interval/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/universal/01_universal.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/universal/02_empty.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/universal/03_rr.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/universal/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/interval/universal/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_nonuniform_piecewise/01_periodic_nonuniform_piecewise.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_nonuniform_piecewise/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_nonuniform_piecewise/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/01_periodic_spline_1d.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m00.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m01.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m02.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m03.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m04.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m05.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m06.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m07.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m08.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m09.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m10.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m11.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m12.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m13.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m14.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m15.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m16.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m17.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m18.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m19.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m20.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m21.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m22.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m23.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/m24.png +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/matplotlib-color.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/matplotlib-linestyle.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/matplotlib-marker.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/periodic_spline_1d/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_padding/01_spline_padding.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_padding/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_padding/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_utilities/01_spline_utilities.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_utilities/index.rst +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/docs/spline_utilities/noxfile.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/__init__.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/bsplines.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/__init__.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/_known_intervals.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/above.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/below.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/bounded.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/closed.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/closed_open.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/degenerate.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/empty.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/half_bounded.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/interval.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/mypy.ini +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/not_above.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/not_below.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/open.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/open_closed.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/rr.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/singleton.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/interval/universal.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/mypy.ini +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/periodic_nonuniform_piecewise.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/src/splinekit/spline_utilities.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/temp/bspline_stability.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/tests/test_bsplines.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/tests/test_periodic_nonuniform_piecewise.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/tests/test_periodic_spline_1d.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/tests/test_spline_padding.py +0 -0
- {splinekit-0.2.5 → splinekit-0.2.7}/tests/test_spline_utilities.py +0 -0
|
@@ -1,40 +1,5 @@
|
|
|
1
1
|
# splinekit/.github/workflows/release.yml
|
|
2
2
|
|
|
3
|
-
### Pure Python
|
|
4
|
-
# name: Build & publish to PyPI
|
|
5
|
-
#
|
|
6
|
-
# on:
|
|
7
|
-
# push:
|
|
8
|
-
# tags:
|
|
9
|
-
# - "v*"
|
|
10
|
-
#
|
|
11
|
-
# permissions:
|
|
12
|
-
# contents: read
|
|
13
|
-
# id-token: write # OIDC for PyPI
|
|
14
|
-
#
|
|
15
|
-
# jobs:
|
|
16
|
-
# build-and-publish:
|
|
17
|
-
# runs-on: ubuntu-latest
|
|
18
|
-
#
|
|
19
|
-
# steps:
|
|
20
|
-
# - name: Checkout repository
|
|
21
|
-
# uses: actions/checkout@v4
|
|
22
|
-
#
|
|
23
|
-
# - name: Set up Python
|
|
24
|
-
# uses: actions/setup-python@v5
|
|
25
|
-
# with:
|
|
26
|
-
# python-version: "3.12"
|
|
27
|
-
#
|
|
28
|
-
# - name: Install build tooling
|
|
29
|
-
# run: |
|
|
30
|
-
# python -m pip install -U pip build
|
|
31
|
-
#
|
|
32
|
-
# - name: Build sdist and wheel (pure Python)
|
|
33
|
-
# run: python -m build # creates dist/*.tar.gz and dist/*.whl
|
|
34
|
-
#
|
|
35
|
-
# - name: Publish to PyPI
|
|
36
|
-
# uses: pypa/gh-action-pypi-publish@release/v1
|
|
37
|
-
|
|
38
3
|
### Activate for C dynamic library
|
|
39
4
|
name: Build & publish to PyPI
|
|
40
5
|
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Load the required libraries
|
|
8
|
+
import ipywidgets as widgets
|
|
9
|
+
import matplotlib.pyplot as plt
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
import splinekit as sk # This library
|
|
13
|
+
|
|
14
|
+
# Setup
|
|
15
|
+
max_degree = 3 # Maximal spline degree
|
|
16
|
+
max_samples = 10 # Maximal support
|
|
17
|
+
|
|
18
|
+
# Initial random periodic cubic spline
|
|
19
|
+
s0 = sk.PeriodicSpline1D.from_spline_coeff(np.random.standard_normal(6), degree = 3)
|
|
20
|
+
|
|
21
|
+
#widget controls
|
|
22
|
+
linestyle_options = [
|
|
23
|
+
("'-' solid", 0),
|
|
24
|
+
("'--' dashed", 1),
|
|
25
|
+
("'-.' mixed", 2),
|
|
26
|
+
("':' dotted", 3)
|
|
27
|
+
]
|
|
28
|
+
linestyle_codes = [
|
|
29
|
+
"-",
|
|
30
|
+
"--",
|
|
31
|
+
"-.",
|
|
32
|
+
":"
|
|
33
|
+
]
|
|
34
|
+
color_options = [
|
|
35
|
+
("'C0' default blue", 0),
|
|
36
|
+
("'C1' default orange", 1),
|
|
37
|
+
("'C2' default green", 2),
|
|
38
|
+
("'C3' default red", 3),
|
|
39
|
+
("'C4' default purple", 4),
|
|
40
|
+
("'C5' default brown", 5),
|
|
41
|
+
("'C6' default pink", 6),
|
|
42
|
+
("'C7' default gray", 7),
|
|
43
|
+
("'C8' default olive", 8),
|
|
44
|
+
("'C9' default cyan", 9),
|
|
45
|
+
("'b' named blue", 10),
|
|
46
|
+
("'g' named green", 11),
|
|
47
|
+
("'r' named red", 12),
|
|
48
|
+
("'c' named cyan", 13),
|
|
49
|
+
("'m' named magenta", 14),
|
|
50
|
+
("'y' named yellow", 15),
|
|
51
|
+
("'k' named black", 16),
|
|
52
|
+
("'w' named white", 17)
|
|
53
|
+
]
|
|
54
|
+
color_codes = [
|
|
55
|
+
"C0",
|
|
56
|
+
"C1",
|
|
57
|
+
"C2",
|
|
58
|
+
"C3",
|
|
59
|
+
"C4",
|
|
60
|
+
"C5",
|
|
61
|
+
"C6",
|
|
62
|
+
"C7",
|
|
63
|
+
"C8",
|
|
64
|
+
"C9",
|
|
65
|
+
"b",
|
|
66
|
+
"g",
|
|
67
|
+
"r",
|
|
68
|
+
"c",
|
|
69
|
+
"m",
|
|
70
|
+
"y",
|
|
71
|
+
"k",
|
|
72
|
+
"w"
|
|
73
|
+
]
|
|
74
|
+
marker_options = [
|
|
75
|
+
("' ' ---NONE---", 0),
|
|
76
|
+
("'.' point", 1),
|
|
77
|
+
("',' pixel", 2),
|
|
78
|
+
("'o' circle", 3),
|
|
79
|
+
("'v' triangle down", 4),
|
|
80
|
+
("'^' triangle up", 5),
|
|
81
|
+
("'<' triangle left", 6),
|
|
82
|
+
("'>' triangle right", 7),
|
|
83
|
+
("'1' tri_down", 8),
|
|
84
|
+
("'2' tri_up", 9),
|
|
85
|
+
("'3' tri_left", 10),
|
|
86
|
+
("'4' tri_right", 11),
|
|
87
|
+
("'8' octagon", 12),
|
|
88
|
+
("'s' square", 13),
|
|
89
|
+
("'p' pentagon", 14),
|
|
90
|
+
("'P' plus (filled)", 15),
|
|
91
|
+
("'*' star", 16),
|
|
92
|
+
("'h' hexagon1", 17),
|
|
93
|
+
("'H' hexagon2", 18),
|
|
94
|
+
("'+' plus", 19),
|
|
95
|
+
("'x' cross", 20),
|
|
96
|
+
("'X' cross (filled)", 21),
|
|
97
|
+
("'D' diamond", 22),
|
|
98
|
+
("'d' thin diamond", 23),
|
|
99
|
+
("'|' vline", 24),
|
|
100
|
+
("'_' hline", 25)
|
|
101
|
+
]
|
|
102
|
+
marker_codes = [
|
|
103
|
+
" ",
|
|
104
|
+
".",
|
|
105
|
+
",",
|
|
106
|
+
"o",
|
|
107
|
+
"v",
|
|
108
|
+
"^",
|
|
109
|
+
"<",
|
|
110
|
+
">",
|
|
111
|
+
"1",
|
|
112
|
+
"2",
|
|
113
|
+
"3",
|
|
114
|
+
"4",
|
|
115
|
+
"8",
|
|
116
|
+
"s",
|
|
117
|
+
"p",
|
|
118
|
+
"P",
|
|
119
|
+
"*",
|
|
120
|
+
"h",
|
|
121
|
+
"H",
|
|
122
|
+
"+",
|
|
123
|
+
"x",
|
|
124
|
+
"X",
|
|
125
|
+
"D",
|
|
126
|
+
"d",
|
|
127
|
+
"|",
|
|
128
|
+
"_"
|
|
129
|
+
]
|
|
130
|
+
plotdomain_widget = widgets.FloatRangeSlider(
|
|
131
|
+
value = [-1.0, 7.0],
|
|
132
|
+
min = -1.0 * max_samples,
|
|
133
|
+
max = 2.0 * max_samples,
|
|
134
|
+
step = 0.25,
|
|
135
|
+
description = "domain:",
|
|
136
|
+
readout_format = ".2f"
|
|
137
|
+
)
|
|
138
|
+
plotrange_widget = widgets.FloatRangeSlider(
|
|
139
|
+
value = [-2.0, 2.0],
|
|
140
|
+
min = -5.0,
|
|
141
|
+
max = 5.0,
|
|
142
|
+
step = 0.2,
|
|
143
|
+
description = "range:",
|
|
144
|
+
readout_format = ".1f"
|
|
145
|
+
)
|
|
146
|
+
curve_fmt_linestyle_widget = widgets.Dropdown(
|
|
147
|
+
options = linestyle_options,
|
|
148
|
+
value = 0,
|
|
149
|
+
description = "curve:"
|
|
150
|
+
)
|
|
151
|
+
curve_fmt_linecolor_widget = widgets.Dropdown(
|
|
152
|
+
options = color_options,
|
|
153
|
+
value = 0,
|
|
154
|
+
description = "curve:"
|
|
155
|
+
)
|
|
156
|
+
curve_lw_widget = widgets.FloatSlider(
|
|
157
|
+
value = 1.0,
|
|
158
|
+
min = 0.1,
|
|
159
|
+
max = 3.0,
|
|
160
|
+
step = 0.1,
|
|
161
|
+
description = "curve:",
|
|
162
|
+
readout_format = ".1f"
|
|
163
|
+
)
|
|
164
|
+
curve_markerfmt_style_widget = widgets.Dropdown(
|
|
165
|
+
options = marker_options,
|
|
166
|
+
value = 3,
|
|
167
|
+
description = "curve mrkr:"
|
|
168
|
+
)
|
|
169
|
+
curve_markerfmt_color_widget = widgets.Dropdown(
|
|
170
|
+
options = color_options,
|
|
171
|
+
value = 0,
|
|
172
|
+
description = "curve mrkr:"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# Plot
|
|
176
|
+
def update_plot (
|
|
177
|
+
default_plotdomain = True,
|
|
178
|
+
default_plotrange = True,
|
|
179
|
+
default_curve_fmt = True,
|
|
180
|
+
default_curve_lw = True,
|
|
181
|
+
default_curve_markerfmt = True,
|
|
182
|
+
degree = 3,
|
|
183
|
+
samples = 5,
|
|
184
|
+
plotdomain = [-1.0, 7.0],
|
|
185
|
+
plotrange = [-2.0, 2.0],
|
|
186
|
+
plotpoints = 51,
|
|
187
|
+
curve_fmt_linestyle = 0,
|
|
188
|
+
curve_fmt_linecolor = 0,
|
|
189
|
+
curve_lw = 1.0,
|
|
190
|
+
curve_markerfmt_style = 3,
|
|
191
|
+
curve_markerfmt_color = 0
|
|
192
|
+
):
|
|
193
|
+
global s0
|
|
194
|
+
|
|
195
|
+
# Update of the spline
|
|
196
|
+
f = s0.get_samples(0, support_length = s0.period)
|
|
197
|
+
if s0.period < samples:
|
|
198
|
+
f = np.append(f, np.random.standard_normal(samples - len(f)))
|
|
199
|
+
else:
|
|
200
|
+
f = f[ : samples]
|
|
201
|
+
s0 = sk.PeriodicSpline1D.from_samples(f, degree = degree)
|
|
202
|
+
|
|
203
|
+
# plotdomain
|
|
204
|
+
plotdomain_interval = sk.interval.Closed(plotdomain)
|
|
205
|
+
if default_plotdomain:
|
|
206
|
+
plotdomain_interval = sk.interval.RR()
|
|
207
|
+
plotdomain_widget.disabled = default_plotdomain
|
|
208
|
+
|
|
209
|
+
# plotrange
|
|
210
|
+
plotrange_interval = sk.interval.Closed(plotrange)
|
|
211
|
+
if default_plotrange:
|
|
212
|
+
plotrange_interval = sk.interval.RR()
|
|
213
|
+
plotrange_widget.disabled = default_plotrange
|
|
214
|
+
|
|
215
|
+
# curve_fmt
|
|
216
|
+
curve_fmt_linestyle_string = linestyle_codes[curve_fmt_linestyle]
|
|
217
|
+
if default_curve_fmt:
|
|
218
|
+
curve_fmt_linestyle_string = "-"
|
|
219
|
+
curve_fmt_linestyle_widget.disabled = default_curve_fmt
|
|
220
|
+
curve_fmt_linecolor_string = color_codes[curve_fmt_linecolor]
|
|
221
|
+
if default_curve_fmt:
|
|
222
|
+
curve_fmt_linecolor_string = "C0"
|
|
223
|
+
curve_fmt_linecolor_widget.disabled = default_curve_fmt
|
|
224
|
+
|
|
225
|
+
# curve_lw
|
|
226
|
+
curve_linewidth = curve_lw
|
|
227
|
+
if default_curve_lw:
|
|
228
|
+
curve_linewidth = 1.0
|
|
229
|
+
curve_lw_widget.disabled = default_curve_lw
|
|
230
|
+
|
|
231
|
+
# curve_markerfmt
|
|
232
|
+
curve_markerfmt_style_string = marker_codes[curve_markerfmt_style]
|
|
233
|
+
if default_curve_markerfmt:
|
|
234
|
+
curve_markerfmt_style_string = "o"
|
|
235
|
+
curve_markerfmt_style_widget.disabled = default_curve_markerfmt
|
|
236
|
+
curve_markerfmt_color_string = ""
|
|
237
|
+
if 0 != curve_markerfmt_style:
|
|
238
|
+
curve_markerfmt_color_string = color_codes[curve_markerfmt_color]
|
|
239
|
+
if default_curve_markerfmt:
|
|
240
|
+
curve_markerfmt_color_string = "C0"
|
|
241
|
+
curve_markerfmt_color_widget.disabled = default_curve_markerfmt
|
|
242
|
+
|
|
243
|
+
# Plot of the spline
|
|
244
|
+
subplot = plt.subplots()
|
|
245
|
+
s0.plot(
|
|
246
|
+
subplot,
|
|
247
|
+
plotdomain = plotdomain_interval,
|
|
248
|
+
plotrange = plotrange_interval,
|
|
249
|
+
plotpoints = plotpoints,
|
|
250
|
+
curve_fmt = curve_fmt_linestyle_string + curve_fmt_linecolor_string,
|
|
251
|
+
curve_lw = curve_linewidth,
|
|
252
|
+
curve_markerfmt = curve_markerfmt_style_string + curve_markerfmt_color_string,
|
|
253
|
+
curvestem_linefmt = "None",
|
|
254
|
+
knot_marker = "",
|
|
255
|
+
periodbound_markerfmt = "",
|
|
256
|
+
periodboundstem_linefmt = "None"
|
|
257
|
+
)
|
|
258
|
+
plt.show()
|
|
259
|
+
|
|
260
|
+
# interactive
|
|
261
|
+
widgets.interactive(
|
|
262
|
+
update_plot,
|
|
263
|
+
default_plotdomain = widgets.Checkbox(
|
|
264
|
+
value = True,
|
|
265
|
+
description = "plotdomain = sk.interval.RR()"
|
|
266
|
+
),
|
|
267
|
+
default_plotrange = widgets.Checkbox(
|
|
268
|
+
value = True,
|
|
269
|
+
description = "plotrange = sk.interval.RR()"
|
|
270
|
+
),
|
|
271
|
+
default_curve_fmt = widgets.Checkbox(
|
|
272
|
+
value = True,
|
|
273
|
+
description = "curve_fmt = '-C0'"
|
|
274
|
+
),
|
|
275
|
+
default_curve_lw = widgets.Checkbox(
|
|
276
|
+
value = True,
|
|
277
|
+
description = "curve_lw = 1.0"
|
|
278
|
+
),
|
|
279
|
+
default_curve_markerfmt = widgets.Checkbox(
|
|
280
|
+
value = True,
|
|
281
|
+
description = "curve_markerfmt = 'oC0'"
|
|
282
|
+
),
|
|
283
|
+
degree = (0, max_degree),
|
|
284
|
+
samples = (1, max_samples),
|
|
285
|
+
plotdomain = plotdomain_widget,
|
|
286
|
+
plotrange = plotrange_widget,
|
|
287
|
+
plotpoints = widgets.IntSlider(
|
|
288
|
+
value = 51,
|
|
289
|
+
min = 2,
|
|
290
|
+
max = 101,
|
|
291
|
+
step = 1,
|
|
292
|
+
description = "plotpoints"
|
|
293
|
+
),
|
|
294
|
+
curve_fmt_linestyle = curve_fmt_linestyle_widget,
|
|
295
|
+
curve_fmt_linecolor = curve_fmt_linecolor_widget,
|
|
296
|
+
curve_lw = curve_lw_widget,
|
|
297
|
+
curve_markerfmt_style = curve_markerfmt_style_widget,
|
|
298
|
+
curve_markerfmt_color = curve_markerfmt_color_widget
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splinekit
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: A set of functions and classes to handle periodic 1D polynomial splines
|
|
5
5
|
Author-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
|
|
6
6
|
Maintainer-Email: =?utf-8?q?Philippe_Th=C3=A9venaz?= <philippe.thevenaz@icloud.com>
|
|
@@ -51,6 +51,8 @@ Description-Content-Type: text/markdown
|
|
|
51
51
|
|
|
52
52
|
<!-- splinekit/README.md -->
|
|
53
53
|
|
|
54
|
+
# Version 0.2.7
|
|
55
|
+
|
|
54
56
|
# splinekit: Spline Operations
|
|
55
57
|
`splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
|
|
56
58
|
|
|
@@ -125,3 +127,9 @@ Some demos added.
|
|
|
125
127
|
|
|
126
128
|
### 0.2.5
|
|
127
129
|
Minor debug of least-significant-bit edge cases.
|
|
130
|
+
|
|
131
|
+
### 0.2.6
|
|
132
|
+
Some demos added. Documentation minor updates.
|
|
133
|
+
|
|
134
|
+
### 0.2.7
|
|
135
|
+
Upgraded to jupyterlite 0.7
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
<!-- splinekit/README.md -->
|
|
2
2
|
|
|
3
|
+
# Version 0.2.7
|
|
4
|
+
|
|
3
5
|
# splinekit: Spline Operations
|
|
4
6
|
`splinekit` is a Python-based open-source software library aimed at the manipulation of one-dimensional periodic splines.
|
|
5
7
|
|
|
@@ -74,3 +76,9 @@ Some demos added.
|
|
|
74
76
|
|
|
75
77
|
### 0.2.5
|
|
76
78
|
Minor debug of least-significant-bit edge cases.
|
|
79
|
+
|
|
80
|
+
### 0.2.6
|
|
81
|
+
Some demos added. Documentation minor updates.
|
|
82
|
+
|
|
83
|
+
### 0.2.7
|
|
84
|
+
Upgraded to jupyterlite 0.7
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
devDir="/Users/pthevena/Documents/Programmation/Python/splinekit/dev/Accelerated"
|
|
4
|
+
splinekitDir="/Users/pthevena/Documents/Programmation/Python/splinekit"
|
|
5
|
+
cp $devDir/release.yml $splinekitDir/.github/workflows/release.yml
|
|
6
|
+
cp $devDir/pyproject.toml $splinekitDir/pyproject.toml
|
|
7
|
+
cp $devDir/spline_padding.py $splinekitDir/src/splinekit/spline_padding.py
|
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
# Build
|
|
4
4
|
[build-system]
|
|
5
5
|
requires = [
|
|
6
|
-
# "hatchling >=1.26" # Not compatible with C dynamic library
|
|
7
6
|
"scikit-build-core>=0.10", # Activate for C dynamic library
|
|
8
7
|
]
|
|
9
|
-
#build-backend = "hatchling.build" # Not compatible with C dynamic library
|
|
10
8
|
build-backend = "scikit_build_core.build" # Activate for C dynamic library
|
|
11
9
|
|
|
12
10
|
# Project
|
|
13
11
|
[project]
|
|
14
12
|
name = "splinekit"
|
|
15
|
-
version = "0.2.
|
|
13
|
+
version = "0.2.7"
|
|
16
14
|
dependencies = [
|
|
17
15
|
"numpy >=1.26",
|
|
18
16
|
"scipy >=1.15",
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# splinekit/.github/workflows/release.yml
|
|
2
|
+
|
|
3
|
+
### Activate for C dynamic library
|
|
4
|
+
name: Build & publish to PyPI
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags:
|
|
9
|
+
- "v*"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
id-token: write # OIDC for PyPI
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build_wheels:
|
|
17
|
+
name: Build wheels on ${{ matrix.os }}
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
include:
|
|
24
|
+
# Linux + Windows
|
|
25
|
+
- os: ubuntu-latest
|
|
26
|
+
mac_arch: x86_64 # unused on Linux, but keeps env simple
|
|
27
|
+
- os: windows-latest
|
|
28
|
+
mac_arch: x86_64 # unused on Windows, but keeps env simple
|
|
29
|
+
|
|
30
|
+
# macOS Intel (x86_64) and Apple Silicon (arm64)
|
|
31
|
+
- os: macos-15-intel
|
|
32
|
+
mac_arch: x86_64
|
|
33
|
+
- os: macos-15 # or macos-latest
|
|
34
|
+
mac_arch: arm64
|
|
35
|
+
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v4
|
|
38
|
+
|
|
39
|
+
- uses: actions/setup-python@v5
|
|
40
|
+
with:
|
|
41
|
+
python-version: "3.12"
|
|
42
|
+
|
|
43
|
+
- name: Install build tools
|
|
44
|
+
run: python -m pip install -U pip cibuildwheel build
|
|
45
|
+
|
|
46
|
+
- name: Build wheels
|
|
47
|
+
run: python -m cibuildwheel --output-dir dist
|
|
48
|
+
env:
|
|
49
|
+
# CPython only, for versions we support
|
|
50
|
+
CIBW_BUILD: "cp311-* cp312-*"
|
|
51
|
+
|
|
52
|
+
# Avoid unsupported/undesired targets
|
|
53
|
+
CIBW_SKIP: "*musllinux*"
|
|
54
|
+
|
|
55
|
+
# Architectures
|
|
56
|
+
CIBW_ARCHS_LINUX: "x86_64"
|
|
57
|
+
CIBW_ARCHS_WINDOWS: "AMD64"
|
|
58
|
+
CIBW_ARCHS_MACOS: ${{ matrix.mac_arch }}
|
|
59
|
+
|
|
60
|
+
# macOS: ensure wheels target a realistic minimum for C++17
|
|
61
|
+
# (Intel: 10.13+ matches cp312 minimum; arm64 will still be 11.0+)
|
|
62
|
+
CIBW_ENVIRONMENT_MACOS: MACOSX_DEPLOYMENT_TARGET=10.13
|
|
63
|
+
|
|
64
|
+
# Simple smoke test: import and check native module presence
|
|
65
|
+
CIBW_TEST_COMMAND: >
|
|
66
|
+
python -c "import importlib.util, numpy as np, splinekit;
|
|
67
|
+
print('ok', importlib.util.find_spec('splinekit._padding') is not None)"
|
|
68
|
+
|
|
69
|
+
- name: Build sdist (once on Ubuntu)
|
|
70
|
+
if: matrix.os == 'ubuntu-latest'
|
|
71
|
+
run: python -m build -s -o dist
|
|
72
|
+
|
|
73
|
+
- name: Upload wheel artifacts
|
|
74
|
+
uses: actions/upload-artifact@v4
|
|
75
|
+
with:
|
|
76
|
+
name: wheels-${{ matrix.os }}-${{ matrix.mac_arch }}
|
|
77
|
+
path: dist/*.whl
|
|
78
|
+
if-no-files-found: error
|
|
79
|
+
|
|
80
|
+
- name: Upload sdist artifact
|
|
81
|
+
if: matrix.os == 'ubuntu-latest'
|
|
82
|
+
uses: actions/upload-artifact@v4
|
|
83
|
+
with:
|
|
84
|
+
name: sdist
|
|
85
|
+
path: dist/*.tar.gz
|
|
86
|
+
if-no-files-found: error
|
|
87
|
+
|
|
88
|
+
publish:
|
|
89
|
+
needs: [build_wheels]
|
|
90
|
+
runs-on: ubuntu-latest
|
|
91
|
+
|
|
92
|
+
steps:
|
|
93
|
+
- uses: actions/download-artifact@v4
|
|
94
|
+
with:
|
|
95
|
+
pattern: wheels-*
|
|
96
|
+
merge-multiple: true
|
|
97
|
+
path: dist
|
|
98
|
+
|
|
99
|
+
- uses: actions/download-artifact@v4
|
|
100
|
+
with:
|
|
101
|
+
name: sdist
|
|
102
|
+
path: dist
|
|
103
|
+
|
|
104
|
+
- name: Publish to PyPI
|
|
105
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -210,11 +210,11 @@ def change_basis_p (
|
|
|
210
210
|
coefficients that is expressing the periodic
|
|
211
211
|
:ref:`uniform spline<def-uniform_spline>` :math:`f` of
|
|
212
212
|
:ref:`nonnegative<def-negative>` degree :math:`n` as a weighted sum of
|
|
213
|
-
integer-shifted
|
|
213
|
+
integer-shifted synthesis functions of the type ``source_basis``.
|
|
214
214
|
|
|
215
215
|
At output time, ``data`` is a one-dimensional ``numpy.ndarray`` of
|
|
216
216
|
coefficients that is expressing the same spline :math:`f` as a weighted
|
|
217
|
-
sum of integer-shifted
|
|
217
|
+
sum of integer-shifted synthesis functions of the type ``target_basis``.
|
|
218
218
|
|
|
219
219
|
Parameters
|
|
220
220
|
----------
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "0c723be4-e5f6-4b5a-a6a2-11ece85e5f1b",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Polynomial B-Spline\n",
|
|
9
|
+
"Here is the plot of a B-spline of a given degree, over precisely its support. The hollow (blue or red) circles indicate the samples at the integers. The function is made of polynomial pieces that lie between so-called knots. The small filled (black) discs indicate the location of the knots of the spline. They lie at the half integers for even degrees and at the integers for odd degrees."
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"cell_type": "code",
|
|
14
|
+
"execution_count": null,
|
|
15
|
+
"id": "65fb414e-a36a-4bff-ae5a-a03e6498deb8",
|
|
16
|
+
"metadata": {},
|
|
17
|
+
"outputs": [],
|
|
18
|
+
"source": [
|
|
19
|
+
"# Load the required libraries\n",
|
|
20
|
+
"from ipywidgets import interactive\n",
|
|
21
|
+
"import matplotlib.pyplot as plt\n",
|
|
22
|
+
"\n",
|
|
23
|
+
"import splinekit as sk # This library\n",
|
|
24
|
+
"\n",
|
|
25
|
+
"# Define the plot function\n",
|
|
26
|
+
"def b_spline_plot (\n",
|
|
27
|
+
" degree = 3\n",
|
|
28
|
+
"):\n",
|
|
29
|
+
" # Support of a B-spline\n",
|
|
30
|
+
" supp = sk.b_spline_support(degree)\n",
|
|
31
|
+
" # Avoid overlap and leave a margin\n",
|
|
32
|
+
" # The margin serves a purpose only for the B-spline of degree 0\n",
|
|
33
|
+
" period = supp.diameter + 1\n",
|
|
34
|
+
" # Construct a spline from a non-overlapping periodic B-spline\n",
|
|
35
|
+
" s = sk.PeriodicSpline1D.periodized_b_spline(\n",
|
|
36
|
+
" period = int(period),\n",
|
|
37
|
+
" degree = degree\n",
|
|
38
|
+
" )\n",
|
|
39
|
+
" # Plot the B-spline\n",
|
|
40
|
+
" s.plot(\n",
|
|
41
|
+
" plt.subplots(),\n",
|
|
42
|
+
" plotdomain = sk.interval.Closed((-0.5 * supp.diameter, 0.5 * supp.diameter)),\n",
|
|
43
|
+
" plotrange = sk.interval.Closed((-0.05, 1.05)),\n",
|
|
44
|
+
" plotpoints = 200 + 1\n",
|
|
45
|
+
" )\n",
|
|
46
|
+
"\n",
|
|
47
|
+
"# Interact with the degree\n",
|
|
48
|
+
"interactive(b_spline_plot, degree = (0, 30))\n"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"cell_type": "code",
|
|
53
|
+
"execution_count": null,
|
|
54
|
+
"id": "b80ced66-8818-4b26-9ea0-effa40d17b3e",
|
|
55
|
+
"metadata": {},
|
|
56
|
+
"outputs": [],
|
|
57
|
+
"source": [
|
|
58
|
+
"\n",
|
|
59
|
+
"\n",
|
|
60
|
+
"\n",
|
|
61
|
+
"\n",
|
|
62
|
+
"\n",
|
|
63
|
+
"\n",
|
|
64
|
+
"\n",
|
|
65
|
+
"\n",
|
|
66
|
+
"\n",
|
|
67
|
+
"\n",
|
|
68
|
+
"\n",
|
|
69
|
+
"\n",
|
|
70
|
+
"\n",
|
|
71
|
+
"\n",
|
|
72
|
+
"\n",
|
|
73
|
+
"\n",
|
|
74
|
+
"\n",
|
|
75
|
+
"\n",
|
|
76
|
+
"\n",
|
|
77
|
+
"\n"
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"metadata": {
|
|
82
|
+
"kernelspec": {
|
|
83
|
+
"display_name": "Python 3 (ipykernel)",
|
|
84
|
+
"language": "python",
|
|
85
|
+
"name": "python3"
|
|
86
|
+
},
|
|
87
|
+
"language_info": {
|
|
88
|
+
"codemirror_mode": {
|
|
89
|
+
"name": "ipython",
|
|
90
|
+
"version": 3
|
|
91
|
+
},
|
|
92
|
+
"file_extension": ".py",
|
|
93
|
+
"mimetype": "text/x-python",
|
|
94
|
+
"name": "python",
|
|
95
|
+
"nbconvert_exporter": "python",
|
|
96
|
+
"pygments_lexer": "ipython3",
|
|
97
|
+
"version": "3.12.6"
|
|
98
|
+
},
|
|
99
|
+
"widgets": {
|
|
100
|
+
"application/vnd.jupyter.widget-state+json": {
|
|
101
|
+
"state": {},
|
|
102
|
+
"version_major": 2,
|
|
103
|
+
"version_minor": 0
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"nbformat": 4,
|
|
108
|
+
"nbformat_minor": 5
|
|
109
|
+
}
|
|
@@ -172,7 +172,8 @@
|
|
|
172
172
|
"# #\n",
|
|
173
173
|
"###################\n",
|
|
174
174
|
"\n",
|
|
175
|
-
"# Duration of the computations on a desktop computer of year 2021: ~20s\n",
|
|
175
|
+
"# Duration of the native computations on a desktop computer of year 2021: ~20s\n",
|
|
176
|
+
"# Duration of the WebAssembly computations: about twice\n",
|
|
176
177
|
"\n",
|
|
177
178
|
"\n"
|
|
178
179
|
]
|
|
@@ -321,7 +322,8 @@
|
|
|
321
322
|
"# #\n",
|
|
322
323
|
"###################\n",
|
|
323
324
|
"\n",
|
|
324
|
-
"# Duration of the computations on a desktop computer of year 2021: ~20s\n",
|
|
325
|
+
"# Duration of the native computations on a desktop computer of year 2021: ~20s\n",
|
|
326
|
+
"# Duration of the WebAssembly computations: about twice\n",
|
|
325
327
|
"\n",
|
|
326
328
|
"\n"
|
|
327
329
|
]
|
|
@@ -447,7 +449,8 @@
|
|
|
447
449
|
"# #\n",
|
|
448
450
|
"###################\n",
|
|
449
451
|
"\n",
|
|
450
|
-
"# Duration of the computations on a desktop computer of year 2021: ~5s\n",
|
|
452
|
+
"# Duration of the native computations on a desktop computer of year 2021: ~5s\n",
|
|
453
|
+
"# Duration of the WebAssembly computations: about twice\n",
|
|
451
454
|
"\n",
|
|
452
455
|
"\n"
|
|
453
456
|
]
|