summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree/MTree.java90
1 files changed, 23 insertions, 67 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
+}