@Test public void testSearchFirst() { searcher.clear(); searcher.addAll(dataPoints); for (Vector datapoint : dataPoints) { WeightedThing<Vector> first = searcher.searchFirst(datapoint, false); WeightedThing<Vector> second = searcher.searchFirst(datapoint, true); List<WeightedThing<Vector>> firstTwo = searcher.search(datapoint, 2); assertEquals("First isn't self", 0, first.getWeight(), 0); assertEquals("First isn't self", datapoint, first.getValue()); assertEquals("First doesn't match", first, firstTwo.get(0)); assertEquals("Second doesn't match", second, firstTwo.get(1)); } }
@Test public void testExactMatch() { searcher.clear(); Iterable<MatrixSlice> data = dataPoints; final Iterable<MatrixSlice> batch1 = Iterables.limit(data, 300); List<MatrixSlice> queries = Lists.newArrayList(Iterables.limit(batch1, 100)); // adding the data in multiple batches triggers special code in some searchers searcher.addAllMatrixSlices(batch1); assertEquals(300, searcher.size()); Vector q = Iterables.get(data, 0).vector(); List<WeightedThing<Vector>> r = searcher.search(q, 2); assertEquals(0, r.get(0).getValue().minus(q).norm(1), 1.0e-8); final Iterable<MatrixSlice> batch2 = Iterables.limit(Iterables.skip(data, 300), 10); searcher.addAllMatrixSlices(batch2); assertEquals(310, searcher.size()); q = Iterables.get(data, 302).vector(); r = searcher.search(q, 2); assertEquals(0, r.get(0).getValue().minus(q).norm(1), 1.0e-8); searcher.addAllMatrixSlices(Iterables.skip(data, 310)); assertEquals(dataPoints.numRows(), searcher.size()); for (MatrixSlice query : queries) { r = searcher.search(query.vector(), 2); assertEquals("Distance has to be about zero", 0, r.get(0).getWeight(), 1.0e-6); assertEquals("Answer must be substantially the same as query", 0, r.get(0).getValue().minus(query.vector()).norm(1), 1.0e-8); assertTrue("Wrong answer must have non-zero distance", r.get(1).getWeight() > r.get(0).getWeight()); } }
assertEquals(size0 - 1, searcher.size()); assertEquals("Previous second neighbor should be first", 0, r.get(0).getValue().minus(r0.get(1).getValue()).norm (1), 1.0e-8); assertEquals(size0 - 2, searcher.size());
@Test public void testNearMatch() { searcher.clear(); List<MatrixSlice> queries = Lists.newArrayList(Iterables.limit(dataPoints, 100)); searcher.addAllMatrixSlicesAsWeightedVectors(dataPoints); MultiNormal noise = new MultiNormal(0.01, new DenseVector(20)); for (MatrixSlice slice : queries) { Vector query = slice.vector(); final Vector epsilon = noise.sample(); List<WeightedThing<Vector>> r = searcher.search(query, 2); query = query.plus(epsilon); assertEquals("Distance has to be small", epsilon.norm(2), r.get(0).getWeight(), 1.0e-1); assertEquals("Answer must be substantially the same as query", epsilon.norm(2), r.get(0).getValue().minus(query).norm(2), 1.0e-1); assertTrue("Wrong answer must be further away", r.get(1).getWeight() > r.get(0).getWeight()); } }