Skip to content

Commit e57decb

Browse files
committed
Fix ID to offset mapping in OutRankS1HDBSCAN
1 parent 8ae9029 commit e57decb

File tree

1 file changed

+11
-18
lines changed

1 file changed

+11
-18
lines changed

elki/src/main/java/elki/outlier/subspace/OutRankS1HDBSCAN.java

+11-18
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
*/
2121
package elki.outlier.subspace;
2222

23-
import java.util.Arrays;
2423
import java.util.Random;
2524

2625
import elki.clustering.hierarchical.extraction.HDBSCANHierarchyExtraction;
@@ -37,10 +36,7 @@
3736
import elki.database.datastore.DataStoreFactory;
3837
import elki.database.datastore.DataStoreUtil;
3938
import elki.database.datastore.WritableDoubleDataStore;
40-
import elki.database.ids.DBIDFactory;
41-
import elki.database.ids.DBIDIter;
42-
import elki.database.ids.DBIDRange;
43-
import elki.database.ids.DBIDUtil;
39+
import elki.database.ids.*;
4440
import elki.database.relation.*;
4541
import elki.datasource.ArrayAdapterDatabaseConnection;
4642
import elki.datasource.DatabaseConnection;
@@ -117,16 +113,14 @@ public OutRankS1HDBSCAN(HDBSCANHierarchyExtraction hdbscanExtraction, double alp
117113
/**
118114
* Run the clustering algorithm.
119115
*
120-
* @param db Database
121116
* @param relation Relation
122117
* @return Outlier result
123118
*/
124-
public OutlierResult run(Database db, Relation<? extends NumberVector> relation) {
125-
final int n = relation.size();
119+
public OutlierResult run(Relation<? extends NumberVector> relation) {
126120
final int dim = RelationUtil.dimensionality(relation);
121+
final DBIDRange ids = DBIDUtil.assertRange(relation.getDBIDs());
127122
SimpleTypeInformation<NumberVector> type;
128-
double[] score = new double[n];
129-
Arrays.fill(score, 0.);
123+
double[] score = new double[ids.size()];
130124
for(int subspace = 0; subspace < subspaces; subspace++) {
131125
// Features selection for subspace
132126
final Random random = rnd.getSingleThreadedRandom();
@@ -135,11 +129,10 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
135129
NumericalFeatureSelection<NumberVector> projection = new NumericalFeatureSelection<>(subspacedims);
136130
projection.initialize(relation.getDataTypeInformation());
137131

138-
// Build virtual relation
132+
// Build the projected data set
139133
type = VectorFieldTypeInformation.typeRequest(NumberVector.class, projdims, projdims);
140-
DBIDRange vids = DBIDFactory.FACTORY.generateStaticDBIDRange(1, relation.size());
141-
MaterializedRelation<NumberVector> vrelation = new MaterializedRelation<>(type, vids);
142-
for(DBIDIter it = relation.iterDBIDs(); it.valid(); it.advance()) {
134+
MaterializedRelation<NumberVector> vrelation = new MaterializedRelation<>(type, ids);
135+
for(DBIDIter it = ids.iter(); it.valid(); it.advance()) {
143136
vrelation.insert(it, projection.project(relation.get(it)));
144137
}
145138

@@ -166,7 +159,7 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
166159
double reldim = projdims / (double) maxdim;
167160
// Process objects in the cluster
168161
for(DBIDIter iter = cluster.getIDs().iter(); iter.valid(); iter.advance()) {
169-
final int offset = DBIDUtil.asInteger(iter) - 1 - (n * (subspace + 1));
162+
final int offset = ids.index(iter) - (ids.size() * (subspace + 1));
170163
double oldscore = score[offset];
171164
double newscore = oldscore + (alpha * relsize + (1 - alpha) * reldim);
172165
score[offset] = newscore;
@@ -176,9 +169,9 @@ public OutlierResult run(Database db, Relation<? extends NumberVector> relation)
176169

177170
DoubleMinMax minmax = new DoubleMinMax();
178171
type = VectorFieldTypeInformation.typeRequest(NumberVector.class, dim, dim);
179-
WritableDoubleDataStore meanscore = DataStoreUtil.makeDoubleStorage(db.getRelation(type).getDBIDs(), DataStoreFactory.HINT_HOT);
180-
for(DBIDIter iter = relation.iterDBIDs(); iter.valid(); iter.advance()) {
181-
double newscore = score[DBIDUtil.asInteger(iter) - 1] / (double) subspaces;
172+
WritableDoubleDataStore meanscore = DataStoreUtil.makeDoubleStorage(ids, DataStoreFactory.HINT_DB);
173+
for(DBIDArrayIter iter = ids.iter(); iter.valid(); iter.advance()) {
174+
double newscore = score[iter.getOffset()] / (double) subspaces;
182175
meanscore.put(iter, newscore);
183176
minmax.put(newscore);
184177
}

0 commit comments

Comments
 (0)