Repository navigation
v2.0.0
Antecedent 2.0.0 release notes
The 2.0 release in one view
2.0 makes Antecedent's existing causal lifecycle more capable without dropping its claim contract. The same identify → estimate → inspect → refresh → export → consume workflow now reaches learner-backed estimation and structural transport. A result still carries its identification, support, uncertainty, assumptions, provenance, and limits rather than exposing an estimate alone.
Learner-backed causal estimation
2.0 adds a Rust-native learner substrate built for nuisance prediction. It provides a stable learner specification and capability contract; zero-copy dense/sparse design views; row-indexed folds; and fold-local preprocessing, so learned transformations do not leak validation information into cross-fitting.
The initial provider set includes Antecedent-controlled OLS, weighted OLS, ridge, logistic, penalized logistic, elastic-net, and basis-regression paths, alongside gradient-boosted-tree, random-forest, extra-tree, and CPU-native neural adapters. The standard Python wheel includes the neural route. A restrained automatic selection route compares appropriate nuisance candidates instead of launching an unconstrained model search. Every fitted route reports the implementation and relevant capabilities rather than putting a provider name into the causal API.
On that foundation, 2.0 adds DML, cross-fitted AIPW, DR-Learner, and honest causal-forest workflows. Their outputs include held-out nuisance predictions, fold assignments, outcome/treatment diagnostics, overlap and trimming disclosure, and learner provenance. The uncertainty boundary is intentional: the honest forest exposes cate_leaf_dispersion as a stability diagnostic, not a pointwise standard error or confidence interval; nonlinear or penalized CATE final stages likewise do not manufacture pointwise intervals.
Structural transport across populations
2.0 turns transport from a formula-shaped feature into a checked execution workflow. Transport requests now state the target population, environments, evidence regimes, measured variables, interventions, sampling semantics, and known dependence. The implementation keeps separate experiments, marginal and joint measurements, observed evidence and proposed experiments, and population-specific mechanisms distinct.
Identification uses population- and regime-aware expressions plus a checked derivation DAG. The single-source route supports target-only derivations, classical theorem-scoped recursive identification, and verified scoped non-transportability witnesses. It keeps formula derivation separate from binding the formula to the supplied evidence catalog. Complementary-source transport tracks each selected source and premise, uses deterministic binding policy, and never silently pools incompatible studies or double-counts a shared dataset.
The evaluator supports exact finite-discrete laws and the licensed empirical table path. It validates provider coverage before evaluation, reports factor-level support and denominator failures, and preserves a certified functional while optimizing its execution plan. Prepared transport supports inspect → prepare → estimate → explicit refresh, while target response grids retain coordinates, partial failures, factor diagnostics, and joint resampling across grid points. Artifacts preserve the population, regime, derivation, provider, evidence, and inference identities through Rust/Python and independent-consumer round trips.
Clearer outcomes and stronger boundaries
The transport contract now distinguishes invalid input, theorem-stage non-certification, verified structural non-transportability, missing evidence or provider, unsupported evaluator, support failure, numerical failure, and budget/cancellation. A formula can therefore be identified yet unavailable to evaluate, and a failed bounded search never becomes an impossibility claim.
2.0 also strengthens the broader claim system: support coordinates, typed refusals, evidence, provenance, calibration status, artifact validation, and migration behavior remain explicit across the new paths. See the 2.0 transport migration guide for the public API moves.
What is deliberately not claimed in 2.0
The support matrix remains authoritative. An implemented type or documented workflow is not a license for every query, graph, evidence, inference, and validation combination. In particular, the initial transport statistical path is finite-discrete and its intervals are pointwise; continuous point interventions, quantile/derivative transport inference, and simultaneous response-grid bands are not licensed here.
Calibration status remains attached to every result. calibrated requires a coverage record that both matches the execution and attests the executing code; an interval does not become a general guarantee merely because an estimator returned it.
Explicit refusals
Every root query in the matrix has at least one licensed cell, so no query family is refused as a whole. Individual combinations refuse for graph, structure, evidence, inference, validation, support, or budget reasons; a combination not listed in the licensed block below is refused. See the support matrix for the full coordinate-level boundary.
Licensed support snapshot
463 licensed of 1403 meaningful cells (1999 n/a typed impossibilities are not a coverage gap). 940 refused with a reason on file; 0 refused without a reason; 0 active allowed_unlicensed compatibility entries.
Interval calibration of the 463 licensed cells: 295 cite coverage records; 164 have no coverage measurement for their estimator (estimator_grid_not_measured); 4 report no interval (no_interval_reported). A licensed cell therefore does not imply that its interval coverage was measured, and cited records do not by themselves make a result calibrated (see result.calibration).
AnomalyAttribution×Dag×explicit×Frequentist× validationnoneAverageDerivative×Dag×explicit/accepted×Frequentist× validationnoneAverageDerivative×Dag×explicit/accepted×Bayesian× validationnoneAverageEffect×Dag/Admg/Cpdag/Pag×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullAverageEffect×CoDetermined/Unknown×explicit×Frequentist× validationnoneAverageEffect×Dag/Admg/Cpdag/Pag×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullChangeAttribution×Dag×explicit×Frequentist× validationnoneConditionalEffect×Dag/Cpdag/Pag×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullConditionalEffect×Dag/Cpdag/Pag×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullCounterfactual×Dag×explicit/accepted×Frequentist× validationnoneCounterfactual×Dag×explicit/accepted×Bayesian× validationnoneDirectionalDerivative×Dag×explicit/accepted×Frequentist× validationnoneDirectionalDerivative×Dag×explicit/accepted×Bayesian× validationnoneElasticity×Dag×explicit/accepted×Frequentist× validationnoneElasticity×Dag×explicit/accepted×Bayesian× validationnoneInterventionalDistribution×Dag×explicit/accepted×Frequentist× validationnone/cheap/fullInterventionalDistribution×Admg×explicit/accepted×Frequentist× validationnoneInterventionalDistribution×Dag×explicit/accepted×Bayesian× validationnone/cheap/fullInterventionalDistribution×Admg×explicit/accepted×Bayesian× validationnoneInterventionResponse×Dag/Admg×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullInterventionResponse×Cpdag×explicit×Frequentist× validationnoneInterventionResponse×Cpdag×accepted×Frequentist× validationnoneInterventionResponse×Cpdag×graph_posterior×Frequentist× validationnoneInterventionResponse×Cpdag×graph_posterior×Frequentist× validationcheapInterventionResponse×Cpdag×graph_posterior×Frequentist× validationfullInterventionResponse×Pag×explicit×Frequentist× validationnoneInterventionResponse×Pag×accepted×Frequentist× validationnoneInterventionResponse×Pag×graph_posterior×Frequentist× validationnoneInterventionResponse×Pag×graph_posterior×Frequentist× validationcheapInterventionResponse×Pag×graph_posterior×Frequentist× validationfullInterventionResponse×TemporalDag×explicit×Frequentist× validationnoneInterventionResponse×TemporalDag×accepted×Frequentist× validationnoneInterventionResponse×TemporalDag×graph_posterior×Frequentist× validationnoneInterventionResponse×TemporalDag×graph_posterior×Frequentist× validationcheapInterventionResponse×TemporalDag×graph_posterior×Frequentist× validationfullInterventionResponse×TemporalCpdag×explicit×Frequentist× validationnoneInterventionResponse×TemporalCpdag×accepted×Frequentist× validationnoneInterventionResponse×TemporalCpdag×graph_posterior×Frequentist× validationnoneInterventionResponse×TemporalCpdag×graph_posterior×Frequentist× validationcheapInterventionResponse×TemporalCpdag×graph_posterior×Frequentist× validationfullInterventionResponse×TemporalPag×explicit×Frequentist× validationnoneInterventionResponse×TemporalPag×accepted×Frequentist× validationnoneInterventionResponse×TemporalPag×graph_posterior×Frequentist× validationnoneInterventionResponse×TemporalPag×graph_posterior×Frequentist× validationcheapInterventionResponse×TemporalPag×graph_posterior×Frequentist× validationfullInterventionResponse×CoDetermined×explicit×Frequentist× validationnoneInterventionResponse×Dag/Cpdag/Pag×explicit/accepted/graph_posterior×Bayesian× validationnoneInterventionResponse×Admg×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullInterventionResponse×TemporalDag×explicit×Bayesian× validationnoneInterventionResponse×TemporalDag×accepted×Bayesian× validationnoneInterventionResponse×TemporalDag×graph_posterior×Bayesian× validationnoneInterventionResponse×TemporalDag×graph_posterior×Bayesian× validationcheapInterventionResponse×TemporalDag×graph_posterior×Bayesian× validationfullInterventionResponse×TemporalCpdag×explicit×Bayesian× validationnoneInterventionResponse×TemporalCpdag×accepted×Bayesian× validationnoneInterventionResponse×TemporalCpdag×graph_posterior×Bayesian× validationnoneInterventionResponse×TemporalCpdag×graph_posterior×Bayesian× validationcheapInterventionResponse×TemporalCpdag×graph_posterior×Bayesian× validationfullInterventionResponse×TemporalPag×explicit×Bayesian× validationnoneInterventionResponse×TemporalPag×accepted×Bayesian× validationnoneInterventionResponse×TemporalPag×graph_posterior×Bayesian× validationnoneInterventionResponse×TemporalPag×graph_posterior×Bayesian× validationcheapInterventionResponse×TemporalPag×graph_posterior×Bayesian× validationfullMediationEffect×Dag×explicit/accepted×Frequentist× validationnone/cheap/fullMediationEffect×Dag×explicit/accepted×Bayesian× validationnone/cheap/fullPathSpecificEffect×Dag×explicit/accepted×Frequentist× validationnone/cheap/fullPathSpecificEffect×Dag×explicit/accepted×Bayesian× validationnone/cheap/fullPointDerivative×Dag×explicit/accepted×Frequentist× validationnonePointDerivative×Dag×explicit/accepted×Bayesian× validationnonePulseEffect×TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullPulseEffect×TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullResponseCurve×Dag/Admg/Cpdag/Pag/TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Frequentist× validationnoneResponseCurve×Dag/Admg/Cpdag/Pag/TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Bayesian× validationnoneResponseJacobian×Dag×explicit/accepted×Frequentist× validationnoneResponseJacobian×Dag×explicit/accepted×Bayesian× validationnoneSemiElasticity×Dag×explicit/accepted×Frequentist× validationnoneSemiElasticity×Dag×explicit/accepted×Bayesian× validationnoneSustainedEffect×TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullSustainedEffect×TemporalDag/TemporalCpdag/TemporalPag×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullTemporalMediationEffect×TemporalDag/TemporalCpdag×explicit/accepted/graph_posterior×Frequentist× validationnone/cheap/fullTemporalMediationEffect×TemporalDag/TemporalCpdag×explicit/accepted/graph_posterior×Bayesian× validationnone/cheap/fullTransportQuery×Admg×explicit×Frequentist× validationnoneInterferenceQuery×Dag×explicit×Frequentist× validationnone
What's Changed
- Antecedent 2.0: learner-backed estimation and structural transport by @nulldiver in #42
Full Changelog: v1.11.0...v2.0.0