diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/utilities')
45 files changed, 517 insertions, 429 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/utilities/Base64.java b/src/de/lmu/ifi/dbs/elki/utilities/Base64.java index da3b52a7..9ea9a024 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/Base64.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/Base64.java @@ -1,4 +1,26 @@ package de.lmu.ifi.dbs.elki.utilities; +/* + 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 <http://www.gnu.org/licenses/>. + */ import java.lang.reflect.Constructor; import java.lang.reflect.Method; diff --git a/src/de/lmu/ifi/dbs/elki/utilities/DatabaseUtil.java b/src/de/lmu/ifi/dbs/elki/utilities/DatabaseUtil.java index 23eba080..365e3847 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/DatabaseUtil.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/DatabaseUtil.java @@ -45,6 +45,7 @@ import de.lmu.ifi.dbs.elki.database.Database; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; import de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs; 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.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.database.relation.ConvertToStringView; @@ -181,8 +182,8 @@ public final class DatabaseUtil { for(int d = 1; d <= centroid.getDimensionality(); d++) { double mu = centroid.doubleValue(d); - for(Iterator<DBID> it = database.iterDBIDs(); it.hasNext();) { - NumberVector<?, ?> o = database.get(it.next()); + for(DBIDIter it = database.iterDBIDs(); it.valid(); it.advance()) { + NumberVector<?, ?> o = database.get(it); double diff = o.doubleValue(d) - mu; variances[d - 1] += diff * diff; } @@ -220,8 +221,8 @@ public final class DatabaseUtil { for(int d = 1; d <= centroid.getDimensionality(); d++) { double mu = centroid.doubleValue(d); - for(DBID id : ids) { - NumberVector<?, ?> o = database.get(id); + for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + NumberVector<?, ?> o = database.get(iter); double diff = o.doubleValue(d) - mu; variances[d - 1] += diff * diff; } @@ -247,10 +248,10 @@ public final class DatabaseUtil { mins[i] = Double.MAX_VALUE; maxs[i] = -Double.MAX_VALUE; } - for(DBID it : database.iterDBIDs()) { - NV o = database.get(it); + for(DBIDIter iditer = database.iterDBIDs(); iditer.valid(); iditer.advance()) { + final NV o = database.get(iditer); for(int d = 0; d < dim; d++) { - double v = o.doubleValue(d + 1); + final double v = o.doubleValue(d + 1); mins[d] = Math.min(mins[d], v); maxs[d] = Math.max(maxs[d], v); } @@ -300,8 +301,8 @@ public final class DatabaseUtil { public static <V extends NumberVector<?, ?>> double exactMedian(Relation<V> relation, DBIDs ids, int dimension) { final double[] vals = new double[ids.size()]; int i = 0; - for(DBID id : ids) { - vals[i] = relation.get(id).doubleValue(dimension); + for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) { + vals[i] = relation.get(iter).doubleValue(dimension); i++; } Arrays.sort(vals); @@ -398,8 +399,8 @@ public final class DatabaseUtil { */ public static SortedSet<ClassLabel> getClassLabels(Relation<? extends ClassLabel> database) { SortedSet<ClassLabel> labels = new TreeSet<ClassLabel>(); - for(Iterator<DBID> iter = database.iterDBIDs(); iter.hasNext();) { - labels.add(database.get(iter.next())); + for(DBIDIter it = database.iterDBIDs(); it.valid(); it.advance()) { + labels.add(database.get(it)); } return labels; } @@ -425,10 +426,7 @@ public final class DatabaseUtil { */ @SuppressWarnings("unchecked") public static <O> Class<? extends O> guessObjectClass(Relation<O> database) { - for(DBID id : database.iterDBIDs()) { - return (Class<? extends O>) database.get(id).getClass(); - } - return null; + return (Class<? extends O>) database.get(database.iterDBIDs()).getClass(); } /** @@ -445,16 +443,17 @@ public final class DatabaseUtil { */ public static <O> Class<?> getBaseObjectClassExpensive(Relation<O> database) { List<Class<?>> candidates = new ArrayList<Class<?>>(); - Iterator<DBID> iditer = database.iterDBIDs(); + DBIDIter iditer = database.iterDBIDs(); // empty database?! - if(!iditer.hasNext()) { + if(!iditer.valid()) { return null; } // put first class into result set. - candidates.add(database.get(iditer.next()).getClass()); + candidates.add(database.get(iditer).getClass()); + iditer.advance(); // other objects - while(iditer.hasNext()) { - Class<?> newcls = database.get(iditer.next()).getClass(); + for(; iditer.valid(); iditer.advance()) { + Class<?> newcls = database.get(iditer).getClass(); // validate all candidates Iterator<Class<?>> ci = candidates.iterator(); while(ci.hasNext()) { @@ -509,9 +508,9 @@ public final class DatabaseUtil { return DBIDUtil.newArray(); } ArrayModifiableDBIDs ret = DBIDUtil.newArray(); - for(DBID objid : relation.iterDBIDs()) { - if(name_pattern.matcher(relation.get(objid)).matches()) { - ret.add(objid); + for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) { + if(name_pattern.matcher(relation.get(iditer)).find()) { + ret.add(iditer); } } return ret; @@ -556,7 +555,7 @@ public final class DatabaseUtil { /** * The real iterator. */ - final Iterator<DBID> iter; + final DBIDIter iter; /** * The database we use @@ -569,7 +568,7 @@ public final class DatabaseUtil { * @param iter Original iterator. * @param database Database */ - public RelationObjectIterator(Iterator<DBID> iter, Relation<? extends O> database) { + public RelationObjectIterator(DBIDIter iter, Relation<? extends O> database) { super(); this.iter = iter; this.database = database; @@ -588,18 +587,19 @@ public final class DatabaseUtil { @Override public boolean hasNext() { - return iter.hasNext(); + return iter.valid(); } @Override public O next() { - DBID id = iter.next(); - return database.get(id); + O ret = database.get(iter); + iter.advance(); + return ret; } @Override public void remove() { - iter.remove(); + throw new UnsupportedOperationException(); } } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/InspectionUtil.java b/src/de/lmu/ifi/dbs/elki/utilities/InspectionUtil.java index 66ecde64..f7bccc1a 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/InspectionUtil.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/InspectionUtil.java @@ -41,7 +41,6 @@ import java.util.jar.JarFile; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter; import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; @@ -253,7 +252,7 @@ public class InspectionUtil { * * @apiviz.exclude */ - static class JarClassIterator implements IterableIterator<String> { + static class JarClassIterator implements Iterator<String> { private Enumeration<JarEntry> jarentries; private String ne; @@ -321,11 +320,6 @@ public class InspectionUtil { public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<String> iterator() { - return this; - } } /** @@ -335,7 +329,7 @@ public class InspectionUtil { * * @apiviz.exclude */ - static class DirClassIterator implements IterableIterator<String> { + static class DirClassIterator implements Iterator<String> { private static final String CLASS_EXT = ".class"; private static final String FACTORY_FILE_EXT = ClassParameter.FACTORY_POSTFIX + CLASS_EXT; @@ -427,11 +421,6 @@ public class InspectionUtil { public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<String> iterator() { - return this; - } } /** diff --git a/src/de/lmu/ifi/dbs/elki/utilities/Util.java b/src/de/lmu/ifi/dbs/elki/utilities/Util.java index 6f79c1fa..5faf69cc 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/Util.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/Util.java @@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.utilities; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import gnu.trove.map.hash.TIntFloatHashMap; +import gnu.trove.map.hash.TIntDoubleHashMap; import java.io.PrintStream; import java.util.ArrayList; @@ -35,7 +35,7 @@ import java.util.Random; import java.util.StringTokenizer; import de.lmu.ifi.dbs.elki.data.DoubleVector; -import de.lmu.ifi.dbs.elki.data.SparseFloatVector; +import de.lmu.ifi.dbs.elki.data.SparseNumberVector; import de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike.ArrayLikeUtil; /** @@ -174,14 +174,14 @@ public final class Util { * an attribute as selected which is out of range for the given * SparseFloatVector. */ - public static SparseFloatVector project(SparseFloatVector v, BitSet selectedAttributes) { - TIntFloatHashMap values = new TIntFloatHashMap(selectedAttributes.cardinality(), 1); + public static <V extends SparseNumberVector<V, ?>> V project(V v, BitSet selectedAttributes) { + TIntDoubleHashMap values = new TIntDoubleHashMap(selectedAttributes.cardinality(), 1); for(int d = selectedAttributes.nextSetBit(0); d >= 0; d = selectedAttributes.nextSetBit(d + 1)) { - if(v.getValue(d + 1) != 0.0f) { - values.put(d, v.getValue(d + 1)); + if(v.doubleValue(d + 1) != 0.0) { + values.put(d, v.doubleValue(d + 1)); } } - SparseFloatVector projectedVector = new SparseFloatVector(values, selectedAttributes.cardinality()); + V projectedVector = v.newNumberVector(values, selectedAttributes.cardinality()); return projectedVector; } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java index 4498cf07..a191dde2 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java @@ -3,6 +3,9 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures; import java.util.Comparator; import java.util.List; +import de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs; +import de.lmu.ifi.dbs.elki.database.ids.DBID; + /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures @@ -35,6 +38,10 @@ import java.util.List; * Charles Antony Richard Hoare * * @author Erich Schubert + * + * @apiviz.uses ArrayModifiableDBIDs + * @apiviz.uses List + * @apiviz.uses Comparator */ public class QuickSelect { /** @@ -777,4 +784,175 @@ public class QuickSelect { } } } + + /** + * QuickSelect is essentially quicksort, except that we only "sort" that half + * of the array that we are interested in. + * + * Note: the array is <b>modified</b> by this. + * + * @param data Data to process + * @param comparator Comparator to use + * @param rank Rank position that we are interested in (integer!) + * @return Value at the given rank + */ + public static DBID quickSelect(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, int rank) { + quickSelect(data, comparator, 0, data.size(), rank); + return data.get(rank); + } + + /** + * Compute the median of an array efficiently using the QuickSelect method. + * + * Note: the array is <b>modified</b> by this. + * + * @param data Data to process + * @param comparator Comparator to use + * @return Median value + */ + public static DBID median(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator) { + return median(data, comparator, 0, data.size()); + } + + /** + * Compute the median of an array efficiently using the QuickSelect method. + * + * On an odd length, it will return the lower element. + * + * Note: the array is <b>modified</b> by this. + * + * @param data Data to process + * @param comparator Comparator to use + * @param begin Begin of valid values + * @param end End of valid values (exclusive!) + * @return Median value + */ + public static DBID median(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, int begin, int end) { + final int length = end - begin; + assert (length > 0); + // Integer division is "floor" since we are non-negative. + final int left = begin + (length - 1) / 2; + quickSelect(data, comparator, begin, end, left); + return data.get(left); + } + + /** + * Compute the median of an array efficiently using the QuickSelect method. + * + * Note: the array is <b>modified</b> by this. + * + * @param data Data to process + * @param comparator Comparator to use + * @param quant Quantile to compute + * @return Value at quantile + */ + public static DBID quantile(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, double quant) { + return quantile(data, comparator, 0, data.size(), quant); + } + + /** + * Compute the median of an array efficiently using the QuickSelect method. + * + * It will prefer the lower element. + * + * Note: the array is <b>modified</b> by this. + * + * @param data Data to process + * @param comparator Comparator to use + * @param begin Begin of valid values + * @param end End of valid values (inclusive!) + * @param quant Quantile to compute + * @return Value at quantile + */ + public static DBID quantile(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, int begin, int end, double quant) { + final int length = end - begin; + assert (length > 0) : "Quantile on empty set?"; + // Integer division is "floor" since we are non-negative. + final double dleft = begin + (length - 1) * quant; + final int ileft = (int) Math.floor(dleft); + + quickSelect(data, comparator, begin, end, ileft); + return data.get(ileft); + } + + /** + * QuickSelect is essentially quicksort, except that we only "sort" that half + * of the array that we are interested in. + * + * @param data Data to process + * @param comparator Comparator to use + * @param start Interval start + * @param end Interval end (inclusive) + * @param rank rank position we are interested in (starting at 0) + */ + public static void quickSelect(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, int start, int end, int rank) { + // Optimization for small arrays + // This also ensures a minimum size below + if(start + SMALL > end) { + insertionSort(data, comparator, start, end); + return; + } + + // Pick pivot from three candidates: start, middle, end + // Since we compare them, we can also just "bubble sort" them. + final int middle = (start + end) / 2; + if(comparator.compare(data.get(start), data.get(middle)) > 0) { + data.swap(start, middle); + } + if(comparator.compare(data.get(start), data.get(end - 1)) > 0) { + data.swap(start, end - 1); + } + if(comparator.compare(data.get(middle), data.get(end - 1)) > 0) { + data.swap(middle, end - 1); + } + // TODO: use more candidates for larger arrays? + + final DBID pivot = data.get(middle); + // Move middle element out of the way, just before end + // (Since we already know that "end" is bigger) + data.swap(middle, end - 2); + + // Begin partitioning + int i = start + 1, j = end - 3; + // This is classic quicksort stuff + while(true) { + while(comparator.compare(data.get(i), pivot) <= 0 && i <= j) { + i++; + } + while(comparator.compare(data.get(j), pivot) >= 0 && j >= i) { + j--; + } + if(i >= j) { + break; + } + data.swap(i, j); + } + + // Move pivot (former middle element) back into the appropriate place + data.swap(i, end - 2); + + // In contrast to quicksort, we only need to recurse into the half we are + // interested in. + if(rank < i) { + quickSelect(data, comparator, start, i, rank); + } + else if(rank > i) { + quickSelect(data, comparator, i + 1, end, rank); + } + } + + /** + * Sort a small array using repetitive insertion sort. + * + * @param data Data to sort + * @param start Interval start + * @param end Interval end + */ + private static void insertionSort(ArrayModifiableDBIDs data, Comparator<? super DBID> comparator, int start, int end) { + for(int i = start + 1; i < end; i++) { + for(int j = i; j > start && comparator.compare(data.get(j - 1), data.get(j)) > 0; j--) { + data.swap(j, j - 1); + } + } + } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java index 6e6e8122..5b1b92b5 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java @@ -30,6 +30,8 @@ import de.lmu.ifi.dbs.elki.database.ids.DBID; * Use a DBID array in a generic array-like context. * * @author Erich Schubert + * + * @apiviz.uses ArrayDBIDs */ public class ArrayDBIDsAdapter implements ArrayAdapter<DBID, ArrayDBIDs> { /** diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java index 2d29f40c..f485e214 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java @@ -34,6 +34,9 @@ import de.lmu.ifi.dbs.elki.data.NumberVector; * reorganizing the objects into a real array. * * @author Erich Schubert + * + * @apiviz.landmark + * @apiviz.composedOf ArrayAdapter */ public final class ArrayLikeUtil { /** diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java index 37875ab7..792fad0b 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java @@ -1,28 +1,6 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike; import java.util.List; -/* - 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 <http://www.gnu.org/licenses/>. - */ /** * Static adapter class to use a {@link java.util.List} in an array API. diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java new file mode 100644 index 00000000..6719b60e --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java @@ -0,0 +1,95 @@ +package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike; +/* + 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 <http://www.gnu.org/licenses/>. + */ + +/** + * Subset array adapter (allows reordering and projection) + * + * @author Erich Schubert + * + * @param <T> Entry type + * @param <A> Array type + */ +public class SubsetNumberArrayAdapter<T extends Number, A> implements NumberArrayAdapter<T, A> { + /** + * Wrapped adapter + */ + NumberArrayAdapter<T, ? super A> wrapped; + + /** + * Offsets to return + */ + int[] offs; + + /** + * Constructor. + * + * @param wrapped Wrapped adapter + * @param offs Offsets + */ + public SubsetNumberArrayAdapter(NumberArrayAdapter<T, ? super A> wrapped, int[] offs) { + super(); + this.wrapped = wrapped; + this.offs = offs; + } + + @Override + public int size(A array) { + return offs.length; + } + + @Override + public T get(A array, int off) throws IndexOutOfBoundsException { + return wrapped.get(array, offs[off]); + } + + @Override + public double getDouble(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getDouble(array, offs[off]); + } + + @Override + public float getFloat(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getFloat(array, offs[off]); + } + + @Override + public int getInteger(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getInteger(array, offs[off]); + } + + @Override + public short getShort(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getShort(array, offs[off]); + } + + @Override + public long getLong(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getLong(array, offs[off]); + } + + @Override + public byte getByte(A array, int off) throws IndexOutOfBoundsException { + return wrapped.getByte(array, offs[off]); + } +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNHeap.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNHeap.java index a1706c84..6c59123b 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNHeap.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNHeap.java @@ -27,7 +27,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -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.query.DistanceResultPair; import de.lmu.ifi.dbs.elki.database.query.GenericDistanceResultPair; import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; @@ -130,9 +130,9 @@ public class KNNHeap<D extends Distance<D>> extends TiedTopBoundedHeap<DistanceR * @param id ID number * @return success code */ - public boolean add(D distance, DBID id) { + public boolean add(D distance, DBIDRef id) { if(size() < maxsize || peek().getDistance().compareTo(distance) >= 0) { - return super.add(new GenericDistanceResultPair<D>(distance, id)); + return super.add(new GenericDistanceResultPair<D>(distance, id.getDBID())); } return true; /* "success" */ } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNList.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNList.java index b19612f2..3e6ecc9d 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNList.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNList.java @@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.heap; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import java.util.AbstractCollection; +import java.util.AbstractList; import java.util.Iterator; import java.util.List; import java.util.Queue; @@ -41,7 +41,7 @@ import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; * * @param <D> Distance type */ -public class KNNList<D extends Distance<D>> extends AbstractCollection<DistanceResultPair<D>> implements KNNResult<D> { +public class KNNList<D extends Distance<D>> extends AbstractList<DistanceResultPair<D>> implements KNNResult<D> { /** * The value of k this was materialized for. */ @@ -96,47 +96,26 @@ public class KNNList<D extends Distance<D>> extends AbstractCollection<DistanceR assert (heap.size() == 0); } - /** - * Get the K parameter. - * - * @return K - */ + @Override public int getK() { return k; } - /** - * Get the distance to the k nearest neighbor, or maxdist otherwise. - * - * @return Maximum distance - */ @Override public D getKNNDistance() { return get(getK() - 1).getDistance(); } - /** - * View as ArrayDBIDs - * - * @return Static DBIDs - */ @Override public ArrayDBIDs asDBIDs() { return KNNUtil.asDBIDs(this); } - /** - * View as list of distances - * - * @return List of distances view - */ @Override public List<D> asDistanceList() { return KNNUtil.asDistanceList(this); } - /* Make the list unmodifiable! */ - @Override public String toString() { StringBuffer buf = new StringBuffer(); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java index 745d82cc..05858981 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java @@ -223,6 +223,7 @@ public class UpdatableHeap<O> extends Heap<O> { * @param pos insertion position * @param elem Element to insert */ + @Override @SuppressWarnings("unchecked") protected void heapifyUpComparable(int pos, Object elem) { final Comparable<Object> cur = (Comparable<Object>) elem; // queue[pos]; @@ -247,6 +248,7 @@ public class UpdatableHeap<O> extends Heap<O> { * @param pos insertion position * @param cur Element to insert */ + @Override protected void heapifyUpComparator(int pos, Object cur) { while(pos > 0) { final int parent = (pos - 1) >>> 1; diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchical.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchical.java index 697ac640..29909069 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchical.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchical.java @@ -23,10 +23,9 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy; along with this program. If not, see <http://www.gnu.org/licenses/>. */ +import java.util.Iterator; import java.util.List; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; - /** * Interface for objects with an <b>internal</b> hierarchy interface. @@ -65,7 +64,7 @@ public interface Hierarchical<O> { * * @return iterator for descendants */ - public IterableIterator<O> iterDescendants(); + public Iterator<O> iterDescendants(); /** * Get number of parents @@ -87,5 +86,5 @@ public interface Hierarchical<O> { * * @return iterator for ancestors */ - public IterableIterator<O> iterAncestors(); + public Iterator<O> iterAncestors(); }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java index 3a3c4d45..0a16e9b7 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java @@ -23,10 +23,9 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy; along with this program. If not, see <http://www.gnu.org/licenses/>. */ +import java.util.Iterator; import java.util.List; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; - /** * This interface represents an (external) hierarchy of objects. It can contain * arbitrary objects, BUT the hierarchy has to be accessed using the hierarchy @@ -63,7 +62,7 @@ public interface Hierarchy<O> { * @param self object to get descendants for * @return iterator for descendants */ - public IterableIterator<O> iterDescendants(O self); + public Iterator<O> iterDescendants(O self); /** * Get number of (direct) parents @@ -88,5 +87,5 @@ public interface Hierarchy<O> { * @param self object to get ancestors for * @return iterator for ancestors */ - public IterableIterator<O> iterAncestors(O self); + public Iterator<O> iterAncestors(O self); }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyHashmapList.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyHashmapList.java index d09e6d94..76bee0f9 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyHashmapList.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyHashmapList.java @@ -31,7 +31,6 @@ import java.util.List; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.utilities.iterator.EmptyIterator; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; /** * Centralized hierarchy implementation, using a HashMap of Lists. @@ -149,7 +148,7 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { } @Override - public IterableIterator<O> iterDescendants(O obj) { + public Iterator<O> iterDescendants(O obj) { return new ItrDesc(obj); } @@ -172,7 +171,7 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { } @Override - public IterableIterator<O> iterAncestors(O obj) { + public Iterator<O> iterAncestors(O obj) { return new ItrAnc(obj); } @@ -183,7 +182,7 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { * * @apiviz.exclude */ - private class ItrDesc implements IterableIterator<O> { + private class ItrDesc implements Iterator<O> { /** * Starting object (for cloning); */ @@ -235,11 +234,6 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<O> iterator() { - return new ItrDesc(start); - } } /** @@ -249,7 +243,7 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { * * @apiviz.exclude */ - private class ItrAnc implements IterableIterator<O> { + private class ItrAnc implements Iterator<O> { /** * Starting object (for cloning); */ @@ -301,10 +295,5 @@ public class HierarchyHashmapList<O> implements ModifiableHierarchy<O> { public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<O> iterator() { - return new ItrAnc(start); - } } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyReferenceLists.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyReferenceLists.java index f6c527ab..76091298 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyReferenceLists.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyReferenceLists.java @@ -27,7 +27,6 @@ import java.util.Iterator; import java.util.List; import de.lmu.ifi.dbs.elki.utilities.iterator.EmptyIterator; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; /** * Hierarchy implementation with a per-object representation. @@ -88,7 +87,7 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera } @Override - public IterableIterator<O> iterDescendants(O self) { + public Iterator<O> iterDescendants(O self) { if(owner != self) { return EmptyIterator.STATIC(); } @@ -121,7 +120,7 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera } @Override - public IterableIterator<O> iterAncestors(O self) { + public Iterator<O> iterAncestors(O self) { if(owner != self) { throw new UnsupportedOperationException("Decentral hierarchy queried for wrong object!"); } @@ -138,7 +137,7 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera * * @apiviz.exclude */ - private class ItrDesc implements IterableIterator<O> { + private class ItrDesc implements Iterator<O> { /** * Iterator over children */ @@ -179,11 +178,6 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<O> iterator() { - return new ItrDesc(owner); - } } /** @@ -193,7 +187,7 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera * * @apiviz.exclude */ - private class ItrAnc implements IterableIterator<O> { + private class ItrAnc implements Iterator<O> { /** * Iterator over parents */ @@ -234,10 +228,5 @@ public class HierarchyReferenceLists<O extends Hierarchical<O>> implements Hiera public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<O> iterator() { - return new ItrAnc(owner); - } } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/EmptyIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/EmptyIterator.java index 98a3539e..7ec63d62 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/EmptyIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/iterator/EmptyIterator.java @@ -25,15 +25,14 @@ package de.lmu.ifi.dbs.elki.utilities.iterator; import java.util.Iterator; - /** - * Empty iterator, that never returns any data. + * Empty iterator/iterable, that never returns any data. * * @author Erich Schubert * * @param <T> Data type */ -public final class EmptyIterator<T> implements IterableIterator<T>, Iterator<T>, Iterable<T> { +public final class EmptyIterator<T> implements Iterator<T>, Iterable<T> { @Override public boolean hasNext() { return false; @@ -50,7 +49,7 @@ public final class EmptyIterator<T> implements IterableIterator<T>, Iterator<T>, } @Override - public IterableIterator<T> iterator() { + public Iterator<T> iterator() { return STATIC(); } @@ -66,7 +65,7 @@ public final class EmptyIterator<T> implements IterableIterator<T>, Iterator<T>, * @return Cast static instance. */ @SuppressWarnings("unchecked") - public static <T> IterableIterator<T> STATIC() { - return (IterableIterator<T>) STATIC_INSTANCE; + public static <T> EmptyIterator<T> STATIC() { + return (EmptyIterator<T>) STATIC_INSTANCE; } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/Iter.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/Iter.java new file mode 100644 index 00000000..11fead71 --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/utilities/iterator/Iter.java @@ -0,0 +1,71 @@ +package de.lmu.ifi.dbs.elki.utilities.iterator; + +/* + 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 <http://www.gnu.org/licenses/>. + */ + +/** + * Iterator interface for more than one return value. + * + * The Java standard {@link java.util.Iterator} interface has some drawbacks: + * <ul> + * <li>the only way to get the current value is to advance the iterator</li> + * <li>the iterator can only point to a single value</li> + * <li>the iterator can only return objects, not primitives</li> + * </ul> + * + * This iterator interface is a bit more flexible. For example on a distance + * list, we can have a single type of iterator that allows access to the + * distance, the object ID or the combination of both. + * + * In some situations, this can save the creation of many small objects, which + * put load on the garbage collector. This super interface does not have a "get" + * operation, which is to come from specialized interfaces instead. + * + * Usage example: + * + * <pre> + * {@code + * for (Iter iter = ids.iter(); iter.valid(); iter.advance()) { + * iter.doSomething(); + * } + * } + * </pre> + * + * @author Erich Schubert + */ +public interface Iter { + /** + * Returns true if the iterator currently points to a valid object. + * + * @return a <code>boolean</code> value + */ + public boolean valid(); + + /** + * Moves the iterator forward to the next entry. + * + * @throws java.util.NoSuchElementException if the iterator is already + * exhausted + */ + public void advance(); +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIterator.java deleted file mode 100644 index d416faa6..00000000 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIterator.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.lmu.ifi.dbs.elki.utilities.iterator; - -/* - 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 <http://www.gnu.org/licenses/>. - */ - -import java.util.Iterator; - -/** - * Interface that is both Iterable and an Iterator. - * - * Calling {@code iterator()} repeatedly MAY return the same iterator, - * e.g. the IterableIterator itself. In fact, this is the expected behavior, - * since this is just meant to allow the use of this Iterator in a {@code foreach} statement. - * - * @author Erich Schubert - * - * @apiviz.landmark - * - * @param <T> Data type - */ -public interface IterableIterator<T> extends Iterable<T>, Iterator<T> { - // no extra conditions -} diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIteratorAdapter.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIteratorAdapter.java deleted file mode 100644 index 4a8cb512..00000000 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIteratorAdapter.java +++ /dev/null @@ -1,110 +0,0 @@ -package de.lmu.ifi.dbs.elki.utilities.iterator; - -/* - 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 <http://www.gnu.org/licenses/>. - */ - -import java.util.Iterator; - -/** - * This interface can convert an {@link Iterable} to an {@link Iterator} or the - * other way round. Note that {@link Iterator} to {@link Iterable} is for - * single-shot use only. This allows for using an Iterator in for: - * - * <blockquote><pre>{@code - * for (Type var : new IterableIterator<Type>(iterator)) { - * // ... - * } - * }</pre></blockquote> - * - * @apiviz.stereotype decorator - * @apiviz.uses Iterable - * @apiviz.uses Iterator - * - * @author Erich Schubert - * @param <T> object type - */ -public final class IterableIteratorAdapter<T> implements IterableIterator<T> { - /** - * Parent Iterable - */ - Iterable<T> parent = null; - - /** - * Parent Iterator - */ - Iterator<T> iter = null; - - /** - * Constructor from an Iterable (preferred). - * - * @param parent Iterable parent - */ - public IterableIteratorAdapter(Iterable<T> parent) { - this.parent = parent; - assert (parent != null); - } - - /** - * Constructor from an Iterator. - * - * If possible, wrap an Iterable object. - * - * @param iter Iterator - */ - public IterableIteratorAdapter(Iterator<T> iter) { - this.iter = iter; - assert (iter != null); - } - - @Override - public Iterator<T> iterator() { - if(parent == null) { - return this; - } - return parent.iterator(); - } - - @Override - public boolean hasNext() { - if(iter == null) { - iter = parent.iterator(); - } - return iter.hasNext(); - } - - @Override - public T next() { - if(iter == null) { - iter = parent.iterator(); - } - return iter.next(); - } - - @Override - public void remove() { - if(iter == null) { - iter = parent.iterator(); - } - iter.remove(); - } -}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableUtil.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableUtil.java deleted file mode 100644 index 8e4afd80..00000000 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.lmu.ifi.dbs.elki.utilities.iterator; - -/* - 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 <http://www.gnu.org/licenses/>. - */ - -import java.util.Iterator; - -/** - * Utility function to wrap an Iterator as iterable. - * - * @author Erich Schubert - */ -public final class IterableUtil { - /** - * Wrap an iterator as Iterable. - * - * @param <C> Type restriction - * @param iter Iterator - * @return Iterable wrapper - */ - public static <C> IterableIterator<C> fromIterator(Iterator<C> iter) { - return new IterableIteratorAdapter<C>(iter); - } - - /** - * Wrap an Iterable as IterableIterator - * - * @param <C> Type restriction - * @param iter Iterator - * @return Iterable wrapper - */ - public static <C> IterableIterator<C> fromIterable(Iterable<C> iter) { - return new IterableIteratorAdapter<C>(iter); - } -} diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/MergedIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/MergedIterator.java index 9208ab14..b5d2fd02 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/MergedIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/iterator/MergedIterator.java @@ -37,7 +37,7 @@ import java.util.Iterator; * * @param <E> Entry type */ -public class MergedIterator<E> implements IterableIterator<E> { +public class MergedIterator<E> implements Iterator<E> { /** * All the iterators we process */ @@ -112,9 +112,4 @@ public class MergedIterator<E> implements IterableIterator<E> { } last.remove(); } - - @Override - public Iterator<E> iterator() { - return this; - } -} +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/OneItemIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/OneItemIterator.java index a81dcc18..f6b00242 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/OneItemIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/iterator/OneItemIterator.java @@ -34,7 +34,7 @@ import java.util.Iterator; * * @param <T> Object type to return */ -public class OneItemIterator<T> implements IterableIterator<T> { +public class OneItemIterator<T> implements Iterator<T> { /** * Object to return. */ @@ -66,9 +66,4 @@ public class OneItemIterator<T> implements IterableIterator<T> { public void remove() { throw new UnsupportedOperationException(); } - - @Override - public Iterator<T> iterator() { - return this; - } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/iterator/TypeFilterIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/iterator/TypeFilterIterator.java index cd687542..5aa908c8 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/iterator/TypeFilterIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/iterator/TypeFilterIterator.java @@ -33,7 +33,7 @@ import java.util.Iterator; * @param <IN> Input datatype * @param <OUT> Output datatype */ -public class TypeFilterIterator<IN, OUT extends IN> extends AbstractFilteredIterator<IN, OUT> implements IterableIterator<OUT> { +public class TypeFilterIterator<IN, OUT extends IN> extends AbstractFilteredIterator<IN, OUT> implements Iterator<OUT> { /** * Class restriction */ @@ -83,9 +83,4 @@ public class TypeFilterIterator<IN, OUT extends IN> extends AbstractFilteredIter return null; } } - - @Override - public Iterator<OUT> iterator() { - return this; - } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java b/src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java index 0d685e2b..bea6bb4f 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java @@ -105,6 +105,14 @@ public final class OptionID extends ConstantObject<OptionID> { public static final OptionID VERBOSE_FLAG = new OptionID("verbose", "Enable verbose messages."); /** + * Flag to allow verbose messages while running the application. + * <p> + * Key: {@code -time} + * </p> + */ + public static final OptionID TIME_FLAG = new OptionID("time", "Enable logging of runtime data. Do not combine with more verbose logging, since verbose logging can significantly impact performance."); + + /** * The description of the OptionID. */ private String description; diff --git a/src/de/lmu/ifi/dbs/elki/utilities/package-info.java b/src/de/lmu/ifi/dbs/elki/utilities/package-info.java index a1bbc579..6a8126e1 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/package-info.java @@ -35,7 +35,6 @@ * </ul></li> * <li>Specialized:<ul> * <li>{@link de.lmu.ifi.dbs.elki.data.images.ImageUtil}: image handling.</li> - * <li>{@link de.lmu.ifi.dbs.elki.utilities.iterator.IterableUtil}: Converting iterators and iterables.</li> * <li>{@link de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionUtil}: Managing parameter settings</li> * <li>{@link de.lmu.ifi.dbs.elki.utilities.InspectionUtil}: class and classpath inspection.</li> * <li>{@link de.lmu.ifi.dbs.elki.utilities.documentation.DocumentationUtil}: documentation extraction from annotations.</li> diff --git a/src/de/lmu/ifi/dbs/elki/utilities/pairs/CTriple.java b/src/de/lmu/ifi/dbs/elki/utilities/pairs/CTriple.java index 5a4b8cbd..225fb0b9 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/pairs/CTriple.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/pairs/CTriple.java @@ -34,7 +34,7 @@ import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; * @param <SECOND> second type * @param <THIRD> second type */ -public final class CTriple<FIRST extends Comparable<FIRST>, SECOND extends Comparable<SECOND>, THIRD extends Comparable<THIRD>> extends Triple<FIRST, SECOND, THIRD> implements Comparable<CTriple<FIRST, SECOND, THIRD>> { +public final class CTriple<FIRST extends Comparable<? super FIRST>, SECOND extends Comparable<? super SECOND>, THIRD extends Comparable<? super THIRD>> extends Triple<FIRST, SECOND, THIRD> implements Comparable<CTriple<FIRST, SECOND, THIRD>> { /** * Constructor with fields * diff --git a/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/RandomSampleReferencePoints.java b/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/RandomSampleReferencePoints.java index 48125019..8f6df4db 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/RandomSampleReferencePoints.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/RandomSampleReferencePoints.java @@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; import de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs; 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.DBIDUtil; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; @@ -84,7 +85,8 @@ public class RandomSampleReferencePoints<V extends NumberVector<? extends V, ?>> LoggingUtil.warning("Sample size is larger than database size!"); ArrayList<V> selection = new ArrayList<V>(db.size()); - for(DBID id : db.iterDBIDs()) { + for(DBIDIter iditer = db.iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); selection.add(db.get(id)); } return selection; diff --git a/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/StarBasedReferencePoints.java b/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/StarBasedReferencePoints.java index 819fc29e..47c7298b 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/StarBasedReferencePoints.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/referencepoints/StarBasedReferencePoints.java @@ -28,6 +28,7 @@ import java.util.Collection; import de.lmu.ifi.dbs.elki.data.NumberVector; 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.relation.Relation; import de.lmu.ifi.dbs.elki.utilities.DatabaseUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -100,7 +101,8 @@ public class StarBasedReferencePoints<V extends NumberVector<V, ?>> implements R min[d] = Double.MAX_VALUE; max[d] = -Double.MAX_VALUE; } - for(DBID objID : database.iterDBIDs()) { + for(DBIDIter iditer = database.iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID objID = iditer.getDBID(); V obj = database.get(objID); for(int d = 0; d < dim; d++) { double val = obj.doubleValue(d + 1); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java index e7e6ee90..8a152cff 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -61,7 +62,8 @@ public class HeDESNormalizationOutlierScaling implements OutlierScalingFunction MeanVariance mv = new MeanVariance(); DoubleMinMax minmax = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java index 1485204c..860c77d6 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.GammaDistribution; @@ -67,7 +68,8 @@ public class MinusLogGammaScaling extends OutlierGammaScaling { meta = or.getOutlierMeta(); // Determine Minimum and Maximum. DoubleMinMax mm = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double score = or.getScores().get(id); if(!Double.isNaN(score) && !Double.isInfinite(score)) { mm.put(score); @@ -77,7 +79,8 @@ public class MinusLogGammaScaling extends OutlierGammaScaling { mlogmax = -Math.log(mm.getMin() / max); // with the prescaling, do Gamma Scaling. MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double score = or.getScores().get(id); score = preScale(score); if(!Double.isNaN(score) && !Double.isInfinite(score)) { diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java index 477fbdd2..4bc10feb 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.NormalDistribution; @@ -67,7 +68,8 @@ public class MinusLogStandardDeviationScaling extends StandardDeviationScaling { public void prepare(OutlierResult or) { if(fixedmean == null) { MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = -Math.log(or.getScores().get(id)); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); @@ -80,7 +82,8 @@ public class MinusLogStandardDeviationScaling extends StandardDeviationScaling { mean = fixedmean; double sqsum = 0; int cnt = 0; - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = -Math.log(or.getScores().get(id)); if(!Double.isNaN(val) && !Double.isInfinite(val)) { sqsum += (val - mean) * (val - mean); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java index 26abb453..52a7f449 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java @@ -25,6 +25,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; 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.DBIDUtil; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.math.MathUtil; @@ -120,7 +121,8 @@ public class MixtureModelOutlierScalingFunction implements OutlierScalingFunctio public void prepare(OutlierResult or) { // Initial parameters - are these defaults sounds? MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java index 9602b9b6..1ebf24bb 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; @@ -78,7 +79,8 @@ public class MultiplicativeInverseScaling implements OutlierScalingFunction { */ private static double getScaleValue(OutlierResult or) { double max = Double.MIN_VALUE; - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); double inv = Math.abs(1.0 / val); if(!Double.isInfinite(inv) && !Double.isNaN(inv)) { diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java index a3eecdb0..9facaa11 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.GammaDistribution; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -100,7 +101,8 @@ public class OutlierGammaScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { meta = or.getOutlierMeta(); MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double score = or.getScores().get(id); score = preScale(score); if(!Double.isNaN(score) && !Double.isInfinite(score)) { diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java index 8f215ec3..e7222b96 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java @@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import java.util.ArrayList; import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; @@ -39,7 +40,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; /** - * Scaling that can map arbitrary values to a probability in the range of [0:1]. + * Scaling that can map arbitrary values to a value in the range of [0:1]. * * Transformation is done by linear mapping onto 0:1 using the minimum and * maximum values. @@ -53,10 +54,10 @@ public class OutlierLinearScaling implements OutlierScalingFunction { * Key: {@code -linearscale.min} * </p> */ - public static final OptionID MIN_ID = OptionID.getOrCreateOptionID("linearscale.min", "Fixed minimum to use in lienar scaling."); + public static final OptionID MIN_ID = OptionID.getOrCreateOptionID("linearscale.min", "Fixed minimum to use in linear scaling."); /** - * Parameter to specify the maximum value + * Parameter to specify the maximum value. * <p> * Key: {@code -linearscale.max} * </p> @@ -147,7 +148,8 @@ public class OutlierLinearScaling implements OutlierScalingFunction { MeanVariance mv = new MeanVariance(); DoubleMinMax mm = (max == null) ? new DoubleMinMax() : null; boolean skippedzeros = false; - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(nozeros && val == 0.0) { skippedzeros = true; @@ -173,7 +175,8 @@ public class OutlierLinearScaling implements OutlierScalingFunction { if(min == null || max == null) { boolean skippedzeros = false; DoubleMinMax mm = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(nozeros && val == 0.0) { skippedzeros = true; diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java index 0839f231..09d84eb4 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.documentation.Reference; @@ -77,7 +78,8 @@ public class OutlierMinusLogScaling implements OutlierScalingFunction { @Override public void prepare(OutlierResult or) { DoubleMinMax mm = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java index d39fed97..3f564fd1 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -97,7 +98,8 @@ public class OutlierSqrtScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(min == null || max == null) { DoubleMinMax mm = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java index 47eda6aa..be7bf766 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java @@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; import java.util.Arrays; import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.result.outlier.InvertedOutlierScoreMeta; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; @@ -56,7 +57,8 @@ public class RankingPseudoOutlierScaling implements OutlierScalingFunction { if(or.getOutlierMeta() instanceof InvertedOutlierScoreMeta) { inverted = true; } - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); scores[pos] = or.getScores().get(id); pos++; } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java index 31e78ec8..468079a3 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java @@ -27,6 +27,7 @@ import java.util.BitSet; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; 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.DBIDUtil; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.logging.Logging; @@ -61,7 +62,8 @@ public class SigmoidOutlierScalingFunction implements OutlierScalingFunction { public void prepare(OutlierResult or) { // Initial parameters - are these defaults sounds? MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); mv.put(val); } diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java index 24f9e855..d3048b1d 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.math.MeanVariance; @@ -126,7 +127,8 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(min == null) { DoubleMinMax mm = new DoubleMinMax(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mm.put(val); @@ -136,7 +138,8 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { } if(mean == null) { MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); val = (val <= min) ? 0 : Math.sqrt(val - min); mv.put(val); @@ -147,7 +150,8 @@ public class SqrtStandardDeviationScaling implements OutlierScalingFunction { else { double sqsum = 0; int cnt = 0; - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); val = (val <= min) ? 0 : Math.sqrt(val - min); sqsum += (val - mean) * (val - mean); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java index 6ef5c006..7d76a69f 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; */ import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.math.MathUtil; import de.lmu.ifi.dbs.elki.math.MeanVariance; import de.lmu.ifi.dbs.elki.math.statistics.distribution.NormalDistribution; @@ -115,7 +116,8 @@ public class StandardDeviationScaling implements OutlierScalingFunction { public void prepare(OutlierResult or) { if(fixedmean == null) { MeanVariance mv = new MeanVariance(); - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { mv.put(val); @@ -131,7 +133,8 @@ public class StandardDeviationScaling implements OutlierScalingFunction { mean = fixedmean; double sqsum = 0; int cnt = 0; - for(DBID id : or.getScores().iterDBIDs()) { + for(DBIDIter iditer = or.getScores().iterDBIDs(); iditer.valid(); iditer.advance()) { + DBID id = iditer.getDBID(); double val = or.getScores().get(id); if(!Double.isNaN(val) && !Double.isInfinite(val)) { sqsum += (val - mean) * (val - mean); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java index 8044fce9..c922ab34 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java @@ -23,10 +23,9 @@ package de.lmu.ifi.dbs.elki.utilities.scaling.outlier; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterConstraint; @@ -98,14 +97,9 @@ public class TopKOutlierScaling implements OutlierScalingFunction { if(k <= 0) { LoggingUtil.warning("No k configured for Top-k outlier scaling!"); } - IterableIterator<DBID> order = or.getOrdering().iter(or.getOrdering().getDBIDs()); - for(int i = 0; i < k; i++) { - // stop if no more results. - if(!order.hasNext()) { - return; - } - DBID cur = order.next(); - cutoff = or.getScores().get(cur); + DBIDIter order = or.getOrdering().iter(or.getOrdering().getDBIDs()).iter(); + for(int i = 0; i < k && order.valid(); i++, order.advance()) { + cutoff = or.getScores().get(order.getDBID()); } max = or.getOutlierMeta().getActualMaximum(); ground = or.getOutlierMeta().getTheoreticalBaseline(); diff --git a/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeIterator.java index e0602790..a5b7cfa6 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeIterator.java @@ -28,15 +28,13 @@ import java.util.Iterator; import org.w3c.dom.Node; import de.lmu.ifi.dbs.elki.utilities.exceptions.ExceptionMessages; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; /** * Simple adapter class to iterate over a DOM tree nodes children. * * @author Erich Schubert - * */ -public final class XMLNodeIterator implements IterableIterator<Node> { +public final class XMLNodeIterator implements Iterator<Node> { /** * Store the next node */ @@ -77,12 +75,4 @@ public final class XMLNodeIterator implements IterableIterator<Node> { public void remove() { throw new UnsupportedOperationException(this.getClass().getSimpleName()+": "+ExceptionMessages.UNSUPPORTED_REMOVE); } - - /** - * Iterator interface adapter - clone. - */ - @Override - public Iterator<Node> iterator() { - return new XMLNodeIterator(this.next); - } -} +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeListIterator.java b/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeListIterator.java index 8157d4ba..b413d1df 100644 --- a/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeListIterator.java +++ b/src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeListIterator.java @@ -29,15 +29,13 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import de.lmu.ifi.dbs.elki.utilities.exceptions.ExceptionMessages; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; /** * Simple adapter class to iterate over a DOM tree nodes children. * * @author Erich Schubert - * */ -public final class XMLNodeListIterator implements IterableIterator<Node> { +public final class XMLNodeListIterator implements Iterator<Node> { /** * Store the next node */ @@ -84,12 +82,4 @@ public final class XMLNodeListIterator implements IterableIterator<Node> { public void remove() { throw new UnsupportedOperationException(this.getClass().getSimpleName()+": "+ExceptionMessages.UNSUPPORTED_REMOVE); } - - /** - * Iterable interface adapter - clone. - */ - @Override - public Iterator<Node> iterator() { - return new XMLNodeListIterator(this.nodelist); - } -} +}
\ No newline at end of file |