summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/subspace')
-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
9 files changed, 124 insertions, 115 deletions
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;
}