Source code for oineus.diff.vietoris_rips

import eagerpy as epy

from .. import vr_filtration as non_diff_vr_filtration
from .diff_filtration import DiffFiltration
from ._tensor_utils import tensor_to_real_numpy


[docs] def vr_filtration(data, from_pwdists: bool = False, max_dim: int = -1, max_diameter: float = -1.0, eps=1e-6, packed: bool = False, n_threads=1) -> DiffFiltration: data = epy.astensor(data) data_np = tensor_to_real_numpy(data) assert data.ndim == 2 # packed=True builds the bit-packed PackedSimplexFiltration when the tier fits (else fat); # the critical-edge array is encoding-independent (vertex-id pairs aligned to the sorted # cells), so the differentiable distance gather below is unchanged. oineus.diff.TopologyOptimizer # dispatches the packed type and mapping_cylinder_filtration fattens packed under-filtrations as # needed. It is opt-in for the differentiable factory (the non-diff oineus.vr_filtration defaults # to packed) because some low-level diff entry points (compute_partial_u_rows, the raw per-cell # optimizer ctor) are still fat-only. fil, edges = non_diff_vr_filtration( data=data_np, from_pwdists=from_pwdists, with_critical_edges=True, max_dim=max_dim, max_diameter=max_diameter, packed=packed, n_threads=n_threads, ) if not from_pwdists: sqdists = epy.sum((data[edges[:, 0].flatten()] - data[edges[:, 1].flatten()]) ** 2, axis=1) + eps diff_dists = epy.sqrt(sqdists).raw return DiffFiltration(fil, diff_dists) else: edges = epy.astensor(edges) diff_dists = data[edges[:, 0], edges[:, 1]].raw return DiffFiltration(fil, diff_dists)