private Cluster<SubspaceModel> runFastDOC(Database database,Relation<V> relation,ArrayModifiableDBIDs S,int d,int n,int m,int r){
  long[] D=null;
  DBIDVar dV=DBIDUtil.newVar();
  FiniteProgress iprogress=LOG.isVerbose() ? new FiniteProgress("Iteration progress for current cluster",m * n,LOG) : null;
  Random random=rnd.getSingleThreadedRandom();
  DBIDArrayIter iter=S.iter();
  outer:   for (int i=0; i < n; ++i) {
    iter.seek(random.nextInt(S.size()));
    for (int j=0; j < m; ++j) {
      DBIDs randomSet=DBIDUtil.randomSample(S,r,random);
      long[] nD=BitsUtil.zero(d);
      for (int k=0; k < d; ++k) {
        if (dimensionIsRelevant(k,relation,randomSet)) {
          BitsUtil.setI(nD,k);
        }
      }
      if (D == null || BitsUtil.cardinality(nD) > BitsUtil.cardinality(D)) {
        D=nD;
        dV.set(iter);
        if (BitsUtil.cardinality(D) >= d_zero) {
          if (iprogress != null) {
            iprogress.setProcessed(iprogress.getTotal(),LOG);
          }
          break outer;
        }
      }
      LOG.incrementProcessed(iprogress);
    }
  }
  LOG.ensureCompleted(iprogress);
  if (D == null || BitsUtil.cardinality(D) == 0) {
    return null;
  }
  SubspaceMaximumDistanceFunction df=new SubspaceMaximumDistanceFunction(D);
  DistanceQuery<V> dq=database.getDistanceQuery(relation,df);
  RangeQuery<V> rq=database.getRangeQuery(dq,DatabaseQuery.HINT_SINGLE);
  DBIDs C=DBIDUtil.intersection(S,rq.getRangeForDBID(dV,w));
  return (C.size() > 0) ? makeCluster(relation,C,D) : null;
}

private Cluster < SubspaceModel > runFastDOC ( Database database , Relation < V > relation , ArrayModifiableDBIDs S , int d , int n , int m , int r ) { long [ ] D = null ; DBIDVar dV = DBIDUtil . newVar ( ) ; FiniteProgress iprogress = LOG . isVerbose ( ) ? new FiniteProgress ( "Iteration progress for current cluster" , m * n , LOG ) : null ; Random random = rnd . getSingleThreadedRandom ( ) ; DBIDArrayIter iter = S . iter ( ) ; outer : for ( int i = 0 ; i < n ; ++ i ) { iter . seek ( random . nextInt ( S . size ( ) ) ) ; for ( int j = 0 ; j < m ; ++ j ) { DBIDs randomSet = DBIDUtil . randomSample ( S , r , random ) ; long [ ] nD = BitsUtil . zero ( d ) ; for ( int k = 0 ; k < d ; ++ k ) { if ( dimensionIsRelevant ( k , relation , randomSet ) ) { BitsUtil . setI ( nD , k ) ; } } if ( D == null || BitsUtil . cardinality ( nD ) > BitsUtil . cardinality ( D ) ) { D = nD ; dV . set ( iter ) ; if ( BitsUtil . cardinality ( D ) >= d_zero ) { if ( iprogress != null ) { iprogress . setProcessed ( iprogress . getTotal ( ) , LOG ) ; } break outer ; } } LOG . incrementProcessed ( iprogress ) ; } } LOG . ensureCompleted ( iprogress ) ; if ( D == null || BitsUtil . cardinality ( D ) == 0 ) { return null ; } SubspaceMaximumDistanceFunction df = new SubspaceMaximumDistanceFunction ( D ) ; DistanceQuery < V > dq = database . getDistanceQuery ( relation , df ) ; RangeQuery < V > rq = database . getRangeQuery ( dq , DatabaseQuery . HINT_SINGLE ) ; DBIDs C = DBIDUtil . intersection ( S , rq . getRangeForDBID ( dV , w ) ) ; return ( C . size ( ) > 0 ) ? makeCluster ( relation , C , D ) : null ; }
performs a single run of fastdoc , finding a single cluster .
