groupoid 0.1.0.dev7__tar.gz → 0.1.0.dev8__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 (83) hide show
  1. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/ci.yml +26 -1
  2. groupoid-0.1.0.dev8/.zenodo.json +34 -0
  3. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CHANGELOG.md +14 -0
  4. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CITATION.cff +2 -2
  5. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/LIMITATIONS.md +1 -1
  6. {groupoid-0.1.0.dev7/groupoid.egg-info → groupoid-0.1.0.dev8}/PKG-INFO +6 -6
  7. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/README.md +4 -3
  8. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/REPRODUCE.md +2 -1
  9. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/STATUS.md +2 -2
  10. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/codemeta.json +1 -1
  11. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/index.md +1 -1
  12. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/quickstart.md +2 -1
  13. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/__init__.py +1 -1
  14. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8/groupoid.egg-info}/PKG-INFO +6 -6
  15. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/pyproject.toml +7 -6
  16. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/scripts/reproduce_sheaf_laplacian.py +1 -1
  17. groupoid-0.1.0.dev7/.zenodo.json +0 -34
  18. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  20. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/mathematical_correction.md +0 -0
  21. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/dependabot.yml +0 -0
  22. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/artifact-transfer.yml +0 -0
  23. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/auto-tag-release.yml +0 -0
  24. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/docs-deploy.yml +0 -0
  25. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/release.yml +0 -0
  26. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.gitignore +0 -0
  27. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.pre-commit-config.yaml +0 -0
  28. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CONTRIBUTING.md +0 -0
  29. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CORRECTION_NOTICE.md +0 -0
  30. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/LICENSE +0 -0
  31. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/PROBLEMS.md +0 -0
  32. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/SECURITY.md +0 -0
  33. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/__init__.py +0 -0
  34. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/conftest.py +0 -0
  35. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/test_karcher_benchmark.py +0 -0
  36. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/api.md +0 -0
  37. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/overrides/404.html +0 -0
  38. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/theory.md +0 -0
  39. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/README.md +0 -0
  40. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/__init__.py +0 -0
  41. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/synthetic_curve_demo.py +0 -0
  42. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/PREREGISTRATION.md +0 -0
  43. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/README.md +0 -0
  44. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/RESULTS.md +0 -0
  45. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/analyze.py +0 -0
  46. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/results.json +0 -0
  47. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/run_benchmark.py +0 -0
  48. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/aggregation.py +0 -0
  49. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/cohomology.py +0 -0
  50. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/groupoid.py +0 -0
  51. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/laplacian.py +0 -0
  52. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/manifold.py +0 -0
  53. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/optimizer.py +0 -0
  54. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/persistence.py +0 -0
  55. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/sheaf.py +0 -0
  56. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/transport.py +0 -0
  57. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/SOURCES.txt +0 -0
  58. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/dependency_links.txt +0 -0
  59. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/requires.txt +0 -0
  60. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/top_level.txt +0 -0
  61. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/mkdocs.yml +0 -0
  62. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/scripts/bind_release_sbom.py +0 -0
  63. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/setup.cfg +0 -0
  64. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/__init__.py +0 -0
  65. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_aggregation_disconnected.py +0 -0
  66. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_audit_regressions.py +0 -0
  67. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_cohomology_cocycle.py +0 -0
  68. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_coverage_gaps.py +0 -0
  69. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_defensive_paths.py +0 -0
  70. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_imports.py +0 -0
  71. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_integration.py +0 -0
  72. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_optimizer_validation.py +0 -0
  73. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_persistence.py +0 -0
  74. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_persistence_dimension_labels.py +0 -0
  75. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_pipeline_integration.py +0 -0
  76. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_release_sbom_binding.py +0 -0
  77. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_release_workflow_integrity.py +0 -0
  78. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_scientific_corrections.py +0 -0
  79. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_sheaf_laplacian.py +0 -0
  80. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_smoke.py +0 -0
  81. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_transport_validation.py +0 -0
  82. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/theory/__init__.py +0 -0
  83. {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/theory/test_mathematical_invariants.py +0 -0
@@ -34,11 +34,36 @@ jobs:
34
34
  - name: Run mypy (strict)
35
35
  run: mypy --strict groupoid/ --ignore-missing-imports
36
36
 
37
+ # Retain the protected-main historical check name while making its semantics
38
+ # a negative compatibility test. It proves that Python 3.10 is REJECTED;
39
+ # supported functional tests run only on Python 3.11 and 3.12 above.
40
+ unsupported-python310:
41
+ name: test (3.10)
42
+ runs-on: ubuntu-latest
43
+ steps:
44
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
45
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
46
+ with:
47
+ python-version: "3.10"
48
+ - name: Verify unsupported interpreter is rejected by package metadata
49
+ run: |
50
+ set -euo pipefail
51
+ if python -m pip install --no-deps . > /tmp/unsupported-python.log 2>&1; then
52
+ cat /tmp/unsupported-python.log
53
+ echo "::error::Python 3.10 installation unexpectedly succeeded"
54
+ exit 1
55
+ fi
56
+ if ! grep -Eqi "requires a different Python|requires-python|requires Python" /tmp/unsupported-python.log; then
57
+ cat /tmp/unsupported-python.log
58
+ echo "::error::Installation failed for an unexpected reason"
59
+ exit 1
60
+ fi
61
+
37
62
  test:
38
63
  runs-on: ubuntu-latest
39
64
  strategy:
40
65
  matrix:
41
- python-version: ["3.10", "3.11", "3.12"]
66
+ python-version: ["3.11", "3.12"]
42
67
  steps:
43
68
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
44
69
  - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
@@ -0,0 +1,34 @@
1
+ {
2
+ "upload_type": "software",
3
+ "title": "GROUPOID: Groupoid-based aggregation for federated learning on Riemannian manifolds",
4
+ "version": "0.1.0.dev8",
5
+ "description": "<p>Pre-alpha research prototype exploring groupoid-based aggregation for federated learning on Riemannian manifolds. The supported point-valued aggregation path uses explicit invertible point actions, a cycle-basis holonomy defect diagnostic, the cellular sheaf Laplacian, and Karcher mean aggregation via geomstats. Tangent-vector parallel transport is provided separately through Schild and pole ladder utilities.</p><p><strong>Compatibility release v0.1.0.dev8:</strong> Python 3.10 support retired following upstream EOL on 2026-10-01. The supported runtime is Python 3.11-3.12; installation on 3.10 now fails closed via Requires-Python. No scientific algorithm or historical benchmark changes.</p><p><strong>Corrective release v0.1.0.dev7:</strong> the finite H0 bottleneck distance to an empty diagram is now half the longest unmatched interval, rather than an incorrect zero (both comparison directions tested). The unused mandatory PyTorch dependency was removed, reducing installation and audit complexity, and CI dependency scanning now runs without vulnerability exceptions. Pre-alpha research maturity, known limits on the H0-only diagnostic, and historical experiment results are unchanged. Existing environments may retain PyTorch after an upgrade.</p><p><strong>Library correction in v0.1.0.dev6:</strong> in v0.1.0.dev5 and earlier, the pole ladder used a step schedule that did not reach the endpoint for more than one rung, and the function named schild_ladder was a pole-ladder variant rather than Schild's construction; tangent-vector transport results from those versions with n_rungs greater than 1, including the default two-rung tangent transport operator, are incorrect. v0.1.0.dev6 corrects both ladders and adds input validation for unknown transport methods, n_rungs below 1, negative, non-finite or zero-sum aggregation weights, and non-finite holonomy maps. The preregistered benchmark uses explicit transport maps, not the ladders; its stored results are unchanged and were reproduced bit-for-bit under the dev6 candidate. The project remains a pre-alpha research prototype.</p><p><strong>Scientific correction in v0.1.0.dev5:</strong> earlier releases described the cycle-basis holonomy statistic as a first-cohomology (H^1) norm. The implementation actually computes the maximum Frobenius deviation of holonomy from identity over the particular NetworkX cycle basis. Exact zero has a flatness interpretation under explicit connectedness, completeness, invertibility, reciprocal opposite-edge registration when both directions are supplied, and complete evaluation of every cycle emitted by the NetworkX cycle-basis routine (an argument specific to the NetworkX Paton implementation exercised here, not to arbitrary cycle bases), but the nonzero magnitude is basis-dependent and is not invariant under arbitrary invertible changes of frame. The stored preregistered benchmark values are unchanged; the historical H2 rho and permutation p-value are reinterpreted as statistics for this fixed cycle-basis defect, not for a canonical H^1 norm. This version also withdraws register_transport_from_points from the supported point-valued aggregation path: its ambient square operator is assembled from transported tangent vectors and does not generally define the invertible manifold point action that aggregation requires. Tangent-vector ladder validation remains supported. The ambient tangent-matrix helper is restricted to vector-shaped point representations. Direct registered matrices are supported only under the explicit point-action contract documented in the repository, including reciprocal opposite arrows when both orientations are stored. See CORRECTION_NOTICE.md for the full correction record.</p><p>The earlier v0.1.0.dev0 version DOI 10.5281/zenodo.20563975 remains superseded and must not be cited for results. Exact historical versions should be cited by their version-specific DOI; project-level DOI metadata is maintained through the Zenodo version family.</p>",
6
+ "creators": [
7
+ {
8
+ "name": "Maniches, Santiago",
9
+ "affiliation": "TOPOLOGICA LLC",
10
+ "orcid": "0009-0005-6480-1987"
11
+ }
12
+ ],
13
+ "license": "Apache-2.0",
14
+ "keywords": [
15
+ "federated learning",
16
+ "Riemannian geometry",
17
+ "groupoid",
18
+ "sheaf theory",
19
+ "holonomy",
20
+ "topological data analysis"
21
+ ],
22
+ "related_identifiers": [
23
+ {
24
+ "identifier": "10.5281/zenodo.20563974",
25
+ "relation": "isVersionOf",
26
+ "scheme": "doi"
27
+ },
28
+ {
29
+ "identifier": "https://github.com/smaniches/GROUPOID",
30
+ "relation": "isSupplementTo",
31
+ "scheme": "url"
32
+ }
33
+ ]
34
+ }
@@ -8,6 +8,20 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.1.0.dev8] - 2026-10-30
12
+
13
+ ### Changed
14
+
15
+ - **Retired end-of-life Python 3.10 support.** Python 3.11 and 3.12 are the
16
+ supported and tested interpreter versions; `Requires-Python`, package
17
+ classifiers, installation instructions, test matrix, and citation metadata
18
+ now agree. Python 3.10 reached upstream end of life on October 1, 2026.
19
+ Existing users of Python 3.10 should migrate to 3.11 or 3.12 before
20
+ upgrading this package. Python 3.13+ remains excluded for the separately
21
+ documented numerical dependency constraints.
22
+ - This release contains no algorithm or scientific-method changes; historical
23
+ experimental artifacts and scientific qualification statements are unchanged.
24
+
11
25
  ## [0.1.0.dev7] - 2026-10-29
12
26
 
13
27
  Pre-alpha corrective release distributing the October 29 fixes already merged
@@ -2,8 +2,8 @@ cff-version: 1.2.0
2
2
  message: "If you use this software, please cite the Concept DOI below so the citation resolves to the latest version."
3
3
  type: software
4
4
  title: "GROUPOID: Groupoid-based aggregation for federated learning on Riemannian manifolds"
5
- version: 0.1.0.dev7
6
- date-released: 2026-10-29
5
+ version: 0.1.0.dev8
6
+ date-released: 2026-10-30
7
7
  license: Apache-2.0
8
8
  repository-code: "https://github.com/smaniches/GROUPOID"
9
9
  doi: 10.5281/zenodo.20563974
@@ -119,7 +119,7 @@ system. The following limitations apply.
119
119
  ## Test coverage
120
120
 
121
121
  - Releases are gated on the repository's hard line and branch coverage checks
122
- on Python 3.10-3.12. Coverage is not validation: the scientific correction
122
+ on Python 3.11-3.12. Coverage is not validation: the scientific correction
123
123
  adds explicit tests for basis dependence, general non-orthogonal gauge
124
124
  dependence of the defect magnitude, the tangent/point representation
125
125
  boundary, and the supported SO(3) point-action round trip.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: groupoid
3
- Version: 0.1.0.dev7
3
+ Version: 0.1.0.dev8
4
4
  Summary: Research prototype: groupoid-based aggregation for federated learning on Riemannian manifolds
5
5
  Author-email: Santiago Maniches <santiago.maniches@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -13,12 +13,11 @@ Keywords: federated-learning,riemannian-geometry,groupoid,topology,sheaf-theory,
13
13
  Classifier: Development Status :: 2 - Pre-Alpha
14
14
  Classifier: Intended Audience :: Science/Research
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
19
18
  Classifier: Topic :: Scientific/Engineering :: Mathematics
20
19
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
- Requires-Python: <3.13,>=3.10
20
+ Requires-Python: <3.13,>=3.11
22
21
  Description-Content-Type: text/markdown
23
22
  License-File: LICENSE
24
23
  Requires-Dist: geomstats>=0.7
@@ -67,7 +66,7 @@ Dynamic: license-file
67
66
  [![CI](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml/badge.svg)](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
68
67
  [![PyPI](https://img.shields.io/pypi/v/groupoid.svg)](https://pypi.org/project/groupoid/)
69
68
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
70
- [![Python 3.10-3.12](https://img.shields.io/badge/python-3.10--3.12-blue.svg)](https://www.python.org/downloads/)
69
+ [![Python 3.11-3.12](https://img.shields.io/badge/python-3.11--3.12-blue.svg)](https://www.python.org/downloads/)
71
70
  [![Status](https://img.shields.io/badge/status-pre--alpha-orange.svg)](#status)
72
71
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20563974.svg)](https://doi.org/10.5281/zenodo.20563974)
73
72
 
@@ -204,7 +203,8 @@ hypothesis remains **unvalidated on real federated learning tasks** (see
204
203
 
205
204
  ## Installation
206
205
 
207
- Requires **Python 3.10, 3.11, or 3.12**. Python 3.13+ is not supported: the
206
+ Requires **Python 3.11 or 3.12**. Python 3.10 reached end of life on
207
+ October 1, 2026 and is no longer supported. Python 3.13+ is not supported: the
208
208
  `numpy<2.0` / `scipy<1.16` pins (needed for geomstats compatibility, see
209
209
  [LIMITATIONS.md](LIMITATIONS.md)) have no wheels there, so `pip` will refuse
210
210
  with a `Requires-Python` message rather than attempt a source build.
@@ -269,7 +269,7 @@ pytest tests/ -v
269
269
  ```
270
270
 
271
271
  The suite reaches 100% line and branch coverage of the `groupoid` package
272
- on Python 3.10-3.12, enforced in CI:
272
+ on Python 3.11-3.12, enforced in CI:
273
273
 
274
274
  ```bash
275
275
  pytest tests/ --cov=groupoid --cov-branch --cov-fail-under=100
@@ -3,7 +3,7 @@
3
3
  [![CI](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml/badge.svg)](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
4
4
  [![PyPI](https://img.shields.io/pypi/v/groupoid.svg)](https://pypi.org/project/groupoid/)
5
5
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
6
- [![Python 3.10-3.12](https://img.shields.io/badge/python-3.10--3.12-blue.svg)](https://www.python.org/downloads/)
6
+ [![Python 3.11-3.12](https://img.shields.io/badge/python-3.11--3.12-blue.svg)](https://www.python.org/downloads/)
7
7
  [![Status](https://img.shields.io/badge/status-pre--alpha-orange.svg)](#status)
8
8
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20563974.svg)](https://doi.org/10.5281/zenodo.20563974)
9
9
 
@@ -140,7 +140,8 @@ hypothesis remains **unvalidated on real federated learning tasks** (see
140
140
 
141
141
  ## Installation
142
142
 
143
- Requires **Python 3.10, 3.11, or 3.12**. Python 3.13+ is not supported: the
143
+ Requires **Python 3.11 or 3.12**. Python 3.10 reached end of life on
144
+ October 1, 2026 and is no longer supported. Python 3.13+ is not supported: the
144
145
  `numpy<2.0` / `scipy<1.16` pins (needed for geomstats compatibility, see
145
146
  [LIMITATIONS.md](LIMITATIONS.md)) have no wheels there, so `pip` will refuse
146
147
  with a `Requires-Python` message rather than attempt a source build.
@@ -205,7 +206,7 @@ pytest tests/ -v
205
206
  ```
206
207
 
207
208
  The suite reaches 100% line and branch coverage of the `groupoid` package
208
- on Python 3.10-3.12, enforced in CI:
209
+ on Python 3.11-3.12, enforced in CI:
209
210
 
210
211
  ```bash
211
212
  pytest tests/ --cov=groupoid --cov-branch --cov-fail-under=100
@@ -8,7 +8,8 @@ repeated runs, and matches the invariants asserted in
8
8
 
9
9
  ## Environment
10
10
 
11
- - **Python 3.10, 3.11, or 3.12** (not 3.13+; the `numpy<2.0` / `scipy<1.16`
11
+ - **Python 3.11 or 3.12** (Python 3.10 reached upstream EOL on
12
+ 2026-10-01; not 3.13+ because the `numpy<2.0` / `scipy<1.16`
12
13
  pins required by geomstats have no wheels there -- see
13
14
  [LIMITATIONS.md](LIMITATIONS.md)).
14
15
  - Pins used to produce the receipt below: `numpy 1.26.4`, `scipy 1.13.1`,
@@ -79,7 +79,7 @@ behavior against a known-correct reference or analytic result.
79
79
  ## Test coverage
80
80
 
81
81
  The committed test suite reaches 100% line and branch coverage of the
82
- `groupoid` package on the supported interpreters (Python 3.10-3.12),
82
+ `groupoid` package on the supported interpreters (Python 3.11-3.12),
83
83
  enforced in CI with `--cov-branch --cov-fail-under=100`. The only excluded
84
84
  lines are two provably-unreachable defensive guards in `aggregation.py` and
85
85
  a `TYPE_CHECKING`-only import in `manifold.py`, each marked with
@@ -90,5 +90,5 @@ not capture.
90
90
 
91
91
  ## Versioning
92
92
 
93
- This project uses `0.1.0.dev7` to indicate pre-release development.
93
+ This project uses `0.1.0.dev8` to indicate pre-release development.
94
94
  The API is unstable and will change without notice.
@@ -6,7 +6,7 @@
6
6
  "codeRepository": "https://github.com/smaniches/GROUPOID",
7
7
  "programmingLanguage": "Python",
8
8
  "license": "Apache-2.0",
9
- "version": "0.1.0.dev7",
9
+ "version": "0.1.0.dev8",
10
10
  "author": [
11
11
  {
12
12
  "@type": "Person",
@@ -43,7 +43,7 @@ norm; see the correction notice for the exact construct and assumptions.
43
43
  ## Test coverage
44
44
 
45
45
  The committed suite reaches 100% line and branch coverage of the
46
- `groupoid` package on Python 3.10-3.12, enforced in CI
46
+ `groupoid` package on Python 3.11-3.12, enforced in CI
47
47
  (`--cov-branch --cov-fail-under=100`). Coverage measures which lines run,
48
48
  not whether behavior is correct; the tables above record the validation
49
49
  depth per module, which coverage alone does not capture.
@@ -2,7 +2,8 @@
2
2
 
3
3
  ## Installation
4
4
 
5
- Requires Python 3.10, 3.11, or 3.12.
5
+ Requires Python 3.11 or 3.12. Python 3.10 reached end of life on
6
+ 2026-10-01 and is no longer supported.
6
7
 
7
8
  ### From PyPI
8
9
 
@@ -1,6 +1,6 @@
1
1
  """GROUPOID: Groupoid-based federated learning with Riemannian geometry."""
2
2
 
3
- __version__ = "0.1.0.dev7"
3
+ __version__ = "0.1.0.dev8"
4
4
 
5
5
  from groupoid.aggregation import (
6
6
  DisconnectedClientGraphError,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: groupoid
3
- Version: 0.1.0.dev7
3
+ Version: 0.1.0.dev8
4
4
  Summary: Research prototype: groupoid-based aggregation for federated learning on Riemannian manifolds
5
5
  Author-email: Santiago Maniches <santiago.maniches@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -13,12 +13,11 @@ Keywords: federated-learning,riemannian-geometry,groupoid,topology,sheaf-theory,
13
13
  Classifier: Development Status :: 2 - Pre-Alpha
14
14
  Classifier: Intended Audience :: Science/Research
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
19
18
  Classifier: Topic :: Scientific/Engineering :: Mathematics
20
19
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
- Requires-Python: <3.13,>=3.10
20
+ Requires-Python: <3.13,>=3.11
22
21
  Description-Content-Type: text/markdown
23
22
  License-File: LICENSE
24
23
  Requires-Dist: geomstats>=0.7
@@ -67,7 +66,7 @@ Dynamic: license-file
67
66
  [![CI](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml/badge.svg)](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
68
67
  [![PyPI](https://img.shields.io/pypi/v/groupoid.svg)](https://pypi.org/project/groupoid/)
69
68
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
70
- [![Python 3.10-3.12](https://img.shields.io/badge/python-3.10--3.12-blue.svg)](https://www.python.org/downloads/)
69
+ [![Python 3.11-3.12](https://img.shields.io/badge/python-3.11--3.12-blue.svg)](https://www.python.org/downloads/)
71
70
  [![Status](https://img.shields.io/badge/status-pre--alpha-orange.svg)](#status)
72
71
  [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20563974.svg)](https://doi.org/10.5281/zenodo.20563974)
73
72
 
@@ -204,7 +203,8 @@ hypothesis remains **unvalidated on real federated learning tasks** (see
204
203
 
205
204
  ## Installation
206
205
 
207
- Requires **Python 3.10, 3.11, or 3.12**. Python 3.13+ is not supported: the
206
+ Requires **Python 3.11 or 3.12**. Python 3.10 reached end of life on
207
+ October 1, 2026 and is no longer supported. Python 3.13+ is not supported: the
208
208
  `numpy<2.0` / `scipy<1.16` pins (needed for geomstats compatibility, see
209
209
  [LIMITATIONS.md](LIMITATIONS.md)) have no wheels there, so `pip` will refuse
210
210
  with a `Requires-Python` message rather than attempt a source build.
@@ -269,7 +269,7 @@ pytest tests/ -v
269
269
  ```
270
270
 
271
271
  The suite reaches 100% line and branch coverage of the `groupoid` package
272
- on Python 3.10-3.12, enforced in CI:
272
+ on Python 3.11-3.12, enforced in CI:
273
273
 
274
274
  ```bash
275
275
  pytest tests/ --cov=groupoid --cov-branch --cov-fail-under=100
@@ -4,15 +4,16 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "groupoid"
7
- version = "0.1.0.dev7"
7
+ version = "0.1.0.dev8"
8
8
  description = "Research prototype: groupoid-based aggregation for federated learning on Riemannian manifolds"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
11
11
  # Upper bound is real: the numpy<2.0 / scipy<1.16 pins below (required for
12
12
  # geomstats compatibility) have no wheels for Python 3.13+, so 3.13 would
13
13
  # attempt a doomed source build. Capping here makes pip refuse cleanly with a
14
- # Requires-Python message instead. Supported: 3.10-3.12.
15
- requires-python = ">=3.10,<3.13"
14
+ # Requires-Python message instead. Python 3.10 reached EOL on 2026-10-01;
15
+ # the supported, CI-tested interpreter range is Python 3.11-3.12.
16
+ requires-python = ">=3.11,<3.13"
16
17
  authors = [
17
18
  {name = "Santiago Maniches", email = "santiago.maniches@gmail.com"},
18
19
  ]
@@ -29,7 +30,6 @@ classifiers = [
29
30
  "Development Status :: 2 - Pre-Alpha",
30
31
  "Intended Audience :: Science/Research",
31
32
  "Programming Language :: Python :: 3",
32
- "Programming Language :: Python :: 3.10",
33
33
  "Programming Language :: Python :: 3.11",
34
34
  "Programming Language :: Python :: 3.12",
35
35
  "Topic :: Scientific/Engineering :: Mathematics",
@@ -97,6 +97,7 @@ Changelog = "https://github.com/smaniches/GROUPOID/blob/main/CHANGELOG.md"
97
97
  include = ["groupoid*"]
98
98
 
99
99
  [tool.ruff]
100
+ # Keep lint syntax conservative; this is not a runtime-support declaration.
100
101
  target-version = "py310"
101
102
  line-length = 99
102
103
 
@@ -109,7 +110,7 @@ target-version = ["py310"]
109
110
  line-length = 99
110
111
 
111
112
  [tool.mypy]
112
- python_version = "3.10"
113
+ python_version = "3.11"
113
114
  warn_return_any = true
114
115
  warn_unused_configs = true
115
116
  disallow_untyped_defs = false
@@ -131,7 +132,7 @@ source = ["groupoid"]
131
132
 
132
133
  [tool.coverage.report]
133
134
  # Honest gate: the committed test suite achieves 100% line + branch coverage
134
- # on the supported interpreters (3.10-3.12). The only excluded lines are two
135
+ # on the supported interpreters (3.11-3.12). The only excluded lines are two
135
136
  # provably-unreachable defensive guards in aggregation.py and a TYPE_CHECKING-
136
137
  # only import in manifold.py, each marked with `# pragma: no cover` and a
137
138
  # one-line justification. Coverage is necessary but
@@ -10,7 +10,7 @@ tests/test_sheaf_laplacian.py (the general, non-degenerate case):
10
10
  3. For orthogonal transport R_uv = g_v g_u^{-1}, transport-consistent global
11
11
  sections lie in ker(L), constant sections do not, and dim(ker L) == stalk.
12
12
 
13
- Run (from the repo root, in a Python 3.10-3.12 env with the package installed):
13
+ Run (from the repo root, in a Python 3.11-3.12 env with the package installed):
14
14
 
15
15
  python scripts/reproduce_sheaf_laplacian.py
16
16
 
@@ -1,34 +0,0 @@
1
- {
2
- "upload_type": "software",
3
- "title": "GROUPOID: Groupoid-based aggregation for federated learning on Riemannian manifolds",
4
- "version": "0.1.0.dev7",
5
- "description": "<p>Pre-alpha research prototype exploring groupoid-based aggregation for federated learning on Riemannian manifolds. The supported point-valued aggregation path uses explicit invertible point actions, a cycle-basis holonomy defect diagnostic, the cellular sheaf Laplacian, and Karcher mean aggregation via geomstats. Tangent-vector parallel transport is provided separately through Schild and pole ladder utilities.</p><p><strong>Corrective release v0.1.0.dev7:</strong> the finite H0 bottleneck distance to an empty diagram is now half the longest unmatched interval, rather than an incorrect zero (both comparison directions tested). The unused mandatory PyTorch dependency was removed, reducing installation and audit complexity, and CI dependency scanning now runs without vulnerability exceptions. Pre-alpha research maturity, known limits on the H0-only diagnostic, and historical experiment results are unchanged. Existing environments may retain PyTorch after an upgrade.</p><p><strong>Library correction in v0.1.0.dev6:</strong> in v0.1.0.dev5 and earlier, the pole ladder used a step schedule that did not reach the endpoint for more than one rung, and the function named schild_ladder was a pole-ladder variant rather than Schild's construction; tangent-vector transport results from those versions with n_rungs greater than 1, including the default two-rung tangent transport operator, are incorrect. v0.1.0.dev6 corrects both ladders and adds input validation for unknown transport methods, n_rungs below 1, negative, non-finite or zero-sum aggregation weights, and non-finite holonomy maps. The preregistered benchmark uses explicit transport maps, not the ladders; its stored results are unchanged and were reproduced bit-for-bit under the dev6 candidate. The project remains a pre-alpha research prototype.</p><p><strong>Scientific correction in v0.1.0.dev5:</strong> earlier releases described the cycle-basis holonomy statistic as a first-cohomology (H^1) norm. The implementation actually computes the maximum Frobenius deviation of holonomy from identity over the particular NetworkX cycle basis. Exact zero has a flatness interpretation under explicit connectedness, completeness, invertibility, reciprocal opposite-edge registration when both directions are supplied, and complete evaluation of every cycle emitted by the NetworkX cycle-basis routine (an argument specific to the NetworkX Paton implementation exercised here, not to arbitrary cycle bases), but the nonzero magnitude is basis-dependent and is not invariant under arbitrary invertible changes of frame. The stored preregistered benchmark values are unchanged; the historical H2 rho and permutation p-value are reinterpreted as statistics for this fixed cycle-basis defect, not for a canonical H^1 norm. This version also withdraws register_transport_from_points from the supported point-valued aggregation path: its ambient square operator is assembled from transported tangent vectors and does not generally define the invertible manifold point action that aggregation requires. Tangent-vector ladder validation remains supported. The ambient tangent-matrix helper is restricted to vector-shaped point representations. Direct registered matrices are supported only under the explicit point-action contract documented in the repository, including reciprocal opposite arrows when both orientations are stored. See CORRECTION_NOTICE.md for the full correction record.</p><p>The earlier v0.1.0.dev0 version DOI 10.5281/zenodo.20563975 remains superseded and must not be cited for results. Exact historical versions should be cited by their version-specific DOI; project-level DOI metadata is maintained through the Zenodo version family.</p>",
6
- "creators": [
7
- {
8
- "name": "Maniches, Santiago",
9
- "affiliation": "TOPOLOGICA LLC",
10
- "orcid": "0009-0005-6480-1987"
11
- }
12
- ],
13
- "license": "Apache-2.0",
14
- "keywords": [
15
- "federated learning",
16
- "Riemannian geometry",
17
- "groupoid",
18
- "sheaf theory",
19
- "holonomy",
20
- "topological data analysis"
21
- ],
22
- "related_identifiers": [
23
- {
24
- "identifier": "10.5281/zenodo.20563974",
25
- "relation": "isVersionOf",
26
- "scheme": "doi"
27
- },
28
- {
29
- "identifier": "https://github.com/smaniches/GROUPOID",
30
- "relation": "isSupplementTo",
31
- "scheme": "url"
32
- }
33
- ]
34
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes