diff options
author | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:36 +0000 |
---|---|---|
committer | Andrej Shadura <andrewsh@debian.org> | 2019-03-09 22:30:36 +0000 |
commit | 8300861dc4c62c5567a4e654976072f854217544 (patch) | |
tree | 0a148df3698efedd37839f6aca0e21b2f12f1b52 /src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java | |
parent | b7b404fd7a726774d442562d11659d7b5368cdb9 (diff) |
Import Upstream version 0.6.0~beta2
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java index 2ca19877..fedf8ddb 100644 --- a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java +++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/query/MetricalIndexRangeQuery.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.query; 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.query; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; -import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; +import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDList; +import de.lmu.ifi.dbs.elki.database.ids.generic.GenericDistanceDBIDList; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.range.AbstractDistanceRangeQuery; -import de.lmu.ifi.dbs.elki.distance.distanceresultlist.DistanceDBIDResult; -import de.lmu.ifi.dbs.elki.distance.distanceresultlist.GenericDistanceDBIDList; -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.DirectoryEntry; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTree; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeNode; @@ -42,11 +41,11 @@ import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry; * * @apiviz.uses AbstractMTree */ -public class MetricalIndexRangeQuery<O, D extends Distance<D>> extends AbstractDistanceRangeQuery<O, D> { +public class MetricalIndexRangeQuery<O, D extends NumberDistance<D, ?>> extends AbstractDistanceRangeQuery<O, D> { /** * The index to use */ - protected final AbstractMTree<O, D, ?, ?> index; + protected final AbstractMTree<O, D, ?, ?, ?> index; /** * Constructor. @@ -54,7 +53,7 @@ public class MetricalIndexRangeQuery<O, D extends Distance<D>> extends AbstractD * @param index Index to use * @param distanceQuery Distance query used */ - public MetricalIndexRangeQuery(AbstractMTree<O, D, ?, ?> index, DistanceQuery<O, D> distanceQuery) { + public MetricalIndexRangeQuery(AbstractMTree<O, D, ?, ?, ?> index, DistanceQuery<O, D> distanceQuery) { super(distanceQuery); this.index = index; } @@ -71,22 +70,26 @@ public class MetricalIndexRangeQuery<O, D extends Distance<D>> extends AbstractD * @param result the list holding the query results */ private void doRangeQuery(DBID o_p, AbstractMTreeNode<O, D, ?, ?> node, O q, D r_q, GenericDistanceDBIDList<D> result) { - final D nullDistance = distanceQuery.nullDistance(); - D d1 = o_p != null ? distanceQuery.distance(o_p, q) : nullDistance; + double d1 = 0.; + if (o_p != null) { + d1 = distanceQuery.distance(o_p, q).doubleValue(); + index.statistics.countDistanceCalculation(); + } if (!node.isLeaf()) { for (int i = 0; i < node.getNumEntries(); i++) { - MTreeEntry<D> entry = node.getEntry(i); + MTreeEntry entry = node.getEntry(i); DBID o_r = entry.getRoutingObjectID(); - D r_or = entry.getCoveringRadius(); - D d2 = o_p != null ? entry.getParentDistance() : nullDistance; - D diff = d1.compareTo(d2) > 0 ? d1.minus(d2) : d2.minus(d1); + double r_or = entry.getCoveringRadius(); + double d2 = o_p != null ? entry.getParentDistance() : 0.; + double diff = Math.abs(d1 - d2); - D sum = r_q.plus(r_or); + double sum = r_q.doubleValue() + r_or; - if (diff.compareTo(sum) <= 0) { + if (diff <= sum) { D d3 = distanceQuery.distance(o_r, q); - if (d3.compareTo(sum) <= 0) { + index.statistics.countDistanceCalculation(); + if (d3.doubleValue() <= sum) { AbstractMTreeNode<O, D, ?, ?> child = index.getNode(((DirectoryEntry) entry).getPageID()); doRangeQuery(o_r, child, q, r_q, result); } @@ -94,15 +97,16 @@ public class MetricalIndexRangeQuery<O, D extends Distance<D>> extends AbstractD } } else { for (int i = 0; i < node.getNumEntries(); i++) { - MTreeEntry<D> entry = node.getEntry(i); + MTreeEntry entry = node.getEntry(i); DBID o_j = entry.getRoutingObjectID(); - D d2 = o_p != null ? entry.getParentDistance() : nullDistance; + double d2 = o_p != null ? entry.getParentDistance() : 0.; - D diff = d1.compareTo(d2) > 0 ? d1.minus(d2) : d2.minus(d1); + double diff = Math.abs(d1 - d2); - if (diff.compareTo(r_q) <= 0) { + if (diff <= r_q.doubleValue()) { D d3 = distanceQuery.distance(o_j, q); + index.statistics.countDistanceCalculation(); if (d3.compareTo(r_q) <= 0) { result.add(d3, o_j); } @@ -112,18 +116,14 @@ public class MetricalIndexRangeQuery<O, D extends Distance<D>> extends AbstractD } @Override - public DistanceDBIDResult<D> getRangeForObject(O obj, D range) { - final GenericDistanceDBIDList<D> result = new GenericDistanceDBIDList<D>(); + public DistanceDBIDList<D> getRangeForObject(O obj, D range) { + final GenericDistanceDBIDList<D> result = new GenericDistanceDBIDList<>(); doRangeQuery(null, index.getRoot(), obj, range, result); + index.statistics.countRangeQuery(); // sort the result according to the distances result.sort(); return result; } - - @Override - public DistanceDBIDResult<D> getRangeForDBID(DBIDRef id, D range) { - return getRangeForObject(relation.get(id), range); - } } |