@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); int d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) if (e.value != e.otherValue) d++; return d; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); int d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) if (e.value != e.otherValue) d++; return d; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { d += (e.value * e.otherValue); } return d; } }
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { d += (e.value * e.otherValue); } return d; } }
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double diff = e.value - e.otherValue; d += (diff * diff); } return Math.sqrt(d); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double diff = e.value - e.otherValue; d += (diff * diff); } return Math.sqrt(d); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double a = e.value - e.otherValue; double b = e.value + e.otherValue; if (Math.abs(b) > 0) d += a*a/b; } return d / 2; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double a = e.value - e.otherValue; double b = e.value + e.otherValue; if (Math.abs(b) > 0) d += a*a/b; } return d / 2; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double h12 = 0; double h11 = 0; double h22 = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { h12 += e.value * e.otherValue; h11 += e.value * e.value; h22 += e.otherValue * e.otherValue; } return h12 / (Math.sqrt(h11) * Math.sqrt(h22)); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double h12 = 0; double h11 = 0; double h22 = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { h12 += e.value * e.otherValue; h11 += e.value * e.value; h22 += e.otherValue * e.otherValue; } return h12 / (Math.sqrt(h11) * Math.sqrt(h22)); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double N = h1.length; double SH1=0, SH2=0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { SH1 += e.value; SH2 += e.otherValue; } SH1 /= N; SH2 /= N; double d = 0; double SH1S = 0; double SH2S = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double h1prime = e.value - SH1; double h2prime = e.otherValue - SH2; d += (h1prime * h2prime); SH1S += (h1prime * h1prime); SH2S += (h2prime * h2prime); } return d / Math.sqrt(SH1S * SH2S); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double N = h1.length; double SH1=0, SH2=0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { SH1 += e.value; SH2 += e.otherValue; } SH1 /= N; SH2 /= N; double d = 0; double SH1S = 0; double SH2S = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double h1prime = e.value - SH1; double h2prime = e.otherValue - SH2; d += (h1prime * h2prime); SH1S += (h1prime * h1prime); SH2S += (h2prime * h2prime); } return d / Math.sqrt(SH1S * SH2S); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); int d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { d += HammingUtils.packedHamming(e.value, e.otherValue); } return d; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double sum1 = 0; double sum2 = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { sum1 += e.value; sum2 += e.otherValue; } double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double h1n = e.value / sum1; double h2n = e.otherValue / sum2; double q1 = h1n / h2n; double q2 = h2n / h1n; if (h1n != 0) d += (h1n * Math.log(q1) / Math.log(2)); if (h2n != 0) d += (h2n * Math.log(q2) / Math.log(2)); } return d / 2.0; } },
@Override public Iterable<DualEntry> unionEntries(final SparseFloatArray otherArray) { if (otherArray instanceof SparseBinSearchFloatArray) { return unionEntries((SparseBinSearchFloatArray) otherArray); } return super.unionEntries(otherArray); }
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); int d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { d += HammingUtils.packedHamming(e.value, e.otherValue); } return d; } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double SH1 = 0; double SH2 = 0; double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { SH1 += e.value; SH2 += e.otherValue; d += Math.sqrt(e.value * e.otherValue); } double den = SH1 * SH2; if (den == 0) return 1; d /= Math.sqrt(den); return Math.sqrt(1.0 - d); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double SH1 = 0; double SH2 = 0; double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { SH1 += e.value; SH2 += e.otherValue; d += Math.sqrt(e.value * e.otherValue); } double den = SH1 * SH2; if (den == 0) return 1; d /= Math.sqrt(den); return Math.sqrt(1.0 - d); } },
@Override public double compare(final SparseFloatArray h1, final SparseFloatArray h2) { if (h1.length != h2.length) throw new IllegalArgumentException("Vectors have differing lengths"); double sum1 = 0; double sum2 = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { sum1 += e.value; sum2 += e.otherValue; } double d = 0; for (SparseFloatArray.DualEntry e : h1.unionEntries(h2)) { double h1n = e.value / sum1; double h2n = e.otherValue / sum2; double q1 = h1n / h2n; double q2 = h2n / h1n; if (h1n != 0) d += (h1n * Math.log(q1) / Math.log(2)); if (h2n != 0) d += (h2n * Math.log(q2) / Math.log(2)); } return d / 2.0; } },