code: void printDotEdges(PrintStream os, int maxLevelsToPrintPerEdge, float totalWeight, boolean detail,
                       PrintMojo.PrintTreeOptions treeOptions) {
      assert (leftChild == null) == (rightChild == null);
  
      if (leftChild != null) {
        os.print("\"" + getDotName() + "\"" + " -> " + "\"" + leftChild.getDotName() + "\"" + " [");
  
        ArrayList<String> arr = new ArrayList<>();
        if (leftChild.getInclusiveNa()) {
          arr.add("[NA]");
        }
  
        if (naVsRest) {
          arr.add("[Not NA]");
        }
        else {
          if (! isBitset()) {
            arr.add("<");
          }
        }
  
        printDotEdgesCommon(os, maxLevelsToPrintPerEdge, arr, leftChild, totalWeight, detail, treeOptions);
      }
  
      if (rightChild != null) {
        os.print("\"" + getDotName() + "\"" + " -> " + "\"" + rightChild.getDotName() + "\"" + " [");
  
        ArrayList<String> arr = new ArrayList<>();
        if (rightChild.getInclusiveNa()) {
          arr.add("[NA]");
        }
  
        if (! naVsRest) {
          if (! isBitset()) {
            arr.add(">=");
          }
        }
  
        printDotEdgesCommon(os, maxLevelsToPrintPerEdge, arr, rightChild, totalWeight, detail, treeOptions);
      }
    }
docs: Recursively print all edges in the tree.
  @param os output stream
  @param maxLevelsToPrintPerEdge Limit the number of individual categorical level names printed per edge
  @param totalWeight total weight of all observations (used to determine edge thickness)
  @param detail include additional edge detail information