docs: public SplitSorting minimumOverlapSplit() {
      if(node.getEntry(0) instanceof LeafEntry) {
        throw new IllegalArgumentException("The minimum overlap split will only be performed on directory nodes");
      }
      if(node.getNumEntries() < 2) {
        throw new IllegalArgumentException("Splitting less than two entries is pointless.");
      }
      int maxEntries = tree.getDirCapacity() - 1;
      int minFanout = tree.get_min_fanout();
      if(node.getNumEntries() < maxEntries) {
        throw new IllegalArgumentException("This entry list has not yet reached the maximum limit: " + node.getNumEntries() + "<=" + maxEntries);
      }
      assert !(node.getEntry(0) instanceof LeafEntry);
  
      if(minFanout >= tree.getDirMinimum()) {
        // minFanout not set for allowing underflowing nodes
        return null;
      }
      IntIterator dimensionListing;
      if(node.getEntry(0) instanceof XTreeDirectoryEntry) {
        // filter common split dimensions
        dimensionListing = getCommonSplitDimensions(node);
        if(!dimensionListing.hasNext()) { // no common dimensions
          return null;
        }
      }
      else {
        // test all dimensions
        dimensionListing = new IntegerRangeIterator(0, node.getEntry(0).getDimensionality());
      }
      int formerSplitAxis = this.splitAxis;
      maxEntries = maxEntries + 1 - minFanout; // = maximum left-hand size
      chooseSplitAxis(dimensionListing, minFanout, maxEntries);
      // find the best split point
      if(formerSplitAxis == this.splitAxis && tree.getDirMinimum() > minFanout) {
        // remember: this follows an unsuccessful topological split
        // avoid duplicate computations of {minEntries, ..., maxEntries}
        double minOverlap = pastOverlap;
        // test {minFanout, ..., minEntries - 1}
        SplitSorting ret1 = chooseMinimumOverlapSplit(this.splitAxis, minFanout, tree.getDirMinimum() - 1, false);
        if(ret1 != null && pastOverlap < minOverlap) {
          minOverlap = pastOverlap; // this is a valid choice
        }
        // test {maxEntries - minEntries + 2, ..., maxEntries - minFanout + 1}
        SplitSorting ret2 = chooseMinimumOverlapSplit(this.splitAxis, minFanout, tree.getDirMinimum() - 1, true);
        if(ret2 == null) {
          // accept first range regardless of whether or not there is one
          pastOverlap = minOverlap;
          return ret1;
        }
        if(pastOverlap < minOverlap) { // the second range is better
          return ret2;
        }
        pastOverlap = minOverlap; // the first range is better
        return ret1;
      }
      else {
        return chooseMinimumOverlapSplit(this.splitAxis, minFanout, maxEntries, false);
      }
    }