docs: public boolean matches(SameDiff sameDiff, DifferentialFunction rootFn){
  
          if(!root.matches(sameDiff, rootFn)){
              return false;
          }
  
          SDVariable[] inputs = rootFn.args();
          int inCount = inputs == null ? 0 : inputs.length;
          if(inputCount != null){
              if(inCount != this.inputCount)
                  return false;
          }
  
          SDVariable[] outputs = rootFn.outputVariables();
          int outCount = outputs == null ? 0 : outputs.length;
          if(outputCount != null){
              if(outCount != outputCount)
                  return false;
          }
  
          for(Map<Integer,OpPredicate> m : Arrays.asList(opInputMatchPredicates, opInputSubgraphPredicates)) {
              for (Map.Entry<Integer, OpPredicate> e : m.entrySet()) {
                  int inNum = e.getKey();
                  if (inNum >= inCount) {
                      return false;
                  }
  
                  SDVariable in = inputs[inNum];
                  DifferentialFunction df = sameDiff.getVariableOutputFunction(in.getVarName());
                  if (df == null || !e.getValue().matches(sameDiff, df)) {
                      return false;
                  }
              }
          }
  
          return true;
      }