The boundary
Shu Wan · October 27, 2026 · Andrey 0.10.0In 0.9.0, the rocket lifted off. Every method we accelerated produced the same graphs, only faster.
Now comes chapter two. How far can that speed take us?
Every method has its limits. Beyond a certain point, it either runs out of time or memory, or
produces a graph no better than the empty graph—a graph with no edges.
In 0.10.0, we chart these limits for every supported method across three dimensions—the number of
variables, the number of samples, and graph density.
The results push those boundaries further than ever. BOSS scales to 1,600 variables, GRaSP to 800,
PC to 400, and GES to 400 with 10,000 samples, all producing graphs with fewer errors than the
empty-graph baseline.
TL;DR
A map for each method: the problems it finishes within the time cap and solves better than the
empty graph.
How far each family goes, at 2,000 samples and a mean degree of 2:
Permutation-based: BOSS to 1,600 variables, GRaSP to 800.
Constraint-based: PC to 400.
Score-based: GES, GIES, and XGES to 200, and to 400 with 10,000 samples; CALM to 400.
Linear non-Gaussian: DirectLiNGAM to 400.
More samples move an accuracy boundary to the right; a denser graph moves it to the left.
A boundary is a reference, not a hard limit: it moves with the data, the settings, and the
machine.
Two ways to stop
It does not finish. The work of a search grows with the number of variables and with how many
causes each one has. Past some size, a fit no longer finishes within our time cap of one hour, or
it runs out of memory.
It finishes, but the graph is no better than nothing. The empty graph is the simplest answer: it
draws no edges, so it misses every true edge and adds no false one. A method that makes more errors
than the empty graph has added more mistakes than it found edges. This happens when there are too
few samples for the tests or scores to tell an edge from noise, or when the graph is so dense that
each variable has more causes than the data can separate.
The second way matters as much as the first. A method that finishes in a second on 3,000 variables
is no help if its graph is worse than drawing none. So a problem is inside the boundary only when
the method does both: finishes, and beats the empty graph.
Why the boundary is there
Most of the time goes to conditional independence tests. To decide whether two variables share an
edge, PC tests them given sets of their neighbors, first one at a time, then in pairs, triples, and
so on. The number of pairs grows with the square of the number of variables, and the number of
conditioning sets grows exponentially with the number of neighbors. So a denser graph costs far
more tests, and a larger one more again. The score-based and permutation-based searches face the
same growth in the candidate parent sets they score.
Too many tests also cost accuracy. A test given a large conditioning set has few samples for each
degree of freedom, so it loses power, and each wrong answer removes or keeps an edge that later
steps build on. This is why a dense graph can stop a method on accuracy before it stops on time.
The boundary of each method
Each method gets two maps. On the size map, the number of variables grows to the right and the
number of samples grows upward, with each variable having two causes or effects on average. On the
density map, the samples stay at 2,000 and the graph grows denser upward. Here are BOSS’s:
BOSS
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 0% of the empty graph's errors 100 variables, 10,000 samples: 0% of the empty graph's errors 200 variables, 10,000 samples: 4% of the empty graph's errors 400 variables, 10,000 samples: 3% of the empty graph's errors 800 variables, 10,000 samples: 5% of the empty graph's errors ×1,600 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 0% of the empty graph's errors 50 variables, 2,000 samples: 12% of the empty graph's errors 100 variables, 2,000 samples: 5% of the empty graph's errors 200 variables, 2,000 samples: 2% of the empty graph's errors 400 variables, 2,000 samples: 2% of the empty graph's errors 800 variables, 2,000 samples: 4% of the empty graph's errors 1,600 variables, 2,000 samples: 4% of the empty graph's errors ×3,200 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 0% of the empty graph's errors 50 variables, 500 samples: 10% of the empty graph's errors 100 variables, 500 samples: 0% of the empty graph's errors 200 variables, 500 samples: 9% of the empty graph's errors 400 variables, 500 samples: 4% of the empty graph's errors 800 variables, 500 samples: 5% of the empty graph's errors 1,600 variables, 500 samples: 6% of the empty graph's errors ×3,200 variables, 500 samples; stopped: time cap 20 50 100 200 400 800 1,600 3,200 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 131% of the empty graph's errors 50 variables, degree 8: 2% of the empty graph's errors 100 variables, degree 8: 0% of the empty graph's errors 200 variables, degree 8: 0% of the empty graph's errors 400 variables, degree 8: 1% of the empty graph's errors ■800 variables, degree 8; stopped: memory cap degree 4 20 variables, degree 4: 0% of the empty graph's errors 50 variables, degree 4: 0% of the empty graph's errors 100 variables, degree 4: 0% of the empty graph's errors 200 variables, degree 4: 6% of the empty graph's errors 400 variables, degree 4: 1% of the empty graph's errors 800 variables, degree 4: 2% of the empty graph's errors ×1,600 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 0% of the empty graph's errors 50 variables, degree 2: 12% of the empty graph's errors 100 variables, degree 2: 5% of the empty graph's errors 200 variables, degree 2: 2% of the empty graph's errors 400 variables, degree 2: 2% of the empty graph's errors 800 variables, degree 2: 4% of the empty graph's errors 1,600 variables, degree 2: 4% of the empty graph's errors ×3,200 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 0% of the empty graph's errors 100 variables, degree 1: 0% of the empty graph's errors 200 variables, degree 1: 0% of the empty graph's errors 400 variables, degree 1: 4% of the empty graph's errors 800 variables, degree 1: 4% of the empty graph's errors 1,600 variables, degree 1: 4% of the empty graph's errors ×3,200 variables, degree 1; stopped: time cap 20 50 100 200 400 800 1,600 3,200
How to read it. Each cell is one problem: a number of variables, with a number of samples or a
density. A blue cell is one the method finishes with fewer errors than the empty graph: the darker
the blue, the fewer errors. A gray cell finishes, but does no better than the empty graph. A mark is
where a row stops: a cross at the one-hour time cap, a square at the memory cap, an exclamation mark
when the fit fails, and a circle past the accuracy boundary, after two sizes in a row that do not
beat the empty graph. The outline is the boundary: in each row, every size up to the first that
does not finish or does not beat the empty graph. Hover a cell for its errors as a share of the
empty graph’s.
So BOSS is inside its boundary up to 1,600 variables with 500 or 2,000 samples. With 10,000 samples,
each fit takes longer, and at 1,600 variables the fits reach the time cap, so its boundary ends at
800. On the density map, a mean degree of 4 ends at 800 on time. At a mean degree of 8, BOSS does no
better than the empty graph at 20 variables, so that row has no boundary, and at 800 variables it
runs out of memory.
Every method’s maps:
Constraint-based
CD-NOD
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 15% of the empty graph's errors 50 variables, 10,000 samples: 24% of the empty graph's errors 100 variables, 10,000 samples: 38% of the empty graph's errors ×200 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 25% of the empty graph's errors 50 variables, 2,000 samples: 30% of the empty graph's errors 100 variables, 2,000 samples: 35% of the empty graph's errors ×200 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 35% of the empty graph's errors 50 variables, 500 samples: 32% of the empty graph's errors 100 variables, 500 samples: 42% of the empty graph's errors 200 variables, 500 samples: 54% of the empty graph's errors ×400 variables, 500 samples; stopped: time cap 20 50 100 200 400 800 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 85% of the empty graph's errors 50 variables, degree 8: 90% of the empty graph's errors 100 variables, degree 8: 79% of the empty graph's errors 200 variables, degree 8: 70% of the empty graph's errors 400 variables, degree 8: 63% of the empty graph's errors ×800 variables, degree 8; stopped: time cap degree 4 20 variables, degree 4: 62% of the empty graph's errors 50 variables, degree 4: 53% of the empty graph's errors 100 variables, degree 4: 42% of the empty graph's errors 200 variables, degree 4: 33% of the empty graph's errors ×400 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 25% of the empty graph's errors 50 variables, degree 2: 30% of the empty graph's errors 100 variables, degree 2: 35% of the empty graph's errors ×200 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 10% of the empty graph's errors 50 variables, degree 1: 68% of the empty graph's errors ×100 variables, degree 1; stopped: time cap 20 50 100 200 400 800 PC
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 16% of the empty graph's errors 100 variables, 10,000 samples: 32% of the empty graph's errors 200 variables, 10,000 samples: 60% of the empty graph's errors 400 variables, 10,000 samples: 82% of the empty graph's errors 800 variables, 10,000 samples: 146% of the empty graph's errors 1,600 variables, 10,000 samples: 250% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 10,000 samples: 250% of the empty graph's errors; stopped: past the accuracy boundary 2,000 samples 20 variables, 2,000 samples: 5% of the empty graph's errors 50 variables, 2,000 samples: 32% of the empty graph's errors 100 variables, 2,000 samples: 45% of the empty graph's errors 200 variables, 2,000 samples: 57% of the empty graph's errors 400 variables, 2,000 samples: 80% of the empty graph's errors 800 variables, 2,000 samples: 131% of the empty graph's errors 1,600 variables, 2,000 samples: 202% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 2,000 samples: 202% of the empty graph's errors; stopped: past the accuracy boundary 500 samples 20 variables, 500 samples: 40% of the empty graph's errors 50 variables, 500 samples: 48% of the empty graph's errors 100 variables, 500 samples: 39% of the empty graph's errors 200 variables, 500 samples: 58% of the empty graph's errors 400 variables, 500 samples: 80% of the empty graph's errors 800 variables, 500 samples: 110% of the empty graph's errors 1,600 variables, 500 samples: 152% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 500 samples: 152% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 3,200 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 99% of the empty graph's errors 50 variables, degree 8: 100% of the empty graph's errors 100 variables, degree 8: 96% of the empty graph's errors 200 variables, degree 8: 94% of the empty graph's errors 400 variables, degree 8: 88% of the empty graph's errors 800 variables, degree 8: 86% of the empty graph's errors 1,600 variables, degree 8: 84% of the empty graph's errors 3,200 variables, degree 8: 82% of the empty graph's errors degree 4 20 variables, degree 4: 80% of the empty graph's errors 50 variables, degree 4: 73% of the empty graph's errors 100 variables, degree 4: 70% of the empty graph's errors 200 variables, degree 4: 62% of the empty graph's errors 400 variables, degree 4: 48% of the empty graph's errors 800 variables, degree 4: 51% of the empty graph's errors 1,600 variables, degree 4: 62% of the empty graph's errors 3,200 variables, degree 4: 74% of the empty graph's errors degree 2 20 variables, degree 2: 5% of the empty graph's errors 50 variables, degree 2: 32% of the empty graph's errors 100 variables, degree 2: 45% of the empty graph's errors 200 variables, degree 2: 57% of the empty graph's errors 400 variables, degree 2: 80% of the empty graph's errors 800 variables, degree 2: 131% of the empty graph's errors 1,600 variables, degree 2: 202% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, degree 2: 202% of the empty graph's errors; stopped: past the accuracy boundary degree 1 20 variables, degree 1: 20% of the empty graph's errors 50 variables, degree 1: 84% of the empty graph's errors 100 variables, degree 1: 144% of the empty graph's errors 200 variables, degree 1: 217% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 217% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 3,200 Score-based
CALM
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 25% of the empty graph's errors 50 variables, 10,000 samples: 32% of the empty graph's errors 100 variables, 10,000 samples: 29% of the empty graph's errors 200 variables, 10,000 samples: 35% of the empty graph's errors 400 variables, 10,000 samples: 28% of the empty graph's errors ×800 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 25% of the empty graph's errors 50 variables, 2,000 samples: 28% of the empty graph's errors 100 variables, 2,000 samples: 27% of the empty graph's errors 200 variables, 2,000 samples: 34% of the empty graph's errors 400 variables, 2,000 samples: 27% of the empty graph's errors ×800 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 40% of the empty graph's errors 50 variables, 500 samples: 34% of the empty graph's errors 100 variables, 500 samples: 40% of the empty graph's errors 200 variables, 500 samples: 34% of the empty graph's errors 400 variables, 500 samples: 28% of the empty graph's errors ×800 variables, 500 samples; stopped: time cap 20 50 100 200 400 800 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 102% of the empty graph's errors 50 variables, degree 8: 88% of the empty graph's errors 100 variables, degree 8: 82% of the empty graph's errors 200 variables, degree 8: 83% of the empty graph's errors 400 variables, degree 8: 79% of the empty graph's errors ×800 variables, degree 8; stopped: time cap degree 4 20 variables, degree 4: 48% of the empty graph's errors 50 variables, degree 4: 60% of the empty graph's errors 100 variables, degree 4: 60% of the empty graph's errors 200 variables, degree 4: 53% of the empty graph's errors 400 variables, degree 4: 53% of the empty graph's errors ×800 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 25% of the empty graph's errors 50 variables, degree 2: 28% of the empty graph's errors 100 variables, degree 2: 27% of the empty graph's errors 200 variables, degree 2: 34% of the empty graph's errors 400 variables, degree 2: 27% of the empty graph's errors ×800 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 20% of the empty graph's errors 100 variables, degree 1: 10% of the empty graph's errors 200 variables, degree 1: 11% of the empty graph's errors ×400 variables, degree 1; stopped: time cap 20 50 100 200 400 800 Exact search
Samples, mean degree 2 10,000 samples 10 variables, 10,000 samples: 0% of the empty graph's errors 14 variables, 10,000 samples: 0% of the empty graph's errors 18 variables, 10,000 samples: 0% of the empty graph's errors 20 variables, 10,000 samples: 0% of the empty graph's errors 22 variables, 10,000 samples: 9% of the empty graph's errors ×24 variables, 10,000 samples; stopped: time cap 2,000 samples 10 variables, 2,000 samples: 20% of the empty graph's errors 14 variables, 2,000 samples: 0% of the empty graph's errors 18 variables, 2,000 samples: 33% of the empty graph's errors 20 variables, 2,000 samples: 20% of the empty graph's errors 22 variables, 2,000 samples: 27% of the empty graph's errors ×24 variables, 2,000 samples; stopped: time cap 500 samples 10 variables, 500 samples: 30% of the empty graph's errors 14 variables, 500 samples: 14% of the empty graph's errors 18 variables, 500 samples: 50% of the empty graph's errors 20 variables, 500 samples: 30% of the empty graph's errors 22 variables, 500 samples: 50% of the empty graph's errors ×24 variables, 500 samples; stopped: time cap 10 14 18 20 22 24 26 Mean degree, 2,000 samples degree 8 10 variables, degree 8: 82% of the empty graph's errors 14 variables, degree 8: 0% of the empty graph's errors 18 variables, degree 8: 0% of the empty graph's errors 20 variables, degree 8: 0% of the empty graph's errors 22 variables, degree 8: 0% of the empty graph's errors ×24 variables, degree 8; stopped: time cap degree 4 10 variables, degree 4: 0% of the empty graph's errors 14 variables, degree 4: 4% of the empty graph's errors 18 variables, degree 4: 0% of the empty graph's errors 20 variables, degree 4: 0% of the empty graph's errors 22 variables, degree 4: 5% of the empty graph's errors ×24 variables, degree 4; stopped: time cap degree 2 10 variables, degree 2: 20% of the empty graph's errors 14 variables, degree 2: 0% of the empty graph's errors 18 variables, degree 2: 33% of the empty graph's errors 20 variables, degree 2: 20% of the empty graph's errors 22 variables, degree 2: 27% of the empty graph's errors ×24 variables, degree 2; stopped: time cap degree 1 10 variables, degree 1: 0% of the empty graph's errors 14 variables, degree 1: 29% of the empty graph's errors 18 variables, degree 1: 11% of the empty graph's errors 20 variables, degree 1: 50% of the empty graph's errors 22 variables, degree 1: 27% of the empty graph's errors 24 variables, degree 1: 33% of the empty graph's errors ×26 variables, degree 1; stopped: time cap 10 14 18 20 22 24 26 GES
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 18% of the empty graph's errors 100 variables, 10,000 samples: 37% of the empty graph's errors 200 variables, 10,000 samples: 65% of the empty graph's errors 400 variables, 10,000 samples: 93% of the empty graph's errors 800 variables, 10,000 samples: 136% of the empty graph's errors 1,600 variables, 10,000 samples: 208% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 10,000 samples: 208% of the empty graph's errors; stopped: past the accuracy boundary 2,000 samples 20 variables, 2,000 samples: 25% of the empty graph's errors 50 variables, 2,000 samples: 36% of the empty graph's errors 100 variables, 2,000 samples: 59% of the empty graph's errors 200 variables, 2,000 samples: 98% of the empty graph's errors 400 variables, 2,000 samples: 153% of the empty graph's errors 800 variables, 2,000 samples: 228% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, 2,000 samples: 228% of the empty graph's errors; stopped: past the accuracy boundary 500 samples 20 variables, 500 samples: 30% of the empty graph's errors 50 variables, 500 samples: 85% of the empty graph's errors 100 variables, 500 samples: 114% of the empty graph's errors 200 variables, 500 samples: 160% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, 500 samples: 160% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 3,200 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 123% of the empty graph's errors 50 variables, degree 8: 148% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 8: 148% of the empty graph's errors; stopped: past the accuracy boundary degree 4 20 variables, degree 4: 86% of the empty graph's errors 50 variables, degree 4: 82% of the empty graph's errors 100 variables, degree 4: 85% of the empty graph's errors 200 variables, degree 4: 67% of the empty graph's errors 400 variables, degree 4: 72% of the empty graph's errors 800 variables, degree 4: 94% of the empty graph's errors 1,600 variables, degree 4: 116% of the empty graph's errors 3,200 variables, degree 4: 140% of the empty graph's errors; stopped: past the accuracy boundary ○3,200 variables, degree 4: 140% of the empty graph's errors; stopped: past the accuracy boundary degree 2 20 variables, degree 2: 25% of the empty graph's errors 50 variables, degree 2: 36% of the empty graph's errors 100 variables, degree 2: 59% of the empty graph's errors 200 variables, degree 2: 98% of the empty graph's errors 400 variables, degree 2: 153% of the empty graph's errors 800 variables, degree 2: 228% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, degree 2: 228% of the empty graph's errors; stopped: past the accuracy boundary degree 1 20 variables, degree 1: 40% of the empty graph's errors 50 variables, degree 1: 56% of the empty graph's errors 100 variables, degree 1: 122% of the empty graph's errors 200 variables, degree 1: 203% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 203% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 3,200 GIES
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 5% of the empty graph's errors 50 variables, 10,000 samples: 13% of the empty graph's errors 100 variables, 10,000 samples: 23% of the empty graph's errors 200 variables, 10,000 samples: 44% of the empty graph's errors 400 variables, 10,000 samples: 72% of the empty graph's errors 800 variables, 10,000 samples: 139% of the empty graph's errors 1,600 variables, 10,000 samples: 246% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 10,000 samples: 246% of the empty graph's errors; stopped: past the accuracy boundary 2,000 samples 20 variables, 2,000 samples: 14% of the empty graph's errors 50 variables, 2,000 samples: 18% of the empty graph's errors 100 variables, 2,000 samples: 54% of the empty graph's errors 200 variables, 2,000 samples: 91% of the empty graph's errors 400 variables, 2,000 samples: 157% of the empty graph's errors 800 variables, 2,000 samples: 290% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, 2,000 samples: 290% of the empty graph's errors; stopped: past the accuracy boundary 500 samples 20 variables, 500 samples: 30% of the empty graph's errors 50 variables, 500 samples: 50% of the empty graph's errors 100 variables, 500 samples: 97% of the empty graph's errors 200 variables, 500 samples: 178% of the empty graph's errors 400 variables, 500 samples: 312% of the empty graph's errors; stopped: past the accuracy boundary ○400 variables, 500 samples: 312% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 35% of the empty graph's errors 50 variables, degree 8: 50% of the empty graph's errors 100 variables, degree 8: 55% of the empty graph's errors 200 variables, degree 8: 54% of the empty graph's errors 400 variables, degree 8: 35% of the empty graph's errors 800 variables, degree 8: 63% of the empty graph's errors ×1,600 variables, degree 8; stopped: time cap degree 4 20 variables, degree 4: 9% of the empty graph's errors 50 variables, degree 4: 19% of the empty graph's errors 100 variables, degree 4: 23% of the empty graph's errors 200 variables, degree 4: 41% of the empty graph's errors 400 variables, degree 4: 73% of the empty graph's errors 800 variables, degree 4: 132% of the empty graph's errors ×1,600 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 14% of the empty graph's errors 50 variables, degree 2: 18% of the empty graph's errors 100 variables, degree 2: 54% of the empty graph's errors 200 variables, degree 2: 91% of the empty graph's errors 400 variables, degree 2: 157% of the empty graph's errors 800 variables, degree 2: 290% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, degree 2: 290% of the empty graph's errors; stopped: past the accuracy boundary degree 1 20 variables, degree 1: 23% of the empty graph's errors 50 variables, degree 1: 55% of the empty graph's errors 100 variables, degree 1: 102% of the empty graph's errors 200 variables, degree 1: 184% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 184% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 Hill climbing
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 25% of the empty graph's errors 50 variables, 10,000 samples: 80% of the empty graph's errors 100 variables, 10,000 samples: 60% of the empty graph's errors 200 variables, 10,000 samples: 90% of the empty graph's errors 400 variables, 10,000 samples: 118% of the empty graph's errors 800 variables, 10,000 samples: 178% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, 10,000 samples: 178% of the empty graph's errors; stopped: past the accuracy boundary 1,600 variables, 10,000 samples: 272% of the empty graph's errors 2,000 samples 20 variables, 2,000 samples: 55% of the empty graph's errors 50 variables, 2,000 samples: 88% of the empty graph's errors 100 variables, 2,000 samples: 99% of the empty graph's errors 200 variables, 2,000 samples: 136% of the empty graph's errors 400 variables, 2,000 samples: 198% of the empty graph's errors 800 variables, 2,000 samples: 296% of the empty graph's errors 1,600 variables, 2,000 samples: 521% of the empty graph's errors 3,200 variables, 2,000 samples: 967% of the empty graph's errors 500 samples 20 variables, 500 samples: 72% of the empty graph's errors 50 variables, 500 samples: 101% of the empty graph's errors 100 variables, 500 samples: 151% of the empty graph's errors; stopped: past the accuracy boundary ○100 variables, 500 samples: 151% of the empty graph's errors; stopped: past the accuracy boundary 200 variables, 500 samples: 197% of the empty graph's errors 400 variables, 500 samples: 317% of the empty graph's errors 800 variables, 500 samples: 595% of the empty graph's errors 1,600 variables, 500 samples: 1388% of the empty graph's errors 20 50 100 200 400 800 1,600 3,200 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 148% of the empty graph's errors 50 variables, degree 8: 284% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 8: 284% of the empty graph's errors; stopped: past the accuracy boundary 100 variables, degree 8: 299% of the empty graph's errors 200 variables, degree 8: 203% of the empty graph's errors 400 variables, degree 8: 202% of the empty graph's errors 800 variables, degree 8: 136% of the empty graph's errors degree 4 20 variables, degree 4: 105% of the empty graph's errors 50 variables, degree 4: 140% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 4: 140% of the empty graph's errors; stopped: past the accuracy boundary 100 variables, degree 4: 98% of the empty graph's errors 200 variables, degree 4: 112% of the empty graph's errors 400 variables, degree 4: 110% of the empty graph's errors 800 variables, degree 4: 160% of the empty graph's errors degree 2 20 variables, degree 2: 55% of the empty graph's errors 50 variables, degree 2: 88% of the empty graph's errors 100 variables, degree 2: 99% of the empty graph's errors 200 variables, degree 2: 136% of the empty graph's errors 400 variables, degree 2: 198% of the empty graph's errors 800 variables, degree 2: 296% of the empty graph's errors 1,600 variables, degree 2: 521% of the empty graph's errors 3,200 variables, degree 2: 967% of the empty graph's errors degree 1 20 variables, degree 1: 60% of the empty graph's errors 50 variables, degree 1: 86% of the empty graph's errors 100 variables, degree 1: 124% of the empty graph's errors 200 variables, degree 1: 203% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 203% of the empty graph's errors; stopped: past the accuracy boundary 400 variables, degree 1: 360% of the empty graph's errors 800 variables, degree 1: 615% of the empty graph's errors 1,600 variables, degree 1: 1078% of the empty graph's errors 20 50 100 200 400 800 1,600 3,200 Tabu search
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 48% of the empty graph's errors 100 variables, 10,000 samples: 80% of the empty graph's errors 200 variables, 10,000 samples: 88% of the empty graph's errors 400 variables, 10,000 samples: 116% of the empty graph's errors 800 variables, 10,000 samples: 180% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, 10,000 samples: 180% of the empty graph's errors; stopped: past the accuracy boundary 2,000 samples 20 variables, 2,000 samples: 35% of the empty graph's errors 50 variables, 2,000 samples: 84% of the empty graph's errors 100 variables, 2,000 samples: 93% of the empty graph's errors 200 variables, 2,000 samples: 137% of the empty graph's errors 400 variables, 2,000 samples: 200% of the empty graph's errors; stopped: past the accuracy boundary ○400 variables, 2,000 samples: 200% of the empty graph's errors; stopped: past the accuracy boundary 800 variables, 2,000 samples: 297% of the empty graph's errors 500 samples 20 variables, 500 samples: 45% of the empty graph's errors 50 variables, 500 samples: 93% of the empty graph's errors 100 variables, 500 samples: 151% of the empty graph's errors 200 variables, 500 samples: 198% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, 500 samples: 198% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 148% of the empty graph's errors 50 variables, degree 8: 284% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 8: 284% of the empty graph's errors; stopped: past the accuracy boundary degree 4 20 variables, degree 4: 98% of the empty graph's errors 50 variables, degree 4: 127% of the empty graph's errors 100 variables, degree 4: 82% of the empty graph's errors 200 variables, degree 4: 93% of the empty graph's errors 400 variables, degree 4: 112% of the empty graph's errors 800 variables, degree 4: 161% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, degree 4: 161% of the empty graph's errors; stopped: past the accuracy boundary degree 2 20 variables, degree 2: 35% of the empty graph's errors 50 variables, degree 2: 84% of the empty graph's errors 100 variables, degree 2: 93% of the empty graph's errors 200 variables, degree 2: 137% of the empty graph's errors 400 variables, degree 2: 200% of the empty graph's errors; stopped: past the accuracy boundary ○400 variables, degree 2: 200% of the empty graph's errors; stopped: past the accuracy boundary 800 variables, degree 2: 297% of the empty graph's errors degree 1 20 variables, degree 1: 40% of the empty graph's errors 50 variables, degree 1: 84% of the empty graph's errors 100 variables, degree 1: 130% of the empty graph's errors 200 variables, degree 1: 217% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 217% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 XGES
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 14% of the empty graph's errors 100 variables, 10,000 samples: 26% of the empty graph's errors 200 variables, 10,000 samples: 52% of the empty graph's errors 400 variables, 10,000 samples: 94% of the empty graph's errors 800 variables, 10,000 samples: 149% of the empty graph's errors 1,600 variables, 10,000 samples: 252% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, 10,000 samples: 252% of the empty graph's errors; stopped: past the accuracy boundary 2,000 samples 20 variables, 2,000 samples: 20% of the empty graph's errors 50 variables, 2,000 samples: 36% of the empty graph's errors 100 variables, 2,000 samples: 56% of the empty graph's errors 200 variables, 2,000 samples: 95% of the empty graph's errors 400 variables, 2,000 samples: 172% of the empty graph's errors 800 variables, 2,000 samples: 291% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, 2,000 samples: 291% of the empty graph's errors; stopped: past the accuracy boundary 500 samples 20 variables, 500 samples: 30% of the empty graph's errors 50 variables, 500 samples: 66% of the empty graph's errors 100 variables, 500 samples: 111% of the empty graph's errors 200 variables, 500 samples: 178% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, 500 samples: 178% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 126% of the empty graph's errors 50 variables, degree 8: 257% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 8: 257% of the empty graph's errors; stopped: past the accuracy boundary degree 4 20 variables, degree 4: 0% of the empty graph's errors 50 variables, degree 4: 10% of the empty graph's errors 100 variables, degree 4: 23% of the empty graph's errors 200 variables, degree 4: 38% of the empty graph's errors 400 variables, degree 4: 65% of the empty graph's errors 800 variables, degree 4: 117% of the empty graph's errors 1,600 variables, degree 4: 213% of the empty graph's errors; stopped: past the accuracy boundary ○1,600 variables, degree 4: 213% of the empty graph's errors; stopped: past the accuracy boundary degree 2 20 variables, degree 2: 20% of the empty graph's errors 50 variables, degree 2: 36% of the empty graph's errors 100 variables, degree 2: 56% of the empty graph's errors 200 variables, degree 2: 95% of the empty graph's errors 400 variables, degree 2: 172% of the empty graph's errors 800 variables, degree 2: 291% of the empty graph's errors; stopped: past the accuracy boundary ○800 variables, degree 2: 291% of the empty graph's errors; stopped: past the accuracy boundary degree 1 20 variables, degree 1: 40% of the empty graph's errors 50 variables, degree 1: 48% of the empty graph's errors 100 variables, degree 1: 122% of the empty graph's errors 200 variables, degree 1: 205% of the empty graph's errors; stopped: past the accuracy boundary ○200 variables, degree 1: 205% of the empty graph's errors; stopped: past the accuracy boundary 20 50 100 200 400 800 1,600 Permutation-based
BOSS
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 0% of the empty graph's errors 100 variables, 10,000 samples: 0% of the empty graph's errors 200 variables, 10,000 samples: 4% of the empty graph's errors 400 variables, 10,000 samples: 3% of the empty graph's errors 800 variables, 10,000 samples: 5% of the empty graph's errors ×1,600 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 0% of the empty graph's errors 50 variables, 2,000 samples: 12% of the empty graph's errors 100 variables, 2,000 samples: 5% of the empty graph's errors 200 variables, 2,000 samples: 2% of the empty graph's errors 400 variables, 2,000 samples: 2% of the empty graph's errors 800 variables, 2,000 samples: 4% of the empty graph's errors 1,600 variables, 2,000 samples: 4% of the empty graph's errors ×3,200 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 0% of the empty graph's errors 50 variables, 500 samples: 10% of the empty graph's errors 100 variables, 500 samples: 0% of the empty graph's errors 200 variables, 500 samples: 9% of the empty graph's errors 400 variables, 500 samples: 4% of the empty graph's errors 800 variables, 500 samples: 5% of the empty graph's errors 1,600 variables, 500 samples: 6% of the empty graph's errors ×3,200 variables, 500 samples; stopped: time cap 20 50 100 200 400 800 1,600 3,200 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 131% of the empty graph's errors 50 variables, degree 8: 2% of the empty graph's errors 100 variables, degree 8: 0% of the empty graph's errors 200 variables, degree 8: 0% of the empty graph's errors 400 variables, degree 8: 1% of the empty graph's errors ■800 variables, degree 8; stopped: memory cap degree 4 20 variables, degree 4: 0% of the empty graph's errors 50 variables, degree 4: 0% of the empty graph's errors 100 variables, degree 4: 0% of the empty graph's errors 200 variables, degree 4: 6% of the empty graph's errors 400 variables, degree 4: 1% of the empty graph's errors 800 variables, degree 4: 2% of the empty graph's errors ×1,600 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 0% of the empty graph's errors 50 variables, degree 2: 12% of the empty graph's errors 100 variables, degree 2: 5% of the empty graph's errors 200 variables, degree 2: 2% of the empty graph's errors 400 variables, degree 2: 2% of the empty graph's errors 800 variables, degree 2: 4% of the empty graph's errors 1,600 variables, degree 2: 4% of the empty graph's errors ×3,200 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 0% of the empty graph's errors 100 variables, degree 1: 0% of the empty graph's errors 200 variables, degree 1: 0% of the empty graph's errors 400 variables, degree 1: 4% of the empty graph's errors 800 variables, degree 1: 4% of the empty graph's errors 1,600 variables, degree 1: 4% of the empty graph's errors ×3,200 variables, degree 1; stopped: time cap 20 50 100 200 400 800 1,600 3,200 GRaSP
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 0% of the empty graph's errors 100 variables, 10,000 samples: 0% of the empty graph's errors 200 variables, 10,000 samples: 0% of the empty graph's errors 400 variables, 10,000 samples: 0% of the empty graph's errors 800 variables, 10,000 samples: 1% of the empty graph's errors ×1,600 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 0% of the empty graph's errors 50 variables, 2,000 samples: 0% of the empty graph's errors 100 variables, 2,000 samples: 7% of the empty graph's errors 200 variables, 2,000 samples: 8% of the empty graph's errors 400 variables, 2,000 samples: 5% of the empty graph's errors 800 variables, 2,000 samples: 6% of the empty graph's errors ×1,600 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 5% of the empty graph's errors 50 variables, 500 samples: 0% of the empty graph's errors 100 variables, 500 samples: 8% of the empty graph's errors 200 variables, 500 samples: 14% of the empty graph's errors 400 variables, 500 samples: 8% of the empty graph's errors 800 variables, 500 samples: 11% of the empty graph's errors ×1,600 variables, 500 samples; stopped: time cap 20 50 100 200 400 800 1,600 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 84% of the empty graph's errors 50 variables, degree 8: 24% of the empty graph's errors 100 variables, degree 8: 6% of the empty graph's errors 200 variables, degree 8: 8% of the empty graph's errors 400 variables, degree 8: 12% of the empty graph's errors 800 variables, degree 8: 10% of the empty graph's errors ×1,600 variables, degree 8; stopped: time cap degree 4 20 variables, degree 4: 0% of the empty graph's errors 50 variables, degree 4: 0% of the empty graph's errors 100 variables, degree 4: 21% of the empty graph's errors 200 variables, degree 4: 7% of the empty graph's errors 400 variables, degree 4: 2% of the empty graph's errors 800 variables, degree 4: 3% of the empty graph's errors ×1,600 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 0% of the empty graph's errors 50 variables, degree 2: 0% of the empty graph's errors 100 variables, degree 2: 7% of the empty graph's errors 200 variables, degree 2: 8% of the empty graph's errors 400 variables, degree 2: 5% of the empty graph's errors 800 variables, degree 2: 6% of the empty graph's errors ×1,600 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 0% of the empty graph's errors 100 variables, degree 1: 0% of the empty graph's errors 200 variables, degree 1: 0% of the empty graph's errors 400 variables, degree 1: 0% of the empty graph's errors 800 variables, degree 1: 0% of the empty graph's errors ×1,600 variables, degree 1; stopped: time cap 20 50 100 200 400 800 1,600 Linear non-Gaussian
DirectLiNGAM
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 4% of the empty graph's errors 100 variables, 10,000 samples: 2% of the empty graph's errors 200 variables, 10,000 samples: 2% of the empty graph's errors ×400 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 0% of the empty graph's errors 50 variables, 2,000 samples: 2% of the empty graph's errors 100 variables, 2,000 samples: 6% of the empty graph's errors 200 variables, 2,000 samples: 5% of the empty graph's errors 400 variables, 2,000 samples: 6% of the empty graph's errors ×800 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 5% of the empty graph's errors 50 variables, 500 samples: 10% of the empty graph's errors 100 variables, 500 samples: 10% of the empty graph's errors 200 variables, 500 samples: 18% of the empty graph's errors 400 variables, 500 samples: 134% of the empty graph's errors !800 variables, 500 samples; stopped: failed 20 50 100 200 400 800 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 0% of the empty graph's errors 50 variables, degree 8: 2% of the empty graph's errors 100 variables, degree 8: 8% of the empty graph's errors 200 variables, degree 8: 10% of the empty graph's errors 400 variables, degree 8: 26% of the empty graph's errors ×800 variables, degree 8; stopped: time cap degree 4 20 variables, degree 4: 0% of the empty graph's errors 50 variables, degree 4: 2% of the empty graph's errors 100 variables, degree 4: 2% of the empty graph's errors 200 variables, degree 4: 4% of the empty graph's errors 400 variables, degree 4: 6% of the empty graph's errors ×800 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 0% of the empty graph's errors 50 variables, degree 2: 2% of the empty graph's errors 100 variables, degree 2: 6% of the empty graph's errors 200 variables, degree 2: 5% of the empty graph's errors 400 variables, degree 2: 6% of the empty graph's errors ×800 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 4% of the empty graph's errors 100 variables, degree 1: 8% of the empty graph's errors 200 variables, degree 1: 9% of the empty graph's errors 400 variables, degree 1: 10% of the empty graph's errors ×800 variables, degree 1; stopped: time cap 20 50 100 200 400 800 ICA-LiNGAM
Samples, mean degree 2 10,000 samples 20 variables, 10,000 samples: 0% of the empty graph's errors 50 variables, 10,000 samples: 2% of the empty graph's errors 100 variables, 10,000 samples: 10% of the empty graph's errors 200 variables, 10,000 samples: 328% of the empty graph's errors 400 variables, 10,000 samples: 334% of the empty graph's errors ×800 variables, 10,000 samples; stopped: time cap 2,000 samples 20 variables, 2,000 samples: 0% of the empty graph's errors 50 variables, 2,000 samples: 16% of the empty graph's errors 100 variables, 2,000 samples: 287% of the empty graph's errors 200 variables, 2,000 samples: 304% of the empty graph's errors 400 variables, 2,000 samples: 309% of the empty graph's errors ×800 variables, 2,000 samples; stopped: time cap 500 samples 20 variables, 500 samples: 15% of the empty graph's errors 50 variables, 500 samples: 240% of the empty graph's errors 100 variables, 500 samples: 296% of the empty graph's errors 200 variables, 500 samples: 276% of the empty graph's errors 400 variables, 500 samples: 304% of the empty graph's errors !800 variables, 500 samples; stopped: failed 20 50 100 200 400 800 Mean degree, 2,000 samples degree 8 20 variables, degree 8: 161% of the empty graph's errors 50 variables, degree 8: 426% of the empty graph's errors; stopped: past the accuracy boundary ○50 variables, degree 8: 426% of the empty graph's errors; stopped: past the accuracy boundary 100 variables, degree 8: 777% of the empty graph's errors 200 variables, degree 8: 1260% of the empty graph's errors 400 variables, degree 8: 2042% of the empty graph's errors degree 4 20 variables, degree 4: 38% of the empty graph's errors 50 variables, degree 4: 343% of the empty graph's errors 100 variables, degree 4: 670% of the empty graph's errors 200 variables, degree 4: 951% of the empty graph's errors 400 variables, degree 4: 1240% of the empty graph's errors ×800 variables, degree 4; stopped: time cap degree 2 20 variables, degree 2: 0% of the empty graph's errors 50 variables, degree 2: 16% of the empty graph's errors 100 variables, degree 2: 287% of the empty graph's errors 200 variables, degree 2: 304% of the empty graph's errors 400 variables, degree 2: 309% of the empty graph's errors ×800 variables, degree 2; stopped: time cap degree 1 20 variables, degree 1: 0% of the empty graph's errors 50 variables, degree 1: 12% of the empty graph's errors 100 variables, degree 1: 126% of the empty graph's errors 200 variables, degree 1: 112% of the empty graph's errors 400 variables, degree 1: 120% of the empty graph's errors ×800 variables, degree 1; stopped: time cap 20 50 100 200 400 800 MultiGroupDirectLiNGAM
Samples, mean degree 2 5,000 samples 10 variables, 5,000 samples: 0% of the empty graph's errors 20 variables, 5,000 samples: 0% of the empty graph's errors 50 variables, 5,000 samples: 2% of the empty graph's errors 100 variables, 5,000 samples: 2% of the empty graph's errors 200 variables, 5,000 samples: 3% of the empty graph's errors 1,000 samples 10 variables, 1,000 samples: 0% of the empty graph's errors 20 variables, 1,000 samples: 2% of the empty graph's errors 50 variables, 1,000 samples: 4% of the empty graph's errors 100 variables, 1,000 samples: 5% of the empty graph's errors 200 variables, 1,000 samples: 8% of the empty graph's errors 10 20 50 100 200
The maps show two kinds of boundary. Most score-based searches stop on accuracy: with more samples
they reach further, GES from 50 variables at 500 samples to 400 at 10,000, while on a graph with a
mean degree of 8 GES, XGES, tabu search, and hill climbing do no better than the empty graph even at
20 variables. The permutation-based searches, exact search, and CALM stop on time, as BOSS does. PC
stops on accuracy past 400 variables at every sample size. On denser graphs PC beats the empty graph
further, but by less, because the empty graph then misses many more edges; hover a cell for its
share.
How far each method goes
How far each method goes
The largest number of variables inside the boundary, with a mean degree of 2: every size up to it finished and beat the empty graph.
The 0.10.0 release card gives every size, the conditions, and the
methods measured on their own axes: FCI and GFCI, the latent-variable, time-series, and pairwise
methods.
Check your own problem
Your data are not our simulations, so the surest way to find your own boundary is to measure it. On
a simulation the size and density of your problem, compare a method’s errors with the empty
graph’s. Below, GES on 50 variables and 2,000 samples makes a third of the empty graph’s errors on a
sparse graph, and three times as many on a dense one, as its density map shows.
example.py
import numpy as np
import andrey
from andrey.data import sample_scm
from andrey.metrics import shd
# GES on 50 variables and 2,000 samples: a sparse graph, then a dense one.
for degree in ( 2 , 8 ):
data = sample_scm ( d = 50 , n = 2000 , density = degree , scale = "standardize" , seed = 0 )
errors = shd ( andrey . ges ( data . data ) . structure , data . graph )
empty = shd ( np . zeros_like ( data . graph . adjacency ), data . graph )
print ( f "mean degree { degree } : { errors } errors; the empty graph makes { empty } " )
example.py
mean degree 2: 16 errors; the empty graph makes 50
mean degree 8: 657 errors; the empty graph makes 200
And beyond
0.9.0 made each test and score cheaper, and 0.10.0 shows how far that goes. To go much further, a
method has to run fewer tests, and to use the sparsity of real graphs. Both are active research:
Fewer tests. Shiragur, Zhang, and Uhler (2024) learn a
coarser causal graph with a polynomial number of tests, one that equals the true graph when the
true graph is identifiable. Kim and Lee (2026)
deduce the answers of many high-order tests from lower-order ones instead of running them, so a
search runs fewer tests and fewer of the weakest ones.
Sparsity. PC stays feasible on high-dimensional data when the graph is sparse
(Kalisch and Bühlmann, 2007 ): when each
variable has few neighbors, the number of tests grows polynomially, not exponentially, with the
number of variables. Spread over the cores of one machine, such a search reaches thousands of
variables (Le et al. ).
Very large causal discovery, sparsity used to reach millions of variables, is a stage of our
roadmap . The boundary in this post is where that work starts.
Limits
A reference, not a hard limit. A boundary holds for what we measured: our simulated graphs
and data (Erdos-Renyi graphs with linear relations, standardized), the sizes and densities above,
each method’s settings, and our machine. Most methods run at their defaults; BOSS and GRaSP run
with a BIC penalty of 4, and GES with a limit of 4 parents. The release card lists every
setting. Another graph structure, other data, other settings (a smaller alpha , a max_depth ),
or more cores can move it either way. Use it to know where to start, then measure on your own
data.
Time. The cap is one hour per fit. A longer cap moves the time boundary to the right; it
does not move the accuracy boundary.
Other axes. FCI and GFCI, whose samples grow with the variables, and the latent-variable,
time-series, and pairwise methods are measured on their own axes; the release card lists them.
Try it
pip install -U andrey-core
Help us build it
Andrey is in alpha. The API may change between releases. When you try it on your own data,
tell us what breaks or which method you need.
We also welcome pull requests. The
contributing guide explains how
you can set up the development environment.