Research prototype: groupoid-based aggregation for federated learning on Riemannian manifolds
Project description
GROUPOID
Pre-alpha research prototype. This is an early-stage exploration of groupoid-based aggregation for federated learning on Riemannian manifolds. It is not a production federated learning system. See STATUS.md and LIMITATIONS.md.
Overview
GROUPOID explores using transport groupoids, cellular sheaves, and Riemannian geometry to aggregate model parameters across heterogeneous federated clients. The core idea: instead of naive Euclidean averaging (FedAvg), transport client parameters to a common frame via groupoid morphisms, check cohomological consistency, and compute the intrinsic Karcher mean on the parameter manifold.
Implemented and tested
These components have working implementations with property-based and integration tests:
- Karcher mean on Riemannian manifolds via geomstats (
groupoid.manifold) - Transport groupoid: morphism composition, inverse, composition
associativity verified by Hypothesis (
groupoid.groupoid) - First cohomology H^1: holonomy-based obstruction detection on the
cycle basis; coboundary vanishing and a multi-cycle independent
holonomy-product reference tested; an incompletely specified cocycle
(a cycle with a missing edge map) raises
IncompleteCocycleErrorrather than reporting a partial-product false positive (groupoid.cohomology) - Cellular sheaf: restriction maps with functoriality tested
(
groupoid.sheaf) - Sheaf Laplacian: connection Laplacian L = delta^T delta; PSD and
delta^T-delta equality verified on non-orthogonal restriction maps, plus
spectral analysis, algebraic connectivity, and diffusion convergence
tested (
groupoid.laplacian) - Federated aggregation pipeline: transport-aware aggregation with
H^1 consistency checking, multi-round convergence tested
(
groupoid.aggregation)
Implemented, validated against ground truth, not yet integrated
These modules have unit tests that validate behavior against a known-correct reference, but are not yet wired into the main aggregation pipeline:
- Parallel transport: Schild's ladder and pole ladder
(
groupoid.transport). The pole ladder is validated against geomstats' analytic parallel transport on S^2 -- it matches in direction (cosine > 0.999) and magnitude. Schild's ladder is a coarser first-order approximation and is asserted as such. See LIMITATIONS.md for the convergence caveat. - Persistent homology: Vietoris-Rips filtration for divergence
tracking (
groupoid.persistence). Unit-tested against point clouds of known topology: a circle's dominant 1-cycle (via maximum persistence), two-cluster component counting (betti_0 == 2at a finite filtration), and a translation-invariant bottleneck distance. The persistence diagram retains a homology-dimension label, andtrack_divergencecompares H0 against H0 only (it does not pool features across dimensions); this is verified against an independent minimum-spanning-tree reconstruction of the H0 diagram. The Betti numbers are degenerate under the defaultthresh=inffiltration; see LIMITATIONS.md.
Implemented, smoke-tested, not yet integrated
This module has implementation with smoke-test coverage only -- the tests check coarse sanity (steps stay on the manifold), not core correctness -- and it is not yet wired into the main aggregation pipeline:
- Riemannian optimizers: SGD and Adam with exponential map
retraction; smoke-tested to stay on the manifold after a step, with the
curvature-adaptive learning rate covered for both its damping and
fallback branches. Core descent/convergence behavior is not validated
(
groupoid.optimizer)
Status
Pre-alpha. See STATUS.md for details.
Related work / why not just use X?
GROUPOID sits at the intersection of three existing toolchains and is not a replacement for any of them. It is an exploratory prototype of one specific idea -- transport-groupoid aggregation with cohomological consistency checking -- not a federated learning framework.
- Flower / FedML / TensorFlow Federated -- mature federated learning frameworks providing the client/server communication, orchestration, and real training loops that GROUPOID deliberately does not implement (see LIMITATIONS.md: "Not a federated learning framework"). GROUPOID is about the aggregation operator, not the FL plumbing; in principle a transport-aware aggregator like this one would be dropped into such a framework, not used instead of it.
- geomstats / pymanopt -- Riemannian-geometry libraries. GROUPOID uses
geomstats for the manifold primitives (the Karcher mean delegates to
geomstats
FrechetMean). What GROUPOID adds on top is the transport groupoid, the H^1 holonomy/consistency check, and the cellular-sheaf Laplacian wiring -- not the manifold geometry itself. - Cellular-sheaf spectral methods (the sheaf-Laplacian line of work, e.g. Hansen and Ghrist's spectral theory of cellular sheaves, and sheaf neural networks) -- GROUPOID's sheaf Laplacian follows this line and is the geometric machinery for detecting inconsistency across clients. The contribution here is applying it to the federated-aggregation setting, not the sheaf-Laplacian construction in the abstract.
In short: use Flower/FedML/TFF for the FL system, use geomstats/pymanopt for manifold math; GROUPOID is a research prototype testing whether combining a transport groupoid with sheaf-cohomological consistency yields a better aggregation operator than Euclidean FedAvg. That hypothesis is not yet validated (see STATUS.md).
Installation
Requires Python 3.10, 3.11, or 3.12. Python 3.13+ is not supported: the
numpy<2.0 / scipy<1.14 pins (needed for geomstats compatibility, see
LIMITATIONS.md) have no wheels there, so pip will refuse
with a Requires-Python message rather than attempt a source build.
From PyPI:
pip install groupoid
From source (for development):
git clone https://github.com/smaniches/GROUPOID.git
cd GROUPOID
pip install -e ".[dev]"
Quick example
import networkx as nx
import numpy as np
from geomstats.geometry.hypersphere import Hypersphere
from groupoid import TransportGroupoidAggregator
manifold = Hypersphere(dim=2)
graph = nx.DiGraph([("A", "B"), ("A", "C")])
aggregator = TransportGroupoidAggregator(
manifold=manifold, graph=graph, base_node="A"
)
# Register rotation matrices as transport maps
theta = np.pi / 6
R = np.array([
[np.cos(theta), -np.sin(theta), 0],
[np.sin(theta), np.cos(theta), 0],
[0, 0, 1],
])
aggregator.register_transport("A", "B", R)
aggregator.register_transport("A", "C", R.T)
client_params = {
"A": np.array([0.0, 0.0, 1.0]),
"B": np.array([0.1, 0.0, 0.995]),
"C": np.array([-0.1, 0.0, 0.995]),
}
client_params = {k: v / np.linalg.norm(v) for k, v in client_params.items()}
result = aggregator.aggregate(client_params)
print(f"H^1 = {result.h1_norm:.2e} (consistent: {result.is_consistent})")
Running tests
pytest tests/ -v
The suite reaches 100% line and branch coverage of the groupoid package
on Python 3.10-3.12, enforced in CI:
pytest tests/ --cov=groupoid --cov-branch --cov-fail-under=100
Coverage measures which lines run, not whether behavior is correct. See STATUS.md for the per-component validation depth, which coverage alone does not capture.
Documentation
License
Copyright 2026 TOPOLOGICA LLC. Licensed under the Apache License, Version 2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file groupoid-0.1.0.dev2.tar.gz.
File metadata
- Download URL: groupoid-0.1.0.dev2.tar.gz
- Upload date:
- Size: 74.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ad6b5b4729903de6d43561b31842c3405f2f9c26473a4bcd7db0acb60ad98a0
|
|
| MD5 |
db59295a9849ad14a7151615e239bd2a
|
|
| BLAKE2b-256 |
4e2e60104adbc40a8e1a6e56019cc9193834359e293d9e29ae1ba6bff45c8abe
|
Provenance
The following attestation bundles were made for groupoid-0.1.0.dev2.tar.gz:
Publisher:
release.yml on smaniches/GROUPOID
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
groupoid-0.1.0.dev2.tar.gz -
Subject digest:
6ad6b5b4729903de6d43561b31842c3405f2f9c26473a4bcd7db0acb60ad98a0 - Sigstore transparency entry: 1900328845
- Sigstore integration time:
-
Permalink:
smaniches/GROUPOID@a02b64fe2e76ef9ce717c6b0a9f321bccc804cee -
Branch / Tag:
refs/tags/v0.1.0.dev2 - Owner: https://github.com/smaniches
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a02b64fe2e76ef9ce717c6b0a9f321bccc804cee -
Trigger Event:
push
-
Statement type:
File details
Details for the file groupoid-0.1.0.dev2-py3-none-any.whl.
File metadata
- Download URL: groupoid-0.1.0.dev2-py3-none-any.whl
- Upload date:
- Size: 26.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b7ffba1b6c3df6def2cc91a5ccc35c62c49f91bac4383b42e538fe6965ac566
|
|
| MD5 |
c790aab0a3a5ad01f789dbd49c5be7b1
|
|
| BLAKE2b-256 |
69ae9a64aadb4a62db9e44923b822211429867e24c85aa032a732f2a17e0dce8
|
Provenance
The following attestation bundles were made for groupoid-0.1.0.dev2-py3-none-any.whl:
Publisher:
release.yml on smaniches/GROUPOID
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
groupoid-0.1.0.dev2-py3-none-any.whl -
Subject digest:
4b7ffba1b6c3df6def2cc91a5ccc35c62c49f91bac4383b42e538fe6965ac566 - Sigstore transparency entry: 1900329011
- Sigstore integration time:
-
Permalink:
smaniches/GROUPOID@a02b64fe2e76ef9ce717c6b0a9f321bccc804cee -
Branch / Tag:
refs/tags/v0.1.0.dev2 - Owner: https://github.com/smaniches
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a02b64fe2e76ef9ce717c6b0a9f321bccc804cee -
Trigger Event:
push
-
Statement type: