@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));
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());
}
}