summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance')
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/DistanceUtil.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractIndexBasedDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceFunction.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceNorm.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/ArcCosineDistanceFunction.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java10
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/CosineDistanceFunction.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/EuclideanDistanceFunction.java28
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/FilteredLocalPCABasedDistanceFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/IndexBasedDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/JeffreyDivergenceDistanceFunction.java10
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/LPNormDistanceFunction.java21
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/LocallyWeightedDistanceFunction.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/ManhattanDistanceFunction.java68
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/MaximumDistanceFunction.java12
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinKDistance.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinimumDistanceFunction.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/NumberVectorDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/RandomStableDistanceFunction.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SharedNearestNeighborJaccardDistanceFunction.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseEuclideanDistanceFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseLPNormDistanceFunction.java15
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseManhattanDistanceFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseMaximumDistanceFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/SquaredEuclideanDistanceFunction.java24
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedDistanceFunction.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedSquaredEuclideanDistanceFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterArccos.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLinear.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLn.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HSBHistogramQuadraticDistanceFunction.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HistogramIntersectionDistanceFunction.java10
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/RGBHistogramQuadraticDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/ERiCDistanceFunction.java62
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PCABasedCorrelationDistanceFunction.java47
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PearsonCorrelationDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/SquaredPearsonCorrelationDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedPearsonCorrelationDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedSquaredPearsonCorrelationDistanceFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedDoubleDistanceFunction.java11
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java11
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParser.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParsingResult.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedDoubleDistanceFunction.java33
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedFloatDistanceFunction.java18
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/NumberDistanceParser.java69
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/DimensionSelectingLatLngDistanceFunction.java70
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LatLngDistanceFunction.java56
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LngLatDistanceFunction.java56
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/package-info.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractDimensionsSelectingDoubleDistanceFunction.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractPreferenceVectorBasedCorrelationDistanceFunction.java28
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DiSHDistanceFunction.java32
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DimensionSelectingDistanceFunction.java22
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/HiSCDistanceFunction.java34
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/LocalSubspaceDistanceFunction.java12
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceEuclideanDistanceFunction.java24
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceLPNormDistanceFunction.java37
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceManhattanDistanceFunction.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/AbstractEditDistanceFunction.java24
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/DTWDistanceFunction.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/EDRDistanceFunction.java45
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/ERPDistanceFunction.java51
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/LCSSDistanceFunction.java78
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/AbstractKNNHeap.java113
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResult.java88
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultIter.java57
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultUtil.java86
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDList.java190
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDResultIter.java61
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNHeap.java191
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNList.java238
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericDistanceDBIDList.java163
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNHeap.java106
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNList.java189
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNHeap.java113
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNResult.java91
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNUtil.java372
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/ModifiableDistanceDBIDResult.java48
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/package-info.java53
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/BitDistance.java50
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/CorrelationDistance.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/DoubleDistance.java85
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/FloatDistance.java102
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/IntegerDistance.java55
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/NumberDistance.java67
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/PCACorrelationDistance.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/PreferenceVectorBasedCorrelationDistance.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/SubspaceDistance.java50
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancevalue/package-info.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/FooKernelFunction.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java21
100 files changed, 3121 insertions, 846 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/DistanceUtil.java b/src/de/lmu/ifi/dbs/elki/distance/DistanceUtil.java
index 7a394b8b..eaa6c96c 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/DistanceUtil.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/DistanceUtil.java
@@ -23,7 +23,10 @@ package de.lmu.ifi.dbs.elki.distance;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
/**
* Class with distance related utility functions.
@@ -89,4 +92,26 @@ public final class DistanceUtil {
return d1;
}
}
+
+ /**
+ * Test whether a distance function is double-valued.
+ *
+ * @param df Distance function
+ * @return True when the distance function returns double values
+ */
+ public static boolean isDoubleDistanceFunction(DistanceFunction<?, ?> df) {
+ Object factory = df.getDistanceFactory();
+ return (factory == DoubleDistance.FACTORY) || (factory instanceof DoubleDistance);
+ }
+
+ /**
+ * Test whether a distance query is double-valued.
+ *
+ * @param df Distance function
+ * @return True when the distance function returns double values
+ */
+ public static boolean isDoubleDistanceFunction(DistanceQuery<?, ?> df) {
+ Object factory = df.getDistanceFactory();
+ return (factory == DoubleDistance.FACTORY) || (factory instanceof DoubleDistance);
+ }
} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractIndexBasedDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractIndexBasedDistanceFunction.java
index 9280b783..48947692 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractIndexBasedDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractIndexBasedDistanceFunction.java
@@ -133,7 +133,7 @@ public abstract class AbstractIndexBasedDistanceFunction<O, I extends Index, D e
*
* @param <F> Factory type
*/
- public static abstract class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractParameterizer {
+ public abstract static class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractParameterizer {
/**
* The index factory we use.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceFunction.java
index dbda2e96..24288ec1 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceFunction.java
@@ -38,7 +38,7 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
* @apiviz.uses NumberVector
* @apiviz.has DoubleDistance
*/
-public abstract class AbstractVectorDoubleDistanceFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?, ?>, DoubleDistance> implements PrimitiveDoubleDistanceFunction<NumberVector<?, ?>>, NumberVectorDistanceFunction<DoubleDistance> {
+public abstract class AbstractVectorDoubleDistanceFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?>, DoubleDistance> implements PrimitiveDoubleDistanceFunction<NumberVector<?>>, NumberVectorDistanceFunction<DoubleDistance> {
/**
* Constructor.
*/
@@ -47,12 +47,12 @@ public abstract class AbstractVectorDoubleDistanceFunction extends AbstractPrimi
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@Override
- public final DoubleDistance distance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
+ public final DoubleDistance distance(NumberVector<?> o1, NumberVector<?> o2) {
return new DoubleDistance(doubleDistance(o1, o2));
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceNorm.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceNorm.java
index 7a7785e1..16d4160c 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceNorm.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/AbstractVectorDoubleDistanceNorm.java
@@ -32,9 +32,9 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
*
* @author Erich Schubert
*/
-public abstract class AbstractVectorDoubleDistanceNorm extends AbstractVectorDoubleDistanceFunction implements DoubleNorm<NumberVector<?, ?>> {
+public abstract class AbstractVectorDoubleDistanceNorm extends AbstractVectorDoubleDistanceFunction implements DoubleNorm<NumberVector<?>> {
@Override
- public DoubleDistance norm(NumberVector<?, ?> obj) {
+ public DoubleDistance norm(NumberVector<?> obj) {
return new DoubleDistance(doubleNorm(obj));
}
} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ArcCosineDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ArcCosineDistanceFunction.java
index 03563c6f..344bb3ca 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ArcCosineDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ArcCosineDistanceFunction.java
@@ -42,7 +42,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Arthur Zimek
*/
-public class ArcCosineDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class ArcCosineDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance
*/
@@ -69,7 +69,7 @@ public class ArcCosineDistanceFunction extends AbstractVectorDoubleDistanceFunct
* @return the cosine distance for two given feature vectors v1 and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
double d = Math.acos(VectorUtil.cosAngle(v1, v2));
if(d < 0) {
d = 0;
@@ -108,12 +108,12 @@ public class ArcCosineDistanceFunction extends AbstractVectorDoubleDistanceFunct
}
@Override
- public <T extends NumberVector<?, ?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_VARIABLE_LENGTH;
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
index 6c8647ab..f6db7439 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CanberraDistanceFunction.java
@@ -45,7 +45,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
* @author Erich Schubert
*/
@Reference(authors = "G. N. Lance, W. T. Williams", title = "Computer programs for hierarchical polythetic classification (similarity analysis).", booktitle = "Computer Journal, Volume 9, Issue 1", url = "http://comjnl.oxfordjournals.org/content/9/1/60.short")
-public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance. Use this!
*/
@@ -59,10 +59,10 @@ public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFuncti
}
@Override
- public double doubleDistance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
+ public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) {
final int dim = o1.getDimensionality();
double sum = 0.0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
double v1 = o1.doubleValue(i);
double v2 = o2.doubleValue(i);
final double div = Math.abs(v1) + Math.abs(v2);
@@ -77,7 +77,7 @@ public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFuncti
public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
final int dim = mbr1.getDimensionality();
double sum = 0.0;
- for(int d = 1; d <= dim; d++) {
+ for(int d = 0; d < dim; d++) {
final double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
@@ -107,7 +107,7 @@ public class CanberraDistanceFunction extends AbstractVectorDoubleDistanceFuncti
}
@Override
- public <T extends NumberVector<?, ?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CosineDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CosineDistanceFunction.java
index 2d681dad..f333f6e2 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CosineDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/CosineDistanceFunction.java
@@ -42,7 +42,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Arthur Zimek
*/
-public class CosineDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class CosineDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance
*/
@@ -69,7 +69,7 @@ public class CosineDistanceFunction extends AbstractVectorDoubleDistanceFunction
* @return the cosine distance for two given feature vectors v1 and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
double d = 1 - VectorUtil.cosAngle(v1, v2);
if(d < 0) {
d = 0;
@@ -108,12 +108,12 @@ public class CosineDistanceFunction extends AbstractVectorDoubleDistanceFunction
}
@Override
- public <T extends NumberVector<?, ?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_VARIABLE_LENGTH;
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/EuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/EuclideanDistanceFunction.java
index c0bc5696..6bb910a4 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/EuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/EuclideanDistanceFunction.java
@@ -32,7 +32,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Arthur Zimek
*/
-public class EuclideanDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class EuclideanDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance. Use this!
*/
@@ -49,20 +49,14 @@ public class EuclideanDistanceFunction extends LPNormDistanceFunction implements
super(2.0);
}
- /**
- * Provides the Euclidean distance between the given two vectors.
- *
- * @return the Euclidean distance between the given two vectors as raw double
- * value
- */
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
}
double sqrDist = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double delta = v1.doubleValue(i) - v2.doubleValue(i);
sqrDist += delta * delta;
}
@@ -70,24 +64,24 @@ public class EuclideanDistanceFunction extends LPNormDistanceFunction implements
}
@Override
- public double doubleNorm(NumberVector<?, ?> v) {
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double sqrDist = 0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double delta = v.doubleValue(i);
sqrDist += delta * delta;
}
return Math.sqrt(sqrDist);
}
- protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
final int dim = mbr.getDimensionality();
if(dim != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString() + "\n" + dim + "!=" + v.getDimensionality());
}
double sqrDist = 0;
- for(int d = 1; d <= dim; d++) {
+ for(int d = 0; d < dim; d++) {
double value = v.doubleValue(d);
double r;
if(value < mbr.getMin(d)) {
@@ -111,14 +105,14 @@ public class EuclideanDistanceFunction extends LPNormDistanceFunction implements
// Some optimizations for simpler cases.
if(mbr1 instanceof NumberVector) {
if(mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
}
else {
- return doubleMinDistObject(mbr2, (NumberVector<?, ?>) mbr1);
+ return doubleMinDistObject(mbr2, (NumberVector<?>) mbr1);
}
}
else if(mbr2 instanceof NumberVector) {
- return doubleMinDistObject(mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleMinDistObject(mbr1, (NumberVector<?>) mbr2);
}
final int dim1 = mbr1.getDimensionality();
if(dim1 != mbr2.getDimensionality()) {
@@ -126,7 +120,7 @@ public class EuclideanDistanceFunction extends LPNormDistanceFunction implements
}
double sqrDist = 0;
- for(int d = 1; d <= dim1; d++) {
+ for(int d = 0; d < dim1; d++) {
final double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/FilteredLocalPCABasedDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/FilteredLocalPCABasedDistanceFunction.java
index 03074815..2cf11a54 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/FilteredLocalPCABasedDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/FilteredLocalPCABasedDistanceFunction.java
@@ -39,7 +39,7 @@ import de.lmu.ifi.dbs.elki.index.preprocessed.localpca.FilteredLocalPCAIndex;
* @param <O> Database object type
* @param <D> Distance type
*/
-public interface FilteredLocalPCABasedDistanceFunction<O extends NumberVector<?, ?>, P extends FilteredLocalPCAIndex<? super O>, D extends Distance<D>> extends IndexBasedDistanceFunction<O, D> {
+public interface FilteredLocalPCABasedDistanceFunction<O extends NumberVector<?>, P extends FilteredLocalPCAIndex<? super O>, D extends Distance<D>> extends IndexBasedDistanceFunction<O, D> {
/**
* Instantiate with a database to get the actual distance query.
*
@@ -58,7 +58,7 @@ public interface FilteredLocalPCABasedDistanceFunction<O extends NumberVector<?,
* @param <I> Index type
* @param <D> Distance type
*/
- public static interface Instance<T extends NumberVector<?, ?>, I extends Index, D extends Distance<D>> extends IndexBasedDistanceFunction.Instance<T, I, D> {
+ public static interface Instance<T extends NumberVector<?>, I extends Index, D extends Distance<D>> extends IndexBasedDistanceFunction.Instance<T, I, D> {
// No additional restrictions
}
} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/IndexBasedDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/IndexBasedDistanceFunction.java
index 8663c8c3..ba7d87d7 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/IndexBasedDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/IndexBasedDistanceFunction.java
@@ -41,7 +41,7 @@ public interface IndexBasedDistanceFunction<O, D extends Distance<D>> extends Di
/**
* OptionID for the index parameter
*/
- public static final OptionID INDEX_ID = OptionID.getOrCreateOptionID("distancefunction.index", "Distance index to use.");
+ public static final OptionID INDEX_ID = new OptionID("distancefunction.index", "Distance index to use.");
/**
* Instance interface for Index based distance functions.
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/JeffreyDivergenceDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/JeffreyDivergenceDistanceFunction.java
index 3aa6908f..1ac5f2a4 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/JeffreyDivergenceDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/JeffreyDivergenceDistanceFunction.java
@@ -32,7 +32,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Erich Schubert
*/
-@Reference(authors="J. Puzicha,J.M. Buhmann, Y. Rubner, C. Tomasi", title="Empirical evaluation of dissimilarity measures for color and texture", booktitle="Proc. 7th IEEE International Conference on Computer Vision", url="http://dx.doi.org/10.1109/ICCV.1999.790412")
+@Reference(authors="J. Puzicha, J.M. Buhmann, Y. Rubner, C. Tomasi", title="Empirical evaluation of dissimilarity measures for color and texture", booktitle="Proc. 7th IEEE International Conference on Computer Vision", url="http://dx.doi.org/10.1109/ICCV.1999.790412")
public class JeffreyDivergenceDistanceFunction extends AbstractVectorDoubleDistanceFunction {
/**
* Static instance. Use this!
@@ -49,16 +49,16 @@ public class JeffreyDivergenceDistanceFunction extends AbstractVectorDoubleDista
}
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
}
double dist = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double xi = v1.doubleValue(i);
final double yi = v2.doubleValue(i);
- final double mi = (xi + yi) / 2;
+ final double mi = .5 * (xi + yi);
dist += xi * Math.log(xi / mi);
dist += yi * Math.log(yi / mi);
}
@@ -97,4 +97,4 @@ public class JeffreyDivergenceDistanceFunction extends AbstractVectorDoubleDista
return JeffreyDivergenceDistanceFunction.STATIC;
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LPNormDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LPNormDistanceFunction.java
index 134b587f..98b9929a 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LPNormDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LPNormDistanceFunction.java
@@ -41,11 +41,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
*
* @apiviz.landmark
*/
-public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* OptionID for the "p" parameter
*/
- public static final OptionID P_ID = OptionID.getOrCreateOptionID("lpnorm.p", "the degree of the L-P-Norm (positive number)");
+ public static final OptionID P_ID = new OptionID("lpnorm.p", "the degree of the L-P-Norm (positive number)");
/**
* Keeps the currently set p.
@@ -72,14 +72,14 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
* the currently set p
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n first argument: " + v1.toString() + "\n second argument: " + v2.toString());
}
double sqrDist = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double delta = Math.abs(v1.doubleValue(i) - v2.doubleValue(i));
sqrDist += Math.pow(delta, p);
}
@@ -87,10 +87,10 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
}
@Override
- public double doubleNorm(NumberVector<?, ?> v) {
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double sqrDist = 0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double delta = v.doubleValue(i);
sqrDist += Math.pow(delta, p);
}
@@ -111,7 +111,7 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
// Optimization for the simplest case
if(mbr1 instanceof NumberVector) {
if(mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
}
}
// TODO: optimize for more simpler cases: obj vs. rect?
@@ -121,7 +121,7 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
}
double sumDist = 0;
- for(int d = 1; d <= dim1; d++) {
+ for(int d = 0; d < dim1; d++) {
final double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
@@ -167,7 +167,7 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
}
@Override
- public <T extends NumberVector<?, ?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
@@ -187,7 +187,8 @@ public class LPNormDistanceFunction extends AbstractVectorDoubleDistanceNorm imp
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final DoubleParameter paramP = new DoubleParameter(P_ID, new GreaterConstraint(0));
+ final DoubleParameter paramP = new DoubleParameter(P_ID);
+ paramP.addConstraint(new GreaterConstraint(0));
if(config.grab(paramP)) {
p = paramP.getValue();
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LocallyWeightedDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LocallyWeightedDistanceFunction.java
index 90c3a94a..2ff0252c 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LocallyWeightedDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/LocallyWeightedDistanceFunction.java
@@ -47,7 +47,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz
* @param <V> the type of NumberVector to compute the distances in between
*/
// FIXME: implements SpatialPrimitiveDistanceFunction<V, DoubleDistance>
-public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction<V, FilteredLocalPCAIndex<V>, DoubleDistance> implements FilteredLocalPCABasedDistanceFunction<V, FilteredLocalPCAIndex<V>, DoubleDistance> {
+public class LocallyWeightedDistanceFunction<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction<V, FilteredLocalPCAIndex<V>, DoubleDistance> implements FilteredLocalPCABasedDistanceFunction<V, FilteredLocalPCAIndex<V>, DoubleDistance> {
/**
* Constructor
*
@@ -100,7 +100,7 @@ public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> exten
*
* @author Erich Schubert
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction.Instance<V, LocalProjectionIndex<V, ?>, DoubleDistance, LocallyWeightedDistanceFunction<? super V>> implements FilteredLocalPCABasedDistanceFunction.Instance<V, LocalProjectionIndex<V, ?>, DoubleDistance> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction.Instance<V, LocalProjectionIndex<V, ?>, DoubleDistance, LocallyWeightedDistanceFunction<? super V>> implements FilteredLocalPCABasedDistanceFunction.Instance<V, LocalProjectionIndex<V, ?>, DoubleDistance> {
/**
* Constructor.
*
@@ -166,16 +166,16 @@ public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> exten
}
double[] r = new double[v.getDimensionality()];
- for(int d = 1; d <= v.getDimensionality(); d++) {
+ for(int d = 0; d < v.getDimensionality(); d++) {
double value = v.doubleValue(d);
if(value < mbr.getMin(d)) {
- r[d - 1] = mbr.getMin(d);
+ r[d] = mbr.getMin(d);
}
else if(value > mbr.getMax(d)) {
- r[d - 1] = mbr.getMax(d);
+ r[d] = mbr.getMax(d);
}
else {
- r[d - 1] = value;
+ r[d] = value;
}
}
@@ -200,7 +200,7 @@ public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> exten
}
double sqrDist = 0;
- for(int d = 1; d <= mbr1.getDimensionality(); d++) {
+ for(int d = 0; d < mbr1.getDimensionality(); d++) {
double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
@@ -228,11 +228,10 @@ public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> exten
}
double sqrDist = 0;
- for(int d = 1; d <= mbr1.getDimensionality(); d++) {
- double c1 = (mbr1.getMin(d) + mbr1.getMax(d)) / 2;
- double c2 = (mbr2.getMin(d) + mbr2.getMax(d)) / 2;
-
- double manhattanI = c1 - c2;
+ for(int d = 0; d < mbr1.getDimensionality(); d++) {
+ final double c1 = .5 * (mbr1.getMin(d) + mbr1.getMax(d));
+ final double c2 = .5 * (mbr2.getMin(d) + mbr2.getMax(d));
+ final double manhattanI = c1 - c2;
sqrDist += manhattanI * manhattanI;
}
return new DoubleDistance(Math.sqrt(sqrDist));
@@ -246,7 +245,7 @@ public class LocallyWeightedDistanceFunction<V extends NumberVector<?, ?>> exten
*
* @apiviz.exclude
*/
- public static class Parameterizer<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction.Parameterizer<LocalProjectionIndex.Factory<V, FilteredLocalPCAIndex<V>>> {
+ public static class Parameterizer<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction.Parameterizer<LocalProjectionIndex.Factory<V, FilteredLocalPCAIndex<V>>> {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ManhattanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ManhattanDistanceFunction.java
index c638ce13..a97ef086 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ManhattanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/ManhattanDistanceFunction.java
@@ -34,7 +34,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
* @author Arthur Zimek
*/
// TODO: add spatial!
-public class ManhattanDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class ManhattanDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* The static instance to use.
*/
@@ -52,25 +52,25 @@ public class ManhattanDistanceFunction extends LPNormDistanceFunction implements
}
/**
- * Compute the Manhattan distance
+ * Compute the Manhattan distance.
*
* @param v1 first vector
* @param v2 second vector
* @return Manhattan distance value
*/
@Override
- public double doubleDistance(NumberVector<?,?> v1, NumberVector<?,?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim = v1.getDimensionality();
- if(dim != v2.getDimensionality()) {
+ if (dim != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString());
}
double sum = 0;
- for(int i = 1; i <= dim; i++) {
+ for (int i = 0; i < dim; i++) {
sum += Math.abs(v1.doubleValue(i) - v2.doubleValue(i));
}
return sum;
}
-
+
/**
* Returns the Manhattan norm of the given vector.
*
@@ -78,32 +78,30 @@ public class ManhattanDistanceFunction extends LPNormDistanceFunction implements
* @return the Manhattan norm of the given vector
*/
@Override
- public double doubleNorm(NumberVector<?,?> v){
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double sum = 0;
- for(int i = 1; i <= dim; i++) {
+ for (int i = 0; i < dim; i++) {
sum += Math.abs(v.doubleValue(i));
}
return sum;
}
- private double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ private double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
final int dim = mbr.getDimensionality();
- if(dim != v.getDimensionality()) {
+ if (dim != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString() + "\n" + dim + "!=" + v.getDimensionality());
}
double sumDist = 0;
- for(int d = 1; d <= dim; d++) {
- double value = v.doubleValue(d);
- double r;
- if(value < mbr.getMin(d)) {
+ for (int d = 0; d < dim; d++) {
+ final double value = v.doubleValue(d);
+ final double r;
+ if (value < mbr.getMin(d)) {
r = mbr.getMin(d);
- }
- else if(value > mbr.getMax(d)) {
+ } else if (value > mbr.getMax(d)) {
r = mbr.getMax(d);
- }
- else {
+ } else {
r = value;
}
@@ -116,34 +114,30 @@ public class ManhattanDistanceFunction extends LPNormDistanceFunction implements
@Override
public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
// Some optimizations for simpler cases.
- if(mbr1 instanceof NumberVector) {
- if(mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
- }
- else {
- return doubleMinDistObject(mbr2, (NumberVector<?, ?>) mbr1);
+ if (mbr1 instanceof NumberVector) {
+ if (mbr2 instanceof NumberVector) {
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
+ } else {
+ return doubleMinDistObject(mbr2, (NumberVector<?>) mbr1);
}
- }
- else if(mbr2 instanceof NumberVector) {
- return doubleMinDistObject(mbr1, (NumberVector<?, ?>) mbr2);
+ } else if (mbr2 instanceof NumberVector) {
+ return doubleMinDistObject(mbr1, (NumberVector<?>) mbr2);
}
final int dim1 = mbr1.getDimensionality();
- if(dim1 != mbr2.getDimensionality()) {
+ if (dim1 != mbr2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr1.toString() + "\n " + "second argument: " + mbr2.toString());
}
double sumDist = 0;
- for(int d = 1; d <= dim1; d++) {
+ for (int d = 0; d < dim1; d++) {
final double m1, m2;
- if(mbr1.getMax(d) < mbr2.getMin(d)) {
+ if (mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
m2 = mbr1.getMax(d);
- }
- else if(mbr1.getMin(d) > mbr2.getMax(d)) {
+ } else if (mbr1.getMin(d) > mbr2.getMax(d)) {
m1 = mbr1.getMin(d);
m2 = mbr2.getMax(d);
- }
- else { // The mbrs intersect!
+ } else { // The mbrs intersect!
continue;
}
final double manhattanI = m1 - m2;
@@ -164,10 +158,10 @@ public class ManhattanDistanceFunction extends LPNormDistanceFunction implements
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(obj == this) {
+ if (obj == this) {
return true;
}
if (this.getClass().equals(obj.getClass())) {
@@ -189,4 +183,4 @@ public class ManhattanDistanceFunction extends LPNormDistanceFunction implements
return ManhattanDistanceFunction.STATIC;
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MaximumDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MaximumDistanceFunction.java
index e718d087..30b47c9d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MaximumDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MaximumDistanceFunction.java
@@ -33,7 +33,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Erich Schubert
*/
-public class MaximumDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class MaximumDistanceFunction extends LPNormDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance.
*/
@@ -51,13 +51,13 @@ public class MaximumDistanceFunction extends LPNormDistanceFunction implements S
}
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString());
}
double max = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double d = Math.abs(v1.doubleValue(i) - v2.doubleValue(i));
max = Math.max(d, max);
}
@@ -65,10 +65,10 @@ public class MaximumDistanceFunction extends LPNormDistanceFunction implements S
}
@Override
- public double doubleNorm(NumberVector<?, ?> v) {
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double max = 0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
max = Math.max(v.doubleValue(i), max);
}
return max;
@@ -81,7 +81,7 @@ public class MaximumDistanceFunction extends LPNormDistanceFunction implements S
throw new IllegalArgumentException("Different dimensionality of objects.");
}
double max = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double d;
if(mbr1.getMax(i) < mbr2.getMin(i)) {
d = mbr2.getMin(i) - mbr1.getMin(i);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinKDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinKDistance.java
index 8f19af60..294b7e40 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinKDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinKDistance.java
@@ -30,9 +30,9 @@ import de.lmu.ifi.dbs.elki.database.query.DatabaseQuery;
import de.lmu.ifi.dbs.elki.database.query.distance.AbstractDatabaseDistanceQuery;
import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery;
-import de.lmu.ifi.dbs.elki.database.query.knn.KNNResult;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.DistanceUtil;
+import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult;
import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
@@ -71,17 +71,17 @@ public class MinKDistance<O, D extends Distance<D>> extends AbstractDatabaseDist
/**
* OptionID for the base distance used to compute reachability
*/
- public static final OptionID DISTANCE_FUNCTION_ID = OptionID.getOrCreateOptionID("reachdist.basedistance", "Base distance function to use.");
+ public static final OptionID DISTANCE_FUNCTION_ID = new OptionID("reachdist.basedistance", "Base distance function to use.");
/**
* OptionID for the KNN query class to use (preprocessor, approximation, ...)
*/
- public static final OptionID KNNQUERY_ID = OptionID.getOrCreateOptionID("reachdist.knnquery", "kNN query to use");
+ public static final OptionID KNNQUERY_ID = new OptionID("reachdist.knnquery", "kNN query to use");
/**
* OptionID for the "k" parameter.
*/
- public static final OptionID K_ID = OptionID.getOrCreateOptionID("reachdist.k", "The number of nearest neighbors of an object to be considered for computing its reachability distance.");
+ public static final OptionID K_ID = new OptionID("reachdist.k", "The number of nearest neighbors of an object to be considered for computing its reachability distance.");
/**
* The distance function to determine the exact distance.
@@ -124,6 +124,7 @@ public class MinKDistance<O, D extends Distance<D>> extends AbstractDatabaseDist
* @author Erich Schubert
*
* @apiviz.uses KNNQuery
+ * @apiviz.exclude
*/
public class Instance<T extends O> extends AbstractDatabaseDistanceQuery<T, D> {
/**
@@ -236,7 +237,8 @@ public class MinKDistance<O, D extends Distance<D>> extends AbstractDatabaseDist
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final IntParameter kP = new IntParameter(K_ID, new GreaterConstraint(1));
+ final IntParameter kP = new IntParameter(K_ID);
+ kP.addConstraint(new GreaterConstraint(1));
if(config.grab(kP)) {
k = kP.getValue();
}
@@ -252,4 +254,4 @@ public class MinKDistance<O, D extends Distance<D>> extends AbstractDatabaseDist
return new MinKDistance<O, D>(parentDistance, k + (objectIsInKNN ? 0 : 1));
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinimumDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinimumDistanceFunction.java
index 2a31a829..a336c126 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinimumDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/MinimumDistanceFunction.java
@@ -37,7 +37,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
* @author Erich Schubert
*/
// TODO: add spatial?
-public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance. Use this.
*/
@@ -55,13 +55,13 @@ public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm im
}
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim = v1.getDimensionality();
if(dim != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString());
}
double min = Double.MAX_VALUE;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double d = Math.abs(v1.doubleValue(i) - v2.doubleValue(i));
min = Math.min(d, min);
}
@@ -69,10 +69,10 @@ public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm im
}
@Override
- public double doubleNorm(NumberVector<?, ?> v) {
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double min = Double.POSITIVE_INFINITY;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
min = Math.min(v.doubleValue(i), min);
}
return min;
@@ -85,7 +85,7 @@ public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm im
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + mbr1.toString() + "\n second argument: " + mbr2.toString());
}
double min = Double.MAX_VALUE;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double min1 = mbr1.getMin(i);
final double max1 = mbr1.getMax(i);
final double min2 = mbr2.getMin(i);
@@ -118,7 +118,7 @@ public class MinimumDistanceFunction extends AbstractVectorDoubleDistanceNorm im
}
@Override
- public <T extends NumberVector<?, ?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/NumberVectorDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/NumberVectorDistanceFunction.java
index 68034672..f548c271 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/NumberVectorDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/NumberVectorDistanceFunction.java
@@ -35,6 +35,6 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
*
* @param <D> Distance type
*/
-public interface NumberVectorDistanceFunction<D extends Distance<D>> extends PrimitiveDistanceFunction<NumberVector<?, ?>, D> {
+public interface NumberVectorDistanceFunction<D extends Distance<D>> extends PrimitiveDistanceFunction<NumberVector<?>, D> {
// Empty - marker interface
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/RandomStableDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/RandomStableDistanceFunction.java
index b54f4e74..e57ae501 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/RandomStableDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/RandomStableDistanceFunction.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction;
import java.util.Random;
import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.utilities.Util;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
@@ -65,7 +66,7 @@ public class RandomStableDistanceFunction extends AbstractDBIDDistanceFunction<D
@Override
public DoubleDistance distance(DBIDRef o1, DBIDRef o2) {
- int c = o1.compareDBID(o2);
+ final int c = DBIDUtil.compare(o1, o2);
if(c == 0) {
return DoubleDistance.FACTORY.nullDistance();
}
@@ -73,7 +74,7 @@ public class RandomStableDistanceFunction extends AbstractDBIDDistanceFunction<D
if(c > 0) {
return distance(o2, o1);
}
- return new DoubleDistance(pseudoRandom(seed, Util.mixHashCodes(o1.getDBID().hashCode(), o2.getDBID().hashCode(), (int) seed)));
+ return new DoubleDistance(pseudoRandom(seed, Util.mixHashCodes(DBIDUtil.deref(o1).hashCode(), DBIDUtil.deref(o2).hashCode(), (int) seed)));
}
/**
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SharedNearestNeighborJaccardDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SharedNearestNeighborJaccardDistanceFunction.java
index 4ccf4163..5ff9a433 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SharedNearestNeighborJaccardDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SharedNearestNeighborJaccardDistanceFunction.java
@@ -25,6 +25,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction;
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.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
@@ -97,7 +98,7 @@ public class SharedNearestNeighborJaccardDistanceFunction<O> extends AbstractInd
DBIDIter iter1 = neighbors1.iter();
DBIDIter iter2 = neighbors2.iter();
while(iter1.valid() && iter2.valid()) {
- final int comp = iter1.compareDBID(iter2);
+ final int comp = DBIDUtil.compare(iter1, iter2);
union++;
if(comp == 0) {
intersection++;
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseEuclideanDistanceFunction.java
index f98ed234..8d68eb1d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseEuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseEuclideanDistanceFunction.java
@@ -49,7 +49,7 @@ public class SparseEuclideanDistanceFunction extends SparseLPNormDistanceFunctio
}
@Override
- public double doubleDistance(SparseNumberVector<?, ?> v1, SparseNumberVector<?, ?> v2) {
+ public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
BitSet b2 = v2.getNotNullMask();
@@ -81,7 +81,7 @@ public class SparseEuclideanDistanceFunction extends SparseLPNormDistanceFunctio
}
@Override
- public double doubleNorm(SparseNumberVector<?, ?> v1) {
+ public double doubleNorm(SparseNumberVector<?> v1) {
double sqrDist = 0;
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseLPNormDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseLPNormDistanceFunction.java
index e552d1e5..b0cbc0dc 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseLPNormDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseLPNormDistanceFunction.java
@@ -40,7 +40,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
* @author Erich Schubert
*/
// TODO: implement SpatialDistanceFunction
-public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunction<SparseNumberVector<?, ?>, DoubleDistance> implements DoubleNorm<SparseNumberVector<?, ?>> {
+public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunction<SparseNumberVector<?>, DoubleDistance> implements DoubleNorm<SparseNumberVector<?>> {
/**
* Keeps the currently set p.
*/
@@ -54,7 +54,7 @@ public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunct
}
@Override
- public double doubleDistance(SparseNumberVector<?, ?> v1, SparseNumberVector<?, ?> v2) {
+ public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
BitSet b2 = v2.getNotNullMask();
@@ -86,7 +86,7 @@ public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunct
}
@Override
- public double doubleNorm(SparseNumberVector<?, ?> v1) {
+ public double doubleNorm(SparseNumberVector<?> v1) {
double sqrDist = 0;
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
@@ -99,12 +99,12 @@ public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunct
}
@Override
- public DoubleDistance norm(SparseNumberVector<?, ?> obj) {
+ public DoubleDistance norm(SparseNumberVector<?> obj) {
return new DoubleDistance(doubleNorm(obj));
}
@Override
- public DoubleDistance distance(SparseNumberVector<?, ?> v1, SparseNumberVector<?, ?> v2) {
+ public DoubleDistance distance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
return new DoubleDistance(doubleDistance(v1, v2));
}
@@ -114,7 +114,7 @@ public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunct
}
@Override
- public SimpleTypeInformation<? super SparseNumberVector<?, ?>> getInputTypeRestriction() {
+ public SimpleTypeInformation<? super SparseNumberVector<?>> getInputTypeRestriction() {
return TypeUtil.SPARSE_VECTOR_VARIABLE_LENGTH;
}
@@ -139,7 +139,8 @@ public class SparseLPNormDistanceFunction extends AbstractPrimitiveDistanceFunct
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- DoubleParameter pP = new DoubleParameter(LPNormDistanceFunction.P_ID, new GreaterConstraint(0));
+ DoubleParameter pP = new DoubleParameter(LPNormDistanceFunction.P_ID);
+ pP.addConstraint(new GreaterConstraint(0));
if(config.grab(pP)) {
p = pP.getValue();
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseManhattanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseManhattanDistanceFunction.java
index 9b8399bf..597dd6ca 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseManhattanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseManhattanDistanceFunction.java
@@ -49,7 +49,7 @@ public class SparseManhattanDistanceFunction extends SparseLPNormDistanceFunctio
}
@Override
- public double doubleDistance(SparseNumberVector<?, ?> v1, SparseNumberVector<?, ?> v2) {
+ public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
BitSet b2 = v2.getNotNullMask();
@@ -79,7 +79,7 @@ public class SparseManhattanDistanceFunction extends SparseLPNormDistanceFunctio
}
@Override
- public double doubleNorm(SparseNumberVector<?, ?> v1) {
+ public double doubleNorm(SparseNumberVector<?> v1) {
double sqrDist = 0;
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseMaximumDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseMaximumDistanceFunction.java
index 1b399e83..720b8017 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseMaximumDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SparseMaximumDistanceFunction.java
@@ -49,7 +49,7 @@ public class SparseMaximumDistanceFunction extends SparseLPNormDistanceFunction
}
@Override
- public double doubleDistance(SparseNumberVector<?, ?> v1, SparseNumberVector<?, ?> v2) {
+ public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
BitSet b2 = v2.getNotNullMask();
@@ -79,7 +79,7 @@ public class SparseMaximumDistanceFunction extends SparseLPNormDistanceFunction
}
@Override
- public double doubleNorm(SparseNumberVector<?, ?> v1) {
+ public double doubleNorm(SparseNumberVector<?> v1) {
double sqrDist = 0;
// Get the bit masks
BitSet b1 = v1.getNotNullMask();
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SquaredEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SquaredEuclideanDistanceFunction.java
index 80edcc09..ff17f388 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SquaredEuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/SquaredEuclideanDistanceFunction.java
@@ -36,7 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Arthur Zimek
*/
-public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistanceNorm implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance. Use this!
*/
@@ -54,10 +54,10 @@ public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistan
}
@Override
- public double doubleNorm(NumberVector<?, ?> v) {
+ public double doubleNorm(NumberVector<?> v) {
final int dim = v.getDimensionality();
double sum = 0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double val = v.doubleValue(i);
sum += val * val;
}
@@ -71,27 +71,27 @@ public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistan
* double value
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
}
double sqrDist = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double delta = v1.doubleValue(i) - v2.doubleValue(i);
sqrDist += delta * delta;
}
return sqrDist;
}
- protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
final int dim = mbr.getDimensionality();
if(dim != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString() + "\n" + dim + "!=" + v.getDimensionality());
}
double sqrDist = 0;
- for(int d = 1; d <= dim; d++) {
+ for(int d = 0; d < dim; d++) {
double value = v.doubleValue(d);
double r;
if(value < mbr.getMin(d)) {
@@ -115,14 +115,14 @@ public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistan
// Some optimizations for simpler cases.
if(mbr1 instanceof NumberVector) {
if(mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
}
else {
- return doubleMinDistObject(mbr2, (NumberVector<?, ?>) mbr1);
+ return doubleMinDistObject(mbr2, (NumberVector<?>) mbr1);
}
}
else if(mbr2 instanceof NumberVector) {
- return doubleMinDistObject(mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleMinDistObject(mbr1, (NumberVector<?>) mbr2);
}
final int dim1 = mbr1.getDimensionality();
if(dim1 != mbr2.getDimensionality()) {
@@ -130,7 +130,7 @@ public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistan
}
double sqrDist = 0;
- for(int d = 1; d <= dim1; d++) {
+ for(int d = 0; d < dim1; d++) {
final double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
@@ -160,7 +160,7 @@ public class SquaredEuclideanDistanceFunction extends AbstractVectorDoubleDistan
}
@Override
- public <T extends NumberVector<?, ?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedDistanceFunction.java
index 046cc3e9..7bd09e97 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedDistanceFunction.java
@@ -58,7 +58,7 @@ public class WeightedDistanceFunction extends AbstractVectorDoubleDistanceFuncti
* @return the Weighted distance between the given two vectors
*/
@Override
- public double doubleDistance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
+ public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) {
assert (o1.getDimensionality() == o2.getDimensionality()) : "Different dimensionality of FeatureVectors" + "\n first argument: " + o1.toString() + "\n second argument: " + o2.toString();
Vector o1_minus_o2 = o1.getColumnVector().minusEquals(o2.getColumnVector());
@@ -66,7 +66,7 @@ public class WeightedDistanceFunction extends AbstractVectorDoubleDistanceFuncti
}
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
- return VectorFieldTypeInformation.get(NumberVector.class, weightMatrix.getColumnDimensionality());
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
+ return new VectorFieldTypeInformation<NumberVector<?>>(NumberVector.class, weightMatrix.getColumnDimensionality());
}
} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
index 38302573..6a76366f 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
@@ -52,7 +52,7 @@ public class WeightedLPNormDistanceFunction extends LPNormDistanceFunction {
}
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim = weights.length;
if(dim != v1.getDimensionality()) {
throw new IllegalArgumentException("Dimensionality of FeatureVector doesn't match weights!");
@@ -63,7 +63,7 @@ public class WeightedLPNormDistanceFunction extends LPNormDistanceFunction {
final double p = getP();
double sqrDist = 0;
- for(int i = 1; i <= dim; i++) {
+ for(int i = 0; i < dim; i++) {
final double delta = Math.abs(v1.doubleValue(i) - v2.doubleValue(i));
sqrDist += Math.pow(delta, p) * weights[i - 1];
}
@@ -75,7 +75,7 @@ public class WeightedLPNormDistanceFunction extends LPNormDistanceFunction {
// Optimization for the simplest case
if(mbr1 instanceof NumberVector) {
if(mbr2 instanceof NumberVector) {
- return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
}
}
// TODO: optimize for more simpler cases: obj vs. rect?
@@ -86,7 +86,7 @@ public class WeightedLPNormDistanceFunction extends LPNormDistanceFunction {
final double p = getP();
double sumDist = 0;
- for(int d = 1; d <= dim1; d++) {
+ for(int d = 0; d < dim1; d++) {
final double m1, m2;
if(mbr1.getMax(d) < mbr2.getMin(d)) {
m1 = mbr2.getMin(d);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedSquaredEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedSquaredEuclideanDistanceFunction.java
index a2944385..e00f8e07 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedSquaredEuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedSquaredEuclideanDistanceFunction.java
@@ -56,13 +56,13 @@ public class WeightedSquaredEuclideanDistanceFunction extends AbstractVectorDoub
* double value
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
}
double sqrDist = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double delta = v1.doubleValue(i) - v2.doubleValue(i);
sqrDist += delta * delta * weights[i - 1];
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java
index 19e80724..74606083 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java
@@ -65,7 +65,7 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista
* {@link de.lmu.ifi.dbs.elki.distance.similarityfunction.FractionalSharedNearestNeighborSimilarityFunction}
* </p>
*/
- public static final OptionID SIMILARITY_FUNCTION_ID = OptionID.getOrCreateOptionID("adapter.similarityfunction", "Similarity function to derive the distance between database objects from.");
+ public static final OptionID SIMILARITY_FUNCTION_ID = new OptionID("adapter.similarityfunction", "Similarity function to derive the distance between database objects from.");
/**
* Holds the similarity function.
@@ -166,7 +166,7 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista
*
* @apiviz.exclude
*/
- public static abstract class Parameterizer<O> extends AbstractParameterizer {
+ public abstract static class Parameterizer<O> extends AbstractParameterizer {
/**
* Holds the similarity function.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterArccos.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterArccos.java
index d1a5aa4a..b77e4a7d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterArccos.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterArccos.java
@@ -30,7 +30,6 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.distance.similarityfunction.NormalizedSimilarityFunction;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
/**
* Adapter from a normalized similarity function to a distance function using
@@ -92,11 +91,6 @@ public class SimilarityAdapterArccos<O> extends AbstractSimilarityAdapter<O> {
*/
public static class Parameterizer<O> extends AbstractSimilarityAdapter.Parameterizer<O> {
@Override
- protected void makeOptions(Parameterization config) {
- super.makeOptions(config);
- }
-
- @Override
protected SimilarityAdapterArccos<O> makeInstance() {
return new SimilarityAdapterArccos<O>(similarityFunction);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLinear.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLinear.java
index e2c0f981..ab7204ce 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLinear.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLinear.java
@@ -30,7 +30,6 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.distance.similarityfunction.NormalizedSimilarityFunction;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
/**
* Adapter from a normalized similarity function to a distance function using
@@ -92,11 +91,6 @@ public class SimilarityAdapterLinear<O> extends AbstractSimilarityAdapter<O> {
*/
public static class Parameterizer<O> extends AbstractSimilarityAdapter.Parameterizer<O> {
@Override
- protected void makeOptions(Parameterization config) {
- super.makeOptions(config);
- }
-
- @Override
protected SimilarityAdapterLinear<O> makeInstance() {
return new SimilarityAdapterLinear<O>(similarityFunction);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLn.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLn.java
index a45b6108..b1b63486 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLn.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/SimilarityAdapterLn.java
@@ -30,7 +30,6 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.distance.similarityfunction.NormalizedSimilarityFunction;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
/**
* Adapter from a normalized similarity function to a distance function using
@@ -92,11 +91,6 @@ public class SimilarityAdapterLn<O> extends AbstractSimilarityAdapter<O> {
*/
public static class Parameterizer<O> extends AbstractSimilarityAdapter.Parameterizer<O> {
@Override
- protected void makeOptions(Parameterization config) {
- super.makeOptions(config);
- }
-
- @Override
protected SimilarityAdapterLn<O> makeInstance() {
return new SimilarityAdapterLn<O>(similarityFunction);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HSBHistogramQuadraticDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HSBHistogramQuadraticDistanceFunction.java
index 4eff8822..771e32f2 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HSBHistogramQuadraticDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HSBHistogramQuadraticDistanceFunction.java
@@ -23,7 +23,6 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.colorhistogram;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-import java.util.ArrayList;
import java.util.List;
import de.lmu.ifi.dbs.elki.distance.distancefunction.WeightedDistanceFunction;
@@ -32,9 +31,9 @@ import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix;
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;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ListGreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ListEachConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ListSizeConstraint;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ParameterConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntListParameter;
@@ -56,7 +55,7 @@ public class HSBHistogramQuadraticDistanceFunction extends WeightedDistanceFunct
/**
* Parameter for the kernel dimensionality.
*/
- public static final OptionID BPP_ID = OptionID.getOrCreateOptionID("hsbhist.bpp", "The dimensionality of the histogram in hue, saturation and brightness.");
+ public static final OptionID BPP_ID = new OptionID("hsbhist.bpp", "The dimensionality of the histogram in hue, saturation and brightness.");
/**
* Constructor.
@@ -131,10 +130,9 @@ public class HSBHistogramQuadraticDistanceFunction extends WeightedDistanceFunct
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final List<ParameterConstraint<List<Integer>>> bppConstraints = new ArrayList<ParameterConstraint<List<Integer>>>(2);
- bppConstraints.add(new ListSizeConstraint<Integer>(3));
- bppConstraints.add(new ListGreaterEqualConstraint<Integer>(1));
- IntListParameter param = new IntListParameter(BPP_ID, bppConstraints, false);
+ IntListParameter param = new IntListParameter(BPP_ID);
+ param.addConstraint(new ListSizeConstraint(3));
+ param.addConstraint(new ListEachConstraint<Integer>(new GreaterEqualConstraint(1)));
if(config.grab(param)) {
List<Integer> quant = param.getValue();
assert (quant.size() == 3);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HistogramIntersectionDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HistogramIntersectionDistanceFunction.java
index 6ed8e744..2f38f68b 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HistogramIntersectionDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/HistogramIntersectionDistanceFunction.java
@@ -48,7 +48,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
@Title("Color histogram intersection distance")
@Description("Distance function for color histograms that emphasizes 'strong' bins.")
@Reference(authors = "M. J. Swain, D. H. Ballard", title = "Color Indexing", booktitle = "International Journal of Computer Vision, 7(1), 32, 1991")
-public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Static instance
*/
@@ -70,7 +70,7 @@ public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleD
}
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int dim1 = v1.getDimensionality();
if(dim1 != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n" + v1.getDimensionality() + "!=" + v2.getDimensionality());
@@ -78,7 +78,7 @@ public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleD
double dist = 0;
double norm1 = 0;
double norm2 = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double val1 = v1.doubleValue(i);
final double val2 = v2.doubleValue(i);
dist += Math.min(val1, val2);
@@ -98,7 +98,7 @@ public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleD
double dist = 0;
double norm1 = 0;
double norm2 = 0;
- for(int i = 1; i <= dim1; i++) {
+ for(int i = 0; i < dim1; i++) {
final double min1 = mbr1.getMin(i);
final double max1 = mbr1.getMax(i);
final double min2 = mbr2.getMin(i);
@@ -112,7 +112,7 @@ public class HistogramIntersectionDistanceFunction extends AbstractVectorDoubleD
}
@Override
- public <T extends NumberVector<?, ?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ public <T extends NumberVector<?>> SpatialDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/RGBHistogramQuadraticDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/RGBHistogramQuadraticDistanceFunction.java
index 5ba02e17..09dfa124 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/RGBHistogramQuadraticDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/colorhistogram/RGBHistogramQuadraticDistanceFunction.java
@@ -51,7 +51,7 @@ public class RGBHistogramQuadraticDistanceFunction extends WeightedDistanceFunct
/**
* Parameter for the kernel dimensionality.
*/
- public static final OptionID BPP_ID = OptionID.getOrCreateOptionID("rgbhist.bpp", "The dimensionality of the histogram in each color");
+ public static final OptionID BPP_ID = new OptionID("rgbhist.bpp", "The dimensionality of the histogram in each color");
/**
* Constructor.
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/ERiCDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/ERiCDistanceFunction.java
index 25766a91..55fd0e72 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/ERiCDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/ERiCDistanceFunction.java
@@ -33,7 +33,6 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.BitDistance;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.index.preprocessed.localpca.FilteredLocalPCAIndex;
import de.lmu.ifi.dbs.elki.index.preprocessed.localpca.KNNQueryFilteredPCAIndex;
-import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix;
import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector;
import de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCAFilteredResult;
@@ -50,12 +49,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
*
* @apiviz.has Instance
*/
-public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, BitDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, BitDistance> {
- /**
- * Logger for debug.
- */
- static Logging logger = Logging.getLogger(PCABasedCorrelationDistanceFunction.class);
-
+public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, BitDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, BitDistance> {
/**
* Parameter to specify the threshold for approximate linear dependency: the
* strong eigenvectors of q are approximately linear dependent from the strong
@@ -69,7 +63,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
* Key: {@code -ericdf.delta}
* </p>
*/
- public static final OptionID DELTA_ID = OptionID.getOrCreateOptionID("ericdf.delta", "Threshold for approximate linear dependency: " + "the strong eigenvectors of q are approximately linear dependent " + "from the strong eigenvectors p if the following condition " + "holds for all stroneg eigenvectors q_i of q (lambda_q < lambda_p): " + "q_i' * M^check_p * q_i <= delta^2.");
+ public static final OptionID DELTA_ID = new OptionID("ericdf.delta", "Threshold for approximate linear dependency: " + "the strong eigenvectors of q are approximately linear dependent " + "from the strong eigenvectors p if the following condition " + "holds for all stroneg eigenvectors q_i of q (lambda_q < lambda_p): " + "q_i' * M^check_p * q_i <= delta^2.");
/**
* Parameter to specify the threshold for the maximum distance between two
@@ -83,7 +77,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
* Key: {@code -ericdf.tau}
* </p>
*/
- public static final OptionID TAU_ID = OptionID.getOrCreateOptionID("ericdf.tau", "Threshold for the maximum distance between two approximately linear " + "dependent subspaces of two objects p and q " + "(lambda_q < lambda_p) before considering them as parallel.");
+ public static final OptionID TAU_ID = new OptionID("ericdf.tau", "Threshold for the maximum distance between two approximately linear " + "dependent subspaces of two objects p and q " + "(lambda_q < lambda_p) before considering them as parallel.");
/**
* Holds the value of {@link #DELTA_ID}.
@@ -102,7 +96,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
* @param delta Delta parameter
* @param tau Tau parameter
*/
- public ERiCDistanceFunction(IndexFactory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>> indexFactory, double delta, double tau) {
+ public ERiCDistanceFunction(IndexFactory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>> indexFactory, double delta, double tau) {
super(indexFactory);
this.delta = delta;
this.tau = tau;
@@ -114,11 +108,11 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
}
@Override
- public <T extends NumberVector<?, ?>> Instance<T> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> Instance<T> instantiate(Relation<T> database) {
// We can't really avoid these warnings, due to a limitation in Java
// Generics (AFAICT)
@SuppressWarnings("unchecked")
- FilteredLocalPCAIndex<T> indexinst = (FilteredLocalPCAIndex<T>) indexFactory.instantiate((Relation<NumberVector<?, ?>>) database);
+ FilteredLocalPCAIndex<T> indexinst = (FilteredLocalPCAIndex<T>) indexFactory.instantiate((Relation<NumberVector<?>>) database);
return new Instance<T>(database, indexinst, this, delta, tau);
}
@@ -135,14 +129,14 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
private boolean approximatelyLinearDependent(PCAFilteredResult pca1, PCAFilteredResult pca2) {
Matrix m1_czech = pca1.dissimilarityMatrix();
Matrix v2_strong = pca2.adapatedStrongEigenvectors();
- for(int i = 0; i < v2_strong.getColumnDimensionality(); i++) {
+ for (int i = 0; i < v2_strong.getColumnDimensionality(); i++) {
Vector v2_i = v2_strong.getCol(i);
// check, if distance of v2_i to the space of pca_1 > delta
// (i.e., if v2_i spans up a new dimension)
double dist = Math.sqrt(v2_i.transposeTimes(v2_i) - v2_i.transposeTimesTimes(m1_czech, v2_i));
// if so, return false
- if(dist > delta) {
+ if (dist > delta) {
return false;
}
}
@@ -162,37 +156,35 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
* @return the distance between two given DatabaseObjects according to this
* distance function
*/
- public BitDistance distance(NumberVector<?, ?> v1, NumberVector<?, ?> v2, PCAFilteredResult pca1, PCAFilteredResult pca2) {
- if(pca1.getCorrelationDimension() < pca2.getCorrelationDimension()) {
+ public BitDistance distance(NumberVector<?> v1, NumberVector<?> v2, PCAFilteredResult pca1, PCAFilteredResult pca2) {
+ if (pca1.getCorrelationDimension() < pca2.getCorrelationDimension()) {
throw new IllegalStateException("pca1.getCorrelationDimension() < pca2.getCorrelationDimension(): " + pca1.getCorrelationDimension() + " < " + pca2.getCorrelationDimension());
}
boolean approximatelyLinearDependent;
- if(pca1.getCorrelationDimension() == pca2.getCorrelationDimension()) {
+ if (pca1.getCorrelationDimension() == pca2.getCorrelationDimension()) {
approximatelyLinearDependent = approximatelyLinearDependent(pca1, pca2) && approximatelyLinearDependent(pca2, pca1);
- }
- else {
+ } else {
approximatelyLinearDependent = approximatelyLinearDependent(pca1, pca2);
}
- if(!approximatelyLinearDependent) {
+ if (!approximatelyLinearDependent) {
return new BitDistance(true);
}
else {
double affineDistance;
- if(pca1.getCorrelationDimension() == pca2.getCorrelationDimension()) {
+ if (pca1.getCorrelationDimension() == pca2.getCorrelationDimension()) {
WeightedDistanceFunction df1 = new WeightedDistanceFunction(pca1.similarityMatrix());
WeightedDistanceFunction df2 = new WeightedDistanceFunction(pca2.similarityMatrix());
affineDistance = Math.max(df1.distance(v1, v2).doubleValue(), df2.distance(v1, v2).doubleValue());
- }
- else {
+ } else {
WeightedDistanceFunction df1 = new WeightedDistanceFunction(pca1.similarityMatrix());
affineDistance = df1.distance(v1, v2).doubleValue();
}
- if(affineDistance > tau) {
+ if (affineDistance > tau) {
return new BitDistance(true);
}
@@ -202,7 +194,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
if (!this.getClass().equals(obj.getClass())) {
@@ -217,7 +209,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
*
* @author Erich Schubert
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, BitDistance, ERiCDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, BitDistance> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, BitDistance, ERiCDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, BitDistance> {
/**
* Holds the value of {@link #DELTA_ID}.
*/
@@ -264,7 +256,7 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
*
* @apiviz.exclude
*/
- public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<IndexFactory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>>> {
+ public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<IndexFactory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>>> {
double delta = 0.0;
double tau = 0.0;
@@ -274,14 +266,16 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
super.makeOptions(config);
configIndexFactory(config, FilteredLocalPCAIndex.Factory.class, KNNQueryFilteredPCAIndex.Factory.class);
- final DoubleParameter deltaP = new DoubleParameter(DELTA_ID, new GreaterEqualConstraint(0), 0.1);
- if(config.grab(deltaP)) {
- delta = deltaP.getValue();
+ final DoubleParameter deltaP = new DoubleParameter(DELTA_ID, 0.1);
+ deltaP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(deltaP)) {
+ delta = deltaP.doubleValue();
}
- final DoubleParameter tauP = new DoubleParameter(TAU_ID, new GreaterEqualConstraint(0), 0.1);
- if(config.grab(tauP)) {
- tau = tauP.getValue();
+ final DoubleParameter tauP = new DoubleParameter(TAU_ID, 0.1);
+ tauP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(tauP)) {
+ tau = tauP.doubleValue();
}
}
@@ -290,4 +284,4 @@ public class ERiCDistanceFunction extends AbstractIndexBasedDistanceFunction<Num
return new ERiCDistanceFunction(factory, delta, tau);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PCABasedCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PCABasedCorrelationDistanceFunction.java
index 083fc013..20f96a29 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PCABasedCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PCABasedCorrelationDistanceFunction.java
@@ -32,7 +32,6 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.PCACorrelationDistance;
import de.lmu.ifi.dbs.elki.index.IndexFactory;
import de.lmu.ifi.dbs.elki.index.preprocessed.localpca.FilteredLocalPCAIndex;
import de.lmu.ifi.dbs.elki.index.preprocessed.localpca.KNNQueryFilteredPCAIndex;
-import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix;
import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector;
import de.lmu.ifi.dbs.elki.math.linearalgebra.pca.PCAFilteredResult;
@@ -48,12 +47,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
*
* @apiviz.has Instance
*/
-public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, PCACorrelationDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, PCACorrelationDistance> {
- /**
- * Logger for debug.
- */
- static Logging logger = Logging.getLogger(PCABasedCorrelationDistanceFunction.class);
-
+public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, PCACorrelationDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, PCACorrelationDistance> {
/**
* Parameter to specify the threshold of a distance between a vector q and a
* given space that indicates that q adds a new dimension to the space, must
@@ -65,7 +59,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
* Key: {@code -pcabasedcorrelationdf.delta}
* </p>
*/
- public static final OptionID DELTA_ID = OptionID.getOrCreateOptionID("pcabasedcorrelationdf.delta", "Threshold of a distance between a vector q and a given space that indicates that " + "q adds a new dimension to the space.");
+ public static final OptionID DELTA_ID = new OptionID("pcabasedcorrelationdf.delta", "Threshold of a distance between a vector q and a given space that indicates that " + "q adds a new dimension to the space.");
/**
* Holds the value of {@link #DELTA_ID}.
@@ -78,7 +72,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
* @param indexFactory index factory
* @param delta Delta parameter
*/
- public PCABasedCorrelationDistanceFunction(IndexFactory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>> indexFactory, double delta) {
+ public PCABasedCorrelationDistanceFunction(IndexFactory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>> indexFactory, double delta) {
super(indexFactory);
this.delta = delta;
}
@@ -89,20 +83,20 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
}
@Override
- public <T extends NumberVector<?, ?>> Instance<T> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> Instance<T> instantiate(Relation<T> database) {
// We can't really avoid these warnings, due to a limitation in Java
// Generics (AFAICT)
@SuppressWarnings("unchecked")
- FilteredLocalPCAIndex<T> indexinst = (FilteredLocalPCAIndex<T>) indexFactory.instantiate((Relation<NumberVector<?, ?>>) database);
+ FilteredLocalPCAIndex<T> indexinst = (FilteredLocalPCAIndex<T>) indexFactory.instantiate((Relation<NumberVector<?>>) database);
return new Instance<T>(database, indexinst, delta, this);
}
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(!this.getClass().equals(obj.getClass())) {
+ if (!this.getClass().equals(obj.getClass())) {
return false;
}
PCABasedCorrelationDistanceFunction other = (PCABasedCorrelationDistanceFunction) obj;
@@ -114,7 +108,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
*
* @author Erich Schubert
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, PCACorrelationDistance, PCABasedCorrelationDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, PCACorrelationDistance> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, PCACorrelationDistance, PCABasedCorrelationDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, PCACorrelationDistance> {
/**
* Delta value
*/
@@ -172,7 +166,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
// for all strong eigenvectors of rv2
Matrix m1_czech = pca1.dissimilarityMatrix();
- for(int i = 0; i < v2_strong.getColumnDimensionality(); i++) {
+ for (int i = 0; i < v2_strong.getColumnDimensionality(); i++) {
Vector v2_i = v2_strong.getCol(i);
// check, if distance of v2_i to the space of rv1 > delta
// (i.e., if v2_i spans up a new dimension)
@@ -180,7 +174,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
// if so, insert v2_i into v1 and adjust v1
// and compute m1_czech new, increase lambda1
- if(lambda1 < dimensionality && dist > delta) {
+ if (lambda1 < dimensionality && dist > delta) {
adjust(v1, e1_czech, v2_i, lambda1++);
m1_czech = v1.times(e1_czech).timesTranspose(v1);
}
@@ -188,7 +182,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
// for all strong eigenvectors of rv1
Matrix m2_czech = pca2.dissimilarityMatrix();
- for(int i = 0; i < v1_strong.getColumnDimensionality(); i++) {
+ for (int i = 0; i < v1_strong.getColumnDimensionality(); i++) {
Vector v1_i = v1_strong.getCol(i);
// check, if distance of v1_i to the space of rv2 > delta
// (i.e., if v1_i spans up a new dimension)
@@ -196,7 +190,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
// if so, insert v1_i into v2 and adjust v2
// and compute m2_czech new , increase lambda2
- if(lambda2 < dimensionality && dist > delta) {
+ if (lambda2 < dimensionality && dist > delta) {
adjust(v2, e2_czech, v1_i, lambda2++);
m2_czech = v2.times(e2_czech).timesTranspose(v2);
}
@@ -237,7 +231,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
// normalize v
Vector v_i = vector.copy();
Vector sum = new Vector(dim);
- for(int k = 0; k < corrDim; k++) {
+ for (int k = 0; k < corrDim; k++) {
Vector v_k = v.getCol(k);
sum.plusTimesEquals(v_k, v_i.transposeTimes(v_k));
}
@@ -254,12 +248,12 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
* @return the Euclidean distance between the given two vectors
*/
private double euclideanDistance(V dv1, V dv2) {
- if(dv1.getDimensionality() != dv2.getDimensionality()) {
+ if (dv1.getDimensionality() != dv2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n first argument: " + dv1.toString() + "\n second argument: " + dv2.toString());
}
double sqrDist = 0;
- for(int i = 1; i <= dv1.getDimensionality(); i++) {
+ for (int i = 0; i < dv1.getDimensionality(); i++) {
double manhattanI = dv1.doubleValue(i) - dv2.doubleValue(i);
sqrDist += manhattanI * manhattanI;
}
@@ -274,7 +268,7 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
*
* @apiviz.exclude
*/
- public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<FilteredLocalPCAIndex.Factory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>>> {
+ public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<FilteredLocalPCAIndex.Factory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>>> {
protected double delta = 0.0;
@Override
@@ -282,9 +276,10 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
super.makeOptions(config);
configIndexFactory(config, FilteredLocalPCAIndex.Factory.class, KNNQueryFilteredPCAIndex.Factory.class);
- final DoubleParameter param = new DoubleParameter(DELTA_ID, new GreaterEqualConstraint(0), 0.25);
- if(config.grab(param)) {
- delta = param.getValue();
+ final DoubleParameter param = new DoubleParameter(DELTA_ID, 0.25);
+ param.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(param)) {
+ delta = param.doubleValue();
}
}
@@ -293,4 +288,4 @@ public class PCABasedCorrelationDistanceFunction extends AbstractIndexBasedDista
return new PCABasedCorrelationDistanceFunction(factory, delta);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PearsonCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PearsonCorrelationDistanceFunction.java
index a618ae36..1ba14af2 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PearsonCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/PearsonCorrelationDistanceFunction.java
@@ -72,7 +72,7 @@ public class PearsonCorrelationDistanceFunction extends AbstractVectorDoubleDist
* and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
return 1 - MathUtil.pearsonCorrelationCoefficient(v1, v2);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/SquaredPearsonCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/SquaredPearsonCorrelationDistanceFunction.java
index 86d822d3..b4f8a3bd 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/SquaredPearsonCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/SquaredPearsonCorrelationDistanceFunction.java
@@ -74,7 +74,7 @@ public class SquaredPearsonCorrelationDistanceFunction extends AbstractVectorDou
* vectors v1 and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final double pcc = MathUtil.pearsonCorrelationCoefficient(v1, v2);
return 1 - pcc * pcc;
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedPearsonCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedPearsonCorrelationDistanceFunction.java
index 01e41f1b..fa1196fe 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedPearsonCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedPearsonCorrelationDistanceFunction.java
@@ -76,7 +76,7 @@ public class WeightedPearsonCorrelationDistanceFunction extends AbstractVectorDo
* and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
return 1 - MathUtil.weightedPearsonCorrelationCoefficient(v1, v2, weights);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedSquaredPearsonCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedSquaredPearsonCorrelationDistanceFunction.java
index 8b5ecd98..141229f6 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedSquaredPearsonCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/correlation/WeightedSquaredPearsonCorrelationDistanceFunction.java
@@ -78,7 +78,7 @@ public class WeightedSquaredPearsonCorrelationDistanceFunction extends AbstractV
* vectors v1 and v2
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final double pcc = MathUtil.weightedPearsonCorrelationCoefficient(v1, v2, weights);
return 1 - pcc * pcc;
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedDoubleDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedDoubleDistanceFunction.java
index 9e865039..a7ddb1ad 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedDoubleDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedDoubleDistanceFunction.java
@@ -27,6 +27,7 @@ import java.io.File;
import java.io.IOException;
import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDBIDDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.persistent.OnDiskUpperTriangleMatrix;
@@ -56,7 +57,7 @@ public class DiskCacheBasedDoubleDistanceFunction extends AbstractDBIDDistanceFu
* Key: {@code -distance.matrix}
* </p>
*/
- public static final OptionID MATRIX_ID = OptionID.getOrCreateOptionID("distance.matrix", "The name of the file containing the distance matrix.");
+ public static final OptionID MATRIX_ID = new OptionID("distance.matrix", "The name of the file containing the distance matrix.");
/**
* Magic to identify double cache matrices
@@ -101,17 +102,19 @@ public class DiskCacheBasedDoubleDistanceFunction extends AbstractDBIDDistanceFu
if(id2 == null) {
return getDistanceFactory().undefinedDistance();
}
- if(id1.getIntegerID() < 0 || id2.getIntegerID() < 0) {
+ final int intid1 = DBIDUtil.asInteger(id1);
+ final int intid2 = DBIDUtil.asInteger(id2);
+ if(intid1 < 0 || intid2 < 0) {
throw new AbortException("Negative DBIDs not supported in OnDiskCache");
}
// the smaller id is the first key
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if(intid1 > intid2) {
return distance(id2, id1);
}
double distance;
try {
- distance = cache.getRecordBuffer(id1.getIntegerID(), id2.getIntegerID()).getDouble();
+ distance = cache.getRecordBuffer(intid1, intid2).getDouble();
}
catch(IOException e) {
throw new RuntimeException("Read error when loading distance " + id1 + "," + id2 + " from cache file.", e);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java
index df29c280..23da36b2 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java
@@ -27,6 +27,7 @@ import java.io.File;
import java.io.IOException;
import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDBIDDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.FloatDistance;
import de.lmu.ifi.dbs.elki.persistent.OnDiskUpperTriangleMatrix;
@@ -56,7 +57,7 @@ public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFun
* Key: {@code -distance.matrix}
* </p>
*/
- public static final OptionID MATRIX_ID = OptionID.getOrCreateOptionID("distance.matrix", "The name of the file containing the distance matrix.");
+ public static final OptionID MATRIX_ID = new OptionID("distance.matrix", "The name of the file containing the distance matrix.");
/**
* Magic to identify double cache matrices
@@ -101,17 +102,19 @@ public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFun
if(id2 == null) {
return getDistanceFactory().undefinedDistance();
}
- if(id1.getIntegerID() < 0 || id2.getIntegerID() < 0) {
+ final int intid1 = DBIDUtil.asInteger(id1);
+ final int intid2 = DBIDUtil.asInteger(id2);
+ if(intid1 < 0 || intid2 < 0) {
throw new AbortException("Negative DBIDs not supported in OnDiskCache");
}
// the smaller id is the first key
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if(intid1 > intid2) {
return distance(id2, id1);
}
float distance;
try {
- distance = cache.getRecordBuffer(id1.getIntegerID(), id2.getIntegerID()).getFloat();
+ distance = cache.getRecordBuffer(intid1, intid2).getFloat();
}
catch(IOException e) {
throw new RuntimeException("Read error when loading distance " + id1 + "," + id2 + " from cache file.", e);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParser.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParser.java
index 93874eaf..c332670a 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParser.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParser.java
@@ -41,7 +41,7 @@ public interface DistanceParser<D extends Distance<D>> {
/**
* Parameter for distance function.
*/
- public static final OptionID DISTANCE_ID = OptionID.getOrCreateOptionID("parser.distance", "Distance type used for parsing values.");
+ public static final OptionID DISTANCE_ID = new OptionID("parser.distance", "Distance type used for parsing values.");
/**
* Returns a list of the objects parsed from the specified input stream
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParsingResult.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParsingResult.java
index 1fc15b52..916451c0 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParsingResult.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DistanceParsingResult.java
@@ -25,13 +25,13 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.external;
import java.util.Map;
-import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle;
import de.lmu.ifi.dbs.elki.database.ids.DBIDPair;
import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
/**
- * Provides a list of database objects and labels associated with these objects
- * and a cache of precomputed distances between the database objects.
+ * Provides a cache of precomputed distances between the database objects.
+ *
+ * TODO: this class needs to reworked.
*
* @author Elke Achtert
*
@@ -42,23 +42,15 @@ public class DistanceParsingResult<D extends Distance<D>> {
* The cache of precomputed distances between the database objects.
*/
private final Map<DBIDPair, D> distanceCache;
-
- /**
- * Objects representation (DBIDs and/or external IDs)
- */
- private MultipleObjectsBundle objects;
/**
* Provides a list of database objects, a list of label objects associated
* with these objects and cached distances between these objects.
*
- * @param objectAndLabelList the list of database objects and labels
- * associated with these objects
* @param distanceCache the cache of precomputed distances between the
* database objects
*/
- public DistanceParsingResult(MultipleObjectsBundle objectAndLabelList, Map<DBIDPair, D> distanceCache) {
- this.objects = objectAndLabelList;
+ public DistanceParsingResult(Map<DBIDPair, D> distanceCache) {
this.distanceCache = distanceCache;
}
@@ -70,13 +62,4 @@ public class DistanceParsingResult<D extends Distance<D>> {
public Map<DBIDPair, D> getDistanceCache() {
return distanceCache;
}
-
- /**
- * Get the objects
- *
- * @return the objects bundle
- */
- public MultipleObjectsBundle getObjects() {
- return objects;
- }
} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedDoubleDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedDoubleDistanceFunction.java
index e8f379cd..5489a241 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedDoubleDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedDoubleDistanceFunction.java
@@ -23,6 +23,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.external;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -32,8 +33,6 @@ import java.util.Map;
import de.lmu.ifi.dbs.elki.database.ids.DBIDPair;
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.ModifiableDBIDs;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDBIDDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.utilities.FileUtil;
@@ -52,6 +51,8 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
* Provides a DistanceFunction that is based on double distances given by a
* distance matrix of an external file.
*
+ * See {@link NumberDistanceParser} for the default input format.
+ *
* @author Elke Achtert
*/
@Title("File based double distance for database objects.")
@@ -63,7 +64,7 @@ public class FileBasedDoubleDistanceFunction extends AbstractDBIDDistanceFunctio
* Key: {@code -distance.matrix}
* </p>
*/
- public static final OptionID MATRIX_ID = OptionID.getOrCreateOptionID("distance.matrix", "The name of the file containing the distance matrix.");
+ public static final OptionID MATRIX_ID = new OptionID("distance.matrix", "The name of the file containing the distance matrix.");
/**
* Optional parameter to specify the parsers to provide a database, must
@@ -73,7 +74,7 @@ public class FileBasedDoubleDistanceFunction extends AbstractDBIDDistanceFunctio
* Key: {@code -distance.parser}
* </p>
*/
- public static final OptionID PARSER_ID = OptionID.getOrCreateOptionID("distance.parser", "Parser used to load the distance matrix.");
+ public static final OptionID PARSER_ID = new OptionID("distance.parser", "Parser used to load the distance matrix.");
/**
* The distance cache
@@ -115,33 +116,23 @@ public class FileBasedDoubleDistanceFunction extends AbstractDBIDDistanceFunctio
return getDistanceFactory().undefinedDistance();
}
// the smaller id is the first key
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if(DBIDUtil.compare(id1, id2) > 0) {
return distance(id2, id1);
}
- return cache.get(DBIDUtil.newPair(id1, id2));
+ DoubleDistance ret = cache.get(DBIDUtil.newPair(id1, id2));
+ if (ret == null && DBIDUtil.equal(id1, id2)) {
+ return DoubleDistance.ZERO_DISTANCE;
+ }
+ return ret;
}
private void loadCache(DistanceParser<DoubleDistance> parser, File matrixfile) throws IOException {
- InputStream in = FileUtil.tryGzipInput(new FileInputStream(matrixfile));
+ InputStream in = new BufferedInputStream(FileUtil.tryGzipInput(new FileInputStream(matrixfile)));
DistanceParsingResult<DoubleDistance> res = parser.parse(in);
cache = res.getDistanceCache();
}
- /**
- * Return a collection of all IDs in the cache.
- *
- * @return Collection of all IDs in the cache.
- */
- public DBIDs getIDs() {
- ModifiableDBIDs ids = DBIDUtil.newHashSet();
- for(DBIDPair pair : cache.keySet()) {
- ids.add(pair.getFirst());
- ids.add(pair.getSecond());
- }
- return ids;
- }
-
@Override
public DoubleDistance getDistanceFactory() {
return DoubleDistance.FACTORY;
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedFloatDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedFloatDistanceFunction.java
index 675a46f3..520c1f76 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedFloatDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/FileBasedFloatDistanceFunction.java
@@ -23,6 +23,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.external;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -50,6 +51,8 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
* Provides a DistanceFunction that is based on float distances given by a
* distance matrix of an external file.
*
+ * See {@link NumberDistanceParser} for the default input format.
+ *
* @author Elke Achtert
*/
@Title("File based float distance for database objects.")
@@ -61,7 +64,7 @@ public class FileBasedFloatDistanceFunction extends AbstractDBIDDistanceFunction
* Key: {@code -distance.matrix}
* </p>
*/
- public static final OptionID MATRIX_ID = OptionID.getOrCreateOptionID("distance.matrix", "The name of the file containing the distance matrix.");
+ public static final OptionID MATRIX_ID = new OptionID("distance.matrix", "The name of the file containing the distance matrix.");
/**
* Optional parameter to specify the parsers to provide a database, must
@@ -71,7 +74,7 @@ public class FileBasedFloatDistanceFunction extends AbstractDBIDDistanceFunction
* Key: {@code -distance.parser}
* </p>
*/
- public static final OptionID PARSER_ID = OptionID.getOrCreateOptionID("distance.parser", "Parser used to load the distance matrix.");
+ public static final OptionID PARSER_ID = new OptionID("distance.parser", "Parser used to load the distance matrix.");
/**
* The distance cache
@@ -113,15 +116,18 @@ public class FileBasedFloatDistanceFunction extends AbstractDBIDDistanceFunction
return getDistanceFactory().undefinedDistance();
}
// the smaller id is the first key
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if(DBIDUtil.compare(id1, id2) > 0) {
return distance(id2, id1);
}
-
- return cache.get(DBIDUtil.newPair(id1, id2));
+ FloatDistance ret = cache.get(DBIDUtil.newPair(id1, id2));
+ if (ret == null && DBIDUtil.equal(id1, id2)) {
+ return FloatDistance.ZERO_DISTANCE;
+ }
+ return ret;
}
private void loadCache(DistanceParser<FloatDistance> parser, File matrixfile) throws IOException {
- InputStream in = FileUtil.tryGzipInput(new FileInputStream(matrixfile));
+ InputStream in = new BufferedInputStream(FileUtil.tryGzipInput(new FileInputStream(matrixfile)));
DistanceParsingResult<FloatDistance> res = parser.parse(in);
cache = res.getDistanceCache();
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/NumberDistanceParser.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/NumberDistanceParser.java
index 3af02ac3..82cc5b27 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/NumberDistanceParser.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/NumberDistanceParser.java
@@ -27,24 +27,22 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
-import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
import de.lmu.ifi.dbs.elki.database.ids.DBID;
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDPair;
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.ModifiableDBIDs;
-import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle;
import de.lmu.ifi.dbs.elki.datasource.parser.AbstractParser;
import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.logging.Logging;
+import de.lmu.ifi.dbs.elki.logging.progress.IndefiniteProgress;
import de.lmu.ifi.dbs.elki.utilities.documentation.Description;
import de.lmu.ifi.dbs.elki.utilities.documentation.Title;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
@@ -69,7 +67,7 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
/**
* The logger for this class.
*/
- private static final Logging logger = Logging.getLogger(NumberDistanceParser.class);
+ private static final Logging LOG = Logging.getLogger(NumberDistanceParser.class);
/**
* The distance function.
@@ -79,8 +77,8 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
/**
* Constructor.
*
- * @param colSep
- * @param quoteChar
+ * @param colSep Column separator pattern
+ * @param quoteChar Quote character
* @param distanceFactory Distance factory to use
*/
public NumberDistanceParser(Pattern colSep, char quoteChar, D distanceFactory) {
@@ -93,32 +91,30 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
int lineNumber = 0;
+ IndefiniteProgress prog = LOG.isVerbose() ? new IndefiniteProgress("Parsing distance matrix", LOG) : null;
ModifiableDBIDs ids = DBIDUtil.newHashSet();
Map<DBIDPair, D> distanceCache = new HashMap<DBIDPair, D>();
try {
- for(String line; (line = reader.readLine()) != null; lineNumber++) {
- if(lineNumber % 10000 == 0 && logger.isDebugging()) {
- logger.debugFine("parse " + lineNumber / 10000);
- // logger.fine("parse " + lineNumber / 10000);
+ for (String line; (line = reader.readLine()) != null; lineNumber++) {
+ if (prog != null) {
+ prog.incrementProcessed(LOG);
}
- if(!line.startsWith(COMMENT) && line.length() > 0) {
+ if (!line.startsWith(COMMENT) && line.length() > 0) {
List<String> entries = tokenize(line);
- if(entries.size() != 3) {
+ if (entries.size() != 3) {
throw new IllegalArgumentException("Line " + lineNumber + " does not have the " + "required input format: id1 id2 distanceValue! " + line);
}
DBID id1, id2;
try {
id1 = DBIDUtil.importInteger(Integer.parseInt(entries.get(0)));
- }
- catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
throw new IllegalArgumentException("Error in line " + lineNumber + ": id1 is no integer!");
}
try {
id2 = DBIDUtil.importInteger(Integer.parseInt(entries.get(1)));
- }
- catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
throw new IllegalArgumentException("Error in line " + lineNumber + ": id2 is no integer!");
}
@@ -127,44 +123,31 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
put(id1, id2, distance, distanceCache);
ids.add(id1);
ids.add(id2);
- }
- catch(IllegalArgumentException e) {
+ } catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Error in line " + lineNumber + ":" + e.getMessage(), e);
}
}
}
- }
- catch(IOException e) {
+ } catch (IOException e) {
throw new IllegalArgumentException("Error while parsing line " + lineNumber + ".");
}
- if(logger.isDebugging()) {
- logger.debugFine("check");
+ if (prog != null) {
+ prog.setCompleted(LOG);
}
// check if all distance values are specified
for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
for (DBIDIter iter2 = ids.iter(); iter2.valid(); iter2.advance()) {
- if(iter2.getIntegerID() < iter.getIntegerID()) {
+ if (DBIDUtil.compare(iter2, iter) <= 0) {
continue;
}
- if(!containsKey(iter, iter2, distanceCache)) {
- throw new IllegalArgumentException("Distance value for " + iter.getDBID() + " - " + iter2.getDBID() + " is missing!");
+ if (!containsKey(iter, iter2, distanceCache)) {
+ throw new IllegalArgumentException("Distance value for " + DBIDUtil.toString(iter) + " - " + DBIDUtil.toString(iter2) + " is missing!");
}
}
}
-
- if(logger.isDebugging()) {
- logger.debugFine("add to objectAndLabelsList");
- }
-
- // This is unusual for ELKI, but here we really need an ArrayList, not a
- // DBIDs object. So convert.
- List<DBID> objects = new ArrayList<DBID>(ids.size());
- for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
- objects.add(iter.getDBID());
- }
- return new DistanceParsingResult<D>(MultipleObjectsBundle.makeSimple(TypeUtil.DBID, objects), distanceCache);
+ return new DistanceParsingResult<D>(distanceCache);
}
/**
@@ -177,14 +160,14 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
*/
private void put(DBID id1, DBID id2, D distance, Map<DBIDPair, D> cache) {
// the smaller id is the first key
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if (DBIDUtil.compare(id1, id2) > 0) {
put(id2, id1, distance, cache);
return;
}
D oldDistance = cache.put(DBIDUtil.newPair(id1, id2), distance);
- if(oldDistance != null) {
+ if (oldDistance != null) {
throw new IllegalArgumentException("Distance value for specified ids is already assigned!");
}
}
@@ -200,7 +183,7 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
* specified ids, false otherwise
*/
public boolean containsKey(DBIDRef id1, DBIDRef id2, Map<DBIDPair, D> cache) {
- if(id1.getIntegerID() > id2.getIntegerID()) {
+ if (DBIDUtil.compare(id1, id2) > 0) {
return containsKey(id2, id1, cache);
}
@@ -209,7 +192,7 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
@Override
protected Logging getLogger() {
- return logger;
+ return LOG;
}
/**
@@ -229,7 +212,7 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
ObjectParameter<D> distFuncP = new ObjectParameter<D>(DISTANCE_ID, Distance.class);
- if(config.grab(distFuncP)) {
+ if (config.grab(distFuncP)) {
distanceFactory = distFuncP.instantiateClass(config);
}
}
@@ -239,4 +222,4 @@ public class NumberDistanceParser<D extends NumberDistance<D, ?>> extends Abstra
return new NumberDistanceParser<D>(colSep, quoteChar, distanceFactory);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/DimensionSelectingLatLngDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/DimensionSelectingLatLngDistanceFunction.java
index d4d7d9f5..42fd869d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/DimensionSelectingLatLngDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/DimensionSelectingLatLngDistanceFunction.java
@@ -24,10 +24,15 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.geo;
*/
import de.lmu.ifi.dbs.elki.data.NumberVector;
+import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
import de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation;
+import de.lmu.ifi.dbs.elki.database.query.distance.SpatialPrimitiveDistanceQuery;
+import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction;
-import de.lmu.ifi.dbs.elki.math.MathUtil;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.SpatialPrimitiveDoubleDistanceFunction;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+import de.lmu.ifi.dbs.elki.math.GeoUtil;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint;
@@ -40,14 +45,14 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
*
* @author Erich Schubert
*/
-public class DimensionSelectingLatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction {
+public class DimensionSelectingLatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
- * Latitude dimension
+ * Latitude dimension.
*/
final int dimlat;
/**
- * Longitude dimension
+ * Longitude dimension.
*/
final int dimlng;
@@ -64,13 +69,42 @@ public class DimensionSelectingLatLngDistanceFunction extends AbstractVectorDoub
}
@Override
- public double doubleDistance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
- return MathUtil.latlngDistance(o1.doubleValue(dimlat), o1.doubleValue(dimlng), o2.doubleValue(dimlat), o2.doubleValue(dimlng));
+ public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) {
+ return GeoUtil.haversineFormulaDeg(o1.doubleValue(dimlat), o1.doubleValue(dimlng), o2.doubleValue(dimlat), o2.doubleValue(dimlng));
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
- return new VectorFieldTypeInformation<NumberVector<?, ?>>(NumberVector.class, Math.max(dimlat, dimlng), Integer.MAX_VALUE);
+ public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ if (mbr1 instanceof NumberVector) {
+ if (mbr2 instanceof NumberVector) {
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
+ } else {
+ NumberVector<?> o1 = (NumberVector<?>) mbr1;
+ return GeoUtil.latlngMinDistDeg(o1.doubleValue(dimlat), o1.doubleValue(dimlng), mbr2.getMin(dimlat), mbr2.getMin(dimlng), mbr2.getMax(dimlat), mbr2.getMax(dimlng));
+ }
+ } else {
+ if (mbr2 instanceof NumberVector) {
+ NumberVector<?> o2 = (NumberVector<?>) mbr2;
+ return GeoUtil.latlngMinDistDeg(o2.doubleValue(dimlat), o2.doubleValue(dimlng), mbr1.getMin(dimlat), mbr1.getMin(dimlng), mbr1.getMax(dimlat), mbr1.getMax(dimlng));
+ } else {
+ throw new UnsupportedOperationException("MBR to MBR mindist is not yet implemented.");
+ }
+ }
+ }
+
+ @Override
+ public DoubleDistance minDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ return new DoubleDistance(doubleMinDist(mbr1, mbr2));
+ }
+
+ @Override
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
+ return new VectorFieldTypeInformation<NumberVector<?>>(NumberVector.class, Math.max(dimlat, dimlng), Integer.MAX_VALUE);
+ }
+
+ @Override
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
}
/**
@@ -84,32 +118,34 @@ public class DimensionSelectingLatLngDistanceFunction extends AbstractVectorDoub
/**
* Latitude dimension parameter.
*/
- public static final OptionID LATDIM_ID = OptionID.getOrCreateOptionID("distance.latitudedim", "The dimension containing the latitude.");
+ public static final OptionID LATDIM_ID = new OptionID("distance.latitudedim", "The dimension containing the latitude.");
/**
* Longitude dimension parameter.
*/
- public static final OptionID LNGDIM_ID = OptionID.getOrCreateOptionID("distance.longitudedim", "The dimension containing the longitude.");
+ public static final OptionID LNGDIM_ID = new OptionID("distance.longitudedim", "The dimension containing the longitude.");
/**
- * Latitude dimension
+ * Latitude dimension.
*/
int dimlat;
/**
- * Longitude dimension
+ * Longitude dimension.
*/
int dimlng;
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final IntParameter dimlatP = new IntParameter(LATDIM_ID, new GreaterEqualConstraint(1));
- if(config.grab(dimlatP)) {
+ final IntParameter dimlatP = new IntParameter(LATDIM_ID);
+ dimlatP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(dimlatP)) {
dimlat = dimlatP.getValue();
}
- final IntParameter dimlngP = new IntParameter(LNGDIM_ID, new GreaterEqualConstraint(1));
- if(config.grab(dimlngP)) {
+ final IntParameter dimlngP = new IntParameter(LNGDIM_ID);
+ dimlngP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(dimlngP)) {
dimlng = dimlngP.getValue();
}
config.checkConstraint(new NoDuplicateValueGlobalConstraint(dimlatP, dimlngP));
@@ -120,4 +156,4 @@ public class DimensionSelectingLatLngDistanceFunction extends AbstractVectorDoub
return new DimensionSelectingLatLngDistanceFunction(dimlat, dimlng);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LatLngDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LatLngDistanceFunction.java
index c50b3326..31bed1c5 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LatLngDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LatLngDistanceFunction.java
@@ -24,10 +24,15 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.geo;
*/
import de.lmu.ifi.dbs.elki.data.NumberVector;
+import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
import de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation;
+import de.lmu.ifi.dbs.elki.database.query.distance.SpatialPrimitiveDistanceQuery;
+import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction;
-import de.lmu.ifi.dbs.elki.math.MathUtil;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.SpatialPrimitiveDoubleDistanceFunction;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+import de.lmu.ifi.dbs.elki.math.GeoUtil;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
/**
@@ -35,9 +40,9 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Erich Schubert
*/
-public class LatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction {
+public class LatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
- * Static instance
+ * Static instance.
*/
public static final LatLngDistanceFunction STATIC = new LatLngDistanceFunction();
@@ -50,29 +55,58 @@ public class LatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction
}
@Override
- public double doubleDistance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
- return MathUtil.latlngDistance(o1.doubleValue(1), o1.doubleValue(2), o2.doubleValue(1), o2.doubleValue(2));
+ public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) {
+ return GeoUtil.haversineFormulaDeg(o1.doubleValue(0), o1.doubleValue(1), o2.doubleValue(0), o2.doubleValue(1));
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
- return VectorFieldTypeInformation.get(NumberVector.class, 2);
+ public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ if (mbr1 instanceof NumberVector) {
+ if (mbr2 instanceof NumberVector) {
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
+ } else {
+ NumberVector<?> o1 = (NumberVector<?>) mbr1;
+ return GeoUtil.latlngMinDistDeg(o1.doubleValue(0), o1.doubleValue(1), mbr2.getMin(0), mbr2.getMin(1), mbr2.getMax(0), mbr2.getMax(1));
+ }
+ } else {
+ if (mbr2 instanceof NumberVector) {
+ NumberVector<?> o2 = (NumberVector<?>) mbr2;
+ return GeoUtil.latlngMinDistDeg(o2.doubleValue(0), o2.doubleValue(1), mbr1.getMin(0), mbr1.getMin(1), mbr1.getMax(0), mbr1.getMax(1));
+ } else {
+ throw new UnsupportedOperationException("MBR to MBR mindist is not yet implemented.");
+ }
+ }
+ }
+
+ @Override
+ public DoubleDistance minDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ return new DoubleDistance(doubleMinDist(mbr1, mbr2));
+ }
+
+ @Override
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
+ return new VectorFieldTypeInformation<NumberVector<?>>(NumberVector.class, 2);
}
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(obj == this) {
+ if (obj == this) {
return true;
}
- if(this.getClass().equals(obj.getClass())) {
+ if (this.getClass().equals(obj.getClass())) {
return true;
}
return super.equals(obj);
}
+ @Override
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
+ }
+
/**
* Parameterization class.
*
@@ -86,4 +120,4 @@ public class LatLngDistanceFunction extends AbstractVectorDoubleDistanceFunction
return LatLngDistanceFunction.STATIC;
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LngLatDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LngLatDistanceFunction.java
index b48e7cae..7064224a 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LngLatDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/geo/LngLatDistanceFunction.java
@@ -24,10 +24,15 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.geo;
*/
import de.lmu.ifi.dbs.elki.data.NumberVector;
+import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
import de.lmu.ifi.dbs.elki.data.type.SimpleTypeInformation;
import de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation;
+import de.lmu.ifi.dbs.elki.database.query.distance.SpatialPrimitiveDistanceQuery;
+import de.lmu.ifi.dbs.elki.database.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction;
-import de.lmu.ifi.dbs.elki.math.MathUtil;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.SpatialPrimitiveDoubleDistanceFunction;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+import de.lmu.ifi.dbs.elki.math.GeoUtil;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
/**
@@ -35,9 +40,9 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
*
* @author Erich Schubert
*/
-public class LngLatDistanceFunction extends AbstractVectorDoubleDistanceFunction {
+public class LngLatDistanceFunction extends AbstractVectorDoubleDistanceFunction implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
- * Static instance
+ * Static instance.
*/
public static final LngLatDistanceFunction STATIC = new LngLatDistanceFunction();
@@ -50,29 +55,58 @@ public class LngLatDistanceFunction extends AbstractVectorDoubleDistanceFunction
}
@Override
- public double doubleDistance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
- return MathUtil.latlngDistance(o1.doubleValue(2), o1.doubleValue(1), o2.doubleValue(2), o2.doubleValue(1));
+ public double doubleDistance(NumberVector<?> o1, NumberVector<?> o2) {
+ return GeoUtil.haversineFormulaDeg(o1.doubleValue(1), o1.doubleValue(0), o2.doubleValue(1), o2.doubleValue(0));
}
@Override
- public SimpleTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
- return VectorFieldTypeInformation.get(NumberVector.class, 2);
+ public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ if (mbr1 instanceof NumberVector) {
+ if (mbr2 instanceof NumberVector) {
+ return doubleDistance((NumberVector<?>) mbr1, (NumberVector<?>) mbr2);
+ } else {
+ NumberVector<?> o1 = (NumberVector<?>) mbr1;
+ return GeoUtil.latlngMinDistDeg(o1.doubleValue(1), o1.doubleValue(0), mbr2.getMin(1), mbr2.getMin(0), mbr2.getMax(1), mbr2.getMax(0));
+ }
+ } else {
+ if (mbr2 instanceof NumberVector) {
+ NumberVector<?> o2 = (NumberVector<?>) mbr2;
+ return GeoUtil.latlngMinDistDeg(o2.doubleValue(1), o2.doubleValue(0), mbr1.getMin(1), mbr1.getMin(0), mbr1.getMax(1), mbr1.getMax(0));
+ } else {
+ throw new UnsupportedOperationException("MBR to MBR mindist is not yet implemented.");
+ }
+ }
+ }
+
+ @Override
+ public DoubleDistance minDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ return new DoubleDistance(doubleMinDist(mbr1, mbr2));
+ }
+
+ @Override
+ public SimpleTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
+ return new VectorFieldTypeInformation<NumberVector<?>>(NumberVector.class, 2);
}
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(obj == this) {
+ if (obj == this) {
return true;
}
- if(this.getClass().equals(obj.getClass())) {
+ if (this.getClass().equals(obj.getClass())) {
return true;
}
return super.equals(obj);
}
+ @Override
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> relation) {
+ return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(relation, this);
+ }
+
/**
* Parameterization class.
*
@@ -86,4 +120,4 @@ public class LngLatDistanceFunction extends AbstractVectorDoubleDistanceFunction
return LngLatDistanceFunction.STATIC;
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/package-info.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/package-info.java
index c47db2f8..f71ae4a2 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/package-info.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/package-info.java
@@ -31,7 +31,12 @@
* @apiviz.exclude de.lmu.ifi.dbs.elki.application.*
* @apiviz.exclude de.lmu.ifi.dbs.elki.algorithm.*
* @apiviz.exclude de.lmu.ifi.dbs.elki.database.*
+ * @apiviz.exclude de.lmu.ifi.dbs.elki.distance.distancefunction.subspace.*
+ * @apiviz.exclude de.lmu.ifi.dbs.elki.distance.distancefunction.correlation.*
+ * @apiviz.exclude de.lmu.ifi.dbs.elki.distance.distancefunction.geo.*
+ * @apiviz.exclude de.lmu.ifi.dbs.elki.distance.distancefunction.timeseries.*
* @apiviz.exclude de.lmu.ifi.dbs.elki.index.*
+ * @apiviz.exclude de.lmu.ifi.dbs.elki.*Instance
*/
/*
This file is part of ELKI:
@@ -55,4 +60,4 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package de.lmu.ifi.dbs.elki.distance.distancefunction; \ No newline at end of file
+package de.lmu.ifi.dbs.elki.distance.distancefunction;
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractDimensionsSelectingDoubleDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractDimensionsSelectingDoubleDistanceFunction.java
index b58979ef..6bedd394 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractDimensionsSelectingDoubleDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractDimensionsSelectingDoubleDistanceFunction.java
@@ -31,7 +31,8 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.PrimitiveDoubleDistanceFunc
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ListGreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.ListEachConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntListParameter;
@@ -42,11 +43,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntListParameter;
* @author Elke Achtert
* @param <V> the type of FeatureVector to compute the distances in between
*/
-public abstract class AbstractDimensionsSelectingDoubleDistanceFunction<V extends FeatureVector<?, ?>> extends AbstractPrimitiveDistanceFunction<V, DoubleDistance> implements PrimitiveDoubleDistanceFunction<V>, DimensionSelectingSubspaceDistanceFunction<V, DoubleDistance> {
+public abstract class AbstractDimensionsSelectingDoubleDistanceFunction<V extends FeatureVector<?>> extends AbstractPrimitiveDistanceFunction<V, DoubleDistance> implements PrimitiveDoubleDistanceFunction<V>, DimensionSelectingSubspaceDistanceFunction<V, DoubleDistance> {
/**
* Dimensions parameter.
*/
- public static final OptionID DIMS_ID = OptionID.getOrCreateOptionID("distance.dims", "a comma separated array of integer values, where 1 <= d_i <= the dimensionality of the feature space specifying the dimensions to be considered for distance computation. If this parameter is not set, no dimensions will be considered, i.e. the distance between two objects is always 0.");
+ public static final OptionID DIMS_ID = new OptionID("distance.dims", "a comma separated array of integer values, where 0 <= d_i < the dimensionality of the feature space specifying the dimensions to be considered for distance computation. If this parameter is not set, no dimensions will be considered, i.e. the distance between two objects is always 0.");
/**
* The dimensions to be considered for distance computation.
@@ -86,10 +87,10 @@ public abstract class AbstractDimensionsSelectingDoubleDistanceFunction<V extend
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(!this.getClass().equals(obj.getClass())) {
+ if (!this.getClass().equals(obj.getClass())) {
return false;
}
return this.dimensions.equals(((AbstractDimensionsSelectingDoubleDistanceFunction<?>) obj).dimensions);
@@ -102,19 +103,21 @@ public abstract class AbstractDimensionsSelectingDoubleDistanceFunction<V extend
*
* @apiviz.exclude
*/
- public static abstract class Parameterizer extends AbstractParameterizer {
+ public abstract static class Parameterizer extends AbstractParameterizer {
protected BitSet dimensions = null;
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
dimensions = new BitSet();
- final IntListParameter dimsP = new IntListParameter(DIMS_ID, new ListGreaterEqualConstraint<Integer>(1), true);
- if(config.grab(dimsP)) {
- for(int d : dimsP.getValue()) {
- dimensions.set(d - 1);
+ final IntListParameter dimsP = new IntListParameter(DIMS_ID);
+ dimsP.addConstraint(new ListEachConstraint<Integer>(new GreaterEqualConstraint(0)));
+ dimsP.setOptional(true);
+ if (config.grab(dimsP)) {
+ for (int d : dimsP.getValue()) {
+ dimensions.set(d);
}
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractPreferenceVectorBasedCorrelationDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractPreferenceVectorBasedCorrelationDistanceFunction.java
index 8164cffa..e662bef1 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractPreferenceVectorBasedCorrelationDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/AbstractPreferenceVectorBasedCorrelationDistanceFunction.java
@@ -46,7 +46,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
* @param <V> the type of NumberVector to compute the distances in between
* @param <P> the type of Preprocessor used
*/
-public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V extends NumberVector<?, ?>, P extends PreferenceVectorIndex<V>> extends AbstractIndexBasedDistanceFunction<V, P, PreferenceVectorBasedCorrelationDistance> {
+public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V extends NumberVector<?>, P extends PreferenceVectorIndex<V>> extends AbstractIndexBasedDistanceFunction<V, P, PreferenceVectorBasedCorrelationDistance> {
/**
* Parameter to specify the maximum distance between two vectors with equal
* preference vectors before considering them as parallel, must be a double
@@ -58,7 +58,7 @@ public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V
* Key: {@code -pvbasedcorrelationdf.epsilon}
* </p>
*/
- public static final OptionID EPSILON_ID = OptionID.getOrCreateOptionID("distancefunction.epsilon", "The maximum distance between two vectors with equal preference vectors before considering them as parallel.");
+ public static final OptionID EPSILON_ID = new OptionID("distancefunction.epsilon", "The maximum distance between two vectors with equal preference vectors before considering them as parallel.");
/**
* Holds the value of {@link #EPSILON_ID}.
@@ -92,21 +92,22 @@ public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(!this.getClass().equals(obj.getClass())) {
+ if (!this.getClass().equals(obj.getClass())) {
return false;
}
AbstractPreferenceVectorBasedCorrelationDistanceFunction<?, ?> other = (AbstractPreferenceVectorBasedCorrelationDistanceFunction<?, ?>) obj;
return (this.indexFactory.equals(other.indexFactory)) && this.epsilon == other.epsilon;
}
+
/**
* Instance to compute the distances on an actual database.
*
* @author Erich Schubert
*/
- abstract public static class Instance<V extends NumberVector<?, ?>, P extends PreferenceVectorIndex<V>> extends AbstractIndexBasedDistanceFunction.Instance<V, P, PreferenceVectorBasedCorrelationDistance, AbstractPreferenceVectorBasedCorrelationDistanceFunction<? super V, ?>> {
+ abstract public static class Instance<V extends NumberVector<?>, P extends PreferenceVectorIndex<V>> extends AbstractIndexBasedDistanceFunction.Instance<V, P, PreferenceVectorBasedCorrelationDistance, AbstractPreferenceVectorBasedCorrelationDistanceFunction<? super V, ?>> {
/**
* The epsilon value
*/
@@ -157,13 +158,13 @@ public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V
* to the given preference vector
*/
public double weightedDistance(V v1, V v2, BitSet weightVector) {
- if(v1.getDimensionality() != v2.getDimensionality()) {
+ if (v1.getDimensionality() != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n first argument: " + v1.toString() + "\n second argument: " + v2.toString());
}
double sqrDist = 0;
- for(int i = 1; i <= v1.getDimensionality(); i++) {
- if(weightVector.get(i - 1)) {
+ for (int i = 0; i < v1.getDimensionality(); i++) {
+ if (weightVector.get(i)) {
double manhattanI = v1.doubleValue(i) - v2.doubleValue(i);
sqrDist += manhattanI * manhattanI;
}
@@ -210,7 +211,7 @@ public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V
*
* @apiviz.exclude
*/
- public static abstract class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractIndexBasedDistanceFunction.Parameterizer<F> {
+ public abstract static class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractIndexBasedDistanceFunction.Parameterizer<F> {
protected double epsilon = 0.0;
@Override
@@ -220,10 +221,11 @@ public abstract class AbstractPreferenceVectorBasedCorrelationDistanceFunction<V
}
protected void configEpsilon(Parameterization config) {
- final DoubleParameter epsilonP = new DoubleParameter(EPSILON_ID, new GreaterEqualConstraint(0), 0.001);
- if(config.grab(epsilonP)) {
- epsilon = epsilonP.getValue();
+ final DoubleParameter epsilonP = new DoubleParameter(EPSILON_ID, 0.001);
+ epsilonP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(epsilonP)) {
+ epsilon = epsilonP.doubleValue();
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DiSHDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DiSHDistanceFunction.java
index f0eb8289..77633578 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DiSHDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DiSHDistanceFunction.java
@@ -27,11 +27,11 @@ import java.util.BitSet;
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.RelationUtil;
import de.lmu.ifi.dbs.elki.distance.distancevalue.PreferenceVectorBasedCorrelationDistance;
import de.lmu.ifi.dbs.elki.index.preprocessed.preference.DiSHPreferenceVectorIndex;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil;
-import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil;
import de.lmu.ifi.dbs.elki.utilities.FormatUtil;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
@@ -42,28 +42,28 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz
*
* @apiviz.has Instance
*/
-public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelationDistanceFunction<NumberVector<?, ?>, DiSHPreferenceVectorIndex<NumberVector<?, ?>>> {
+public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelationDistanceFunction<NumberVector<?>, DiSHPreferenceVectorIndex<NumberVector<?>>> {
/**
* Logger for debug.
*/
- static Logging logger = Logging.getLogger(DiSHDistanceFunction.class);
+ private static final Logging LOG = Logging.getLogger(DiSHDistanceFunction.class);
/**
* Constructor.
*
- * @param indexFactory
- * @param epsilon
+ * @param indexFactory DiSH index factory
+ * @param epsilon Epsilon value
*/
- public DiSHDistanceFunction(DiSHPreferenceVectorIndex.Factory<NumberVector<?, ?>> indexFactory, double epsilon) {
+ public DiSHDistanceFunction(DiSHPreferenceVectorIndex.Factory<NumberVector<?>> indexFactory, double epsilon) {
super(indexFactory, epsilon);
}
@Override
- public <T extends NumberVector<?, ?>> Instance<T> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> Instance<T> instantiate(Relation<T> database) {
// We can't really avoid these warnings, due to a limitation in Java
// Generics (AFAICT)
@SuppressWarnings("unchecked")
- DiSHPreferenceVectorIndex<T> indexinst = (DiSHPreferenceVectorIndex<T>) indexFactory.instantiate((Relation<NumberVector<?, ?>>) database);
+ DiSHPreferenceVectorIndex<T> indexinst = (DiSHPreferenceVectorIndex<T>) indexFactory.instantiate((Relation<NumberVector<?>>) database);
return new Instance<T>(database, indexinst, getEpsilon(), this);
}
@@ -74,7 +74,7 @@ public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelati
*/
public int getMinpts() {
// TODO: get rid of this cast?
- return ((DiSHPreferenceVectorIndex.Factory<NumberVector<?, ?>>) indexFactory).getMinpts();
+ return ((DiSHPreferenceVectorIndex.Factory<NumberVector<?>>) indexFactory).getMinpts();
}
/**
@@ -82,7 +82,7 @@ public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelati
*
* @author Erich Schubert
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Instance<V, DiSHPreferenceVectorIndex<V>> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Instance<V, DiSHPreferenceVectorIndex<V>> {
/**
* Constructor.
*
@@ -119,15 +119,15 @@ public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelati
double d = weightedDistance(v1, v2, commonPreferenceVector);
if(d > 2 * epsilon) {
subspaceDim++;
- if(logger.isDebugging()) {
+ if(LOG.isDebugging()) {
//Representation<String> rep = database.getObjectLabelQuery();
- StringBuffer msg = new StringBuffer();
+ StringBuilder msg = new StringBuilder();
msg.append("d ").append(d);
//msg.append("\nv1 ").append(rep.get(v1.getID()));
//msg.append("\nv2 ").append(rep.get(v2.getID()));
msg.append("\nsubspaceDim ").append(subspaceDim);
msg.append("\ncommon pv ").append(FormatUtil.format(dim, commonPreferenceVector));
- logger.debugFine(msg.toString());
+ LOG.debugFine(msg.toString());
}
}
}
@@ -136,7 +136,7 @@ public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelati
BitSet inverseCommonPreferenceVector = (BitSet) commonPreferenceVector.clone();
inverseCommonPreferenceVector.flip(0, dim);
- return new PreferenceVectorBasedCorrelationDistance(DatabaseUtil.dimensionality(relation), subspaceDim, weightedDistance(v1, v2, inverseCommonPreferenceVector), commonPreferenceVector);
+ return new PreferenceVectorBasedCorrelationDistance(RelationUtil.dimensionality(relation), subspaceDim, weightedDistance(v1, v2, inverseCommonPreferenceVector), commonPreferenceVector);
}
}
@@ -147,11 +147,11 @@ public class DiSHDistanceFunction extends AbstractPreferenceVectorBasedCorrelati
*
* @apiviz.exclude
*/
- public static class Parameterizer extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Parameterizer<DiSHPreferenceVectorIndex.Factory<NumberVector<?, ?>>> {
+ public static class Parameterizer extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Parameterizer<DiSHPreferenceVectorIndex.Factory<NumberVector<?>>> {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- Class<DiSHPreferenceVectorIndex.Factory<NumberVector<?, ?>>> cls = ClassGenericsUtil.uglyCastIntoSubclass(DiSHPreferenceVectorIndex.Factory.class);
+ Class<DiSHPreferenceVectorIndex.Factory<NumberVector<?>>> cls = ClassGenericsUtil.uglyCastIntoSubclass(DiSHPreferenceVectorIndex.Factory.class);
factory = config.tryInstantiate(cls);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DimensionSelectingDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DimensionSelectingDistanceFunction.java
index 382167e9..e1d52710 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DimensionSelectingDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/DimensionSelectingDistanceFunction.java
@@ -25,6 +25,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.subspace;
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
+import de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation;
import de.lmu.ifi.dbs.elki.data.type.VectorTypeInformation;
import de.lmu.ifi.dbs.elki.database.query.distance.SpatialPrimitiveDistanceQuery;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
@@ -43,11 +44,11 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
*
* @author Elke Achtert
*/
-public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?, ?>, DoubleDistance> implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>> {
+public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?>, DoubleDistance> implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>> {
/**
* Parameter for dimensionality.
*/
- public static final OptionID DIM_ID = OptionID.getOrCreateOptionID("dim", "an integer between 1 and the dimensionality of the " + "feature space 1 specifying the dimension to be considered " + "for distance computation.");
+ public static final OptionID DIM_ID = new OptionID("dim", "an integer between 1 and the dimensionality of the " + "feature space 1 specifying the dimension to be considered " + "for distance computation.");
/**
* The dimension to be considered for distance computation.
@@ -74,8 +75,8 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
* distance function
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
- if(dim > v1.getDimensionality() || dim > v2.getDimensionality()) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
+ if(dim >= v1.getDimensionality() || dim >= v2.getDimensionality() || dim < 0) {
throw new IllegalArgumentException("Specified dimension to be considered " + "is larger that dimensionality of FeatureVectors:" + "\n first argument: " + v1.toString() + "\n second argument: " + v2.toString() + "\n dimension: " + dim);
}
@@ -85,7 +86,7 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
@Override
public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
- if(dim > mbr1.getDimensionality() || dim > mbr2.getDimensionality()) {
+ if(dim >= mbr1.getDimensionality() || dim >= mbr2.getDimensionality() || dim < 0) {
throw new IllegalArgumentException("Specified dimension to be considered " + "is larger that dimensionality of FeatureVectors:" + "\n first argument: " + mbr1.toString() + "\n second argument: " + mbr2.toString() + "\n dimension: " + dim);
}
@@ -108,7 +109,7 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
}
@Override
- public DoubleDistance distance(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
+ public DoubleDistance distance(NumberVector<?> o1, NumberVector<?> o2) {
return new DoubleDistance(doubleDistance(o1, o2));
}
@@ -127,8 +128,8 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
}
@Override
- public VectorTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
- return VectorTypeInformation.get(NumberVector.class, dim, Integer.MAX_VALUE);
+ public VectorTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
+ return new VectorFieldTypeInformation<NumberVector<?>>(NumberVector.class, dim, Integer.MAX_VALUE);
}
@Override
@@ -137,7 +138,7 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
}
@Override
- public <T extends NumberVector<?, ?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> database) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(database, this);
}
@@ -165,7 +166,8 @@ public class DimensionSelectingDistanceFunction extends AbstractPrimitiveDistanc
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final IntParameter dimP = new IntParameter(DIM_ID, new GreaterEqualConstraint(1));
+ final IntParameter dimP = new IntParameter(DIM_ID);
+ dimP.addConstraint(new GreaterEqualConstraint(0));
if(config.grab(dimP)) {
dim = dimP.getValue();
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/HiSCDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/HiSCDistanceFunction.java
index 4835a6c6..0703ab2d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/HiSCDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/HiSCDistanceFunction.java
@@ -27,11 +27,11 @@ import java.util.BitSet;
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.RelationUtil;
import de.lmu.ifi.dbs.elki.distance.distancevalue.PreferenceVectorBasedCorrelationDistance;
import de.lmu.ifi.dbs.elki.index.preprocessed.preference.HiSCPreferenceVectorIndex;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil;
-import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil;
import de.lmu.ifi.dbs.elki.utilities.FormatUtil;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
@@ -44,17 +44,17 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz
*
* @param <V> the type of NumberVector to compute the distances in between
*/
-public class HiSCDistanceFunction<V extends NumberVector<?, ?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction<V, HiSCPreferenceVectorIndex<V>> {
+public class HiSCDistanceFunction<V extends NumberVector<?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction<V, HiSCPreferenceVectorIndex<V>> {
/**
* Logger for debug.
*/
- static Logging logger = Logging.getLogger(DiSHDistanceFunction.class);
+ private static final Logging LOG = Logging.getLogger(HiSCDistanceFunction.class);
/**
* Constructor.
*
- * @param indexFactory
- * @param epsilon
+ * @param indexFactory HiSC index factory
+ * @param epsilon Epsilon value
*/
public HiSCDistanceFunction(HiSCPreferenceVectorIndex.Factory<V> indexFactory, double epsilon) {
super(indexFactory, epsilon);
@@ -76,7 +76,7 @@ public class HiSCDistanceFunction<V extends NumberVector<?, ?>> extends Abstract
*
* @param <V> the type of NumberVector to compute the distances in between
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Instance<V, HiSCPreferenceVectorIndex<V>> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Instance<V, HiSCPreferenceVectorIndex<V>> {
/**
* Constructor.
*
@@ -114,16 +114,16 @@ public class HiSCDistanceFunction<V extends NumberVector<?, ?>> extends Abstract
if(Math.max(dist1, dist2) > epsilon) {
subspaceDim++;
- if(logger.isDebugging()) {
+ if(LOG.isDebugging()) {
//Representation<String> rep = rep.getObjectLabelQuery();
- StringBuffer msg = new StringBuffer();
- msg.append("\ndist1 " + dist1);
- msg.append("\ndist2 " + dist2);
- // msg.append("\nv1 " + rep.get(v1.getID()));
- // msg.append("\nv2 " + rep.get(v2.getID()));
- msg.append("\nsubspaceDim " + subspaceDim);
- msg.append("\ncommon pv " + FormatUtil.format(dim, commonPreferenceVector));
- logger.debugFine(msg.toString());
+ StringBuilder msg = new StringBuilder();
+ msg.append("\ndist1 ").append(dist1);
+ msg.append("\ndist2 ").append(dist2);
+ // msg.append("\nv1 ").append(rep.get(v1.getID()));
+ // msg.append("\nv2 ").append(rep.get(v2.getID()));
+ msg.append("\nsubspaceDim ").append(subspaceDim);
+ msg.append("\ncommon pv ").append(FormatUtil.format(dim, commonPreferenceVector));
+ LOG.debugFine(msg.toString());
}
}
@@ -131,7 +131,7 @@ public class HiSCDistanceFunction<V extends NumberVector<?, ?>> extends Abstract
BitSet inverseCommonPreferenceVector = (BitSet) commonPreferenceVector.clone();
inverseCommonPreferenceVector.flip(0, dim);
- return new PreferenceVectorBasedCorrelationDistance(DatabaseUtil.dimensionality(relation), subspaceDim, weightedDistance(v1, v2, inverseCommonPreferenceVector), commonPreferenceVector);
+ return new PreferenceVectorBasedCorrelationDistance(RelationUtil.dimensionality(relation), subspaceDim, weightedDistance(v1, v2, inverseCommonPreferenceVector), commonPreferenceVector);
}
}
@@ -142,7 +142,7 @@ public class HiSCDistanceFunction<V extends NumberVector<?, ?>> extends Abstract
*
* @apiviz.exclude
*/
- public static class Parameterizer<V extends NumberVector<?, ?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Parameterizer<HiSCPreferenceVectorIndex.Factory<V>> {
+ public static class Parameterizer<V extends NumberVector<?>> extends AbstractPreferenceVectorBasedCorrelationDistanceFunction.Parameterizer<HiSCPreferenceVectorIndex.Factory<V>> {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/LocalSubspaceDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/LocalSubspaceDistanceFunction.java
index 8bb912e0..ff38d3d9 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/LocalSubspaceDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/LocalSubspaceDistanceFunction.java
@@ -48,13 +48,13 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameteriz
*
* @apiviz.has Instance
*/
-public class LocalSubspaceDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, SubspaceDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>, SubspaceDistance> {
+public class LocalSubspaceDistanceFunction extends AbstractIndexBasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, SubspaceDistance> implements FilteredLocalPCABasedDistanceFunction<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>, SubspaceDistance> {
/**
* Constructor
*
* @param indexFactory Index factory
*/
- public LocalSubspaceDistanceFunction(IndexFactory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>> indexFactory) {
+ public LocalSubspaceDistanceFunction(IndexFactory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>> indexFactory) {
super(indexFactory);
}
@@ -64,10 +64,10 @@ public class LocalSubspaceDistanceFunction extends AbstractIndexBasedDistanceFun
}
@Override
- public <V extends NumberVector<?, ?>> Instance<V> instantiate(Relation<V> database) {
+ public <V extends NumberVector<?>> Instance<V> instantiate(Relation<V> database) {
// We can't really avoid these warnings, due to a limitation in Java Generics (AFAICT)
@SuppressWarnings("unchecked")
- FilteredLocalPCAIndex<V> indexinst = (FilteredLocalPCAIndex<V>) indexFactory.instantiate((Relation<NumberVector<?, ?>>)database);
+ FilteredLocalPCAIndex<V> indexinst = (FilteredLocalPCAIndex<V>) indexFactory.instantiate((Relation<NumberVector<?>>)database);
return new Instance<V>(database, indexinst, this);
}
@@ -76,7 +76,7 @@ public class LocalSubspaceDistanceFunction extends AbstractIndexBasedDistanceFun
*
* @author Erich Schubert
*/
- public static class Instance<V extends NumberVector<?, ?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, SubspaceDistance, LocalSubspaceDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, SubspaceDistance> {
+ public static class Instance<V extends NumberVector<?>> extends AbstractIndexBasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, SubspaceDistance, LocalSubspaceDistanceFunction> implements FilteredLocalPCABasedDistanceFunction.Instance<V, FilteredLocalPCAIndex<V>, SubspaceDistance> {
/**
* @param database Database
* @param index Index
@@ -137,7 +137,7 @@ public class LocalSubspaceDistanceFunction extends AbstractIndexBasedDistanceFun
*
* @apiviz.exclude
*/
- public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<LocalProjectionIndex.Factory<NumberVector<?, ?>, FilteredLocalPCAIndex<NumberVector<?, ?>>>> {
+ public static class Parameterizer extends AbstractIndexBasedDistanceFunction.Parameterizer<LocalProjectionIndex.Factory<NumberVector<?>, FilteredLocalPCAIndex<NumberVector<?>>>> {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceEuclideanDistanceFunction.java
index 6330ed34..48518afd 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceEuclideanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceEuclideanDistanceFunction.java
@@ -54,21 +54,21 @@ public class SubspaceEuclideanDistanceFunction extends SubspaceLPNormDistanceFun
* selected dimensions
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
if(v1.getDimensionality() != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n " + "first argument: " + v1 + "\n " + "second argument: " + v2);
}
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- final double delta = v1.doubleValue(d + 1) - v2.doubleValue(d + 1);
+ final double delta = v1.doubleValue(d) - v2.doubleValue(d);
sqrDist += delta * delta;
}
return Math.sqrt(sqrDist);
}
@Override
- protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
if(mbr.getDimensionality() != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString());
}
@@ -76,13 +76,13 @@ public class SubspaceEuclideanDistanceFunction extends SubspaceLPNormDistanceFun
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
final double delta;
- final double value = v.doubleValue(d + 1);
- final double omin = mbr.getMin(d + 1);
+ final double value = v.doubleValue(d);
+ final double omin = mbr.getMin(d);
if(value < omin) {
delta = omin - value;
}
else {
- final double omax = mbr.getMax(d + 1);
+ final double omax = mbr.getMax(d);
if(value > omax) {
delta = value - omax;
}
@@ -103,14 +103,14 @@ public class SubspaceEuclideanDistanceFunction extends SubspaceLPNormDistanceFun
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
final double delta;
- final double max1 = mbr1.getMax(d + 1);
- final double min2 = mbr2.getMin(d + 1);
+ final double max1 = mbr1.getMax(d);
+ final double min2 = mbr2.getMin(d);
if(max1 < min2) {
delta = min2 - max1;
}
else {
- final double min1 = mbr1.getMin(d + 1);
- final double max2 = mbr2.getMax(d + 1);
+ final double min1 = mbr1.getMin(d);
+ final double max2 = mbr2.getMax(d);
if(min1 > max2) {
delta = min1 - max2;
}
@@ -124,10 +124,10 @@ public class SubspaceEuclideanDistanceFunction extends SubspaceLPNormDistanceFun
}
@Override
- public double doubleNorm(NumberVector<?, ?> obj) {
+ public double doubleNorm(NumberVector<?> obj) {
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- final double delta = obj.doubleValue(d + 1);
+ final double delta = obj.doubleValue(d);
sqrDist += delta * delta;
}
return Math.sqrt(sqrDist);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceLPNormDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceLPNormDistanceFunction.java
index 7904c333..ccfc51d9 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceLPNormDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceLPNormDistanceFunction.java
@@ -45,7 +45,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
*
* @author Elke Achtert
*/
-public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingDoubleDistanceFunction<NumberVector<?, ?>> implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?, ?>>, DoubleNorm<NumberVector<?, ?>> {
+public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingDoubleDistanceFunction<NumberVector<?>> implements SpatialPrimitiveDoubleDistanceFunction<NumberVector<?>>, DoubleNorm<NumberVector<?>> {
/**
* Value of p
*/
@@ -81,20 +81,20 @@ public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingD
* selected dimensions
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
if(v1.getDimensionality() != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n " + "first argument: " + v1 + "\n " + "second argument: " + v2);
}
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- double delta = Math.abs(v1.doubleValue(d + 1) - v2.doubleValue(d + 1));
+ double delta = Math.abs(v1.doubleValue(d) - v2.doubleValue(d));
sqrDist += Math.pow(delta, p);
}
return Math.pow(sqrDist, 1. / p);
}
- protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
if(mbr.getDimensionality() != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString());
}
@@ -102,13 +102,13 @@ public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingD
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
final double delta;
- final double value = v.doubleValue(d + 1);
- final double omin = mbr.getMin(d + 1);
+ final double value = v.doubleValue(d);
+ final double omin = mbr.getMin(d);
if(value < omin) {
delta = omin - value;
}
else {
- final double omax = mbr.getMax(d + 1);
+ final double omax = mbr.getMax(d);
if(value > omax) {
delta = value - omax;
}
@@ -129,14 +129,14 @@ public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingD
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
final double delta;
- final double max1 = mbr1.getMax(d + 1);
- final double min2 = mbr2.getMin(d + 1);
+ final double max1 = mbr1.getMax(d);
+ final double min2 = mbr2.getMin(d);
if(max1 < min2) {
delta = min2 - max1;
}
else {
- final double min1 = mbr1.getMin(d + 1);
- final double max2 = mbr2.getMax(d + 1);
+ final double min1 = mbr1.getMin(d);
+ final double max2 = mbr2.getMax(d);
if(min1 > max2) {
delta = min1 - max2;
}
@@ -155,27 +155,27 @@ public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingD
}
@Override
- public DoubleDistance norm(NumberVector<?, ?> obj) {
+ public DoubleDistance norm(NumberVector<?> obj) {
return new DoubleDistance(doubleNorm(obj));
}
@Override
- public double doubleNorm(NumberVector<?, ?> obj) {
+ public double doubleNorm(NumberVector<?> obj) {
double sqrDist = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- double delta = Math.abs(obj.doubleValue(d + 1));
+ double delta = Math.abs(obj.doubleValue(d));
sqrDist += Math.pow(delta, p);
}
return Math.pow(sqrDist, 1. / p);
}
@Override
- public <T extends NumberVector<?, ?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> SpatialPrimitiveDistanceQuery<T, DoubleDistance> instantiate(Relation<T> database) {
return new SpatialPrimitiveDistanceQuery<T, DoubleDistance>(database, this);
}
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@@ -193,13 +193,14 @@ public class SubspaceLPNormDistanceFunction extends AbstractDimensionsSelectingD
*/
public static class Parameterizer extends AbstractDimensionsSelectingDoubleDistanceFunction.Parameterizer {
/**
- * Value of p
+ * Value of p.
*/
private double p;
@Override
protected void makeOptions(Parameterization config) {
- final DoubleParameter paramP = new DoubleParameter(LPNormDistanceFunction.P_ID, new GreaterConstraint(0));
+ final DoubleParameter paramP = new DoubleParameter(LPNormDistanceFunction.P_ID);
+ paramP.addConstraint(new GreaterConstraint(0));
if(config.grab(paramP)) {
p = paramP.getValue();
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceManhattanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceManhattanDistanceFunction.java
index 905ee037..fb777d81 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceManhattanDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace/SubspaceManhattanDistanceFunction.java
@@ -54,32 +54,33 @@ public class SubspaceManhattanDistanceFunction extends SubspaceLPNormDistanceFun
* selected dimensions
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
if(v1.getDimensionality() != v2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n " + "first argument: " + v1 + "\n " + "second argument: " + v2);
}
double sum = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- sum += Math.abs(v1.doubleValue(d + 1) - v2.doubleValue(d + 1));
+ sum += Math.abs(v1.doubleValue(d) - v2.doubleValue(d));
}
return sum;
}
- protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?, ?> v) {
+ @Override
+ protected double doubleMinDistObject(SpatialComparable mbr, NumberVector<?> v) {
if(mbr.getDimensionality() != v.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr.toString() + "\n " + "second argument: " + v.toString());
}
double sum = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- final double value = v.doubleValue(d + 1);
- final double omin = mbr.getMin(d + 1);
+ final double value = v.doubleValue(d);
+ final double omin = mbr.getMin(d);
if(value < omin) {
sum += omin - value;
}
else {
- final double omax = mbr.getMax(d + 1);
+ final double omax = mbr.getMax(d);
if(value > omax) {
sum += value - omax;
}
@@ -98,14 +99,14 @@ public class SubspaceManhattanDistanceFunction extends SubspaceLPNormDistanceFun
}
double sum = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- final double max1 = mbr1.getMax(d + 1);
- final double min2 = mbr2.getMin(d + 1);
+ final double max1 = mbr1.getMax(d);
+ final double min2 = mbr2.getMin(d);
if(max1 < min2) {
sum += min2 - max1;
}
else {
- final double min1 = mbr1.getMin(d + 1);
- final double max2 = mbr2.getMax(d + 1);
+ final double min1 = mbr1.getMin(d);
+ final double max2 = mbr2.getMax(d);
if(min1 > max2) {
sum += min1 - max2;
}
@@ -118,10 +119,10 @@ public class SubspaceManhattanDistanceFunction extends SubspaceLPNormDistanceFun
}
@Override
- public double doubleNorm(NumberVector<?, ?> obj) {
+ public double doubleNorm(NumberVector<?> obj) {
double sum = 0;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
- sum += Math.abs(obj.doubleValue(d + 1));
+ sum += Math.abs(obj.doubleValue(d));
}
return sum;
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/AbstractEditDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/AbstractEditDistanceFunction.java
index a504f680..a88dbded 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/AbstractEditDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/AbstractEditDistanceFunction.java
@@ -29,8 +29,8 @@ import de.lmu.ifi.dbs.elki.data.type.VectorFieldTypeInformation;
import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractVectorDoubleDistanceFunction;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.IntervalConstraint;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.IntervalConstraint.IntervalBoundary;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.LessEqualConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
@@ -43,7 +43,7 @@ public abstract class AbstractEditDistanceFunction extends AbstractVectorDoubleD
/**
* BANDSIZE parameter
*/
- public static final OptionID BANDSIZE_ID = OptionID.getOrCreateOptionID("edit.bandSize", "the band size for Edit Distance alignment (positive double value, 0 <= bandSize <= 1)");
+ public static final OptionID BANDSIZE_ID = new OptionID("edit.bandSize", "the band size for Edit Distance alignment (positive double value, 0 <= bandSize <= 1)");
/**
* Keeps the currently set bandSize.
@@ -62,13 +62,13 @@ public abstract class AbstractEditDistanceFunction extends AbstractVectorDoubleD
// TODO: relax this to VectorTypeInformation!
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
if (!this.getClass().equals(obj.getClass())) {
@@ -76,7 +76,7 @@ public abstract class AbstractEditDistanceFunction extends AbstractVectorDoubleD
}
return this.bandSize == ((AbstractEditDistanceFunction) obj).bandSize;
}
-
+
/**
* Parameterization class.
*
@@ -84,16 +84,18 @@ public abstract class AbstractEditDistanceFunction extends AbstractVectorDoubleD
*
* @apiviz.exclude
*/
- public static abstract class Parameterizer extends AbstractParameterizer {
+ public abstract static class Parameterizer extends AbstractParameterizer {
protected double bandSize = 0.0;
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final DoubleParameter bandSizeP = new DoubleParameter(BANDSIZE_ID, new IntervalConstraint(0, IntervalBoundary.CLOSE, 1, IntervalBoundary.CLOSE), 0.1);
- if(config.grab(bandSizeP)) {
- bandSize = bandSizeP.getValue();
+ final DoubleParameter bandSizeP = new DoubleParameter(BANDSIZE_ID, 0.1);
+ bandSizeP.addConstraint(new GreaterEqualConstraint(0));
+ bandSizeP.addConstraint(new LessEqualConstraint(1));
+ if (config.grab(bandSizeP)) {
+ bandSize = bandSizeP.doubleValue();
}
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/DTWDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/DTWDistanceFunction.java
index 4461a680..d3fab3c0 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/DTWDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/DTWDistanceFunction.java
@@ -52,7 +52,7 @@ public class DTWDistanceFunction extends AbstractEditDistanceFunction {
* an instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
// Current and previous columns of the matrix
double[] curr = new double[v2.getDimensionality()];
double[] prev = new double[v2.getDimensionality()];
@@ -82,8 +82,8 @@ public class DTWDistanceFunction extends AbstractEditDistanceFunction {
for(int j = l; j <= r; j++) {
if(Math.abs(i - j) <= band) {
- double val1 = v1.doubleValue(i + 1);
- double val2 = v2.doubleValue(j + 1);
+ double val1 = v1.doubleValue(i);
+ double val2 = v2.doubleValue(j);
double diff = (val1 - val2);
// Formally: diff = Math.sqrt(diff * diff);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/EDRDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/EDRDistanceFunction.java
index c918ab03..4c177b03 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/EDRDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/EDRDistanceFunction.java
@@ -43,7 +43,7 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
/**
* DELTA parameter
*/
- public static final OptionID DELTA_ID = OptionID.getOrCreateOptionID("edr.delta", "the delta parameter (similarity threshold) for EDR (positive number)");
+ public static final OptionID DELTA_ID = new OptionID("edr.delta", "the delta parameter (similarity threshold) for EDR (positive number)");
/**
* Keeps the currently set delta.
@@ -69,7 +69,7 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
* vectors as an instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
// Current and previous columns of the matrix
double[] curr = new double[v2.getDimensionality()];
double[] prev = new double[v2.getDimensionality()];
@@ -82,7 +82,7 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
// features2.length + ", band: " + band);
final double deltaValue = delta;
- for(int i = 0; i < v1.getDimensionality(); i++) {
+ for (int i = 0; i < v1.getDimensionality(); i++) {
// Swap current and prev arrays. We'll just overwrite the new curr.
{
double[] temp = prev;
@@ -90,19 +90,19 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
curr = temp;
}
int l = i - (band + 1);
- if(l < 0) {
+ if (l < 0) {
l = 0;
}
int r = i + (band + 1);
- if(r > (v2.getDimensionality() - 1)) {
+ if (r > (v2.getDimensionality() - 1)) {
r = (v2.getDimensionality() - 1);
}
- for(int j = l; j <= r; j++) {
- if(Math.abs(i - j) <= band) {
+ for (int j = l; j <= r; j++) {
+ if (Math.abs(i - j) <= band) {
// compute squared distance
- double val1 = v1.doubleValue(i + 1);
- double val2 = v2.doubleValue(j + 1);
+ double val1 = v1.doubleValue(i);
+ double val2 = v2.doubleValue(j);
double diff = (val1 - val2);
final double d = Math.sqrt(diff * diff);
@@ -110,27 +110,23 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
final double subcost = (d <= deltaValue) ? 0 : 1;
- if((i + j) != 0) {
- if((i == 0) || ((j != 0) && (((prev[j - 1] + subcost) > (curr[j - 1] + 1)) && ((curr[j - 1] + 1) < (prev[j] + 1))))) {
+ if ((i + j) != 0) {
+ if ((i == 0) || ((j != 0) && (((prev[j - 1] + subcost) > (curr[j - 1] + 1)) && ((curr[j - 1] + 1) < (prev[j] + 1))))) {
// del
cost = curr[j - 1] + 1;
- }
- else if((j == 0) || ((i != 0) && (((prev[j - 1] + subcost) > (prev[j] + 1)) && ((prev[j] + 1) < (curr[j - 1] + 1))))) {
+ } else if ((j == 0) || ((i != 0) && (((prev[j - 1] + subcost) > (prev[j] + 1)) && ((prev[j] + 1) < (curr[j - 1] + 1))))) {
// ins
cost = prev[j] + 1;
- }
- else {
+ } else {
// match
cost = prev[j - 1] + subcost;
}
- }
- else {
+ } else {
cost = 0;
}
curr[j] = cost;
- }
- else {
+ } else {
curr[j] = Double.POSITIVE_INFINITY; // outside band
}
}
@@ -141,7 +137,7 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
@Override
public boolean equals(Object obj) {
- if(!super.equals(obj)) {
+ if (!super.equals(obj)) {
return false;
}
return this.delta == ((EDRDistanceFunction) obj).delta;
@@ -160,9 +156,10 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final DoubleParameter deltaP = new DoubleParameter(DELTA_ID, new GreaterEqualConstraint(0), 1.0);
- if(config.grab(deltaP)) {
- delta = deltaP.getValue();
+ final DoubleParameter deltaP = new DoubleParameter(DELTA_ID, 1.0);
+ deltaP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(deltaP)) {
+ delta = deltaP.doubleValue();
}
}
@@ -181,4 +178,4 @@ public class EDRDistanceFunction extends AbstractEditDistanceFunction {
return new EDRDistanceFunction(bandSize, delta);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/ERPDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/ERPDistanceFunction.java
index 40ed00ba..a4525a6b 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/ERPDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/ERPDistanceFunction.java
@@ -43,7 +43,7 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
/**
* G parameter
*/
- public static final OptionID G_ID = OptionID.getOrCreateOptionID("erp.g", "the g parameter ERP (positive number)");
+ public static final OptionID G_ID = new OptionID("erp.g", "the g parameter ERP (positive number)");
/**
* Keeps the currently set g.
@@ -69,7 +69,7 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
* vectors as an instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
// Current and previous columns of the matrix
double[] curr = new double[v2.getDimensionality()];
double[] prev = new double[v2.getDimensionality()];
@@ -78,7 +78,7 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
// bandsize is the maximum allowed distance to the diagonal
final int band = (int) Math.ceil(v2.getDimensionality() * bandSize);
- for(int i = 0; i < v1.getDimensionality(); i++) {
+ for (int i = 0; i < v1.getDimensionality(); i++) {
// Swap current and prev arrays. We'll just overwrite the new curr.
{
double[] temp = prev;
@@ -86,29 +86,29 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
curr = temp;
}
int l = i - (band + 1);
- if(l < 0) {
+ if (l < 0) {
l = 0;
}
int r = i + (band + 1);
- if(r > (v2.getDimensionality() - 1)) {
+ if (r > (v2.getDimensionality() - 1)) {
r = (v2.getDimensionality() - 1);
}
- for(int j = l; j <= r; j++) {
- if(Math.abs(i - j) <= band) {
+ for (int j = l; j <= r; j++) {
+ if (Math.abs(i - j) <= band) {
// compute squared distance of feature vectors
- double val1 = v1.doubleValue(i + 1);
+ double val1 = v1.doubleValue(i);
double val2 = g;
double diff = (val1 - val2);
final double d1 = Math.sqrt(diff * diff);
val1 = g;
- val2 = v2.doubleValue(j + 1);
+ val2 = v2.doubleValue(j);
diff = (val1 - val2);
final double d2 = Math.sqrt(diff * diff);
- val1 = v1.doubleValue(i + 1);
- val2 = v2.doubleValue(j + 1);
+ val1 = v1.doubleValue(i);
+ val2 = v2.doubleValue(j);
diff = (val1 - val2);
final double d12 = Math.sqrt(diff * diff);
@@ -118,28 +118,24 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
final double cost;
- if((i + j) != 0) {
- if((i == 0) || ((j != 0) && (((prev[j - 1] + dist12) > (curr[j - 1] + dist2)) && ((curr[j - 1] + dist2) < (prev[j] + dist1))))) {
+ if ((i + j) != 0) {
+ if ((i == 0) || ((j != 0) && (((prev[j - 1] + dist12) > (curr[j - 1] + dist2)) && ((curr[j - 1] + dist2) < (prev[j] + dist1))))) {
// del
cost = curr[j - 1] + dist2;
- }
- else if((j == 0) || ((i != 0) && (((prev[j - 1] + dist12) > (prev[j] + dist1)) && ((prev[j] + dist1) < (curr[j - 1] + dist2))))) {
+ } else if ((j == 0) || ((i != 0) && (((prev[j - 1] + dist12) > (prev[j] + dist1)) && ((prev[j] + dist1) < (curr[j - 1] + dist2))))) {
// ins
cost = prev[j] + dist1;
- }
- else {
+ } else {
// match
cost = prev[j - 1] + dist12;
}
- }
- else {
+ } else {
cost = 0;
}
curr[j] = cost;
// steps[i][j] = step;
- }
- else {
+ } else {
curr[j] = Double.POSITIVE_INFINITY; // outside band
}
}
@@ -150,12 +146,12 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
@Override
public boolean equals(Object obj) {
- if(!super.equals(obj)) {
+ if (!super.equals(obj)) {
return false;
}
return this.g == ((ERPDistanceFunction) obj).g;
}
-
+
/**
* Parameterization class.
*
@@ -169,9 +165,10 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final DoubleParameter gP = new DoubleParameter(G_ID, new GreaterEqualConstraint(0), 0.0);
- if(config.grab(gP)) {
- g = gP.getValue();
+ final DoubleParameter gP = new DoubleParameter(G_ID, 0.0);
+ gP.addConstraint(new GreaterEqualConstraint(0));
+ if (config.grab(gP)) {
+ g = gP.doubleValue();
}
}
@@ -180,4 +177,4 @@ public class ERPDistanceFunction extends AbstractEditDistanceFunction {
return new ERPDistanceFunction(bandSize, g);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/LCSSDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/LCSSDistanceFunction.java
index b9a26c8b..192f8d6f 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/LCSSDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/timeseries/LCSSDistanceFunction.java
@@ -34,8 +34,8 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
import de.lmu.ifi.dbs.elki.utilities.documentation.Title;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.IntervalConstraint;
-import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.IntervalConstraint.IntervalBoundary;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterEqualConstraint;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.LessEqualConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
@@ -80,12 +80,12 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
/**
* PDELTA parameter
*/
- public static final OptionID PDELTA_ID = OptionID.getOrCreateOptionID("lcss.pDelta", "the allowed deviation in x direction for LCSS alignment (positive double value, 0 <= pDelta <= 1)");
+ public static final OptionID PDELTA_ID = new OptionID("lcss.pDelta", "the allowed deviation in x direction for LCSS alignment (positive double value, 0 <= pDelta <= 1)");
/**
* PEPSILON parameter
*/
- public static final OptionID PEPSILON_ID = OptionID.getOrCreateOptionID("lcss.pEpsilon", "the allowed deviation in y directionfor LCSS alignment (positive double value, 0 <= pEpsilon <= 1)");
+ public static final OptionID PEPSILON_ID = new OptionID("lcss.pEpsilon", "the allowed deviation in y directionfor LCSS alignment (positive double value, 0 <= pEpsilon <= 1)");
/**
* Keeps the currently set pDelta.
@@ -117,7 +117,7 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
* vectors as an instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public double doubleDistance(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
+ public double doubleDistance(NumberVector<?> v1, NumberVector<?> v2) {
final int delta = (int) Math.ceil(v2.getDimensionality() * pDelta);
DoubleMinMax extrema1 = VectorUtil.getRangeDouble(v1);
@@ -130,45 +130,42 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
double[] a, b;
// put shorter vector first
- if(v1.getDimensionality() < v2.getDimensionality()) {
+ if (v1.getDimensionality() < v2.getDimensionality()) {
m = v1.getDimensionality();
n = v2.getDimensionality();
a = new double[m];
b = new double[n];
- for(int i = 0; i < v1.getDimensionality(); i++) {
- a[i] = v1.doubleValue(i + 1);
+ for (int i = 0; i < v1.getDimensionality(); i++) {
+ a[i] = v1.doubleValue(i);
}
- for(int j = 0; j < v2.getDimensionality(); j++) {
- b[j] = v2.doubleValue(j + 1);
+ for (int j = 0; j < v2.getDimensionality(); j++) {
+ b[j] = v2.doubleValue(j);
}
- }
- else {
+ } else {
m = v2.getDimensionality();
n = v1.getDimensionality();
a = new double[m];
b = new double[n];
- for(int i = 0; i < v2.getDimensionality(); i++) {
- a[i] = v2.doubleValue(i + 1);
+ for (int i = 0; i < v2.getDimensionality(); i++) {
+ a[i] = v2.doubleValue(i);
}
- for(int j = 0; j < v1.getDimensionality(); j++) {
- b[j] = v1.doubleValue(j + 1);
+ for (int j = 0; j < v1.getDimensionality(); j++) {
+ b[j] = v1.doubleValue(j);
}
}
double[] curr = new double[n + 1];
- for(int i = 0; i < m; i++) {
+ for (int i = 0; i < m; i++) {
double[] next = new double[n + 1];
- for(int j = Math.max(0, i - delta); j <= Math.min(n - 1, i + delta); j++) {
- if((b[j] + epsilon) >= a[i] & (b[j] - epsilon) <= a[i]) { // match
+ for (int j = Math.max(0, i - delta); j <= Math.min(n - 1, i + delta); j++) {
+ if ((b[j] + epsilon) >= a[i] && (b[j] - epsilon) <= a[i]) { // match
next[j + 1] = curr[j] + 1;
- }
- else if(curr[j + 1] > next[j]) { // ins
+ } else if (curr[j + 1] > next[j]) { // ins
next[j + 1] = curr[j + 1];
- }
- else { // del
+ } else { // del
next[j + 1] = next[j];
}
}
@@ -177,8 +174,8 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
// search for maximum in the last line
double maxEntry = -1;
- for(int i = 1; i < n + 1; i++) {
- if(curr[i] > maxEntry) {
+ for (int i = 1; i < n + 1; i++) {
+ if (curr[i] > maxEntry) {
maxEntry = curr[i];
}
}
@@ -188,13 +185,16 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
// TODO: relax this to VectorTypeInformation!
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == this) {
+ return true;
+ }
+ if (obj == null) {
return false;
}
if (!this.getClass().equals(obj.getClass())) {
@@ -202,7 +202,7 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
}
return (this.pDelta == ((LCSSDistanceFunction) obj).pDelta) && (this.pEpsilon == ((LCSSDistanceFunction) obj).pEpsilon);
}
-
+
/**
* Parameterization class.
*
@@ -211,21 +211,25 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
* @apiviz.exclude
*/
public static class Parameterizer extends AbstractParameterizer {
- protected Double pDelta = 0.0;
+ protected double pDelta = 0.0;
- protected Double pEpsilon = 0.0;
+ protected double pEpsilon = 0.0;
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- final DoubleParameter pDeltaP = new DoubleParameter(PDELTA_ID, new IntervalConstraint(0, IntervalBoundary.CLOSE, 1, IntervalBoundary.CLOSE), 0.1);
- if(config.grab(pDeltaP)) {
- pDelta = pDeltaP.getValue();
+ final DoubleParameter pDeltaP = new DoubleParameter(PDELTA_ID, 0.1);
+ pDeltaP.addConstraint(new GreaterEqualConstraint(0));
+ pDeltaP.addConstraint(new LessEqualConstraint(1));
+ if (config.grab(pDeltaP)) {
+ pDelta = pDeltaP.doubleValue();
}
- final DoubleParameter pEpsilonP = new DoubleParameter(PEPSILON_ID, new IntervalConstraint(0, IntervalBoundary.CLOSE, 1, IntervalBoundary.CLOSE), 0.05);
- if(config.grab(pEpsilonP)) {
- pEpsilon = pEpsilonP.getValue();
+ final DoubleParameter pEpsilonP = new DoubleParameter(PEPSILON_ID, 0.05);
+ pEpsilonP.addConstraint(new GreaterEqualConstraint(0));
+ pEpsilonP.addConstraint(new LessEqualConstraint(1));
+ if (config.grab(pEpsilonP)) {
+ pEpsilon = pEpsilonP.doubleValue();
}
}
@@ -234,4 +238,4 @@ public class LCSSDistanceFunction extends AbstractVectorDoubleDistanceFunction {
return new LCSSDistanceFunction(pDelta, pEpsilon);
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/AbstractKNNHeap.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/AbstractKNNHeap.java
new file mode 100644
index 00000000..30df7c16
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/AbstractKNNHeap.java
@@ -0,0 +1,113 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.Comparator;
+
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.TiedTopBoundedHeap;
+
+/**
+ * Heap used for KNN management.
+ *
+ * @author Erich Schubert
+ *
+ * @param <P> pair type
+ * @param <D> distance type
+ */
+abstract public class AbstractKNNHeap<P extends DistanceDBIDPair<D>, D extends Distance<D>> implements KNNHeap<D> {
+ /**
+ * Static comparator.
+ */
+ public static final Comparator<? super DistanceDBIDPair<?>> COMPARATOR = new Comp();
+
+ /**
+ * The actual heap.
+ */
+ protected final TiedTopBoundedHeap<P> heap;
+
+ /**
+ * Constructor.
+ *
+ * @param k Maximum heap size (unless tied)
+ */
+ public AbstractKNNHeap(int k) {
+ super();
+ heap = new TiedTopBoundedHeap<P>(k, COMPARATOR);
+ }
+
+ /**
+ * Add a pair to the heap.
+ *
+ * @param pair Pair to add.
+ */
+ public abstract void add(P pair);
+
+ @Override
+ public final int getK() {
+ return heap.getMaxSize();
+ }
+
+ @Override
+ public int size() {
+ return heap.size();
+ }
+
+ @Override
+ public P peek() {
+ return heap.peek();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return heap.isEmpty();
+ }
+
+ @Override
+ public void clear() {
+ heap.clear();
+ }
+
+ @Override
+ public P poll() {
+ return heap.poll();
+ }
+
+ /**
+ * Comparator to use.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ protected static class Comp implements Comparator<DistanceDBIDPair<?>> {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(DistanceDBIDPair<?> o1, DistanceDBIDPair<?> o2) {
+ return -((DistanceDBIDPair<DoubleDistance>)o1).compareByDistance((DistanceDBIDPair<DoubleDistance>)o2);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResult.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResult.java
new file mode 100644
index 00000000..2d7d68de
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResult.java
@@ -0,0 +1,88 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Collection of objects and their distances.
+ *
+ * To iterate over the results, use the following code:
+ *
+ * <pre>
+ * {@code
+ * for (DistanceDBIDResultIter<D> iter = result.iter(); iter.valid(); iter.advance()) {
+ * // You can get the distance via: iter.getDistance();
+ * // Or use iter just like any other DBIDRef
+ * }
+ * }
+ * </pre>
+ *
+ * If you are only interested in the IDs of the objects, the following is also
+ * sufficient:
+ *
+ * <pre>
+ * {@code
+ * for (DBIDIter<D> iter = result.iter(); iter.valid(); iter.advance()) {
+ * // Use iter just like any other DBIDRef
+ * }
+ * }
+ * </pre>
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.composedOf DistanceDBIDPair
+ * @apiviz.has DistanceDBIDResultIter
+ *
+ * @param <D> Distance type
+ */
+public interface DistanceDBIDResult<D extends Distance<D>> extends DBIDs {
+ /**
+ * Size of list.
+ *
+ * @return Size
+ */
+ @Override
+ public int size();
+
+ /**
+ * Access a single pair.
+ *
+ * @param off Offset
+ * @return Pair
+ */
+ public DistanceDBIDPair<D> get(int off);
+
+ /**
+ * Get an iterator
+ *
+ * @return New iterator
+ */
+ @Override
+ public DistanceDBIDResultIter<D> iter();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultIter.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultIter.java
new file mode 100644
index 00000000..d84e5d18
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultIter.java
@@ -0,0 +1,57 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Iterator over distance-based query results.
+ *
+ * There is no getter for the DBID, as this implements
+ * {@link de.lmu.ifi.dbs.elki.database.ids.DBIDRef}.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.has DistanceDBIDPair - - iterator for
+ * @apiviz.has de.lmu.ifi.dbs.elki.database.ids.DBID - - iterator for
+ */
+public interface DistanceDBIDResultIter<D extends Distance<D>> extends DBIDIter {
+ /**
+ * Get the distance
+ *
+ * @return distance
+ */
+ public D getDistance();
+
+ /**
+ * Get an object pair.
+ *
+ * @return object pair
+ */
+ public DistanceDBIDPair<D> getDistancePair();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultUtil.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultUtil.java
new file mode 100644
index 00000000..aea23be6
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DistanceDBIDResultUtil.java
@@ -0,0 +1,86 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+
+/**
+ * Utility classes for distance DBID results.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.uses DistanceDBIDPair oneway - -
+ */
+public final class DistanceDBIDResultUtil {
+ /**
+ * Get a comparator to sort by distance, then DBID
+ *
+ * @return comparator
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends DistanceDBIDPair<?>> Comparator<D> distanceComparator() {
+ return (Comparator<D>) BY_DISTANCE_THEN_DBID;
+ }
+
+ /**
+ * Sort a Java list by distance.
+ *
+ * @param list List to sort
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends DistanceDBIDPair<?>> void sortByDistance(List<? extends D> list) {
+ Collections.sort(list, (Comparator<D>) BY_DISTANCE_THEN_DBID);
+ }
+
+ /**
+ * Static comparator.
+ */
+ private static final Comparator<DistanceDBIDPair<?>> BY_DISTANCE_THEN_DBID = new Comparator<DistanceDBIDPair<?>>() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(DistanceDBIDPair<?> o1, DistanceDBIDPair<?> o2) {
+ final int d = ((DistanceDBIDPair<DoubleDistance>)o1).compareByDistance((DistanceDBIDPair<DoubleDistance>)o2);
+ return (d == 0) ? DBIDUtil.compare(o1, o2) : d;
+ }
+ };
+
+ public static String toString(DistanceDBIDResult<?> res) {
+ StringBuilder buf = new StringBuilder();
+ buf.append('[');
+ DistanceDBIDResultIter<?> iter = res.iter();
+ for(; iter.valid(); iter.advance()) {
+ if(buf.length() > 1) {
+ buf.append(", ");
+ }
+ buf.append(iter.getDistancePair().toString());
+ }
+ buf.append(']');
+ return buf.toString();
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDList.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDList.java
new file mode 100644
index 00000000..9ff22b74
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDList.java
@@ -0,0 +1,190 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDFactory;
+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.DoubleDistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+
+/**
+ * Default class to keep a list of distance-object pairs.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.composedOf DoubleDistanceDBIDPair
+ * @apiviz.has DoubleDistanceDBIDResultIter
+ */
+public class DoubleDistanceDBIDList implements ModifiableDistanceDBIDResult<DoubleDistance> {
+ /**
+ * Actual storage.
+ */
+ final ArrayList<DoubleDistanceDBIDPair> storage;
+
+ /**
+ * Constructor.
+ */
+ public DoubleDistanceDBIDList() {
+ super();
+ storage = new ArrayList<DoubleDistanceDBIDPair>();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param initialCapacity Capacity
+ */
+ public DoubleDistanceDBIDList(int initialCapacity) {
+ super();
+ storage = new ArrayList<DoubleDistanceDBIDPair>(initialCapacity);
+ }
+
+ /**
+ * Add an element.
+ *
+ * @deprecated Pass a double value instead.
+ *
+ * @param dist Distance
+ * @param id ID
+ */
+ @Override
+ @Deprecated
+ public void add(DoubleDistance dist, DBIDRef id) {
+ storage.add(DBIDFactory.FACTORY.newDistancePair(dist.doubleValue(), id));
+ }
+
+ /**
+ * Add an element.
+ *
+ * @param dist Distance
+ * @param id ID
+ */
+ public void add(double dist, DBIDRef id) {
+ storage.add(DBIDFactory.FACTORY.newDistancePair(dist, id));
+ }
+
+ /**
+ * Add an element.
+ *
+ * @param pair Pair to add
+ */
+ public void add(DoubleDistanceDBIDPair pair) {
+ storage.add(pair);
+ }
+
+ @Override
+ public void sort() {
+ Collections.sort(storage, DistanceDBIDResultUtil.distanceComparator());
+ }
+
+ @Override
+ public int size() {
+ return storage.size();
+ }
+
+ @Override
+ public DoubleDistanceDBIDPair get(int off) {
+ return storage.get(off);
+ }
+
+ @Override
+ public DoubleDistanceDBIDResultIter iter() {
+ return new Iter();
+ }
+
+ @Override
+ public boolean contains(DBIDRef o) {
+ for(DBIDIter iter = iter(); iter.valid(); iter.advance()) {
+ if(DBIDUtil.equal(iter, o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ @Override
+ public String toString() {
+ return DistanceDBIDResultUtil.toString(this);
+ }
+
+ /**
+ * Iterator class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ protected class Iter implements DoubleDistanceDBIDResultIter {
+ /**
+ * Iterator position.
+ */
+ int pos = 0;
+
+ @Override
+ public int internalGetIndex() {
+ return get(pos).internalGetIndex();
+ }
+
+ @Override
+ public boolean valid() {
+ return pos < size();
+ }
+
+ @Override
+ public void advance() {
+ pos++;
+ }
+
+ @Override
+ @Deprecated
+ public DoubleDistance getDistance() {
+ return get(pos).getDistance();
+ }
+
+ @Override
+ public double doubleDistance() {
+ return get(pos).doubleDistance();
+ }
+
+ @Override
+ public DoubleDistanceDBIDPair getDistancePair() {
+ return get(pos);
+ }
+
+ @Override
+ public String toString() {
+ return valid() ? getDistancePair().toString() : "null";
+ }
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDResultIter.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDResultIter.java
new file mode 100644
index 00000000..d022fe4c
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceDBIDResultIter.java
@@ -0,0 +1,61 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+
+/**
+ * Iterator for double valued distance-based query results.
+ *
+ * @author Erich Schubert
+ */
+public interface DoubleDistanceDBIDResultIter extends DistanceDBIDResultIter<DoubleDistance> {
+ /**
+ * Get the distance
+ *
+ * @return distance
+ */
+ public double doubleDistance();
+
+ /**
+ * Get an object pair.
+ *
+ * @return object pair
+ */
+ @Override
+ public DoubleDistanceDBIDPair getDistancePair();
+
+ /**
+ * Get the distance
+ *
+ * @deprecated Use {@link #doubleDistance} to avoid creating unnecessary
+ * objects.
+ *
+ * @return distance
+ */
+ @Deprecated
+ @Override
+ public DoubleDistance getDistance();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNHeap.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNHeap.java
new file mode 100644
index 00000000..7faa407d
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNHeap.java
@@ -0,0 +1,191 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.Comparator;
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDFactory;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+
+/**
+ * Heap for collecting double-valued KNN instances.
+ *
+ * See also: {@link KNNUtil#newHeap}!
+ *
+ * Experiments have shown that it can be much more performant to track the
+ * knndistance <em>outside</em> of the heap, and do comparisons on the stack:
+ * <blockquote>
+ *
+ * <pre>
+ * {@code
+ * double knndist = Double.POSITIVE_INFINITY;
+ * DoubleDistanceKNNHeap heap = new DoubleDistanceKNNHeap(k);
+ * for (DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
+ * double dist = computeDistance(iditer, ...);
+ * if (dist < knndist) {
+ * heap.add(dist, iditer);
+ * if (heap.size() >= k) {
+ * max = heap.doubleKNNDistance();
+ * }
+ * }
+ * }
+ * }
+ * </pre>
+ *
+ * </blockquote>
+ *
+ * The reason probably is that {@code knndist} resides on the stack and can be
+ * better optimized by the hotspot compiler.
+ *
+ * @author Erich Schubert
+ */
+public class DoubleDistanceKNNHeap extends AbstractKNNHeap<DoubleDistanceDBIDPair, DoubleDistance> {
+ /**
+ * Comparator class.
+ */
+ public static final Comparator<DoubleDistanceDBIDPair> COMPARATOR = new Comp();
+
+ /**
+ * Cached distance to k nearest neighbor (to avoid going through {@link #peek}
+ * too often).
+ */
+ protected double knndistance = Double.POSITIVE_INFINITY;
+
+ /**
+ * Constructor.
+ *
+ * See also: {@link KNNUtil#newHeap}!
+ *
+ * @param k Heap size
+ */
+ public DoubleDistanceKNNHeap(int k) {
+ super(k);
+ }
+
+ /**
+ * Serialize to a {@link DoubleDistanceKNNList}. This empties the heap!
+ *
+ * @return KNNList with the heaps contents.
+ */
+ @Override
+ public DoubleDistanceKNNList toKNNList() {
+ return new DoubleDistanceKNNList(this);
+ }
+
+ /**
+ * Add a distance-id pair to the heap unless the distance is too large.
+ *
+ * Compared to the super.add() method, this often saves the pair construction.
+ *
+ * @param distance Distance value
+ * @param id ID number
+ */
+ public final void add(final double distance, final DBIDRef id) {
+ if (size() < getK() || knndistance >= distance) {
+ heap.add(DBIDFactory.FACTORY.newDistancePair(distance, id));
+ heapModified();
+ }
+ }
+
+ /**
+ * Add a distance-id pair to the heap unless the distance is too large.
+ *
+ * Compared to the super.add() method, this often saves the pair construction.
+ *
+ * @param distance Distance value
+ * @param id ID number
+ */
+ public final void add(final Double distance, final DBIDRef id) {
+ if (size() < getK() || knndistance >= distance) {
+ heap.add(DBIDFactory.FACTORY.newDistancePair(distance, id));
+ heapModified();
+ }
+ }
+
+ // @Override
+ protected void heapModified() {
+ // super.heapModified();
+ if (size() >= getK()) {
+ knndistance = heap.peek().doubleDistance();
+ }
+ }
+
+ // @Override
+ public void add(final DoubleDistanceDBIDPair e) {
+ if (size() < getK() || knndistance >= e.doubleDistance()) {
+ heap.add(e);
+ heapModified();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @deprecated if you know your distances are double-valued, you should be
+ * using the primitive type.
+ *
+ */
+ @Override
+ @Deprecated
+ public void add(DoubleDistance dist, DBIDRef id) {
+ add(dist.doubleValue(), id);
+ }
+
+ /**
+ * Get the distance to the k nearest neighbor, or maxdist otherwise.
+ *
+ * @return Maximum distance
+ */
+ public double doubleKNNDistance() {
+ return knndistance;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @deprecated if you know your distances are double-valued, you should be
+ * using the primitive type.
+ */
+ @Override
+ @Deprecated
+ public DoubleDistance getKNNDistance() {
+ return new DoubleDistance(knndistance);
+ }
+
+ /**
+ * Comparator to use.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ protected static class Comp implements Comparator<DoubleDistanceDBIDPair> {
+ @Override
+ public int compare(DoubleDistanceDBIDPair o1, DoubleDistanceDBIDPair o2) {
+ return -Double.compare(o1.doubleDistance(), o2.doubleDistance());
+ }
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNList.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNList.java
new file mode 100644
index 00000000..656377c6
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/DoubleDistanceKNNList.java
@@ -0,0 +1,238 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.Collection;
+import java.util.Iterator;
+
+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.DoubleDistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.Heap;
+
+/**
+ * Finalized KNN List.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.composedOf DoubleDistanceDBIDPair
+ * @apiviz.has DoubleDistanceDBIDResultIter
+ */
+public class DoubleDistanceKNNList implements KNNResult<DoubleDistance> {
+ /**
+ * The value of k this was materialized for.
+ */
+ private final int k;
+
+ /**
+ * The actual data array.
+ */
+ private final DoubleDistanceDBIDPair[] data;
+
+ /**
+ * Constructor. This will <em>clone</em> the given collection!
+ *
+ * @param col Existing collection
+ * @param k K parameter
+ */
+ public DoubleDistanceKNNList(Collection<DoubleDistanceDBIDPair> col, int k) {
+ super();
+ this.data = new DoubleDistanceDBIDPair[col.size()];
+ this.k = k;
+ assert (col.size() >= this.k) : "Collection doesn't contain enough objects!";
+ // Get sorted data from heap; but in reverse.
+ Iterator<DoubleDistanceDBIDPair> it = col.iterator();
+ for(int i = 0; it.hasNext(); i++) {
+ data[i] = it.next();
+ }
+ assert (data.length == 0 || data[0] != null);
+ }
+
+ /**
+ * Constructor, to be called from KNNHeap only. Use {@link KNNHeap#toKNNList}
+ * instead!
+ *
+ * @param heap Calling heap
+ */
+ protected DoubleDistanceKNNList(DoubleDistanceKNNHeap heap) {
+ super();
+ this.data = new DoubleDistanceDBIDPair[heap.size()];
+ this.k = heap.getK();
+ assert (heap.size() >= this.k) : "Heap doesn't contain enough objects!";
+ // Get sorted data from heap; but in reverse.
+ int i = heap.size();
+ while(heap.size() > 0) {
+ i--;
+ assert (i >= 0);
+ data[i] = heap.poll();
+ }
+ assert (data.length == 0 || data[0] != null);
+ assert (heap.size() == 0);
+ }
+
+ /**
+ * Constructor, to be called from KNNHeap only. Use {@link KNNHeap#toKNNList}
+ * instead!
+ *
+ * @param heap Calling heap
+ * @param k Target number of neighbors (before ties)
+ */
+ public DoubleDistanceKNNList(Heap<DoubleDistanceDBIDPair> heap, int k) {
+ super();
+ this.data = new DoubleDistanceDBIDPair[heap.size()];
+ this.k = k;
+ assert (heap.size() >= this.k) : "Heap doesn't contain enough objects!";
+ // Get sorted data from heap; but in reverse.
+ int i = heap.size();
+ while(heap.size() > 0) {
+ i--;
+ assert (i >= 0);
+ data[i] = heap.poll();
+ }
+ assert (data.length == 0 || data[0] != null);
+ assert (heap.size() == 0);
+ }
+
+ @Override
+ public int getK() {
+ return k;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @deprecated use doubleKNNDistance()!
+ */
+ @Override
+ @Deprecated
+ public DoubleDistance getKNNDistance() {
+ return get(getK() - 1).getDistance();
+ }
+
+ /**
+ * Get the kNN distance as double value.
+ *
+ * @return Distance
+ */
+ public double doubleKNNDistance() {
+ return get(getK() - 1).doubleDistance();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append("kNNList[");
+ for(DoubleDistanceDBIDResultIter iter = this.iter(); iter.valid();) {
+ buf.append(iter.doubleDistance()).append(':').append(DBIDUtil.toString(iter));
+ iter.advance();
+ if(iter.valid()) {
+ buf.append(',');
+ }
+ }
+ buf.append(']');
+ return buf.toString();
+ }
+
+ @Override
+ public DoubleDistanceDBIDPair get(int index) {
+ return data[index];
+ }
+
+ @Override
+ public DoubleDistanceDBIDResultIter iter() {
+ return new Itr();
+ }
+
+ @Override
+ public int size() {
+ return data.length;
+ }
+
+ @Override
+ public boolean contains(DBIDRef o) {
+ for(DBIDIter iter = iter(); iter.valid(); iter.advance()) {
+ if(DBIDUtil.equal(iter, o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ /**
+ * Iterator.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ private class Itr implements DoubleDistanceDBIDResultIter {
+ /**
+ * Cursor position.
+ */
+ private int pos = 0;
+
+ @Override
+ public int internalGetIndex() {
+ return get(pos).internalGetIndex();
+ }
+
+ @Override
+ public boolean valid() {
+ return pos < data.length;
+ }
+
+ @Override
+ public void advance() {
+ pos++;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @deprecated use {@link #doubleDistance}!
+ */
+ @Override
+ @Deprecated
+ public DoubleDistance getDistance() {
+ return get(pos).getDistance();
+ }
+
+ @Override
+ public double doubleDistance() {
+ return get(pos).doubleDistance();
+ }
+
+ @Override
+ public DoubleDistanceDBIDPair getDistancePair() {
+ return get(pos);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericDistanceDBIDList.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericDistanceDBIDList.java
new file mode 100644
index 00000000..05e4e687
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericDistanceDBIDList.java
@@ -0,0 +1,163 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.ArrayList;
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDFactory;
+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.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Default class to keep a list of distance-object pairs.
+ *
+ * @author Erich Schubert
+ *
+ * @param <D> Distance type
+ */
+public class GenericDistanceDBIDList<D extends Distance<D>> implements ModifiableDistanceDBIDResult<D> {
+ /**
+ * Actual storage.
+ */
+ final ArrayList<DistanceDBIDPair<D>> storage;
+
+ /**
+ * Constructor.
+ */
+ public GenericDistanceDBIDList() {
+ super();
+ storage = new ArrayList<DistanceDBIDPair<D>>();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param initialCapacity Capacity
+ */
+ public GenericDistanceDBIDList(int initialCapacity) {
+ super();
+ storage = new ArrayList<DistanceDBIDPair<D>>(initialCapacity);
+ }
+
+ @Override
+ public void add(D dist, DBIDRef id) {
+ storage.add(DBIDFactory.FACTORY.newDistancePair(dist, id));
+ }
+
+ /**
+ * Add a prepared pair.
+ *
+ * @param pair Pair to add
+ */
+ public void add(DistanceDBIDPair<D> pair) {
+ storage.add(pair);
+ }
+
+ @Override
+ public void sort() {
+ DistanceDBIDResultUtil.sortByDistance(storage);
+ }
+
+ @Override
+ public int size() {
+ return storage.size();
+ }
+
+ @Override
+ public DistanceDBIDPair<D> get(int off) {
+ return storage.get(off);
+ }
+
+ @Override
+ public DistanceDBIDResultIter<D> iter() {
+ return new Iter();
+ }
+
+ @Override
+ public boolean contains(DBIDRef o) {
+ for(DBIDIter iter = iter(); iter.valid(); iter.advance()) {
+ if(DBIDUtil.equal(iter, o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ @Override
+ public String toString() {
+ return DistanceDBIDResultUtil.toString(this);
+ }
+
+ /**
+ * Iterator class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ protected class Iter implements DistanceDBIDResultIter<D> {
+ /**
+ * Iterator position.
+ */
+ int pos = 0;
+
+ @Override
+ public int internalGetIndex() {
+ return get(pos).internalGetIndex();
+ }
+
+ @Override
+ public boolean valid() {
+ return pos < size();
+ }
+
+ @Override
+ public void advance() {
+ pos++;
+ }
+
+ @Override
+ public D getDistance() {
+ return get(pos).getDistance();
+ }
+
+ @Override
+ public DistanceDBIDPair<D> getDistancePair() {
+ return get(pos);
+ }
+
+ @Override
+ public String toString() {
+ return valid() ? getDistancePair().toString() : "null";
+ }
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNHeap.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNHeap.java
new file mode 100644
index 00000000..c13887be
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNHeap.java
@@ -0,0 +1,106 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDFactory;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Heap for collecting kNN candiates with arbitrary distance types.
+ *
+ * For double distances, see {@link DoubleDistanceKNNHeap}
+ *
+ * <b>To instantiate, use {@link KNNUtil#newHeap} instead!</b>
+ *
+ * @author Erich Schubert
+ *
+ * @param <D> Distance type
+ */
+class GenericKNNHeap<D extends Distance<D>> extends AbstractKNNHeap<DistanceDBIDPair<D>, D> {
+ /**
+ * Cached distance to k nearest neighbor (to avoid going through {@link #peek}
+ * each time).
+ */
+ protected D knndistance = null;
+
+ /**
+ * Constructor.
+ *
+ * <b>To instantiate, use {@link KNNUtil#newHeap} instead!</b>
+ *
+ * @param k Heap size
+ */
+ protected GenericKNNHeap(int k) {
+ super(k);
+ }
+
+ /**
+ * Serialize to a {@link GenericKNNList}. This empties the heap!
+ *
+ * @return KNNList with the heaps contents.
+ */
+ @Override
+ public GenericKNNList<D> toKNNList() {
+ return new GenericKNNList<D>(this);
+ }
+
+ @Override
+ public void add(D distance, DBIDRef id) {
+ if (size() < getK()) {
+ heap.add(DBIDFactory.FACTORY.newDistancePair(distance, id));
+ heapModified();
+ return;
+ }
+ // size >= maxsize. Insert only when necessary.
+ if (knndistance.compareTo(distance) >= 0) {
+ // Replace worst element.
+ heap.add(DBIDFactory.FACTORY.newDistancePair(distance, id));
+ heapModified();
+ }
+ }
+
+ @Override
+ public void add(DistanceDBIDPair<D> pair) {
+ if (size() < getK() || knndistance.compareTo(pair.getDistance()) >= 0) {
+ heap.add(pair);
+ heapModified();
+ }
+ }
+
+ // @Override
+ protected void heapModified() {
+ // super.heapModified();
+ // Update threshold.
+ if (size() >= getK()) {
+ knndistance = heap.peek().getDistance();
+ }
+ }
+
+ @Override
+ public D getKNNDistance() {
+ return knndistance;
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNList.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNList.java
new file mode 100644
index 00000000..71217b23
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/GenericKNNList.java
@@ -0,0 +1,189 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+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.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.Heap;
+
+/**
+ * Finalized KNN List.
+ *
+ * @author Erich Schubert
+ *
+ * @param <D> Distance type
+ */
+public class GenericKNNList<D extends Distance<D>> implements KNNResult<D> {
+ /**
+ * The value of k this was materialized for.
+ */
+ private final int k;
+
+ /**
+ * The actual data array.
+ */
+ private final Object[] data;
+
+ /**
+ * Constructor, to be called from KNNHeap only. Use {@link KNNHeap#toKNNList}
+ * instead!
+ *
+ * @param heap Calling heap
+ */
+ protected GenericKNNList(KNNHeap<D> heap) {
+ super();
+ this.data = new Object[heap.size()];
+ this.k = heap.getK();
+ assert (heap.size() >= this.k) : "Heap doesn't contain enough objects!";
+ // Get sorted data from heap; but in reverse.
+ int i = heap.size();
+ while(heap.size() > 0) {
+ i--;
+ assert (i >= 0);
+ data[i] = heap.poll();
+ }
+ assert (data.length == 0 || data[0] != null);
+ assert (heap.size() == 0);
+ }
+
+ /**
+ * Constructor. With a KNNHeap, use {@link KNNHeap#toKNNList} instead!
+ *
+ * @param heap Calling heap
+ * @param k K value
+ */
+ public GenericKNNList(Heap<? extends DistanceDBIDPair<D>> heap, int k) {
+ super();
+ this.data = new Object[heap.size()];
+ this.k = k;
+ assert (heap.size() >= this.k) : "Heap doesn't contain enough objects!";
+ // Get sorted data from heap; but in reverse.
+ int i = heap.size();
+ while(!heap.isEmpty()) {
+ i--;
+ assert (i >= 0);
+ data[i] = heap.poll();
+ }
+ assert (data.length == 0 || data[0] != null);
+ assert (heap.size() == 0);
+ }
+
+ @Override
+ public int getK() {
+ return k;
+ }
+
+ @Override
+ public D getKNNDistance() {
+ return get(getK() - 1).getDistance();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append("kNNList[");
+ for(DistanceDBIDResultIter<D> iter = this.iter(); iter.valid();) {
+ buf.append(iter.getDistance()).append(':').append(DBIDUtil.toString(iter));
+ iter.advance();
+ if(iter.valid()) {
+ buf.append(',');
+ }
+ }
+ buf.append(']');
+ return buf.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public DistanceDBIDPair<D> get(int index) {
+ return (DistanceDBIDPair<D>) data[index];
+ }
+
+ @Override
+ public DistanceDBIDResultIter<D> iter() {
+ return new Itr();
+ }
+
+ @Override
+ public int size() {
+ return data.length;
+ }
+
+ @Override
+ public boolean contains(DBIDRef o) {
+ for(DBIDIter iter = iter(); iter.valid(); iter.advance()) {
+ if(DBIDUtil.equal(iter, o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ /**
+ * Iterator.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ private class Itr implements DistanceDBIDResultIter<D> {
+ /**
+ * Cursor position.
+ */
+ private int pos = 0;
+
+ @Override
+ public int internalGetIndex() {
+ return get(pos).internalGetIndex();
+ }
+
+ @Override
+ public boolean valid() {
+ return pos < data.length;
+ }
+
+ @Override
+ public void advance() {
+ pos++;
+ }
+
+ @Override
+ public D getDistance() {
+ return get(pos).getDistance();
+ }
+
+ @Override
+ public DistanceDBIDPair<D> getDistancePair() {
+ return get(pos);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNHeap.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNHeap.java
new file mode 100644
index 00000000..cdcb7d98
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNHeap.java
@@ -0,0 +1,113 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Interface for kNN heaps.
+ *
+ * To instantiate, use: {@link KNNUtil#newHeap}!
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.uses GenericKNNList - - «serializes to»
+ * @apiviz.uses DoubleDistanceKNNList - - «serializes to»
+ * @apiviz.composedOf DistanceDBIDPair
+ *
+ * @param <D> Distance function
+ */
+public interface KNNHeap<D extends Distance<D>> {
+ /**
+ * Serialize to a {@link GenericKNNList}. This empties the heap!
+ *
+ * @return KNNList with the heaps contents.
+ */
+ KNNResult<D> toKNNList();
+
+ /**
+ * Get the K parameter ("maxsize" internally).
+ *
+ * @return K
+ */
+ int getK();
+
+ /**
+ * Get the distance to the k nearest neighbor, or maxdist otherwise.
+ *
+ * @return Maximum distance
+ */
+ D getKNNDistance();
+
+ /**
+ * Add a distance-id pair to the heap unless the distance is too large.
+ *
+ * Compared to the super.add() method, this often saves the pair construction.
+ *
+ * @param distance Distance value
+ * @param id ID number
+ */
+ void add(D distance, DBIDRef id);
+
+ /**
+ * Current size of heap.
+ *
+ * @return Heap size
+ */
+ int size();
+
+ /**
+ * Test if the heap is empty.
+ *
+ * @return true when empty.
+ */
+ boolean isEmpty();
+
+ /**
+ * Clear the heap.
+ */
+ void clear();
+
+ /**
+ * Poll the <em>largest</em> element from the heap.
+ *
+ * This is in descending order because of the heap structure. For a convenient
+ * way to serialize the heap into a list that you can iterate in ascending
+ * order, see {@link #toKNNList()}.
+ *
+ * @return largest element
+ */
+ DistanceDBIDPair<D> poll();
+
+ /**
+ * Peek at the <em>largest</em> element in the heap.
+ *
+ * @return The current largest element.
+ */
+ DistanceDBIDPair<D> peek();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNResult.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNResult.java
new file mode 100644
index 00000000..785e5b8a
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNResult.java
@@ -0,0 +1,91 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+
+/**
+ * Interface for kNN results.
+ *
+ * To iterate over the results, use the following code:
+ *
+ * <pre>
+ * {@code
+ * for (DistanceDBIDResultIter<D> iter = result.iter(); iter.valid(); iter.advance()) {
+ * // You can get the distance via: iter.getDistance();
+ * // Or use iter just like any other DBIDRef
+ * }
+ * }
+ * </pre>
+ *
+ * If you are only interested in the IDs of the objects, the following is also
+ * sufficient:
+ *
+ * <pre>
+ * {@code
+ * for (DBIDIter<D> iter = result.iter(); iter.valid(); iter.advance()) {
+ * // Use iter just like any other DBIDRef
+ * }
+ * }
+ * </pre>
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.composedOf DistanceDBIDPair
+ * @apiviz.has DistanceDBIDResultIter
+ *
+ * @param <D> Distance type
+ */
+public interface KNNResult<D extends Distance<D>> extends DistanceDBIDResult<D> {
+ /**
+ * Size
+ */
+ @Override
+ public int size();
+
+ /**
+ * Get the K parameter (note: this may be less than the size of the list!)
+ *
+ * @return K
+ */
+ public int getK();
+
+ /**
+ * Direct object access.
+ *
+ * @param index
+ */
+ @Override
+ public DistanceDBIDPair<D> get(int index);
+
+ /**
+ * Get the distance to the k nearest neighbor, or maxdist otherwise.
+ *
+ * @return Maximum distance
+ */
+ public D getKNNDistance();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNUtil.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNUtil.java
new file mode 100644
index 00000000..fa658941
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/KNNUtil.java
@@ -0,0 +1,372 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.AbstractList;
+import java.util.Iterator;
+import java.util.List;
+
+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.DistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDistanceDBIDPair;
+import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
+import de.lmu.ifi.dbs.elki.distance.DistanceUtil;
+import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
+
+/**
+ * Helper classes for kNN results.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.landmark
+ *
+ * @apiviz.has KNNResult oneway - - «processes»
+ * @apiviz.has KNNHeap oneway - - «creates»
+ * @apiviz.has DistanceView
+ * @apiviz.has KNNSubList
+ */
+public final class KNNUtil {
+ /**
+ * Fake constructor: do not instantiate.
+ */
+ private KNNUtil() {
+ // Empty.
+ }
+
+ /**
+ * Create an appropriate heap for the distance function.
+ *
+ * This will use a double heap if appropriate.
+ *
+ * @param df Distance function
+ * @param k K value
+ * @param <D> distance type
+ * @return New heap of size k, appropriate for this distance function.
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends Distance<D>> KNNHeap<D> newHeap(DistanceFunction<?, D> df, int k) {
+ if (DistanceUtil.isDoubleDistanceFunction(df)) {
+ return (KNNHeap<D>) new DoubleDistanceKNNHeap(k);
+ }
+ return new GenericKNNHeap<D>(k);
+ }
+
+ /**
+ * Create an appropriate heap for the distance function.
+ *
+ * This will use a double heap if appropriate.
+ *
+ * @param df Distance function
+ * @param k K value
+ * @param <D> distance type
+ * @return New heap of size k, appropriate for this distance function.
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends Distance<D>> KNNHeap<D> newHeap(DistanceQuery<?, D> df, int k) {
+ if (DistanceUtil.isDoubleDistanceFunction(df)) {
+ return (KNNHeap<D>) new DoubleDistanceKNNHeap(k);
+ }
+ return new GenericKNNHeap<D>(k);
+ }
+
+ /**
+ * Create an appropriate heap for the distance function.
+ *
+ * This will use a double heap if appropriate.
+ *
+ * @param factory distance prototype
+ * @param k K value
+ * @param <D> distance type
+ * @return New heap of size k, appropriate for this distance type.
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends Distance<D>> KNNHeap<D> newHeap(D factory, int k) {
+ if (factory instanceof DoubleDistance) {
+ return (KNNHeap<D>) new DoubleDistanceKNNHeap(k);
+ }
+ return new GenericKNNHeap<D>(k);
+ }
+
+ /**
+ * Build a new heap from a given list.
+ *
+ * @param exist Existing result
+ * @param <D> Distance type
+ * @return New heap
+ */
+ @SuppressWarnings("unchecked")
+ public static <D extends Distance<D>> KNNHeap<D> newHeap(KNNResult<D> exist) {
+ if (exist instanceof DoubleDistanceKNNList) {
+ DoubleDistanceKNNHeap heap = new DoubleDistanceKNNHeap(exist.getK());
+ // Insert backwards, as this will produce a proper heap
+ for (int i = exist.size() - 1; i >= 0; i--) {
+ heap.add((DoubleDistanceDBIDPair) exist.get(i));
+ }
+ return (KNNHeap<D>) heap;
+ } else {
+ GenericKNNHeap<D> heap = new GenericKNNHeap<D>(exist.getK());
+ // Insert backwards, as this will produce a proper heap
+ for (int i = exist.size() - 1; i >= 0; i--) {
+ heap.add(exist.get(i));
+ }
+ return heap;
+ }
+ }
+
+ /**
+ * Sublist of an existing result to contain only the first k elements.
+ *
+ * @author Erich Schubert
+ *
+ * @param <D> Distance
+ */
+ protected static class KNNSubList<D extends Distance<D>> implements KNNResult<D> {
+ /**
+ * Parameter k.
+ */
+ private final int k;
+
+ /**
+ * Actual size, including ties.
+ */
+ private final int size;
+
+ /**
+ * Wrapped inner result.
+ */
+ private final KNNResult<D> inner;
+
+ /**
+ * Constructor.
+ *
+ * @param inner Inner instance
+ * @param k k value
+ */
+ public KNNSubList(KNNResult<D> inner, int k) {
+ this.inner = inner;
+ this.k = k;
+ // Compute list size
+ // TODO: optimize for double distances.
+ {
+ DistanceDBIDPair<D> dist = inner.get(k);
+ int i = k;
+ while (i + 1 < inner.size()) {
+ if (dist.compareByDistance(inner.get(i + 1)) < 0) {
+ break;
+ }
+ i++;
+ }
+ size = i;
+ }
+ }
+
+ @Override
+ public int getK() {
+ return k;
+ }
+
+ @Override
+ public DistanceDBIDPair<D> get(int index) {
+ assert (index < size) : "Access beyond design size of list.";
+ return inner.get(index);
+ }
+
+ @Override
+ public D getKNNDistance() {
+ return inner.get(k).getDistance();
+ }
+
+ @Override
+ public DistanceDBIDResultIter<D> iter() {
+ return new Itr();
+ }
+
+ @Override
+ public boolean contains(DBIDRef o) {
+ for (DBIDIter iter = iter(); iter.valid(); iter.advance()) {
+ if (DBIDUtil.equal(iter, o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return size == 0;
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ /**
+ * Iterator for the sublist.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ private class Itr implements DistanceDBIDResultIter<D> {
+ /**
+ * Current position.
+ */
+ private int pos = 0;
+
+ @Override
+ public boolean valid() {
+ return pos < size;
+ }
+
+ @Override
+ public void advance() {
+ pos++;
+ }
+
+ @Override
+ public D getDistance() {
+ return inner.get(pos).getDistance();
+ }
+
+ @Override
+ public DistanceDBIDPair<D> getDistancePair() {
+ return inner.get(pos);
+ }
+
+ @Override
+ public int internalGetIndex() {
+ return inner.get(pos).internalGetIndex();
+ }
+ }
+ }
+
+ /**
+ * Proxy iterator for accessing DBIDs.
+ *
+ * @author Erich Schubert
+ */
+ protected static class DistanceItr<D extends Distance<D>> implements Iterator<D> {
+ /**
+ * The real iterator.
+ */
+ DistanceDBIDResultIter<D> itr;
+
+ /**
+ * Constructor.
+ *
+ * @param distanceDBIDResultIter Iterator
+ */
+ protected DistanceItr(DistanceDBIDResultIter<D> distanceDBIDResultIter) {
+ super();
+ this.itr = distanceDBIDResultIter;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return itr.valid();
+ }
+
+ @Override
+ public D next() {
+ D dist = itr.getDistance();
+ itr.advance();
+ return dist;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * A view on the Distances of the result.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.composedOf DistanceItr
+ */
+ protected static class DistanceView<D extends Distance<D>> extends AbstractList<D> implements List<D> {
+ /**
+ * The true list.
+ */
+ final KNNResult<D> parent;
+
+ /**
+ * Constructor.
+ *
+ * @param parent Owner
+ */
+ public DistanceView(KNNResult<D> parent) {
+ super();
+ this.parent = parent;
+ }
+
+ @Override
+ public D get(int i) {
+ return parent.get(i).getDistance();
+ }
+
+ @Override
+ public Iterator<D> iterator() {
+ return new DistanceItr<D>(parent.iter());
+ }
+
+ @Override
+ public int size() {
+ return parent.size();
+ }
+ }
+
+ /**
+ * View as list of distances.
+ *
+ * @param list Result to proxy
+ * @param <D> distance type
+ * @return List of distances view
+ */
+ public static <D extends Distance<D>> List<D> asDistanceList(KNNResult<D> list) {
+ return new DistanceView<D>(list);
+ }
+
+ /**
+ * Get a subset of the KNN result.
+ *
+ * @param list Existing list
+ * @param k k
+ * @param <D> distance type
+ * @return Subset
+ */
+ public static <D extends Distance<D>> KNNResult<D> subList(KNNResult<D> list, int k) {
+ if (k >= list.size()) {
+ return list;
+ }
+ return new KNNSubList<D>(list, k);
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/ModifiableDistanceDBIDResult.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/ModifiableDistanceDBIDResult.java
new file mode 100644
index 00000000..52889652
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/ModifiableDistanceDBIDResult.java
@@ -0,0 +1,48 @@
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+/**
+ * Modifiable API for Distance-DBID results
+ *
+ * @author Erich Schubert
+ *
+ * @param <D> Distance type
+ */
+public interface ModifiableDistanceDBIDResult<D extends Distance<D>> extends DistanceDBIDResult<D> {
+ /**
+ * Add an object to this result.
+ *
+ * @param distance Distance to add
+ * @param id DBID to add
+ */
+ public void add(D distance, DBIDRef id);
+
+ /**
+ * Sort the result in ascending order
+ */
+ public void sort();
+} \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/package-info.java b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/package-info.java
new file mode 100644
index 00000000..3d2a4b3b
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/distance/distanceresultlist/package-info.java
@@ -0,0 +1,53 @@
+/**
+ * <p>Classes for building and storing the results of distance-based queries</p>
+ *
+ * <p>The classes in this package essentially form three groups:
+ * <ol>
+ * <li>{@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNHeap} for <b>building kNN results</b>.
+ * It allows adding new candidates (and loses old candidates automatically), but it is not iterable.<br />
+ * To get an instance, use {@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNUtil#newHeap}!
+ * </li>
+ * <li>{@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult} is the <b>final kNN result</b>
+ * obtained by serializing a heap via {@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNHeap#toKNNList}.
+ * It is iterable and totally ordered, but can no longer be modified (unless you call
+ * {@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNUtil#newHeap}!</li>
+ * <li>{@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.GenericDistanceDBIDList} and the optimized
+ * counterpart {@link de.lmu.ifi.dbs.elki.distance.distanceresultlist.DoubleDistanceDBIDList}, are
+ * <b>modifiable, but not necessarily sorted</b> lists of neighbors, useful for example for range queries.</li>
+ * </ol>
+ * </p>
+ *
+ * <p>Try to choose the most appropriate one! Heaps are optimized for updates but bad for reading,
+ * KNNResult is optimized for reading but unmodifiable, and the lists are easy to modify,
+ * but less efficient than heaps.</p>
+ *
+ * @apiviz.exclude java.util.*
+ * @apiviz.exclude elki.database.query.*
+ * @apiviz.exclude elki.database.ids.DBIDIter
+ * @apiviz.exclude elki.database.ids.DBIDs
+ * @apiviz.exclude KNNUtil.DistanceItr
+ * @apiviz.exclude DoubleDistance
+ */
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.lmu.ifi.dbs.elki.distance.distanceresultlist; \ No newline at end of file
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/BitDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/BitDistance.java
index 24e33d35..9c81188f 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/BitDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/BitDistance.java
@@ -40,7 +40,7 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
/**
* The static factory instance
*/
- public final static BitDistance FACTORY = new BitDistance();
+ public static final BitDistance FACTORY = new BitDistance();
/**
* The distance value
@@ -108,7 +108,7 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
*/
@Override
public void writeExternal(ObjectOutput out) throws IOException {
- out.writeBoolean(this.bitValue());
+ out.writeBoolean(value);
}
/**
@@ -116,7 +116,7 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
*/
@Override
public void readExternal(ObjectInput in) throws IOException {
- setValue(new Bit(in.readBoolean()));
+ value = in.readBoolean();
}
/**
@@ -131,16 +131,6 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
}
@Override
- public Bit getValue() {
- return new Bit(this.value);
- }
-
- @Override
- void setValue(Bit value) {
- this.value = value.bitValue();
- }
-
- @Override
public double doubleValue() {
return value ? 1.0 : 0.0;
}
@@ -162,10 +152,9 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
@Override
public BitDistance parseString(String val) throws IllegalArgumentException {
- if(testInputPattern(val)) {
+ if (testInputPattern(val)) {
return new BitDistance(Bit.valueOf(val).bitValue());
- }
- else {
+ } else {
throw new IllegalArgumentException("Given pattern \"" + val + "\" does not match required pattern \"" + requiredInputPattern() + "\"");
}
}
@@ -197,11 +186,36 @@ public class BitDistance extends NumberDistance<BitDistance, Bit> {
@Override
public boolean isNullDistance() {
- return (value == false);
+ return !value;
}
@Override
public boolean isUndefinedDistance() {
return false;
}
-} \ No newline at end of file
+
+ @Override
+ public String toString() {
+ return Boolean.toString(value);
+ }
+
+ @Override
+ public int hashCode() {
+ return (value ? 1231 : 1237);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ BitDistance other = (BitDistance) obj;
+ return (value == other.value);
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/CorrelationDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/CorrelationDistance.java
index f1203887..080f13c9 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/CorrelationDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/CorrelationDistance.java
@@ -43,13 +43,13 @@ public abstract class CorrelationDistance<D extends CorrelationDistance<D>> exte
*
* Note: Do NOT use regular expression syntax characters!
*/
- public final static String SEPARATOR = "x";
+ public static final String SEPARATOR = "x";
/**
* The pattern used for correlation distances
*/
- public final static Pattern CORRELATION_DISTANCE_PATTERN = Pattern.compile("\\d+" + Pattern.quote(SEPARATOR) + "\\d+(\\.\\d+)?([eE][-]?\\d+)?");
-
+ public static final Pattern CORRELATION_DISTANCE_PATTERN = Pattern.compile("\\d+" + Pattern.quote(SEPARATOR) + "\\d+(\\.\\d+)?([eE][-]?\\d+)?");
+
/**
* Generated SerialVersionUID.
*/
@@ -110,11 +110,10 @@ public abstract class CorrelationDistance<D extends CorrelationDistance<D>> exte
*/
@Override
public int compareTo(D other) {
- int compare = new Integer(this.correlationValue).compareTo(other.getCorrelationValue());
- if(compare != 0) {
+ int compare = (this.correlationValue < other.getCorrelationValue()) ? -1 : (this.correlationValue > other.getCorrelationValue()) ? +1 : 0;
+ if (compare != 0) {
return compare;
- }
- else {
+ } else {
return Double.compare(this.euclideanValue, other.getEuclideanValue());
}
}
@@ -124,7 +123,7 @@ public abstract class CorrelationDistance<D extends CorrelationDistance<D>> exte
int result;
long temp;
result = correlationValue;
- temp = euclideanValue != +0.0d ? Double.doubleToLongBits(euclideanValue) : 0l;
+ temp = euclideanValue >= Double.MIN_NORMAL ? Double.doubleToLongBits(euclideanValue) : 0L;
result = 29 * result + (int) (temp ^ (temp >>> 32));
return result;
}
@@ -132,17 +131,17 @@ public abstract class CorrelationDistance<D extends CorrelationDistance<D>> exte
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
- if(obj == null) {
+ if (obj == null) {
return false;
}
- if(getClass() != obj.getClass()) {
+ if (getClass() != obj.getClass()) {
return false;
}
final CorrelationDistance<D> other = (CorrelationDistance<D>) obj;
- if(this.correlationValue != other.correlationValue) {
+ if (this.correlationValue != other.correlationValue) {
return false;
}
- if(this.euclideanValue != other.euclideanValue) {
+ if (this.euclideanValue != other.euclideanValue) {
return false;
}
return true;
@@ -196,4 +195,4 @@ public abstract class CorrelationDistance<D extends CorrelationDistance<D>> exte
public int externalizableSize() {
return 12;
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/DoubleDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/DoubleDistance.java
index ca84fbfd..acf72c8d 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/DoubleDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/DoubleDistance.java
@@ -28,6 +28,8 @@ import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.regex.Pattern;
+import de.lmu.ifi.dbs.elki.utilities.FormatUtil;
+
/**
* Provides a Distance for a double-valued distance.
*
@@ -35,9 +37,24 @@ import java.util.regex.Pattern;
*/
public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
/**
+ * Zero distance constant
+ */
+ public static final DoubleDistance ZERO_DISTANCE = new DoubleDistance(0.0);
+
+ /**
+ * Infinite distance constant
+ */
+ public static final DoubleDistance INFINITE_DISTANCE = new DoubleDistance(Double.POSITIVE_INFINITY);
+
+ /**
+ * Undefined distance constant
+ */
+ public static final DoubleDistance UNDEFINED_DISTANCE = new DoubleDistance(Double.NaN);
+
+ /**
* The static factory instance
*/
- public final static DoubleDistance FACTORY = new DoubleDistance();
+ public static final DoubleDistance FACTORY = UNDEFINED_DISTANCE;
/**
* The actual value.
@@ -118,7 +135,7 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
*/
@Override
public void readExternal(ObjectInput in) throws IOException {
- setValue(in.readDouble());
+ this.value = in.readDouble();
}
/**
@@ -133,16 +150,6 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
}
@Override
- public Double getValue() {
- return this.value;
- }
-
- @Override
- void setValue(Double value) {
- this.value = value;
- }
-
- @Override
public double doubleValue() {
return value;
}
@@ -157,25 +164,13 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
return Double.compare(this.value, other.value);
}
- @Override
- public boolean equals(Object o) {
- if(this == o) {
- return true;
- }
- if(o == null || getClass() != o.getClass()) {
- return false;
- }
- double delta = Math.abs(value - ((DoubleDistance) o).value);
- return delta < Double.MIN_NORMAL;
- }
-
/**
* An infinite DoubleDistance is based on {@link Double#POSITIVE_INFINITY
* Double.POSITIVE_INFINITY}.
*/
@Override
public DoubleDistance infiniteDistance() {
- return new DoubleDistance(Double.POSITIVE_INFINITY);
+ return INFINITE_DISTANCE;
}
/**
@@ -183,7 +178,7 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
*/
@Override
public DoubleDistance nullDistance() {
- return new DoubleDistance(0.0);
+ return ZERO_DISTANCE;
}
/**
@@ -191,7 +186,7 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
*/
@Override
public DoubleDistance undefinedDistance() {
- return new DoubleDistance(Double.NaN);
+ return UNDEFINED_DISTANCE;
}
/**
@@ -199,13 +194,12 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
*/
@Override
public DoubleDistance parseString(String val) throws IllegalArgumentException {
- if(val.equals(INFINITY_PATTERN)) {
+ if (val.equals(INFINITY_PATTERN)) {
return infiniteDistance();
}
- if(testInputPattern(val)) {
+ if (testInputPattern(val)) {
return new DoubleDistance(Double.parseDouble(val));
- }
- else {
+ } else {
throw new IllegalArgumentException("Given pattern \"" + val + "\" does not match required pattern \"" + requiredInputPattern() + "\"");
}
}
@@ -217,7 +211,7 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
@Override
public boolean isNullDistance() {
- return (value == 0.0);
+ return (value <= 0.0);
}
@Override
@@ -231,8 +225,31 @@ public class DoubleDistance extends NumberDistance<DoubleDistance, Double> {
}
@Override
+ public String toString() {
+ return FormatUtil.NF8.format(value);
+ }
+
+ @Override
public int hashCode() {
- long bits = Double.doubleToLongBits(value);
+ final long bits = Double.doubleToLongBits(value);
return (int) (bits ^ (bits >>> 32));
}
-} \ No newline at end of file
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ DoubleDistance other = (DoubleDistance) obj;
+ if (Double.doubleToLongBits(value) != Double.doubleToLongBits(other.value)) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/FloatDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/FloatDistance.java
index adb951ae..2e88b147 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/FloatDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/FloatDistance.java
@@ -28,6 +28,8 @@ import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.regex.Pattern;
+import de.lmu.ifi.dbs.elki.utilities.FormatUtil;
+
/**
* Provides a Distance for a float-valued distance.
*
@@ -37,7 +39,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
/**
* The static factory instance
*/
- public final static FloatDistance FACTORY = new FloatDistance();
+ public static final FloatDistance FACTORY = new FloatDistance();
/**
* The distance value.
@@ -50,6 +52,21 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
private static final long serialVersionUID = -5702250266358369075L;
/**
+ * Infinite distance.
+ */
+ public static final FloatDistance INFINITE_DISTANCE = new FloatDistance(Float.POSITIVE_INFINITY);
+
+ /**
+ * Zero distance.
+ */
+ public static final FloatDistance ZERO_DISTANCE = new FloatDistance(0.0F);
+
+ /**
+ * Undefined distance.
+ */
+ public static final FloatDistance UNDEFINED_DISTANCE = new FloatDistance(Float.NaN);
+
+ /**
* Empty constructor for serialization purposes.
*/
public FloatDistance() {
@@ -73,12 +90,12 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
@Override
public FloatDistance plus(FloatDistance distance) {
- return new FloatDistance(this.getValue() + distance.getValue());
+ return new FloatDistance(value + distance.value);
}
@Override
public FloatDistance minus(FloatDistance distance) {
- return new FloatDistance(this.getValue() - distance.getValue());
+ return new FloatDistance(value - distance.value);
}
/**
@@ -90,7 +107,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
* distance
*/
public FloatDistance times(FloatDistance distance) {
- return new FloatDistance(this.getValue() * distance.getValue());
+ return new FloatDistance(value * distance.value);
}
/**
@@ -102,7 +119,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
* value
*/
public FloatDistance times(float lambda) {
- return new FloatDistance(this.getValue() * lambda);
+ return new FloatDistance(value * lambda);
}
/**
@@ -110,7 +127,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
*/
@Override
public void writeExternal(ObjectOutput out) throws IOException {
- out.writeFloat(getValue());
+ out.writeFloat(value);
}
/**
@@ -118,7 +135,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
*/
@Override
public void readExternal(ObjectInput in) throws IOException {
- setValue(in.readFloat());
+ value = in.readFloat();
}
/**
@@ -133,16 +150,6 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
}
@Override
- public Float getValue() {
- return this.value;
- }
-
- @Override
- void setValue(Float value) {
- this.value = value;
- }
-
- @Override
public double doubleValue() {
return value;
}
@@ -162,25 +169,13 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
return Float.compare(this.value, other.value);
}
- @Override
- public boolean equals(Object o) {
- if(this == o) {
- return true;
- }
- if(o == null || getClass() != o.getClass()) {
- return false;
- }
- float delta = Math.abs(value - ((FloatDistance) o).value);
- return delta < Float.MIN_NORMAL;
- }
-
/**
* An infinite FloatDistance is based on {@link Float#POSITIVE_INFINITY
* Float.POSITIVE_INFINITY}.
*/
@Override
public FloatDistance infiniteDistance() {
- return new FloatDistance(Float.POSITIVE_INFINITY);
+ return INFINITE_DISTANCE;
}
/**
@@ -188,7 +183,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
*/
@Override
public FloatDistance nullDistance() {
- return new FloatDistance(0.0F);
+ return ZERO_DISTANCE;
}
/**
@@ -196,7 +191,7 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
*/
@Override
public FloatDistance undefinedDistance() {
- return new FloatDistance(Float.NaN);
+ return UNDEFINED_DISTANCE;
}
/**
@@ -204,35 +199,62 @@ public class FloatDistance extends NumberDistance<FloatDistance, Float> {
*/
@Override
public FloatDistance parseString(String val) throws IllegalArgumentException {
- if(val.equals(INFINITY_PATTERN)) {
+ if (val.equals(INFINITY_PATTERN)) {
return infiniteDistance();
}
- if(DoubleDistance.DOUBLE_PATTERN.matcher(val).matches()) {
+ if (DoubleDistance.DOUBLE_PATTERN.matcher(val).matches()) {
return new FloatDistance(Float.parseFloat(val));
- }
- else {
+ } else {
throw new IllegalArgumentException("Given pattern \"" + val + "\" does not match required pattern \"" + requiredInputPattern() + "\"");
}
}
@Override
public boolean isInfiniteDistance() {
- return Double.isInfinite(value);
+ return Float.isInfinite(value);
}
@Override
public boolean isNullDistance() {
- return (value == 0.0);
+ return (value <= 0.0);
}
@Override
public boolean isUndefinedDistance() {
- return Double.isNaN(value);
+ return Float.isNaN(value);
}
@Override
public Pattern getPattern() {
return DOUBLE_PATTERN;
}
-} \ No newline at end of file
+
+ @Override
+ public String toString() {
+ return FormatUtil.NF8.format(value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Float.floatToIntBits(value);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ FloatDistance other = (FloatDistance) obj;
+ if (Float.floatToIntBits(value) != Float.floatToIntBits(other.value)) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/IntegerDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/IntegerDistance.java
index b99b88c3..d776b3ae 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/IntegerDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/IntegerDistance.java
@@ -39,7 +39,7 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
/**
* The static factory instance
*/
- public final static IntegerDistance FACTORY = new IntegerDistance();
+ public static final IntegerDistance FACTORY = new IntegerDistance();
/**
* The distance value
@@ -75,12 +75,12 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
@Override
public IntegerDistance minus(IntegerDistance distance) {
- return new IntegerDistance(this.getValue() - distance.getValue());
+ return new IntegerDistance(this.value - distance.value);
}
@Override
public IntegerDistance plus(IntegerDistance distance) {
- return new IntegerDistance(this.getValue() + distance.getValue());
+ return new IntegerDistance(this.value + distance.value);
}
/**
@@ -88,7 +88,7 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
*/
@Override
public void writeExternal(ObjectOutput out) throws IOException {
- out.writeInt(getValue());
+ out.writeInt(value);
}
/**
@@ -96,7 +96,7 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
*/
@Override
public void readExternal(ObjectInput in) throws IOException {
- setValue(in.readInt());
+ value = in.readInt();
}
/**
@@ -111,16 +111,6 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
}
@Override
- public Integer getValue() {
- return this.value;
- }
-
- @Override
- void setValue(Integer value) {
- this.value = value;
- }
-
- @Override
public double doubleValue() {
return value;
}
@@ -172,16 +162,43 @@ public class IntegerDistance extends NumberDistance<IntegerDistance, Integer> {
@Override
public IntegerDistance parseString(String val) throws IllegalArgumentException {
- if(testInputPattern(val)) {
+ if (testInputPattern(val)) {
return new IntegerDistance(Integer.parseInt(val));
- }
- else {
+ } else {
throw new IllegalArgumentException("Given pattern \"" + val + "\" does not match required pattern \"" + requiredInputPattern() + "\"");
}
}
@Override
+ public String toString() {
+ return Integer.toString(value);
+ }
+
+ @Override
+ public int hashCode() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ IntegerDistance other = (IntegerDistance) obj;
+ if (value != other.value) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
public Pattern getPattern() {
return INTEGER_PATTERN;
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/NumberDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/NumberDistance.java
index a3aff609..9a915c2b 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/NumberDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/NumberDistance.java
@@ -23,7 +23,6 @@ package de.lmu.ifi.dbs.elki.distance.distancevalue;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
/**
* Provides a Distance for a number-valued distance.
*
@@ -42,7 +41,7 @@ public abstract class NumberDistance<D extends NumberDistance<D, N>, N extends N
public NumberDistance() {
super();
}
-
+
/**
* Build a new instance from a double value.
*
@@ -52,66 +51,12 @@ public abstract class NumberDistance<D extends NumberDistance<D, N>, N extends N
public abstract D fromDouble(double val);
/**
- * Returns the hash code for this NumberDistance, which is the hash code of
- * its value.
- *
- * @return the hash code of the value
- */
- @Override
- public int hashCode() {
- return getValue().hashCode();
- }
-
- /**
- * Compares this NumberDistance with the given NumberDistance wrt the
- * represented value.
- * <p/>
- * <code>d1.compareTo(d2)</code> is the same as
- * {@link Double#compare(double,double) Double.compare(d1.value.doubleValue(),
- * d2.value.doubleValue())}. Subclasses may need to overwrite this method if
- * necessary.
- *
- * @param other Other object
- * @return a negative integer, zero, or a positive integer as the value of
- * this NumberDistance is less than, equal to, or greater than the
- * value of the specified NumberDistance.
- */
- @Override
- public int compareTo(D other) {
- return Double.compare(this.doubleValue(), other.doubleValue());
- }
-
- /**
- * Returns a string representation of this NumberDistance.
- *
- * @return the value of this NumberDistance.
- */
- @Override
- public final String toString() {
- return getValue().toString();
- }
-
- /**
- * Returns the value of this NumberDistance.
- *
- * @return the value of this NumberDistance
- */
- public abstract N getValue();
-
- /**
- * Sets the value of this NumberDistance.
- *
- * @param value the value to be set
- */
- abstract void setValue(N value);
-
- /**
* Get the value as double.
*
* @return same result as getValue().doubleValue() but may be more efficient.
*/
public abstract double doubleValue();
-
+
/**
* Get the value as float.
*
@@ -120,7 +65,7 @@ public abstract class NumberDistance<D extends NumberDistance<D, N>, N extends N
public float floatValue() {
return (float) doubleValue();
}
-
+
/**
* Get the value as int.
*
@@ -129,14 +74,14 @@ public abstract class NumberDistance<D extends NumberDistance<D, N>, N extends N
public int intValue() {
return (int) longValue();
}
-
+
/**
* Get the value as long.
*
* @return same result as getValue().longValue() but may be more efficient.
*/
public abstract long longValue();
-
+
/**
* Get the value as short.
*
@@ -145,7 +90,7 @@ public abstract class NumberDistance<D extends NumberDistance<D, N>, N extends N
public short shortValue() {
return (short) longValue();
}
-
+
/**
* Get the value as byte.
*
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PCACorrelationDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PCACorrelationDistance.java
index c2e2da6d..79f27055 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PCACorrelationDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PCACorrelationDistance.java
@@ -38,7 +38,7 @@ public class PCACorrelationDistance extends CorrelationDistance<PCACorrelationDi
/**
* The static factory instance
*/
- public final static PCACorrelationDistance FACTORY = new PCACorrelationDistance();
+ public static final PCACorrelationDistance FACTORY = new PCACorrelationDistance();
/**
* Serial
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PreferenceVectorBasedCorrelationDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PreferenceVectorBasedCorrelationDistance.java
index c62cacc4..a5617372 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PreferenceVectorBasedCorrelationDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/PreferenceVectorBasedCorrelationDistance.java
@@ -40,7 +40,7 @@ public class PreferenceVectorBasedCorrelationDistance extends CorrelationDistanc
/**
* The static factory instance
*/
- public final static PreferenceVectorBasedCorrelationDistance FACTORY = new PreferenceVectorBasedCorrelationDistance();
+ public static final PreferenceVectorBasedCorrelationDistance FACTORY = new PreferenceVectorBasedCorrelationDistance();
/**
* Serial version
@@ -202,7 +202,7 @@ public class PreferenceVectorBasedCorrelationDistance extends CorrelationDistanc
*/
@Override
public int externalizableSize() {
- return super.externalizableSize() + 4 + dimensionality * 4;
+ return super.externalizableSize() + 4 + dimensionality << 2;
}
@Override
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/SubspaceDistance.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/SubspaceDistance.java
index 3d4b7f4c..094961b4 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/SubspaceDistance.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/SubspaceDistance.java
@@ -41,8 +41,8 @@ public class SubspaceDistance extends AbstractDistance<SubspaceDistance> {
/**
* The static factory instance
*/
- public final static SubspaceDistance FACTORY = new SubspaceDistance();
-
+ public static final SubspaceDistance FACTORY = new SubspaceDistance();
+
/**
* Serial version number.
*/
@@ -124,25 +124,46 @@ public class SubspaceDistance extends AbstractDistance<SubspaceDistance> {
@Override
public int compareTo(SubspaceDistance other) {
int compare = Double.compare(this.subspaceDistance, other.subspaceDistance);
- if(compare != 0) {
+ if (compare != 0) {
return compare;
- }
- else {
+ } else {
return Double.compare(this.affineDistance, other.affineDistance);
}
}
@Override
public int hashCode() {
- int result;
+ final int prime = 31;
+ int result = 1;
long temp;
- temp = subspaceDistance != 0.0d ? Double.doubleToLongBits(subspaceDistance) : 0L;
- result = (int) (temp ^ (temp >>> 32));
- temp = affineDistance != 0.0d ? Double.doubleToLongBits(affineDistance) : 0L;
- result = 29 * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(subspaceDistance);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(affineDistance);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ SubspaceDistance other = (SubspaceDistance) obj;
+ if (Double.doubleToLongBits(affineDistance) != Double.doubleToLongBits(other.affineDistance)) {
+ return false;
+ }
+ if (Double.doubleToLongBits(subspaceDistance) != Double.doubleToLongBits(other.subspaceDistance)) {
+ return false;
+ }
+ return true;
+ }
+
/**
* Returns the value of the subspace distance.
*
@@ -199,14 +220,13 @@ public class SubspaceDistance extends AbstractDistance<SubspaceDistance> {
@Override
public SubspaceDistance parseString(String val) throws IllegalArgumentException {
- if(val.equals(INFINITY_PATTERN)) {
+ if (val.equals(INFINITY_PATTERN)) {
return infiniteDistance();
}
- if(testInputPattern(val)) {
+ if (testInputPattern(val)) {
String[] values = SEPARATOR.split(val);
return new SubspaceDistance(Double.parseDouble(values[0]), Double.parseDouble(values[1]));
- }
- else {
+ } else {
throw new IllegalArgumentException("Given pattern \"" + val + "\" does not match required pattern \"" + requiredInputPattern() + "\"");
}
}
@@ -225,4 +245,4 @@ public class SubspaceDistance extends AbstractDistance<SubspaceDistance> {
public SubspaceDistance undefinedDistance() {
return new SubspaceDistance(Double.NaN, Double.NaN);
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/package-info.java b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/package-info.java
index 30fcdf35..f302b854 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancevalue/package-info.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancevalue/package-info.java
@@ -5,6 +5,9 @@
* <p>Distances follow a factory pattern. Usually, a class will have a static instance
* called <code>FACTORY</code> that can be used to obtain e.g. infinity or zero distances
* as well as parse a string value into a new distance value.</p>
+ *
+ * @apiviz.exclude java.io.*
+ * @apiviz.exclude java.lang.*
*/
/*
This file is part of ELKI:
@@ -28,4 +31,4 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package de.lmu.ifi.dbs.elki.distance.distancevalue; \ No newline at end of file
+package de.lmu.ifi.dbs.elki.distance.distancevalue;
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java
index 72f44e4d..039f7f2b 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/AbstractIndexBasedSimilarityFunction.java
@@ -53,7 +53,7 @@ public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index, R
* Key: {@code -similarityfunction.preprocessor}
* </p>
*/
- public static final OptionID INDEX_ID = OptionID.getOrCreateOptionID("similarityfunction.preprocessor", "Preprocessor to use.");
+ public static final OptionID INDEX_ID = new OptionID("similarityfunction.preprocessor", "Preprocessor to use.");
/**
* Parameter to specify the preprocessor to be used.
@@ -127,7 +127,7 @@ public abstract class AbstractIndexBasedSimilarityFunction<O, I extends Index, R
*
* @apiviz.exclude
*/
- public static abstract class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractParameterizer {
+ public abstract static class Parameterizer<F extends IndexFactory<?, ?>> extends AbstractParameterizer {
/**
* The index factory we use.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java
index 32653173..a28790b9 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/FractionalSharedNearestNeighborSimilarityFunction.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction;
import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs;
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.relation.Relation;
import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
@@ -96,7 +97,7 @@ public class FractionalSharedNearestNeighborSimilarityFunction<O> extends Abstra
DBIDIter iter1 = neighbors1.iter();
DBIDIter iter2 = neighbors2.iter();
while(iter1.valid() && iter2.valid()) {
- final int comp = iter1.compareDBID(iter2);
+ final int comp = DBIDUtil.compare(iter1, iter2);
if(comp == 0) {
intersection++;
iter1.advance();
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java
index ad193d9e..2a97a5a3 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/InvertedDistanceSimilarityFunction.java
@@ -49,7 +49,7 @@ public class InvertedDistanceSimilarityFunction<O> extends AbstractPrimitiveSimi
* {@link de.lmu.ifi.dbs.elki.distance.distancefunction.EuclideanDistanceFunction}
* </p>
*/
- public static final OptionID DISTANCE_FUNCTION_ID = OptionID.getOrCreateOptionID("adapter.distancefunction", "Distance function to derive the similarity between database objects from.");
+ public static final OptionID DISTANCE_FUNCTION_ID = new OptionID("adapter.distancefunction", "Distance function to derive the similarity between database objects from.");
/**
* Holds the similarity function.
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java
index 98117008..3e757778 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/SharedNearestNeighborSimilarityFunction.java
@@ -25,6 +25,7 @@ package de.lmu.ifi.dbs.elki.distance.similarityfunction;
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.SetDBIDs;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
@@ -72,7 +73,7 @@ public class SharedNearestNeighborSimilarityFunction<O> extends AbstractIndexBas
DBIDIter iter1 = neighbors1.iter();
DBIDIter iter2 = neighbors2.iter();
while(iter1.valid() && iter2.valid()) {
- final int comp = iter1.compareDBID(iter2);
+ final int comp = DBIDUtil.compare(iter1, iter2);
if(comp == 0) {
intersection++;
iter1.advance();
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/FooKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/FooKernelFunction.java
index 093cf652..be9ba959 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/FooKernelFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/FooKernelFunction.java
@@ -43,7 +43,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter;
*
* @author Simon Paradies
*/
-public class FooKernelFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?, ?>, DoubleDistance> implements PrimitiveSimilarityFunction<NumberVector<?, ?>, DoubleDistance> {
+public class FooKernelFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?>, DoubleDistance> implements PrimitiveSimilarityFunction<NumberVector<?>, DoubleDistance> {
/**
* The default max_degree.
*/
@@ -52,7 +52,7 @@ public class FooKernelFunction extends AbstractPrimitiveDistanceFunction<NumberV
/**
* Parameter for the maximum degree
*/
- public static final OptionID MAX_DEGREE_ID = OptionID.getOrCreateOptionID("fookernel.max_degree", "The max degree of the" + FooKernelFunction.class.getSimpleName() + ". Default: " + DEFAULT_MAX_DEGREE);
+ public static final OptionID MAX_DEGREE_ID = new OptionID("fookernel.max_degree", "The max degree of the" + FooKernelFunction.class.getSimpleName() + ". Default: " + DEFAULT_MAX_DEGREE);
/**
* Degree of the polynomial kernel function
@@ -78,25 +78,25 @@ public class FooKernelFunction extends AbstractPrimitiveDistanceFunction<NumberV
* an instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public DoubleDistance similarity(final NumberVector<?, ?> o1, final NumberVector<?, ?> o2) {
+ public DoubleDistance similarity(final NumberVector<?> o1, final NumberVector<?> o2) {
if(o1.getDimensionality() != o2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of FeatureVectors\n first argument: " + o1.toString() + "\n second argument: " + o2.toString());
}
double sim = 0.0;
// iterate over differently powered dimensions
- for(int degree = 1; degree <= max_degree; degree++) {
+ for(int degree = 0; degree < max_degree; degree++) {
sim += Math.pow(o1.doubleValue(degree) * o2.doubleValue(degree), degree);
}
return new DoubleDistance(sim);
}
@Override
- public DoubleDistance distance(final NumberVector<?, ?> fv1, final NumberVector<?, ?> fv2) {
+ public DoubleDistance distance(final NumberVector<?> fv1, final NumberVector<?> fv2) {
return new DoubleDistance(Math.sqrt(similarity(fv1, fv1).doubleValue() + similarity(fv2, fv2).doubleValue() - 2 * similarity(fv1, fv2).doubleValue()));
}
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@@ -106,7 +106,7 @@ public class FooKernelFunction extends AbstractPrimitiveDistanceFunction<NumberV
}
@Override
- public <T extends NumberVector<?, ?>> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> database) {
return new PrimitiveDistanceSimilarityQuery<T, DoubleDistance>(database, this, this);
}
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java
index a8b6d8fc..50dd0b4f 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/KernelMatrix.java
@@ -69,7 +69,7 @@ public class KernelMatrix {
* @deprecated ID mapping is not reliable!
*/
@Deprecated
- public <O extends FeatureVector<O, ?>> KernelMatrix(final PrimitiveSimilarityFunction<? super O, DoubleDistance> kernelFunction, final Relation<? extends O> database) {
+ public <O extends FeatureVector<?>> KernelMatrix(final PrimitiveSimilarityFunction<? super O, DoubleDistance> kernelFunction, final Relation<? extends O> database) {
this(kernelFunction, database, DBIDUtil.ensureArray(database.getDBIDs()));
}
@@ -80,7 +80,7 @@ public class KernelMatrix {
* @param database the database that holds the objects
* @param ids the IDs of those objects for which the kernel matrix is computed
*/
- public <O extends FeatureVector<O, ?>> KernelMatrix(final PrimitiveSimilarityFunction<? super O, DoubleDistance> kernelFunction, final Relation<? extends O> database, final ArrayDBIDs ids) {
+ public <O extends FeatureVector<?>> KernelMatrix(final PrimitiveSimilarityFunction<? super O, DoubleDistance> kernelFunction, final Relation<? extends O> database, final ArrayDBIDs ids) {
LoggingUtil.logExpensive(Level.FINER, "Computing kernel matrix");
kernel = new Matrix(ids.size(), ids.size());
double value;
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java
index 6cde55a6..ffd2d0e3 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/LinearKernelFunction.java
@@ -40,7 +40,7 @@ import de.lmu.ifi.dbs.elki.distance.similarityfunction.AbstractPrimitiveSimilari
* @author Simon Paradies
* @param <O> vector type
*/
-public class LinearKernelFunction<O extends NumberVector<?, ?>> extends AbstractPrimitiveSimilarityFunction<O, DoubleDistance> implements PrimitiveDistanceFunction<O, DoubleDistance> {
+public class LinearKernelFunction<O extends NumberVector<?>> extends AbstractPrimitiveSimilarityFunction<O, DoubleDistance> implements PrimitiveDistanceFunction<O, DoubleDistance> {
/**
* Provides a linear Kernel function that computes a similarity between the
* two vectors V1 and V2 defined by V1^T*V2.
@@ -51,7 +51,7 @@ public class LinearKernelFunction<O extends NumberVector<?, ?>> extends Abstract
/**
* Provides a linear Kernel function that computes a similarity between the
- * two feature vectors V1 and V2 definded by V1^T*V2
+ * two feature vectors V1 and V2 definded by V1^T*V2.
*
* @param o1 first feature vector
* @param o2 second feature vector
@@ -64,7 +64,7 @@ public class LinearKernelFunction<O extends NumberVector<?, ?>> extends Abstract
throw new IllegalArgumentException("Different dimensionality of Feature-Vectors" + "\n first argument: " + o1.toString() + "\n second argument: " + o2.toString());
}
double sim = 0;
- for(int i = 1; i <= o1.getDimensionality(); i++) {
+ for(int i = 0; i < o1.getDimensionality(); i++) {
sim += o1.doubleValue(i) * o2.doubleValue(i);
}
return new DoubleDistance(sim);
diff --git a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java
index e32f5b45..1a7f97f5 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/similarityfunction/kernel/PolynomialKernelFunction.java
@@ -43,19 +43,19 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
*
* @author Simon Paradies
*/
-public class PolynomialKernelFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?, ?>, DoubleDistance> implements PrimitiveSimilarityFunction<NumberVector<?, ?>, DoubleDistance> {
+public class PolynomialKernelFunction extends AbstractPrimitiveDistanceFunction<NumberVector<?>, DoubleDistance> implements PrimitiveSimilarityFunction<NumberVector<?>, DoubleDistance> {
/**
* The default degree.
*/
public static final double DEFAULT_DEGREE = 2.0;
/**
- * Degree parameter
+ * Degree parameter.
*/
- public static final OptionID DEGREE_ID = OptionID.getOrCreateOptionID("kernel.degree", "The degree of the polynomial kernel function. Default: " + DEFAULT_DEGREE);
+ public static final OptionID DEGREE_ID = new OptionID("kernel.degree", "The degree of the polynomial kernel function. Default: " + DEFAULT_DEGREE);
/**
- * Degree of the polynomial kernel function
+ * Degree of the polynomial kernel function.
*/
private double degree = 0.0;
@@ -78,25 +78,25 @@ public class PolynomialKernelFunction extends AbstractPrimitiveDistanceFunction<
* instance of {@link DoubleDistance DoubleDistance}.
*/
@Override
- public DoubleDistance similarity(NumberVector<?, ?> o1, NumberVector<?, ?> o2) {
+ public DoubleDistance similarity(NumberVector<?> o1, NumberVector<?> o2) {
if(o1.getDimensionality() != o2.getDimensionality()) {
throw new IllegalArgumentException("Different dimensionality of Feature-Vectors" + "\n first argument: " + o1.toString() + "\n second argument: " + o2.toString());
}
double sim = 0;
- for(int i = 1; i <= o1.getDimensionality(); i++) {
+ for(int i = 0; i < o1.getDimensionality(); i++) {
sim += o1.doubleValue(i) * o2.doubleValue(i);
}
return new DoubleDistance(Math.pow(sim, degree));
}
@Override
- public DoubleDistance distance(final NumberVector<?, ?> fv1, final NumberVector<?, ?> fv2) {
+ public DoubleDistance distance(final NumberVector<?> fv1, final NumberVector<?> fv2) {
return new DoubleDistance(Math.sqrt(similarity(fv1, fv1).doubleValue() + similarity(fv2, fv2).doubleValue() - 2 * similarity(fv1, fv2).doubleValue()));
}
@Override
- public VectorFieldTypeInformation<? super NumberVector<?, ?>> getInputTypeRestriction() {
+ public VectorFieldTypeInformation<? super NumberVector<?>> getInputTypeRestriction() {
return TypeUtil.NUMBER_VECTOR_FIELD;
}
@@ -106,7 +106,7 @@ public class PolynomialKernelFunction extends AbstractPrimitiveDistanceFunction<
}
@Override
- public <T extends NumberVector<?, ?>> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> database) {
+ public <T extends NumberVector<?>> DistanceSimilarityQuery<T, DoubleDistance> instantiate(Relation<T> database) {
return new PrimitiveDistanceSimilarityQuery<T, DoubleDistance>(database, this, this);
}
@@ -118,6 +118,9 @@ public class PolynomialKernelFunction extends AbstractPrimitiveDistanceFunction<
* @apiviz.exclude
*/
public static class Parameterizer extends AbstractParameterizer {
+ /**
+ * Degree of the polynomial kernel function.
+ */
protected double degree = 0;
@Override