class_docstr: Estimate effect of treatment by finding matching treated and control
  units based on propensity score.
  
  Straightforward application of the back-door criterion.
  
  Supports additional parameters as listed below.
code: def construct_symbolic_estimator(self, estimand):
      expr = "b: " + ", ".join(estimand.outcome_variable) + "~"
      # TODO -- fix: we are actually conditioning on positive treatment (d=1)
      var_list = (
          estimand.treatment_variable
          + estimand.get_backdoor_variables()
      )
      expr += "+".join(var_list)
      return expr
  
file_path: dowhy/dowhy/causal_estimators/propensity_score_matching_estimator.py
imports: from typing import Any, List, Optional, Union
  import pandas
  from sklearn.neighbors import NearestNeighbors
  from dowhy.causal_estimator import CausalEstimate, CausalEstimator
  from dowhy.causal_estimators.propensity_score_estimator import PropensityScoreEstimator
  from dowhy.causal_identifier import IdentifiedEstimand
label_desc: Use image node_id 4 for calling the PropensityScoreMatchingEstimator obj's underlying member method code with example usage: obj.construct_symbolic_estimator(estimand) and returns: expr