diff options
Diffstat (limited to 'test/de/lmu/ifi/dbs/elki/index')
-rw-r--r-- | test/de/lmu/ifi/dbs/elki/index/TestIndexStructures.java | 44 | ||||
-rw-r--r-- | test/de/lmu/ifi/dbs/elki/index/preprocessed/TestMaterializedKNNAndRKNNPreprocessor.java | 55 |
2 files changed, 47 insertions, 52 deletions
diff --git a/test/de/lmu/ifi/dbs/elki/index/TestIndexStructures.java b/test/de/lmu/ifi/dbs/elki/index/TestIndexStructures.java index e0b3a479..0b0b12d5 100644 --- a/test/de/lmu/ifi/dbs/elki/index/TestIndexStructures.java +++ b/test/de/lmu/ifi/dbs/elki/index/TestIndexStructures.java @@ -26,8 +26,6 @@ package de.lmu.ifi.dbs.elki.index; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; -import java.util.List; - import org.junit.Test; import de.lmu.ifi.dbs.elki.JUnit4Test; @@ -35,22 +33,23 @@ import de.lmu.ifi.dbs.elki.data.DoubleVector; import de.lmu.ifi.dbs.elki.data.type.TypeUtil; import de.lmu.ifi.dbs.elki.database.Database; import de.lmu.ifi.dbs.elki.database.StaticArrayDatabase; -import de.lmu.ifi.dbs.elki.database.query.DistanceResultPair; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery; -import de.lmu.ifi.dbs.elki.database.query.knn.KNNResult; import de.lmu.ifi.dbs.elki.database.query.knn.LinearScanKNNQuery; import de.lmu.ifi.dbs.elki.database.query.range.LinearScanRangeQuery; import de.lmu.ifi.dbs.elki.database.query.range.RangeQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection; import de.lmu.ifi.dbs.elki.distance.distancefunction.EuclideanDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.DistanceDBIDResult; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.DistanceDBIDResultIter; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult; import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.index.tree.TreeIndexFactory; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree.MTree; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree.MTreeFactory; -import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query.MetricalIndexKNNQuery; -import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query.MetricalIndexRangeQuery; +import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query.DoubleDistanceMetricalIndexKNNQuery; +import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query.DoubleDistanceMetricalIndexRangeQuery; import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTreeFactory; import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.query.DoubleDistanceRStarTreeKNNQuery; import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.query.DoubleDistanceRStarTreeRangeQuery; @@ -96,8 +95,6 @@ public class TestIndexStructures implements JUnit4Test { /** * Test exact query, also to validate the test is correct. - * - * @throws ParameterException on errors. */ @Test public void testExact() { @@ -107,21 +104,17 @@ public class TestIndexStructures implements JUnit4Test { /** * Test {@link MTree} using a file based database connection. - * - * @throws ParameterException on errors. */ @Test public void testMetrical() { ListParameterization metparams = new ListParameterization(); metparams.addParameter(StaticArrayDatabase.INDEX_ID, MTreeFactory.class); metparams.addParameter(TreeIndexFactory.PAGE_SIZE_ID, 100); - testFileBasedDatabaseConnection(metparams, MetricalIndexKNNQuery.class, MetricalIndexRangeQuery.class); + testFileBasedDatabaseConnection(metparams, DoubleDistanceMetricalIndexKNNQuery.class, DoubleDistanceMetricalIndexRangeQuery.class); } /** * Test {@link RStarTree} using a file based database connection. - * - * @throws ParameterException on errors. */ @Test public void testRStarTree() { @@ -133,8 +126,6 @@ public class TestIndexStructures implements JUnit4Test { /** * Test {@link VAFile} using a file based database connection. - * - * @throws ParameterException on errors. */ @Test public void testVAFile() { @@ -143,11 +134,9 @@ public class TestIndexStructures implements JUnit4Test { spatparams.addParameter(VAFile.Factory.PARTITIONS_ID, 4); testFileBasedDatabaseConnection(spatparams, VAFile.VAFileKNNQuery.class, VAFile.VAFileRangeQuery.class); } - + /** * Test {@link PartialVAFile} using a file based database connection. - * - * @throws ParameterException on errors. */ @Test public void testPartialVAFile() { @@ -156,13 +145,11 @@ public class TestIndexStructures implements JUnit4Test { spatparams.addParameter(PartialVAFile.Factory.PARTITIONS_ID, 4); testFileBasedDatabaseConnection(spatparams, PartialVAFile.PartialVAFileKNNQuery.class, PartialVAFile.PartialVAFileRangeQuery.class); } - + /** * Test {@link RStarTree} using a file based database connection. With "fast" * mode enabled on an extreme level (since this should only reduce - * performance, not accuracy!) - * - * @throws ParameterException on errors. + * performance, not correctness!) */ @Test public void testRStarTreeFast() { @@ -176,8 +163,6 @@ public class TestIndexStructures implements JUnit4Test { /** * Test {@link XTree} using a file based database connection. - * - * @throws ParameterException */ // @Test // public void testXTree() { @@ -194,7 +179,6 @@ public class TestIndexStructures implements JUnit4Test { * Actual test routine. * * @param inputparams - * @throws ParameterException */ void testFileBasedDatabaseConnection(ListParameterization inputparams, Class<?> expectKNNQuery, Class<?> expectRangeQuery) { inputparams.addParameter(FileBasedDatabaseConnection.INPUT_ID, dataset); @@ -218,15 +202,13 @@ public class TestIndexStructures implements JUnit4Test { // verify that the neighbors match. int i = 0; - for(DistanceResultPair<DoubleDistance> res : ids) { + for(DistanceDBIDResultIter<DoubleDistance> res = ids.iter(); res.valid(); res.advance(), i++) { // Verify distance assertEquals("Expected distance doesn't match.", shouldd[i], res.getDistance().doubleValue()); // verify vector DoubleVector c = rep.get(res); DoubleVector c2 = new DoubleVector(shouldc[i]); assertEquals("Expected vector doesn't match: " + c.toString(), 0.0, dist.distance(c, c2).doubleValue(), 0.00001); - - i++; } } { @@ -234,20 +216,18 @@ public class TestIndexStructures implements JUnit4Test { DoubleVector dv = new DoubleVector(querypoint); RangeQuery<DoubleVector, DoubleDistance> rangeq = db.getRangeQuery(dist, eps); assertTrue("Returned range query is not of expected class.", expectRangeQuery.isAssignableFrom(rangeq.getClass())); - List<DistanceResultPair<DoubleDistance>> ids = rangeq.getRangeForObject(dv, eps); + DistanceDBIDResult<DoubleDistance> ids = rangeq.getRangeForObject(dv, eps); assertEquals("Result size does not match expectation!", shouldd.length, ids.size()); // verify that the neighbors match. int i = 0; - for(DistanceResultPair<DoubleDistance> res : ids) { + for(DistanceDBIDResultIter<DoubleDistance> res = ids.iter(); res.valid(); res.advance(), i++) { // Verify distance assertEquals("Expected distance doesn't match.", shouldd[i], res.getDistance().doubleValue()); // verify vector DoubleVector c = rep.get(res); DoubleVector c2 = new DoubleVector(shouldc[i]); assertEquals("Expected vector doesn't match: " + c.toString(), 0.0, dist.distance(c, c2).doubleValue(), 0.00001); - - i++; } } } diff --git a/test/de/lmu/ifi/dbs/elki/index/preprocessed/TestMaterializedKNNAndRKNNPreprocessor.java b/test/de/lmu/ifi/dbs/elki/index/preprocessed/TestMaterializedKNNAndRKNNPreprocessor.java index 0ef07a69..3d6e1ba7 100644 --- a/test/de/lmu/ifi/dbs/elki/index/preprocessed/TestMaterializedKNNAndRKNNPreprocessor.java +++ b/test/de/lmu/ifi/dbs/elki/index/preprocessed/TestMaterializedKNNAndRKNNPreprocessor.java @@ -34,6 +34,7 @@ import org.junit.Test; import de.lmu.ifi.dbs.elki.JUnit4Test; import de.lmu.ifi.dbs.elki.data.DoubleVector; +import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.VectorUtil; import de.lmu.ifi.dbs.elki.data.type.TypeUtil; import de.lmu.ifi.dbs.elki.database.HashmapDatabase; @@ -41,22 +42,23 @@ import de.lmu.ifi.dbs.elki.database.UpdatableDatabase; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; -import de.lmu.ifi.dbs.elki.database.query.DistanceResultPair; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.knn.KNNQuery; -import de.lmu.ifi.dbs.elki.database.query.knn.KNNResult; import de.lmu.ifi.dbs.elki.database.query.knn.LinearScanKNNQuery; import de.lmu.ifi.dbs.elki.database.query.rknn.LinearScanRKNNQuery; import de.lmu.ifi.dbs.elki.database.query.rknn.RKNNQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; +import de.lmu.ifi.dbs.elki.database.relation.RelationUtil; import de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection; import de.lmu.ifi.dbs.elki.datasource.bundle.MultipleObjectsBundle; import de.lmu.ifi.dbs.elki.distance.distancefunction.EuclideanDistanceFunction; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.DistanceDBIDResult; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.DistanceDBIDResultIter; +import de.lmu.ifi.dbs.elki.distance.distanceresultlist.KNNResult; import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNAndRKNNPreprocessor; import de.lmu.ifi.dbs.elki.index.preprocessed.knn.MaterializeKNNPreprocessor; import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; -import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil; import de.lmu.ifi.dbs.elki.utilities.exceptions.UnableToComplyException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.ParameterException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.ListParameterization; @@ -131,10 +133,11 @@ public class TestMaterializedKNNAndRKNNPreprocessor implements JUnit4Test { // insert new objects List<DoubleVector> insertions = new ArrayList<DoubleVector>(); - DoubleVector o = DatabaseUtil.assumeVectorField(rep).getFactory(); + NumberVector.Factory<DoubleVector, ?> o = RelationUtil.getNumberVectorFactory(rep); + int dim = RelationUtil.dimensionality(rep); Random random = new Random(seed); for(int i = 0; i < updatesize; i++) { - DoubleVector obj = VectorUtil.randomVector(o, random); + DoubleVector obj = VectorUtil.randomVector(o, dim, random); insertions.add(obj); } System.out.println("Insert " + insertions); @@ -156,18 +159,24 @@ public class TestMaterializedKNNAndRKNNPreprocessor implements JUnit4Test { private void testKNNQueries(Relation<DoubleVector> rep, KNNQuery<DoubleVector, DoubleDistance> lin_knn_query, KNNQuery<DoubleVector, DoubleDistance> preproc_knn_query, int k) { ArrayDBIDs sample = DBIDUtil.ensureArray(rep.getDBIDs()); - List<KNNResult<DoubleDistance>> lin_knn_ids = lin_knn_query.getKNNForBulkDBIDs(sample, k); - List<KNNResult<DoubleDistance>> preproc_knn_ids = preproc_knn_query.getKNNForBulkDBIDs(sample, k); + List<? extends KNNResult<DoubleDistance>> lin_knn_ids = lin_knn_query.getKNNForBulkDBIDs(sample, k); + List<? extends KNNResult<DoubleDistance>> preproc_knn_ids = preproc_knn_query.getKNNForBulkDBIDs(sample, k); for(int i = 0; i < rep.size(); i++) { KNNResult<DoubleDistance> lin_knn = lin_knn_ids.get(i); KNNResult<DoubleDistance> pre_knn = preproc_knn_ids.get(i); - if(!lin_knn.equals(pre_knn)) { - System.out.println("LIN kNN " + lin_knn); - System.out.println("PRE kNN " + pre_knn); + DistanceDBIDResultIter<DoubleDistance> lin = lin_knn.iter(), pre = pre_knn.iter(); + for(; lin.valid() && pre.valid(); lin.advance(), pre.advance(), i++) { + if(!DBIDUtil.equal(lin, pre) && lin.getDistance().compareTo(pre.getDistance()) != 0) { + System.out.print("LIN kNN #" + i + " " + lin.getDistancePair()); + System.out.print(" <=> "); + System.out.print("PRE kNN #" + i + " " + pre.getDistancePair()); + System.out.println(); + break; + } } assertEquals("kNN sizes do not agree.", lin_knn.size(), pre_knn.size()); for(int j = 0; j < lin_knn.size(); j++) { - assertTrue("kNNs of linear scan and preprocessor do not match!", lin_knn.get(j).sameDBID(pre_knn.get(j))); + assertTrue("kNNs of linear scan and preprocessor do not match!", DBIDUtil.equal(lin_knn.get(j), pre_knn.get(j))); assertTrue("kNNs of linear scan and preprocessor do not match!", lin_knn.get(j).getDistance().equals(pre_knn.get(j).getDistance())); } } @@ -176,19 +185,25 @@ public class TestMaterializedKNNAndRKNNPreprocessor implements JUnit4Test { private void testRKNNQueries(Relation<DoubleVector> rep, RKNNQuery<DoubleVector, DoubleDistance> lin_rknn_query, RKNNQuery<DoubleVector, DoubleDistance> preproc_rknn_query, int k) { ArrayDBIDs sample = DBIDUtil.ensureArray(rep.getDBIDs()); - List<List<DistanceResultPair<DoubleDistance>>> lin_rknn_ids = lin_rknn_query.getRKNNForBulkDBIDs(sample, k); - List<List<DistanceResultPair<DoubleDistance>>> preproc_rknn_ids = preproc_rknn_query.getRKNNForBulkDBIDs(sample, k); + List<? extends DistanceDBIDResult<DoubleDistance>> lin_rknn_ids = lin_rknn_query.getRKNNForBulkDBIDs(sample, k); + List<? extends DistanceDBIDResult<DoubleDistance>> preproc_rknn_ids = preproc_rknn_query.getRKNNForBulkDBIDs(sample, k); for(int i = 0; i < rep.size(); i++) { - List<DistanceResultPair<DoubleDistance>> lin_rknn = lin_rknn_ids.get(i); - List<DistanceResultPair<DoubleDistance>> pre_rknn = preproc_rknn_ids.get(i); - if(!lin_rknn.equals(pre_rknn)) { - System.out.println("LIN RkNN " + lin_rknn); - System.out.println("PRE RkNN " + pre_rknn); - System.out.println(); + DistanceDBIDResult<DoubleDistance> lin_rknn = lin_rknn_ids.get(i); + DistanceDBIDResult<DoubleDistance> pre_rknn = preproc_rknn_ids.get(i); + + DistanceDBIDResultIter<DoubleDistance> lin = lin_rknn.iter(), pre = pre_rknn.iter(); + for(; lin.valid() && pre.valid(); lin.advance(), pre.advance(), i++) { + if(!DBIDUtil.equal(lin, pre) || lin.getDistance().compareTo(pre.getDistance()) != 0) { + System.out.print("LIN RkNN #" + i + " " + lin); + System.out.print(" <=> "); + System.out.print("PRE RkNN #" + i + " " + pre); + System.out.println(); + break; + } } assertEquals("rkNN sizes do not agree for k=" + k, lin_rknn.size(), pre_rknn.size()); for(int j = 0; j < lin_rknn.size(); j++) { - assertTrue("rkNNs of linear scan and preprocessor do not match!", lin_rknn.get(j).sameDBID(pre_rknn.get(j))); + assertTrue("rkNNs of linear scan and preprocessor do not match!", DBIDUtil.equal(lin_rknn.get(j), pre_rknn.get(j))); assertTrue("rkNNs of linear scan and preprocessor do not match!", lin_rknn.get(j).getDistance().equals(pre_rknn.get(j).getDistance())); } } |