diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mtree')
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 |