summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree')
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java90
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeFactory.java34
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeIndex.java144
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeNode.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/package-info.java2
5 files changed, 155 insertions, 121 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java
index 4276329c..1b3d1481 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -24,12 +24,11 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
*/
import de.lmu.ifi.dbs.elki.database.ids.DBID;
-import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery;
-import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTree;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeDirectoryEntry;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry;
+import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeSettings;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.persistent.PageFile;
import de.lmu.ifi.dbs.elki.utilities.documentation.Description;
@@ -41,6 +40,14 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Title;
* Apart from organizing the objects it also provides several methods to search
* for certain object in the structure. Persistence is not yet ensured.
*
+ * Reference:
+ * <p>
+ * P. Ciaccia, M. Patella, P. Zezula<br />
+ * M-tree: An Efficient Access Method for Similarity Search in Metric Spaces<br />
+ * In Proceedings of 23rd International Conference on Very Large Data Bases
+ * (VLDB'97), August 25-29, 1997, Athens, Greece
+ * </p>
+ *
* @author Elke Achtert
*
* @apiviz.has MTreeNode oneway - - contains
@@ -51,7 +58,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Title;
@Title("M-Tree")
@Description("Efficient Access Method for Similarity Search in Metric Spaces")
@Reference(authors = "P. Ciaccia, M. Patella, P. Zezula", title = "M-tree: An Efficient Access Method for Similarity Search in Metric Spaces", booktitle = "VLDB'97, Proceedings of 23rd International Conference on Very Large Data Bases, August 25-29, 1997, Athens, Greece", url = "http://www.vldb.org/conf/1997/P426.PDF")
-public class MTree<O, D extends Distance<D>> extends AbstractMTree<O, D, MTreeNode<O, D>, MTreeEntry<D>> {
+abstract public class MTree<O, D extends NumberDistance<D, ?>> extends AbstractMTree<O, D, MTreeNode<O, D>, MTreeEntry, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry>> {
/**
* The logger for this class.
*/
@@ -61,77 +68,26 @@ public class MTree<O, D extends Distance<D>> extends AbstractMTree<O, D, MTreeNo
* Constructor.
*
* @param pagefile Page file
- * @param distanceQuery Distance query
- * @param distanceFunction Distance function
+ * @param settings Tree settings
*/
- public MTree(PageFile<MTreeNode<O, D>> pagefile, DistanceQuery<O, D> distanceQuery, DistanceFunction<O, D> distanceFunction) {
- super(pagefile, distanceQuery, distanceFunction);
+ public MTree(PageFile<MTreeNode<O, D>> pagefile, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry> settings) {
+ super(pagefile, settings);
}
/**
* Does nothing because no operations are necessary before inserting an entry.
*/
@Override
- protected void preInsert(MTreeEntry<D> entry) {
+ protected void preInsert(MTreeEntry entry) {
// do nothing
}
- @Override
- protected void initializeCapacities(MTreeEntry<D> exampleLeaf) {
- int distanceSize = exampleLeaf.getParentDistance().externalizableSize();
-
- // FIXME: simulate a proper feature size!
- int featuresize = 0; // RelationUtil.dimensionality(relation);
-
- // overhead = index(4), numEntries(4), id(4), isLeaf(0.125)
- double overhead = 12.125;
- if(getPageSize() - overhead < 0) {
- throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
- }
-
- // dirCapacity = (pageSize - overhead) / (nodeID + objectID +
- // coveringRadius + parentDistance) + 1
- // dirCapacity = (int) (pageSize - overhead) / (4 + 4 + distanceSize +
- // distanceSize) + 1;
-
- // dirCapacity = (pageSize - overhead) / (nodeID + **object feature size** +
- // coveringRadius + parentDistance) + 1
- dirCapacity = (int) (getPageSize() - overhead) / (4 + featuresize + distanceSize + distanceSize) + 1;
-
- if(dirCapacity <= 2) {
- throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
- }
-
- if(dirCapacity < 10) {
- LOG.warning("Page size is choosen too small! Maximum number of entries " + "in a directory node = " + (dirCapacity - 1));
- }
- // leafCapacity = (pageSize - overhead) / (objectID + parentDistance) +
- // 1
- // leafCapacity = (int) (pageSize - overhead) / (4 + distanceSize) + 1;
- // leafCapacity = (pageSize - overhead) / (objectID + ** object size ** +
- // parentDistance) +
- // 1
- leafCapacity = (int) (getPageSize() - overhead) / (4 + featuresize + distanceSize) + 1;
-
- if(leafCapacity <= 1) {
- throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
- }
-
- if(leafCapacity < 10) {
- LOG.warning("Page size is choosen too small! Maximum number of entries " + "in a leaf node = " + (leafCapacity - 1));
- }
-
- if(LOG.isVerbose()) {
- LOG.verbose("Directory Capacity: " + (dirCapacity - 1) + "\nLeaf Capacity: " + (leafCapacity - 1));
- }
- }
-
/**
* @return a new MTreeDirectoryEntry representing the specified node
*/
@Override
- protected MTreeEntry<D> createNewDirectoryEntry(MTreeNode<O, D> node, DBID routingObjectID, D parentDistance) {
- return new MTreeDirectoryEntry<D>(routingObjectID, parentDistance, node.getPageID(), node.coveringRadius(routingObjectID, this));
+ protected MTreeEntry createNewDirectoryEntry(MTreeNode<O, D> node, DBID routingObjectID, double parentDistance) {
+ return new MTreeDirectoryEntry(routingObjectID, parentDistance, node.getPageID(), node.coveringRadius(routingObjectID, this));
}
/**
@@ -139,8 +95,8 @@ public class MTree<O, D extends Distance<D>> extends AbstractMTree<O, D, MTreeNo
* <code>new MTreeDirectoryEntry<D>(null, null, 0, null)</code>
*/
@Override
- protected MTreeEntry<D> createRootEntry() {
- return new MTreeDirectoryEntry<D>(null, null, 0, null);
+ protected MTreeEntry createRootEntry() {
+ return new MTreeDirectoryEntry(null, 0., 0, 0.);
}
/**
@@ -148,7 +104,7 @@ public class MTree<O, D extends Distance<D>> extends AbstractMTree<O, D, MTreeNo
*/
@Override
protected MTreeNode<O, D> createNewLeafNode() {
- return new MTreeNode<O, D>(leafCapacity, true);
+ return new MTreeNode<>(leafCapacity, true);
}
/**
@@ -156,11 +112,11 @@ public class MTree<O, D extends Distance<D>> extends AbstractMTree<O, D, MTreeNo
*/
@Override
protected MTreeNode<O, D> createNewDirectoryNode() {
- return new MTreeNode<O, D>(dirCapacity, false);
+ return new MTreeNode<>(dirCapacity, false);
}
@Override
protected Logging getLogger() {
return LOG;
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeFactory.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeFactory.java
index 5c5aac04..dbc27511 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeFactory.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeFactory.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -24,11 +24,13 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
*/
import de.lmu.ifi.dbs.elki.database.relation.Relation;
-import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeFactory;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry;
+import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeSettings;
import de.lmu.ifi.dbs.elki.persistent.PageFile;
+import de.lmu.ifi.dbs.elki.persistent.PageFileFactory;
+import de.lmu.ifi.dbs.elki.utilities.Alias;
import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil;
/**
@@ -42,23 +44,22 @@ import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil;
* @param <O> Object type
* @param <D> Distance type
*/
-public class MTreeFactory<O, D extends Distance<D>> extends AbstractMTreeFactory<O, D, MTreeNode<O, D>, MTreeEntry<D>, MTreeIndex<O, D>> {
+@Alias({ "mtree", "m" })
+public class MTreeFactory<O, D extends NumberDistance<D, ?>> extends AbstractMTreeFactory<O, D, MTreeNode<O, D>, MTreeEntry, MTreeIndex<O, D>, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry>> {
/**
* Constructor.
*
- * @param fileName file name
- * @param pageSize page size
- * @param cacheSize cache size
- * @param distanceFunction Distance function
+ * @param pageFileFactory Data storage
+ * @param settings Tree settings
*/
- public MTreeFactory(String fileName, int pageSize, long cacheSize, DistanceFunction<O, D> distanceFunction) {
- super(fileName, pageSize, cacheSize, distanceFunction);
+ public MTreeFactory(PageFileFactory<?> pageFileFactory, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry> settings) {
+ super(pageFileFactory, settings);
}
@Override
public MTreeIndex<O, D> instantiate(Relation<O> relation) {
PageFile<MTreeNode<O, D>> pagefile = makePageFile(getNodeClass());
- return new MTreeIndex<O, D>(relation, pagefile, distanceFunction.instantiate(relation), distanceFunction);
+ return new MTreeIndex<>(relation, pagefile, settings);
}
protected Class<MTreeNode<O, D>> getNodeClass() {
@@ -72,10 +73,15 @@ public class MTreeFactory<O, D extends Distance<D>> extends AbstractMTreeFactory
*
* @apiviz.exclude
*/
- public static class Parameterizer<O, D extends Distance<D>> extends AbstractMTreeFactory.Parameterizer<O, D> {
+ public static class Parameterizer<O, D extends NumberDistance<D, ?>> extends AbstractMTreeFactory.Parameterizer<O, D, MTreeNode<O, D>, MTreeEntry, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry>> {
@Override
protected MTreeFactory<O, D> makeInstance() {
- return new MTreeFactory<O, D>(fileName, pageSize, cacheSize, distanceFunction);
+ return new MTreeFactory<>(pageFileFactory, settings);
+ }
+
+ @Override
+ protected MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry> makeSettings() {
+ return new MTreeSettings<>();
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeIndex.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeIndex.java
index 8afe1f2a..32908a1e 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeIndex.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeIndex.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
import java.util.ArrayList;
import java.util.List;
+import de.lmu.ifi.dbs.elki.data.FeatureVector;
import de.lmu.ifi.dbs.elki.database.ids.DBID;
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
@@ -36,64 +37,137 @@ 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.range.RangeQuery;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
+import de.lmu.ifi.dbs.elki.database.relation.RelationUtil;
import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
+import de.lmu.ifi.dbs.elki.index.DynamicIndex;
import de.lmu.ifi.dbs.elki.index.KNNIndex;
import de.lmu.ifi.dbs.elki.index.RangeIndex;
-import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTree;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeLeafEntry;
+import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeSettings;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query.MTreeQueryUtil;
+import de.lmu.ifi.dbs.elki.persistent.ByteArrayUtil;
import de.lmu.ifi.dbs.elki.persistent.PageFile;
import de.lmu.ifi.dbs.elki.utilities.exceptions.ExceptionMessages;
+import de.lmu.ifi.dbs.elki.utilities.exceptions.NotImplementedException;
/**
* Class for using an m-tree as database index.
*
* @author Erich Schubert
- *
+ *
* @param <O> Object type
* @param <D> Distance type
*/
-public class MTreeIndex<O, D extends Distance<D>> extends MTree<O, D> implements RangeIndex<O>, KNNIndex<O> {
+public class MTreeIndex<O, D extends NumberDistance<D, ?>> extends MTree<O, D> implements RangeIndex<O>, KNNIndex<O>, DynamicIndex {
/**
* The relation indexed.
*/
private Relation<O> relation;
/**
+ * The distance query.
+ */
+ protected DistanceQuery<O, D> distanceQuery;
+
+ /**
* Constructor.
- *
+ *
* @param relation Relation indexed
* @param pagefile Page file
- * @param distanceQuery Distance query
- * @param distanceFunction Distance function
+ * @param settings Tree settings
*/
- public MTreeIndex(Relation<O> relation, PageFile<MTreeNode<O, D>> pagefile, DistanceQuery<O, D> distanceQuery, DistanceFunction<O, D> distanceFunction) {
- super(pagefile, distanceQuery, distanceFunction);
+ public MTreeIndex(Relation<O> relation, PageFile<MTreeNode<O, D>> pagefile, MTreeSettings<O, D, MTreeNode<O, D>, MTreeEntry> settings) {
+ super(pagefile, settings);
this.relation = relation;
- this.initialize();
+ this.distanceQuery = getDistanceFunction().instantiate(relation);
+ }
+
+ @Override
+ public D distance(DBIDRef id1, DBIDRef id2) {
+ if (id1 == null || id2 == null) {
+ return getDistanceFactory().undefinedDistance();
+ }
+ statistics.countDistanceCalculation();
+ return distanceQuery.distance(id1, id2);
+ }
+
+ @Override
+ protected void initializeCapacities(MTreeEntry exampleLeaf) {
+ int distanceSize = ByteArrayUtil.SIZE_DOUBLE; // exampleLeaf.getParentDistance().externalizableSize();
+
+ // FIXME: simulate a proper feature size!
+ @SuppressWarnings("unchecked")
+ int featuresize = 8 * RelationUtil.dimensionality((Relation<? extends FeatureVector<?>>) relation);
+ if (featuresize <= 0) {
+ getLogger().warning("Relation does not have a dimensionality -- simulating M-tree as external index!");
+ featuresize = 0;
+ }
+
+ // overhead = index(4), numEntries(4), id(4), isLeaf(0.125)
+ double overhead = 12.125;
+ if (getPageSize() - overhead < 0) {
+ throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
+ }
+
+ // dirCapacity = (pageSize - overhead) / (nodeID + objectID + coveringRadius
+ // + parentDistance) + 1
+ // dirCapacity = (int) (pageSize - overhead) / (4 + 4 + distanceSize +
+ // distanceSize) + 1;
+
+ // dirCapacity = (pageSize - overhead) / (nodeID + **object feature size** +
+ // coveringRadius + parentDistance) + 1
+ dirCapacity = (int) (getPageSize() - overhead) / (4 + featuresize + distanceSize + distanceSize) + 1;
+
+ if (dirCapacity <= 2) {
+ throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
+ }
+
+ if (dirCapacity < 10) {
+ getLogger().warning("Page size is choosen too small! Maximum number of entries " + "in a directory node = " + (dirCapacity - 1));
+ }
+ // leafCapacity = (pageSize - overhead) / (objectID + parentDistance) + 1
+ // leafCapacity = (int) (pageSize - overhead) / (4 + distanceSize) + 1;
+ // leafCapacity = (pageSize - overhead) / (objectID + ** object size ** +
+ // parentDistance) + 1
+ leafCapacity = (int) (getPageSize() - overhead) / (4 + featuresize + distanceSize) + 1;
+
+ if (leafCapacity <= 1) {
+ throw new RuntimeException("Node size of " + getPageSize() + " Bytes is chosen too small!");
+ }
+
+ if (leafCapacity < 10) {
+ getLogger().warning("Page size is choosen too small! Maximum number of entries " + "in a leaf node = " + (leafCapacity - 1));
+ }
}
/**
* @return a new MTreeLeafEntry representing the specified data object
*/
- protected MTreeEntry<D> createNewLeafEntry(DBID id, O object, D parentDistance) {
- return new MTreeLeafEntry<D>(id, parentDistance);
+ protected MTreeEntry createNewLeafEntry(DBID id, O object, double parentDistance) {
+ return new MTreeLeafEntry(id, parentDistance);
+ }
+
+ @Override
+ public void initialize() {
+ super.initialize();
+ insertAll(relation.getDBIDs());
}
@Override
public void insert(DBIDRef id) {
- insert(createNewLeafEntry(DBIDUtil.deref(id), relation.get(id), getDistanceFactory().undefinedDistance()), false);
+ insert(createNewLeafEntry(DBIDUtil.deref(id), relation.get(id), Double.NaN), false);
}
@Override
public void insertAll(DBIDs ids) {
- List<MTreeEntry<D>> objs = new ArrayList<MTreeEntry<D>>(ids.size());
+ List<MTreeEntry> objs = new ArrayList<>(ids.size());
for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
DBID id = DBIDUtil.deref(iter);
final O object = relation.get(id);
- objs.add(createNewLeafEntry(id, object, getDistanceFactory().undefinedDistance()));
+ objs.add(createNewLeafEntry(id, object, Double.NaN));
}
insertAll(objs);
}
@@ -107,7 +181,7 @@ public class MTreeIndex<O, D extends Distance<D>> extends MTree<O, D> implements
*/
@Override
public final boolean delete(DBIDRef id) {
- throw new UnsupportedOperationException(ExceptionMessages.UNSUPPORTED_NOT_YET);
+ throw new NotImplementedException(ExceptionMessages.UNSUPPORTED_NOT_YET);
}
/**
@@ -119,57 +193,55 @@ public class MTreeIndex<O, D extends Distance<D>> extends MTree<O, D> implements
*/
@Override
public void deleteAll(DBIDs ids) {
- throw new UnsupportedOperationException(ExceptionMessages.UNSUPPORTED_NOT_YET);
+ throw new NotImplementedException(ExceptionMessages.UNSUPPORTED_NOT_YET);
}
@SuppressWarnings("unchecked")
@Override
public <S extends Distance<S>> KNNQuery<O, S> getKNNQuery(DistanceQuery<O, S> distanceQuery, Object... hints) {
// Query on the relation we index
- if(distanceQuery.getRelation() != relation) {
+ if (distanceQuery.getRelation() != relation) {
return null;
}
- DistanceFunction<? super O, S> distanceFunction = distanceQuery.getDistanceFunction();
- if(!this.distanceFunction.equals(distanceFunction)) {
- if(getLogger().isDebugging()) {
+ DistanceFunction<? super O, D> distanceFunction = (DistanceFunction<? super O, D>) distanceQuery.getDistanceFunction();
+ if (!this.getDistanceFunction().equals(distanceFunction)) {
+ if (getLogger().isDebugging()) {
getLogger().debug("Distance function not supported by index - or 'equals' not implemented right!");
}
return null;
}
// Bulk is not yet supported
- for(Object hint : hints) {
- if(hint == DatabaseQuery.HINT_BULK) {
+ for (Object hint : hints) {
+ if (hint == DatabaseQuery.HINT_BULK) {
return null;
}
}
- AbstractMTree<O, S, ?, ?> idx = (AbstractMTree<O, S, ?, ?>) this;
- DistanceQuery<O, S> dq = distanceFunction.instantiate(relation);
- return MTreeQueryUtil.getKNNQuery(idx, dq, hints);
+ DistanceQuery<O, D> dq = distanceFunction.instantiate(relation);
+ return (KNNQuery<O, S>) MTreeQueryUtil.getKNNQuery(this, dq, hints);
}
@SuppressWarnings("unchecked")
@Override
public <S extends Distance<S>> RangeQuery<O, S> getRangeQuery(DistanceQuery<O, S> distanceQuery, Object... hints) {
// Query on the relation we index
- if(distanceQuery.getRelation() != relation) {
+ if (distanceQuery.getRelation() != relation) {
return null;
}
- DistanceFunction<? super O, S> distanceFunction = distanceQuery.getDistanceFunction();
- if(!this.distanceFunction.equals(distanceFunction)) {
- if(getLogger().isDebugging()) {
+ DistanceFunction<? super O, D> distanceFunction = (DistanceFunction<? super O, D>) distanceQuery.getDistanceFunction();
+ if (!this.getDistanceFunction().equals(distanceFunction)) {
+ if (getLogger().isDebugging()) {
getLogger().debug("Distance function not supported by index - or 'equals' not implemented right!");
}
return null;
}
// Bulk is not yet supported
- for(Object hint : hints) {
- if(hint == DatabaseQuery.HINT_BULK) {
+ for (Object hint : hints) {
+ if (hint == DatabaseQuery.HINT_BULK) {
return null;
}
}
- AbstractMTree<O, S, ?, ?> idx = (AbstractMTree<O, S, ?, ?>) this;
- DistanceQuery<O, S> dq = distanceFunction.instantiate(relation);
- return MTreeQueryUtil.getRangeQuery(idx, dq);
+ DistanceQuery<O, D> dq = distanceFunction.instantiate(relation);
+ return (RangeQuery<O, S>) MTreeQueryUtil.getRangeQuery(this, dq);
}
@Override
@@ -181,4 +253,4 @@ public class MTreeIndex<O, D extends Distance<D>> extends MTree<O, D> implements
public String getShortName() {
return "mtree";
}
-} \ No newline at end of file
+}
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeNode.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeNode.java
index 017e7d6c..b3aa77fb 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeNode.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTreeNode.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mtree;
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
+import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeNode;
import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry;
@@ -34,7 +34,7 @@ import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry;
* @param <O> Object type
* @param <D> Distance type
*/
-public class MTreeNode<O, D extends Distance<D>> extends AbstractMTreeNode<O, D, MTreeNode<O, D>, MTreeEntry<D>> {
+public class MTreeNode<O, D extends NumberDistance<D, ?>> extends AbstractMTreeNode<O, D, MTreeNode<O, D>, MTreeEntry> {
/**
* Serial version
*/
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/package-info.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/package-info.java
index a34162a8..c10d683b 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/package-info.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/package-info.java
@@ -5,7 +5,7 @@
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
-Copyright (C) 2012
+Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team