summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/index/projected
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/projected')
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/projected/LatLngAsECEFIndex.java91
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/projected/LngLatAsECEFIndex.java36
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/projected/PINN.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/projected/ProjectedIndex.java177
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/projected/package-info.java2
5 files changed, 134 insertions, 180 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/projected/LatLngAsECEFIndex.java b/src/de/lmu/ifi/dbs/elki/index/projected/LatLngAsECEFIndex.java
index 8449996b..efa88eb0 100644
--- a/src/de/lmu/ifi/dbs/elki/index/projected/LatLngAsECEFIndex.java
+++ b/src/de/lmu/ifi/dbs/elki/index/projected/LatLngAsECEFIndex.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.projected;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -42,8 +42,6 @@ import de.lmu.ifi.dbs.elki.database.relation.ProjectedView;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.geo.LatLngDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.index.Index;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.index.KNNIndex;
@@ -77,9 +75,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
*
* @author Erich Schubert
*
+ * @apiviz.composedOf LatLngToECEFProjection
+ *
* @param <O> Object type
*/
-public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex<O, O> {
+public class LatLngAsECEFIndex<O extends NumberVector> extends ProjectedIndex<O, O> {
/**
* Constructor.
*
@@ -105,77 +105,77 @@ public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> KNNQuery<O, D> getKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
- if (!(inner instanceof KNNIndex)) {
+ public KNNQuery<O> getKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
+ if(!(inner instanceof KNNIndex)) {
return null;
}
- if (distanceQuery.getRelation() != relation) {
+ if(distanceQuery.getRelation() != relation) {
return null;
}
- if (!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
+ if(!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
return null;
}
- for (Object o : hints) {
- if (o == DatabaseQuery.HINT_EXACT) {
+ for(Object o : hints) {
+ if(o == DatabaseQuery.HINT_EXACT) {
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- KNNQuery<O, DoubleDistance> innerq = ((KNNIndex<O>) inner).getKNNQuery(innerQuery, hints);
- if (innerq == null) {
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ KNNQuery<O> innerq = ((KNNIndex<O>) inner).getKNNQuery(innerQuery, hints);
+ if(innerq == null) {
return null;
}
- return (KNNQuery<O, D>) new ProjectedKNNQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedKNNQuery(distanceQuery, innerq);
}
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> RangeQuery<O, D> getRangeQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
- if (!(inner instanceof RangeIndex)) {
+ public RangeQuery<O> getRangeQuery(DistanceQuery<O> distanceQuery, Object... hints) {
+ if(!(inner instanceof RangeIndex)) {
return null;
}
- if (distanceQuery.getRelation() != relation) {
+ if(distanceQuery.getRelation() != relation) {
return null;
}
- if (!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
+ if(!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
return null;
}
- for (Object o : hints) {
- if (o == DatabaseQuery.HINT_EXACT) {
+ for(Object o : hints) {
+ if(o == DatabaseQuery.HINT_EXACT) {
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- RangeQuery<O, DoubleDistance> innerq = ((RangeIndex<O>) inner).getRangeQuery(innerQuery, hints);
- if (innerq == null) {
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ RangeQuery<O> innerq = ((RangeIndex<O>) inner).getRangeQuery(innerQuery, hints);
+ if(innerq == null) {
return null;
}
- return (RangeQuery<O, D>) new ProjectedRangeQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedRangeQuery(distanceQuery, innerq);
}
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> RKNNQuery<O, D> getRKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
- if (!(inner instanceof RKNNIndex)) {
+ public RKNNQuery<O> getRKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
+ if(!(inner instanceof RKNNIndex)) {
return null;
}
- if (distanceQuery.getRelation() != relation) {
+ if(distanceQuery.getRelation() != relation) {
return null;
}
- if (!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
+ if(!LatLngDistanceFunction.class.isInstance(distanceQuery.getDistanceFunction())) {
return null;
}
- for (Object o : hints) {
- if (o == DatabaseQuery.HINT_EXACT) {
+ for(Object o : hints) {
+ if(o == DatabaseQuery.HINT_EXACT) {
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- RKNNQuery<O, DoubleDistance> innerq = ((RKNNIndex<O>) inner).getRKNNQuery(innerQuery, hints);
- if (innerq == null) {
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ RKNNQuery<O> innerq = ((RKNNIndex<O>) inner).getRKNNQuery(innerQuery, hints);
+ if(innerq == null) {
return null;
}
- return (RKNNQuery<O, D>) new ProjectedRKNNQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedRKNNQuery(distanceQuery, innerq);
}
/**
@@ -187,7 +187,7 @@ public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
*
* @param <O> Data type.
*/
- public static class Factory<O extends NumberVector<?>> extends ProjectedIndex.Factory<O, O> {
+ public static class Factory<O extends NumberVector> extends ProjectedIndex.Factory<O, O> {
/**
* Disable refinement of distances.
*/
@@ -207,23 +207,24 @@ public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
@Override
public ProjectedIndex<O, O> instantiate(Relation<O> relation) {
- if (!proj.getInputDataTypeInformation().isAssignableFromType(relation.getDataTypeInformation())) {
+ if(!proj.getInputDataTypeInformation().isAssignableFromType(relation.getDataTypeInformation())) {
return null;
}
proj.initialize(relation.getDataTypeInformation());
final Relation<O> view;
- if (materialize) {
+ if(materialize) {
DBIDs ids = relation.getDBIDs();
WritableDataStore<O> content = DataStoreUtil.makeStorage(ids, DataStoreFactory.HINT_DB, proj.getOutputDataTypeInformation().getRestrictionClass());
- for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
+ for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
content.put(iter, proj.project(relation.get(iter)));
}
view = new MaterializedRelation<>("ECEF Projection", "ecef-projection", proj.getOutputDataTypeInformation(), content, ids);
- } else {
+ }
+ else {
view = new ProjectedView<>(relation, proj);
}
Index inneri = inner.instantiate(view);
- if (inneri == null) {
+ if(inneri == null) {
return null;
}
return new LatLngAsECEFIndex<>(relation, proj, view, inneri, norefine);
@@ -238,7 +239,7 @@ public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
*
* @param <O> Outer object type.
*/
- public static class Parameterizer<O extends NumberVector<?>> extends AbstractParameterizer {
+ public static class Parameterizer<O extends NumberVector> extends AbstractParameterizer {
/**
* Inner index factory.
*/
@@ -263,22 +264,22 @@ public class LatLngAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
ObjectParameter<EarthModel> modelP = new ObjectParameter<>(EarthModel.MODEL_ID, EarthModel.class, SphericalVincentyEarthModel.class);
- if (config.grab(modelP)) {
+ if(config.grab(modelP)) {
model = modelP.instantiateClass(config);
}
ObjectParameter<IndexFactory<O, ?>> innerP = new ObjectParameter<>(ProjectedIndex.Factory.Parameterizer.INDEX_ID, IndexFactory.class);
- if (config.grab(innerP)) {
+ if(config.grab(innerP)) {
inner = innerP.instantiateClass(config);
}
Flag materializeF = new Flag(ProjectedIndex.Factory.Parameterizer.MATERIALIZE_FLAG);
- if (config.grab(materializeF)) {
+ if(config.grab(materializeF)) {
materialize = materializeF.isTrue();
}
Flag norefineF = new Flag(ProjectedIndex.Factory.Parameterizer.DISABLE_REFINE_FLAG);
- if (config.grab(norefineF)) {
+ if(config.grab(norefineF)) {
norefine = norefineF.isTrue();
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/index/projected/LngLatAsECEFIndex.java b/src/de/lmu/ifi/dbs/elki/index/projected/LngLatAsECEFIndex.java
index 4bf97659..23d6ae96 100644
--- a/src/de/lmu/ifi/dbs/elki/index/projected/LngLatAsECEFIndex.java
+++ b/src/de/lmu/ifi/dbs/elki/index/projected/LngLatAsECEFIndex.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.projected;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -42,8 +42,6 @@ import de.lmu.ifi.dbs.elki.database.relation.ProjectedView;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.geo.LngLatDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.index.Index;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.index.KNNIndex;
@@ -77,9 +75,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
*
* @author Erich Schubert
*
+ * @apiviz.composedOf LngLatToECEFProjection
+ *
* @param <O> Object type
*/
-public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex<O, O> {
+public class LngLatAsECEFIndex<O extends NumberVector> extends ProjectedIndex<O, O> {
/**
* Constructor.
*
@@ -105,7 +105,7 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> KNNQuery<O, D> getKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public KNNQuery<O> getKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if (!(inner instanceof KNNIndex)) {
return null;
}
@@ -120,17 +120,17 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- KNNQuery<O, DoubleDistance> innerq = ((KNNIndex<O>) inner).getKNNQuery(innerQuery, hints);
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ KNNQuery<O> innerq = ((KNNIndex<O>) inner).getKNNQuery(innerQuery, hints);
if (innerq == null) {
return null;
}
- return (KNNQuery<O, D>) new ProjectedKNNQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedKNNQuery(distanceQuery, innerq);
}
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> RangeQuery<O, D> getRangeQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public RangeQuery<O> getRangeQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if (!(inner instanceof RangeIndex)) {
return null;
}
@@ -145,17 +145,17 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- RangeQuery<O, DoubleDistance> innerq = ((RangeIndex<O>) inner).getRangeQuery(innerQuery, hints);
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ RangeQuery<O> innerq = ((RangeIndex<O>) inner).getRangeQuery(innerQuery, hints);
if (innerq == null) {
return null;
}
- return (RangeQuery<O, D>) new ProjectedRangeQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedRangeQuery(distanceQuery, innerq);
}
@SuppressWarnings("unchecked")
@Override
- public <D extends Distance<D>> RKNNQuery<O, D> getRKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public RKNNQuery<O> getRKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if (!(inner instanceof RKNNIndex)) {
return null;
}
@@ -170,12 +170,12 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
return null;
}
}
- SpatialPrimitiveDistanceQuery<O, DoubleDistance> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
- RKNNQuery<O, DoubleDistance> innerq = ((RKNNIndex<O>) inner).getRKNNQuery(innerQuery, hints);
+ SpatialPrimitiveDistanceQuery<O> innerQuery = EuclideanDistanceFunction.STATIC.instantiate(view);
+ RKNNQuery<O> innerq = ((RKNNIndex<O>) inner).getRKNNQuery(innerQuery, hints);
if (innerq == null) {
return null;
}
- return (RKNNQuery<O, D>) new ProjectedRKNNQuery<DoubleDistance>((DistanceQuery<O, DoubleDistance>) distanceQuery, innerq);
+ return new ProjectedRKNNQuery(distanceQuery, innerq);
}
/**
@@ -187,7 +187,7 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
*
* @param <O> Data type.
*/
- public static class Factory<O extends NumberVector<?>> extends ProjectedIndex.Factory<O, O> {
+ public static class Factory<O extends NumberVector> extends ProjectedIndex.Factory<O, O> {
/**
* Constructor.
*
@@ -233,7 +233,7 @@ public class LngLatAsECEFIndex<O extends NumberVector<?>> extends ProjectedIndex
*
* @param <O> Outer object type.
*/
- public static class Parameterizer<O extends NumberVector<?>> extends AbstractParameterizer {
+ public static class Parameterizer<O extends NumberVector> extends AbstractParameterizer {
/**
* Inner index factory.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/index/projected/PINN.java b/src/de/lmu/ifi/dbs/elki/index/projected/PINN.java
index b3e617b8..2294455a 100644
--- a/src/de/lmu/ifi/dbs/elki/index/projected/PINN.java
+++ b/src/de/lmu/ifi/dbs/elki/index/projected/PINN.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.projected;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -27,7 +27,7 @@ import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.projection.RandomProjection;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.math.linearalgebra.randomprojections.AchlioptasRandomProjectionFamily;
-import de.lmu.ifi.dbs.elki.utilities.RandomFactory;
+import de.lmu.ifi.dbs.elki.math.random.RandomFactory;
import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
@@ -57,7 +57,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.RandomParameter;
* @param <O> Object type
*/
@Reference(title = "Finding local anomalies in very high dimensional space", authors = "T. de Vries, S. Chawla, M. E. Houle", booktitle = "Proc. IEEE 10th International Conference on Data Mining (ICDM)", url = "http://dx.doi.org/10.1109/ICDM.2010.151")
-public class PINN<O extends NumberVector<?>> extends ProjectedIndex.Factory<O, O> {
+public class PINN<O extends NumberVector> extends ProjectedIndex.Factory<O, O> {
/**
* Constructor.
*
@@ -80,7 +80,7 @@ public class PINN<O extends NumberVector<?>> extends ProjectedIndex.Factory<O, O
*
* @param <O> Outer object type.
*/
- public static class Parameterizer<O extends NumberVector<?>> extends AbstractParameterizer {
+ public static class Parameterizer<O extends NumberVector> extends AbstractParameterizer {
/**
* Target dimensionality.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/index/projected/ProjectedIndex.java b/src/de/lmu/ifi/dbs/elki/index/projected/ProjectedIndex.java
index f71ced70..0d876dea 100644
--- a/src/de/lmu/ifi/dbs/elki/index/projected/ProjectedIndex.java
+++ b/src/de/lmu/ifi/dbs/elki/index/projected/ProjectedIndex.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.projected;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -35,15 +35,11 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDList;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDListIter;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DoubleDistanceDBIDPairList;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DoubleDistanceKNNHeap;
-import de.lmu.ifi.dbs.elki.database.ids.distance.KNNHeap;
-import de.lmu.ifi.dbs.elki.database.ids.distance.KNNList;
-import de.lmu.ifi.dbs.elki.database.ids.distance.ModifiableDistanceDBIDList;
-import de.lmu.ifi.dbs.elki.database.ids.distance.ModifiableDoubleDistanceDBIDList;
-import de.lmu.ifi.dbs.elki.database.ids.generic.GenericDistanceDBIDList;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDList;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDListIter;
+import de.lmu.ifi.dbs.elki.database.ids.KNNHeap;
+import de.lmu.ifi.dbs.elki.database.ids.KNNList;
+import de.lmu.ifi.dbs.elki.database.ids.ModifiableDoubleDBIDList;
import de.lmu.ifi.dbs.elki.database.query.DatabaseQuery;
import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery;
@@ -54,9 +50,6 @@ import de.lmu.ifi.dbs.elki.database.relation.MaterializedRelation;
import de.lmu.ifi.dbs.elki.database.relation.ProjectedView;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDoubleDistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.index.Index;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.index.KNNIndex;
@@ -87,9 +80,10 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
*
* @author Erich Schubert
*
- * @apiviz.composedOf ProjectedKNNQuery
- * @apiviz.composedOf ProjectedRangeQuery
- * @apiviz.composedOf ProjectedRKNNQuery
+ * @apiviz.composedOf Projection
+ * @apiviz.has ProjectedKNNQuery
+ * @apiviz.has ProjectedRangeQuery
+ * @apiviz.has ProjectedRKNNQuery
*
* @param <O> Outer object type.
* @param <I> Inner object type.
@@ -189,7 +183,7 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
}
@Override
- public <D extends Distance<D>> KNNQuery<O, D> getKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public KNNQuery<O> getKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if(!(inner instanceof KNNIndex)) {
return null;
}
@@ -202,17 +196,17 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
}
}
@SuppressWarnings("unchecked")
- DistanceQuery<I, D> innerQuery = ((DistanceFunction<? super I, D>) distanceQuery.getDistanceFunction()).instantiate(view);
+ DistanceQuery<I> innerQuery = ((DistanceFunction<? super I>) distanceQuery.getDistanceFunction()).instantiate(view);
@SuppressWarnings("unchecked")
- KNNQuery<I, D> innerq = ((KNNIndex<I>) inner).getKNNQuery(innerQuery, hints);
+ KNNQuery<I> innerq = ((KNNIndex<I>) inner).getKNNQuery(innerQuery, hints);
if(innerq == null) {
return null;
}
- return new ProjectedKNNQuery<>(distanceQuery, innerq);
+ return new ProjectedKNNQuery(distanceQuery, innerq);
}
@Override
- public <D extends Distance<D>> RangeQuery<O, D> getRangeQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public RangeQuery<O> getRangeQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if(!(inner instanceof RangeIndex)) {
return null;
}
@@ -225,17 +219,17 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
}
}
@SuppressWarnings("unchecked")
- DistanceQuery<I, D> innerQuery = ((DistanceFunction<? super I, D>) distanceQuery.getDistanceFunction()).instantiate(view);
+ DistanceQuery<I> innerQuery = ((DistanceFunction<? super I>) distanceQuery.getDistanceFunction()).instantiate(view);
@SuppressWarnings("unchecked")
- RangeQuery<I, D> innerq = ((RangeIndex<I>) inner).getRangeQuery(innerQuery, hints);
+ RangeQuery<I> innerq = ((RangeIndex<I>) inner).getRangeQuery(innerQuery, hints);
if(innerq == null) {
return null;
}
- return new ProjectedRangeQuery<>(distanceQuery, innerq);
+ return new ProjectedRangeQuery(distanceQuery, innerq);
}
@Override
- public <D extends Distance<D>> RKNNQuery<O, D> getRKNNQuery(DistanceQuery<O, D> distanceQuery, Object... hints) {
+ public RKNNQuery<O> getRKNNQuery(DistanceQuery<O> distanceQuery, Object... hints) {
if(!(inner instanceof RKNNIndex)) {
return null;
}
@@ -248,13 +242,13 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
}
}
@SuppressWarnings("unchecked")
- DistanceQuery<I, D> innerQuery = ((DistanceFunction<? super I, D>) distanceQuery.getDistanceFunction()).instantiate(view);
+ DistanceQuery<I> innerQuery = ((DistanceFunction<? super I>) distanceQuery.getDistanceFunction()).instantiate(view);
@SuppressWarnings("unchecked")
- RKNNQuery<I, D> innerq = ((RKNNIndex<I>) inner).getRKNNQuery(innerQuery, hints);
+ RKNNQuery<I> innerq = ((RKNNIndex<I>) inner).getRKNNQuery(innerQuery, hints);
if(innerq == null) {
return null;
}
- return new ProjectedRKNNQuery<>(distanceQuery, innerq);
+ return new ProjectedRKNNQuery(distanceQuery, innerq);
}
/**
@@ -262,66 +256,54 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
*
* @author Erich Schubert
*
- * @param <D> Distance type
+ * @param Distance type
*/
- class ProjectedKNNQuery<D extends Distance<D>> implements KNNQuery<O, D> {
+ class ProjectedKNNQuery implements KNNQuery<O> {
/**
* Inner kNN query.
*/
- KNNQuery<I, D> inner;
+ KNNQuery<I> inner;
/**
* Distance query for refinement.
*/
- DistanceQuery<O, D> distq;
+ DistanceQuery<O> distq;
/**
* Constructor.
*
* @param inner Inner kNN query.
*/
- public ProjectedKNNQuery(DistanceQuery<O, D> distanceQuery, KNNQuery<I, D> inner) {
+ public ProjectedKNNQuery(DistanceQuery<O> distanceQuery, KNNQuery<I> inner) {
super();
this.inner = inner;
this.distq = distanceQuery;
}
@Override
- public KNNList<D> getKNNForDBID(DBIDRef id, int k) {
+ public KNNList getKNNForDBID(DBIDRef id, int k) {
// So we have to project the query point only once:
return getKNNForObject(relation.get(id), k);
}
@Override
- public List<? extends KNNList<D>> getKNNForBulkDBIDs(ArrayDBIDs ids, int k) {
+ public List<? extends KNNList> getKNNForBulkDBIDs(ArrayDBIDs ids, int k) {
return inner.getKNNForBulkDBIDs(ids, k);
}
- @SuppressWarnings("unchecked")
@Override
- public KNNList<D> getKNNForObject(O obj, int k) {
+ public KNNList getKNNForObject(O obj, int k) {
final I pobj = proj.project(obj);
if(norefine) {
return inner.getKNNForObject(pobj, k);
}
- KNNList<D> ilist = inner.getKNNForObject(pobj, (int) Math.ceil(k * kmulti));
- if(distq.getDistanceFunction() instanceof PrimitiveDoubleDistanceFunction) {
- PrimitiveDoubleDistanceFunction<? super O> df = (PrimitiveDoubleDistanceFunction<? super O>) distq.getDistanceFunction();
- DoubleDistanceKNNHeap heap = DBIDUtil.newDoubleDistanceHeap(k);
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- heap.insert(df.doubleDistance(obj, distq.getRelation().get(iter)), iter);
- countRefinement();
- }
- return (KNNList<D>) heap.toKNNList();
- }
- else {
- KNNHeap<D> heap = DBIDUtil.newHeap(distq.getDistanceFactory(), k);
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- heap.insert(distq.distance(obj, iter), iter);
- countRefinement();
- }
- return heap.toKNNList();
+ KNNList ilist = inner.getKNNForObject(pobj, (int) Math.ceil(k * kmulti));
+ KNNHeap heap = DBIDUtil.newHeap(k);
+ for(DoubleDBIDListIter iter = ilist.iter(); iter.valid(); iter.advance()) {
+ heap.insert(distq.distance(obj, iter), iter);
+ countRefinement();
}
+ return heap.toKNNList();
}
}
@@ -330,62 +312,46 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
*
* @author Erich Schubert
*
- * @param <D> Distance type
+ * @param Distance type
*/
- class ProjectedRangeQuery<D extends Distance<D>> extends AbstractDistanceRangeQuery<O, D> {
+ class ProjectedRangeQuery extends AbstractDistanceRangeQuery<O> {
/**
* Inner range query.
*/
- RangeQuery<I, D> inner;
+ RangeQuery<I> inner;
/**
* Constructor.
*
* @param inner Inner range query.
*/
- public ProjectedRangeQuery(DistanceQuery<O, D> distanceQuery, RangeQuery<I, D> inner) {
+ public ProjectedRangeQuery(DistanceQuery<O> distanceQuery, RangeQuery<I> inner) {
super(distanceQuery);
this.inner = inner;
}
@Override
- public DistanceDBIDList<D> getRangeForDBID(DBIDRef id, D range) {
+ public DoubleDBIDList getRangeForDBID(DBIDRef id, double range) {
// So we have to project the query point only once:
return getRangeForObject(relation.get(id), range);
}
- @SuppressWarnings({ "unchecked" })
@Override
- public DistanceDBIDList<D> getRangeForObject(O obj, D range) {
+ public DoubleDBIDList getRangeForObject(O obj, double range) {
final I pobj = proj.project(obj);
- DistanceDBIDList<D> ilist = inner.getRangeForObject(pobj, range);
+ DoubleDBIDList ilist = inner.getRangeForObject(pobj, range);
if(norefine) {
return ilist;
}
- if(distanceQuery.getDistanceFunction() instanceof PrimitiveDoubleDistanceFunction) {
- PrimitiveDoubleDistanceFunction<? super O> df = (PrimitiveDoubleDistanceFunction<? super O>) distanceQuery.getDistanceFunction();
- double drange = ((DoubleDistance) range).doubleValue();
- ModifiableDoubleDistanceDBIDList olist = new DoubleDistanceDBIDPairList(ilist.size());
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- final double dist = df.doubleDistance(obj, distanceQuery.getRelation().get(iter));
- countRefinement();
- if(dist <= drange) {
- olist.add(dist, iter);
- }
- }
- return (DistanceDBIDList<D>) olist;
- }
- else {
- ModifiableDistanceDBIDList<D> olist = new GenericDistanceDBIDList<>(ilist.size());
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- D dist = distanceQuery.distance(obj, iter);
- countRefinement();
- if(range.compareTo(dist) <= 0) {
- olist.add(dist, iter);
- }
+ ModifiableDoubleDBIDList olist = DBIDUtil.newDistanceDBIDList(ilist.size());
+ for(DoubleDBIDListIter iter = ilist.iter(); iter.valid(); iter.advance()) {
+ double dist = distanceQuery.distance(obj, iter);
+ countRefinement();
+ if(range <= dist) {
+ olist.add(dist, iter);
}
- return olist;
}
+ return olist;
}
}
@@ -394,67 +360,54 @@ public class ProjectedIndex<O, I> implements KNNIndex<O>, RKNNIndex<O>, RangeInd
*
* @author Erich Schubert
*
- * @param <D> Distance type
+ * @param Distance type
*/
- class ProjectedRKNNQuery<D extends Distance<D>> implements RKNNQuery<O, D> {
+ class ProjectedRKNNQuery implements RKNNQuery<O> {
/**
* Inner RkNN query.
*/
- RKNNQuery<I, D> inner;
+ RKNNQuery<I> inner;
/**
* Distance query for refinement.
*/
- DistanceQuery<O, D> distq;
+ DistanceQuery<O> distq;
/**
* Constructor.
*
* @param inner Inner RkNN query.
*/
- public ProjectedRKNNQuery(DistanceQuery<O, D> distanceQuery, RKNNQuery<I, D> inner) {
+ public ProjectedRKNNQuery(DistanceQuery<O> distanceQuery, RKNNQuery<I> inner) {
super();
this.inner = inner;
this.distq = distanceQuery;
}
@Override
- public DistanceDBIDList<D> getRKNNForDBID(DBIDRef id, int k) {
+ public DoubleDBIDList getRKNNForDBID(DBIDRef id, int k) {
// So we have to project the query point only once:
return getRKNNForObject(relation.get(id), k);
}
- @SuppressWarnings("unchecked")
@Override
- public DistanceDBIDList<D> getRKNNForObject(O obj, int k) {
+ public DoubleDBIDList getRKNNForObject(O obj, int k) {
final I pobj = proj.project(obj);
if(norefine) {
return inner.getRKNNForObject(pobj, k);
}
- DistanceDBIDList<D> ilist = inner.getRKNNForObject(pobj, (int) Math.ceil(k * kmulti));
- if(distq.getDistanceFunction() instanceof PrimitiveDoubleDistanceFunction) {
- PrimitiveDoubleDistanceFunction<? super O> df = (PrimitiveDoubleDistanceFunction<? super O>) distq.getDistanceFunction();
- ModifiableDoubleDistanceDBIDList olist = new DoubleDistanceDBIDPairList(ilist.size());
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- final double dist = df.doubleDistance(obj, distq.getRelation().get(iter));
- countRefinement();
- olist.add(dist, iter);
- }
- return (DistanceDBIDList<D>) olist;
- }
- else {
- ModifiableDistanceDBIDList<D> olist = new GenericDistanceDBIDList<>(ilist.size());
- for(DistanceDBIDListIter<D> iter = ilist.iter(); iter.valid(); iter.advance()) {
- D dist = distq.distance(obj, iter);
- countRefinement();
- olist.add(dist, iter);
- }
- return olist;
+ DoubleDBIDList ilist = inner.getRKNNForObject(pobj, (int) Math.ceil(k * kmulti));
+ ModifiableDoubleDBIDList olist = DBIDUtil.newDistanceDBIDList(ilist.size());
+ for(DoubleDBIDListIter iter = ilist.iter(); iter.valid(); iter.advance()) {
+ double dist = distq.distance(obj, iter);
+ countRefinement();
+ olist.add(dist, iter);
}
+ return olist;
}
@Override
- public List<? extends DistanceDBIDList<D>> getRKNNForBulkDBIDs(ArrayDBIDs ids, int k) {
+ public List<? extends DoubleDBIDList> getRKNNForBulkDBIDs(ArrayDBIDs ids, int k) {
return inner.getRKNNForBulkDBIDs(ids, k);
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/index/projected/package-info.java b/src/de/lmu/ifi/dbs/elki/index/projected/package-info.java
index 8a311292..3dc9c2af 100644
--- a/src/de/lmu/ifi/dbs/elki/index/projected/package-info.java
+++ b/src/de/lmu/ifi/dbs/elki/index/projected/package-info.java
@@ -5,7 +5,7 @@
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2013
+ Copyright (C) 2014
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team