Skip to content

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 08:13
· 1056 commits to main since this release
00e0208

Antecedent 2.2.0

Antecedent 2.2.0 lets you ask which enumerated interventions reach a target mean, compare related claims using their shared score covariance, and see why a requested answer is refused. It adds an analytic interval for learned continuous trial transport under two declared IID designs, plus bounded transport, counterfactual, and study-planning routes. Results carry their assumptions, support checks, provenance, and refusal reasons.

Start with the question

If you need to… Start here What you get
Ask “what would have to be true for this outcome?” over interventions you name Finite-action inverse outcome Feasible, infeasible, unsupported, and unevaluated actions relative to a licensed forward mean response and the enumerated grid
Keep a large AIPW analysis on the score-table path Penalized propensity Declared ridge or lasso propensity, cross-fitted scores, overlap diagnostics, and retargeting
Compare contract-specific routes or other related claims Configured batches and retargeting Joint plug-in covariance and named contrasts on a shared row snapshot
Transport a randomized trial's continuous outcome to a target population Learned continuous transport Cross-fitted target mean contrast and a calibrated pointwise analytic interval for either declared IID sampling design
Work with repeated entities or dyads Clustered cross-fitted AIPW Cluster-owned folds, score table, and dependence-aware standard error
Declare a composite treatment Joint cells and derived treatments Checked source roles, cell overlap, and a factorized propensity
Analyze matched case-control samples Matched case-control odds ratio A conditional odds ratio with design-specific refusals for absolute risks

The inverse query is a finite search over already evaluated forward points. It does not infer an unobserved scenario from an outcome, interpolate missing doses, or turn point estimates into probabilities. A feasible action is feasible under the stated forward assumptions and target threshold; an action outside empirical support stays unsupported. The report binds the forward claim, program, and data snapshot identifiers when supplied. Its verify() method replays the local classification; it is not an authenticity check for the forward model.

For exploration before estimation, dependency preflight, cost estimates, and overlap diagnostics make failure modes actionable. For structural questions, the bounded transport and study planning routes say which inputs identify a target and what hypothetical evidence could repair a failed search.

Inference boundary. Point estimates, plug-in score covariances, structural envelopes, and assumption ranges have the meanings stated below. Sampling intervals without passing coverage at their exact coordinates remain withheld, even when an implementation can calculate a candidate band. The learned continuous trial transport percentile interval failed its sample-size grid; its analytic influence interval passed and is available for the declared IID designs.

How to read the claims

Term Meaning
point_only An exact or plug-in point estimate. No interval of any kind is claimed.
nominal An interval whose coverage was never measured at its own coordinate (estimator_grid_not_measured). 2.2 cells publish none.
calibrated An interval with a coverage record measured at its own coordinate; shown to readers as a statistical interval. A cell is described this way only once its records exist.
structural_envelope The range of an answer over explicitly supplied structural scenarios. Not a confidence interval.
assumption_range The range of an answer over a declared sensitivity set. Not a confidence interval.
none No numerical claim: identification or inspection only.
statistical interval The reader-facing name of a calibrated interval; it appears only beside a measured coverage record.

2.2A cells

X1: multi source limited experiment

Claim: point_only

  • Question: Can a catalog of limited experiments spread across several source populations identify the target effect when no single source can?
  • Scope: Finite discrete selection ADMG shared by target and sources; one selection diagram per source over the same named observed variables.
  • Guarantee: sound_incomplete.
  • Bounds: max_observed = 12, max_sources = 4, max_controllable_per_source = 4, max_candidate_regimes = 64, max_search_states = 4096, max_depth = 24.
  • Interval: withheld. Coverage records passed for both declared sampling designs; the public interval remains closed for 2.2, so the result is the point only.

X2: finite scenario envelope

Claim: structural_envelope

  • Question: Which transport conclusions survive each of a finite, explicitly supplied set of graph/selection scenarios?
  • Scope: Finite list (1-64) of fixed selection diagrams (directed and bidirected edges over static observed variables, any number of outcomes and treatments) over at most 12 shared observed variables, each decided by the already licensed classical catalog sID row with that row's scope inherited unchanged: the only gate the scenario code adds is the 12-variable bound. Every scenario result is a checked derivation or an independently verified s-hedge, so the row's own limit (multi-outcome and larger general graphs are not enumerated against a latent-SCM oracle) narrows its conformance coverage, not what the path admits; no random ADMG in the scenario tests reached not_certified, which is a defensive status for this route. The new bounded ADMG transport class of 2.2B B1 is a later, separate row and enters only after B1 passes. No CPDAG/PAG-native transport ID.
  • Guarantee: per_scenario_contract_guarantee.
  • Bounds: max_scenarios = 64, max_observed = 12.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: scenario_aggregate_not_licensed).
  • Not an interval: the structural envelope is never a confidence interval.

X4: learned continuous trial transport

Claim: calibrated

  • Question: What is the mean effect of a randomized binary treatment on a continuous outcome in an overlap-supported target population, and which graph-specific estimators are eligible?
  • Scope: Certified direct or baseline-standardization transport derivation (existing prepare_trial graph contract).
  • Guarantee: model_double_robustness_of_point_and_pointwise_analytic_interval_under_iid_nuisance_rate_conditions. The point is model doubly robust; the interval also needs overlap and cross-fitting nuisance-rate conditions.
  • Bounds: max_bootstrap = 2000, min_bootstrap = 199, max_folds = 20, max_rows_consumed = 1000000, max_features_consumed = 256.
  • Interval: prepared.interval() reports the design-specific influence standard error and normal-reference interval. The 95% route passed a six-point sample-size grid with 2,000 datasets per point. It is not a CATE or simultaneous band. The percentile bootstrap failed coverage and remains unavailable; a bootstrap request returns the point with a withheld status. Interval artifacts use version 2 and are independently replayed; point artifacts remain version 1.

X5: two step temporal transport

Claim: point_only

  • Question: Does a fixed two-step intervention sequence [a1, a2] transfer from the source to the target population, and what is its target response?
  • Scope: Explicit acyclic two-slice unrolling (ADR 0021 temporal coordinates, TemporalDag unfolding or supplied directly) as a selection ADMG: baseline covariates, time-varying covariates observed before each action, one action per step over one discrete alphabet, one outcome after the last action, latent confounding as bidirected edges, and time-indexed selection targets. Horizon 2; at most 8 actions, 12 coordinates and 4096 complete covariate histories.
  • Guarantee: sound_incomplete.
  • Bounds: horizon = 2, max_actions = 8, max_observed = 12, max_history_states = 4096.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: estimator_inference_mismatch).

X8: path specific edge intervention

Claim: point_only

  • Question: On a fixed fully observed DAG, how much of the treatment effect flows along a chosen set of edges while every other edge sees the baseline value?
  • Scope: Explicit Markovian DAG of at most 8 observed variables with a single treatment and outcome: no latent confounding, no accepted or uncertain structure, no equivalence class, no temporal graph. B5 replaces the check with counterfactual identification on ADMGs.
  • Guarantee: exact_under_specified_scm.
  • Bounds: max_variables = 8, max_worlds = 8, max_rows = 100000.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: estimator_inference_mismatch).

X9: mixed source proof search

Claim: point_only

  • Question: Can complementary distributions from different studies of one population identify a query that no named theorem route covers, and which leaf is missing when they cannot?
  • Scope: Finite discrete ADMG over at most 10 observed variables; inputs are the target population's whole-population, available, measured, unconditioned joint laws of catalog regimes (observational, or experimental families that supply every level of their intervention set). A regime restricted to named levels is excluded as restricted_levels: the search states identification for every level of the treatments.
  • Guarantee: sound_incomplete.
  • Bounds: max_observed = 10, max_distributions = 16, max_search_states = 20000, max_depth = 16, max_move = 2, max_intervention_set = 3, max_sources = 4.

2.2B cells

X2: admg conditional transport

Claim: point_only

  • Question: Is the target population's conditional interventional distribution P*(y | do(x), w) transportable from a source that can run every experiment, over a latent-confounded selection ADMG, and what is its value?
  • Scope: Finite discrete selection ADMG (directed and bidirected edges over static observed variables) with at most 6 observed variables; one parentless selection node per selection target (population-difference semantics of MutilatedSelection); 1-3 conditioned variables, 0-3 treatments, outcomes, treatments and conditioned variables pairwise disjoint. Selection-bias (S = 1 sampling) semantics, soft interventions and gID/g-transportability with surrogate or heterogeneous experiments are excluded; gID is deferred to 2.3A.
  • Guarantee: sound_incomplete.
  • Bounds: max_observed = 6, max_treatments = 3, max_conditioned = 3, max_search_states = 4096, max_depth = 24.

X6: study planning

Claim: none

  • Question: Given a failed X1 (mz) or X9 (mixed-source) decision and a declared universe of candidate studies with integer costs, which cheapest subset of at most three studies would, if it delivered exactly the declared regimes, make the same route identify the query, and which factor or proof step does it repair?
  • Scope: Exactly the X1 class on route Mz (2-4 sources, at most 12 observed variables, 1-4 controllables per source) and exactly the X9 class on route Mixed (at most 10 observed variables, at most 16 usable distributions); the planner adds no graph of its own.
  • Guarantee: sound_incomplete.
  • Bounds: max_candidates = 16, max_regimes_per_candidate = 8, max_subset_size = 3, max_proposals = 32, max_search_states = 200000, max_depth = 24, max_depth_mixed = 16.

X10: binary observation recovery

Claim: point_only

  • Question: When some binary variables are item-missing (explicit response indicators and proxies), can the full law of the complete data P(X(1), O) be recovered from one named observed pattern law, and then feed an ordinary identifier for a causal effect?
  • Scope: Binary DAG m-graph over fully observed O (at most 2), partially observed X(1) (at most 3), one response indicator R_i and one proxy X*_i (domain {0, 1, ?}) per partially observed variable. R_i parents are substantive variables (X, O) only; X*_i has exactly the parents X_i and R_i and no children; substantive variables have substantive parents only. Selection nodes, bidirected edges, non-binary variables and R -> R edges are refused as unsupported mechanisms.
  • Guarantee: sound_incomplete.
  • Bounds: max_partially_observed = 3, max_fully_observed = 2, max_observed_cells = 864, max_search_operations = 50000, max_depth = 32.

X4: smoothed dose response transport

Claim: point_only

  • Question: What is the kernel-smoothed mean response of a randomized continuous dose, at each of a few declared doses and one declared bandwidth, in an overlap-supported target population?
  • Scope: Certified direct or baseline-standardization transport derivation (the existing prepare_trial graph contract) with one continuous dose variable as the single source experiment.
  • Guarantee: model_double_robustness_of_point_only.
  • Bounds: max_grid_points = 16, max_folds = 20, min_bootstrap = 199, max_bootstrap = 2000, max_rows = 200000, max_features = 256, max_basis_degree = 3, max_knots = 8, max_workspace_bytes = 536870912.
  • Interval: withheld. Both design-specific coverage records were measured; the public percentile route remains closed (cell_not_licensed) for 2.2. The result is the point only.

X3: joint mechanism sensitivity

Claim: assumption_range

  • Question: How far can the registered surrogate z-transport contrast move when the outcome kernel and the shared parent marginal it cites deviate together from their source values, and which joint deviations cross a decision threshold? The answer is an exact assumption range; sampling uncertainty is not offered by this record (record 2.2B.X3.joint_sensitivity_uncertainty has measured coverage, but its interval route remains closed for 2.2).
  • Scope: Single-source selection ADMG whose bounded z-transport derivation is the registered surrogate formula sum_w P(Y | w, X, do(Z)) P(w | do(Z)): one outcome, one binary treatment, one shared parent W, one cited source regime (the class 2.1 z_transport_mechanism_sensitivity accepts).
  • Guarantee: exact_range_complete_within_declared_contamination_class (range only; sampling uncertainty is not offered by this record, and its conservative method is paper-inherited: record 2.2B.X3.joint_sensitivity_uncertainty has measured coverage but remains closed for 2.2) (complete only within the declared contamination class; sampling interval not offered).
  • Bounds: max_factors = 2, max_parent_levels = 64, max_outcome_categories = 32, max_frontier_points = 33, max_bisection_iterations = 64, max_operations = 100000.
  • Not an interval: the assumption range is never a confidence interval.

X3: joint sensitivity uncertainty

Claim: point_only

  • Question: What sampling uncertainty surrounds the joint deviation range of the registered surrogate z contrast, composed by one method whose coverage is measured at its own coordinate? Both coverage records were measured; every public route still refuses (cell_not_licensed) for 2.2.
  • Scope: As record 2.2B.X3.joint_mechanism_sensitivity: single-source selection ADMG whose bounded z-transport derivation is the registered surrogate formula (one outcome, one binary treatment, one shared parent W, one cited source regime).
  • Guarantee: conservative_one_sided_coverage_target_paper_inherited_route_closed.
  • Bounds: max_bootstrap_internal = 2000.
  • Interval: withheld. Its two coverage records were measured, but the public route remains closed (cell_not_licensed) for 2.2; the result is the point only.

X8: admg counterfactual id

Claim: point_only

  • Question: On a finite-discrete causal diagram with latent confounding, what is the probability that the outcome would have been y had the treatment been x, among units that actually received x', and how does that compare with what was observed among them?
  • Scope: Explicit ADMG (directed and bidirected edges; a DAG is accepted as an ADMG without bidirected edges) of at most 6 observed finite-discrete variables, each with 1 to 4 levels; one treatment X and one outcome Y. No selection, temporal, accepted, uncertain or equivalence-class structure.
  • Guarantee: sound_incomplete.
  • Bounds: max_variables = 6, max_levels = 4, max_search_operations = 100000, max_search_depth = 64.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: estimator_inference_mismatch).

Additional 2.2.0 cells

E7: matched case control odds ratio

Claim: point_only

  • Question: From matched case-control sets sampled on the outcome, what is the conditional odds ratio of a binary exposure, and which sets informed it?
  • Scope: None: the cell takes no causal graph. It states a conditional association parameter among declared matched sets; no confounding beyond the declared matching is identified and none is claimed.
  • Guarantee: exact_conditional_likelihood_point_only.
  • Bounds: max_iterations = 500, replay_max_rows = 10000000.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: cell_not_licensed).

E6: finite action inverse outcome

Claim: point_only

  • Question: Of a caller-enumerated finite set of interventions on one treatment, each with a declared cost and constraints, which reach a target mean E[Y^do(a)] >= threshold (or <=) under a licensed forward response, which are infeasible, which cannot be assessed (unsupported or off the evaluated grid), and what evidence would be missing?
  • Scope: Whatever the forward route accepts: the cell takes no graph and adds no identification claim. It requires a scalar-outcome mean curve (ResponseCurve, static dose or temporal dose-by-horizon surface) that is point identified; identified sets, class mixtures and non-mean functionals are refused.
  • Guarantee: exact_enumeration_point_only.
  • Bounds: max_actions = 4096, max_forward_points = 65536.

E2: penalized propensity aipw

Claim: calibrated

  • Question: With adjustment covariates and a propensity the plain logistic cannot fit (separation, collinearity) or fits badly, what cross-fitted AIPW estimate and standard error does an explicit ridge- or lasso-logistic propensity give, with the score table kept for retargeting, and what does a failed GLM propensity fit fall back to?
  • Scope: Back-door adjustment DAG: the adjustment set of one identified AllObserved mean ATE with binary treatment; the route takes the identification the AIPW route already holds and adds no graph class.
  • Guarantee: cross_fitted_aipw_scores_with_conditional_influence_and_refit_bootstrap_intervals.
  • Bounds: max_grid = 64, max_inner_folds = 20.
  • Interval: The 95% ridge and lasso analytic and refit-bootstrap intervals are licensed at their exact measured nuisance grids, sample-size ranges and bootstrap counts. Other coordinates, including fallback, report scope_not_assessed.

E4: clustered dml aipw

Claim: calibrated

  • Question: When rows come in independent clusters (sites, households, patients), what cross-fitted AIPW point estimate follows from whole-cluster folds, and with what cluster-sandwich standard error of the scores, without calling an IID cross-fit with a cluster standard error 'clustered DML'?
  • Scope: Back-door adjustment DAG: the adjustment set of one identified AllObserved mean ATE with binary treatment; the route takes the identification the AIPW route already holds and adds no graph class.
  • Guarantee: cluster_sandwich_point_with_measured_one_way_t_interval.
  • Bounds: min_clusters_floor = 10, default_min_clusters = 20, min_components_per_fold_floor = 2, default_min_components_per_fold = 4.
  • Interval: The one-way 95% cluster t interval is licensed at its measured 300–800-row coordinate. Dyadic intervals have no matching coverage record; bootstrap and alternate SE requests refuse with cluster_interval_not_licensed.

E7: descriptive comparison

Claim: point_only

  • Question: How far is the unadjusted treated-versus-control contrast from an adjusted estimate of the same estimand coding, and what are a mean-outcome pair's risk difference, log risk ratio and log odds ratio with their first-order covariance when the source carries the pair's joint covariance?
  • Scope: None: the cell takes no causal graph and adds no identification claim. It reports on estimates the caller already holds.
  • Guarantee: descriptive_arithmetic_and_first_order_delta_method_point_only.
  • Bounds: max_scales = 4.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: cell_not_licensed).

E7: tier diagnostics

Claim: point_only

  • Question: For an executed tiered average-effect result, which overlap and E-value diagnostics does its own design carry, and which are unavailable and why?
  • Scope: The tiered backgrounds the licensed cells accept (CoDetermined closure and the Unknown two-scenario envelope); the cell adds no graph and no identification claim.
  • Guarantee: read_off_executed_result_point_only.
  • Bounds: none declared.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: cell_not_licensed).

E5: factorized joint cells

Claim: point_only

  • Question: For up to three jointly intervened binary treatment components, what is the mean outcome under each joint cell, which cells does the data support, how sensitive is the family to the declared factorization order, and does a derived-treatment construction leak its own constituents into the adjustment set?
  • Scope: A caller-certified static adjustment set for a joint set-intervention on discrete binary components; the cell takes no graph of its own and does not certify the adjustment set. The derived-treatment declaration checks only role classification, measurement-time consistency, leakage by name and by exact copy, tracking, legal values and numerical rank.
  • Guarantee: cross_fitted_point_only_per_cell_refusal.
  • Bounds: max_components = 3, max_orderings = 6, max_folds = 20.
  • Interval: withheld. The sampling-uncertainty interval is not offered (its route is closed: ml_nuisance_not_licensed, penalized_interval_not_licensed).

E3: batch retarget covariance contrasts

Claim: calibrated

  • Question: For a family of retargeted claims over one data snapshot (the same plan reweighted to several declared populations, or several plans), what are the points, their joint covariance, and named contrasts such as route A minus route B, and what may be said about the family as a whole?
  • Scope: The back-door adjustment DAG of each plan's cross-fitted AIPW or cell-AIPW score table; the cell adds no graph class and takes each plan's identification as prepared.
  • Guarantee: plug_in_score_covariance_with_measured_max_t_band.
  • Bounds: none declared.
  • Interval: The complete-family 95% max-t simultaneous band is licensed at its measured coordinate. Partial families refuse with cell_not_licensed; other unmeasured coordinates make no coverage claim.

E3: dml score covariance

Claim: point_only

  • Question: For a DML, DR-Learner or CausalForest average effect, what are the row-identified cross-fitted scores behind the reported ATE, and what point and plug-in score covariance do declared retargeted populations of that estimate have?
  • Scope: Back-door adjustment DAG of the identified AllObserved mean ATE with binary treatment; the route takes the identification the estimator already holds.
  • Guarantee: cross_fitted_aipw_scores_point_only_no_interval.
  • Bounds: none declared.

E1: preflight rank drop estimation

Claim: point_only

  • Question: When a declared adjustment set contains an exact linear dependency, what does the configured estimator give on the set with the dependent columns removed, and what exactly was dropped?
  • Scope: Declared binary-contrast adjustment design (one treatment, one outcome, a declared adjustment set); the route builds no graph of its own beyond a confounder star over the retained columns that only carries the set into the estimator, and makes no identification claim.
  • Guarantee: span_preserving_point_only.
  • Bounds: none declared.

Corrections to 2.1

  • The one-factor z_transport_mechanism_sensitivity refuses a source law whose shared parent marginal does not have unit mass within 1e-10, as ZTransportSensitivityError::IncompleteKernel (its existing reason codes are unchanged). It weighted strata by the law's raw parent mass, so a law accepted under a loose LawTolerance (total mass 0.8, say) returned a baseline and range scaled by that mass. The joint route already enforced unit mass.
  • Discovery block-bootstrap stability checks (BlockBootstrapStability, OrientationStability, RegimeStability) no longer let block-junction gap rows into CI tests under a partial CI mask_type: on data with no missing or masked rows the replicates run under the full yxz mask, which is equivalent there; on data with missing or masked rows a partial mask is refused as NotApplicable. The Python bindings always used yxz and are unchanged.
  • The design ranker's graph-entropy score (ReduceGraphEntropy) is now monotone in the design amount: its observation channel is the reliability-weighted mixture of a perfect and a uniform report, so zero reliability carries no information and small designs no longer outrank larger ones (a one-sample increase now scores about 0 instead of 0.31 nats). Entropy scores and rankings change accordingly; the conformance/design/expected_information_gain oracle is regenerated against dit 2.3.
  • Clustered, multiway and HAC standard errors for propensity and covariate-distance matching remain refused (estimator_inference_mismatch): fixed-match nearest-neighbour matching has no clustered influence function (the Abadie–Imbens martingale representation is proved for random samples only, and neither the bootstrap nor the Otsu–Rai wild bootstrap covers clustered or serially dependent data). The reasoning is now documented and the refusal is pinned for every dependence-robust SE kind in Rust and Python; its message now recommends AIPW rather than propensity weighting, which has no cluster standard error.
  • Refusals can now name a remedy in a structured, optional field: EstimationError::remedy() / CausalError::remedy() in Rust and err.remedy on every Python CausalError (None when absent). The additive-GAM non-convergence and the plug-in Jacobian / directional-derivative "at most two treatments" refusals now say what to change. Messages, exception classes and reason codes are unchanged.
  • Every conformance fixture cited as known truth now records where its truth comes from (oracle.kind), and the evidence-reachability gate fails if a cited fixture has none.
  • The Python workflow guide now documents counterfactual per-unit intervals and support flags, the pointwise DR-Learner CATE route, and batch inference with analyze_many (shared seed, max-t simultaneous intervals, BH/BY-adjusted p-values).
  • Frequentist counterfactual unit effects still publish no per-unit interval (unit_effect_intervals is None); the gcm.counterfactual.uncertainty_unavailable diagnostic, API docs and support matrix now say why (a unit ITE is not identified, depends jointly on every fitted path mechanism and on disturbances recovered with the same parameters, and mechanism families are chosen on the same data). Use inference=Bayesian for calibrated per-unit unit_posterior_quantile intervals, or DrLearner::fit_pointwise_profiles for an uncalibrated pointwise interval on tau(x).
  • Riesz sensitivity now centres its worst-case interval on the published estimate it reports under, not on the diagnostic fit's clipped IPW estimate; the tipping δ and the bound endpoint now describe the published effect.
  • Silverman's normal-reference bandwidth is one shared rule in antecedent-stats, (4/((d+2)n))^(1/(d+4)) per standardized coordinate. The univariate default used by response kernels and do-samplers drops the rounded constant 1.06 for the exact (4/3)^(1/5), so default bandwidths are 0.074% narrower; nonparametric sensitivity is unchanged.
  • Transport grids distinguish missing evidence from a support failure: SupportStatus gains missing_evidence (Rust SupportStatus::MissingEvidence, additive on the wire), the weakest support label. A grid point with no supplied law, provider or declared domain reports it; an empty stratum or zero denominator stays outside_empirical_support. Grid points carry support_status, and the grid support slot counts the two separately. Earlier grid artifacts still load. Rust code matching SupportStatus exhaustively needs a new arm; grids with unavailable points get a new execution identity.
  • Transport bindings report one identification-status vocabulary, identification_status ∈ {identified, proven_non_transportable, missing_evidence, not_certified, budget_cancel}: identification_status() on every Rust transport decision type, and the identification_status property or key on Python stages, decisions, scenario rows, study-plan arrivals and ant.identify certificates. Earlier spellings (exhausted, stopped, unevaluated, structurally_unidentified, combined_identified, named_route) remain in outcome/status and are deprecated; antecedent.transport.advanced.identification_status() and TransportOutcomeKind::from_identification_status read them. Reason codes are unchanged.
  • Sequential priors hydrated from a posterior artifact now carry the full coefficient covariance (dense V0, PriorSpec::CoefficientCorrelation), so sequential updating no longer understates uncertainty against pooling; conjugate known-σ² updating reproduces the pooled posterior. Summary-only artifacts and effect-functional or named-parameter mappings stay diagonal.
  • Known-σ² Gaussian posteriors record their σ² as a constant residual_variance quantity, and prior hydration converts with it instead of the target's residual-variance estimate; artifacts written earlier keep the disclosed plug-in.
  • Frequentist ConditionalEffect still fits one modifier, because its calibrated interval covers only that coordinate. Asked for several, its refusal keeps the same message and reason code and now carries a remedy naming the routes that take a modifier set: the Bayesian conditional estimator (EstimatorId::BayesianConditional) and antecedent.handoff.econml(result, modifiers=[...]). In Python, passing a sequence as ConditionalEffect(modifier=...) now raises CausalUnsupportedError with that remedy instead of a later type error.
  • Batch estimation (analyze_many, BatchStudy::estimate_many, PreparedBatch.prepare / estimate) fits each identical cross-fitted AIPW propensity or outcome model once for the whole batch, reusing a fit only when rows, treatment coding, adjustment design, fold plan and learner options are bit-identical, so every result matches its per-query fit exactly; batch.shared_design reports shares_propensity / shares_outcome_residualization per result.
  • Queries outside the batch routes (anything except AverageEffect, and static discrete joint InterventionResponse cells in prepare_cells) are refused with route_not_supported and a remedy naming analyze. In Python this is CausalUnsupportedError, where it used to be TypeError; Rust BatchStudy::prepare_cells now refuses single-variable, non-Set and temporal response queries it previously accepted.
  • Frequentist ResponseJacobian and DirectionalDerivative results remain point-only and now say why: the warning response.derivative_interval_withheld states that a coefficient-sandwich confidence band is available internally but its public route remains closed for 2.2 despite measured coverage records. Bayesian inference publishes a pointwise credible band for the same plug-in gradient. Elasticity already publishes a calibrated frequentist Fieller interval and reports none only when the Fieller set is unbounded (response.derivative_interval_unbounded).

Additions to the 2.2 cells

  • estimate_with_rank_drop (Rust; antecedent.preflight.estimate_with_rank_drop in Python) executes a declared rank-drop plan for a binary-contrast design: it re-runs linear adjustment or cross-fitted AIPW on the span-preserving reduced adjustment set and returns the point estimate with the recorded drop, original and reduced sets, design identity and a numerical span check. It refuses (nothing estimated) when the plan refuses, the retained columns do not span the original design, the estimator is any other, the design is a joint cell, or the cross-fitted propensity separates on the reduced design. Point only (promotion record 2.2E.E1.preflight_rank_drop_estimation); no interval.
  • estimate_cost() reports seconds from parity/cost_model.toml when that file exists and declares its machine, labelled with the named benchmark (scripts/bench_cost_model.py) and machine; otherwise seconds stays absent. The model is a monotone a + b * rows * columns^2 per counted nuisance fit per estimator.
  • The calibration harness gains a one-sided coverage role (one_sided: at least nominal, no ceiling, stating its side and target); the X3 joint-sensitivity endpoint bootstrap's coverage records were measured, while its public interval route is closed for 2.2 (cell_not_licensed).
  • Budget or cancellation stops of counterfactual identification, observation recovery and two-step temporal transport now print their search receipt (stop, operations charged, explored and unevaluated regions) in the error text, in Rust and Python; reason codes are unchanged.
  • ADMG conditional transport now proves non-transportability when it can: if sID cannot certify the reduced joint, a bounded search looks for two latent models that agree on every source experiment and the target observational law but differ on P*(y | do(x), w); a pair verified by exact enumeration makes the query proven_non_transportable (admg_transport.proven_non_transportable), with the witness in the decision and in the new obstruction artifact (checked_admg_conditional_obstruction_v1; Python export_obstruction and consume_admg_conditional_obstruction_artifact). Every three-node s-hedge case is proven; otherwise the result stays not_certified.
  • Finite transport scenario sets can ask the conditional question P*(y | do(x), w) over latent-confounded selection ADMGs (up to 6 variables): every scenario is decided by the bounded ADMG conditional route on the set's one shared budget and reported in the same structural envelope; a scenario the route cannot certify stays not_certified, and is structurally_unidentified only with a verified two-model witness. Conditional sets export scenario artifact format 2; classical sets still export format 1 unchanged. Rust StudyBuilder::conditional_transport_scenarios; Python prepare_transport_scenarios(..., conditioned_on=[...]).
  • The ADMG conditional, counterfactual-ID and cross-world artifact readers report another format version as a typed version error; reason codes are unchanged.
  • prepare_effect_on_treated accepts a cancel token.
  • Cost and cancellation checks for the 2.2 E-cells. estimate_cost() now covers the new fit routes from the declared configuration (fit_route names the counted route, cluster_labels the clusters a cluster-DML declaration folds by): penalized AIPW (folds x penalties x (inner folds + 1) propensity fits, an upper bound, with refit-bootstrap replicates as extra passes), ridge and lasso grids, a declared GLM fallback, cluster-DML, the DML score route and the DR-Learner; seconds stay absent for routes the benchmark does not cover. BatchScores.estimate_retarget_cost (zero nuisance fits plus claim, contrast and row counts) and estimate_joint_cell_cost (ridge and learner routes, from FactorizedJointConfig::planned_fits) are new Rust functions. Cancellation is observed at a bounded granularity in every E-cell: per penalty and fold, per whole-cluster fold, per cell, conditional and learner fold, per claim, per 1024 max-t draws, per action, per Newton iteration, and now also on entry to the matched case-control solve, per 4096 rows (and once after the pass) in the descriptive raw contrast, and on entry and per scenario in tier_diagnostics. raw_contrast and compare_raw_adjusted (Rust) and tier_diagnostics (Rust) take an ExecutionContext, and raw_vs_adjusted and raw_reporting_transform (Python) take cancel=; plain cross-fitted AIPW polls once per fold and the DML nuisance fit once per fold; a cancelled call is cancelled_no_claim (descriptive_comparison.cancelled, tier_diagnostics.cancelled, cluster_dml.cancelled, dml.cancelled, and aipw.cancelled for plain AIPW) with no partial result.
  • Learned-continuous and smoothed-dose artifact wires gain check_population_names, so a consumer can bind the source and target populations it expects.
  • Preflight (diagnose() on prepared single and batch plans, and preflight_design) reports counts, missingness, exact duplicate columns and numerical rank with named dependent columns before any fit; a separate fit-requiring diagnostic reports propensity range and per-arm effective sample size, with every fitted quantity explicitly absent when the fit fails. Near-determinism flags are for review and never change the adjustment set. Refusals carry structured fields (refusal_fields: stage, failing treatment, cell or claim, reason, remedy, and the numbers the failing step measured; an unmeasured figure is absent, never zero) at the preflight refusals and at the existing refusal sites of the reported workloads, with their reason codes, messages and exception classes unchanged: a refused GLM fit (non-convergence, separation, boundary saturation, with iterations and the nearest fitted probability), a rank-deficient design (rank and column count), too few clusters (found and minimum, for GLM cluster and multiway standard errors and for cluster-DML), a failed positivity or weighted-overlap gate (per-arm effective sample size and the propensity range, extrema and quantiles it computed), the retarget dependence refusals, failed batch-retarget members (named by claim or contrast) and the builder's estimator-setting conflict. An opt-in rank-drop plan with a declared column priority never drops a treatment, outcome or effect modifier, and estimate_cost() reports counts, plus seconds only when a checked-in benchmark file backs them (see the additions below). New reason codes: design_rank_deficient, rank_drop_not_licensed, arm_not_populated.
  • Aipw(propensity_penalty=PropensityPenalty(...)) fits a ridge- or lasso-logistic propensity with the penalty (and, for the lasso, the selected support) chosen from a declared grid by seeded inner cross-validation on each fold's training rows only, and records the lasso's support per fold. It keeps the score table, row identity, overlap report and retargeting (with its covariance) and publishes the cross-fitted influence-function SE of the out-of-fold scores or, with bootstrap > 0, a bootstrap SE whose every replicate repeats the fold plan, penalty selection and nuisance fitting, with the penalties each replicate selected recorded on the estimate. Both intervals are conditional on a stated remainder condition (docs/guides/penalized-aipw.md); four 95% ridge/lasso analytic and refit-bootstrap coordinates have measured coverage records and are licensed there. Other coordinates report scope_not_assessed. A declared GLM-to-ridge/lasso nuisance_fallback re-runs the whole cross-fitted route with the destination when the plain GLM propensity fit fails and records the failed fit (stage, class, fold, message) and the selected destination; an ML fallback and a lasso outside the cross-fitted untrimmed AllObserved mean ATE stay refused (nuisance_fallback_not_licensed, selection_inference_not_licensed).
  • antecedent.inverse classifies each action of a caller-supplied finite grid against a threshold on the target mean E[Y^do(a)], using a licensed forward response (point_only): feasible, infeasible, unsupported or unevaluated, with cost, constraints and tolerance, and necessary or sufficient only relative to the enumerated grid. Probability and quantile targets and observational scenarios are refused; study-planner options and sensitivity ranges are attached as separate views and never enter the classification.
  • antecedent.matched estimates a conditional odds ratio from matched case-control sets by exact conditional likelihood (point_only; a 1:1 design reduces to the discordant-pair ratio). Absolute risk, risk difference and risk ratio are refused (effect_not_identified), uninformative sets are counted rather than dropped, and no interval is published.
  • Aipw(bootstrap=0, cluster_dml=ClusterDml(cluster_ids=..., min_clusters=...)) cross-fits the AIPW average effect with whole clusters owning folds (point_only): the rows of a cluster never train the nuisances that score them, which Aipw(se="cluster") after an IID cross-fit does not ensure. The score table, the point and the cluster-sandwich standard error of the scores (a sum over cluster sums with the G/(G-1) convention, derived in docs/guides/clustered-dml.md) are published as se_analytic with se_kind cluster and a Student-t reference (G - 1 degrees of freedom, min(G_a, G_b) - 1 two-way) in the published interval, and a retarget (single or batch) reports the covariance of cluster-summed weighted influence columns; a bootstrap or another SE kind refuses cluster_interval_not_licensed, and a fixed-seed known-truth test (cluster_dml_known_truth.rs) checks the receipt standard error against the iid one. Fewer clusters than the declared minimum refuse too_few_clusters. ClusterDml(unit="dyad", second_cluster_ids=...) adds two-way (dyadic) dependence: folds own whole connected components of the endpoint graph so no endpoint crosses folds, and the standard error is the Cameron-Gelbach-Miller two-way variance V_a + V_b - V_ab of cluster-summed scores (se_kind multiway); an entity in both endpoint roles or a giant component refuse dyadic_dependence_not_licensed, and too few components per fold refuse too_few_clusters. DML, DRLearner and CausalForest refuse a cluster option with route_not_supported. CandidateScreen.from_units builds a deterministic screen/estimate split from entity labels or dyad endpoints (connected endpoint components never cross the split) and records the seed and a unit digest in the screen id.
  • antecedent.descriptive sets the raw (unadjusted) contrast beside an adjusted estimate of the same estimand coding (difference of means, active 1 versus control 0, all-observed population) and reports the gap as descriptive, not a causal decomposition (point_only); it has no interval, and attributing the gap to adjustment columns is refused (effect_not_identified). A declared reporting-scale transform (risk difference, log risk ratio, log odds ratio) of a mean-outcome pair carries the first-order delta-method covariance only when the source carries the pair's joint covariance, otherwise the points with a typed reason; an interval on a transformed scale is refused (cell_not_licensed).
  • tier_diagnostics (Rust) reads the overlap report, design and point E-value a tiered average-effect result actually carries and states which are unavailable: CoDetermined reports the estimator's own overlap and the tier cell's point E-value, Unknown reports its two scenarios and typed absences, no within-tier DAG is fabricated, and no E-value interval is reported (new reason code diagnostic_not_available). The prepared lifecycle (prepare().estimate() and refresh) attaches the same tier point E-value as a direct run, so the diagnostics agree across both.
  • Sparse ingest for a ~3,000 binary-column adjustment set is evaluated, not changed: cargo run --release -p antecedent-data --example sparse_ingest_eval compares the dense design build with a CSC pattern, and docs/guides/sparse-ingest-evaluation.md records the procedure; the dense path is retained.
  • antecedent.derived declares a derived treatment (source columns classed as treatment construction, admissible pre-treatment covariate or forbidden descendant, with transformation, legal values, intervention meaning and causal-rule exclusions) and refuses, never repairs, a constituent or descendant in the adjustment set, duplicated or copied constituents, a tracking covariate, illegal values and a rank-deficient design, with the columns named (derived_treatment_invalid, design_rank_deficient). factorized_joint_cells estimates up to three binary components (eight cells) with a chain-rule product of cross-fitted ridge-logistic conditionals under a declared ordering (point_only): per-cell weight ESS and propensity range, normalization of the enumerated cell propensities, estimates under every ordering with a disagreement flag, and an unsupported cell refused alone (joint_cell_unsupported) while the others are kept. The aligned score table backs cell_minus_control and 2x2 interaction point contrasts; no interval or covariance is published (penalized_interval_not_licensed). nuisance="random_forest" or "gradient_boosted_trees" supplies every conditional and per-cell outcome model through antecedent-learn under the same fold plan (out-of-fold predictions only, a failed fit refuses the cells that need it with no ridge fallback, learner identity and seeds on the score-table provenance), still point_only; an interval over it and an undeclared machine-learning name refuse ml_nuisance_not_licensed. The factorization is checked against direct counting on hand-counted 2- and 3-component laws.
  • analyze_many and PreparedBatch.prepare / prepare_cells accept the same typed estimator configurations as analyze (Aipw(...), estimator_config=), with the string form unchanged; one configuration governs the batch, a nuisance fit is shared only between identical fit inputs, a penalized propensity is never shared, and each result's batch.shared_design diagnostic carries the canonical configuration fingerprint. PreparedBatch.retarget reweights the batch's score tables (the last estimate's, else the prepare-time ones) under declared row weights over one row snapshot and reports each point, the joint plug-in score covariance of the claims, named linear contrasts (route A minus route B), the failed members and a tidy export (point_only). The complete-family 95% simultaneous (max-t) band is licensed at its measured coordinate. A partial family (any failed or point-only member) is never offered as a complete-family claim; a penalized-propensity family keeps its score covariance and can be complete. Claims on different complete-case rows are refused as a mixed snapshot (row_weights_bound_to_snapshot), and a plan whose estimate kept no score table fails its members with score_table_unavailable instead of reusing prepare-time rows. See the batch retarget guide.
  • DmlAte (AIPW score), DrLearner and CausalForest keep a row-identified cross-fitted AIPW score table of the average effect they report, so PreparedBatch.retarget reweights it and reports the joint plug-in score covariance (point_only; the partially linear score and trimmed fits keep no table and refuse score_table_unavailable; no score is derived from a CATE prediction). See the DML scores guide.
  • The public dyadic influence-covariance helper now applies the same endpoint-role check as the dyadic fit receipt; a label appearing in both roles refuses dyadic_dependence_not_licensed.
  • The family-level max-t critical value and point +- c * se band of a batch retarget (BatchRetargetReport::simultaneous_interval, PreparedBatch.retarget(..., simultaneous_level=...)) are deterministic in their seed, bounded in draws and cancellation-observed, checked against closed-form oracles and a fixed-seed repeated-sampling known-truth test (batch_retarget_known_truth.rs, a test not a coverage record); the separate calibration record has been measured and the complete-family 95% route is licensed.

Carried forward

X7 (GPU lane) is carried forward to 2.3 or later with no code in 2.2: the 2.1 neural cross-fit baseline (benches/baselines/neural_crossfit.md) is CPU-only and records no accelerator measurement, so the condition for starting the lane (a measured whole-analysis gain) is not met. The CPU provider stays the released provider; no 2.2 result depends on it.

Explicit refusals

A refusal identifies the boundary of the declared cell. Inverse probability and quantile targets, observational-scenario inference, off-grid interpolation, and an unlicensed forward response refuse. A matched case-control sample does not license an absolute-risk effect. A batch with different row snapshots cannot claim joint score covariance. Derived treatments that include their own constituent columns as adjustment variables refuse until the declaration is corrected. New sampling intervals without coordinate-matched coverage remain withheld. See each linked guide for its typed reason and remedy.

Licensed support snapshot

The generated geometric support inventory below is a license inventory, not an interval-coverage promise.

472 licensed of 1475 meaningful cells (2089 n/a typed impossibilities are not a coverage gap). 1003 refused with a reason on file; 0 refused without a reason; 0 active allowed_unlicensed compatibility entries.

Interval calibration of the 472 licensed cells: 428 cite coverage records; 40 across 18 distinct coordinates 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 × validation none
  • AnomalyAttribution × Dag × explicit × Bayesian × validation none
  • AverageDerivative × Dag × explicit / accepted × Frequentist × validation none
  • AverageDerivative × Dag × explicit / accepted × Bayesian × validation none
  • AverageEffect × Dag / Admg / Cpdag / Pag × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • AverageEffect × CoDetermined / Unknown × explicit × Frequentist × validation none
  • AverageEffect × Dag / Admg / Cpdag / Pag × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • ChangeAttribution × Dag × explicit × Frequentist × validation none
  • ChangeAttribution × Dag × explicit × Bayesian × validation none
  • ConditionalEffect × Dag / Cpdag / Pag × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • ConditionalEffect × Dag / Cpdag / Pag × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • Counterfactual × Dag × explicit / accepted × Frequentist × validation none
  • Counterfactual × Dag × explicit / accepted × Bayesian × validation none
  • DirectionalDerivative × Dag × explicit / accepted × Frequentist × validation none
  • DirectionalDerivative × Dag × explicit / accepted × Bayesian × validation none
  • Elasticity × Dag × explicit / accepted × Frequentist × validation none
  • Elasticity × Dag × explicit / accepted × Bayesian × validation none
  • InterventionalDistribution × Dag × explicit / accepted × Frequentist × validation none / cheap / full
  • InterventionalDistribution × Admg × explicit / accepted × Frequentist × validation none
  • InterventionalDistribution × Dag × explicit / accepted × Bayesian × validation none / cheap / full
  • InterventionalDistribution × Admg × explicit / accepted × Bayesian × validation none
  • InterventionResponse × Dag / Admg × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • InterventionResponse × Cpdag × explicit × Frequentist × validation none
  • InterventionResponse × Cpdag × accepted × Frequentist × validation none
  • InterventionResponse × Cpdag × graph_posterior × Frequentist × validation none
  • InterventionResponse × Cpdag × graph_posterior × Frequentist × validation cheap
  • InterventionResponse × Cpdag × graph_posterior × Frequentist × validation full
  • InterventionResponse × Pag × explicit × Frequentist × validation none
  • InterventionResponse × Pag × accepted × Frequentist × validation none
  • InterventionResponse × Pag × graph_posterior × Frequentist × validation none
  • InterventionResponse × Pag × graph_posterior × Frequentist × validation cheap
  • InterventionResponse × Pag × graph_posterior × Frequentist × validation full
  • InterventionResponse × TemporalDag × explicit × Frequentist × validation none
  • InterventionResponse × TemporalDag × accepted × Frequentist × validation none
  • InterventionResponse × TemporalDag × graph_posterior × Frequentist × validation none
  • InterventionResponse × TemporalDag × graph_posterior × Frequentist × validation cheap
  • InterventionResponse × TemporalDag × graph_posterior × Frequentist × validation full
  • InterventionResponse × TemporalCpdag × explicit × Frequentist × validation none
  • InterventionResponse × TemporalCpdag × accepted × Frequentist × validation none
  • InterventionResponse × TemporalCpdag × graph_posterior × Frequentist × validation none
  • InterventionResponse × TemporalCpdag × graph_posterior × Frequentist × validation cheap
  • InterventionResponse × TemporalCpdag × graph_posterior × Frequentist × validation full
  • InterventionResponse × TemporalPag × explicit × Frequentist × validation none
  • InterventionResponse × TemporalPag × accepted × Frequentist × validation none
  • InterventionResponse × TemporalPag × graph_posterior × Frequentist × validation none
  • InterventionResponse × TemporalPag × graph_posterior × Frequentist × validation cheap
  • InterventionResponse × TemporalPag × graph_posterior × Frequentist × validation full
  • InterventionResponse × CoDetermined × explicit × Frequentist × validation none
  • InterventionResponse × Dag × explicit / accepted / graph_posterior × Bayesian × validation none
  • InterventionResponse × Admg × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • InterventionResponse × Cpdag × explicit × Bayesian × validation none
  • InterventionResponse × Cpdag × accepted × Bayesian × validation none
  • InterventionResponse × Cpdag × graph_posterior × Bayesian × validation none
  • InterventionResponse × Cpdag × graph_posterior × Bayesian × validation cheap
  • InterventionResponse × Cpdag × graph_posterior × Bayesian × validation full
  • InterventionResponse × Pag × explicit × Bayesian × validation none
  • InterventionResponse × Pag × accepted × Bayesian × validation none
  • InterventionResponse × Pag × graph_posterior × Bayesian × validation none
  • InterventionResponse × Pag × graph_posterior × Bayesian × validation cheap
  • InterventionResponse × Pag × graph_posterior × Bayesian × validation full
  • InterventionResponse × TemporalDag × explicit × Bayesian × validation none
  • InterventionResponse × TemporalDag × accepted × Bayesian × validation none
  • InterventionResponse × TemporalDag × graph_posterior × Bayesian × validation none
  • InterventionResponse × TemporalDag × graph_posterior × Bayesian × validation cheap
  • InterventionResponse × TemporalDag × graph_posterior × Bayesian × validation full
  • InterventionResponse × TemporalCpdag × explicit × Bayesian × validation none
  • InterventionResponse × TemporalCpdag × accepted × Bayesian × validation none
  • InterventionResponse × TemporalCpdag × graph_posterior × Bayesian × validation none
  • InterventionResponse × TemporalCpdag × graph_posterior × Bayesian × validation cheap
  • InterventionResponse × TemporalCpdag × graph_posterior × Bayesian × validation full
  • InterventionResponse × TemporalPag × explicit × Bayesian × validation none
  • InterventionResponse × TemporalPag × accepted × Bayesian × validation none
  • InterventionResponse × TemporalPag × graph_posterior × Bayesian × validation none
  • InterventionResponse × TemporalPag × graph_posterior × Bayesian × validation cheap
  • InterventionResponse × TemporalPag × graph_posterior × Bayesian × validation full
  • MediationEffect × Dag × explicit / accepted × Frequentist × validation none / cheap / full
  • MediationEffect × Dag × explicit / accepted × Bayesian × validation none / cheap / full
  • NestedCounterfactualEffect × Dag × explicit × Frequentist × validation none
  • PathSpecificEffect × Dag × explicit / accepted × Frequentist × validation none / cheap / full
  • PathSpecificEffect × Dag × explicit / accepted × Bayesian × validation none / cheap / full
  • PointDerivative × Dag × explicit / accepted × Frequentist × validation none
  • PointDerivative × Dag × explicit / accepted × Bayesian × validation none
  • PulseEffect × TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • PulseEffect × TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • ResponseCurve × Dag / Admg / Cpdag / Pag / TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Frequentist × validation none
  • ResponseCurve × Dag / Admg / Cpdag / Pag / TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Bayesian × validation none
  • ResponseJacobian × Dag × explicit / accepted × Frequentist × validation none
  • ResponseJacobian × Dag × explicit / accepted × Bayesian × validation none
  • SemiElasticity × Dag × explicit / accepted × Frequentist × validation none
  • SemiElasticity × Dag × explicit / accepted × Bayesian × validation none
  • SustainedEffect × TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • SustainedEffect × TemporalDag / TemporalCpdag / TemporalPag × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • TemporalMediationEffect × TemporalDag / TemporalCpdag × explicit / accepted / graph_posterior × Frequentist × validation none / cheap / full
  • TemporalMediationEffect × TemporalDag / TemporalCpdag × explicit / accepted / graph_posterior × Bayesian × validation none / cheap / full
  • TransportQuery × Admg × explicit × Frequentist × validation none
  • TransportQuery × Admg × explicit × Bayesian × validation none
  • InterferenceQuery × Dag × explicit × Frequentist × validation none
  • InterferenceQuery × Dag × explicit × Bayesian × validation none

See the support matrix.

What's Changed

Full Changelog: v2.1.1...v2.2.0