summaryrefslogtreecommitdiff
path: root/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures
diff options
context:
space:
mode:
Diffstat (limited to 'elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures')
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArray.java51
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ExtendedArray.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FeatureVectorAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FlatMatrixAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FloatArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IdentityArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IntegerArray.java264
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberListArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberVectorAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SingleSubsetArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/VectorAdapter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/DoubleIntegerArrayQuickSort.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerArrayQuickSort.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerComparator.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoublePriorityObject.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/Heap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMaxHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMinHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerPriorityObject.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ObjectHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedUpdatableHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedUpdatableHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/FilteredIter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HashMapHierarchy.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/ModifiableHierarchy.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/StackedIter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleArrayStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/Histogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntArrayStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongArrayStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/MeanVarianceStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ObjHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortDynamicHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortStaticHistogram.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayIter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayListIter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/Iter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/MIter.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFind.java3
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFindUtil.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionInteger.java174
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionRangeDBIDs.java1
-rw-r--r--elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionStaticDBIDs.java1
93 files changed, 574 insertions, 7 deletions
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java
index 070876ca..1d852688 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/QuickSelect.java
@@ -41,6 +41,7 @@ import de.lmu.ifi.dbs.elki.database.ids.ModifiableDoubleDBIDList;
* Charles Antony Richard Hoare
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.uses ArrayModifiableDBIDs
* @apiviz.uses List
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayAdapter.java
index 5a2a1056..fd8624de 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayAdapter.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Adapter for array-like things. For example, arrays and lists.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Item type
* @param <A> Array object type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java
index a6881e43..640d5c70 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayDBIDsAdapter.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBID;
* Use a DBID array in a generic array-like context.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.uses ArrayDBIDs
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java
index dc4f3b1c..386243f6 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ArrayLikeUtil.java
@@ -35,6 +35,7 @@ import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector;
* reorganizing the objects into a real array.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.landmark
* @apiviz.composedOf ArrayAdapter
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArray.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArray.java
index 2f827bb3..ca225b41 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArray.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArray.java
@@ -27,12 +27,28 @@ import java.util.Arrays;
/**
* Array of double values.
*
- * TODO: add remove, sort etc.
- *
* @author Erich Schubert
+ * @since 0.7.0
*/
public class DoubleArray implements NumberArrayAdapter<Double, DoubleArray> {
/**
+ * Maximum array size permitted by Java.
+ *
+ * This is JVM dependent, but 2^31 - 5 is the usual OpenJDK8 value.
+ */
+ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 5;
+
+ /**
+ * Last value where we can grow by 50%.
+ */
+ private static final int LAST_GROW_SIZE = 0x5555_5551;
+
+ // Assert that these values match.
+ static {
+ assert (LAST_GROW_SIZE + (LAST_GROW_SIZE >>> 1) + 1 <= MAX_ARRAY_SIZE);
+ }
+
+ /**
* (Reused) store for numerical attributes.
*/
public double[] data;
@@ -55,6 +71,12 @@ public class DoubleArray implements NumberArrayAdapter<Double, DoubleArray> {
* @param initialsize Initial size.
*/
public DoubleArray(int initialsize) {
+ if(initialsize < 0) {
+ initialsize = 11;
+ }
+ else if(initialsize > MAX_ARRAY_SIZE) {
+ initialsize = MAX_ARRAY_SIZE;
+ }
this.data = new double[initialsize];
this.size = 0;
}
@@ -80,18 +102,31 @@ public class DoubleArray implements NumberArrayAdapter<Double, DoubleArray> {
}
/**
- * Add a numeric attribute value.
+ * Append a value.
*
* @param attribute Attribute value.
*/
public void add(double attribute) {
if(data.length == size) {
- data = Arrays.copyOf(data, size << 1);
+ grow();
}
data[size++] = attribute;
}
/**
+ * Grow the current array.
+ *
+ * @throws OutOfMemoryError
+ */
+ private void grow() throws OutOfMemoryError {
+ if(data.length == MAX_ARRAY_SIZE) {
+ throw new OutOfMemoryError("Array size has reached the Java maximum.");
+ }
+ final int newsize = (size >= LAST_GROW_SIZE) ? MAX_ARRAY_SIZE : (size + (size >> 1) + 1);
+ data = Arrays.copyOf(data, newsize);
+ }
+
+ /**
* Get the value at this position.
*
* @param pos Position
@@ -144,8 +179,12 @@ public class DoubleArray implements NumberArrayAdapter<Double, DoubleArray> {
*/
public void insert(int pos, double val) {
if(size == data.length) {
- double[] oldd = data;
- data = new double[size << 1];
+ if(data.length == MAX_ARRAY_SIZE) {
+ throw new OutOfMemoryError("Array size has reached the Java maximum.");
+ }
+ final int newsize = (size >= LAST_GROW_SIZE) ? MAX_ARRAY_SIZE : (size + (size >> 1) + 1);
+ final double[] oldd = data;
+ data = new double[newsize];
System.arraycopy(oldd, 0, data, 0, pos);
System.arraycopy(oldd, pos, data, pos + 1, size - pos);
}
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArrayAdapter.java
index 719aea8a..221335e9 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/DoubleArrayAdapter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Use a double array as, well, double array in the ArrayAdapter API.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.exclude
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ExtendedArray.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ExtendedArray.java
index 4dfd1ecb..047e5f06 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ExtendedArray.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ExtendedArray.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Class to extend an array with a single element virtually.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @param <T> Object type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FeatureVectorAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FeatureVectorAdapter.java
index 59df30ad..338358f1 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FeatureVectorAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FeatureVectorAdapter.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.data.FeatureVector;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <F> Feature type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FlatMatrixAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FlatMatrixAdapter.java
index 487f2d84..1c33872d 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FlatMatrixAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FlatMatrixAdapter.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.math.linearalgebra.Matrix;
* Use a matrix as array, by flattening it into a sequence.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.exclude
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FloatArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FloatArrayAdapter.java
index fd82178a..6f4bfa78 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FloatArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/FloatArrayAdapter.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Use a double array as, well, double array in the ArrayAdapter API.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.exclude
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IdentityArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IdentityArrayAdapter.java
index 3766492d..d81d68f3 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IdentityArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IdentityArrayAdapter.java
@@ -29,6 +29,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Item type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IntegerArray.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IntegerArray.java
new file mode 100644
index 00000000..15393114
--- /dev/null
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/IntegerArray.java
@@ -0,0 +1,264 @@
+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) 2015
+ 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.Arrays;
+
+/**
+ * Array of int values.
+ *
+ * @author Erich Schubert
+ * @since 0.7.0
+ */
+public class IntegerArray implements NumberArrayAdapter<Integer, IntegerArray> {
+ /**
+ * Maximum array size permitted by Java.
+ *
+ * This is JVM dependent, but 2^31 - 5 is the usual OpenJDK8 value.
+ */
+ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 5;
+
+ /**
+ * Last value where we can grow by 50%.
+ */
+ private static final int LAST_GROW_SIZE = 0x5555_5551;
+
+ // Assert that these values match.
+ static {
+ assert (LAST_GROW_SIZE + (LAST_GROW_SIZE >>> 1) + 1 <= MAX_ARRAY_SIZE);
+ }
+
+ /**
+ * (Reused) store for numerical attributes.
+ */
+ public int[] data;
+
+ /**
+ * Number of numerical attributes.
+ */
+ public int size;
+
+ /**
+ * Constructor.
+ */
+ public IntegerArray() {
+ this(11);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param initialsize Initial size.
+ */
+ public IntegerArray(int initialsize) {
+ if(initialsize < 0) {
+ initialsize = 11;
+ }
+ else if(initialsize > MAX_ARRAY_SIZE) {
+ initialsize = MAX_ARRAY_SIZE;
+ }
+ this.data = new int[initialsize];
+ this.size = 0;
+ }
+
+ /**
+ * Constructor from an existing array.
+ *
+ * The new array will be allocated as small as possible, so modifications will
+ * cause a resize!
+ *
+ * @param existing Existing array
+ */
+ public IntegerArray(IntegerArray existing) {
+ this.data = Arrays.copyOf(existing.data, existing.size);
+ this.size = existing.size;
+ }
+
+ /**
+ * Reset the numeric attribute counter.
+ */
+ public void clear() {
+ size = 0;
+ }
+
+ /**
+ * Append a value.
+ *
+ * @param attribute Attribute value.
+ */
+ public void add(int attribute) {
+ if(data.length == size) {
+ grow();
+ }
+ data[size++] = attribute;
+ }
+
+ /**
+ * Grow the current array.
+ *
+ * @throws OutOfMemoryError
+ */
+ private void grow() throws OutOfMemoryError {
+ if(data.length == MAX_ARRAY_SIZE) {
+ throw new OutOfMemoryError("Array size has reached the Java maximum.");
+ }
+ final int newsize = (size >= LAST_GROW_SIZE) ? MAX_ARRAY_SIZE : (size + (size >> 1) + 1);
+ data = Arrays.copyOf(data, newsize);
+ }
+
+ /**
+ * Get the value at this position.
+ *
+ * @param pos Position
+ * @return Value
+ */
+ public int get(int pos) {
+ if(pos < 0 || pos >= size) {
+ throw new ArrayIndexOutOfBoundsException(pos);
+ }
+ return data[pos];
+ }
+
+ /**
+ * Set the value at this position.
+ *
+ * @param pos Position
+ * @param value Value
+ */
+ public void set(int pos, int value) {
+ if(pos < 0 || pos > size) {
+ throw new ArrayIndexOutOfBoundsException(pos);
+ }
+ if(pos == size) {
+ add(value);
+ return;
+ }
+ data[pos] = value;
+ }
+
+ /**
+ * Remove a range from the array.
+ *
+ * @param start Start
+ * @param len Length
+ */
+ public void remove(int start, int len) {
+ final int end = start + len;
+ if(end > size) {
+ throw new ArrayIndexOutOfBoundsException(size);
+ }
+ System.arraycopy(data, end, data, start, size - end);
+ size -= len;
+ }
+
+ /**
+ * Insert a value at the given position.
+ *
+ * @param pos Insert position
+ * @param val Value to insert
+ */
+ public void insert(int pos, int val) {
+ if(size == data.length) {
+ if(data.length == MAX_ARRAY_SIZE) {
+ throw new OutOfMemoryError("Array size has reached the Java maximum.");
+ }
+ final int newsize = (size >= LAST_GROW_SIZE) ? MAX_ARRAY_SIZE : (size + (size >> 1) + 1);
+ final int[] oldd = data;
+ data = new int[newsize];
+ System.arraycopy(oldd, 0, data, 0, pos);
+ System.arraycopy(oldd, pos, data, pos + 1, size - pos);
+ }
+ else {
+ System.arraycopy(data, pos, data, pos + 1, size - pos);
+ }
+ data[pos] = val;
+ size++;
+ }
+
+ /**
+ * Get the size of the array.
+ *
+ * @return Size
+ */
+ public int size() {
+ return size;
+ }
+
+ /**
+ * Sort the contents.
+ */
+ public void sort() {
+ Arrays.sort(data, 0, size);
+ }
+
+ // NumberArrayAdapter:
+
+ @Override
+ public int size(IntegerArray array) {
+ return array.size;
+ }
+
+ @Override
+ public Integer get(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return array.data[off];
+ }
+
+ @Override
+ public double getDouble(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return (double) array.data[off];
+ }
+
+ @Override
+ public float getFloat(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return (float) array.data[off];
+ }
+
+ @Override
+ public int getInteger(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return array.data[off];
+ }
+
+ @Override
+ public short getShort(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return (short) array.data[off];
+ }
+
+ @Override
+ public long getLong(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return (long) array.data[off];
+ }
+
+ @Override
+ public byte getByte(IntegerArray array, int off) throws IndexOutOfBoundsException {
+ return (byte) array.data[off];
+ }
+
+ /**
+ * Return a copy of the contents as array.
+ *
+ * @return Copy of the contents.
+ */
+ public int[] toArray() {
+ return Arrays.copyOf(data, size);
+ }
+} \ No newline at end of file
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java
index 242caa48..7e92978a 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/ListArrayAdapter.java
@@ -30,6 +30,7 @@ import java.util.List;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Data object type.
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberArrayAdapter.java
index 532862cc..c0777fbd 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberArrayAdapter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Adapter for arrays of numbers, to avoid boxing.
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @param <N> Number type
* @param <A> Array type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberListArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberListArrayAdapter.java
index e712ac9a..4c0fec71 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberListArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberListArrayAdapter.java
@@ -32,6 +32,7 @@ import java.util.List;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @param <T> Data object type.
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberVectorAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberVectorAdapter.java
index 8192f3b8..bb66c33e 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberVectorAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/NumberVectorAdapter.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.data.NumberVector;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.5.0
*/
public class NumberVectorAdapter implements NumberArrayAdapter<Number, NumberVector> {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SingleSubsetArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SingleSubsetArrayAdapter.java
index 3d8e8c3e..cd905948 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SingleSubsetArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SingleSubsetArrayAdapter.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Single-item subset adapter
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Entry type
* @param <A> Array type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetArrayAdapter.java
index 077a0e8d..1299d178 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetArrayAdapter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Subset array adapter (allows reordering and projection).
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Entry type
* @param <A> Array type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java
index 8a1a064b..7d1d1890 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/SubsetNumberArrayAdapter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arraylike;
* Subset array adapter (allows reordering and projection)
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <T> Entry type
* @param <A> Array type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/VectorAdapter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/VectorAdapter.java
index 26da061a..48705ece 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/VectorAdapter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arraylike/VectorAdapter.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.linearalgebra.Vector;
* Use the static instance from {@link ArrayLikeUtil}!
*
* @author Erich Schubert
+ * @since 0.5.0
*/
public class VectorAdapter implements NumberArrayAdapter<Double, Vector> {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/DoubleIntegerArrayQuickSort.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/DoubleIntegerArrayQuickSort.java
index a48a175b..47bc1281 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/DoubleIntegerArrayQuickSort.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/DoubleIntegerArrayQuickSort.java
@@ -28,6 +28,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arrays;
* best of 5 heuristic.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class DoubleIntegerArrayQuickSort {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerArrayQuickSort.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerArrayQuickSort.java
index ece63ea6..c1b64097 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerArrayQuickSort.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerArrayQuickSort.java
@@ -39,6 +39,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
* objects.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.uses IntegerComparator
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerComparator.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerComparator.java
index 11f79e45..2cb8e755 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerComparator.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/arrays/IntegerComparator.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.arrays;
* Interface for comparing two Integer.
*
* @author Erich Schubert
+ * @since 0.4.0
*/
public interface IntegerComparator {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java
index 5e991156..294d7220 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java
@@ -33,6 +33,7 @@ import java.util.Arrays;
* allows retrieving existing values.
*
* @author Erich Schubert
+ * @since 0.7.0
*
* @param <E>
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMaxHeap.java
index 968251d6..54f6821b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
* @param <K> Key type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMinHeap.java
index 8cd4ef0a..4a1cc8a9 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparableMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
* @param <K> Key type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMaxHeap.java
index f3cc6d56..78c00bc5 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
* @param <K> Key type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMinHeap.java
index 12a15d46..466c3e7b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ComparatorMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
* @param <K> Key type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleHeap.java
index ba853032..76927fc3 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap for double values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerHeap.java
index 2adc17fd..96ca70c2 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap interface, for double keys and int values.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMaxHeap.java
index b0e62c30..ae40da63 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMinHeap.java
index d94b63c1..bfc21240 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleIntegerMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongHeap.java
index 551c4131..f4011bcd 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap interface, for double keys and long values.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMaxHeap.java
index b0f0af50..88a7ee7c 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMinHeap.java
index fcc3526d..7fc2a5dd 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleLongMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMaxHeap.java
index d1a6ed0f..92a1ba9c 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMinHeap.java
index f4c53260..3c8eda0b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectHeap.java
index 77a380bf..a822cb64 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap interface, for double keys and V values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMaxHeap.java
index 96b03a67..6e8e5c02 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMinHeap.java
index c04fb7cb..b87e6281 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoubleObjectMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoublePriorityObject.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoublePriorityObject.java
index 342c064d..cd8ef1cb 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoublePriorityObject.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/DoublePriorityObject.java
@@ -31,6 +31,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.heap;
* the priority.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <O> Stored object type.
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/Heap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/Heap.java
index 5f6b27c2..fe8aaa53 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/Heap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/Heap.java
@@ -36,6 +36,7 @@ import java.util.Comparator;
* O(n log n). This is implemented via a simple validTo counter.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <E> Element type. Should be {@link java.lang.Comparable} or a
* {@link java.util.Comparator} needs to be given.
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerHeap.java
index c7e897d8..4a1a7ca7 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap for int values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMaxHeap.java
index a4e54147..54af796b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMinHeap.java
index 0e56e2e1..17ece116 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has UnsortedIter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectHeap.java
index defacf83..08eecf02 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap interface, for int keys and V values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMaxHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMaxHeap.java
index ce3d7809..7f62c277 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMaxHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMaxHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMinHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMinHeap.java
index c087d7d2..b46dadaa 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMinHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerObjectMinHeap.java
@@ -31,6 +31,7 @@ import de.lmu.ifi.dbs.elki.math.MathUtil;
* Binary heap for primitive types.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @apiviz.has UnsortedIter
* @param <V> Value type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerPriorityObject.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerPriorityObject.java
index c809e113..4e7c21c2 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerPriorityObject.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/IntegerPriorityObject.java
@@ -31,6 +31,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.heap;
* the priority.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <O> Stored object type.
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ObjectHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ObjectHeap.java
index 8b00dbbe..20ee0547 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ObjectHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/ObjectHeap.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.Iter;
* Basic in-memory heap for K values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has UnsortedIter
* @param <K> Key type
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedHeap.java
index f9628f1a..ea1a356a 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedHeap.java
@@ -33,6 +33,7 @@ import java.util.List;
* elements.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <E> Object type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedUpdatableHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedUpdatableHeap.java
index 88036e00..83261ef5 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedUpdatableHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TiedTopBoundedUpdatableHeap.java
@@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException;
* elements.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <E> Object type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedHeap.java
index 9fd95a1b..b884c58a 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedHeap.java
@@ -30,6 +30,7 @@ import java.util.Comparator;
* {@code k} Elements only.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <E> Element type. Should be {@link Comparable} or a {@link Comparator}
* needs to be given.
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedUpdatableHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedUpdatableHeap.java
index 80b5768a..ff0dd369 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedUpdatableHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/TopBoundedUpdatableHeap.java
@@ -30,6 +30,7 @@ import java.util.Comparator;
* {@code k} Elements only.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <E> Element type. Should be {@link Comparable} or a {@link Comparator}
* needs to be given.
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java
index be089725..4af70021 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/heap/UpdatableHeap.java
@@ -32,6 +32,7 @@ import java.util.Comparator;
* A heap as used in OPTICS that allows updating entries.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <O> object type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/FilteredIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/FilteredIter.java
index 67876387..aac710e8 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/FilteredIter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/FilteredIter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy;
* Filtered iterator.
*
* @author Erich Schubert
+ * @since 0.7.0
*
* @apiviz.composedOf Hierarchy.Iter
*
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HashMapHierarchy.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HashMapHierarchy.java
index 59ec00f0..2f478866 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HashMapHierarchy.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/HashMapHierarchy.java
@@ -29,6 +29,7 @@ import java.util.HashMap;
* Centralized hierarchy implementation, using a HashMap of Lists.
*
* @author Erich Schubert
+ * @since 0.6.0
*
* @param <O> Object type (arbitrary!)
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java
index 6c932451..04d1cd5b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/Hierarchy.java
@@ -29,6 +29,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy;
* object, i.e. {@code hierarchy.iterChildren(object);}.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.has Iter
*
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/ModifiableHierarchy.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/ModifiableHierarchy.java
index 3496e41c..4b3af7c2 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/ModifiableHierarchy.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/ModifiableHierarchy.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy;
* Modifiable Hierarchy.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @param <O> Object type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/StackedIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/StackedIter.java
index 52ecc0e3..93aa71b7 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/StackedIter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/hierarchy/StackedIter.java
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy;
* Filtered iterator.
*
* @author Erich Schubert
+ * @since 0.7.0
*
* @apiviz.composedOf Hierarchy
* @apiviz.composedOf Hierarchy.Iter
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjDynamicHistogram.java
index 9c2f3a60..d07e078b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @param <T> Data type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjStaticHistogram.java
index 709f7ceb..743bb179 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractObjStaticHistogram.java
@@ -30,6 +30,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @param <T> Data type
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractStaticHistogram.java
index b0728ddb..a1a81174 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/AbstractStaticHistogram.java
@@ -31,6 +31,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* adapted for multiple use cases.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public abstract class AbstractStaticHistogram implements Histogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleArrayStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleArrayStaticHistogram.java
index 7ea5b623..4e0081d5 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleArrayStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleArrayStaticHistogram.java
@@ -29,6 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* primitive in Java.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public final class DoubleArrayStaticHistogram extends AbstractObjStaticHistogram<double[]> {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleDynamicHistogram.java
index 2f2e6a02..88a70ad9 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* bins to the data fed into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class DoubleDynamicHistogram extends DoubleStaticHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleHistogram.java
index 9a26c264..84f06713 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Histogram storing double values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleStaticHistogram.java
index 63ba3e21..6d4dc22b 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/DoubleStaticHistogram.java
@@ -32,6 +32,7 @@ import java.util.Arrays;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class DoubleStaticHistogram extends AbstractStaticHistogram implements DoubleHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatDynamicHistogram.java
index 261c7a7f..007ef6e6 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* bins to the data fed into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class FloatDynamicHistogram extends FloatStaticHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatHistogram.java
index 81edb88c..18e992b8 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Histogram storing float values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatStaticHistogram.java
index 6e4d78f5..079e8e0e 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/FloatStaticHistogram.java
@@ -32,6 +32,7 @@ import java.util.Arrays;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class FloatStaticHistogram extends AbstractStaticHistogram implements FloatHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/Histogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/Histogram.java
index a8fd60c0..1632fc45 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/Histogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/Histogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.datastructures.iterator.ArrayIter;
* to be shared for primitive types, too!
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntArrayStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntArrayStaticHistogram.java
index d3d278ee..8e838b4e 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntArrayStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntArrayStaticHistogram.java
@@ -29,6 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* primitive in Java.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public final class IntArrayStaticHistogram extends AbstractObjStaticHistogram<int[]> {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntDynamicHistogram.java
index 4d3a5045..13ab7b35 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* bins to the data fed into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class IntDynamicHistogram extends IntStaticHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntHistogram.java
index d448c852..ce2b39aa 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Histogram storing int values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
index bd367837..3cbe83bc 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/IntStaticHistogram.java
@@ -32,6 +32,7 @@ import java.util.Arrays;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class IntStaticHistogram extends AbstractStaticHistogram implements IntHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongArrayStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongArrayStaticHistogram.java
index 907fa7ca..a922935a 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongArrayStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongArrayStaticHistogram.java
@@ -29,6 +29,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* primitive in Java.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public final class LongArrayStaticHistogram extends AbstractObjStaticHistogram<long[]> {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongDynamicHistogram.java
index 78385a30..cc5b5dc6 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* bins to the data fed into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class LongDynamicHistogram extends LongStaticHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongHistogram.java
index ec1ba994..893e0f47 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Histogram storing long values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongStaticHistogram.java
index ae37dbcc..9cc201ae 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/LongStaticHistogram.java
@@ -32,6 +32,7 @@ import java.util.Arrays;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class LongStaticHistogram extends AbstractStaticHistogram implements LongHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/MeanVarianceStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/MeanVarianceStaticHistogram.java
index f3d054cd..5adcc9bd 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/MeanVarianceStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/MeanVarianceStaticHistogram.java
@@ -32,6 +32,7 @@ import de.lmu.ifi.dbs.elki.math.MeanVariance;
* left and right.
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.composedOf MeanVariance
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ObjHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ObjHistogram.java
index e1d75b76..2ce2926f 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ObjHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ObjHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Basic interface for object based histograms (static and flexible).
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortDynamicHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortDynamicHistogram.java
index 8fd1ffbd..d0a932a1 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortDynamicHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortDynamicHistogram.java
@@ -30,6 +30,7 @@ import de.lmu.ifi.dbs.elki.utilities.BitsUtil;
* bins to the data fed into the histogram.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class ShortDynamicHistogram extends ShortStaticHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortHistogram.java
index 706d43e8..14e1ec55 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortHistogram.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.histogram;
* Histogram storing short values.
*
* @author Erich Schubert
+ * @since 0.5.5
*
* @apiviz.has Iter
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortStaticHistogram.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortStaticHistogram.java
index 4c49f595..ebfc6365 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortStaticHistogram.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/histogram/ShortStaticHistogram.java
@@ -32,6 +32,7 @@ import java.util.Arrays;
* left and right.
*
* @author Erich Schubert
+ * @since 0.5.5
*/
public class ShortStaticHistogram extends AbstractStaticHistogram implements ShortHistogram {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayIter.java
index d3deb054..3f26f417 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayIter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayIter.java
@@ -27,6 +27,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.iterator;
* Array iterators can also go backwards and seek.
*
* @author Erich Schubert
+ * @since 0.2
*
* @apiviz.excludeSubtypes
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayListIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayListIter.java
index 175ccfb2..441eaee4 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayListIter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/ArrayListIter.java
@@ -32,6 +32,7 @@ import java.util.List;
* access and seeking (i.e. ArrayLists, but not Linked Lists!)
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.excludeSubtypes
*
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/Iter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/Iter.java
index d362ff37..23cf34fe 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/Iter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/Iter.java
@@ -52,6 +52,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.iterator;
* </pre>
*
* @author Erich Schubert
+ * @since 0.5.0
*
* @apiviz.landmark
* @apiviz.excludeSubtypes
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/MIter.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/MIter.java
index b7b69cc7..557870de 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/MIter.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/iterator/MIter.java
@@ -40,6 +40,7 @@ package de.lmu.ifi.dbs.elki.utilities.datastructures.iterator;
* </pre>
*
* @author Erich Schubert
+ * @since 0.4.0
*
* @apiviz.excludeSubtypes
*/
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFind.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFind.java
index bbba1c8e..55b0b561 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFind.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFind.java
@@ -27,9 +27,10 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDRef;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
/**
- * Union-find implementations in ELKI
+ * Union-find implementations in ELKI, for DBID objects.
*
* @author Erich Schubert
+ * @since 0.7.0
*/
public interface UnionFind {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFindUtil.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFindUtil.java
index ee403a66..38ec2559 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFindUtil.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/UnionFindUtil.java
@@ -29,6 +29,7 @@ import de.lmu.ifi.dbs.elki.database.ids.StaticDBIDs;
* Union-find algorithm factory, to choose the best implementation.
*
* @author Erich Schubert
+ * @since 0.7.0
*/
public class UnionFindUtil {
/**
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionInteger.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionInteger.java
new file mode 100644
index 00000000..b7fc8478
--- /dev/null
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionInteger.java
@@ -0,0 +1,174 @@
+package de.lmu.ifi.dbs.elki.utilities.datastructures.unionfind;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2016
+ 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.Arrays;
+
+import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
+import gnu.trove.list.TIntList;
+import gnu.trove.list.array.TIntArrayList;
+
+/**
+ * Union-find algorithm for primitive integers, with optimizations.
+ *
+ * This is the weighted quick union approach, weighted by count and using
+ * path-halving for optimization.
+ *
+ * Reference:
+ * <p>
+ * R. Sedgewick<br />
+ * 1.3 Union-Find Algorithms<br />
+ * Algorithms in C, Parts 1-4
+ * </p>
+ *
+ * @author Erich Schubert
+ * @since 0.7.0
+ */
+@Reference(authors = "R. Sedgewick", //
+title = "1.3 Union-Find Algorithms", //
+booktitle = "Algorithms in C, Parts 1-4")
+public class WeightedQuickUnionInteger {
+ /**
+ * Number of used indexes.
+ */
+ private int used;
+
+ /**
+ * Parent element
+ */
+ private int[] parent;
+
+ /**
+ * Weight, for optimization.
+ */
+ private int[] weight;
+
+ /**
+ * Initial size.
+ */
+ private static final int INITIAL_SIZE = 51;
+
+ /**
+ * Constructor.
+ */
+ public WeightedQuickUnionInteger() {
+ weight = new int[INITIAL_SIZE];
+ parent = new int[INITIAL_SIZE];
+ }
+
+ /**
+ * Occupy the next unused index.
+ *
+ * @param weight Initial weight.
+ * @return Next unused index.
+ */
+ public int nextIndex(int weight) {
+ if(used == parent.length) {
+ int nsize = used + (used >> 1);
+ this.weight = Arrays.copyOf(this.weight, nsize);
+ this.parent = Arrays.copyOf(this.parent, nsize);
+ }
+ this.weight[used] = weight;
+ this.parent[used] = used;
+ return used++;
+ }
+
+ /**
+ * Find the parent of an object.
+ *
+ * @param cur Current entry
+ * @return Parent entry
+ */
+ public int find(int cur) {
+ assert (cur >= 0 && cur < parent.length);
+ int p = parent[cur], tmp;
+ while(cur != p) {
+ tmp = p;
+ p = parent[cur] = parent[p]; // Perform simple path compression.
+ cur = tmp;
+ }
+ return cur;
+ }
+
+ /**
+ * Join the components of elements p and q.
+ *
+ * @param first First element
+ * @param second Second element
+ * @return Component id.
+ */
+ public int union(int first, int second) {
+ int firstComponent = find(first), secondComponent = find(second);
+ if(firstComponent == secondComponent) {
+ return firstComponent;
+ }
+ final int w1 = weight[firstComponent], w2 = weight[secondComponent];
+ if(w1 > w2) {
+ parent[secondComponent] = firstComponent;
+ weight[firstComponent] += w2;
+ return firstComponent;
+ }
+ else {
+ parent[firstComponent] = secondComponent;
+ weight[secondComponent] += w1;
+ return secondComponent;
+ }
+ }
+
+ /**
+ * Test if two components are connected.
+ *
+ * @param first First element
+ * @param second Second element
+ * @return {@code true} if they are in the same component.
+ */
+ public boolean isConnected(int first, int second) {
+ return find(first) == find(second);
+ }
+
+ /**
+ * Collect all component root elements.
+ *
+ * @return Root elements
+ */
+ public TIntList getRoots() {
+ TIntList roots = new TIntArrayList();
+ for(int i = 0; i < used; i++) {
+ // roots or one element in component
+ if(parent[i] == i) {
+ roots.add(i);
+ }
+ }
+ return roots;
+ }
+
+ /**
+ * Number of allocated indexes.
+ *
+ * @return Index number.
+ */
+ public int size() {
+ return used;
+ }
+}
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionRangeDBIDs.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionRangeDBIDs.java
index 60c719e2..5440e2b5 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionRangeDBIDs.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionRangeDBIDs.java
@@ -51,6 +51,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
*
* @author Evgeniy Faerman
* @author Erich Schubert
+ * @since 0.7.0
*/
@Reference(authors = "R. Sedgewick", //
title = "1.3 Union-Find Algorithms", //
diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionStaticDBIDs.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionStaticDBIDs.java
index 0e4dd24b..9ed8d618 100644
--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionStaticDBIDs.java
+++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/utilities/datastructures/unionfind/WeightedQuickUnionStaticDBIDs.java
@@ -60,6 +60,7 @@ import de.lmu.ifi.dbs.elki.utilities.documentation.Reference;
*
* @author Evgeniy Faerman
* @author Erich Schubert
+ * @since 0.7.0
*/
@Reference(authors = "R. Sedgewick", //
title = "1.3 Union-Find Algorithms", //