AlphaComplexDQP

org.appliedtopology.tda4j.alpha.AlphaComplexDQP
See theAlphaComplexDQP companion class

Attributes

Companion
class
Experimental
true
Graph
Supertypes
class Object
trait Matchable
class Any
Self type

Members list

Value members

Concrete methods

def apply(space: PowerDistance, maxPower: Double, maxDimension: Int, settings: AlphaDQPSettings): AlphaComplexDQP
def dtm(points: Array[Array[Double]], k: Int, maxRadius: Double, maxDimension: Int, q: Double = ..., settings: AlphaDQPSettings = ...): AlphaComplexDQP

DTM-weighted alpha complex: weight(i) = -f(i)^2, where f is the empirical distance-to-measure (streams.DistanceToMeasure, Chazal-Cohen-Steiner-Merigot 2011) with k neighbours and exponent q.

DTM-weighted alpha complex: weight(i) = -f(i)^2, where f is the empirical distance-to-measure (streams.DistanceToMeasure, Chazal-Cohen-Steiner-Merigot 2011) with k neighbours and exponent q.

This is exactly the p = 2 ball equation of Anai et al., "DTM-based filtrations" (arXiv:1811.04757, Def. 3.1/Prop. 3.5) -- r_x(t)^2 = t^2 - f(x)^2 -- read against THIS class's own power-distance convention pi_i(y) = ||y-x_i||^2 - weight(i) (Definition 6/10 above): setting weight(i) = -f(i)^2 makes pi_i(y) = ||y-x_i||^2 + f(i)^2, so pi_i(y) <= alpha iff ||y-x_i||^2 <= alpha - f(i)^2 = r_x(sqrt(alpha))^2 exactly. alpha.PowerDistance/AlphaComplexDQP already implement the general weighted-alpha/restricted- nerve machinery this needs -- DTM-alpha is that machinery fed these specific weights, not a new construction. Cross-checked (not merely asserted) against streams.DtmRipsSimplexStream(..., p = 2.0): both are the SAME p = 2 weighted-ball union, so their H0 barcodes agree once alpha's own sqrt(alpha) units are doubled to match Rips's -- .claude/WORKLOG-dtm-filtrations.md has the full derivation and the cross-check itself (AlphaComplexDQPDtmSpec).

Uses JVPTree for the k-NN search (DistanceToMeasure's own default is the safer-but-slower BruteForce, needed only when the triangle inequality isn't guaranteed -- not a concern here, points is always genuinely Euclidean).

Depends on the vertex-attachment fix in AlphaComplexDQPBuilder.compute() (.claude/WORKLOG-dtm- filtrations.md): DTM weights make a point's own centre fall outside its own restricted power cell routinely (any point near an outlier), which the OLD unconditional weight(f) = -space.weight(x) got wrong -- this constructor would have produced spurious/missing H0 bars on essentially every real input before that fix landed.

Attributes

def euclidean(points: Array[Array[Double]], maxRadius: Double, maxDimension: Int, settings: AlphaDQPSettings = ...): AlphaComplexDQP

Unweighted alpha complex Alpha(S, r) up to dimension d. Filtration values come back as squared radii; see radiusOf.

Unweighted alpha complex Alpha(S, r) up to dimension d. Filtration values come back as squared radii; see radiusOf.

Attributes

def weighted(points: Array[Array[Double]], powerWeights: Array[Double], maxPower: Double, maxDimension: Int, settings: AlphaDQPSettings = ...): AlphaComplexDQP

Weighted alpha complex Alpha(S, p, a1) up to dimension d.

Weighted alpha complex Alpha(S, p, a1) up to dimension d.

Attributes