docs: public OutlierResult run(Database database, Relation<O> relation) {
      final DistanceQuery<O> distanceQuery = database.getDistanceQuery(relation, getDistanceFunction());
      KNNQuery<O> knnQuery = database.getKNNQuery(distanceQuery, k + 1); // +
                                                                         // query
                                                                         // point
  
      FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("Compute Local Isolation Coefficients", relation.size(), LOG) : null;
  
      DoubleMinMax minmax = new DoubleMinMax();
      WritableDoubleDataStore lic_score = DataStoreUtil.makeDoubleStorage(relation.getDBIDs(), DataStoreFactory.HINT_STATIC);
      for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
        final KNNList knn = knnQuery.getKNNForDBID(iditer, k + 1); // + query
                                                                   // point
        double skn = 0; // sum of the distances to the k nearest neighbors
        int i = 0; // number of neighbors so far
        for(DoubleDBIDListIter neighbor = knn.iter(); i < k && neighbor.valid(); neighbor.advance()) {
          if(DBIDUtil.equal(iditer, neighbor)) {
            continue;
          }
          skn += neighbor.doubleValue();
          ++i;
        }
        double lic = knn.getKNNDistance() + (i > 0 ? skn / i : 0);
        lic_score.putDouble(iditer, lic);
        minmax.put(skn);
  
        LOG.incrementProcessed(prog);
      }
      LOG.ensureCompleted(prog);
  
      DoubleRelation res = new MaterializedDoubleRelation("Local Isolation Coefficient", "lic-outlier", lic_score, relation.getDBIDs());
      OutlierScoreMeta meta = new BasicOutlierScoreMeta(minmax.getMin(), minmax.getMax(), 0., Double.POSITIVE_INFINITY, 0.);
      return new OutlierResult(meta, res);
    }