package de.lmu.ifi.dbs.elki.index.preprocessed.knn; import de.lmu.ifi.dbs.elki.algorithm.KNNJoin; import de.lmu.ifi.dbs.elki.data.NumberVector; 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.index.tree.spatial.SpatialEntry; import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeNode; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.utilities.datastructures.heap.KNNList; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2012 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ /** * Class to materialize the kNN using a spatial join on an R-tree. * * @author Erich Schubert * * @param vector type * @param distance type */ public class KNNJoinMaterializeKNNPreprocessor, D extends Distance> extends AbstractMaterializeKNNPreprocessor> { /** * Logging class. */ private static final Logging logger = Logging.getLogger(KNNJoinMaterializeKNNPreprocessor.class); /** * Constructor. * * @param relation Relation to index * @param distanceFunction Distance function * @param k k */ public KNNJoinMaterializeKNNPreprocessor(Relation relation, DistanceFunction distanceFunction, int k) { super(relation, distanceFunction, k); } @Override protected void preprocess() { // Run KNNJoin KNNJoin knnjoin = new KNNJoin(distanceFunction, k); storage = knnjoin.run(relation.getDatabase(), relation); } @Override protected Logging getLogger() { return logger; } @Override public String getLongName() { return "knn-join materialized neighbors"; } @Override public String getShortName() { return "knn-join"; } /** * The parameterizable factory. * * @author Erich Schubert * * @apiviz.landmark * @apiviz.stereotype factory * @apiviz.uses AbstractMaterializeKNNPreprocessor oneway - - «create» * * @param The object type * @param The distance type */ public static class Factory, D extends Distance> extends AbstractMaterializeKNNPreprocessor.Factory> { /** * Constructor. * * @param k K * @param distanceFunction distance function */ public Factory(int k, DistanceFunction distanceFunction) { super(k, distanceFunction); } @Override public KNNJoinMaterializeKNNPreprocessor instantiate(Relation relation) { return new KNNJoinMaterializeKNNPreprocessor(relation, distanceFunction, k); } /** * Parameterization class * * @author Erich Schubert * * @apiviz.exclude * * @param Object type * @param Distance type */ public static class Parameterizer, D extends Distance> extends AbstractMaterializeKNNPreprocessor.Factory.Parameterizer { @Override protected KNNJoinMaterializeKNNPreprocessor.Factory makeInstance() { return new KNNJoinMaterializeKNNPreprocessor.Factory(k, distanceFunction); } } } }