package edu.fudan.ml.types.featurecluster;
public class SimpleDistance extends AbstractDistance {
public double cal(ClassData cd1, ClassData cd2) {
if (checkLabelLength(cd1, cd2))
return calSimpleDistance(cd1, cd2);
else
return Double.MAX_VALUE;
}
private boolean checkLabelLength(ClassData cd1, ClassData cd2) {
return cd1.getLabel().length == cd2.getLabel().length;
}
private double calSimpleDistance(ClassData cd1, ClassData cd2) {
double[] label1 = cd1.getLabel();
double[] label2 = cd2.getLabel();
return calSimpleDistanceArray(label1, label2);
}
private double calSimpleDistanceArray(double[] label1, double[] label2) {
int base = getBase(label1, label2);
if (base == -1)
return 1;
double a1 = label1[base];
double b1 = label2[base];
for (int i = base + 1; i < label1.length; i++)
if (checkZero(label1[i], label2[i]) || (label1[i] * b1 != label2[i] * a1))
return 1;
return 0;
}
private int getBase(double[] label1, double[] label2) {
int i = 0;
for (i = 0; i < label1.length; i++) {
if (checkAllZero(label1[i], label2[i]))
continue;
else if (checkZero(label1[i], label2[i]))
return -1;
else
break;
}
return i;
}
private boolean checkZero(double a, double b) {
return ((a == 0 && b !=0) || (a !=0 && b == 0));
}
private boolean checkAllZero(double a, double b) {
return (a == 0 && b == 0);
}
public static void main(String[] args) {
SimpleDistance distance = new SimpleDistance();
System.out.println(distance.calSimpleDistanceArray(new double[]{0.0, 0.0, 1.0, 0.0}, new double[]{0.0, 0.0, 1.0, 0.0}));
System.out.println(distance.calSimpleDistanceArray(new double[]{0, 0, 3}, new double[]{0, 0, 5}));
System.out.println(distance.calSimpleDistanceArray(new double[]{0, 2, 3}, new double[]{0, 4, 6}));
System.out.println(distance.calSimpleDistanceArray(new double[]{4, 2, 3}, new double[]{2, 4, 6}));
System.out.println(distance.calSimpleDistanceArray(new double[]{1, 2, 3}, new double[]{2, 8, 6}));
}
}