Skip to content

Comparison with Other Tools

How does max-div relate to other freely available tools that select diverse subsets? The honest answer starts with recognizing that the alternatives fall into three different categories, and a flat ranking across them would be misleading:

  • Exact solvers (SCIP, OR-Tools CP-SAT, HiGHS) are general MIP/CP engines. Given a hand-built model they prove optimality — but only at small problem sizes, at minutes-to-hours cost. They are best read as the optimality reference, not as competitors.
  • Greedy pickers & samplers (RDKit, skmatter, fpsample, apricot, qc-selector, DPPy) run a single-shot construction: one pass, one answer, typically in milliseconds. Very fast, but the answer does not improve if you can afford more time, and none of them supports general per-group selection constraints.
  • Anytime heuristic optimizers — max-div's category: start from a construction, then keep improving the selection for as long as the time budget allows, under fairness constraints if given.

The table below makes those categories explicit. Terminology for the objective column is defined in Objectives & the Diversity-Problem Landscape.

Tool Category Diversity objectives Input Constraints beyond k Guarantee Practical scale Determinism License · activity
max-div anytime heuristic max-min, mean-of-NN, geomean-of-NN, mean-pairwise (max-sum) vectors (L1 / L2 / L2² / cosine) or precomputed distances overlapping per-group min/max counts, per-constraint weights, penalty shaping heuristic n ≈ 10⁴–10⁵ (memory-bound: O(n²)/2 float32 distances) seeded, fully reproducible Apache-2.0 · active
SCIP (PySCIPOpt) exact MIP any linearizable objective (max-min; mean-of-NN via assignment MILP) hand-built model any linear constraints proven optimum max-min n ≲ 10³; mean-of-NN n ≲ 10²–10²·⁵ deterministic Apache-2.0 · very active
OR-Tools CP-SAT exact CP max-min via threshold feasibility search (integer-scaled distances) hand-built model any linear constraints proven optimum n ≲ 10³ deterministic (fixed workers) Apache-2.0 · very active
HiGHS exact MIP any linearizable objective (big-M formulations) hand-built model any linear constraints proven optimum n ≲ 10³ deterministic MIT · very active
RDKit MaxMinPicker greedy picker max-min custom distance function (lazy evaluation) must-include seeds 2-approx (FPS) very large (lazy distances) seeded BSD-3 · very active
skmatter greedy picker max-min (FPS), CUR vectors seed point only 2-approx (FPS) large deterministic BSD-3 · active
fpsample greedy picker max-min (FPS) vectors (KD-tree variants need d ≲ 9) seed index only 2-approx (FPS) very large, very fast (Rust) deterministic MIT · active
apricot-select greedy submodular facility location, feature-based, other submodular vectors or precomputed similarities none 1−1/e (submodular) large deterministic MIT · repo active, PyPI release stale (2021)
qc-selector greedy picker max-min, max-sum, OptiSim, sphere exclusion vectors or distance matrix label-stratified proportional picks heuristic medium seeded GPL-3 · young (2025)
DPPy probabilistic sampler k-DPP (log-det kernel) — samples diverse sets, does not maximize kernel matrix none sampler, not optimizer medium (O(n²) kernel) seeded sampling MIT · low activity (last release 2024)
code-FDM fair heuristic max-min under per-group counts vectors per-group counts heuristic medium no license (research code, dormant since 2022)

Facts (versions, licenses, activity) verified against PyPI / GitHub on 2026-07-14.

What the table means in practice

  • If you need a proven optimum (and your problem is small): build a MIP/CP model — CP-SAT for max-min, SCIP for the mean-of-NN objectives. max-div cannot prove optimality.
  • If you need one diverse subset as fast as possible, unconstrained: greedy FPS (fpsample, skmatter, RDKit) is excellent — within a factor 2 of the max-min optimum, in milliseconds.
  • If you can spend more than milliseconds, want NN-separation or max-sum objectives beyond max-min, or have per-group selection constraints: this is max-div's territory. General min/max per-group counts are supported by none of the pickers (code-FDM comes closest, for max-min only), and the mean/geomean-of-NN objectives are — as far as we know — implemented nowhere else.

Notable omission: submodlib (a submodular-optimization zoo including disparity-min, i.e. max-min) currently cannot be installed on Python 3.13 (no wheels or sdist for it on PyPI as of the verification date) and is therefore listed here only as a mention.