diff options
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.java | 90 |
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 +} |