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.
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/ci.yml +26 -1
- groupoid-0.1.0.dev8/.zenodo.json +34 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CHANGELOG.md +14 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CITATION.cff +2 -2
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/LIMITATIONS.md +1 -1
- {groupoid-0.1.0.dev7/groupoid.egg-info → groupoid-0.1.0.dev8}/PKG-INFO +6 -6
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/README.md +4 -3
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/REPRODUCE.md +2 -1
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/STATUS.md +2 -2
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/codemeta.json +1 -1
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/index.md +1 -1
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/quickstart.md +2 -1
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/__init__.py +1 -1
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8/groupoid.egg-info}/PKG-INFO +6 -6
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/pyproject.toml +7 -6
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/scripts/reproduce_sheaf_laplacian.py +1 -1
- groupoid-0.1.0.dev7/.zenodo.json +0 -34
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/mathematical_correction.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/dependabot.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/artifact-transfer.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/auto-tag-release.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/docs-deploy.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/workflows/release.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.gitignore +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.pre-commit-config.yaml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CONTRIBUTING.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/CORRECTION_NOTICE.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/LICENSE +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/PROBLEMS.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/SECURITY.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/__init__.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/conftest.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/benchmarks/test_karcher_benchmark.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/api.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/overrides/404.html +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/docs/theory.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/README.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/__init__.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/examples/synthetic_curve_demo.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/PREREGISTRATION.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/README.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/RESULTS.md +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/analyze.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/results.json +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/experiments/run_benchmark.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/aggregation.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/cohomology.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/groupoid.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/laplacian.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/manifold.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/optimizer.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/persistence.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/sheaf.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid/transport.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/SOURCES.txt +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/dependency_links.txt +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/requires.txt +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/groupoid.egg-info/top_level.txt +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/mkdocs.yml +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/scripts/bind_release_sbom.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/setup.cfg +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/__init__.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_aggregation_disconnected.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_audit_regressions.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_cohomology_cocycle.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_coverage_gaps.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_defensive_paths.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_imports.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_integration.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_optimizer_validation.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_persistence.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_persistence_dimension_labels.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_pipeline_integration.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_release_sbom_binding.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_release_workflow_integrity.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_scientific_corrections.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_sheaf_laplacian.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_smoke.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/test_transport_validation.py +0 -0
- {groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/tests/theory/__init__.py +0 -0
- {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.
|
|
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.
|
|
6
|
-
date-released: 2026-10-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
[](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
|
|
68
67
|
[](https://pypi.org/project/groupoid/)
|
|
69
68
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
70
|
-
[](https://www.python.org/downloads/)
|
|
71
70
|
[](#status)
|
|
72
71
|
[](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.
|
|
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.
|
|
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
|
[](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
|
|
4
4
|
[](https://pypi.org/project/groupoid/)
|
|
5
5
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
6
|
-
[](https://www.python.org/downloads/)
|
|
7
7
|
[](#status)
|
|
8
8
|
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
93
|
+
This project uses `0.1.0.dev8` to indicate pre-release development.
|
|
94
94
|
The API is unstable and will change without notice.
|
|
@@ -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.
|
|
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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: groupoid
|
|
3
|
-
Version: 0.1.0.
|
|
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.
|
|
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
|
[](https://github.com/smaniches/GROUPOID/actions/workflows/ci.yml)
|
|
68
67
|
[](https://pypi.org/project/groupoid/)
|
|
69
68
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
70
|
-
[](https://www.python.org/downloads/)
|
|
71
70
|
[](#status)
|
|
72
71
|
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
15
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
groupoid-0.1.0.dev7/.zenodo.json
DELETED
|
@@ -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
|
{groupoid-0.1.0.dev7 → groupoid-0.1.0.dev8}/.github/ISSUE_TEMPLATE/mathematical_correction.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|