diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/projected')
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 |