One pass, every measure
The rank-based family shares a single sweep over point pairs, and produces
every neighbourhood size k at once. Computing eight measures costs what
computing one costs.
Every dimensionality reduction throws information away. A quality measure says how much, and which kind — but no single measure sees every kind of distortion, and a projection that scores well on one can be badly wrong in a way another would have caught immediately.
sickle implements 33 of them, each reporting a per-point decomposition wherever one exists. Most are checked against a published reference implementation, the rest against a naive transcription of the definition; a couple have neither and are behaviour-tested only. The verification page says which is which, measure by measure.
An empty scatterplot.
O(1)Are the neighbours you see in the projection real?
One pass, every measure
The rank-based family shares a single sweep over point pairs, and produces
every neighbourhood size k at once. Computing eight measures costs what
computing one costs.
Per-point values, with a contract
Where a measure decomposes, the local array comes with a localKind
saying how it relates to the total — mean, share, sum or
partial-mean. The test suite checks the relationship holds.
Verified, and it says against what
zadu, scikit-learn, scipy, gudhi, ripser, DRquality and Scagnostics2018 — most to 1e-10 or better, several exact, and the looser ones named with the reason. Where no reference exists, the page says so rather than implying one.
No framework
ESM, CommonJS and a browser build, TypeScript types included. Workers are inlined, so parallel passes need no bundler configuration.