Your geometry probe is not failing to explain the gap. It is the explanation, and it works through
the budget rather than through clustering quality.
nprobe is a cell budget. What decides recall is a document budget. Those are the same number only
when the cells are equal, and your own CV says they are not.
Your defaults reproduce from the source, exactly
cells(count) = max(min(round(4*sqrt(count)), int(count/39)), 1)
nprobe() = 6 if count <= 5000 else round(cells(count)/16)
create() = index_factory(d, "IVF{cells},Flat", METRIC_INNER_PRODUCT)
At 5,183: min(288, 132) = 132, and round(132/16) = 8. Both of your stated defaults, on the nose.
Worth noting you are 183 rows past the count <= 5000 step, which is what moved nprobe 6 -> 8.
The measurement
I built your exact index config (IVF132,Flat, inner product, n=5183, d=2048) on synthetic corpora,
with the arms calibrated to hit the mean pairwise cosine you reported, then read the scanned mass
off faiss's own counter, faiss.cvar.indexIVF_stats.ndis.
arm mean cos CV ndis/query % of corpus scanned
LEMUR-like 0.050 0.574 617.4 11.91%
MUVERA-like 0.230 1.282 1379.2 26.61%
nprobe/nlist = 8/132 = 6.06% <- what the knob claims
Identical nprobe=8. The skewed arm scans 2.23x more of the corpus.
The instrument checks itself. On a fully isotropic arm (cos 0.000, CV 0.155) the counter returns
314.5 distances, 6.07% of the corpus, against an advertised 6.06%. So nprobe/nlist is the true
scanned fraction exactly when the cells are balanced, and only then.
First-order size bias gets the direction and most of the size: a query lands in cell i with
probability n_i/N, so the expected cell is m(1+CV^2), giving 1.99x against the measured 2.23x. The
residual is that the big cells sit together near the shared mean, so the extra 7 probes are
correlated with the first.
What that does to the default-IVF column
It was never a matched-budget comparison. The encoding with the flatter cluster histogram honours
nprobe=8 literally; the skewed one quietly draws about twice the documents for the same knob.
LEMUR is not degrading more under IVF. It is being scored at less than half the scan.
To match the MUVERA-like arm's scanned mass, the LEMUR-like arm needs nprobe around 20, not 8.
Log-interpolating your curve (nprobe 8 -> 0.32346, nprobe 64 -> 0.5085) to nprobe=20:
nprobe=12 gap 34.5% 0.3595
nprobe=20 gap 26.3% 0.4050 <- matched scanned mass
0.4050 against MUVERA-10240's default-IVF 0.37341, at one fifth the storage. That is crude, two
points and a log, and it is your data not mine. But it says the ordering may not invert at all.
The one line that settles it
faiss.cvar.indexIVF_stats.reset()
index.search(queries, k)
print(faiss.cvar.indexIVF_stats.ndis / len(queries))
Equalise ndis, not nprobe, and re-run the four cells. If the LEMUR penalty survives at matched
ndis, the routing story is dead and it really is representation.
Centering, and the leg that would kill this
Under this read centering is a pure routing effect, which is exactly why your exact column stayed
flat while IVF moved 11.4 points. So it has to show up in the cluster histogram:
- centering MUVERA should lower its CV, cutting its free scan (0.37341 -> 0.31308, matches)
- centering LEMUR should raise its CV, buying scan (-41.1% -> -29.7%, matches in direction)
That second one is the weak leg. LEMUR is already near-isotropic at cos 0.05, so there is not much
common component to remove. If you re-run the k-means CV before and after centering and LEMUR's CV
does not move up, my explanation is wrong and yours is right.
One thing on the exact column: 0.54910 -> 0.5484 is flat to 0.13%, not identical. Centering documents
only shifts every score by a per-query constant and should leave nDCG bit-identical. So either
queries were centered too, or that 0.0007 is tie-breaking. Which was it?
Two small ones
The not about 14% should be about 17%. 0.32346/0.27568 = 1.173. The 14.3% is a different ratio,
0.27568/0.24111, which is how much the extrapolation overshot MUVERA-2048. Both readings support
your point that it was optimistic, so nothing downstream moves.
And nprobe=64 is corpus-specific. txtai pins the scan fraction at 1/16 in both regimes, since
cells switches from n/39 to 4*sqrt(n) at n=24,336 and nprobe tracks it:
n= 5183 nlist= 132 nprobe= 8 6.06%
n= 24336 nlist= 624 nprobe= 39 6.25%
n= 1000000 nlist= 4000 nprobe= 250 6.25%
So 64 is nlist/2, an 8x cost, and it stays 8x at a million rows. Publishing it as a fraction
travels; publishing the integer does not.
Last thing, and it is the storage argument rather than a critique: neither MUVERA width leaves the
298-444 participation band. The extra 8,192 dimensions bought no additional spread, while LEMUR-2048
reaches 692 out of 2,048. That is a model-free version of your headline and it does not depend on
which index anyone picked.
Does LEMUR's cluster-size CV go up when you center it?