GO · WEBASSEMBLY · NO JS NUMERICS
The Point Lab shows one projection out of d(d−1)/2. This page shows all of them: a correlation matrix over every pair of dimensions, and then the thing correlation is a proxy for — how fast the integration error actually falls as you spend more points.
Both halves are computed by github.com/cwbudde/qmc compiled to WebAssembly. The JavaScript owns the DOM, the canvas and the clock.
Cell (i, j) is the Pearson correlation between coordinate i and coordinate j over the whole point set. Correlation is signed, so the scale is diverging and centred on zero: cool is negative, warm is positive, ground is independent. The diagonal is 1 by construction. Hover any cell for the pair and r, and for their prime bases.
—
—
hover a cell for the pair, their bases and r
Absolute integration error against N, both axes logarithmic — the only pair of axes on which "QMC beats Monte Carlo" is something you can check rather than take on faith. A power law is a straight line here, so the two dotted references matter: plain Monte Carlo error falls as 1/√N, and a well-behaved quasi-Monte Carlo rule approaches 1/N. Read which line each series runs parallel to.
—
—
idle
| N | QMC |err| | MC |err| | ratio |
|---|
The quantity the phrase "low-discrepancy sequence" actually refers to, measured against N on log–log axes: the sequence's discrepancy, a pseudorandom sample's over the same N, and — for centred L2 — the closed-form expectation √(((5/4)s − (13/12)s)/N) of the random one. The headline is the ratio random ÷ sequence, and a ratio of 1.00 needs no interpretation: the statistic has stopped distinguishing the two point sets.
—
—
idle
| N | sequence | random | ratio |
|---|
—
Correlation is a symptom, not the disease. A low-discrepancy sequence promises even coverage of the whole box, and pairwise correlation only catches the most visible way that promise fails. Zero everywhere is necessary, not sufficient.
A single seed is a single sample. With any randomization selected this is randomized quasi-Monte Carlo: every seed gives a different, equally valid point set, and both the worst pair and the error curve wobble from one to the next. The library's quoted 0.14 is the worst of five seeds, not the best of one.
Centred L2 saturates; that is not a bug in the panel. Its expectation over N uniform points is exactly √(((5/4)s − (13/12)s)/N), and the (5/4)s term — which depends only on each coordinate's marginal spread — swamps everything a well-spread point set can improve. At 39 dimensions it is 100.4% of the total, so the ratio reads about 1.02 and the three curves lie on top of one another. Drop the dimension slider and watch them separate. Star discrepancy does not saturate, but it is NP-hard in the dimension, so the library refuses it above six dimensions and a few dozen points — the metric menu prints that refusal in the library's own words rather than restating the limit here.
The discrepancy panel's N ceiling moves. Every other control on these pages has a fixed range. This one does not: centred L2 costs O(N²s) and a single N cannot be subdivided, so the only way to keep one blocking call short is to cap N, and the cap has to fall as dimensions are added. It is a browser responsiveness limit, not a mathematical one.
The sweep loops in JavaScript on purpose. A call into Go blocks
the event loop for its whole duration, so a Stop pressed during one
cannot be dispatched. Each converge call therefore covers
exactly one N, and the page yields between them. That gap is
the cancellation mechanism, and it is also why the chart fills in one
point at a time.