class_docstr: Jointly trains 2 surrogate decision trees.
  Refines diff (or sim) regions by sample generation.
code: def _get_diffrules(self, root1: dict, root2: dict):
      leaves1 = get_leaves(root1)
      leaves2 = get_leaves(root2)
  
      # print(f"nl1 = {len(leaves1)}, nl2 = {len(leaves2)}")
  
      diffrules = []
  
      for leaf1 in leaves1:
          for leaf2 in leaves2:
              if leaf1["val"] != leaf2["val"]:
                  rule1 = leaf_to_rule(leaf1)
                  rule2 = leaf_to_rule(leaf2)
                  intsec = rule1.intersection(rule2)
                  # print(rule1, rule2, rule1.as_dict())
                  # print('intsec', intsec)
  
                  if len(intsec.predicates) > 0:
                      diffrules.append(intsec)
  
      return diffrules
  
imports: import numpy
  import pandas
  from aix360.algorithms.imd.rule import Rule
label_desc: Use image node_id 16 for calling the JointSurrogateTree obj's underlying member method code with example usage: obj._get_diffrules(root1, root2) and returns: diffrules