code: def construct_iv_estimand(
      treatment_name: List[str],
      outcome_name: List[str],
      instrument_names: List[str],
  ):
      # TODO: support multivariate treatments better.
      expr = None
      outcome_name = outcome_name[0]
      sym_outcome = spstats.Normal(outcome_name, 0, 1)
      sym_treatment_symbols = [
          spstats.Normal(t, 0, 1) for t in treatment_name
      ]
      sym_treatment = sp.Array(sym_treatment_symbols)
      sym_instrument_symbols = [
          sp.Symbol(inst) for inst in instrument_names
      ]
      sym_instrument = sp.Array(
          sym_instrument_symbols
      )  # ",".join(instrument_names))
      sym_outcome_derivative = sp.Derivative(
          sym_outcome, sym_instrument
      )
      sym_treatment_derivative = sp.Derivative(
          sym_treatment, sym_instrument
      )
      sym_effect = spstats.Expectation(
          sym_outcome_derivative / sym_treatment_derivative
      )
      sym_assumptions = {
          "As-if-random": (
              "If U\N{RIGHTWARDS ARROW}\N{RIGHTWARDS ARROW}{0} then "
              "\N{NOT SIGN}(U \N{RIGHTWARDS ARROW}\N{RIGHTWARDS ARROW}{{{1}}})"
          ).format(outcome_name, ",".join(instrument_names)),
          "Exclusion": (
              "If we remove {{{0}}}\N{RIGHTWARDS ARROW}{{{1}}}, then "
              "\N{NOT SIGN}({{{0}}}\N{RIGHTWARDS ARROW}{2})"
          ).format(
              ",".join(instrument_names),
              ",".join(treatment_name),
              outcome_name,
          ),
      }
  
      estimand = {
          "estimand": sym_effect,
          "assumptions": sym_assumptions,
      }
      return estimand
  
imports: import itertools
  import logging
  from enum import Enum
  from typing import Dict, List, Optional, Union
  import networkx
  import sympy
  import sympy.stats
  from dowhy.causal_identifier.efficient_backdoor import EfficientBackdoor
  from dowhy.causal_identifier.identified_estimand import IdentifiedEstimand
  from dowhy.graph import check_dseparation, check_valid_backdoor_set, check_valid_frontdoor_set, check_valid_mediation_set, do_surgery, get_all_directed_paths, get_backdoor_paths, get_descendants, get_instruments, has_directed_path
  from dowhy.utils.api import parse_state
label_desc: Use image node_id 16 for calling a global function with example usage: construct_iv_estimand(treatment_name, outcome_name, instrument_names) and returns: estimand