Avoid code duplication in Distribution density/probability methods by using the result of logDensity or logProbability respectively.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1534358 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2745587342
commit
96d6a416d6
|
@ -99,15 +99,8 @@ public class BinomialDistribution extends AbstractIntegerDistribution {
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public double probability(int x) {
|
public double probability(int x) {
|
||||||
double ret;
|
final double logProbability = logProbability(x);
|
||||||
if (x < 0 || x > numberOfTrials) {
|
return logProbability == Double.NEGATIVE_INFINITY ? 0 : FastMath.exp(logProbability);
|
||||||
ret = 0.0;
|
|
||||||
} else {
|
|
||||||
ret = FastMath.exp(SaddlePointExpansion.logBinomialProbability(x,
|
|
||||||
numberOfTrials, probabilityOfSuccess,
|
|
||||||
1.0 - probabilityOfSuccess));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} **/
|
/** {@inheritDoc} **/
|
||||||
|
|
|
@ -161,15 +161,16 @@ public class ExponentialDistribution extends AbstractRealDistribution {
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public double density(double x) {
|
public double density(double x) {
|
||||||
if (x < 0) {
|
final double logDensity = logDensity(x);
|
||||||
return 0;
|
return logDensity == Double.NEGATIVE_INFINITY ? 0 : FastMath.exp(logDensity);
|
||||||
}
|
|
||||||
return FastMath.exp(-x / mean) / mean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} **/
|
/** {@inheritDoc} **/
|
||||||
@Override
|
@Override
|
||||||
public double logDensity(double x) {
|
public double logDensity(double x) {
|
||||||
|
if (x < 0) {
|
||||||
|
return Double.NEGATIVE_INFINITY;
|
||||||
|
}
|
||||||
return -x / mean - logMean;
|
return -x / mean - logMean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,16 +142,7 @@ public class FDistribution extends AbstractRealDistribution {
|
||||||
* @since 2.1
|
* @since 2.1
|
||||||
*/
|
*/
|
||||||
public double density(double x) {
|
public double density(double x) {
|
||||||
final double nhalf = numeratorDegreesOfFreedom / 2;
|
return FastMath.exp(logDensity(x));
|
||||||
final double mhalf = denominatorDegreesOfFreedom / 2;
|
|
||||||
final double logx = FastMath.log(x);
|
|
||||||
final double logn = FastMath.log(numeratorDegreesOfFreedom);
|
|
||||||
final double logm = FastMath.log(denominatorDegreesOfFreedom);
|
|
||||||
final double lognxm = FastMath.log(numeratorDegreesOfFreedom * x +
|
|
||||||
denominatorDegreesOfFreedom);
|
|
||||||
return FastMath.exp(nhalf * logn + nhalf * logx - logx +
|
|
||||||
mhalf * logm - nhalf * lognxm - mhalf * lognxm -
|
|
||||||
Beta.logBeta(nhalf, mhalf));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} **/
|
/** {@inheritDoc} **/
|
||||||
|
|
|
@ -193,25 +193,8 @@ public class HypergeometricDistribution extends AbstractIntegerDistribution {
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public double probability(int x) {
|
public double probability(int x) {
|
||||||
double ret;
|
final double logProbability = logProbability(x);
|
||||||
|
return logProbability == Double.NEGATIVE_INFINITY ? 0 : FastMath.exp(logProbability);
|
||||||
int[] domain = getDomain(populationSize, numberOfSuccesses, sampleSize);
|
|
||||||
if (x < domain[0] || x > domain[1]) {
|
|
||||||
ret = 0.0;
|
|
||||||
} else {
|
|
||||||
double p = (double) sampleSize / (double) populationSize;
|
|
||||||
double q = (double) (populationSize - sampleSize) / (double) populationSize;
|
|
||||||
double p1 = SaddlePointExpansion.logBinomialProbability(x,
|
|
||||||
numberOfSuccesses, p, q);
|
|
||||||
double p2 =
|
|
||||||
SaddlePointExpansion.logBinomialProbability(sampleSize - x,
|
|
||||||
populationSize - numberOfSuccesses, p, q);
|
|
||||||
double p3 =
|
|
||||||
SaddlePointExpansion.logBinomialProbability(sampleSize, populationSize, p, q);
|
|
||||||
ret = FastMath.exp(p1 + p2 - p3);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
|
|
@ -161,17 +161,8 @@ public class PoissonDistribution extends AbstractIntegerDistribution {
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public double probability(int x) {
|
public double probability(int x) {
|
||||||
double ret;
|
final double logProbability = logProbability(x);
|
||||||
if (x < 0 || x == Integer.MAX_VALUE) {
|
return logProbability == Double.NEGATIVE_INFINITY ? 0 : FastMath.exp(logProbability);
|
||||||
ret = 0.0;
|
|
||||||
} else if (x == 0) {
|
|
||||||
ret = FastMath.exp(-mean);
|
|
||||||
} else {
|
|
||||||
ret = FastMath.exp(-SaddlePointExpansion.getStirlingError(x) -
|
|
||||||
SaddlePointExpansion.getDeviancePart(x, mean)) /
|
|
||||||
FastMath.sqrt(MathUtils.TWO_PI * x);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
|
|
@ -120,13 +120,7 @@ public class TDistribution extends AbstractRealDistribution {
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public double density(double x) {
|
public double density(double x) {
|
||||||
final double n = degreesOfFreedom;
|
return FastMath.exp(logDensity(x));
|
||||||
final double nPlus1Over2 = (n + 1) / 2;
|
|
||||||
return FastMath.exp(Gamma.logGamma(nPlus1Over2) -
|
|
||||||
0.5 * (FastMath.log(FastMath.PI) +
|
|
||||||
FastMath.log(n)) -
|
|
||||||
Gamma.logGamma(n / 2) -
|
|
||||||
nPlus1Over2 * FastMath.log(1 + x * x / n));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
|
Loading…
Reference in New Issue