ResearchCausal discovery12 min read

IntroducingSPARC-fast

Our production causal discovery engine, rebuilt for the data organizations actually have: mixed-type, wide, noisy and large. Three to four orders of magnitude faster at scale, and more accurate on real workloads.

ground-truth datasets, from 2 to 441 variables
69
skeleton F1, the highest of any method tested
0.74
on the largest workloads, against 10 to 14 hours
48 s
datasets completed inside the 72-hour budget
69/69

Today we are introducing SPARC-fast, our production causal discovery engine. SPARC-fast is a ground-up rebuild of how causal structure is recovered from data, designed for the data organizations actually have: mixed-type, wide, noisy, and large. At scale it is faster than the established methods by three to four orders of magnitude, it is more accurate on the data that defines real-world workloads, and it produces models you can explain.

To measure it, we ran SPARC-fast on the broadest benchmark we have assembled: 69 ground-truth datasets, from 2 to 441 variables, against the established methods of the last three decades and against the winning entries from one of the most recent open causal discovery competitions. Here are the results.

The results#

The 69 datasets are drawn from the bnlearn Bayesian-network repository, the DREAM4 gene-regulatory networks, Microsoft’s csuite synthetic benchmarks, the Sachs protein-signaling data and the UCI repository. They span 22 discrete, 37 continuous and 10 mixed-type problems; the full list is in the appendix. The baselines span the history of the field: PC1, GES2, hill climbing with LiNGAM36 and hill climbing with GOLEM4, the gradient-based successor to NOTEARS5, each run from its standard implementation.

Every method received a 72-hour compute budget per dataset and was scored coverage-aware: a failure or timeout counts as an empty prediction rather than a quiet exclusion, so no method can lift its average by abstaining on the hardest problems. Where a method exhausted the budget, the budget itself is counted as its runtime, so abstention buys no speed either.

Figure 1 · Headline · all 69 ground-truth datasets

SPARC-fast leads on accuracy, coverage and speed

Best on five of the six measures. The exception is precision, where PC edges it, 0.80 to 0.78.

Measure
Skeleton F1↑structure recovery0.740.660.690.520.45
Recall↑true edges recovered0.730.590.670.540.49
Precision↑reported edges that are real0.780.800.750.550.43
Directed error↓SHD, edits to the true graph51.861.161.968.6107.2
Runtime↓largest workload tier48 s13 hr10.4 hr14.4 hr14.4 hr
Coverage↑datasets completed69/6967/6969/6952/6957/69
Six questionsEach measure answers a different practical question. Hover one to see which.
Coverage-aware mean, 72-hour budget per dataset. Runtime is the mean on the largest workload tier. Bars show each value relative to the best in its row. Click a method to follow its column.

The five accuracy terms each answer a different practical question.

Skeleton F1
Did it find the right cause-and-effect links at all, setting aside which way the arrows point? The broadest measure of whether the structure is roughly right.
Precision
How much can you trust what you see? Of the links a method reports, what fraction are real. A low score means chasing relationships that do not exist.
Recall
Of the links that are truly there, how many did the method find? A low score means missing the mechanisms you were looking for.
Directed error
The edits needed to turn the predicted graph into the true one: the difference between knowing two variables are related and knowing which one drives the other.
Coverage
Does the method finish at all? A method that is accurate on the problems it solves but stalls on half of them is not usable in practice.

By these measures, SPARC-fast records the highest skeleton F1 (0.74) and recall (0.73) of any method, the lowest directed error (51.8), and full coverage of all 69 datasets, while running orders of magnitude faster. The rest of this section walks through where those numbers come from.

Accuracy#

SPARC-fast recovers more true causal structure than any other method in the comparison, and it does so while completing every one of the 69 datasets.

Figure 2 · Accuracy · all 69 datasets

SPARC-fast finds the most true structure, and misses the least

SPARC-fast has the highest skeleton F1 of any method, 0.74, and it completes all 69 datasets.

Skeleton F1 asks: did it find the right cause-and-effect links at all, whichever way the arrows point?

SPARC-fastMay 2026
0.74
PC1991
0.66
GES2002
0.69
HC + LiNGAM2006
0.52
HC + GOLEM2020
0.45
Coverage-aware mean over all 69 datasets, 72-hour budget per dataset. A failure or timeout counts as an empty prediction, so no method lifts its average by abstaining.

The one row SPARC-fast does not lead is precision, where PC scores 0.80 to SPARC-fast’s 0.78. That is a trade-off: PC asserts a link only when a statistical test clears a significance threshold, so it withholds links it cannot confirm. The same caution drops its recall to 0.59 against SPARC-fast’s 0.73. For a tool meant to answer why and what if, that trade runs the wrong way: a reported link can be checked and discarded, but a true relationship the method never surfaces cannot be recovered downstream.

Speed#

SPARC-fast is the fastest unsupervised causal discovery method we know of. At the largest workloads, datasets with hundreds of columns, the other tested methods take 10 to 14 hours per dataset. SPARC-fast takes 48 seconds.

On those largest problems SPARC-fast completed every dataset, while PC, HC + LiNGAM and HC + GOLEM failed or ran out of the 72-hour budget on some of them. Past a few hundred columns, the classical methods stop finishing in a reasonable time.

Figure 3 · Runtime · largest workload tier

At scale the gap is hours against seconds

On a linear axis SPARC-fast barely leaves the floor. Every other method takes 10.4 to 14.4 hours on these datasets; it takes 48 seconds.

SPARC-fastMay 2026
48 s: flat on this scale
48 s
GES2002
10.4 hr
PC1991
13 hr
HC + LiNGAM2006
14.4 hr
HC + GOLEM2020
14.4 hr
Mean runtime on the largest tier (N × P² ≥ 10⁷, rows × variables²). 72-hour budget per dataset; budget-exhausted runs count at the budget. HC + LiNGAM and HC + GOLEM both land at about 14.4 hours.

On a true linear scale, SPARC-fast’s runtime is effectively a flat line across the full range of problem sizes. This is the difference between a method run once as an overnight batch job and a method run repeatedly, in the loop of an analysis.

Against the supervised state of the art#

The 2024 ADIA Lab Causal Discovery Challenge12 attracted competitors with models trained on a large corpus of synthetic graphs and then used on real data. We particularly liked the winner of the challenge, who used a scatter and kernel-regression CNN, and the third-place participant, who used a feature and copula-entropy gradient-boosting ensemble. We reproduced their approaches, trained both on the 23,500-graph ADIA corpus, and tested on our benchmark set.

The tested methods scale cubically with the number of variables and were numerically feasible only on 40 small datasets with 20 variables or fewer. Figure 4 reports the comparison with SPARC-fast on this subset.

Figure 4 · Supervised state of the art · 40 datasets

The learned models are strong. SPARC-fast still leads every slice

Across all 40 datasets SPARC-fast reaches 0.77 skeleton F1. The two learned models sit at 0.65 and 0.66.

  • SPARC-fast · May 2026
  • SPARC, previous generation · Mar 2026
  • ADIA challenge winners · 2024, frozen
SPARC-fastMay 2026
0.77
SPARCMar 2026
0.68
ADIA-1st2024, frozen
0.65
ADIA-3rd2024, frozen
0.66

Skeleton F1, higher is better

The 40 small datasets (P ≤ 20) where the ADIA reconstructions are tractable. ADIA-1st and ADIA-3rd are the 2024 ADIA Lab Causal Discovery Challenge winners, trained on the 23,500-graph ADIA corpus and applied unchanged. SPARC-fast sees no training corpus at all.

Both learned models recover respectable skeletons, around 0.65 F1. On continuous data resembling the process they were trained on, they are competitive with SPARC, our previous generation. SPARC-fast leads every slice, and the directed error of the learned models is roughly twice as high, because a star-shaped output around a treatment and an outcome does not orient the edges between the remaining variables. SPARC-fast reaches those numbers with no training corpus at all. Why we took the unsupervised route is the subject of a follow-up post, How we got to SPARC-fast.

Does the recovered structure hold up in use?#

Accuracy against a ground-truth graph is one test. A second, more practical test is whether the recovered graph is good enough to work from. A causal graph names, for each variable, the small set of variables that directly drive it, the ones it drives, and the other drivers of those. Statisticians call this set the Markov blanket; in practice it is the shortlist of what matters for that variable.

Interactive · asia network, bnlearn · 8 variables, 8 true edges

A variable’s Markov blanket is its shortlist

Hover or tap any variable in the graph. Its parents, its children and its children’s other parents light up: everything you need to predict it.

Markov blanket ofTB or cancer5 of the 7 other variables. Given these, the rest of the graph tells you nothing more.
ParentsTuberculosis, Lung cancer
ChildrenPositive X-ray, Shortness of breath
Co-parentsBronchitis
Ground-truth structure of the asia network (Lauritzen and Spiegelhalter, 1988), one of the 69 benchmark datasets. In Figure 5, each target is predicted from exactly this set.

We tested that shortlist directly. For each dataset we predicted held-out values of every variable three ways: from the Markov blanket in the graph SPARC discovered, from the Markov blanket in the true graph, and with AutoGluon14, a strong black-box model given every other column in the table. Forecast skill is the held-out R² for numeric targets and the improvement over always guessing the majority class for categorical ones.

Figure 5 · Downstream prediction · held-out targets

The recovered structure carries the predictive signal

The discovered graph scores 0.520 and the true graph 0.521. SPARC-fast recovers the drivers that carry the signal.

Discovered graphMarkov blanket only · 55 datasets
0.520
True graphMarkov blanket only · 58 datasets
0.521
AutoGluonevery other column · 60 datasets
0.550
Discovered vs true graph0.00average gap: the discovered shortlist predicts as well as the real one
Discovered vs AutoGluon95%of the black-box skill, from a fraction of the inputs
Mean forecast skill on high-order targets: held-out R² for numeric targets, Heidke skill over the majority class for categorical ones. Graph predictors use only each target’s Markov blanket; AutoGluon (medium quality, 120 s) uses every other column.

Predicting from the discovered shortlist alone retained about 95% of the skill of the black-box model that saw every column, with a fraction of the inputs and a model whose structure can be explained. More telling is that the discovered graph and the true graph scored the same, an average gap of zero: SPARC-fast generally recovers the strongest causal drivers of a variable, the ones that carry its practical predictive signal.

Why causal discovery has stayed in the lab#

Causal discovery recovers cause-and-effect structure directly from data. The field has existed since 1991, and its value has never been in question. What has kept it in the research lab is a mismatch between how the methods are built and the data they are asked to run on.

It answers the two questions correlation cannot: why something happened, and what changes if you intervene.

Most causal discovery methods are derived top-down from theoretical assumptions: faithfulness, causal sufficiency, specific noise distributions, no hidden confounders, and often a single variable type. Those assumptions make the mathematics tractable, and they make the methods accurate on the small, tidy, mostly discrete benchmarks the field was developed against. Enterprise data is none of those things. It mixes continuous and categorical columns in one table, runs to hundreds or thousands of variables, carries genuine noise, and routinely hides confounders no one recorded. When the assumptions stop holding, so does the accuracy.

The second barrier is speed. The classical methods build a graph through a sequential search, where each step depends on the result of the last. That structure is hard to parallelize and scales poorly, and on real-world data it pushes runtimes into hours or days for a single problem. A method that runs overnight cannot be a tool an analyst reaches for in the moment. It also cannot be improved quickly, because every research iteration inherits the same wait.

How SPARC-fast is built#

SPARC-fast starts from the data and the outcome rather than from a set of assumptions. It treats mixed-type, noisy, high-dimensional data as the common case, because in practice it is, where several of the established methods have no mechanism for mixed-type data at all.

The name describes the architecture. SPARC is a Screening, Pruning, Agreement and Reconciliation Cascade. Instead of running one expensive procedure across every possible relationship, it moves through stages that grow progressively more expensive and more selective, so the heavy statistics only ever touch the small set of relationships that survive the cheap ones. Four ideas define it.

Architecture · illustrative, on the asia network’s 8 variables

Screening, Pruning, Agreement and Reconciliation Cascade

Every pair of variables starts as a candidate link. Each stage costs more per test than the last, and only ever sees what the cheaper stages let through.

Visit to AsiaSmokingTuberculosisLung cancerBronchitisTB or cancerPositive X-rayShortness of breath
00 · All linksEvery pair of the 8 variables is a candidate: 28 of them. The classical methods pay for an expensive test across all of these, which is the root of their runtime.28of 28 links left
Illustrative. The 8 surviving edges are the asia network’s true structure; which candidate links fall at which stage is drawn for this figure, not measured.

A cascade that spends compute where it matters. The early stages use inexpensive statistics, with guarantees that protect against discarding real relationships, to screen and prune the large majority of candidate links that are clearly not causal. The expensive tests run only on what survives, and a final agreement and reconciliation stage resolves the result into a coherent directed graph. SPARC inverts the classical order: cheap and safe first, expensive and selective last.

Functional-form detection that shrinks the search space. Early in the cascade, SPARC identifies the form of the relationships present in the data, which collapses the space of structures it has to consider. This is much of why its cost grows sub-quadratically in the number of variables, where the established methods grow far faster. Sub-quadratic scaling in the variable count is the central breakthrough.

An embarrassingly parallel core. Each stage decomposes into independent units of work that run all at once across many distributed cores or a GPU, where the classical sequential search resists parallelization. Combined with the cascade, this is what takes runtime from hours to seconds on the largest problems, growing close to linearly in the number of rows.

Randomized low-rank approximation. Where the expensive statistics do run, SPARC approximates them with randomized low-rank methods and projections that preserve the signal the test depends on while collapsing the work required to compute it.

These choices compound. Because a full evaluation across all 69 datasets runs in minutes rather than weeks, we can run orders of magnitude more experiments, and that iteration velocity is itself how the accuracy was built.

What this unlocks#

We built SPARC-fast to make causal discovery accurate out of the box and fast enough to run in seconds. That takes it out of the specialist’s overnight queue and makes it the first tool an analyst reaches for when the question is why something happened, or what would change under intervention. It opens a class of problems causal methods have not previously been able to reach: problems that were worked out manually, or handed to correlational tools that quietly give an answer that is wrong and cannot be explained.

For most of its history, causal discovery has been too slow and too narrow for routine use. SPARC-fast was built to change that, and these are the results we are putting forward to be measured against.

Filed under
  • Causal Discovery
  • Benchmarks
  • SPARC-fast

References#

  1. 1Spirtes, P. and Glymour, C. (1991). An algorithm for fast recovery of sparse causal graphs. Social Science Computer Review, 9(1), 62–72. doi.org/10.1177/089443939100900106↩︎ Back
  2. 2Chickering, D. M. (2002). Optimal structure identification with greedy search. Journal of Machine Learning Research, 3, 507–554. jmlr.org↩︎ Back
  3. 3Shimizu, S., Hoyer, P. O., Hyvärinen, A. and Kerminen, A. (2006). A linear non-Gaussian acyclic model for causal discovery. Journal of Machine Learning Research, 7, 2003–2030. jmlr.org↩︎ Back
  4. 4Ng, I., Ghassami, A. and Zhang, K. (2020). On the role of sparsity and DAG constraints for learning linear DAGs. Advances in Neural Information Processing Systems, 33. arXiv:2006.10201↩︎ Back
  5. 5Zheng, X., Aragam, B., Ravikumar, P. and Xing, E. P. (2018). DAGs with NO TEARS: continuous optimization for structure learning. Advances in Neural Information Processing Systems, 31. arXiv:1803.01422↩︎ Back
  6. 6Heckerman, D., Geiger, D. and Chickering, D. M. (1995). Learning Bayesian networks: the combination of knowledge and statistical data. Machine Learning, 20, 197–243. doi.org/10.1007/BF00994016↩︎ Back
  7. 7Tsamardinos, I., Brown, L. E. and Aliferis, C. F. (2006). The max-min hill-climbing Bayesian network structure learning algorithm. Machine Learning, 65, 31–78. doi.org/10.1007/s10994-006-6889-7
  8. 8Scutari, M. (2010). Learning Bayesian networks with the bnlearn R package. Journal of Statistical Software, 35(3). bnlearn.com/bnrepository↩︎ Appendix
  9. 9Marbach, D., Schaffter, T., Mattiussi, C. and Floreano, D. (2009). Generating realistic in silico gene networks for performance assessment of reverse engineering methods. Journal of Computational Biology, 16(2), 229–239. synapse.org/dream4↩︎ Appendix
  10. 10Geffner, T. et al. (2022). Deep end-to-end causal inference. arXiv:2202.02195. csuite datasets: github.com/microsoft/csuite↩︎ Appendix
  11. 11Sachs, K., Perez, O., Pe’er, D., Lauffenburger, D. A. and Nolan, G. P. (2005). Causal protein-signaling networks derived from multiparameter single-cell data. Science, 308(5721), 523–529. doi.org/10.1126/science.1105809↩︎ Appendix
  12. 12ADIA Lab Causal Discovery Challenge (2024), hosted by CrunchDAO. hub.crunchdao.com↩︎ Back
  13. 13UCI Machine Learning Repository, Pittsburgh Bridges dataset. archive.ics.uci.edu↩︎ Appendix
  14. 14Erickson, N. et al. (2020). AutoGluon-Tabular: robust and accurate AutoML for structured data. arXiv:2003.06505↩︎ Back
  15. 15Guyon, I. et al. LUCAS (Lung Cancer Simple Set), Causality Workbench. causality.inf.ethz.ch↩︎ Appendix

Appendix: the 69 benchmark datasets#

Appendix · benchmark datasets

69 datasets, from 2 to 441 variables

P is the number of variables, N the number of rows, E the number of ground-truth edges.

DatasetSourceTypePNE
csuite_linexpcsuite [10]continuous24,0001
csuite_lingausscsuite [10]continuous24,0001
csuite_nonlingausscsuite [10]continuous24,0001
csuite_cat_to_ctscsuite [10]mixed24,0001
csuite_cts_to_catcsuite [10]mixed24,0001
csuite_cat_chaincsuite [10]discrete34,0002
csuite_cat_collidercsuite [10]discrete34,0002
sprinklertextbook networkdiscrete41,0004
csuite_nonlin_simpsoncsuite [10]continuous42,0004
csuite_symprod_simpsoncsuite [10]continuous42,0004
csuite_mixed_simpsoncsuite [10]mixed44,0004
cancerbnlearn [8]discrete510,0004
earthquakebnlearn [8]discrete510,0004
surveybnlearn [8]discrete610,0006
asiabnlearn [8]discrete810,0008
csuite_large_backdoorcsuite [10]continuous92,0009
csuite_weak_arrowscsuite [10]continuous92,00015
csuite_large_backdoor_binary_tcsuite [10]mixed92,0009
csuite_weak_arrows_binary_tcsuite [10]mixed92,00015
dream4_10_1 … _55 networksDREAM4 [9]continuous103012–16
sachs_1 … _1414 conditionsSachs [11]continuous11707–92717
sachs_allSachs [11]continuous1111,67217
lucasCausality Workbench [15]discrete122,00012
csuite_mixed_confoundingcsuite [10]mixed124,00015
pittsburgh_bridgesUCI [13]mixed121084
synth_triplesRootCause syntheticcontinuous132,0006
sangiovesebnlearn [8]mixed1510,00055
childbnlearn [8]discrete2010,00025
mehrabnlearn [8]mixed2410,00071
insurancebnlearn [8]discrete2710,00052
waterbnlearn [8]discrete3210,00066
mildewbnlearn [8]discrete3510,00046
alarmbnlearn [8]discrete3710,00046
rivers_floodhydrological network (to confirm)mixed423,01042
magic_niabbnlearn [8]continuous4410,00066
ecoli70bnlearn [8]continuous4610,00070
barleybnlearn [8]discrete4810,00084
hailfinderbnlearn [8]discrete5610,00066
magic_irribnlearn [8]continuous6410,000102
hepar2bnlearn [8]discrete7010,000123
win95ptsbnlearn [8]discrete7610,000112
dream4_100_1 … _55 networksDREAM4 [9]continuous100100176–249
arth150bnlearn [8]continuous10710,000150
pathfinderbnlearn [8]discrete10910,000195
munin1bnlearn [8]discrete18610,000273
andesbnlearn [8]discrete22310,000338
diabetesbnlearn [8]discrete41310,000602
pigsbnlearn [8]discrete44110,000592
Grouped rows count once per network or condition. Variable bars use a log scale, 2 to 441.

Keep reading

All research →
Research · Causal DiscoveryHow we got to SPARC-fastSPARC-fast is the third version of our causal discovery engine in fourteen months. This is how we got there: the score CausalACO had to lose, the model we chose not to train, and how SPARC-fast won the speed back.
Next in this series · coming soonHow we got to SPARC-fastWhy we took the unsupervised route, the two research directions we ruled out, and what the learned models’ transfer behavior says about the supervised one.