pyfmaps 1.1.0__tar.gz → 1.2.0__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.
Files changed (115) hide show
  1. pyfmaps-1.2.0/.github/workflows/documentation.yml +51 -0
  2. pyfmaps-1.2.0/.github/workflows/lint.yml +24 -0
  3. pyfmaps-1.2.0/.github/workflows/test_and_deploy.yml +82 -0
  4. pyfmaps-1.2.0/.gitignore +104 -0
  5. pyfmaps-1.2.0/.pre-commit-config.yaml +10 -0
  6. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/MANIFEST.in +0 -2
  7. {pyfmaps-1.1.0/pyfmaps.egg-info → pyfmaps-1.2.0}/PKG-INFO +42 -6
  8. pyfmaps-1.2.0/doc/zoomout.gif +0 -0
  9. pyfmaps-1.2.0/docs/source/_templates/autosummary/class.rst +8 -0
  10. pyfmaps-1.2.0/docs/source/_templates/autosummary/module.rst +52 -0
  11. pyfmaps-1.2.0/docs/source/api.rst +103 -0
  12. pyfmaps-1.2.0/docs/source/conf.py +76 -0
  13. pyfmaps-1.2.0/docs/source/examples.md +15 -0
  14. pyfmaps-1.2.0/docs/source/getting_started.md +89 -0
  15. pyfmaps-1.2.0/docs/source/index.rst +66 -0
  16. pyfmaps-1.2.0/docs/source/install.md +21 -0
  17. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-01.off +15001 -0
  18. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-02.off +15003 -0
  19. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-03.off +15004 -0
  20. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-04.off +15003 -0
  21. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-05.off +15003 -0
  22. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-06.off +15004 -0
  23. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-07.off +15003 -0
  24. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-08.off +15003 -0
  25. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-09.off +15003 -0
  26. pyfmaps-1.2.0/examples/data/camel_gallop/camel-gallop-10.off +15002 -0
  27. pyfmaps-1.2.0/examples/data/camel_gallop/maps/10_to_2 +5000 -0
  28. pyfmaps-1.2.0/examples/data/camel_gallop/maps/10_to_8 +5000 -0
  29. pyfmaps-1.2.0/examples/data/camel_gallop/maps/1_to_3 +4999 -0
  30. pyfmaps-1.2.0/examples/data/camel_gallop/maps/1_to_5 +4999 -0
  31. pyfmaps-1.2.0/examples/data/camel_gallop/maps/1_to_7 +4999 -0
  32. pyfmaps-1.2.0/examples/data/camel_gallop/maps/2_to_10 +5001 -0
  33. pyfmaps-1.2.0/examples/data/camel_gallop/maps/2_to_3 +5001 -0
  34. pyfmaps-1.2.0/examples/data/camel_gallop/maps/2_to_4 +5001 -0
  35. pyfmaps-1.2.0/examples/data/camel_gallop/maps/2_to_5 +5001 -0
  36. pyfmaps-1.2.0/examples/data/camel_gallop/maps/3_to_1 +5002 -0
  37. pyfmaps-1.2.0/examples/data/camel_gallop/maps/3_to_2 +5002 -0
  38. pyfmaps-1.2.0/examples/data/camel_gallop/maps/3_to_5 +5002 -0
  39. pyfmaps-1.2.0/examples/data/camel_gallop/maps/3_to_6 +5002 -0
  40. pyfmaps-1.2.0/examples/data/camel_gallop/maps/3_to_9 +5002 -0
  41. pyfmaps-1.2.0/examples/data/camel_gallop/maps/4_to_2 +5001 -0
  42. pyfmaps-1.2.0/examples/data/camel_gallop/maps/4_to_8 +5001 -0
  43. pyfmaps-1.2.0/examples/data/camel_gallop/maps/5_to_1 +5001 -0
  44. pyfmaps-1.2.0/examples/data/camel_gallop/maps/5_to_2 +5001 -0
  45. pyfmaps-1.2.0/examples/data/camel_gallop/maps/5_to_3 +5001 -0
  46. pyfmaps-1.2.0/examples/data/camel_gallop/maps/5_to_7 +5001 -0
  47. pyfmaps-1.2.0/examples/data/camel_gallop/maps/6_to_3 +5002 -0
  48. pyfmaps-1.2.0/examples/data/camel_gallop/maps/6_to_7 +5002 -0
  49. pyfmaps-1.2.0/examples/data/camel_gallop/maps/7_to_1 +5001 -0
  50. pyfmaps-1.2.0/examples/data/camel_gallop/maps/7_to_5 +5001 -0
  51. pyfmaps-1.2.0/examples/data/camel_gallop/maps/7_to_6 +5001 -0
  52. pyfmaps-1.2.0/examples/data/camel_gallop/maps/8_to_10 +5001 -0
  53. pyfmaps-1.2.0/examples/data/camel_gallop/maps/8_to_4 +5001 -0
  54. pyfmaps-1.2.0/examples/data/camel_gallop/maps/8_to_9 +5001 -0
  55. pyfmaps-1.2.0/examples/data/camel_gallop/maps/9_to_3 +5001 -0
  56. pyfmaps-1.2.0/examples/data/camel_gallop/maps/9_to_8 +5001 -0
  57. pyfmaps-1.2.0/examples/data/cat-00.off +21619 -0
  58. pyfmaps-1.2.0/examples/data/landmarks.txt +20 -0
  59. pyfmaps-1.2.0/examples/data/lion-00.off +14998 -0
  60. pyfmaps-1.2.0/examples/data/lion2cat +5000 -0
  61. pyfmaps-1.2.0/examples/functional_map_network/FMN_base.ipynb +332 -0
  62. pyfmaps-1.2.0/examples/mesh_and_matching/basic_functions.ipynb +447 -0
  63. pyfmaps-1.2.0/examples/mesh_and_matching/matching_with_zoomout.ipynb +187 -0
  64. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/FMN/FMN.py +323 -237
  65. pyfmaps-1.2.0/pyFM/__init__.py +0 -0
  66. pyfmaps-1.2.0/pyFM/_version.py +24 -0
  67. pyfmaps-1.2.0/pyFM/eval/evaluate.py +97 -0
  68. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/functional.py +98 -44
  69. pyfmaps-1.2.0/pyFM/mesh/data/texture_1.jpg +0 -0
  70. pyfmaps-1.2.0/pyFM/mesh/data/texture_2.jpg +0 -0
  71. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/mesh/file_utils.py +27 -55
  72. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/mesh/geometry.py +409 -378
  73. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/mesh/laplacian.py +59 -65
  74. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/mesh/trimesh.py +107 -105
  75. pyfmaps-1.2.0/pyFM/optimize/base_functions.py +520 -0
  76. pyfmaps-1.2.0/pyFM/refine/icp.py +250 -0
  77. pyfmaps-1.2.0/pyFM/refine/zoomout.py +294 -0
  78. pyfmaps-1.2.0/pyFM/signatures/HKS_functions.py +145 -0
  79. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/signatures/WKS_functions.py +66 -65
  80. pyfmaps-1.2.0/pyFM/spectral/convert.py +268 -0
  81. pyfmaps-1.2.0/pyFM/spectral/nn_utils.py +40 -0
  82. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/spectral/projection_utils.py +284 -246
  83. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/spectral/shape_difference.py +38 -39
  84. {pyfmaps-1.1.0 → pyfmaps-1.2.0/pyfmaps.egg-info}/PKG-INFO +42 -6
  85. pyfmaps-1.2.0/pyfmaps.egg-info/SOURCES.txt +103 -0
  86. pyfmaps-1.2.0/pyfmaps.egg-info/requires.txt +23 -0
  87. pyfmaps-1.2.0/pyfmaps.egg-info/scm_file_list.json +101 -0
  88. pyfmaps-1.2.0/pyfmaps.egg-info/scm_version.json +8 -0
  89. pyfmaps-1.2.0/pyproject.toml +78 -0
  90. pyfmaps-1.1.0/pyfmaps.egg-info/requires.txt → pyfmaps-1.2.0/requirements.txt +2 -2
  91. pyfmaps-1.2.0/requirements_docs.txt +13 -0
  92. pyfmaps-1.2.0/setup.cfg +4 -0
  93. pyfmaps-1.2.0/tests/test_data.py +8 -0
  94. pyfmaps-1.1.0/pyFM/eval/evaluate.py +0 -93
  95. pyfmaps-1.1.0/pyFM/optimize/base_functions.py +0 -484
  96. pyfmaps-1.1.0/pyFM/refine/icp.py +0 -248
  97. pyfmaps-1.1.0/pyFM/refine/zoomout.py +0 -279
  98. pyfmaps-1.1.0/pyFM/signatures/HKS_functions.py +0 -145
  99. pyfmaps-1.1.0/pyFM/spectral/convert.py +0 -263
  100. pyfmaps-1.1.0/pyFM/spectral/nn_utils.py +0 -40
  101. pyfmaps-1.1.0/pyfmaps.egg-info/SOURCES.txt +0 -34
  102. pyfmaps-1.1.0/setup.cfg +0 -44
  103. pyfmaps-1.1.0/setup.py +0 -6
  104. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/LICENSE +0 -0
  105. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/README.md +0 -0
  106. pyfmaps-1.1.0/pyFM/__init__.py → pyfmaps-1.2.0/docs/source/_static/.gitkeep +0 -0
  107. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/FMN/__init__.py +0 -0
  108. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/eval/__init__.py +0 -0
  109. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/mesh/__init__.py +0 -0
  110. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/optimize/__init__.py +0 -0
  111. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/refine/__init__.py +1 -1
  112. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/signatures/__init__.py +0 -0
  113. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyFM/spectral/__init__.py +1 -1
  114. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyfmaps.egg-info/dependency_links.txt +0 -0
  115. {pyfmaps-1.1.0 → pyfmaps-1.2.0}/pyfmaps.egg-info/top_level.txt +0 -0
@@ -0,0 +1,51 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ workflow_dispatch:
9
+ release:
10
+
11
+ jobs:
12
+ build_documentation:
13
+ name: Build Documentation
14
+ runs-on: ubuntu-latest
15
+
16
+ permissions:
17
+ contents: write
18
+
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0 # setuptools_scm needs tags to compute the version
23
+
24
+ - uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.10"
27
+ cache: "pip"
28
+
29
+ - name: Install package (with dependencies for docs)
30
+ run: |
31
+ pip install --upgrade pip
32
+ pip install -r requirements_docs.txt
33
+ pip install .
34
+
35
+ - name: Build HTML
36
+ run: |
37
+ sphinx-build -b html docs/source/ docs/_build/html
38
+
39
+ - name: upload artifact
40
+ uses: actions/upload-artifact@v4
41
+ with:
42
+ path:
43
+ docs/_build/html/
44
+ - name: Deploy to GitHub Pages
45
+ uses: peaceiris/actions-gh-pages@v4
46
+ if: github.ref == 'refs/heads/master'
47
+ with:
48
+ publish_branch: gh-pages
49
+ github_token: ${{ secrets.GITHUB_TOKEN }}
50
+ publish_dir: docs/_build/html
51
+ force_orphan: true
@@ -0,0 +1,24 @@
1
+ name: lint
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+ pull_request:
9
+ workflow_dispatch:
10
+
11
+ jobs:
12
+ ruff:
13
+ name: ruff
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: astral-sh/ruff-action@v1
18
+ with:
19
+ version: 0.15.22
20
+ args: check --output-format=github
21
+ - uses: astral-sh/ruff-action@v1
22
+ with:
23
+ version: 0.15.22
24
+ args: format --check
@@ -0,0 +1,82 @@
1
+ name: tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+ tags:
9
+ - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10
10
+ pull_request:
11
+ branches:
12
+ - master
13
+ - main
14
+ workflow_dispatch:
15
+
16
+ jobs:
17
+ test:
18
+ name: ${{ matrix.platform }} py${{ matrix.python-version }}
19
+ runs-on: ${{ matrix.platform }}
20
+ strategy:
21
+ matrix:
22
+ platform: [windows-latest, ubuntu-latest, macos-latest]
23
+ python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
24
+
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ with:
28
+ fetch-depth: 0 # setuptools_scm needs full history + tags for the version
29
+
30
+ - name: Set up Python ${{ matrix.python-version }}
31
+ uses: actions/setup-python@v5
32
+ with:
33
+ python-version: ${{ matrix.python-version }}
34
+
35
+ - name: Install dependencies
36
+ run: |
37
+ python -m pip install --upgrade pip
38
+ python -m pip install pytest-cov
39
+ pip install .
40
+
41
+ # this runs the platform-specific tests
42
+ - name: Run tests
43
+ shell: bash -l {0}
44
+ run: pytest -v --cov=./ --cov-report=xml
45
+ env:
46
+ PLATFORM: ${{ matrix.platform }}
47
+
48
+ - name: Coverage
49
+ uses: codecov/codecov-action@v4
50
+
51
+ deploy:
52
+ # Runs on a pushed v* tag: builds, publishes to PyPI via Trusted Publishing
53
+ # (no API token needed), and creates a GitHub Release with generated notes.
54
+ needs: [test]
55
+ runs-on: ubuntu-latest
56
+ if: startsWith(github.ref, 'refs/tags/v')
57
+ permissions:
58
+ id-token: write # OIDC token for PyPI Trusted Publishing
59
+ contents: write # create the GitHub Release
60
+ steps:
61
+ - uses: actions/checkout@v4
62
+ with:
63
+ fetch-depth: 0 # setuptools_scm needs the tag to compute the version
64
+
65
+ - name: Set up Python
66
+ uses: actions/setup-python@v5
67
+ with:
68
+ python-version: "3.x"
69
+
70
+ - name: Build distributions
71
+ run: |
72
+ python -m pip install --upgrade pip build
73
+ python -m build .
74
+
75
+ - name: Publish to PyPI
76
+ uses: pypa/gh-action-pypi-publish@release/v1
77
+
78
+ - name: Create GitHub Release
79
+ uses: softprops/action-gh-release@v2
80
+ with:
81
+ generate_release_notes: true
82
+ files: dist/*
@@ -0,0 +1,104 @@
1
+ docs/build
2
+ docs/source/generated/*
3
+ docs/make.bat
4
+ docs/Makefile
5
+
6
+ # Byte-compiled / optimized / DLL files
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+
11
+ # data
12
+ /data
13
+
14
+ # STRESS outputs
15
+ *.pdf
16
+ *.vtp
17
+ *.mat
18
+
19
+ # C extensions
20
+ *.so
21
+
22
+ # Distribution / packaging
23
+ .Python
24
+ env/
25
+ build/
26
+ develop-eggs/
27
+ dist/
28
+ downloads/
29
+ eggs/
30
+ .eggs/
31
+ lib/
32
+ lib64/
33
+ parts/
34
+ sdist/
35
+ var/
36
+ *.egg-info/
37
+ .installed.cfg
38
+ *.egg
39
+
40
+ # PyInstaller
41
+ # Usually these files are written by a python script from a template
42
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
43
+ *.manifest
44
+ *.spec
45
+
46
+ # Installer logs
47
+ pip-log.txt
48
+ pip-delete-this-directory.txt
49
+
50
+ # Unit test / coverage reports
51
+ htmlcov/
52
+ .tox/
53
+ .coverage
54
+ .coverage.*
55
+ .cache
56
+ nosetests.xml
57
+ coverage.xml
58
+ *,cover
59
+ .hypothesis/
60
+ .napari_cache
61
+
62
+ # Translations
63
+ *.mo
64
+ *.pot
65
+
66
+ # Django stuff:
67
+ *.log
68
+ local_settings.py
69
+
70
+ # Flask instance folder
71
+ instance/
72
+
73
+ # Sphinx documentation
74
+ docs/_build/
75
+
76
+ # MkDocs documentation
77
+ /site/
78
+
79
+ # PyBuilder
80
+ target/
81
+
82
+ # Pycharm and VSCode
83
+ .idea/
84
+ venv/
85
+ .vscode/
86
+
87
+ # IPython Notebook
88
+ .ipynb_checkpoints
89
+
90
+ # pyenv
91
+ .python-version
92
+
93
+ # OS
94
+ .DS_Store
95
+
96
+ # written by setuptools_scm
97
+ **/_version.py
98
+
99
+ # scratch / local test notebooks
100
+ small_test.ipynb
101
+
102
+ # Dask
103
+ dask-worker-space/
104
+
@@ -0,0 +1,10 @@
1
+ # Install with: pip install pre-commit && pre-commit install
2
+ # Run on all files: pre-commit run --all-files
3
+ repos:
4
+ - repo: https://github.com/astral-sh/ruff-pre-commit
5
+ rev: v0.15.22
6
+ hooks:
7
+ # Lint (with autofix), then format.
8
+ - id: ruff
9
+ args: [--fix]
10
+ - id: ruff-format
@@ -1,7 +1,5 @@
1
1
  include LICENSE
2
2
  include README.md
3
3
 
4
- include data/*
5
-
6
4
  recursive-exclude * __pycache__
7
5
  recursive-exclude * *.py[co]
@@ -1,34 +1,70 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyfmaps
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Python bindings for functional maps
5
5
  Author: Robin Magnet
6
6
  License: MIT License
7
+
8
+ Copyright (c) 2020 Robin Magnet
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the Software), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, andor sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
7
27
  Project-URL: Bug Tracker, https://github.com/RobinMagnet/pyFM/issues
8
- Project-URL: Documentation, https://github.com/RobinMagnet/pyFM/blob/master/example_notebook.ipynb
28
+ Project-URL: Documentation, https://robinmagnet.github.io/pyFM/
9
29
  Project-URL: Source Code, https://github.com/RobinMagnet/pyFM
10
30
  Project-URL: User Support, https://github.com/RobinMagnet/pyFM/issues
11
- Classifier: Development Status :: 2 - Pre-Alpha
31
+ Classifier: Development Status :: 4 - Beta
12
32
  Classifier: Intended Audience :: Developers
13
33
  Classifier: License :: OSI Approved :: MIT License
14
34
  Classifier: Operating System :: OS Independent
15
35
  Classifier: Programming Language :: Python
16
36
  Classifier: Programming Language :: Python :: 3
17
37
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Classifier: Programming Language :: Python :: 3.7
19
38
  Classifier: Programming Language :: Python :: 3.8
20
39
  Classifier: Programming Language :: Python :: 3.9
21
40
  Classifier: Programming Language :: Python :: 3.10
41
+ Classifier: Programming Language :: Python :: 3.11
42
+ Classifier: Programming Language :: Python :: 3.12
22
43
  Classifier: Topic :: Software Development :: Testing
23
- Requires-Python: >=3.7
44
+ Requires-Python: >=3.8
24
45
  Description-Content-Type: text/markdown
25
46
  License-File: LICENSE
26
47
  Requires-Dist: numpy
27
48
  Requires-Dist: scipy
28
- Requires-Dist: potpourri3d
49
+ Requires-Dist: potpourri3d>=1.3
29
50
  Requires-Dist: robust_laplacian
30
51
  Requires-Dist: tqdm
31
52
  Requires-Dist: scikit-learn
53
+ Provides-Extra: dev
54
+ Requires-Dist: ruff; extra == "dev"
55
+ Requires-Dist: pre-commit; extra == "dev"
56
+ Requires-Dist: pytest; extra == "dev"
57
+ Requires-Dist: pytest-cov; extra == "dev"
58
+ Requires-Dist: build; extra == "dev"
59
+ Provides-Extra: docs
60
+ Requires-Dist: furo; extra == "docs"
61
+ Requires-Dist: myst_parser>=0.13; extra == "docs"
62
+ Requires-Dist: sphinx>=4.0; extra == "docs"
63
+ Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
64
+ Requires-Dist: sphinx-copybutton; extra == "docs"
65
+ Requires-Dist: sphinx-design; extra == "docs"
66
+ Requires-Dist: sphinx-gallery; extra == "docs"
67
+ Requires-Dist: sphinx-math-dollar; extra == "docs"
32
68
  Dynamic: license-file
33
69
 
34
70
  # pyFM - Python Functional Maps Library
Binary file
@@ -0,0 +1,8 @@
1
+ {{ fullname | escape | underline }}
2
+
3
+ .. currentmodule:: {{ module }}
4
+
5
+ .. autoclass:: {{ objname }}
6
+ :members:
7
+ :show-inheritance:
8
+ :member-order: bysource
@@ -0,0 +1,52 @@
1
+ {{ fullname | escape | underline }}
2
+
3
+ .. automodule:: {{ fullname }}
4
+
5
+ {% block functions %}
6
+ {% if functions %}
7
+ .. rubric:: {{ _('Functions') }}
8
+
9
+ .. autosummary::
10
+ :toctree:
11
+ {% for item in functions %}
12
+ {{ item }}
13
+ {%- endfor %}
14
+ {% endif %}
15
+ {% endblock %}
16
+
17
+ {% block classes %}
18
+ {% if classes %}
19
+ .. rubric:: {{ _('Classes') }}
20
+
21
+ .. autosummary::
22
+ :toctree:
23
+ {% for item in classes %}
24
+ {{ item }}
25
+ {%- endfor %}
26
+ {% endif %}
27
+ {% endblock %}
28
+
29
+ {% block exceptions %}
30
+ {% if exceptions %}
31
+ .. rubric:: {{ _('Exceptions') }}
32
+
33
+ .. autosummary::
34
+ :toctree:
35
+ {% for item in exceptions %}
36
+ {{ item }}
37
+ {%- endfor %}
38
+ {% endif %}
39
+ {% endblock %}
40
+
41
+ {% block modules %}
42
+ {% if modules %}
43
+ .. rubric:: {{ _('Modules') }}
44
+
45
+ .. autosummary::
46
+ :toctree:
47
+ :recursive:
48
+ {% for item in modules %}
49
+ {{ item }}
50
+ {%- endfor %}
51
+ {% endif %}
52
+ {% endblock %}
@@ -0,0 +1,103 @@
1
+ .. _api_documentation:
2
+
3
+ API Documentation
4
+ =================
5
+
6
+ Complete reference for the ``pyFM`` package, generated from the source
7
+ docstrings. Every function, class, and method has its own page — use the tables
8
+ below or the sidebar to navigate.
9
+
10
+ Core classes
11
+ ------------
12
+
13
+ The high-level objects most users interact with.
14
+
15
+ .. autosummary::
16
+ :toctree: generated
17
+ :nosignatures:
18
+
19
+ ~pyFM.mesh.TriMesh
20
+ ~pyFM.functional.FunctionalMapping
21
+
22
+ Functional Map Network
23
+ ----------------------
24
+
25
+ Consistent map synchronization across a collection of shapes (the ``FMN``
26
+ class and its helpers).
27
+
28
+ .. autosummary::
29
+ :toctree: generated
30
+ :nosignatures:
31
+
32
+ ~pyFM.FMN.FMN.FMN
33
+ ~pyFM.FMN.FMN.CLB_quad_form
34
+
35
+ Shape signatures
36
+ ----------------
37
+
38
+ Heat and Wave Kernel Signatures.
39
+
40
+ .. autosummary::
41
+ :toctree: generated
42
+ :recursive:
43
+
44
+ pyFM.signatures
45
+
46
+ Spectral operations
47
+ -------------------
48
+
49
+ Conversions between pointwise and functional maps, shape difference operators,
50
+ and nearest-neighbour utilities.
51
+
52
+ .. autosummary::
53
+ :toctree: generated
54
+ :recursive:
55
+
56
+ pyFM.spectral
57
+
58
+ Map refinement
59
+ --------------
60
+
61
+ ICP and ZoomOut refinement of functional maps.
62
+
63
+ .. autosummary::
64
+ :toctree: generated
65
+ :recursive:
66
+
67
+ pyFM.refine
68
+
69
+ Evaluation
70
+ ----------
71
+
72
+ Geodesic accuracy, continuity, and coverage metrics for correspondences.
73
+
74
+ .. autosummary::
75
+ :toctree: generated
76
+ :recursive:
77
+
78
+ pyFM.eval
79
+
80
+ Mesh geometry & I/O
81
+ -------------------
82
+
83
+ Standalone geometric operators (areas, normals, gradients, geodesics),
84
+ Laplacians, and mesh file readers/writers.
85
+
86
+ .. autosummary::
87
+ :toctree: generated
88
+ :recursive:
89
+
90
+ pyFM.mesh.geometry
91
+ pyFM.mesh.laplacian
92
+ pyFM.mesh.file_utils
93
+
94
+ Optimization internals
95
+ ----------------------
96
+
97
+ Energy terms and gradients used by :class:`~pyFM.functional.FunctionalMapping`.
98
+
99
+ .. autosummary::
100
+ :toctree: generated
101
+ :recursive:
102
+
103
+ pyFM.optimize
@@ -0,0 +1,76 @@
1
+ # Configuration file for the Sphinx documentation builder.
2
+ #
3
+ # For the full list of built-in configuration values, see the documentation:
4
+ # https://www.sphinx-doc.org/en/master/usage/configuration.html
5
+
6
+
7
+ import importlib.metadata
8
+ import pathlib
9
+ import sys
10
+
11
+ sys.path.insert(0, pathlib.Path(__file__).parents[2].resolve().as_posix())
12
+
13
+ # -- Project information -----------------------------------------------------
14
+ # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
15
+
16
+ project = "pyfmaps"
17
+ copyright = "2024, Robin Magnet"
18
+ author = "Robin Magnet"
19
+ try:
20
+ release = importlib.metadata.version("pyfmaps")
21
+ except importlib.metadata.PackageNotFoundError:
22
+ release = "0.0.0"
23
+
24
+
25
+ # -- General configuration ---------------------------------------------------
26
+ # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
27
+
28
+ extensions = [
29
+ "sphinx.ext.duration",
30
+ "sphinx.ext.doctest",
31
+ "sphinx.ext.autodoc",
32
+ "sphinx.ext.autosummary",
33
+ "sphinx.ext.napoleon",
34
+ "sphinx_autodoc_typehints", # merge type hints into descriptions (after napoleon)
35
+ "sphinx_math_dollar",
36
+ "sphinx.ext.mathjax",
37
+ "sphinx_copybutton", # copy button on code blocks
38
+ "myst_parser",
39
+ "sphinx_design",
40
+ ]
41
+
42
+ # Napoleon (numpydoc parsing)
43
+ napoleon_google_docstring = False
44
+ napoleon_numpy_docstring = True
45
+ napoleon_use_param = True
46
+ napoleon_use_rtype = True
47
+
48
+ # Members are documented on their own per-object pages (numpy-style), so module
49
+ # and class pages only render the module/class docstring + summary tables.
50
+ autodoc_default_options = {"member-order": "bysource"}
51
+ autosummary_generate = True
52
+ # Honour each module's __all__ so only intended public names are documented
53
+ # (default True *ignores* __all__, which would leak imported numpy/tqdm/sklearn names).
54
+ autosummary_ignore_module_all = False
55
+
56
+ templates_path = ["_templates"]
57
+ exclude_patterns = []
58
+
59
+ source_suffix = [".rst", ".md"]
60
+
61
+
62
+ # -- Options for HTML output -------------------------------------------------
63
+ # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
64
+
65
+ html_theme = "furo"
66
+ html_static_path = ["_static"]
67
+
68
+
69
+ from sphinx.ext.autodoc import between
70
+
71
+
72
+ def setup(app):
73
+ # Register a sphinx.ext.autodoc.between listener to ignore everything
74
+ # between lines that contain the word IGNORE
75
+ app.connect("autodoc-process-docstring", between("^.*IGNORE.*$", exclude=True))
76
+ return app
@@ -0,0 +1,15 @@
1
+ Examples
2
+ ========
3
+
4
+ Runnable example notebooks live in the
5
+ [`examples/` directory](https://github.com/RobinMagnet/pyFM/tree/master/examples)
6
+ of the repository:
7
+
8
+ - **`mesh_and_matching/basic_functions.ipynb`** — compute a functional map
9
+ between two meshes and convert it to a point-to-point map.
10
+ - **`mesh_and_matching/matching_with_zoomout.ipynb`** — refine a map with
11
+ ZoomOut.
12
+ - **`functional_map_network/FMN_base.ipynb`** — consistent maps across a
13
+ collection of shapes with the Functional Map Network.
14
+
15
+ Richer example pages with interactive plots are planned for a future release.