Author: tn
Date: Sat Dec 7 13:08:06 2013
New Revision: 1548907
URL: http://svn.apache.org/r1548907
Log:
[MATH-1068] Changed integer calculations with potential overflows to long.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/correlation/KendallsCorrelation.java
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/correlation/KendallsCorrelation.java
URL:
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/correlation/KendallsCorrelation.java?rev=1548907&r1=1548906&r2=1548907&view=diff
==============================================================================
---
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/correlation/KendallsCorrelation.java
(original)
+++
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/correlation/KendallsCorrelation.java
Sat Dec 7 13:08:06 2013
@@ -160,7 +160,7 @@ public class KendallsCorrelation {
}
final int n = xArray.length;
- final long numPairs = n * (n - 1l) / 2l;
+ final long numPairs = sum(n - 1);
@SuppressWarnings("unchecked")
Pair<Double, Double>[] pairs = new Pair[n];
@@ -175,10 +175,10 @@ public class KendallsCorrelation {
}
});
- int tiedXPairs = 0;
- int tiedXYPairs = 0;
- int consecutiveXTies = 1;
- int consecutiveXYTies = 1;
+ long tiedXPairs = 0;
+ long tiedXYPairs = 0;
+ long consecutiveXTies = 1;
+ long consecutiveXYTies = 1;
Pair<Double, Double> prev = pairs[0];
for (int i = 1; i < n; i++) {
final Pair<Double, Double> curr = pairs[i];
@@ -187,19 +187,19 @@ public class KendallsCorrelation {
if (curr.getSecond().equals(prev.getSecond())) {
consecutiveXYTies++;
} else {
- tiedXYPairs += consecutiveXYTies * (consecutiveXYTies - 1)
/ 2;
+ tiedXYPairs += sum(consecutiveXYTies - 1);
consecutiveXYTies = 1;
}
} else {
- tiedXPairs += consecutiveXTies * (consecutiveXTies - 1) / 2;
+ tiedXPairs += sum(consecutiveXTies - 1);
consecutiveXTies = 1;
- tiedXYPairs += consecutiveXYTies * (consecutiveXYTies - 1) / 2;
+ tiedXYPairs += sum(consecutiveXYTies - 1);
consecutiveXYTies = 1;
}
prev = curr;
}
- tiedXPairs += consecutiveXTies * (consecutiveXTies - 1) / 2;
- tiedXYPairs += consecutiveXYTies * (consecutiveXYTies - 1) / 2;
+ tiedXPairs += sum(consecutiveXTies - 1);
+ tiedXYPairs += sum(consecutiveXYTies - 1);
int swaps = 0;
@SuppressWarnings("unchecked")
@@ -239,23 +239,34 @@ public class KendallsCorrelation {
pairsDestination = pairsTemp;
}
- int tiedYPairs = 0;
- int consecutiveYTies = 1;
+ long tiedYPairs = 0;
+ long consecutiveYTies = 1;
prev = pairs[0];
for (int i = 1; i < n; i++) {
final Pair<Double, Double> curr = pairs[i];
if (curr.getSecond().equals(prev.getSecond())) {
consecutiveYTies++;
} else {
- tiedYPairs += consecutiveYTies * (consecutiveYTies - 1) / 2;
+ tiedYPairs += sum(consecutiveYTies - 1);
consecutiveYTies = 1;
}
prev = curr;
}
- tiedYPairs += consecutiveYTies * (consecutiveYTies - 1) / 2;
+ tiedYPairs += sum(consecutiveYTies - 1);
final long concordantMinusDiscordant = numPairs - tiedXPairs -
tiedYPairs + tiedXYPairs - 2 * swaps;
final double nonTiedPairsMultiplied = (numPairs - tiedXPairs) *
(double) (numPairs - tiedYPairs);
return concordantMinusDiscordant /
FastMath.sqrt(nonTiedPairsMultiplied);
}
+
+ /**
+ * Returns the sum of the number from 1 .. n according to Gauss' summation
formula:
+ * \[ \sum\limits_{k=1}^n k = \frac{n(n + 1)}{2} \]
+ *
+ * @param n the summation end
+ * @return the sum of the number from 1 to n
+ */
+ private static long sum(long n) {
+ return n * (n + 1) / 2l;
+ }
}