The boundary#

Cover: a rocket reaching the curved edge of the sky, the edge amber and cracking, drawn in navy lines

In 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 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 0% of the empty graph's errors100 variables, 10,000 samples: 0% of the empty graph's errors200 variables, 10,000 samples: 4% of the empty graph's errors400 variables, 10,000 samples: 3% of the empty graph's errors800 variables, 10,000 samples: 5% of the empty graph's errors×1,600 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 0% of the empty graph's errors50 variables, 2,000 samples: 12% of the empty graph's errors100 variables, 2,000 samples: 5% of the empty graph's errors200 variables, 2,000 samples: 2% of the empty graph's errors400 variables, 2,000 samples: 2% of the empty graph's errors800 variables, 2,000 samples: 4% of the empty graph's errors1,600 variables, 2,000 samples: 4% of the empty graph's errors×3,200 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 0% of the empty graph's errors50 variables, 500 samples: 10% of the empty graph's errors100 variables, 500 samples: 0% of the empty graph's errors200 variables, 500 samples: 9% of the empty graph's errors400 variables, 500 samples: 4% of the empty graph's errors800 variables, 500 samples: 5% of the empty graph's errors1,600 variables, 500 samples: 6% of the empty graph's errors×3,200 variables, 500 samples; stopped: time cap20501002004008001,6003,200Mean degree, 2,000 samplesdegree 820 variables, degree 8: 131% of the empty graph's errors50 variables, degree 8: 2% of the empty graph's errors100 variables, degree 8: 0% of the empty graph's errors200 variables, degree 8: 0% of the empty graph's errors400 variables, degree 8: 1% of the empty graph's errors■800 variables, degree 8; stopped: memory capdegree 420 variables, degree 4: 0% of the empty graph's errors50 variables, degree 4: 0% of the empty graph's errors100 variables, degree 4: 0% of the empty graph's errors200 variables, degree 4: 6% of the empty graph's errors400 variables, degree 4: 1% of the empty graph's errors800 variables, degree 4: 2% of the empty graph's errors×1,600 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 0% of the empty graph's errors50 variables, degree 2: 12% of the empty graph's errors100 variables, degree 2: 5% of the empty graph's errors200 variables, degree 2: 2% of the empty graph's errors400 variables, degree 2: 2% of the empty graph's errors800 variables, degree 2: 4% of the empty graph's errors1,600 variables, degree 2: 4% of the empty graph's errors×3,200 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 0% of the empty graph's errors100 variables, degree 1: 0% of the empty graph's errors200 variables, degree 1: 0% of the empty graph's errors400 variables, degree 1: 4% of the empty graph's errors800 variables, degree 1: 4% of the empty graph's errors1,600 variables, degree 1: 4% of the empty graph's errors×3,200 variables, degree 1; stopped: time cap20501002004008001,6003,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 210,000 samples20 variables, 10,000 samples: 15% of the empty graph's errors50 variables, 10,000 samples: 24% of the empty graph's errors100 variables, 10,000 samples: 38% of the empty graph's errors×200 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 25% of the empty graph's errors50 variables, 2,000 samples: 30% of the empty graph's errors100 variables, 2,000 samples: 35% of the empty graph's errors×200 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 35% of the empty graph's errors50 variables, 500 samples: 32% of the empty graph's errors100 variables, 500 samples: 42% of the empty graph's errors200 variables, 500 samples: 54% of the empty graph's errors×400 variables, 500 samples; stopped: time cap2050100200400800Mean degree, 2,000 samplesdegree 820 variables, degree 8: 85% of the empty graph's errors50 variables, degree 8: 90% of the empty graph's errors100 variables, degree 8: 79% of the empty graph's errors200 variables, degree 8: 70% of the empty graph's errors400 variables, degree 8: 63% of the empty graph's errors×800 variables, degree 8; stopped: time capdegree 420 variables, degree 4: 62% of the empty graph's errors50 variables, degree 4: 53% of the empty graph's errors100 variables, degree 4: 42% of the empty graph's errors200 variables, degree 4: 33% of the empty graph's errors×400 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 25% of the empty graph's errors50 variables, degree 2: 30% of the empty graph's errors100 variables, degree 2: 35% of the empty graph's errors×200 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 10% of the empty graph's errors50 variables, degree 1: 68% of the empty graph's errors×100 variables, degree 1; stopped: time cap2050100200400800

PC

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 16% of the empty graph's errors100 variables, 10,000 samples: 32% of the empty graph's errors200 variables, 10,000 samples: 60% of the empty graph's errors400 variables, 10,000 samples: 82% of the empty graph's errors800 variables, 10,000 samples: 146% of the empty graph's errors1,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 boundary2,000 samples20 variables, 2,000 samples: 5% of the empty graph's errors50 variables, 2,000 samples: 32% of the empty graph's errors100 variables, 2,000 samples: 45% of the empty graph's errors200 variables, 2,000 samples: 57% of the empty graph's errors400 variables, 2,000 samples: 80% of the empty graph's errors800 variables, 2,000 samples: 131% of the empty graph's errors1,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 boundary500 samples20 variables, 500 samples: 40% of the empty graph's errors50 variables, 500 samples: 48% of the empty graph's errors100 variables, 500 samples: 39% of the empty graph's errors200 variables, 500 samples: 58% of the empty graph's errors400 variables, 500 samples: 80% of the empty graph's errors800 variables, 500 samples: 110% of the empty graph's errors1,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 boundary20501002004008001,6003,200Mean degree, 2,000 samplesdegree 820 variables, degree 8: 99% of the empty graph's errors50 variables, degree 8: 100% of the empty graph's errors100 variables, degree 8: 96% of the empty graph's errors200 variables, degree 8: 94% of the empty graph's errors400 variables, degree 8: 88% of the empty graph's errors800 variables, degree 8: 86% of the empty graph's errors1,600 variables, degree 8: 84% of the empty graph's errors3,200 variables, degree 8: 82% of the empty graph's errorsdegree 420 variables, degree 4: 80% of the empty graph's errors50 variables, degree 4: 73% of the empty graph's errors100 variables, degree 4: 70% of the empty graph's errors200 variables, degree 4: 62% of the empty graph's errors400 variables, degree 4: 48% of the empty graph's errors800 variables, degree 4: 51% of the empty graph's errors1,600 variables, degree 4: 62% of the empty graph's errors3,200 variables, degree 4: 74% of the empty graph's errorsdegree 220 variables, degree 2: 5% of the empty graph's errors50 variables, degree 2: 32% of the empty graph's errors100 variables, degree 2: 45% of the empty graph's errors200 variables, degree 2: 57% of the empty graph's errors400 variables, degree 2: 80% of the empty graph's errors800 variables, degree 2: 131% of the empty graph's errors1,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 boundarydegree 120 variables, degree 1: 20% of the empty graph's errors50 variables, degree 1: 84% of the empty graph's errors100 variables, degree 1: 144% of the empty graph's errors200 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 boundary20501002004008001,6003,200

Score-based

CALM

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 25% of the empty graph's errors50 variables, 10,000 samples: 32% of the empty graph's errors100 variables, 10,000 samples: 29% of the empty graph's errors200 variables, 10,000 samples: 35% of the empty graph's errors400 variables, 10,000 samples: 28% of the empty graph's errors×800 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 25% of the empty graph's errors50 variables, 2,000 samples: 28% of the empty graph's errors100 variables, 2,000 samples: 27% of the empty graph's errors200 variables, 2,000 samples: 34% of the empty graph's errors400 variables, 2,000 samples: 27% of the empty graph's errors×800 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 40% of the empty graph's errors50 variables, 500 samples: 34% of the empty graph's errors100 variables, 500 samples: 40% of the empty graph's errors200 variables, 500 samples: 34% of the empty graph's errors400 variables, 500 samples: 28% of the empty graph's errors×800 variables, 500 samples; stopped: time cap2050100200400800Mean degree, 2,000 samplesdegree 820 variables, degree 8: 102% of the empty graph's errors50 variables, degree 8: 88% of the empty graph's errors100 variables, degree 8: 82% of the empty graph's errors200 variables, degree 8: 83% of the empty graph's errors400 variables, degree 8: 79% of the empty graph's errors×800 variables, degree 8; stopped: time capdegree 420 variables, degree 4: 48% of the empty graph's errors50 variables, degree 4: 60% of the empty graph's errors100 variables, degree 4: 60% of the empty graph's errors200 variables, degree 4: 53% of the empty graph's errors400 variables, degree 4: 53% of the empty graph's errors×800 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 25% of the empty graph's errors50 variables, degree 2: 28% of the empty graph's errors100 variables, degree 2: 27% of the empty graph's errors200 variables, degree 2: 34% of the empty graph's errors400 variables, degree 2: 27% of the empty graph's errors×800 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 20% of the empty graph's errors100 variables, degree 1: 10% of the empty graph's errors200 variables, degree 1: 11% of the empty graph's errors×400 variables, degree 1; stopped: time cap2050100200400800

Exact search

Samples, mean degree 210,000 samples10 variables, 10,000 samples: 0% of the empty graph's errors14 variables, 10,000 samples: 0% of the empty graph's errors18 variables, 10,000 samples: 0% of the empty graph's errors20 variables, 10,000 samples: 0% of the empty graph's errors22 variables, 10,000 samples: 9% of the empty graph's errors×24 variables, 10,000 samples; stopped: time cap2,000 samples10 variables, 2,000 samples: 20% of the empty graph's errors14 variables, 2,000 samples: 0% of the empty graph's errors18 variables, 2,000 samples: 33% of the empty graph's errors20 variables, 2,000 samples: 20% of the empty graph's errors22 variables, 2,000 samples: 27% of the empty graph's errors×24 variables, 2,000 samples; stopped: time cap500 samples10 variables, 500 samples: 30% of the empty graph's errors14 variables, 500 samples: 14% of the empty graph's errors18 variables, 500 samples: 50% of the empty graph's errors20 variables, 500 samples: 30% of the empty graph's errors22 variables, 500 samples: 50% of the empty graph's errors×24 variables, 500 samples; stopped: time cap10141820222426Mean degree, 2,000 samplesdegree 810 variables, degree 8: 82% of the empty graph's errors14 variables, degree 8: 0% of the empty graph's errors18 variables, degree 8: 0% of the empty graph's errors20 variables, degree 8: 0% of the empty graph's errors22 variables, degree 8: 0% of the empty graph's errors×24 variables, degree 8; stopped: time capdegree 410 variables, degree 4: 0% of the empty graph's errors14 variables, degree 4: 4% of the empty graph's errors18 variables, degree 4: 0% of the empty graph's errors20 variables, degree 4: 0% of the empty graph's errors22 variables, degree 4: 5% of the empty graph's errors×24 variables, degree 4; stopped: time capdegree 210 variables, degree 2: 20% of the empty graph's errors14 variables, degree 2: 0% of the empty graph's errors18 variables, degree 2: 33% of the empty graph's errors20 variables, degree 2: 20% of the empty graph's errors22 variables, degree 2: 27% of the empty graph's errors×24 variables, degree 2; stopped: time capdegree 110 variables, degree 1: 0% of the empty graph's errors14 variables, degree 1: 29% of the empty graph's errors18 variables, degree 1: 11% of the empty graph's errors20 variables, degree 1: 50% of the empty graph's errors22 variables, degree 1: 27% of the empty graph's errors24 variables, degree 1: 33% of the empty graph's errors×26 variables, degree 1; stopped: time cap10141820222426

GES

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 18% of the empty graph's errors100 variables, 10,000 samples: 37% of the empty graph's errors200 variables, 10,000 samples: 65% of the empty graph's errors400 variables, 10,000 samples: 93% of the empty graph's errors800 variables, 10,000 samples: 136% of the empty graph's errors1,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 boundary2,000 samples20 variables, 2,000 samples: 25% of the empty graph's errors50 variables, 2,000 samples: 36% of the empty graph's errors100 variables, 2,000 samples: 59% of the empty graph's errors200 variables, 2,000 samples: 98% of the empty graph's errors400 variables, 2,000 samples: 153% of the empty graph's errors800 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 boundary500 samples20 variables, 500 samples: 30% of the empty graph's errors50 variables, 500 samples: 85% of the empty graph's errors100 variables, 500 samples: 114% of the empty graph's errors200 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 boundary20501002004008001,6003,200Mean degree, 2,000 samplesdegree 820 variables, degree 8: 123% of the empty graph's errors50 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 boundarydegree 420 variables, degree 4: 86% of the empty graph's errors50 variables, degree 4: 82% of the empty graph's errors100 variables, degree 4: 85% of the empty graph's errors200 variables, degree 4: 67% of the empty graph's errors400 variables, degree 4: 72% of the empty graph's errors800 variables, degree 4: 94% of the empty graph's errors1,600 variables, degree 4: 116% of the empty graph's errors3,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 boundarydegree 220 variables, degree 2: 25% of the empty graph's errors50 variables, degree 2: 36% of the empty graph's errors100 variables, degree 2: 59% of the empty graph's errors200 variables, degree 2: 98% of the empty graph's errors400 variables, degree 2: 153% of the empty graph's errors800 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 boundarydegree 120 variables, degree 1: 40% of the empty graph's errors50 variables, degree 1: 56% of the empty graph's errors100 variables, degree 1: 122% of the empty graph's errors200 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 boundary20501002004008001,6003,200

GIES

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 5% of the empty graph's errors50 variables, 10,000 samples: 13% of the empty graph's errors100 variables, 10,000 samples: 23% of the empty graph's errors200 variables, 10,000 samples: 44% of the empty graph's errors400 variables, 10,000 samples: 72% of the empty graph's errors800 variables, 10,000 samples: 139% of the empty graph's errors1,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 boundary2,000 samples20 variables, 2,000 samples: 14% of the empty graph's errors50 variables, 2,000 samples: 18% of the empty graph's errors100 variables, 2,000 samples: 54% of the empty graph's errors200 variables, 2,000 samples: 91% of the empty graph's errors400 variables, 2,000 samples: 157% of the empty graph's errors800 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 boundary500 samples20 variables, 500 samples: 30% of the empty graph's errors50 variables, 500 samples: 50% of the empty graph's errors100 variables, 500 samples: 97% of the empty graph's errors200 variables, 500 samples: 178% of the empty graph's errors400 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 boundary20501002004008001,600Mean degree, 2,000 samplesdegree 820 variables, degree 8: 35% of the empty graph's errors50 variables, degree 8: 50% of the empty graph's errors100 variables, degree 8: 55% of the empty graph's errors200 variables, degree 8: 54% of the empty graph's errors400 variables, degree 8: 35% of the empty graph's errors800 variables, degree 8: 63% of the empty graph's errors×1,600 variables, degree 8; stopped: time capdegree 420 variables, degree 4: 9% of the empty graph's errors50 variables, degree 4: 19% of the empty graph's errors100 variables, degree 4: 23% of the empty graph's errors200 variables, degree 4: 41% of the empty graph's errors400 variables, degree 4: 73% of the empty graph's errors800 variables, degree 4: 132% of the empty graph's errors×1,600 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 14% of the empty graph's errors50 variables, degree 2: 18% of the empty graph's errors100 variables, degree 2: 54% of the empty graph's errors200 variables, degree 2: 91% of the empty graph's errors400 variables, degree 2: 157% of the empty graph's errors800 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 boundarydegree 120 variables, degree 1: 23% of the empty graph's errors50 variables, degree 1: 55% of the empty graph's errors100 variables, degree 1: 102% of the empty graph's errors200 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 boundary20501002004008001,600

Hill climbing

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 25% of the empty graph's errors50 variables, 10,000 samples: 80% of the empty graph's errors100 variables, 10,000 samples: 60% of the empty graph's errors200 variables, 10,000 samples: 90% of the empty graph's errors400 variables, 10,000 samples: 118% of the empty graph's errors800 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 boundary1,600 variables, 10,000 samples: 272% of the empty graph's errors2,000 samples20 variables, 2,000 samples: 55% of the empty graph's errors50 variables, 2,000 samples: 88% of the empty graph's errors100 variables, 2,000 samples: 99% of the empty graph's errors200 variables, 2,000 samples: 136% of the empty graph's errors400 variables, 2,000 samples: 198% of the empty graph's errors800 variables, 2,000 samples: 296% of the empty graph's errors1,600 variables, 2,000 samples: 521% of the empty graph's errors3,200 variables, 2,000 samples: 967% of the empty graph's errors500 samples20 variables, 500 samples: 72% of the empty graph's errors50 variables, 500 samples: 101% of the empty graph's errors100 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 boundary200 variables, 500 samples: 197% of the empty graph's errors400 variables, 500 samples: 317% of the empty graph's errors800 variables, 500 samples: 595% of the empty graph's errors1,600 variables, 500 samples: 1388% of the empty graph's errors20501002004008001,6003,200Mean degree, 2,000 samplesdegree 820 variables, degree 8: 148% of the empty graph's errors50 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 boundary100 variables, degree 8: 299% of the empty graph's errors200 variables, degree 8: 203% of the empty graph's errors400 variables, degree 8: 202% of the empty graph's errors800 variables, degree 8: 136% of the empty graph's errorsdegree 420 variables, degree 4: 105% of the empty graph's errors50 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 boundary100 variables, degree 4: 98% of the empty graph's errors200 variables, degree 4: 112% of the empty graph's errors400 variables, degree 4: 110% of the empty graph's errors800 variables, degree 4: 160% of the empty graph's errorsdegree 220 variables, degree 2: 55% of the empty graph's errors50 variables, degree 2: 88% of the empty graph's errors100 variables, degree 2: 99% of the empty graph's errors200 variables, degree 2: 136% of the empty graph's errors400 variables, degree 2: 198% of the empty graph's errors800 variables, degree 2: 296% of the empty graph's errors1,600 variables, degree 2: 521% of the empty graph's errors3,200 variables, degree 2: 967% of the empty graph's errorsdegree 120 variables, degree 1: 60% of the empty graph's errors50 variables, degree 1: 86% of the empty graph's errors100 variables, degree 1: 124% of the empty graph's errors200 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 boundary400 variables, degree 1: 360% of the empty graph's errors800 variables, degree 1: 615% of the empty graph's errors1,600 variables, degree 1: 1078% of the empty graph's errors20501002004008001,6003,200

Tabu search

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 48% of the empty graph's errors100 variables, 10,000 samples: 80% of the empty graph's errors200 variables, 10,000 samples: 88% of the empty graph's errors400 variables, 10,000 samples: 116% of the empty graph's errors800 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 boundary2,000 samples20 variables, 2,000 samples: 35% of the empty graph's errors50 variables, 2,000 samples: 84% of the empty graph's errors100 variables, 2,000 samples: 93% of the empty graph's errors200 variables, 2,000 samples: 137% of the empty graph's errors400 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 boundary800 variables, 2,000 samples: 297% of the empty graph's errors500 samples20 variables, 500 samples: 45% of the empty graph's errors50 variables, 500 samples: 93% of the empty graph's errors100 variables, 500 samples: 151% of the empty graph's errors200 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 boundary2050100200400800Mean degree, 2,000 samplesdegree 820 variables, degree 8: 148% of the empty graph's errors50 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 boundarydegree 420 variables, degree 4: 98% of the empty graph's errors50 variables, degree 4: 127% of the empty graph's errors100 variables, degree 4: 82% of the empty graph's errors200 variables, degree 4: 93% of the empty graph's errors400 variables, degree 4: 112% of the empty graph's errors800 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 boundarydegree 220 variables, degree 2: 35% of the empty graph's errors50 variables, degree 2: 84% of the empty graph's errors100 variables, degree 2: 93% of the empty graph's errors200 variables, degree 2: 137% of the empty graph's errors400 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 boundary800 variables, degree 2: 297% of the empty graph's errorsdegree 120 variables, degree 1: 40% of the empty graph's errors50 variables, degree 1: 84% of the empty graph's errors100 variables, degree 1: 130% of the empty graph's errors200 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 boundary2050100200400800

XGES

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 14% of the empty graph's errors100 variables, 10,000 samples: 26% of the empty graph's errors200 variables, 10,000 samples: 52% of the empty graph's errors400 variables, 10,000 samples: 94% of the empty graph's errors800 variables, 10,000 samples: 149% of the empty graph's errors1,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 boundary2,000 samples20 variables, 2,000 samples: 20% of the empty graph's errors50 variables, 2,000 samples: 36% of the empty graph's errors100 variables, 2,000 samples: 56% of the empty graph's errors200 variables, 2,000 samples: 95% of the empty graph's errors400 variables, 2,000 samples: 172% of the empty graph's errors800 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 boundary500 samples20 variables, 500 samples: 30% of the empty graph's errors50 variables, 500 samples: 66% of the empty graph's errors100 variables, 500 samples: 111% of the empty graph's errors200 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 boundary20501002004008001,600Mean degree, 2,000 samplesdegree 820 variables, degree 8: 126% of the empty graph's errors50 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 boundarydegree 420 variables, degree 4: 0% of the empty graph's errors50 variables, degree 4: 10% of the empty graph's errors100 variables, degree 4: 23% of the empty graph's errors200 variables, degree 4: 38% of the empty graph's errors400 variables, degree 4: 65% of the empty graph's errors800 variables, degree 4: 117% of the empty graph's errors1,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 boundarydegree 220 variables, degree 2: 20% of the empty graph's errors50 variables, degree 2: 36% of the empty graph's errors100 variables, degree 2: 56% of the empty graph's errors200 variables, degree 2: 95% of the empty graph's errors400 variables, degree 2: 172% of the empty graph's errors800 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 boundarydegree 120 variables, degree 1: 40% of the empty graph's errors50 variables, degree 1: 48% of the empty graph's errors100 variables, degree 1: 122% of the empty graph's errors200 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 boundary20501002004008001,600

Permutation-based

BOSS

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 0% of the empty graph's errors100 variables, 10,000 samples: 0% of the empty graph's errors200 variables, 10,000 samples: 4% of the empty graph's errors400 variables, 10,000 samples: 3% of the empty graph's errors800 variables, 10,000 samples: 5% of the empty graph's errors×1,600 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 0% of the empty graph's errors50 variables, 2,000 samples: 12% of the empty graph's errors100 variables, 2,000 samples: 5% of the empty graph's errors200 variables, 2,000 samples: 2% of the empty graph's errors400 variables, 2,000 samples: 2% of the empty graph's errors800 variables, 2,000 samples: 4% of the empty graph's errors1,600 variables, 2,000 samples: 4% of the empty graph's errors×3,200 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 0% of the empty graph's errors50 variables, 500 samples: 10% of the empty graph's errors100 variables, 500 samples: 0% of the empty graph's errors200 variables, 500 samples: 9% of the empty graph's errors400 variables, 500 samples: 4% of the empty graph's errors800 variables, 500 samples: 5% of the empty graph's errors1,600 variables, 500 samples: 6% of the empty graph's errors×3,200 variables, 500 samples; stopped: time cap20501002004008001,6003,200Mean degree, 2,000 samplesdegree 820 variables, degree 8: 131% of the empty graph's errors50 variables, degree 8: 2% of the empty graph's errors100 variables, degree 8: 0% of the empty graph's errors200 variables, degree 8: 0% of the empty graph's errors400 variables, degree 8: 1% of the empty graph's errors■800 variables, degree 8; stopped: memory capdegree 420 variables, degree 4: 0% of the empty graph's errors50 variables, degree 4: 0% of the empty graph's errors100 variables, degree 4: 0% of the empty graph's errors200 variables, degree 4: 6% of the empty graph's errors400 variables, degree 4: 1% of the empty graph's errors800 variables, degree 4: 2% of the empty graph's errors×1,600 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 0% of the empty graph's errors50 variables, degree 2: 12% of the empty graph's errors100 variables, degree 2: 5% of the empty graph's errors200 variables, degree 2: 2% of the empty graph's errors400 variables, degree 2: 2% of the empty graph's errors800 variables, degree 2: 4% of the empty graph's errors1,600 variables, degree 2: 4% of the empty graph's errors×3,200 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 0% of the empty graph's errors100 variables, degree 1: 0% of the empty graph's errors200 variables, degree 1: 0% of the empty graph's errors400 variables, degree 1: 4% of the empty graph's errors800 variables, degree 1: 4% of the empty graph's errors1,600 variables, degree 1: 4% of the empty graph's errors×3,200 variables, degree 1; stopped: time cap20501002004008001,6003,200

GRaSP

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 0% of the empty graph's errors100 variables, 10,000 samples: 0% of the empty graph's errors200 variables, 10,000 samples: 0% of the empty graph's errors400 variables, 10,000 samples: 0% of the empty graph's errors800 variables, 10,000 samples: 1% of the empty graph's errors×1,600 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 0% of the empty graph's errors50 variables, 2,000 samples: 0% of the empty graph's errors100 variables, 2,000 samples: 7% of the empty graph's errors200 variables, 2,000 samples: 8% of the empty graph's errors400 variables, 2,000 samples: 5% of the empty graph's errors800 variables, 2,000 samples: 6% of the empty graph's errors×1,600 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 5% of the empty graph's errors50 variables, 500 samples: 0% of the empty graph's errors100 variables, 500 samples: 8% of the empty graph's errors200 variables, 500 samples: 14% of the empty graph's errors400 variables, 500 samples: 8% of the empty graph's errors800 variables, 500 samples: 11% of the empty graph's errors×1,600 variables, 500 samples; stopped: time cap20501002004008001,600Mean degree, 2,000 samplesdegree 820 variables, degree 8: 84% of the empty graph's errors50 variables, degree 8: 24% of the empty graph's errors100 variables, degree 8: 6% of the empty graph's errors200 variables, degree 8: 8% of the empty graph's errors400 variables, degree 8: 12% of the empty graph's errors800 variables, degree 8: 10% of the empty graph's errors×1,600 variables, degree 8; stopped: time capdegree 420 variables, degree 4: 0% of the empty graph's errors50 variables, degree 4: 0% of the empty graph's errors100 variables, degree 4: 21% of the empty graph's errors200 variables, degree 4: 7% of the empty graph's errors400 variables, degree 4: 2% of the empty graph's errors800 variables, degree 4: 3% of the empty graph's errors×1,600 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 0% of the empty graph's errors50 variables, degree 2: 0% of the empty graph's errors100 variables, degree 2: 7% of the empty graph's errors200 variables, degree 2: 8% of the empty graph's errors400 variables, degree 2: 5% of the empty graph's errors800 variables, degree 2: 6% of the empty graph's errors×1,600 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 0% of the empty graph's errors100 variables, degree 1: 0% of the empty graph's errors200 variables, degree 1: 0% of the empty graph's errors400 variables, degree 1: 0% of the empty graph's errors800 variables, degree 1: 0% of the empty graph's errors×1,600 variables, degree 1; stopped: time cap20501002004008001,600

Linear non-Gaussian

DirectLiNGAM

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 4% of the empty graph's errors100 variables, 10,000 samples: 2% of the empty graph's errors200 variables, 10,000 samples: 2% of the empty graph's errors×400 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 0% of the empty graph's errors50 variables, 2,000 samples: 2% of the empty graph's errors100 variables, 2,000 samples: 6% of the empty graph's errors200 variables, 2,000 samples: 5% of the empty graph's errors400 variables, 2,000 samples: 6% of the empty graph's errors×800 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 5% of the empty graph's errors50 variables, 500 samples: 10% of the empty graph's errors100 variables, 500 samples: 10% of the empty graph's errors200 variables, 500 samples: 18% of the empty graph's errors400 variables, 500 samples: 134% of the empty graph's errors!800 variables, 500 samples; stopped: failed2050100200400800Mean degree, 2,000 samplesdegree 820 variables, degree 8: 0% of the empty graph's errors50 variables, degree 8: 2% of the empty graph's errors100 variables, degree 8: 8% of the empty graph's errors200 variables, degree 8: 10% of the empty graph's errors400 variables, degree 8: 26% of the empty graph's errors×800 variables, degree 8; stopped: time capdegree 420 variables, degree 4: 0% of the empty graph's errors50 variables, degree 4: 2% of the empty graph's errors100 variables, degree 4: 2% of the empty graph's errors200 variables, degree 4: 4% of the empty graph's errors400 variables, degree 4: 6% of the empty graph's errors×800 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 0% of the empty graph's errors50 variables, degree 2: 2% of the empty graph's errors100 variables, degree 2: 6% of the empty graph's errors200 variables, degree 2: 5% of the empty graph's errors400 variables, degree 2: 6% of the empty graph's errors×800 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 4% of the empty graph's errors100 variables, degree 1: 8% of the empty graph's errors200 variables, degree 1: 9% of the empty graph's errors400 variables, degree 1: 10% of the empty graph's errors×800 variables, degree 1; stopped: time cap2050100200400800

ICA-LiNGAM

Samples, mean degree 210,000 samples20 variables, 10,000 samples: 0% of the empty graph's errors50 variables, 10,000 samples: 2% of the empty graph's errors100 variables, 10,000 samples: 10% of the empty graph's errors200 variables, 10,000 samples: 328% of the empty graph's errors400 variables, 10,000 samples: 334% of the empty graph's errors×800 variables, 10,000 samples; stopped: time cap2,000 samples20 variables, 2,000 samples: 0% of the empty graph's errors50 variables, 2,000 samples: 16% of the empty graph's errors100 variables, 2,000 samples: 287% of the empty graph's errors200 variables, 2,000 samples: 304% of the empty graph's errors400 variables, 2,000 samples: 309% of the empty graph's errors×800 variables, 2,000 samples; stopped: time cap500 samples20 variables, 500 samples: 15% of the empty graph's errors50 variables, 500 samples: 240% of the empty graph's errors100 variables, 500 samples: 296% of the empty graph's errors200 variables, 500 samples: 276% of the empty graph's errors400 variables, 500 samples: 304% of the empty graph's errors!800 variables, 500 samples; stopped: failed2050100200400800Mean degree, 2,000 samplesdegree 820 variables, degree 8: 161% of the empty graph's errors50 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 boundary100 variables, degree 8: 777% of the empty graph's errors200 variables, degree 8: 1260% of the empty graph's errors400 variables, degree 8: 2042% of the empty graph's errorsdegree 420 variables, degree 4: 38% of the empty graph's errors50 variables, degree 4: 343% of the empty graph's errors100 variables, degree 4: 670% of the empty graph's errors200 variables, degree 4: 951% of the empty graph's errors400 variables, degree 4: 1240% of the empty graph's errors×800 variables, degree 4; stopped: time capdegree 220 variables, degree 2: 0% of the empty graph's errors50 variables, degree 2: 16% of the empty graph's errors100 variables, degree 2: 287% of the empty graph's errors200 variables, degree 2: 304% of the empty graph's errors400 variables, degree 2: 309% of the empty graph's errors×800 variables, degree 2; stopped: time capdegree 120 variables, degree 1: 0% of the empty graph's errors50 variables, degree 1: 12% of the empty graph's errors100 variables, degree 1: 126% of the empty graph's errors200 variables, degree 1: 112% of the empty graph's errors400 variables, degree 1: 120% of the empty graph's errors×800 variables, degree 1; stopped: time cap2050100200400800

MultiGroupDirectLiNGAM

Samples, mean degree 25,000 samples10 variables, 5,000 samples: 0% of the empty graph's errors20 variables, 5,000 samples: 0% of the empty graph's errors50 variables, 5,000 samples: 2% of the empty graph's errors100 variables, 5,000 samples: 2% of the empty graph's errors200 variables, 5,000 samples: 3% of the empty graph's errors1,000 samples10 variables, 1,000 samples: 0% of the empty graph's errors20 variables, 1,000 samples: 2% of the empty graph's errors50 variables, 1,000 samples: 4% of the empty graph's errors100 variables, 1,000 samples: 5% of the empty graph's errors200 variables, 1,000 samples: 8% of the empty graph's errors102050100200

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

Max variables at500 samples2,000 samples10,000 samples
Constraint-basedPC400400400
CD-NOD200100100
Score-basedGES50200400
GIES100200400
XGES50200400
Hill climbing20100200
Tabu search50100200
Exact search222222
CALM400400400
Permutation-basedBOSS1,6001,600800
GRaSP800800800
Linear non-GaussianDirectLiNGAM200400200
ICA-LiNGAM2050100
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.