docs: protected <T extends SpatialComparable> void strPartition(List<T> objs, int start, int end, int depth, int dims, int maxEntries, SpatialSingleMeanComparator c, List<List<T>> ret) {
      final int p = (int) FastMath.ceil((end - start) / (double) maxEntries);
  
      // Compute min and max:
      double[] mm = new double[dims * 2];
      for (int d = 0; d < mm.length; d += 2) {
        mm[d] = Double.POSITIVE_INFINITY; // min <- +inf
        mm[d + 1] = Double.NEGATIVE_INFINITY; // max <- -inf
      }
      for (int i = start; i < end; i++) {
        T o = objs.get(i);
        for (int d1 = 0, d2 = 0; d2 < mm.length; d1++, d2 += 2) {
          mm[d2] = Math.min(mm[d2], o.getMin(d1));
          mm[d2 + 1] = Math.max(mm[d2 + 1], o.getMax(d1));
        }
      }
      // Find maximum and compute extends
      double maxex = 0.0;
      int sdim = -1;
      for (int d = 0; d < mm.length; d += 2) {
        final double extend = mm[d + 1] - mm[d];
        if (extend > maxex) {
          maxex = extend;
          sdim = d >> 1;
        }
      }
      // Chose the number of partitions:
      final int s = (int) FastMath.ceil(FastMath.pow(p, 1.0 / (dims - depth)));
  
      final double len = end - start; // double intentional!
      for (int i = 0; i < s; i++) {
        // We don't completely sort, but only ensure the quantile is invariant.
        int s2 = start + (int) ((i * len) / s);
        int e2 = start + (int) (((i + 1) * len) / s);
        // LoggingUtil.warning("STR " + dim + " s2:" + s2 + " e2:" + e2);
        if (e2 < end) {
          c.setDimension(sdim);
          QuickSelect.quickSelect(objs, c, s2, end, e2);
        }
        if (depth + 1 == dims) {
          ret.add(objs.subList(s2, e2));
        } else {
          // Descend
          strPartition(objs, s2, e2, depth + 1, dims, maxEntries, c, ret);
        }
      }
    }