causal discovery algorithms
Most causal methods start by assuming you already know the graph. Causal discovery flips that around and asks the harder question: can the data itself tell you which variable causes which? These algorithms search the space of possible graphs for one whose implied pattern of dependence and independence best matches what the data shows, turning structure learning from a modeling assumption into an inference target.
Three broad families dominate. Constraint-based methods (PC, FCI) run a battery of conditional-independence tests and keep only graphs consistent with them. Score-based methods (GES, and continuous-optimization variants such as NOTEARS) assign each candidate graph a goodness-of-fit penalty and optimize it. Functional methods (additive-noise and LiNGAM models) exploit asymmetries in the noise to orient edges that the first two families must leave undirected. Each rests on assumptions like causal sufficiency, faithfulness, and acyclicity.
The fundamental limit is that observational data alone usually cannot pin down a unique graph: many distinct causal structures imply the very same independencies, so the honest output is a Markov equivalence class, a set of graphs that the data cannot tell apart. Interventional or time-series data, or functional-form assumptions, are what break the remaining ties and recover orientation.
Faithfulness can fail when two causal paths cancel out, producing an independence that does not reflect the true graph; near-cancellations also fool finite-sample tests.