summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/utilities
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/utilities')
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/Base64.java22
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/DatabaseUtil.java58
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/InspectionUtil.java15
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/Util.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java178
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java22
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java95
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNHeap.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/KNNList.java27
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchical.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyHashmapList.java19
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HierarchyReferenceLists.java19
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/EmptyIterator.java11
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/Iter.java71
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIterator.java43
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableIteratorAdapter.java110
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/IterableUtil.java55
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/MergedIterator.java9
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/OneItemIterator.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/iterator/TypeFilterIterator.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/package-info.java1
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/pairs/CTriple.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/referencepoints/RandomSampleReferencePoints.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/referencepoints/StarBasedReferencePoints.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/HeDESNormalizationOutlierScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogGammaScaling.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MinusLogStandardDeviationScaling.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MixtureModelOutlierScalingFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/MultiplicativeInverseScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierGammaScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierLinearScaling.java13
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierMinusLogScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/OutlierSqrtScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/RankingPseudoOutlierScaling.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SigmoidOutlierScalingFunction.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/SqrtStandardDeviationScaling.java10
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/StandardDeviationScaling.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/scaling/outlier/TopKOutlierScaling.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeIterator.java14
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/xml/XMLNodeListIterator.java14
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