docs: private void scan(HilbertFeatures hf, int k0) {
      final int mink0 = Math.min(2 * k0, capital_n - 1);
      if(LOG.isDebuggingFine()) {
        LOG.debugFine("Scanning with k0=" + k0 + " (" + mink0 + ")" + " N*=" + capital_n_star);
      }
      for(int i = 0; i < hf.pf.length; i++) {
        if(hf.pf[i].ubound < omega_star) {
          continue;
        }
        if(hf.pf[i].lbound < hf.pf[i].ubound) {
          double omega = hf.fastUpperBound(i);
          if(omega < omega_star) {
            hf.pf[i].ubound = omega;
          }
          else {
            int maxcount;
            // capital_n-1 instead of capital_n: all, except self
            if(hf.top.contains(hf.pf[i])) {
              maxcount = capital_n - 1;
            }
            else {
              maxcount = mink0;
            }
            innerScan(hf, i, maxcount);
          }
        }
        if(hf.pf[i].ubound > 0) {
          hf.updateOUT(i);
        }
        if(hf.pf[i].lbound > 0) {
          hf.updateWLB(i);
        }
        if(hf.wlb.size() >= n) {
          omega_star = Math.max(omega_star, hf.wlb.peek().lbound);
        }
      }
    }