From 483c080f653cfd30f5c027b8de07eacec43931d1 Mon Sep 17 00:00:00 2001 From: stepan <stepan.sindelar@oracle.com> Date: Fri, 30 Dec 2016 12:03:15 +0100 Subject: [PATCH] Stats code cleanup - 'final' where possible - do not assign to parameters - removed duplicated code in GammaFunctions (which had a bug in it) - warnings: do not save more than maxWanings warnings --- .../oracle/truffle/r/library/stats/DBeta.java | 2 +- .../truffle/r/library/stats/DHyper.java | 24 +++++------ .../truffle/r/library/stats/DNBeta.java | 2 +- .../truffle/r/library/stats/DNChisq.java | 14 +++---- .../oracle/truffle/r/library/stats/Dnf.java | 2 +- .../oracle/truffle/r/library/stats/Dt.java | 5 ++- .../r/library/stats/GammaFunctions.java | 41 +------------------ .../oracle/truffle/r/library/stats/Logis.java | 25 +++++------ .../truffle/r/library/stats/PGamma.java | 2 +- .../truffle/r/library/stats/PHyper.java | 18 ++++---- .../truffle/r/library/stats/PNBeta.java | 4 +- .../truffle/r/library/stats/PNChisq.java | 5 ++- .../oracle/truffle/r/library/stats/PPois.java | 6 +-- .../oracle/truffle/r/library/stats/Pnf.java | 2 +- .../oracle/truffle/r/library/stats/Pt.java | 14 +++---- .../oracle/truffle/r/library/stats/QBeta.java | 5 ++- .../truffle/r/library/stats/QNBeta.java | 12 +++--- .../truffle/r/library/stats/QNChisq.java | 30 +++++++------- .../oracle/truffle/r/library/stats/QPois.java | 13 +++--- .../oracle/truffle/r/library/stats/Qf.java | 4 +- .../oracle/truffle/r/library/stats/Qnf.java | 2 +- .../oracle/truffle/r/library/stats/Qt.java | 11 ++--- .../oracle/truffle/r/library/stats/RBeta.java | 24 +++++------ .../truffle/r/library/stats/RGamma.java | 6 +-- .../truffle/r/library/stats/RHyper.java | 22 ++++++---- .../oracle/truffle/r/library/stats/RMath.java | 2 +- .../truffle/r/library/stats/RMultinom.java | 12 +++--- .../oracle/truffle/r/library/stats/RPois.java | 6 +-- .../stats/RandGenerationFunctions.java | 11 ++--- .../truffle/r/library/stats/Random2.java | 5 ++- .../truffle/r/library/stats/Rbinom.java | 3 ++ .../truffle/r/library/stats/TOMS708.java | 5 ++- .../truffle/r/runtime/RErrorHandling.java | 4 +- .../test/library/stats/TestDistributions.java | 6 +++ 34 files changed, 168 insertions(+), 181 deletions(-) diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java index d7f3839013..4b60d50296 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DBeta.java @@ -16,7 +16,7 @@ import static com.oracle.truffle.r.library.stats.LBeta.lbeta; import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_1; -public class DBeta implements Function3_1 { +public final class DBeta implements Function3_1 { @Override public double evaluate(double x, double a, double b, boolean log) { /* NaNs propagated correctly */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DHyper.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DHyper.java index 5e9496495f..1b569cd453 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DHyper.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DHyper.java @@ -41,24 +41,24 @@ public final class DHyper implements Function4_1 { return e.result; } - x = RMath.forceint(x); - r = RMath.forceint(r); - b = RMath.forceint(b); - n = RMath.forceint(n); + double ix = RMath.forceint(x); + double ir = RMath.forceint(r); + double ib = RMath.forceint(b); + double in = RMath.forceint(n); - if (n < x || r < x || n - x > b) { + if (in < ix || ir < ix || in - ix > ib) { return DPQ.rd0(giveLog); } - if (n == 0) { - return (x == 0) ? DPQ.rd1(giveLog) : DPQ.rd0(giveLog); + if (in == 0) { + return (ix == 0) ? DPQ.rd1(giveLog) : DPQ.rd0(giveLog); } - double p = n / (r + b); - double q = (r + b - n) / (r + b); + double p = in / (ir + ib); + double q = (ir + ib - in) / (ir + ib); - double p1 = dbinomRaw(x, r, p, q, giveLog); - double p2 = dbinomRaw(n - x, b, p, q, giveLog); - double p3 = dbinomRaw(n, r + b, p, q, giveLog); + double p1 = dbinomRaw(ix, ir, p, q, giveLog); + double p2 = dbinomRaw(in - ix, ib, p, q, giveLog); + double p3 = dbinomRaw(in, ir + ib, p, q, giveLog); return (giveLog) ? p1 + p2 - p3 : p1 * p2 / p3; } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNBeta.java index 2a6fe146eb..c357b66df5 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNBeta.java @@ -15,7 +15,7 @@ import static com.oracle.truffle.r.library.stats.GammaFunctions.dpoisRaw; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_1; -public class DNBeta implements Function4_1 { +public final class DNBeta implements Function4_1 { private static final double eps = 1.e-15; private final DBeta dbeta = new DBeta(); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNChisq.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNChisq.java index 55515c3247..8fe5845b34 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNChisq.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNChisq.java @@ -17,7 +17,7 @@ import static com.oracle.truffle.r.library.stats.GammaFunctions.dpoisRaw; import com.oracle.truffle.r.library.stats.Chisq.DChisq; import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_1; -public class DNChisq implements Function3_1 { +public final class DNChisq implements Function3_1 { private static final double eps = 5e-15; private final DChisq dchisq = new DChisq(); @@ -85,24 +85,24 @@ public class DNChisq implements Function3_1 { /* upper tail */ /* LDOUBLE */double sum = mid; /* LDOUBLE */double term = mid; - df = dfmid; + double df2 = dfmid; double i = imax; double x2 = x * ncp2; double q; do { i++; - q = x2 / i / df; - df += 2; + q = x2 / i / df2; + df2 += 2; term *= q; sum += term; } while (q >= 1 || term * q > (1 - q) * eps || term > 1e-10 * sum); /* lower tail */ term = mid; - df = dfmid; + df2 = dfmid; i = imax; while (i != 0) { - df -= 2; - q = i * df / x2; + df2 -= 2; + q = i * df2 / x2; i--; term *= q; sum += term; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dnf.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dnf.java index 4b4713273b..2afc8f5e13 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dnf.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dnf.java @@ -20,7 +20,7 @@ import static com.oracle.truffle.r.library.stats.GammaFunctions.dgamma; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_1; -public class Dnf implements Function4_1 { +public final class Dnf implements Function4_1 { private final DNChisq dnchisq = new DNChisq(); private final DNBeta dnbeta = new DNBeta(); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dt.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dt.java index 7ae62d4958..45eb01fe6b 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dt.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Dt.java @@ -13,7 +13,6 @@ package com.oracle.truffle.r.library.stats; import static com.oracle.truffle.r.library.stats.GammaFunctions.bd0; -import static com.oracle.truffle.r.library.stats.GammaFunctions.dnorm; import static com.oracle.truffle.r.library.stats.GammaFunctions.stirlerr; import static com.oracle.truffle.r.library.stats.MathConstants.DBL_EPSILON; import static com.oracle.truffle.r.library.stats.MathConstants.M_1_SQRT_2PI; @@ -22,6 +21,8 @@ import static com.oracle.truffle.r.library.stats.MathConstants.M_LN_SQRT_2PI; import com.oracle.truffle.r.library.stats.StatsFunctions.Function2_1; public final class Dt implements Function2_1 { + private static final DNorm dnorm = new DNorm(); + @Override public double evaluate(double x, double n, boolean giveLog) { if (Double.isNaN(x) || Double.isNaN(n)) { @@ -36,7 +37,7 @@ public final class Dt implements Function2_1 { return DPQ.rd0(giveLog); } if (!Double.isFinite(n)) { - return dnorm(x, 0., 1., giveLog); + return dnorm.evaluate(x, 0., 1., giveLog); } double u; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/GammaFunctions.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/GammaFunctions.java index 18c55e3ee9..8b221ce934 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/GammaFunctions.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/GammaFunctions.java @@ -1152,7 +1152,7 @@ public abstract class GammaFunctions { } f = res12 / elfb; - np = pnorm(s2pt, 0.0, 1.0, !lowerTail, logp); + np = new Pnorm().evaluate(s2pt, 0.0, 1.0, !lowerTail, logp); if (logp) { double ndOverP = dpnorm(s2pt, !lowerTail, np); @@ -1369,45 +1369,6 @@ public abstract class GammaFunctions { return giveLog ? pr - Math.log(scale) : pr / scale; } - // - // pnorm - // - - static double pnorm(double x, double mu, double sigma, boolean lowerTail, boolean logp) { - double p; - double cp = 0; - double localX = x; - - /* - * Note: The structure of these checks has been carefully thought through. For example, if x - * == mu and sigma == 0, we get the correct answer 1. - */ - if (Double.isNaN(localX) || Double.isNaN(mu) || Double.isNaN(sigma)) { - return localX + mu + sigma; - } - if (!RRuntime.isFinite(localX) && mu == localX) { - return Double.NaN; /* x-mu is NaN */ - } - if (sigma <= 0) { - if (sigma < 0) { - return RMathError.defaultError(); - } - /* sigma = 0 : */ - return (localX < mu) ? rdt0(lowerTail, logp) : rdt1(lowerTail, logp); - } - p = (localX - mu) / sigma; - if (!RRuntime.isFinite(p)) { - return (localX < mu) ? rdt0(lowerTail, logp) : rdt1(lowerTail, logp); - } - localX = p; - - double[] pa = new double[]{p}; - double[] cpa = new double[]{cp}; - pnormBoth(localX, pa, cpa, (lowerTail ? 0 : 1), logp); - - return lowerTail ? pa[0] : cpa[0]; - } - private static final double SIXTEN = 16; /* Cutoff allowing exact "*" and "/" */ @CompilationFinal private static final double[] pba = new double[]{2.2352520354606839287, 161.02823106855587881, 1067.6894854603709582, 18154.981253343561249, 0.065682337918207449113}; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Logis.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Logis.java index a6bc1963fc..b810fbae9f 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Logis.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Logis.java @@ -28,15 +28,15 @@ public final class Logis { public static final class DLogis implements Function3_1 { @Override - public double evaluate(double x, double location, double scale, boolean giveLog) { - if (Double.isNaN(x) || Double.isNaN(location) || Double.isNaN(scale)) { - return x + location + scale; + public double evaluate(double xIn, double location, double scale, boolean giveLog) { + if (Double.isNaN(xIn) || Double.isNaN(location) || Double.isNaN(scale)) { + return xIn + location + scale; } if (scale <= 0.0) { return RMathError.defaultError(); } - x = TOMS708.fabs((x - location) / scale); + double x = TOMS708.fabs((xIn - location) / scale); double e = Math.exp(-x); double f = 1.0 + e; return giveLog ? -(x + Math.log(scale * f * f)) : e / (scale * f * f); @@ -64,31 +64,32 @@ public final class Logis { } /* p := logit(p) = Math.log( p / (1-p) ) : */ + double newP; if (logP) { if (lowerTail) { - p = p - DPQ.rlog1exp(p); + newP = p - DPQ.rlog1exp(p); } else { - p = DPQ.rlog1exp(p) - p; + newP = DPQ.rlog1exp(p) - p; } } else { - p = Math.log(lowerTail ? (p / (1. - p)) : ((1. - p) / p)); + newP = Math.log(lowerTail ? (p / (1. - p)) : ((1. - p) / p)); } - return location + scale * p; + return location + scale * newP; } } public static final class PLogis implements Function3_2 { @Override - public double evaluate(double x, double location, double scale, boolean lowerTail, boolean logP) { - if (Double.isNaN(x) || Double.isNaN(location) || Double.isNaN(scale)) { - return x + location + scale; + public double evaluate(double xIn, double location, double scale, boolean lowerTail, boolean logP) { + if (Double.isNaN(xIn) || Double.isNaN(location) || Double.isNaN(scale)) { + return xIn + location + scale; } if (scale <= 0.0) { return RMathError.defaultError(); } - x = (x - location) / scale; + double x = (xIn - location) / scale; if (Double.isNaN(x)) { return RMathError.defaultError(); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PGamma.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PGamma.java index 16ab8bd2e3..5886a01b16 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PGamma.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PGamma.java @@ -16,7 +16,7 @@ import static com.oracle.truffle.r.library.stats.GammaFunctions.pgammaRaw; import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_2; -public class PGamma implements Function3_2 { +public final class PGamma implements Function3_2 { @Override public double evaluate(double xIn, double alph, double scale, boolean lowerTail, boolean logP) { if (Double.isNaN(xIn) || Double.isNaN(alph) || Double.isNaN(scale)) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PHyper.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PHyper.java index 5a52dd6032..5a6922a91a 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PHyper.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PHyper.java @@ -29,21 +29,22 @@ public final class PHyper implements Function4_2 { private final DHyper dhyper = new DHyper(); @Override - public double evaluate(double x, double nr, double nb, double n, boolean lowerTail, boolean logP) { + public double evaluate(double xIn, double nrIn, double nbIn, double nIn, boolean lowerTailIn, boolean logP) { /* Sample of n balls from nr red and nb black ones; x are red */ - if (Double.isNaN(x) || Double.isNaN(nr) || Double.isNaN(nb) || Double.isNaN(n)) { - return x + nr + nb + n; + if (Double.isNaN(xIn) || Double.isNaN(nrIn) || Double.isNaN(nbIn) || Double.isNaN(nIn)) { + return xIn + nrIn + nbIn + nIn; } - x = Math.floor(x + 1e-7); - nr = RMath.forceint(nr); - nb = RMath.forceint(nb); - n = RMath.forceint(n); + double x = Math.floor(xIn + 1e-7); + double nr = RMath.forceint(nrIn); + double nb = RMath.forceint(nbIn); + double n = RMath.forceint(nIn); if (nr < 0 || nb < 0 || !Double.isFinite(nr + nb) || n < 0 || n > nr + nb) { return RMathError.defaultError(); } + boolean lowerTail = lowerTailIn; if (x * (nr + nb) > n * nr) { /* Swap tails. */ double oldNB = nb; @@ -66,7 +67,7 @@ public final class PHyper implements Function4_2 { return logP ? DPQ.rdtlog(d + pd, lowerTail, logP) : DPQ.rdlval(d * pd, lowerTail); } - static double pdhyper(double x, double nr, double nb, double n, boolean logP) { + static double pdhyper(double xIn, double nr, double nb, double n, boolean logP) { /* * Calculate * @@ -81,6 +82,7 @@ public final class PHyper implements Function4_2 { /* LDOUBLE */double sum = 0; /* LDOUBLE */double term = 1; + double x = xIn; while (x > 0 && term >= DBL_EPSILON * sum) { term *= x * (nb - n + x) / (n + 1 - x) / (nr + 1 - x); sum += term; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNBeta.java index 7734338fc8..012c7b2b16 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNBeta.java @@ -17,7 +17,7 @@ import com.oracle.truffle.r.library.stats.RMathError.MLError; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_2; import com.oracle.truffle.r.library.stats.TOMS708.Bratio; -public class PNBeta implements Function4_2 { +public final class PNBeta implements Function4_2 { @Override public double evaluate(double x, double a, double b, double ncp, boolean lowerTail, boolean logP) { if (Double.isNaN(x) || Double.isNaN(a) || Double.isNaN(b) || Double.isNaN(ncp)) { @@ -99,7 +99,7 @@ public class PNBeta implements Function4_2 { /* LDOUBLE */double sumq = 1. - q; /* LDOUBLE */double ans = q * temp; - /* LDOUBLE */double ax = ans; + /* LDOUBLE */double ax; /* recurse over subsequent terms until convergence is achieved */ double j = Math.floor(x0); // x0 could be billions, and is in package EnvStats diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNChisq.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNChisq.java index 561fd2740d..c776e2c447 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNChisq.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PNChisq.java @@ -38,7 +38,7 @@ import com.oracle.truffle.r.library.stats.RMathError.MLError; import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_2; import com.oracle.truffle.r.runtime.RError.Message; -public class PNChisq implements Function3_2 { +public final class PNChisq implements Function3_2 { private static final double _dbl_min_exp = M_LN2 * DBL_MIN_EXP; private final PChisq pchisq = new PChisq(); @@ -284,7 +284,8 @@ public class PNChisq implements Function3_2 { } } - private void debugPrintf(@SuppressWarnings("unused") String fmt, @SuppressWarnings("unused") Object... args) { + @SuppressWarnings("unused") + private void debugPrintf(String fmt, Object... args) { // System.out.printf(fmt + "\n", args); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PPois.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PPois.java index 1d15fa3135..1ad3492f1f 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PPois.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/PPois.java @@ -15,7 +15,7 @@ import static com.oracle.truffle.r.library.stats.GammaFunctions.pgamma; import com.oracle.truffle.r.library.stats.StatsFunctions.Function2_2; -public class PPois implements Function2_2 { +public final class PPois implements Function2_2 { @Override public double evaluate(double x, double lambda, boolean lowerTail, boolean logP) { if (Double.isNaN(x) || Double.isNaN(lambda) || lambda < 0.) { @@ -30,8 +30,8 @@ public class PPois implements Function2_2 { if (!Double.isFinite(x)) { return DPQ.rdt1(lowerTail, logP); } - x = Math.floor(x + 1e-7); + double floorX = Math.floor(x + 1e-7); - return pgamma(lambda, x + 1, 1., !lowerTail, logP); + return pgamma(lambda, floorX + 1, 1., !lowerTail, logP); } } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pnf.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pnf.java index 56ff4406e9..a48d487b9d 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pnf.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pnf.java @@ -14,7 +14,7 @@ package com.oracle.truffle.r.library.stats; import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_2; -public class Pnf implements Function4_2 { +public final class Pnf implements Function4_2 { private final PNChisq pnchisq = new PNChisq(); private final PNBeta pnbeta = new PNBeta(); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pt.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pt.java index fd2e60684a..f1ef9bf8a5 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pt.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pt.java @@ -11,7 +11,6 @@ */ package com.oracle.truffle.r.library.stats; -import static com.oracle.truffle.r.library.stats.GammaFunctions.pnorm; import static com.oracle.truffle.r.library.stats.LBeta.lbeta; import static com.oracle.truffle.r.library.stats.MathConstants.M_LN2; import static com.oracle.truffle.r.library.stats.Pbeta.pbeta; @@ -19,8 +18,9 @@ import static com.oracle.truffle.r.library.stats.Pbeta.pbeta; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.r.library.stats.StatsFunctions.Function2_2; -public class Pt implements Function2_2 { +public final class Pt implements Function2_2 { private final BranchProfile pbetaNanProfile = BranchProfile.create(); + private final Pnorm pnorm = new Pnorm(); @Override public double evaluate(double x, double n, boolean lowerTail, boolean logP) { @@ -41,7 +41,7 @@ public class Pt implements Function2_2 { return (x < 0) ? DPQ.rdt0(lowerTail, logP) : DPQ.rdt1(lowerTail, logP); } if (!Double.isFinite(n)) { - return pnorm(x, 0.0, 1.0, lowerTail, logP); + return pnorm.evaluate(x, 0.0, 1.0, lowerTail, logP); } double nx = 1 + (x / n) * x; @@ -66,19 +66,17 @@ public class Pt implements Function2_2 { } /* Use "1 - v" if lower_tail and x > 0 (but not both): */ - if (x <= 0.) { - lowerTail = !lowerTail; - } + boolean newLowerTail = x <= 0. ? !lowerTail : lowerTail; if (logP) { - if (lowerTail) { + if (newLowerTail) { return RMath.log1p(-0.5 * Math.exp(val)); } else { return val - M_LN2; /* = Math.log(.5* pbeta(....)) */ } } else { val /= 2.; - return DPQ.rdcval(val, lowerTail); + return DPQ.rdcval(val, newLowerTail); } } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QBeta.java index c704b4b594..8e8c7512ed 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QBeta.java @@ -61,7 +61,8 @@ public final class QBeta implements Function3_2 { /** * Debugging printfs should print exactly the same output as GnuR, this can help with debugging. */ - private static void debugPrintf(@SuppressWarnings("unused") String fmt, @SuppressWarnings("unused") Object... args) { + @SuppressWarnings("unused") + private static void debugPrintf(String fmt, Object... args) { // System.out.printf(fmt + "\n", args); } @@ -84,7 +85,7 @@ public final class QBeta implements Function3_2 { // The fields and variables are named after local variables from GnuR, we keep the original // names for the ease of debugging // Checkstyle: stop field name check - private static class QBetaRawMethod { + private static final class QBetaRawMethod { private boolean give_log_q; private boolean use_log_x; private boolean add_N_step; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNBeta.java index ea00bc27cf..ccbd2f19b1 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNBeta.java @@ -16,16 +16,16 @@ import static com.oracle.truffle.r.library.stats.MathConstants.DBL_MIN; import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_2; -public class QNBeta implements Function4_2 { +public final class QNBeta implements Function4_2 { private static final double accu = 1e-15; private static final double Eps = 1e-14; /* must be > accu */ private final PNBeta pnbeta = new PNBeta(); @Override - public double evaluate(double p, double a, double b, double ncp, boolean lowerTail, boolean logP) { - if (Double.isNaN(p) || Double.isNaN(a) || Double.isNaN(b) || Double.isNaN(ncp)) { - return p + a + b + ncp; + public double evaluate(double pIn, double a, double b, double ncp, boolean lowerTail, boolean logP) { + if (Double.isNaN(pIn) || Double.isNaN(a) || Double.isNaN(b) || Double.isNaN(ncp)) { + return pIn + a + b + ncp; } if (!Double.isFinite(a)) { return RMathError.defaultError(); @@ -36,12 +36,12 @@ public class QNBeta implements Function4_2 { } try { - DPQ.rqp01boundaries(p, 0, 1, lowerTail, logP); + DPQ.rqp01boundaries(pIn, 0, 1, lowerTail, logP); } catch (EarlyReturn e) { return e.result; } - p = DPQ.rdtqiv(p, lowerTail, logP); + double p = DPQ.rdtqiv(pIn, lowerTail, logP); /* * Invert pnbeta(.) : 1. finding an upper and lower bound diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNChisq.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNChisq.java index 897f0875c9..6673c76ce1 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNChisq.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QNChisq.java @@ -21,7 +21,7 @@ import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.RMathError.MLError; import com.oracle.truffle.r.library.stats.StatsFunctions.Function3_2; -public class QNChisq implements Function3_2 { +public final class QNChisq implements Function3_2 { private static final double accu = 1e-13; private static final double racc = 4 * DBL_EPSILON; /* these two are for the "search" loops, can have less accuracy: */ @@ -32,21 +32,21 @@ public class QNChisq implements Function3_2 { private final PNChisq pnchisq = new PNChisq(); @Override - public double evaluate(double p, double df, double ncp, boolean lowerTail, boolean logP) { - if (Double.isNaN(p) || Double.isNaN(df) || Double.isNaN(ncp)) { - return p + df + ncp; + public double evaluate(double pIn, double df, double ncp, boolean lowerTail, boolean logP) { + if (Double.isNaN(pIn) || Double.isNaN(df) || Double.isNaN(ncp)) { + return pIn + df + ncp; } if (!Double.isFinite(df) || df < 0 || ncp < 0) { return RMathError.defaultError(); } try { - DPQ.rqp01boundaries(p, 0, Double.POSITIVE_INFINITY, lowerTail, logP); + DPQ.rqp01boundaries(pIn, 0, Double.POSITIVE_INFINITY, lowerTail, logP); } catch (EarlyReturn e) { return e.result; } - double pp = DPQ.rdqiv(p, logP); + double pp = DPQ.rdqiv(pIn, logP); if (pp > 1 - DBL_EPSILON) { return lowerTail ? Double.POSITIVE_INFINITY : 0.0; } @@ -61,30 +61,32 @@ public class QNChisq implements Function3_2 { double b = (ncp * ncp) / (df + 3 * ncp); double c = (df + 3 * ncp) / (df + 2 * ncp); double ff = (df + 2 * ncp) / (c * c); - double ux = b + c * qchisq.evaluate(p, ff, lowerTail, logP); + double ux = b + c * qchisq.evaluate(pIn, ff, lowerTail, logP); if (ux < 0) { ux = 1; } double ux0 = ux; - if (!lowerTail && ncp >= 80) { + double p = pIn; + boolean newLowerTail = lowerTail; + if (!newLowerTail && ncp >= 80) { /* in this case, pnchisq() works via lower_tail = true */ if (pp < 1e-10) { RMathError.error(MLError.PRECISION, "qnchisq"); } - p = DPQ.rdtqiv(p, lowerTail, logP); - lowerTail = true; + p = DPQ.rdtqiv(p, newLowerTail, logP); + newLowerTail = true; } else { p = pp; } pp = RMath.fmin2(1 - DBL_EPSILON, p * (1 + Eps)); - while (ux < DBL_MAX && isLower(lowerTail, pnchisq.pnchisqRaw(ux, df, ncp, Eps, rEps, 10000, lowerTail, false), pp)) { + while (ux < DBL_MAX && isLower(newLowerTail, pnchisq.pnchisqRaw(ux, df, ncp, Eps, rEps, 10000, newLowerTail, false), pp)) { ux *= 2; } pp = p * (1 - Eps); double lx = RMath.fmin2(ux0, DBL_MAX); - while (lx > DBL_MIN && isGreater(lowerTail, pnchisq.pnchisqRaw(lx, df, ncp, Eps, rEps, 10000, lowerTail, false), pp)) { + while (lx > DBL_MIN && isGreater(newLowerTail, pnchisq.pnchisqRaw(lx, df, ncp, Eps, rEps, 10000, newLowerTail, false), pp)) { lx *= 0.5; } @@ -92,8 +94,8 @@ public class QNChisq implements Function3_2 { double nx; do { nx = 0.5 * (lx + ux); - double raw = pnchisq.pnchisqRaw(nx, df, ncp, accu, racc, 100000, lowerTail, false); - if (isGreater(lowerTail, raw, p)) { + double raw = pnchisq.pnchisqRaw(nx, df, ncp, accu, racc, 100000, newLowerTail, false); + if (isGreater(newLowerTail, raw, p)) { ux = nx; } else { lx = nx; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QPois.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QPois.java index 34cbad5586..95f1096a5d 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QPois.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QPois.java @@ -16,14 +16,14 @@ import static com.oracle.truffle.r.library.stats.MathConstants.DBL_EPSILON; import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.StatsFunctions.Function2_2; -public class QPois implements Function2_2 { +public final class QPois implements Function2_2 { private final Qnorm qnorm = new Qnorm(); private final PPois ppois = new PPois(); @Override - public double evaluate(double p, double lambda, boolean lowerTail, boolean logP) { - if (Double.isNaN(p) || Double.isNaN(lambda)) { - return p + lambda; + public double evaluate(double pIn, double lambda, boolean lowerTail, boolean logP) { + if (Double.isNaN(pIn) || Double.isNaN(lambda)) { + return pIn + lambda; } if (!Double.isFinite(lambda)) { return RMathError.defaultError(); @@ -36,7 +36,7 @@ public class QPois implements Function2_2 { } try { - DPQ.rqp01boundaries(p, 0, Double.POSITIVE_INFINITY, lowerTail, logP); + DPQ.rqp01boundaries(pIn, 0, Double.POSITIVE_INFINITY, lowerTail, logP); } catch (EarlyReturn e) { return e.result; } @@ -50,6 +50,7 @@ public class QPois implements Function2_2 { * Note : "same" code in qpois.c, qbinom.c, qnbinom.c -- FIXME: This is far from optimal * [cancellation for p ~= 1, etc]: */ + double p = pIn; if (!lowerTail || logP) { p = DPQ.rdtqiv(p, lowerTail, logP); /* need check again (cancellation!): */ if (p == 0.) { @@ -109,7 +110,7 @@ public class QPois implements Function2_2 { double y = yIn; for (;;) { y = y + incr; - double z = zIn; + double z; if ((z = ppois.evaluate(y, lambda, /* l._t. */true, /* log_p */false)) >= p) { return new SearchResult(y, z); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qf.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qf.java index 4c02746737..94d0967d1c 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qf.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qf.java @@ -54,7 +54,7 @@ public final class Qf implements Function3_2 { } // FIXME: (1/qb - 1) = (1 - qb)/qb; if we know qb ~= 1, should use other tail - p = (1. / qbeta.evaluate(p, df2 / 2, df1 / 2, !lowerTail, logP) - 1.) * (df2 / df1); - return RMath.mlValid(p) ? p : Double.NaN; + double newP = (1. / qbeta.evaluate(p, df2 / 2, df1 / 2, !lowerTail, logP) - 1.) * (df2 / df1); + return RMath.mlValid(newP) ? newP : Double.NaN; } } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qnf.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qnf.java index 7f06ef8e57..54a6acf636 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qnf.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qnf.java @@ -13,7 +13,7 @@ package com.oracle.truffle.r.library.stats; import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.StatsFunctions.Function4_2; -public class Qnf implements Function4_2 { +public final class Qnf implements Function4_2 { private final QNChisq qnchisq = new QNChisq(); private final QNBeta qnbeta = new QNBeta(); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qt.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qt.java index 2c4fd0191a..5c52750435 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qt.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Qt.java @@ -24,7 +24,7 @@ import static com.oracle.truffle.r.library.stats.MathConstants.M_SQRT2; import com.oracle.truffle.r.library.stats.DPQ.EarlyReturn; import com.oracle.truffle.r.library.stats.StatsFunctions.Function2_2; -public class Qt implements Function2_2 { +public final class Qt implements Function2_2 { private static final double eps = 1.e-12; private static final double accu = 1e-13; private static final double Eps = 1e-11; /* must be > accu */ @@ -34,14 +34,14 @@ public class Qt implements Function2_2 { private final Pt pt = new Pt(); @Override - public double evaluate(double p, double ndf, boolean lowerTail, boolean logP) { + public double evaluate(double pIn, double ndf, boolean lowerTail, boolean logP) { - if (Double.isNaN(p) || Double.isNaN(ndf)) { - return p + ndf; + if (Double.isNaN(pIn) || Double.isNaN(ndf)) { + return pIn + ndf; } try { - DPQ.rqp01boundaries(p, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, lowerTail, logP); + DPQ.rqp01boundaries(pIn, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, lowerTail, logP); } catch (EarlyReturn earlyReturn) { return earlyReturn.result; } @@ -50,6 +50,7 @@ public class Qt implements Function2_2 { return RMathError.defaultError(); } + double p = pIn; if (ndf < 1) { /* based on qnt */ int iter = 0; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RBeta.java index 7fab48d938..cc59560caa 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RBeta.java @@ -24,6 +24,15 @@ public final class RBeta extends RandFunction2_Double { private static final double expmax = (DBL_MAX_EXP * M_LN2); /* = log(DBL_MAX) */ + // TODO: state variables + private static double beta = 0; + private static double gamma = 1; + private static double delta; + private static double k1 = 0; + private static double k2 = 0; + private static double olda = -1.0; + private static double oldb = -1.0; + @Override public double execute(double aa, double bb, RandomNumberProvider rand) { if (Double.isNaN(aa) || Double.isNaN(bb) || aa < 0. || bb < 0.) { @@ -43,18 +52,6 @@ public final class RBeta extends RandFunction2_Double { return 0.0; } - double v = 0; - double w = 0; - - // TODO: state variables - double beta = 0; - double gamma = 1; - double delta; - double k1 = 0; - double k2 = 0; - double olda = -1.0; - double oldb = -1.0; - /* Test if we need new "initializing" */ boolean qsame = (olda == aa) && (oldb == bb); if (!qsame) { @@ -66,6 +63,9 @@ public final class RBeta extends RandFunction2_Double { double b = fmax2(aa, bb); /* a <= b */ double alpha = a + b; + double v; + double w; + if (a <= 1.0) { /* --- Algorithm BC --- */ /* changed notation, now also a <= b (was reversed) */ if (!qsame) { /* initialize */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RGamma.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RGamma.java index 8d344b1625..f3546d5e1a 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RGamma.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RGamma.java @@ -16,7 +16,7 @@ import static com.oracle.truffle.r.library.stats.TOMS708.fabs; import com.oracle.truffle.r.library.stats.RandGenerationFunctions.RandFunction2_Double; import com.oracle.truffle.r.library.stats.RandGenerationFunctions.RandomNumberProvider; -public class RGamma extends RandFunction2_Double { +public final class RGamma extends RandFunction2_Double { private static final double sqrt32 = 5.656854; private static final double exp_m1 = 0.36787944117144232159; /* exp(-1) = 1/e */ @@ -44,8 +44,8 @@ public class RGamma extends RandFunction2_Double { public double execute(double a, double scale, RandomNumberProvider rand) { // TODO: state variables - double aa = 0.; - double aaa = 0.; + double aa = Double.NaN; + double aaa = Double.NaN; double s = 0; double s2 = 0; double d = 0; /* no. 1 (step 1) */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RHyper.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RHyper.java index a233c0c549..fb549a90f9 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RHyper.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RHyper.java @@ -73,7 +73,14 @@ public final class RHyper extends RandFunction3_Double { private static double w; // III: // Checkstyle: stop - private static double a, d, s, xl, xr, kl, kr, lamdl, lamdr, p1, p2, p3; + private static double a; + private static double xl; + private static double xr; + private static double lamdl; + private static double lamdr; + private static double p1; + private static double p2; + private static double p3; // // Checkstyle: resume private static final double scale = 1e25; // scaling factor against (early) underflow @@ -201,18 +208,19 @@ public final class RHyper extends RandFunction3_Double { double u; double v; + double s; if (setup1 || setup2) { s = Math.sqrt((tn - k) * k * n1 * n2 / (tn - 1) / tn / tn); /* remark: d is defined in reference without int. */ /* the truncation centers the cell boundaries at 0.5 */ - d = (int) (1.5 * s) + .5; + double d = (int) (1.5 * s) + .5; xl = m - d + .5; xr = m + d + .5; a = afc(m) + afc(n1 - m) + afc(k - m) + afc(n2 - k + m); - kl = Math.exp(a - afc((int) (xl)) - afc((int) (n1 - xl)) - afc((int) (k - xl)) - afc((int) (n2 - k + xl))); - kr = Math.exp(a - afc((int) (xr - 1)) - afc((int) (n1 - xr + 1)) - afc((int) (k - xr + 1)) - afc((int) (n2 - k + xr - 1))); + double kl = Math.exp(a - afc((int) (xl)) - afc((int) (n1 - xl)) - afc((int) (k - xl)) - afc((int) (n2 - k + xl))); + double kr = Math.exp(a - afc((int) (xr - 1)) - afc((int) (n1 - xr + 1)) - afc((int) (k - xr + 1)) - afc((int) (n2 - k + xr - 1))); lamdl = -Math.log(xl * (n2 - k + xl) / (n1 - xl + 1) / (k - xl + 1)); lamdr = -Math.log((n1 - xr + 1) * (k - xr + 1) / xr / (n2 - k + xr)); p1 = d + d; @@ -329,11 +337,7 @@ public final class RHyper extends RandFunction3_Double { /* * * Stirling's formula to machine accuracy */ - if (alv <= (a - afc(ix) - afc(n1 - ix) - afc(k - ix) - afc(n2 - k + ix))) { - reject = false; - } else { - reject = true; - } + reject = !(alv <= (a - afc(ix) - afc(n1 - ix) - afc(k - ix) - afc(n2 - k + ix))); } } } // else diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMath.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMath.java index a7f1cd01da..68347359d0 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMath.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMath.java @@ -27,7 +27,7 @@ import com.oracle.truffle.r.runtime.RRuntime; * @see RMathError * @see MathConstants */ -public class RMath { +public final class RMath { public static boolean mlValid(double d) { return !Double.isNaN(d); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMultinom.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMultinom.java index f6ec7325bb..9a0f80cd9a 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMultinom.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMultinom.java @@ -13,10 +13,10 @@ package com.oracle.truffle.r.library.stats; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.notIntNA; -import static com.oracle.truffle.r.runtime.RError.SHOW_CALLER; import static com.oracle.truffle.r.runtime.RError.Message.NA_IN_PROB_VECTOR; import static com.oracle.truffle.r.runtime.RError.Message.NEGATIVE_PROBABILITY; import static com.oracle.truffle.r.runtime.RError.Message.NO_POSITIVE_PROBABILITIES; +import static com.oracle.truffle.r.runtime.RError.SHOW_CALLER; import java.math.BigDecimal; import java.math.RoundingMode; @@ -89,16 +89,16 @@ public abstract class RMultinom extends RExternalBuiltinNode.Arg3 { private static void fixupProb(double[] p) { double sum = 0.0; int npos = 0; - for (int i = 0; i < p.length; i++) { - if (!Double.isFinite(p[i])) { + for (double prob : p) { + if (!Double.isFinite(prob)) { throw RError.error(SHOW_CALLER, NA_IN_PROB_VECTOR); } - if (p[i] < 0.0) { + if (prob < 0.0) { throw RError.error(SHOW_CALLER, NEGATIVE_PROBABILITY); } - if (p[i] > 0.0) { + if (prob > 0.0) { npos++; - sum += p[i]; + sum += prob; } } if (npos == 0) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RPois.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RPois.java index 8ed6d66484..36759275c3 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RPois.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RPois.java @@ -40,8 +40,6 @@ public final class RPois extends RandFunction1_Double { // TODO: state variables private static int l = 0; private static int m = 0; - private static double b1; - private static double b2; private static double c = 0; private static double c0 = 0; private static double c1 = 0; @@ -193,8 +191,8 @@ public final class RPois extends RandFunction1_Double { * discrete normal probabilities fk. */ - b1 = one_24 / mu; - b2 = 0.3 * b1 * b1; + double b1 = one_24 / mu; + double b2 = 0.3 * b1 * b1; c3 = one_7 * b1 * b2; c2 = b2 - 15. * c3; c1 = b1 - 6. * b2 + 45. * c3; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RandGenerationFunctions.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RandGenerationFunctions.java index 19717a9b86..61aae8184e 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RandGenerationFunctions.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RandGenerationFunctions.java @@ -184,8 +184,7 @@ public final class RandGenerationFunctions { RandGenerationNodeData nodeData) { int length = nodeData.resultVectorLengthProfile.profile(convertToLength.execute(lengthVec)); RNode.reportWork(this, length); - Object result = evaluate(length, a, b, c, nodeData, rand); - return result; + return evaluate(length, a, b, c, nodeData, rand); } @SuppressWarnings("unused") @@ -308,12 +307,14 @@ public final class RandGenerationFunctions { return RandFunction3NodeGen.create(RandGenerationFunctionsFactory.RandFunctionIntExecutorNodeGen.create(function)); } + // Note: for completeness of the API + @SuppressWarnings("unused") public static RandFunction3Node createDouble(RandFunction3_Double function) { return RandFunction3NodeGen.create(RandGenerationFunctionsFactory.RandFunctionDoubleExecutorNodeGen.create(function)); } @Override - protected void createCasts(CastBuilder casts) { + protected final void createCasts(CastBuilder casts) { ConvertToLength.addLengthCast(casts); casts.arg(1).asDoubleVector(); casts.arg(2).asDoubleVector(); @@ -343,7 +344,7 @@ public final class RandGenerationFunctions { } @Override - protected void createCasts(CastBuilder casts) { + protected final void createCasts(CastBuilder casts) { ConvertToLength.addLengthCast(casts); casts.arg(1).asDoubleVector(); casts.arg(2).asDoubleVector(); @@ -372,7 +373,7 @@ public final class RandGenerationFunctions { } @Override - protected void createCasts(CastBuilder casts) { + protected final void createCasts(CastBuilder casts) { ConvertToLength.addLengthCast(casts); casts.arg(1).asDoubleVector(); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Random2.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Random2.java index 729f0d0833..de77422aef 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Random2.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Random2.java @@ -17,7 +17,10 @@ import static com.oracle.truffle.r.library.stats.DPQ.rdtqiv; /* * Logic derived from GNU-R, see inline comments. */ -public class Random2 { +public final class Random2 { + private Random2() { + // only static members + } // from GNUR: qnorm.c public static double qnorm5(double p, double mu, double sigma, boolean lowerTail, boolean logP) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rbinom.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rbinom.java index 37964392e6..4f9080aae6 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rbinom.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rbinom.java @@ -22,6 +22,9 @@ public final class Rbinom extends RandFunction2_Double { private final Qbinom qbinom = new Qbinom(); + // TODO: some of the variables below are static in GnuR, because they cache intermediate results + // that depend on paremeters that often do not change between calls. + @Override public double execute(double nin, double pp, RandomNumberProvider rand) { double psave = -1.0; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/TOMS708.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/TOMS708.java index f335b9f7b1..9f0ee17d7b 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/TOMS708.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/TOMS708.java @@ -25,7 +25,10 @@ import com.oracle.truffle.r.runtime.RRuntime; * transcribed from toms708.c - as the original file contains no copyright header, we assume that it is copyright R code and R foundation. */ -public class TOMS708 { +public final class TOMS708 { + private TOMS708() { + // only static members + } @SuppressWarnings("unused") private static void debugPrintf(String format, Object... args) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java index 9fcf43914e..6b055c7deb 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java @@ -634,7 +634,7 @@ public class RErrorHandling { throw RInternalError.unimplemented(); } else if (w == 1) { Utils.writeStderr(message, true); - } else if (w == 0) { + } else if (w == 0 && errorHandlingState.warnings.size() < errorHandlingState.maxWarnings) { errorHandlingState.warnings.add(new Warning(fmsg, call)); } } finally { @@ -695,7 +695,7 @@ public class RErrorHandling { if (nWarnings < errorHandlingState.maxWarnings) { Utils.writeStderr(String.format("There were %d warnings (use warnings() to see them)", nWarnings), true); } else { - nWarnings = errorHandlingState.maxWarnings; + assert nWarnings == errorHandlingState.maxWarnings : "warnings above the limit should not have been added"; Utils.writeStderr(String.format("There were %d or more warnings (use warnings() to see the first %d)", nWarnings, nWarnings), true); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestDistributions.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestDistributions.java index 54841d07cd..b372e72180 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestDistributions.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestDistributions.java @@ -228,6 +228,12 @@ public class TestDistributions extends TestBase { return this; } + /** + * Removes the predefined "error" values for parameters. These are so far always the same, + * but this method is here to make the API "complete". May be removed if all distributions + * already have tests and non of them needs it. + */ + @SuppressWarnings("unused") public DistrTest clearDefaultErrorParamValues() { errorParamValues.clear(); return this; -- GitLab