package it.unito.geosummly.clustering.subspace;
import java.util.BitSet;
import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.distance.distancefunction.subspace.SubspaceLPNormDistanceFunction;
public class FirstSubspaceEuclideanDistanceFunction extends SubspaceLPNormDistanceFunction {
public FirstSubspaceEuclideanDistanceFunction(BitSet dimensions) {
super(2.0, dimensions);
}
public BitSet getDimensions ()
{
return dimensions;
}
/**
* Provides the Euclidean distance between two given feature vectors in the
* selected dimensions.
*
* @param v1 first feature vector
* @param v2 second feature vector
* @return the Euclidean distance between two given feature vectors in the
* selected dimensions
*/
@Override
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;
int last=-1;
for(int d = dimensions.nextSetBit(0); d >= 0; d = dimensions.nextSetBit(d + 1)) {
final double delta = v1.doubleValue(d) - v2.doubleValue(d);
last = d;
sqrDist += delta * delta;
}
// if( v1.doubleValue(last) == v2.doubleValue(last) && v1.doubleValue(last) == 0.0) {
// return Double.POSITIVE_INFINITY;
// }
if( v1.doubleValue(last) == 0.0 || v2.doubleValue(last) == 0.0 )
return Double.POSITIVE_INFINITY;
else return Math.sqrt(sqrDist);
}
}