docs: def predict(self, X, k=None, depth=None):
          """Predict response for X.
  
          The response to an input sample is computed as the sum of
          (1) the mean prediction of the trees in the forest (fixed effect) and
          (2) the estimated random effect.
  
          Parameters
          ----------
          X : array-like of shape = [n_samples, n_features]
              The input samples.
          k: array-like of shape = [n_samples, n_samples_fitting]
              The cross-dependency structure between the samples used for learning
              the forest and the input samples.
              If not specified only the estimated fixed effect is returned.
  
          Returns
          -------
          y : array of shape = [n_samples, 1]
              The response
          """
          if depth is None:
              if self.opt_depth is not None:
                  depth = self.opt_depth
                  if self.verbose > 0:
                      'using optimal depth to predict'
              else:
                  depth = float('inf')
          response = self._predict(X=X, depth=depth)
          if k is not None:
                  mean = self.predict(X=self.X, depth=depth).reshape(-1, 1)
                  response += self.BLUP.predict(XTest=X, k=k,
                                                mean=mean).reshape(-1)
          return response