diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabDirectoryEntry.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabDirectoryEntry.java | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabDirectoryEntry.java b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabDirectoryEntry.java new file mode 100644 index 00000000..ad0c301e --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/index/tree/metrical/mtreevariants/mktrees/mktab/MkTabDirectoryEntry.java @@ -0,0 +1,167 @@ +package de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.mktrees.mktab; +/* +This file is part of ELKI: +Environment for Developing KDD-Applications Supported by Index-Structures + +Copyright (C) 2011 +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 <http://www.gnu.org/licenses/>. +*/ + +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.util.ArrayList; +import java.util.List; + +import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; +import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeDirectoryEntry; + +/** + * Represents an entry in a directory node of a MkTab-Tree. Additionally to a + * MTreeLeafEntry a MkTabDirectoryEntry holds a list of its knn distances for + * parameters k <= k_max. + * + * @author Elke Achtert + * + */ +class MkTabDirectoryEntry<D extends Distance<D>> extends MTreeDirectoryEntry<D> implements MkTabEntry<D> { + private static final long serialVersionUID = 1; + + /** + * The maximal number of knn distances to be stored. + */ + private int k_max; + + /** + * The aggregated knn distances of the underlying node. + */ + private List<D> knnDistances; + + /** + * Empty constructor for serialization purposes. + */ + public MkTabDirectoryEntry() { + super(); + } + + /** + * Provides a new MkMaxDirectoryEntry with the given parameters. + * + * @param objectID the id of the routing object + * @param parentDistance the distance from the routing object of this entry to + * its parent's routing object + * @param nodeID the id of the underlying node + * @param coveringRadius the covering radius of the entry + * @param knnDistances the aggregated knn distances of the underlying node + */ + public MkTabDirectoryEntry(DBID objectID, D parentDistance, Integer nodeID, D coveringRadius, List<D> knnDistances) { + super(objectID, parentDistance, nodeID, coveringRadius); + this.knnDistances = knnDistances; + this.k_max = knnDistances.size(); + } + + @Override + public List<D> getKnnDistances() { + return knnDistances; + } + + @Override + public void setKnnDistances(List<D> knnDistances) { + this.knnDistances = knnDistances; + } + + @Override + public D getKnnDistance(int k) { + if(k > this.k_max) { + throw new IllegalArgumentException("Parameter k = " + k + " is not supported!"); + } + + return knnDistances.get(k - 1); + } + + @Override + public int getK_max() { + return k_max; + } + + /** + * Calls the super method and writes the parameter k_max and the knn distances + * of this entry to the specified stream. + * + * @param out the stream to write the object to + * @throws java.io.IOException Includes any I/O exceptions that may occur + */ + @Override + public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + out.writeInt(k_max); + for(int i = 0; i < k_max; i++) { + out.writeObject(knnDistances.get(i)); + } + } + + /** + * Calls the super method and reads the parameter k_max and knn distance of + * this entry from the specified input stream. + * + * @param in the stream to read data from in order to restore the object + * @throws java.io.IOException if I/O errors occur + * @throws ClassNotFoundException If the class for an object being restored + * cannot be found. + */ + @Override + @SuppressWarnings("unchecked") + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + k_max = in.readInt(); + knnDistances = new ArrayList<D>(); + for(int i = 0; i < k_max; i++) { + knnDistances.add((D) in.readObject()); + } + } + + /** + * Indicates whether some other object is "equal to" this one. + * + * @param o the object to be tested + * @return true, if the super method returns true and o is an + * MkTabDirectoryEntry and has the same parameter k_max and + * knnDistances as this entry. + */ + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object o) { + if(this == o) { + return true; + } + if(o == null || getClass() != o.getClass()) { + return false; + } + if(!super.equals(o)) { + return false; + } + + final MkTabDirectoryEntry<D> that = (MkTabDirectoryEntry<D>) o; + + if(k_max != that.k_max) { + return false; + } + return !(knnDistances != null ? !knnDistances.equals(that.knnDistances) : that.knnDistances != null); + } +}
\ No newline at end of file |