API Reference¶
Aggregation¶
groupoid.aggregation.TransportGroupoidAggregator
dataclass
¶
Federated aggregator using explicit invertible point actions.
The current point-valued aggregation path is scientifically supported for caller-supplied matrices that act invertibly on the chosen point representation and preserve the manifold domain used by the Karcher mean. The preregistered S^2 benchmark exercises this contract with explicit SO(3) rotations. Arbitrary square matrices are not thereby validated as geometric transport morphisms.
consistency_threshold is a threshold on the basis-dependent holonomy
defect. A finite threshold decision is not invariant under general
non-orthogonal changes of frame; it must not be interpreted as a canonical
cohomological verdict.
Source code in groupoid/aggregation.py
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 | |
aggregate(client_params, weights=None)
¶
Run one point-valued aggregation round under the explicit transport contract.
Source code in groupoid/aggregation.py
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 | |
check_consistency(client_params)
¶
Return the current cycle-basis holonomy defect.
client_params is retained in the signature for API compatibility;
the defect depends only on the graph and registered matrices. A value
near zero is not, by itself, a proof that the graph is connected, that
bridge transports are present, or that the matrices define valid point
actions.
Source code in groupoid/aggregation.py
257 258 259 260 261 262 263 264 265 266 267 268 269 | |
register_transport(source, target, matrix)
¶
Register an invertible candidate point action between two clients.
Registration establishes only the algebraic prerequisites that can be
checked without seeing a point: a finite square matrix with a finite
inverse. If the opposite orientation is already registered, the two
matrices must also satisfy the groupoid inverse law numerically. During
aggregation the actual forward and return actions are required to map
the transported points back onto self.manifold. Passing these checks
validates the exercised point actions, not every possible manifold point.
Source code in groupoid/aggregation.py
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | |
register_transport_from_points(source, target, source_point, target_point, method='pole', n_rungs=2)
¶
Deprecated compatibility stub; tangent transport is not a point action.
Earlier releases assembled a square ambient array from transported
tangent basis vectors and silently registered it as an invertible
point-valued morphism. On an embedded manifold such as S^2, the exact
projector extension of tangent parallel transport is rank-deficient in
the ambient representation and sends the base point's normal direction
to zero. It therefore cannot satisfy the point-action and inverse
contract used by :meth:aggregate.
Use :meth:register_transport with an explicitly justified point action
(for example, the SO(3) rotations used by the S^2 benchmark). Tangent-
vector utilities remain available in :mod:groupoid.transport.
Source code in groupoid/aggregation.py
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | |
groupoid.aggregation.FederatedRound
dataclass
¶
Result of a single federated aggregation round.
h1_norm, is_consistent, and transport_residuals are retained
as compatibility field names. h1_norm stores the cycle-basis holonomy
Frobenius defect, not a canonical H^1 norm. is_consistent means only
that this representation-dependent defect is below the configured numerical
threshold. transport_residuals stores ||T T^T - I||_F for the
composite forward maps, so its precise meaning is an orthogonality defect.
Source code in groupoid/aggregation.py
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | |
cycle_basis_holonomy_defect
property
¶
Primary name for the scalar stored in the legacy h1_norm field.
orthogonality_residuals
property
¶
Primary name for the legacy transport_residuals values.
passes_consistency_threshold
property
¶
Whether the defect is below the configured representation-specific threshold.
groupoid.aggregation.InvalidPointTransportError
¶
Bases: ValueError
Raised when a registered matrix cannot serve as the required point action.
Source code in groupoid/aggregation.py
35 36 | |
groupoid.aggregation.UnsupportedTransportRepresentationError
¶
Bases: RuntimeError
Raised when tangent transport is requested as a point-valued morphism.
Source code in groupoid/aggregation.py
39 40 | |
Manifold Operations¶
groupoid.manifold.karcher_mean(manifold, points, weights=None, max_iter=100, tol=1e-06)
¶
Compute the Karcher (Frechet) mean on a Riemannian manifold.
Parameters¶
manifold : geomstats manifold A geomstats manifold instance with a metric. points : np.ndarray Array of shape (n_points, *point_shape) on the manifold. weights : np.ndarray or None Optional weights for the mean computation. max_iter : int Maximum iterations for gradient descent. tol : float Convergence tolerance.
Returns¶
np.ndarray The Karcher mean point on the manifold.
Source code in groupoid/manifold.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
Groupoid¶
groupoid.groupoid.Morphism
¶
Bases: BaseModel
A matrix-labelled arrow between two nodes.
This container implements algebraic composition and inversion. Its mere
construction does not certify that transport_map is a geometrically
valid action on a particular manifold representation. The point-valued
aggregation pipeline imposes that stronger contract when matrices are
registered and exercised.
Source code in groupoid/groupoid.py
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
groupoid.groupoid.compose(f, g)
¶
Compose two morphisms f then g.
Source code in groupoid/groupoid.py
93 94 95 96 97 98 99 100 101 102 103 104 | |
groupoid.groupoid.inverse(f)
¶
Return the matrix inverse of a morphism.
numpy.linalg.LinAlgError is raised if the stored matrix is singular.
Geometric validity of the inverse as a manifold point action is a separate
contract enforced by the aggregation layer when such an action is used.
Source code in groupoid/groupoid.py
107 108 109 110 111 112 113 114 115 116 117 118 119 120 | |
groupoid.groupoid.NonReciprocalTransportError
¶
Bases: ValueError
Raised when opposite registered arrows violate the groupoid inverse law.
Source code in groupoid/groupoid.py
37 38 | |
Cycle Holonomy Diagnostic¶
groupoid.cohomology.cycle_basis_holonomy_defect(graph, transport_maps)
¶
Return the maximum cycle-basis holonomy Frobenius defect.
For the cycle basis B = nx.cycle_basis(graph.to_undirected()), this
function computes
D_B(T) = max_{gamma in B} ||Hol_T(gamma) - I||_F.
This is a representation-dependent diagnostic, not a canonical norm on first cohomology. Its magnitude depends in general on the selected cycle basis and is not invariant under arbitrary invertible changes of frame. Orthogonal conjugation preserves the Frobenius magnitude; cycle reversal also preserves it when the holonomy itself is orthogonal.
Exact zero has a stronger meaning than the magnitude. On a connected
graph, when every underlying undirected edge carries one invertible
connection map (represented by one orientation or by a reciprocal pair)
and every cycle emitted by :func:networkx.cycle_basis is evaluated
completely, D_B(T) == 0 is equivalent to flat transport: every
closed-loop holonomy is identity.
That justification is specific to the NetworkX Paton implementation this module exercises. The emitted list is not in general the fundamental-cycle basis of one fixed spanning tree; the argument instead uses the emission order, in which every emitted cycle contributes exactly one chord not present in any earlier emitted cycle, so the induced constraint system is triangular. It is not claimed for arbitrary graph-theoretic cycle bases or for future NetworkX implementations whose emission order may differ.
The equivalence does not certify graph connectedness, bridge completeness, point-action validity, or any finite numerical threshold.
Parameters¶
graph
Directed client/transport graph. Cycle selection is performed on its
undirected projection.
transport_maps
Maps (source, target) edge tuples to square transport matrices.
Reverse traversal uses the matrix inverse. If both orientations of an
underlying edge are supplied, they must be mutual numerical inverses.
Returns¶
float
Maximum Frobenius distance ||Hol(gamma) - I||_F over the selected
basis cycles. An acyclic graph returns 0.0 because it has no cycle
holonomy to test.
Raises¶
IncompleteCocycleError If a selected basis cycle contains an edge with no transport map in either direction. NonReciprocalTransportError If both orientations of an underlying edge are supplied but do not satisfy the groupoid inverse law. numpy.linalg.LinAlgError If a reverse-oriented edge must be traversed but its registered matrix is singular.
Source code in groupoid/cohomology.py
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | |
Deprecated compatibility alias¶
groupoid.cohomology.compute_h1(graph, transport_maps)
¶
Deprecated compatibility alias for :func:cycle_basis_holonomy_defect.
Earlier GROUPOID releases called the returned scalar an H^1 or
H^1 norm. The numerical value is preserved for compatibility, but
that mathematical interpretation is superseded: the value is the
basis-dependent cycle-holonomy defect defined by
:func:cycle_basis_holonomy_defect.
Source code in groupoid/cohomology.py
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | |
Sheaf¶
groupoid.sheaf.Sheaf
¶
A cellular sheaf on a graph.
Assigns vector spaces to nodes and linear restriction maps to edges.
Source code in groupoid/sheaf.py
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | |
get_restriction_map(source, target)
¶
Get the restriction map for an edge.
Source code in groupoid/sheaf.py
29 30 31 | |
get_section(node)
¶
Get the section value at a node.
Source code in groupoid/sheaf.py
37 38 39 | |
restrict(section, source, target)
¶
Apply the restriction map to a section.
Parameters¶
section : np.ndarray The section value at the source node. source : str Source node identifier. target : str Target node identifier.
Returns¶
np.ndarray The restricted section at the target node.
Source code in groupoid/sheaf.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | |
restrict_along_path(section, path)
¶
Restrict a section along a path of nodes.
Parameters¶
section : np.ndarray The section value at path[0]. path : list[str] Ordered list of nodes forming a path in the graph.
Returns¶
np.ndarray The section restricted to path[-1].
Source code in groupoid/sheaf.py
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | |
set_restriction_map(source, target, matrix)
¶
Set the restriction map for an edge.
Source code in groupoid/sheaf.py
22 23 24 25 26 27 | |
set_section(node, value)
¶
Set a section value at a node.
Source code in groupoid/sheaf.py
33 34 35 | |
Sheaf Laplacian¶
groupoid.laplacian.build_sheaf_laplacian(sheaf, stalk_dim)
¶
Build the sheaf Laplacian matrix.
For a sheaf F on graph G with n nodes and stalk dimension d, the sheaf Laplacian is a (nd) x (nd) block matrix defined as:
L_F = delta^T @ delta
where delta is the connection coboundary. For each edge (u, v) with restriction (transport) map R = R_{uv}: stalk(u) -> stalk(v), the coboundary acts as (delta x){(u,v)} = x_v - R{uv} x_u, so L = delta^T @ delta has blocks (summed over incident edges):
L[u,u] += R_{uv}^T @ R_{uv} (source diagonal)
L[v,v] += I (target diagonal)
L[u,v] += -R_{uv}^T (off-diagonal)
L[v,u] += -R_{uv} (off-diagonal)
L is symmetric positive semi-definite for ANY restriction maps (it is delta^T delta); its kernel is the space of transport-consistent global sections (x_v = R_{uv} x_u on every edge).
Parameters¶
sheaf A Sheaf instance with restriction maps set. stalk_dim Dimension of each stalk (vector space at each node).
Returns¶
np.ndarray The sheaf Laplacian matrix of shape (nd, nd).
Source code in groupoid/laplacian.py
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | |
groupoid.laplacian.spectral_analysis(sheaf, stalk_dim, tol=1e-10)
¶
Compute spectral decomposition of the sheaf Laplacian.
Parameters¶
sheaf A Sheaf instance with restriction maps. stalk_dim Dimension of each stalk. tol Tolerance for identifying zero eigenvalues.
Returns¶
SpectralSummary Full spectral summary including connectivity and consensus rate.
Source code in groupoid/laplacian.py
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | |
groupoid.laplacian.sheaf_diffusion_step(sheaf, sections, stalk_dim, step_size=0.1)
¶
One step of sheaf diffusion (Laplacian smoothing).
Drives local sections toward global consistency by flowing along the negative gradient of the sheaf Laplacian energy:
E(x) = x^T L_F x = sum_{(i,j)} ||R_{ij} x_i - x_j||^2
Parameters¶
sheaf Sheaf with restriction maps. sections Current section values at each node. stalk_dim Dimension of each stalk. step_size Diffusion step size (must be < 1/lambda_max for stability).
Returns¶
dict[str, npt.NDArray[np.float64]] Updated section values after one diffusion step.
Source code in groupoid/laplacian.py
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | |
Tangent-Vector Parallel Transport¶
groupoid.transport.schild_ladder(manifold, tangent_vec, base_point, end_point, n_rungs=1)
¶
Parallel transport a tangent vector via Schild's ladder.
This is a discrete tangent-vector approximation. On the currently tested
S^2 configuration its direction is substantially coarser than pole ladder
and does not converge to the analytic value as n_rungs increases; see
LIMITATIONS.md for the measured behavior.
Source code in groupoid/transport.py
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
groupoid.transport.pole_ladder(manifold, tangent_vec, base_point, end_point, n_rungs=1)
¶
Parallel transport a tangent vector via pole ladder.
This routine is validated only as a tangent-vector transport approximation. In the repository's S^2 validation case it closely matches analytic Levi-Civita parallel transport in direction and magnitude, with the documented small off-tangent approximation residual.
Source code in groupoid/transport.py
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | |
groupoid.transport.compute_tangent_transport_matrix(manifold, base_point, end_point, method='pole', n_rungs=2)
¶
Assemble an ambient-coordinate operator for tangent-vector transport.
This helper currently supports only vector-shaped point representations: both
base_point and end_point must be one-dimensional coordinate arrays of
the same shape. Each ambient coordinate vector is projected into the tangent
space at base_point and transported to end_point. The transported
vectors are stored as columns of a square ambient array. For matrix-valued or
otherwise structured manifold points, use the ladder functions directly on
tangent objects with the native point shape instead of this matrix helper.
Only the action of this array on tangent vectors is geometrically supported. It is not a generic point action and must not be registered as an invertible groupoid morphism for point-valued aggregation. On an embedded d-dimensional manifold represented in an m-dimensional ambient space with d < m, the exact projector extension has rank at most d and is therefore singular. Numerical ladder error can perturb that rank; such accidental ambient invertibility has no geometric significance.
Returns¶
np.ndarray Square ambient-coordinate array whose supported interpretation is the tangent-vector operator described above.
Raises¶
ValueError If the points are not one-dimensional coordinate arrays of the same shape.
Source code in groupoid/transport.py
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | |
Deprecated compatibility alias¶
groupoid.transport.compute_transport_matrix(manifold, base_point, end_point, method='pole', n_rungs=2)
¶
Deprecated alias for :func:compute_tangent_transport_matrix.
The historical name suggested a generic invertible transport matrix. The returned array is only validated as an ambient representation of a tangent-vector transport operator.
Source code in groupoid/transport.py
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | |
Riemannian Optimizers¶
groupoid.optimizer.RiemannianSGD
dataclass
¶
Riemannian stochastic gradient descent.
Updates parameters by computing the Riemannian gradient (projection of Euclidean gradient onto tangent space) and retracting back to the manifold via the exponential map. With momentum, the velocity is parallel-transported into each new iterate's tangent space (see the module docstring), so it accumulates geometry-consistently across steps.
Parameters¶
manifold A geomstats manifold instance. lr Learning rate. momentum Momentum coefficient (0 = no momentum).
Source code in groupoid/optimizer.py
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | |
step(point, euclidean_grad)
¶
Perform one optimization step.
Parameters¶
point Current point on the manifold. euclidean_grad Euclidean gradient (will be projected to tangent space).
Returns¶
np.ndarray Updated point on the manifold.
Source code in groupoid/optimizer.py
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | |
groupoid.optimizer.RiemannianAdam
dataclass
¶
Riemannian Adam optimizer.
Adapts the Adam optimizer to Riemannian manifolds by maintaining exponential moving averages of the Riemannian gradient and its squared norm, with updates via the exponential map. The first moment is parallel-transported into each new iterate's tangent space (see the module docstring); the second moment is a scalar gradient-norm average and needs no transport because parallel transport is an isometry (norms are invariant).
Parameters¶
manifold A geomstats manifold instance. lr Learning rate. beta1 Exponential decay rate for first moment. beta2 Exponential decay rate for second moment. eps Small constant for numerical stability.
Source code in groupoid/optimizer.py
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | |
step(point, euclidean_grad)
¶
Perform one optimization step.
Parameters¶
point Current point on the manifold. euclidean_grad Euclidean gradient.
Returns¶
np.ndarray Updated point on the manifold.
Source code in groupoid/optimizer.py
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | |
groupoid.optimizer.curvature_adaptive_lr(manifold, point, base_lr, tangent_vec)
¶
Adapt learning rate based on local sectional curvature.
In regions of high positive curvature, geodesics converge and we
should take smaller steps, so the base rate is damped by
1 / (1 + kappa). In flat or negatively curved regions the base
rate is returned unchanged; no enlargement is applied.
Parameters¶
manifold A geomstats manifold with a curvature method. point Current point on the manifold. base_lr Base learning rate to adapt. tangent_vec Direction of the update.
Returns¶
float Adapted learning rate.
Source code in groupoid/optimizer.py
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | |
Persistent Homology¶
groupoid.persistence.compute_persistence(points, max_dim=1, max_edge_length=np.inf)
¶
Compute persistent homology of a point cloud.
Parameters¶
points Array of shape (n_points, n_features) representing model parameters or their embeddings. max_dim Maximum homological dimension to compute. max_edge_length Maximum edge length for the Rips filtration.
Returns¶
PersistenceSummary Topological summary including Betti numbers and persistence.
Source code in groupoid/persistence.py
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | |
groupoid.persistence.track_divergence(current_params, previous_summary=None, max_dim=1)
¶
Track federation divergence across rounds.
Computes persistence of current parameter distribution and, if a previous summary exists, computes the bottleneck distance to measure how much the topological structure has changed.
Parameters¶
current_params Array of shape (n_clients, n_features). previous_summary PersistenceSummary from the previous round, if available. max_dim Maximum homological dimension.
Returns¶
PersistenceSummary Updated summary with bottleneck distance to previous round.
Source code in groupoid/persistence.py
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | |