code: def test_estimate_frontdoor(self):
      model = BayesianNetwork(
          [("X", "Z"), ("Z", "Y"), ("U", "X"), ("U", "Y")],
          latents=["U"],
      )
      U = np.random.randn(10000)
      X = 0.3 * U + np.random.randn(10000)
      Z = 0.8 * X + 0.3 * np.random.randn(10000)
      Y = 0.5 * U + 0.9 * Z + 0.4 * np.random.randn(10000)
      data = pd.DataFrame({"X": X, "Y": Y, "Z": Z})
  
      infer = CausalInference(model=model)
      ate = infer.estimate_ate(
          "X", "Y", data=data, estimator_type="linear"
      )
      self.assertAlmostEqual(ate, 0.8 * 0.9, places=1)
  
imports: import unittest
  import numpy
  import numpy.testing
  import pandas
  from pgmpy.factors.discrete import TabularCPD
  from pgmpy.inference.CausalInference import CausalInference
  from pgmpy.models import BayesianNetwork
label_desc: Use image node_id 2 for calling the TestEstimator obj's underlying member method code with example usage: obj.test_estimate_frontdoor() without return types