class_docstr: Jointly trains 2 surrogate decision trees.
  Refines diff (or sim) regions by sample generation.
docstr: takes the common joint surrogate tree representation
  :param root:
  :return:
docstr_tok: ["takes","the","common","joint","surrogate","tree","representation",":","param","root",":",":","return",":"]
code: def get_diffrules_from_jst(self, root: dict):
      """
      takes the common joint surrogate tree representation
      :param root:
      :return:
      """
      diffrules = []
  
      def _recurse(root: dict):
          is_diverging = "tree1" in root
  
          if is_diverging:
              # print('at one juncture...')
              tree1 = root["tree1"]
              tree2 = root["tree2"]
  
              diffrules.extend(self._get_diffrules(tree1, tree2))
              # print(f'tot #diffrules here = {len(diffrules)}')
  
          else:
              is_split_node = "cutoff" in root
              if is_split_node:
                  _recurse(root["left"])
                  _recurse(root["right"])
              else:
                  # leaf node, do nothing
                  pass
  
      _recurse(root)
      return diffrules
  
imports: import numpy
  import pandas
  from aix360.algorithms.imd.rule import Rule
label_desc: Use image node_id 15 for calling the JointSurrogateTree obj's underlying member method code with example usage: obj.get_diffrules_from_jst(root) and returns: diffrules