code: def test_fit_predict(
      self,
      generate_regression_data,
      return_ci,
      bootstrap_size,
      n_bootstraps,
  ):
      y, X, treatment, tau, b, e = generate_regression_data(mode=1)
      ctree = self.prepare_model()
      output = ctree.fit_predict(
          X=X,
          treatment=treatment,
          y=y,
          return_ci=return_ci,
          n_bootstraps=n_bootstraps,
          bootstrap_size=bootstrap_size,
          n_jobs=mp.cpu_count() - 1,
          verbose=False,
      )
      if return_ci:
          te, te_lower, te_upper = output
          assert len(output) == 3
          assert (te_lower <= te).all() and (te_upper >= te).all()
      else:
          te = output
          assert te.shape[0] == y.shape[0]
  
imports: import multiprocessing
  from abc import abstractmethod
  import pandas
  import pytest
  from sklearn.model_selection import train_test_split
  from causalml.inference.tree import CausalTreeRegressor, CausalRandomForestRegressor
  from causalml.metrics import ape
  from causalml.metrics import qini_score
  from .const import RANDOM_SEED, ERROR_THRESHOLD
label_desc: Use image node_id 3 for calling the TestCausalTreeRegressor obj's underlying member method code with example usage: obj.test_fit_predict(generate_regression_data, return_ci, bootstrap_size, n_bootstraps) without return types