qc-selector
qc-selector, from the QC-Devs group, is a collection of subset-selection methods aimed at chemical datasets: max-min and max-sum pickers, OptiSim, sphere exclusion, and several diversity measures for scoring a selection after the fact.
It is the broadest of the one-shot tools — the only one here offering both a max-min and a max-sum picker, plus label-stratified selection when your items carry classes. That last feature is the closest anything in this comparison comes to max-div's fairness constraints, and the gap is worth being precise about: proportional picks across labels are not the same as minimum and maximum counts per group, and its groups cannot overlap.
Two practical notes. It is GPL-3 licensed, which is more restrictive than everything else surveyed here and may decide the question for you. And it is young — first released in 2025 — so its API is less settled than the others'.
Problem targeted
Its max-min picker targets the same dispersion objective as the other pickers,
while its max-sum picker targets
both by greedy construction. Sphere exclusion and OptiSim instead select by a radius or a sampled candidate pool, which are procedures rather than objectives — they define what gets picked without defining a quantity being maximized.
Guarantee: heuristic. The greedy max-min picker inherits the usual 2-approximation, but the library as a whole makes no optimality claims, and its procedural methods have no objective for a bound to be stated against.
Reference
At a glance
| Guarantee | heuristic | |
| License | GPL-3.0 | |
| Version | 0.1.4 | |
| Released | 2026-02-03 | |
| Determinism | seeded | |
| Input | vectors or a distance matrix | |
| Source | https://selector.qcdevs.org/ | |
| Last verified | 2026-07-27 |
Capabilities
Support: ✔ built in · ◐ reachable, but you supply the model, transform or metric · — not available
| Capability | Support | Notes |
|---|---|---|
| distance metrics · L1 (Manhattan) distance | ✔ | |
| distance metrics · L2 (Euclidean) distance | ✔ | |
| distance metrics · cosine distance | ◐ | 1 |
| distance metrics · caller-supplied distances | ✔ | 2 |
| diversity objectives · maximize the minimum separation | ✔ | |
| diversity objectives · maximize the mean nearest-neighbor separation | — | 3 |
| diversity objectives · maximize the geometric-mean nearest-neighbor separation | — | 3 |
| diversity objectives · maximize the mean pairwise distance | ✔ | |
| constraints beyond k · per-group counts over disjoint groups | ✔ | 4 |
| constraints beyond k · per-group counts over overlapping groups | — | |
| constraints beyond k · minimum and maximum counts per group | — | |
| time budget · budget expressed as an iteration count | ◐ | 5 |
| time budget · budget expressed as wall-clock time | — | |
| time budget · the answer improves when given more budget | — | 6 |
| largest practical problem size | n ≈ 104 | 7 |
-
Reachable by L2-normalizing the vectors first: on the unit sphere, cosine distance is a monotone function of Euclidean distance, so a Euclidean picker returns the same ordering. ↩
-
A precomputed distance matrix is accepted directly, so any metric you can compute is usable. ↩
-
Its diversity measures are computed over the whole selection rather than over nearest-neighbor pairs, so the nearest-neighbor family is absent. ↩↩
-
Label-stratified selection: given class labels, it picks proportionally across them. That covers disjoint groups with proportional targets, but not arbitrary minimum and maximum counts, and not groups an item can belong to more than once. ↩
-
Several of its methods take a parameter that controls how much work they do — a sphere-exclusion radius, an OptiSim subsample size — but these change the character of the search rather than lengthening it. Raising one does not mean a better answer. ↩
-
A single construction pass, so there is no budget to spend: the answer is whatever one greedy sweep produces, and waiting longer does not change it. ↩
-
Its selection methods work from a full distance matrix, and the diversity measures it offers are computed over that matrix rather than incrementally, so both memory and per-pick cost are quadratic. Comfortable in the tens of thousands. ↩