class_docstr: Main class for storing the causal model state.
docstr: Identify the causal effect to be estimated, using properties of the causal graph.
  
  :param method_name: Method name for identification algorithm. ("id-algorithm" or "default")
  :param proceed_when_unidentifiable: Binary flag indicating whether identification should proceed in the presence of (potential) unobserved confounders.
  :returns: a probability expression (estimand) for the causal effect if identified, else NULL
docstr_tok: ["Identify","the","causal","effect","to","be","estimated",",","using","properties","of","the","causal","graph",".",":","param","method_name",":","Method","name","for","identification","algorithm",".","(","``","id-algorithm","''","or","``","default","''",")",":","param","proceed_when_unidentifiable",":","Binary","flag","indicating","whether","identification","should","proceed","in","the","presence","of","(","potential",")","unobserved","confounders",".",":","returns",":","a","probability","expression","(","estimand",")","for","the","causal","effect","if","identified",",","else","NULL"]
code: def identify_effect(
      self,
      estimand_type=None,
      method_name="default",
      proceed_when_unidentifiable=None,
      optimize_backdoor=False,
  ):
      """Identify the causal effect to be estimated, using properties of the causal graph.
  
      :param method_name: Method name for identification algorithm. ("id-algorithm" or "default")
      :param proceed_when_unidentifiable: Binary flag indicating whether identification should proceed in the presence of (potential) unobserved confounders.
      :returns: a probability expression (estimand) for the causal effect if identified, else NULL
  
      """
      if proceed_when_unidentifiable is None:
          proceed_when_unidentifiable = (
              self._proceed_when_unidentifiable
          )
      if estimand_type is None:
          estimand_type = self._estimand_type
  
      estimand_type = EstimandType(estimand_type)
  
      if method_name == "id-algorithm":
          identifier = IDIdentifier()
      else:
          identifier = AutoIdentifier(
              estimand_type=estimand_type,
              backdoor_adjustment=BackdoorAdjustment(method_name),
              optimize_backdoor=optimize_backdoor,
          )
  
      identified_estimand = identifier.identify_effect(
          graph=self._graph._graph,
          action_nodes=self._treatment,
          outcome_nodes=self._outcome,
          observed_nodes=list(
              self._graph.get_all_nodes(include_unobserved=False)
          ),
      )
  
      self.identifier = identifier
  
      return identified_estimand
  
imports: import logging
  import typing
  import warnings
  from itertools import combinations
  from sympy import init_printing
  import dowhy.causal_estimators
  import dowhy.causal_refuters
  import dowhy.graph_learners
  from dowhy.causal_estimator import CausalEstimate, estimate_effect
  from dowhy.causal_graph import CausalGraph
  from dowhy.causal_identifier import AutoIdentifier, BackdoorAdjustment, IDIdentifier
  from dowhy.causal_identifier.identify_effect import EstimandType
  from dowhy.causal_refuters.graph_refuter import GraphRefuter
  from dowhy.utils.api import parse_state
label_desc: Use image node_id 8 for calling the CausalModel obj's underlying member method code with example usage: obj.identify_effect(estimand_type, method_name, proceed_when_unidentifiable, optimize_backdoor) and returns: identified_estimand