class_docstr: Jointly trains 2 surrogate decision trees.
  Refines diff (or sim) regions by sample generation.
code: def find_best_split_of_all(self, x: np.ndarray, y: np.ndarray):
      if isinstance(x, pd.DataFrame):
          x = x.to_numpy()
      if isinstance(y, pd.Series):
          y = y.to_numpy()
      col = None
      min_entropy = 10
      cutoff = None
  
      for idx, c in enumerate(x.T):
          values = np.unique(c)
          split_points = (values[:-1] + values[1:]) / 2
          # print(idx, values[0:5], split_points[0:5])
          for value in split_points:
              y_predict = c < value
              # print(f"y_predict len = {y_predict.shape}, y shape={y.shape}")
              cur_entropy = self.get_entropy_split(y_predict, y)
  
              if cur_entropy == 0:
                  return idx, value, cur_entropy
  
              elif cur_entropy <= min_entropy:
                  min_entropy = cur_entropy
                  col = idx
                  cutoff = value
  
      return col, cutoff, min_entropy
  
imports: import numpy
  import pandas
  from aix360.algorithms.imd.rule import Rule
label_desc: Use image node_id 7 for calling the JointSurrogateTree obj's underlying member method code with example usage: obj.find_best_split_of_all(x, y) and returns: col,  cutoff,  min_entropy, idx,  value,  cur_entropy