Source code for y0.algorithm.identify.id_c

# -*- coding: utf-8 -*-

"""Implementation of the IDC algorithm."""

from .id_std import identify
from .utils import Identification
from ..conditional_independencies import are_d_separated
from ...dsl import Expression, Variable

__all__ = [
    "idc",
    "rule_2_of_do_calculus_applies",
]


[docs] def idc(identification: Identification) -> Expression: """Run the IDC algorithm from [shpitser2008]_. :param identification: The identification tuple :returns: An expression created by the :func:`identify` algorithm after simplifying the original query Raises "Unidentifiable" if no appropriate identification can be found. """ for condition in identification.conditions: if rule_2_of_do_calculus_applies(identification=identification, condition=condition): return idc(identification.exchange_observation_with_action(condition)) # Run ID algorithm id_estimand = identify(identification.uncondition()) return id_estimand.normalize_marginalize(identification.outcomes)
def rule_2_of_do_calculus_applies(identification: Identification, condition: Variable) -> bool: r"""Check if Rule 2 of the Do-Calculus applies to the conditioned variable. :param identification: The identification tuple :param condition: The condition to check :returns: If rule 2 applies, see below. If Rule 2 of the do calculus applies to the conditioned variable, then it can be converted to a do variable. .. math:: \newcommand\ci{\perp\!\!\!\perp} \newcommand{\ubar}[1]{\underset{\bar{}}{#1}} \newcommand{\obar}[1]{\overset{\bar{}}{#1}} \text{if } (\exists Z \in \mathbf{Z})(\mathbf{Y} \ci Z | \mathbf{X}, \mathbf{Z} - \{Z\})_{G_{\bar{\mathbf{X}}\ubar{Z}}} \\ \text{then } P(\mathbf{Y}|do(\mathbf{X}),\mathbf{Z}) = P(\mathbf Y|do(\mathbf X), do(Z), \mathbf{Z} - \{Z\}) """ graph = identification.graph treatments = identification.treatments conditions = treatments | (identification.conditions - {condition}) graph_mod = graph.remove_in_edges(treatments).remove_out_edges(condition) return all( are_d_separated(graph_mod, outcome, condition, conditions=conditions) for outcome in identification.outcomes )