docs: public ClusterOrder run(Database db, Relation<V> rel) {
      DBIDs ids = rel.getDBIDs();
      DistanceQuery<V> dq = db.getDistanceQuery(rel, EuclideanDistanceFunction.STATIC);
  
      // initialize points used and reachability distance
      reachDist = DataStoreUtil.makeDoubleStorage(ids, DataStoreFactory.HINT_HOT | DataStoreFactory.HINT_TEMP, UNDEFINED_DISTANCE);
  
      // compute projections, density estimates and neighborhoods
      index.computeSetsBounds(rel, minPts, ids); // project points
      inverseDensities = index.computeAverageDistInSet(); // compute densities
      neighs = index.getNeighs(); // get neighbors of points
  
      // compute ordering as for OPTICS
      FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("FastOPTICS clustering", ids.size(), LOG) : null;
      processed = DBIDUtil.newHashSet(ids.size());
      order = new ClusterOrder(ids, "FastOPTICS Cluster Order", "fast-optics");
      for(DBIDIter it = ids.iter(); it.valid(); it.advance()) {
        if(!processed.contains(it)) {
          expandClusterOrder(DBIDUtil.deref(it), order, dq, prog);
        }
      }
      index.logStatistics();
      LOG.ensureCompleted(prog);
      return order;
    }