summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Schubert <erich@debian.org>2016-01-07 17:10:34 +0100
committerAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:45 +0000
commitbfe7f5ccc31ffa1f1df74a724d1b04fc8742e1a3 (patch)
treef30c549e6782254c29ed6f7bc73a56364cff6a53
parentef936dd6df45eca7d14f2345dce39257b79e5ee6 (diff)
Import Debian changes 0.7.0-5
elki (0.7.0-5) unstable; urgency=low * Cherry-pick important bug fixes from upstream. * Cherry-pick upstream patch for repeatable documentation generation. * Remove executable bit from .java files.
-rw-r--r--debian/changelog8
-rw-r--r--debian/patches/powi-bugfix.patch125
-rw-r--r--debian/patches/randomsample-bugfix.patch539
-rw-r--r--debian/patches/repeatable-documentation.patch79
-rw-r--r--debian/patches/series3
-rwxr-xr-xdebian/rules5
6 files changed, 759 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index b9334d33..594a6a2e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+elki (0.7.0-5) unstable; urgency=low
+
+ * Cherry-pick important bug fixes from upstream.
+ * Cherry-pick upstream patch for repeatable documentation generation.
+ * Remove executable bit from .java files.
+
+ -- Erich Schubert <erich@debian.org> Thu, 07 Jan 2016 17:10:34 +0100
+
elki (0.7.0-4) unstable; urgency=low
* Always prefer OpenJDK-7 for reproducible builds.
diff --git a/debian/patches/powi-bugfix.patch b/debian/patches/powi-bugfix.patch
new file mode 100644
index 00000000..766a62d5
--- /dev/null
+++ b/debian/patches/powi-bugfix.patch
@@ -0,0 +1,125 @@
+commit f558614879bb9def534bd2e041dc2de0fb4d1a88
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Tue Dec 1 11:16:36 2015 +0100
+
+ Bug fix: MathUtil.powi was also broken. Ouch.
+
+diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
+index deb3ed2..f112a96 100644
+--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
++++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
+@@ -1046,16 +1046,15 @@ public final class MathUtil {
+ return Math.pow(x, p);
+ }
+ double tmp = x, ret = (p & 1) == 1 ? x : 1.;
+- p >>= 1;
+ while(true) {
++ tmp *= tmp;
++ p >>= 1;
+ if(p == 1) {
+ return ret * tmp;
+ }
+ if((p & 1) != 0) {
+ ret *= tmp;
+ }
+- tmp *= tmp;
+- p >>= 1;
+ }
+ }
+
+diff --git a/elki/src/test/java/de/lmu/ifi/dbs/elki/math/TestMathUtil.java b/elki/src/test/java/de/lmu/ifi/dbs/elki/math/TestMathUtil.java
+index 9f180ef..e085537 100644
+--- a/elki/src/test/java/de/lmu/ifi/dbs/elki/math/TestMathUtil.java
++++ b/elki/src/test/java/de/lmu/ifi/dbs/elki/math/TestMathUtil.java
+@@ -34,7 +34,7 @@ import de.lmu.ifi.dbs.elki.JUnit4Test;
+
+ /**
+ * Unit test for some basic math functions.
+- *
++ *
+ * @author Erich Schubert
+ */
+ public class TestMathUtil implements JUnit4Test {
+@@ -48,7 +48,7 @@ public class TestMathUtil implements JUnit4Test {
+ double[] weight2 = new double[size];
+
+ Random r = new Random(seed);
+- for (int i = 0; i < size; i++) {
++ for(int i = 0; i < size; i++) {
+ data1[i] = r.nextDouble();
+ data2[i] = r.nextDouble();
+ weight1[i] = 1.0;
+@@ -88,7 +88,7 @@ public class TestMathUtil implements JUnit4Test {
+ @Test
+ public void testFloatToDouble() {
+ Random r = new Random(1l);
+- for (int i = 0; i < 10000; i++) {
++ for(int i = 0; i < 10000; i++) {
+ final double dbl = Double.longBitsToDouble(r.nextLong());
+ final float flt = (float) dbl;
+ final double uppd = MathUtil.floatToDoubleUpper(flt);
+@@ -101,4 +101,12 @@ public class TestMathUtil implements JUnit4Test {
+ assertTrue("Expected value to round to the same float.", flt == lowf || Double.isNaN(flt));
+ }
+ }
++
++ @Test
++ public void testPowi() {
++ assertEquals("Power incorrect", 0.01, MathUtil.powi(0.1, 2), 1e-13);
++ assertEquals("Power incorrect", 0.001, MathUtil.powi(0.1, 3), 1e-13);
++ assertEquals("Power incorrect", 0.0001, MathUtil.powi(0.1, 4), 1e-13);
++ assertEquals("Power incorrect", 0.00001, MathUtil.powi(0.1, 5), 1e-13);
++ }
+ }
+
+commit 783a75300c96354aba1ac4bd953a56f02cac6442
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Tue Dec 1 19:31:07 2015 +0100
+
+ Second part of the same powi bug fix.
+
+diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
+index f112a96..2e8256d 100644
+--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
++++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/math/MathUtil.java
+@@ -1071,16 +1071,15 @@ public final class MathUtil {
+ return (int) Math.pow(x, p);
+ }
+ int tmp = x, ret = (p & 1) == 1 ? x : 1;
+- p >>= 1;
+ while(true) {
++ tmp *= tmp;
++ p >>= 1;
+ if(p == 1) {
+ return ret * tmp;
+ }
+ if((p & 1) != 0) {
+ ret *= tmp;
+ }
+- tmp *= tmp;
+- p >>= 1;
+ }
+ }
+
+
+commit 274aae95147c01d2903c167572358fa18b8f4a52
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Tue Dec 1 11:29:56 2015 +0100
+
+ Update unit test, which was affected by the powi bug.
+
+diff --git a/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/TestVarianceOfVolume.java b/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/TestVarianceOfVolume.java
+index 266e9f3..e66679d 100644
+--- a/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/TestVarianceOfVolume.java
++++ b/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/TestVarianceOfVolume.java
+@@ -54,7 +54,7 @@ public class TestVarianceOfVolume extends AbstractSimpleAlgorithmTest implements
+ // run LOF on database
+ OutlierResult result = lof.run(db);
+
+- testSingleScore(result, 1293, 848349.0186);
+- testAUC(db, "Noise", result, 0.936448179271);
++ testSingleScore(result, 1293, 2.0733100852601836e13);
++ testAUC(db, "Noise", result, 0.9306946778);
+ }
+ }
+\ No newline at end of file
diff --git a/debian/patches/randomsample-bugfix.patch b/debian/patches/randomsample-bugfix.patch
new file mode 100644
index 00000000..03bd2e32
--- /dev/null
+++ b/debian/patches/randomsample-bugfix.patch
@@ -0,0 +1,539 @@
+commit 465b2ec2c925cc3f49b59651f3b6c6bfabf2ac2c
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Tue Dec 1 10:30:05 2015 +0100
+
+ BUG fix: randomSample did not work right (brown paper bag)
+
+diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/database/ids/DBIDUtil.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/database/ids/DBIDUtil.java
+index ae85fa1..fc054f2 100644
+--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/database/ids/DBIDUtil.java
++++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/database/ids/DBIDUtil.java
+@@ -41,11 +41,11 @@ import de.lmu.ifi.dbs.elki.utilities.io.ByteBufferSerializer;
+
+ /**
+ * DBID Utility functions.
+- *
++ *
+ * @author Erich Schubert
+- *
++ *
+ * @apiviz.landmark
+- *
++ *
+ * @apiviz.has DBIDs
+ * @apiviz.has DBIDRef
+ * @apiviz.composedOf DBIDFactory
+@@ -65,7 +65,7 @@ public final class DBIDUtil {
+
+ /**
+ * Get the invalid special ID.
+- *
++ *
+ * @return invalid ID value
+ */
+ public static DBIDRef invalid() {
+@@ -74,9 +74,9 @@ public final class DBIDUtil {
+
+ /**
+ * Import and integer as DBID.
+- *
++ *
+ * Note: this may not be possible for some factories!
+- *
++ *
+ * @param id Integer ID to import
+ * @return DBID
+ */
+@@ -86,9 +86,9 @@ public final class DBIDUtil {
+
+ /**
+ * Export a DBID as int.
+- *
++ *
+ * Note: this may not be possible for some factories!
+- *
++ *
+ * @param id DBID to export
+ * @return integer value
+ */
+@@ -98,7 +98,7 @@ public final class DBIDUtil {
+
+ /**
+ * Compare two DBIDs.
+- *
++ *
+ * @param id1 First ID
+ * @param id2 Second ID
+ * @return Comparison result
+@@ -109,7 +109,7 @@ public final class DBIDUtil {
+
+ /**
+ * Test two DBIDs for equality.
+- *
++ *
+ * @param id1 First ID
+ * @param id2 Second ID
+ * @return Comparison result
+@@ -120,7 +120,7 @@ public final class DBIDUtil {
+
+ /**
+ * Dereference a DBID reference.
+- *
++ *
+ * @param ref DBID reference
+ * @return DBID
+ */
+@@ -133,7 +133,7 @@ public final class DBIDUtil {
+
+ /**
+ * Format a DBID as string.
+- *
++ *
+ * @param id DBID
+ * @return String representation
+ */
+@@ -143,7 +143,7 @@ public final class DBIDUtil {
+
+ /**
+ * Format a DBID as string.
+- *
++ *
+ * @param ids DBIDs
+ * @return String representation
+ */
+@@ -163,7 +163,7 @@ public final class DBIDUtil {
+
+ /**
+ * Get a serializer for DBIDs.
+- *
++ *
+ * @return DBID serializer
+ */
+ public static ByteBufferSerializer<DBID> getDBIDSerializer() {
+@@ -172,7 +172,7 @@ public final class DBIDUtil {
+
+ /**
+ * Get a serializer for DBIDs with static size.
+- *
++ *
+ * @return DBID serializer
+ */
+ public static ByteBufferSerializer<DBID> getDBIDSerializerStatic() {
+@@ -181,7 +181,7 @@ public final class DBIDUtil {
+
+ /**
+ * Generate a single DBID.
+- *
++ *
+ * @return A single DBID
+ */
+ public static DBID generateSingleDBID() {
+@@ -190,7 +190,7 @@ public final class DBIDUtil {
+
+ /**
+ * Return a single DBID for reuse.
+- *
++ *
+ * @param id DBID to deallocate
+ */
+ public static void deallocateSingleDBID(DBID id) {
+@@ -199,7 +199,7 @@ public final class DBIDUtil {
+
+ /**
+ * Generate a static DBID range.
+- *
++ *
+ * @param size Requested size
+ * @return DBID range
+ */
+@@ -209,7 +209,7 @@ public final class DBIDUtil {
+
+ /**
+ * Deallocate a static DBID range.
+- *
++ *
+ * @param range Range to deallocate
+ */
+ public static void deallocateDBIDRange(DBIDRange range) {
+@@ -218,7 +218,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new DBID variable.
+- *
++ *
+ * @param val Initial value.
+ * @return Variable
+ */
+@@ -228,7 +228,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new DBID variable.
+- *
++ *
+ * @return Variable
+ */
+ public static DBIDVar newVar() {
+@@ -237,7 +237,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) array of DBIDs.
+- *
++ *
+ * @return New array
+ */
+ public static ArrayModifiableDBIDs newArray() {
+@@ -246,7 +246,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) hash set of DBIDs.
+- *
++ *
+ * @return New hash set
+ */
+ public static HashSetModifiableDBIDs newHashSet() {
+@@ -255,7 +255,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) array of DBIDs.
+- *
++ *
+ * @param size Size hint
+ * @return New array
+ */
+@@ -265,7 +265,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) hash set of DBIDs.
+- *
++ *
+ * @param size Size hint
+ * @return New hash set
+ */
+@@ -275,7 +275,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) array of DBIDs.
+- *
++ *
+ * @param existing Existing DBIDs
+ * @return New array
+ */
+@@ -285,7 +285,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a new (modifiable) hash set of DBIDs.
+- *
++ *
+ * @param existing Existing DBIDs
+ * @return New hash set
+ */
+@@ -295,7 +295,7 @@ public final class DBIDUtil {
+
+ /**
+ * Compute the set intersection of two sets.
+- *
++ *
+ * @param first First set
+ * @param second Second set
+ * @return result.
+@@ -316,7 +316,7 @@ public final class DBIDUtil {
+
+ /**
+ * Compute the set intersection size of two sets.
+- *
++ *
+ * @param first First set
+ * @param second Second set
+ * @return size
+@@ -345,7 +345,7 @@ public final class DBIDUtil {
+
+ /**
+ * Compute the set intersection size of two sets.
+- *
++ *
+ * @param first First set
+ * @param second Second set
+ * @return size
+@@ -362,7 +362,7 @@ public final class DBIDUtil {
+
+ /**
+ * Compute the set symmetric intersection of two sets.
+- *
++ *
+ * @param first First set
+ * @param second Second set
+ * @param firstonly OUTPUT: elements only in first. MUST BE EMPTY
+@@ -393,7 +393,7 @@ public final class DBIDUtil {
+
+ /**
+ * Returns the union of the two specified collection of IDs.
+- *
++ *
+ * @param ids1 the first collection
+ * @param ids2 the second collection
+ * @return the union of ids1 and ids2 without duplicates
+@@ -407,7 +407,7 @@ public final class DBIDUtil {
+
+ /**
+ * Returns the difference of the two specified collection of IDs.
+- *
++ *
+ * @param ids1 the first collection
+ * @param ids2 the second collection
+ * @return the difference of ids1 minus ids2
+@@ -420,7 +420,7 @@ public final class DBIDUtil {
+
+ /**
+ * Wrap an existing DBIDs collection to be unmodifiable.
+- *
++ *
+ * @param existing Existing collection
+ * @return Unmodifiable collection
+ */
+@@ -442,7 +442,7 @@ public final class DBIDUtil {
+
+ /**
+ * Ensure that the given DBIDs are array-indexable.
+- *
++ *
+ * @param ids IDs
+ * @return Array DBIDs.
+ */
+@@ -457,7 +457,7 @@ public final class DBIDUtil {
+
+ /**
+ * Ensure that the given DBIDs support fast "contains" operations.
+- *
++ *
+ * @param ids IDs
+ * @return Set DBIDs.
+ */
+@@ -472,7 +472,7 @@ public final class DBIDUtil {
+
+ /**
+ * Ensure modifiable.
+- *
++ *
+ * @param ids IDs
+ * @return Modifiable DBIDs.
+ */
+@@ -493,10 +493,10 @@ public final class DBIDUtil {
+
+ /**
+ * Make a DBID pair.
+- *
++ *
+ * @param id1 first ID
+ * @param id2 second ID
+- *
++ *
+ * @return DBID pair
+ */
+ public static DBIDPair newPair(DBIDRef id1, DBIDRef id2) {
+@@ -505,7 +505,7 @@ public final class DBIDUtil {
+
+ /**
+ * Make a DoubleDBIDPair.
+- *
++ *
+ * @param val double value
+ * @param id ID
+ * @return new pair
+@@ -516,9 +516,9 @@ public final class DBIDUtil {
+
+ /**
+ * Create an appropriate heap for the distance type.
+- *
++ *
+ * This will use a double heap if appropriate.
+- *
++ *
+ * @param k K value
+ * @return New heap of size k, appropriate for this distance type.
+ */
+@@ -528,7 +528,7 @@ public final class DBIDUtil {
+
+ /**
+ * Build a new heap from a given list.
+- *
++ *
+ * @param exist Existing result
+ * @return New heap
+ */
+@@ -538,7 +538,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random shuffling of the given DBID array.
+- *
++ *
+ * @param ids Original DBIDs
+ * @param rnd Random generator
+ */
+@@ -548,7 +548,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random shuffling of the given DBID array.
+- *
++ *
+ * @param ids Original DBIDs
+ * @param random Random generator
+ */
+@@ -558,22 +558,24 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random shuffling of the given DBID array.
+- *
+- * Only the first {@code limit} elements will be randomized.
+- *
++ *
++ * Only the first {@code limit} elements will be fully randomized, but the
++ * remaining objects will also be changed.
++ *
+ * @param ids Original DBIDs
+ * @param random Random generator
+ * @param limit Shuffling limit.
+ */
+ public static void randomShuffle(ArrayModifiableDBIDs ids, Random random, final int limit) {
++ final int end = ids.size();
+ for(int i = 1; i < limit; i++) {
+- ids.swap(i - 1, i + random.nextInt(limit - i));
++ ids.swap(i - 1, i + random.nextInt(end - i));
+ }
+ }
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param source Original DBIDs
+ * @param k k Parameter
+ * @param seed Random generator seed
+@@ -585,7 +587,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param source Original DBIDs
+ * @param k k Parameter
+ * @param seed Random generator seed
+@@ -602,7 +604,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param source Original DBIDs
+ * @param k k Parameter
+ * @param rnd Random generator
+@@ -614,7 +616,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param source Original DBIDs
+ * @param k k Parameter
+ * @param random Random generator
+@@ -645,7 +647,7 @@ public final class DBIDUtil {
+ ArrayModifiableDBIDs sample = DBIDUtil.newArray(source);
+ randomShuffle(sample, random, k);
+ // Delete trailing elements
+- for(int i = sample.size() - 1; i > k; i--) {
++ for(int i = sample.size() - 1; i >= k; i--) {
+ sample.remove(i);
+ }
+ return sample;
+@@ -654,7 +656,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param ids Original ids
+ * @param rate Sampling rate
+ * @param random Random generator
+@@ -666,7 +668,7 @@ public final class DBIDUtil {
+
+ /**
+ * Produce a random sample of the given DBIDs.
+- *
++ *
+ * @param ids Original ids
+ * @param rate Sampling rate
+ * @param random Random generator
+@@ -711,7 +713,7 @@ public final class DBIDUtil {
+
+ /**
+ * Randomly split IDs into {@code p} partitions of almost-equal size.
+- *
++ *
+ * @param ids Original DBIDs
+ * @param p Desired number of partitions.
+ * @param rnd Random generator
+@@ -722,7 +724,7 @@ public final class DBIDUtil {
+
+ /**
+ * Randomly split IDs into {@code p} partitions of almost-equal size.
+- *
++ *
+ * @param oids Original DBIDs
+ * @param p Desired number of partitions.
+ * @param random Random generator
+@@ -752,7 +754,7 @@ public final class DBIDUtil {
+
+ /**
+ * Get a subset of the KNN result.
+- *
++ *
+ * @param list Existing list
+ * @param k k
+ * @return Subset
+@@ -769,7 +771,7 @@ public final class DBIDUtil {
+
+ /**
+ * Create a modifiable list to store distance-DBID pairs.
+- *
++ *
+ * @param size Estimated upper list size
+ * @return Empty list
+ */
+@@ -779,7 +781,7 @@ public final class DBIDUtil {
+
+ /**
+ * Create a modifiable list to store distance-DBID pairs.
+- *
++ *
+ * @return Empty list
+ */
+ public static ModifiableDoubleDBIDList newDistanceDBIDList() {
+@@ -788,7 +790,7 @@ public final class DBIDUtil {
+
+ /**
+ * Assert that the presented ids constitute a continuous {@link DBIDRange}.
+- *
++ *
+ * @param ids ID range.
+ * @return DBID range.
+ * @throws AbortException
+commit ebe72d8c1be19f9788fb90d51d5083169ce1b4de
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Wed Dec 2 15:15:21 2015 +0100
+
+ Scores improved again, probably due to the latest fixes.
+
+diff --git a/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/distance/TestReferenceBasedOutlierDetection.java b/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/distance/TestReferenceBasedOutlierDetection.java
+index de0991d..bc5442c 100644
+--- a/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/distance/TestReferenceBasedOutlierDetection.java
++++ b/elki/src/test/java/de/lmu/ifi/dbs/elki/algorithm/outlier/distance/TestReferenceBasedOutlierDetection.java
+@@ -55,7 +55,7 @@ public class TestReferenceBasedOutlierDetection extends AbstractSimpleAlgorithmT
+ // run ReferenceBasedOutlierDetection on database
+ OutlierResult result = referenceBasedOutlierDetection.run(db);
+
+- testAUC(db, "Noise", result, 0.9418148148);
+- testSingleScore(result, 945, 0.87173403699);
++ testAUC(db, "Noise", result, 0.9693703703703);
++ testSingleScore(result, 945, 0.933574455);
+ }
+ }
+\ No newline at end of file
diff --git a/debian/patches/repeatable-documentation.patch b/debian/patches/repeatable-documentation.patch
new file mode 100644
index 00000000..a7562c62
--- /dev/null
+++ b/debian/patches/repeatable-documentation.patch
@@ -0,0 +1,79 @@
+commit d255e101e847ea051c718cd6dce613af0a0c5340
+Author: Erich Schubert <schube@dbs.ifi.lmu.de>
+Date: Thu Jan 7 17:05:23 2016 +0100
+
+ Sort classes, force UTF-8 encoding, clean up RandomParameter output.
+
+diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java
+index eea3dad..cdbad00 100644
+--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java
++++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentParameters.java
+@@ -57,6 +57,7 @@ import de.lmu.ifi.dbs.elki.application.AbstractApplication;
+ import de.lmu.ifi.dbs.elki.logging.Logging;
+ import de.lmu.ifi.dbs.elki.logging.Logging.Level;
+ import de.lmu.ifi.dbs.elki.logging.LoggingConfiguration;
++import de.lmu.ifi.dbs.elki.math.random.RandomFactory;
+ import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil;
+ import de.lmu.ifi.dbs.elki.utilities.ELKIServiceRegistry;
+ import de.lmu.ifi.dbs.elki.utilities.ELKIServiceScanner;
+@@ -70,6 +71,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.UnParameter
+ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassListParameter;
+ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter;
+ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter;
++import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.RandomParameter;
+ import de.lmu.ifi.dbs.elki.utilities.pairs.Pair;
+ import de.lmu.ifi.dbs.elki.utilities.xml.HTMLUtil;
+
+@@ -182,7 +184,7 @@ public class DocumentParameters {
+ throw new RuntimeException(e);
+ }
+ try {
+- PrintStream byclassstream = new PrintStream(new BufferedOutputStream(byclassfo));
++ PrintStream byclassstream = new PrintStream(new BufferedOutputStream(byclassfo), false, "UTF-8");
+ makeByClassOverviewWiki(byclass, new WikiStream(byclassstream));
+ byclassstream.flush();
+ byclassstream.close();
+@@ -245,7 +247,9 @@ public class DocumentParameters {
+ private static void buildParameterIndex(Map<Class<?>, List<Parameter<?>>> byclass, Map<OptionID, List<Pair<Parameter<?>, Class<?>>>> byopt) {
+ final ArrayList<TrackedParameter> options = new ArrayList<>();
+ ExecutorService es = Executors.newSingleThreadExecutor();
+- for(final Class<?> cls : ELKIServiceRegistry.findAllImplementations(Object.class, false, true)) {
++ List<Class<?>> objs = ELKIServiceRegistry.findAllImplementations(Object.class, false, true);
++ Collections.sort(objs, new ELKIServiceScanner.ClassSorter());
++ for(final Class<?> cls : objs) {
+ // Doesn't have a proper name?
+ if(cls.getCanonicalName() == null) {
+ continue;
+@@ -1020,6 +1024,9 @@ public class DocumentParameters {
+ if(par instanceof ClassParameter<?>) {
+ appendDefaultClassLink(htmldoc, par, p);
+ }
++ else if(par instanceof RandomParameter && par.getDefaultValue() == RandomFactory.DEFAULT) {
++ p.appendChild(htmldoc.createTextNode("use global random seed"));
++ }
+ else {
+ Object def = par.getDefaultValue();
+ p.appendChild(htmldoc.createTextNode(def.toString()));
+@@ -1047,6 +1054,9 @@ public class DocumentParameters {
+ final Class<?> name = ((ClassParameter<?>) par).getDefaultValue();
+ out.javadocLink(name, null);
+ }
++ else if(par instanceof RandomParameter && par.getDefaultValue() == RandomFactory.DEFAULT) {
++ out.print("use global random seed");
++ }
+ else {
+ Object def = par.getDefaultValue();
+ out.print(def.toString());
+diff --git a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java
+index 7d448fc..3b9f029 100644
+--- a/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java
++++ b/elki/src/main/java/de/lmu/ifi/dbs/elki/application/internal/DocumentReferences.java
+@@ -105,7 +105,7 @@ public class DocumentReferences {
+ try {
+ File refwiki = new File(args[1]);
+ FileOutputStream reffow = new FileOutputStream(refwiki);
+- PrintStream refstreamW = new PrintStream(reffow);
++ PrintStream refstreamW = new PrintStream(reffow, false, "UTF-8");
+ documentReferencesWiki(refs, refstreamW);
+ refstreamW.flush();
+ refstreamW.close();
diff --git a/debian/patches/series b/debian/patches/series
index c7858d52..28a17e52 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,6 @@ enable-profiles-hack.patch
better-classpath.patch
skip-cpu-dependent-test.patch
javadoc-encoding.patch
+repeatable-documentation.patch
+powi-bugfix.patch
+randomsample-bugfix.patch
diff --git a/debian/rules b/debian/rules
index 0c0692c7..7c7e06db 100755
--- a/debian/rules
+++ b/debian/rules
@@ -9,6 +9,11 @@ MVN=/usr/share/maven/bin/mvn -Dmaven.repo.local=$(REPO)
%:
dh $@ --buildsystem=maven
+override_dh_auto_configure:
+ # Remove unneded executable bits:
+ find -type f -name "*.java" -executable -exec chmod -x {} \+
+ dh_auto_configure -O--buildsystem=maven
+
#build:
# mh_patchpoms -pelki
# $(MVN) --offline -Psvg,svm -DskipTests=true package