Skip to content
The sickle logoThe sickle logo

sickle

How much of your data survived the projection — and which measure would have told you.

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.

blobs_pca, coloured by Trustworthiness

An empty scatterplot.

Trustworthiness
parameters
none
points
cost
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.