@Test public void testDisjointSimilarity() { long keys[] = {1, 5, 7}; double values[] = {1.5, 2.5, 2}; long keys2[] = {2, 4, 8}; Long2DoubleSortedArrayMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); Long2DoubleSortedArrayMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(keys2, values); assertThat(sim.similarity(v1, v2), closeTo(0, EPSILON)); }
@Test public void testSimilarity2() { long k1[] = {1, 5, 7, 8}; double val1[] = {1.5, 2.5, 2, 3.5}; long k2[] = {1, 5, 7, 9}; double val2[] = {2, 2.5, 1.7, 0.8}; Long2DoubleMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(k1, val1); Long2DoubleMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(k2, val2); assertThat(sim.similarity(v1, v2), closeTo(0.6185896, EPSILON)); } }
@Test public void testSimilarity() { long k1[] = {1, 5, 7}; double val1[] = {1.5, 2.5, 2}; long k2[] = {1, 5, 6}; double val2[] = {2, 2.5, 1.7}; Long2DoubleMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(k1, val1); Long2DoubleMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(k2, val2); assertThat(sim.similarity(v1, v2), closeTo(1, EPSILON)); }
@Test public void testDisjoint() { long[] k1 = {2, 5, 6}; double[] val1 = {1, 3, 2}; long[] k2 = {3, 4, 7}; double[] val2 = {1, 3, 2}; Long2DoubleMap v1, v2; v1 = Long2DoubleSortedArrayMap.wrapUnsorted(k1, val1); v2 = Long2DoubleSortedArrayMap.wrapUnsorted(k2, val2); assertEquals(0, similarity.similarity(v1, v2), EPSILON); assertEquals(0, dampedSimilarity.similarity(v1, v2), EPSILON); }
@Test public void testEqualKeys() { long[] keys = {2, 5, 6}; double[] val1 = {1, 2, 1}; double[] val2 = {1, 2, 5}; Long2DoubleMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(keys, val1); Long2DoubleMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(keys, val2); assertEquals(1, similarity.similarity(v1, v1), EPSILON); assertEquals(0.745355993, similarity.similarity(v1, v2), EPSILON); }
@Test public void testDampedEqualKeys() { long[] keys = {2, 5, 6}; double[] val1 = {1, 2, 1}; double[] val2 = {1, 2, 5}; Long2DoubleMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(keys, val1); Long2DoubleMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(keys, val2); assertEquals(0.375, dampedSimilarity.similarity(v1, v1), EPSILON); assertEquals(0.42705098, dampedSimilarity.similarity(v1, v2), EPSILON); }
@Override public Long2DoubleMap finishMap() { if (scores == null) { return Long2DoubleMaps.EMPTY_MAP; } assert size == heap.size(); int[] indices = new int[size]; // Copy backwards so the scored list is sorted. for (int i = size - 1; i >= 0; i--) { indices[i] = heap.dequeueInt(); } assert heap.isEmpty(); long[] keys = new long[indices.length]; double[] values = new double[indices.length]; for (int i = 0; i < indices.length; i++) { keys[i] = items.getLong(indices[i]); values[i] = scores.getDouble(indices[i]); } clear(); return Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); }
@Test public void testOverlap() { long[] k1 = {1, 2, 5, 6}; double[] val1 = {3, 1, 2, 1}; long[] k2 = {2, 3, 5, 6, 7}; double[] val2 = {1, 7, 2, 5, 0}; Long2DoubleMap v1 = Long2DoubleSortedArrayMap.wrapUnsorted(k1, val1); Long2DoubleMap v2 = Long2DoubleSortedArrayMap.wrapUnsorted(k2, val2); assertEquals(1, similarity.similarity(v1, v1), EPSILON); assertEquals(1, similarity.similarity(v2, v2), EPSILON); assertEquals(0.29049645, similarity.similarity(v1, v2), EPSILON); } }
private static Long2DoubleMap extractVector(Iterator<? extends Rating> ratings, IdExtractor dimension, int n) { LongArrayList ids = new LongArrayList(n > 0 ? n : LongArrayList.DEFAULT_INITIAL_CAPACITY); DoubleArrayList values = new DoubleArrayList(n > 0 ? n : DoubleArrayList.DEFAULT_INITIAL_CAPACITY); while (ratings.hasNext()) { Rating r = ratings.next(); assert ids.size() == values.size(); long id = dimension.getId(r); ids.add(id); values.add(r.getValue()); } ids.trim(); values.trim(); assert ids.elements().length == ids.size(); assert values.elements().length == values.size(); return Long2DoubleSortedArrayMap.wrapUnsorted(ids.elements(), values.elements()); }
@Test public void testRankSingle() { Long2DoubleSortedArrayMap v = Long2DoubleSortedArrayMap.wrapUnsorted(new long[]{1}, new double[]{5}); Long2DoubleMap r = rank(v); assertEquals(1, r.size()); assertEquals(1, r.get(1), 1.0e-6); }
@Test public void testSimpleTruncate() { long[] keys = {1, 2, 3, 4, 5}; double[] values = {1.0, 2.0, 3.0, 4.0, 5.0}; Long2DoubleSortedArrayMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); VectorTruncator truncator = new TopNTruncator(3, null); Long2DoubleMap v2 = truncator.truncate(v); long i = 3; for (Long2DoubleMap.Entry e: v2.long2DoubleEntrySet()) { assertThat(e.getLongKey(), equalTo(i)); assertThat(e.getDoubleValue(), closeTo(i, EPSILON)); i++; } assertThat(i, equalTo(6L)); } }
@Test public void testSimpleTruncate() { long[] keys = {1, 2, 3, 4}; double[] values = {1.0, 2.0, 3.0, 4.0}; Long2DoubleSortedArrayMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); VectorTruncator truncator = new NoOpTruncator(); Long2DoubleMap v2 = truncator.truncate(v); long i = 1; for (Long2DoubleMap.Entry e: v2.long2DoubleEntrySet()) { assertThat(e.getLongKey(), equalTo(i)); assertThat(e.getDoubleValue(), closeTo(i, EPSILON)); i++; } assertThat(i, equalTo(5L)); } }
@Test public void testTruncate() { long[] keys = {1, 2, 3, 4}; double[] values = {1.0, 2.0, 3.0, 4.0}; Long2DoubleSortedArrayMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); VectorTruncator truncator = new ThresholdTruncator(new RealThreshold(3.5)); Long2DoubleMap v2 = truncator.truncate(v); int numSeen = 0; for (Long2DoubleMap.Entry e: v2.long2DoubleEntrySet()) { assertThat(e.getLongKey(), equalTo(4L)); assertThat(e.getDoubleValue(), closeTo(4.0, EPSILON)); numSeen++; } assertThat(numSeen, equalTo(1)); } }
@Test public void testSelfSimilarity() { long keys[] = {1, 5, 7}; double values[] = {1.5, 2.5, 2}; Long2DoubleMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); assertThat(sim.similarity(v, v), closeTo(1, EPSILON)); assertThat(sim.similarity(v, new Long2DoubleOpenHashMap(v)), closeTo(1, EPSILON)); }
@Before public void setUp() { long[] keys = {0L, 1L, 2L}; double[] values = {0., 2., 4.}; userRatings = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); double[] uniformValues = {2., 2., 2.}; uniformUserRatings = Long2DoubleSortedArrayMap.wrapUnsorted(keys, uniformValues); List<Rating> ratings = new ArrayList<>(); addRating(ratings, 0, 0, 0); addRating(ratings, 0, 1, 1); addRating(ratings, 0, 2, 2); addRating(ratings, 0, 3, 3); addRating(ratings, 0, 4, 4); addRating(ratings, 0, 5, 5); addRating(ratings, 0, 6, 6); addRating(ratings, 1, 0, 3); addRating(ratings, 1, 1, 3); addRating(ratings, 1, 2, 3); addRating(ratings, 1, 3, 3); addRating(ratings, 1, 4, 3); addRating(ratings, 1, 5, 3); addRating(ratings, 1, 6, 3); dao = StaticDataSource.fromList(ratings).get(); }
@Test public void testRankSeveral() { long[] keys = {1, 2, 3, 4, 5}; double[] values = {7, 2, 3, 1, 5}; Long2DoubleMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); Long2DoubleMap r = rank(v); assertEquals(5, r.size()); assertEquals(1, r.get(1), 1.0e-6); assertEquals(2, r.get(5), 1.0e-6); assertEquals(3, r.get(3), 1.0e-6); assertEquals(4, r.get(2), 1.0e-6); assertEquals(5, r.get(4), 1.0e-6); }
@Test public void testRankTie() { long[] keys = {1, 2, 3, 4, 5}; double[] values = {7, 2, 3, 1, 3}; Long2DoubleMap v = Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); Long2DoubleMap r = rank(v); assertEquals(5, r.size()); assertEquals(1, r.get(1), 1.0e-6); assertEquals(2.5, r.get(3), 1.0e-6); assertEquals(2.5, r.get(5), 1.0e-6); assertEquals(4, r.get(2), 1.0e-6); assertEquals(5, r.get(4), 1.0e-6); }
@Override public Long2DoubleMap finishMap() { if (scores == null) { return Long2DoubleMaps.EMPTY_MAP; } assert size == heap.size(); int[] indices = new int[size]; // Copy backwards so the scored list is sorted. for (int i = size - 1; i >= 0; i--) { indices[i] = heap.dequeueInt(); } assert heap.isEmpty(); long[] keys = new long[indices.length]; double[] values = new double[indices.length]; for (int i = 0; i < indices.length; i++) { keys[i] = items.getLong(indices[i]); values[i] = scores.getDouble(indices[i]); } clear(); return Long2DoubleSortedArrayMap.wrapUnsorted(keys, values); }
private static Long2DoubleMap extractVector(Iterator<? extends Rating> ratings, IdExtractor dimension, int n) { LongArrayList ids = new LongArrayList(n > 0 ? n : LongArrayList.DEFAULT_INITIAL_CAPACITY); DoubleArrayList values = new DoubleArrayList(n > 0 ? n : DoubleArrayList.DEFAULT_INITIAL_CAPACITY); while (ratings.hasNext()) { Rating r = ratings.next(); assert ids.size() == values.size(); long id = dimension.getId(r); ids.add(id); values.add(r.getValue()); } ids.trim(); values.trim(); assert ids.elements().length == ids.size(); assert values.elements().length == values.size(); return Long2DoubleSortedArrayMap.wrapUnsorted(ids.elements(), values.elements()); }