From c34c2bc8a4ff25ae968837541ce838be966021db Mon Sep 17 00:00:00 2001 From: stepan <stepan.sindelar@oracle.com> Date: Thu, 29 Dec 2016 12:19:46 +0100 Subject: [PATCH] Stats errors/warnings methods actually implemented and moved to RMathError + small fix in RErrorHandling: when max number of warnings is reached, do not report the actual number, but the max (like GnuR does). --- .../truffle/r/library/stats/Cauchy.java | 10 +-- .../oracle/truffle/r/library/stats/Chisq.java | 2 +- .../oracle/truffle/r/library/stats/DBeta.java | 2 +- .../oracle/truffle/r/library/stats/DNorm.java | 4 +- .../oracle/truffle/r/library/stats/DPQ.java | 2 +- .../oracle/truffle/r/library/stats/DPois.java | 2 +- .../oracle/truffle/r/library/stats/Df.java | 2 +- .../oracle/truffle/r/library/stats/Dt.java | 2 +- .../oracle/truffle/r/library/stats/Exp.java | 8 +-- .../r/library/stats/GammaFunctions.java | 10 +-- .../oracle/truffle/r/library/stats/Geom.java | 8 +-- .../oracle/truffle/r/library/stats/LBeta.java | 2 +- .../truffle/r/library/stats/LogNormal.java | 6 +- .../oracle/truffle/r/library/stats/Logis.java | 10 +-- .../truffle/r/library/stats/PGamma.java | 2 +- .../oracle/truffle/r/library/stats/PPois.java | 2 +- .../truffle/r/library/stats/Pbinom.java | 2 +- .../oracle/truffle/r/library/stats/Pt.java | 2 +- .../oracle/truffle/r/library/stats/QBeta.java | 14 ++-- .../truffle/r/library/stats/QHyper.java | 4 +- .../oracle/truffle/r/library/stats/QPois.java | 4 +- .../oracle/truffle/r/library/stats/Qf.java | 2 +- .../oracle/truffle/r/library/stats/Qt.java | 4 +- .../oracle/truffle/r/library/stats/RBeta.java | 2 +- .../truffle/r/library/stats/RGamma.java | 4 +- .../truffle/r/library/stats/RHyper.java | 6 +- .../oracle/truffle/r/library/stats/RMath.java | 34 ++------- .../truffle/r/library/stats/RMathError.java | 70 +++++++++++++++++++ .../truffle/r/library/stats/RNbinomMu.java | 2 +- .../truffle/r/library/stats/RNchisq.java | 2 +- .../oracle/truffle/r/library/stats/RPois.java | 2 +- .../truffle/r/library/stats/RWeibull.java | 2 +- .../oracle/truffle/r/library/stats/Rf.java | 2 +- .../oracle/truffle/r/library/stats/Rnorm.java | 2 +- .../oracle/truffle/r/library/stats/Rt.java | 2 +- .../truffle/r/library/stats/Signrank.java | 4 +- .../oracle/truffle/r/library/stats/Unif.java | 8 +-- .../com/oracle/truffle/r/runtime/RError.java | 5 ++ .../truffle/r/runtime/RErrorHandling.java | 2 +- .../gnu_r.core.copyright.star.regex | 2 +- mx.fastr/copyrights/overrides | 1 + 41 files changed, 155 insertions(+), 103 deletions(-) create mode 100644 com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMathError.java diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cauchy.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cauchy.java index 29452d13c1..dfc539f914 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cauchy.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Cauchy.java @@ -29,7 +29,7 @@ public final class Cauchy { @Override public double execute(double location, double scale, RandomNumberProvider rand) { if (Double.isNaN(location) || !Double.isFinite(scale) || scale < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (scale == 0. || !Double.isFinite(location)) { return location; @@ -48,7 +48,7 @@ public final class Cauchy { return x + location + scale; } if (scale <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } y = (x - location) / scale; @@ -64,12 +64,12 @@ public final class Cauchy { } if (scale <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } double x2 = (x - location) / scale; if (Double.isNaN(x2)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(x2)) { @@ -116,7 +116,7 @@ public final class Cauchy { if (scale == 0) { return location; } - return RMath.mlError(); + return RMathError.defaultError(); } boolean lowerTail = lowerTailIn; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Chisq.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Chisq.java index 62205497a7..45042cb049 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Chisq.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Chisq.java @@ -49,7 +49,7 @@ public final class Chisq { public static final class RChisq extends RandFunction1_Double { public static double rchisq(double df, RandomNumberProvider rand) { if (!Double.isFinite(df) || df < 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } return new RGamma().execute(df / 2.0, 2.0, rand); } 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 a6a5a767d9..d7f3839013 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 @@ -25,7 +25,7 @@ public class DBeta implements Function3_1 { } if (a < 0 || b < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x < 0 || x > 1) { return (DPQ.rd0(log)); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNorm.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNorm.java index 5f36543a93..bdccc0beeb 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNorm.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DNorm.java @@ -28,10 +28,10 @@ public final class DNorm implements Function3_1 { if (!Double.isFinite(sigma)) { return DPQ.rd0(giveLog); } else if (!Double.isFinite(x) && mu == x) { - return RMath.mlError(); + return RMathError.defaultError(); } else if (sigma <= 0) { if (sigma < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } return (x == mu) ? Double.POSITIVE_INFINITY : DPQ.rd0(giveLog); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java index 80f2b7da79..1d2abb3cff 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPQ.java @@ -183,7 +183,7 @@ public final class DPQ { // R_Q_P01_check public static void rqp01check(double p, boolean logP) throws EarlyReturn { if ((logP && p > 0) || (!logP && (p < 0 || p > 1))) { - throw new EarlyReturn(RMath.mlError()); + throw new EarlyReturn(RMathError.defaultError()); } } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPois.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPois.java index c60b2f0bd5..bc14734a76 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPois.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/DPois.java @@ -25,7 +25,7 @@ public final class DPois implements Function2_1 { return x + lambda; } if (lambda < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } try { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Df.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Df.java index ded5ed5057..90d58c8260 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Df.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Df.java @@ -30,7 +30,7 @@ public final class Df implements Function3_1 { } if (m <= 0 || n <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x < 0.) { return DPQ.rd0(giveLog); 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 6224589757..7ae62d4958 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 @@ -29,7 +29,7 @@ public final class Dt implements Function2_1 { } if (n <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(x)) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Exp.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Exp.java index e2cdac1583..76df1c61e9 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Exp.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Exp.java @@ -31,7 +31,7 @@ public final class Exp { } if (scale <= 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x < 0.) { @@ -45,7 +45,7 @@ public final class Exp { @Override public double execute(double scale, RandomNumberProvider rand) { if (!Double.isFinite(scale) || scale <= 0.0) { - return scale == 0. ? 0. : RMath.mlError(); + return scale == 0. ? 0. : RMathError.defaultError(); } return scale * rand.expRand(); } @@ -58,7 +58,7 @@ public final class Exp { return xIn + scale; } if (scale < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (xIn <= 0.) { @@ -79,7 +79,7 @@ public final class Exp { } if (scale < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } try { 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 64c88be84b..a4c8919161 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 @@ -1231,7 +1231,7 @@ public abstract class GammaFunctions { return localX + alph + scale; } if (alph < 0. || scale <= 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } localX /= scale; if (Double.isNaN(localX)) { /* eg. original x = scale = +Inf */ @@ -1282,7 +1282,7 @@ public abstract class GammaFunctions { int j; if (!RRuntime.isFinite(x) || !RRuntime.isFinite(np) || np == 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (Math.abs(x - np) < 0.1 * (x + np)) { @@ -1320,7 +1320,7 @@ public abstract class GammaFunctions { } if (sigma <= 0) { if (sigma < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } /* sigma == 0 */ return (localX == mu) ? Double.POSITIVE_INFINITY : rd0(giveLog); @@ -1344,7 +1344,7 @@ public abstract class GammaFunctions { return x + shape + scale; } if (shape < 0 || scale <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x < 0) { return rd0(giveLog); @@ -1393,7 +1393,7 @@ public abstract class GammaFunctions { } if (sigma <= 0) { if (sigma < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } /* sigma = 0 : */ return (localX < mu) ? rdt0(lowerTail, logp) : rdt1(lowerTail, logp); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Geom.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Geom.java index a01c809ff4..03670cdb79 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Geom.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Geom.java @@ -44,7 +44,7 @@ public final class Geom { @Override public double evaluate(double p, double prob, boolean lowerTail, boolean logP) { if (prob <= 0 || prob > 1) { - return RMath.mlError(); + return RMathError.defaultError(); } try { @@ -73,7 +73,7 @@ public final class Geom { return x + p; } if (p <= 0 || p > 1) { - return RMath.mlError(); + return RMathError.defaultError(); } try { @@ -98,7 +98,7 @@ public final class Geom { return xIn + p; } if (p <= 0 || p > 1) { - return RMath.mlError(); + return RMathError.defaultError(); } if (xIn < 0.) { @@ -126,7 +126,7 @@ public final class Geom { @Override public double execute(double p, RandomNumberProvider rand) { if (!Double.isFinite(p) || p <= 0 || p > 1) { - return RMath.mlError(); + return RMathError.defaultError(); } return RPois.rpois(rand.expRand() * ((1 - p) / p), rand); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LBeta.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LBeta.java index 8f997c3f58..c9a23be80b 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LBeta.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LBeta.java @@ -38,7 +38,7 @@ public final class LBeta { /* both arguments must be >= 0 */ if (p < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } else if (p == 0) { return Double.POSITIVE_INFINITY; } else if (!Double.isFinite(q)) { /* q == +Inf */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LogNormal.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LogNormal.java index b95f76cf44..9384ad6576 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LogNormal.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LogNormal.java @@ -29,7 +29,7 @@ public final class LogNormal { @Override public double execute(double meanlog, double sdlog, RandomNumberProvider rand) { if (Double.isNaN(meanlog) || !Double.isFinite(sdlog) || sdlog < 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } return Math.exp(rnorm.execute(meanlog, sdlog, rand)); } @@ -43,7 +43,7 @@ public final class LogNormal { } if (sdlog <= 0) { if (sdlog < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } // sdlog == 0 : return (Math.log(x) == meanlog) ? Double.POSITIVE_INFINITY : DPQ.rd0(giveLog); @@ -84,7 +84,7 @@ public final class LogNormal { return x + meanlog + sdlog; } if (sdlog < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x > 0) { return pnorm.evaluate(Math.log(x), meanlog, sdlog, lowerTail, logP); 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 45328c4693..a6bc1963fc 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 @@ -33,7 +33,7 @@ public final class Logis { return x + location + scale; } if (scale <= 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } x = TOMS708.fabs((x - location) / scale); @@ -57,7 +57,7 @@ public final class Logis { } if (scale < 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } if (scale == 0.) { return location; @@ -85,12 +85,12 @@ public final class Logis { return x + location + scale; } if (scale <= 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } x = (x - location) / scale; if (Double.isNaN(x)) { - return RMath.mlError(); + return RMathError.defaultError(); } try { @@ -123,7 +123,7 @@ public final class Logis { @Override public double execute(double location, double scale, RandomNumberProvider rand) { if (Double.isNaN(location) || !Double.isFinite(scale)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (scale == 0. || !Double.isFinite(location)) { 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 cdb6e310d7..16ab8bd2e3 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 @@ -23,7 +23,7 @@ public class PGamma implements Function3_2 { return xIn + alph + scale; } if (alph < 0 || scale < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } double x = xIn / scale; 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 cb67510db3..1d15fa3135 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 @@ -19,7 +19,7 @@ public 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.) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x < 0) { return DPQ.rdt0(lowerTail, logP); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pbinom.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pbinom.java index e61ab3cb1f..f0b796a884 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pbinom.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Pbinom.java @@ -34,7 +34,7 @@ public final class Pbinom implements StatsFunctions.Function3_2 { if (DPQ.nonint(size)) { nanProfile.enter(); DPQ.nointCheckWarning(size, "n"); - return RMath.mlError(); + return RMathError.defaultError(); } size = RMath.forceint(size); /* PR#8560: n=0 is a valid value */ 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 20373ea17d..fd2e60684a 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 @@ -34,7 +34,7 @@ public class Pt implements Function2_2 { } if (n <= 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(x)) { 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 bd34ff88ba..c704b4b594 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 @@ -31,7 +31,7 @@ import static com.oracle.truffle.r.library.stats.MathConstants.M_LN2; import static com.oracle.truffle.r.library.stats.Pbeta.pbetaRaw; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.r.library.stats.RMath.MLError; +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; @@ -48,7 +48,7 @@ public final class QBeta implements Function3_2 { } if (p < 0. || q < 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } // allowing p==0 and q==0 <==> treat as one- or two-point mass @@ -158,7 +158,7 @@ public final class QBeta implements Function3_2 { alpha, p, q, log_p, "alpha not in ", log_p ? "[-Inf, 0]" : "[0,1]"); // ML_ERR_return_NAN : - RMath.mlError(MLError.DOMAIN, ""); + RMathError.error(MLError.DOMAIN, ""); qb[0] = qb[1] = ML_NAN; return; } @@ -509,7 +509,7 @@ public final class QBeta implements Function3_2 { // -Inf // is ok if // (log_p) - RMath.mlError(MLError.DOMAIN, ""); + RMathError.error(MLError.DOMAIN, ""); qb[0] = qb[1] = ML_NAN; return; } @@ -561,7 +561,7 @@ public final class QBeta implements Function3_2 { /*-- NOT converged: Iteration count --*/ warned = true; - RMath.mlError(MLError.PRECISION, "qbeta"); + RMathError.error(MLError.PRECISION, "qbeta"); converged(log_p, qb); } @@ -586,7 +586,7 @@ public final class QBeta implements Function3_2 { // warn pbetaRaw(DBL_1__eps, // = 1 - eps pp, qq, true, true) > la + 2)) { - RMath.mlWarning(Message.QBETA_ACURACY_WARNING, (log_ ? ", log_" : ""), Math.abs(y - (log_ ? la : a))); + RMathError.warning(Message.QBETA_ACURACY_WARNING, (log_ ? ", log_" : ""), Math.abs(y - (log_ ? la : a))); } } @@ -600,7 +600,7 @@ public final class QBeta implements Function3_2 { private void finalStep(boolean log_p, double[] qb) { if (give_log_q) { // ==> use_log_x , too if (!use_log_x) { // (see if claim above is true) - RMath.mlWarning(Message.GENERIC, + RMathError.warning(Message.GENERIC, "qbeta() L_return, u_n=%g; give_log_q=true but use_log_x=false -- please report!", u_n); } diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QHyper.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QHyper.java index e0641de73b..b9bcbaca28 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QHyper.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/QHyper.java @@ -26,7 +26,7 @@ public final class QHyper { return pIn + nrIn + nbIn + nIn; } if (!Double.isFinite(pIn) || !Double.isFinite(nrIn) || !Double.isFinite(nbIn) || !Double.isFinite(nIn)) { - return RMath.mlError(); + return RMathError.defaultError(); } double nr = forceint(nrIn); @@ -34,7 +34,7 @@ public final class QHyper { double capN = nr + nb; double n = forceint(nIn); if (nr < 0 || nb < 0 || n < 0 || n > capN) { - return RMath.mlError(); + return RMathError.defaultError(); } /* 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 9803bad38d..34cbad5586 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 @@ -26,10 +26,10 @@ public class QPois implements Function2_2 { return p + lambda; } if (!Double.isFinite(lambda)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (lambda < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (lambda == 0) { return 0; 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 18488ebd3a..4c02746737 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 @@ -28,7 +28,7 @@ public final class Qf implements Function3_2 { } if (df1 <= 0. || df2 <= 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } try { 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 5e97ff315f..2c4fd0191a 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 @@ -47,7 +47,7 @@ public class Qt implements Function2_2 { } if (ndf <= 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (ndf < 1) { /* based on qnt */ @@ -89,7 +89,7 @@ public class Qt implements Function2_2 { } while ((ux - lx) / Math.abs(nx) > accu && ++iter < 1000); if (iter >= 1000) { - return RMath.mlError(); + return RMathError.defaultError(); } return 0.5 * (lx + ux); 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 714014b84e..7fab48d938 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 @@ -27,7 +27,7 @@ public final class RBeta extends RandFunction2_Double { @Override public double execute(double aa, double bb, RandomNumberProvider rand) { if (Double.isNaN(aa) || Double.isNaN(bb) || aa < 0. || bb < 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(aa) && !Double.isFinite(bb)) { // a = b = Inf : all mass at 1/2 return 0.5; 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 c5b40e24c4..8d344b1625 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 @@ -66,13 +66,13 @@ public class RGamma extends RandFunction2_Double { double retVal; if (Double.isNaN(a) || Double.isNaN(scale)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (a <= 0.0 || scale <= 0.0) { if (scale == 0. || a == 0.) { return 0.; } - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(a) || !Double.isFinite(scale)) { return Double.POSITIVE_INFINITY; 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 197316d6df..a233c0c549 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 @@ -95,7 +95,7 @@ public final class RHyper extends RandFunction3_Double { /* check parameter validity */ if (!Double.isFinite(nn1in) || !Double.isFinite(nn2in) || !Double.isFinite(kkin)) { - return RMath.mlError(); + return RMathError.defaultError(); } double nn1int = forceint(nn1in); @@ -103,7 +103,7 @@ public final class RHyper extends RandFunction3_Double { double kkint = forceint(kkin); if (nn1int < 0 || nn2int < 0 || kkint < 0 || kkint > nn1int + nn2int) { - return RMath.mlError(); + return RMathError.defaultError(); } if (nn1int >= Integer.MAX_VALUE || nn2int >= Integer.MAX_VALUE || kkint >= Integer.MAX_VALUE) { /* @@ -227,7 +227,7 @@ public final class RHyper extends RandFunction3_Double { nUv++; if (nUv >= 10000) { RError.warning(RError.SHOW_CALLER, Message.GENERIC, String.format("rhyper() branch III: giving up after %d rejections", nUv)); - return RMath.mlError(); + return RMathError.defaultError(); } if (u < p1) { /* rectangular region */ 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 644dff67b5..a7f1cd01da 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 @@ -16,43 +16,19 @@ import static com.oracle.truffle.r.library.stats.LBeta.lbeta; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; /** * Encapsulates functions to be found in Rmath.h or in nmath directory in GnuR except for random - * distribution related functions, which usually have their own files. + * distribution related functions, which usually have their own files, and other well defined groups + * of functions/macros referenced below. * * @see DPQ + * @see RMathError + * @see MathConstants */ public class RMath { - public enum MLError { - DOMAIN, - RANGE, - NOCONV, - PRECISION, - UNDERFLOW - } - - /** - * Corresponds to macro {@code ML_ERR_return_NAN} in GnuR. - */ - public static double mlError() { - return mlError(MLError.DOMAIN, ""); - } - - /** - * Corresponds to macro {@code ML_ERR} in GnuR. TODO: raise corresponding warning - */ - public static double mlError(@SuppressWarnings("unused") MLError error, @SuppressWarnings("unused") String message) { - return Double.NaN; - } - - public static void mlWarning(RError.Message message, Object... args) { - RError.warning(null, message, args); - } - public static boolean mlValid(double d) { return !Double.isNaN(d); } @@ -99,7 +75,7 @@ public class RMath { return x; } if (!Double.isFinite(x)) { - return mlError(); + return RMathError.defaultError(); } double x2 = fmod(x, 1.); // tan(pi(x + k)) == tan(pi x) for all integer k diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMathError.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMathError.java new file mode 100644 index 0000000000..31ab7145dc --- /dev/null +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMathError.java @@ -0,0 +1,70 @@ +/* + * This material is distributed under the GNU General Public License + * Version 2. You may review the terms of this license at + * http://www.gnu.org/licenses/gpl-2.0.html + * + * Copyright (c) 1998-2016, The R Core Team + * Copyright (c) 2016, Oracle and/or its affiliates + * + * All rights reserved. + */ +package com.oracle.truffle.r.library.stats; + +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RError.Message; + +/** + * Encapsulates functionality related to errors/warnings reporting in FastR port of R's math + * library. Contains methods that correspond to various macros such as {@code ML_ERROR} or + * {@code ML_ERR_return_NAN}. + */ +public final class RMathError { + private RMathError() { + // only static members + } + + public enum MLError { + DOMAIN(Message.GENERIC), + RANGE(Message.ML_ERROR_RANGE), + NOCONV(Message.ML_ERROR_NOCONV), + PRECISION(Message.ML_ERROR_PRECISION), + UNDERFLOW(Message.ML_ERROR_UNDERFLOW); + + private final RError.Message message; + + MLError(Message message) { + this.message = message; + } + + public void warning(String arg) { + RError.warning(RError.SHOW_CALLER, message, arg); + } + } + + /** + * Corresponds to macro {@code ML_ERR_return_NAN} in GnuR. We also do not report the default + * warning directly and let the caller handle the {@code NaN} value. + */ + public static double defaultError() { + return Double.NaN; + } + + /** + * Corresponds to macro {@code ML_ERR} in GnuR. As long as the error is not the default + * {@link MLError#DOMAIN} a warning is reported by this method, otherwise the caller should + * return {@code NaN}, which should be handled by the caller's caller. + */ + public static double error(@SuppressWarnings("unused") MLError error, @SuppressWarnings("unused") String messageArg) { + if (error != MLError.DOMAIN) { + error.warning(messageArg); + } + return Double.NaN; + } + + /** + * Corresponds to macros {@code MATHLIB_WARNINGX} in GnuR. + */ + public static void warning(RError.Message message, Object... args) { + RError.warning(RError.SHOW_CALLER, message, args); + } +} diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNbinomMu.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNbinomMu.java index cfbb7798c6..cf5f8b0401 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNbinomMu.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNbinomMu.java @@ -20,7 +20,7 @@ public final class RNbinomMu extends RandFunction2_Double { @Override public double execute(double initialSize, double mu, RandomNumberProvider rand) { if (!Double.isFinite(mu) || Double.isNaN(initialSize) || initialSize <= 0 || mu < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } double size = Double.isFinite(initialSize) ? initialSize : Double.MAX_VALUE / 2.; return (mu == 0) ? 0 : RPois.rpois(rgamma.execute(size, mu / size, rand), rand); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNchisq.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNchisq.java index 12dc037c2c..f0d523cf14 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNchisq.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RNchisq.java @@ -22,7 +22,7 @@ public final class RNchisq extends RandFunction2_Double { @Override public double execute(double df, double lambda, RandomNumberProvider rand) { if (!Double.isFinite(df) || !Double.isFinite(lambda) || df < 0. || lambda < 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } if (lambda == 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 420a81dc44..8ed6d66484 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 @@ -80,7 +80,7 @@ public final class RPois extends RandFunction1_Double { boolean newBigMu = false; if (!Double.isFinite(mu) || mu < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (mu <= 0.) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RWeibull.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RWeibull.java index 638e406f54..78d9e38318 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RWeibull.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RWeibull.java @@ -18,7 +18,7 @@ public final class RWeibull extends RandFunction2_Double { @Override public double execute(double shape, double scale, RandomNumberProvider rand) { if (!Double.isFinite(shape) || !Double.isFinite(scale) || shape <= 0. || scale <= 0.) { - return scale == 0. ? 0. : RMath.mlError(); + return scale == 0. ? 0. : RMathError.defaultError(); } return scale * Math.pow(-Math.log(rand.unifRand()), 1.0 / shape); diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rf.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rf.java index be70cde936..0c1643b024 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rf.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rf.java @@ -18,7 +18,7 @@ public final class Rf extends RandFunction2_Double { @Override public double execute(double n1, double n2, RandomNumberProvider rand) { if (Double.isNaN(n1) || Double.isNaN(n2) || n1 <= 0. || n2 <= 0.) { - return RMath.mlError(); + return RMathError.defaultError(); } double v1; diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rnorm.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rnorm.java index be60d6863d..5cdb828e58 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rnorm.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rnorm.java @@ -29,7 +29,7 @@ public final class Rnorm extends RandFunction2_Double { double mu = muValueProfile.profile(muIn); if (Double.isNaN(mu) || !Double.isFinite(sigma) || sigma < 0.) { errorProfile.enter(); - return RMath.mlError(); + return RMathError.defaultError(); } if (zeroSigmaProfile.profile(sigma == 0. || !Double.isFinite(mu))) { return mu; /* includes mu = +/- Inf with finite sigma */ diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rt.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rt.java index a319beed65..3804a50961 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rt.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Rt.java @@ -20,7 +20,7 @@ public final class Rt extends RandFunction1_Double { @Override public double execute(double df, RandomNumberProvider rand) { if (Double.isNaN(df) || df <= 0.0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (!Double.isFinite(df)) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Signrank.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Signrank.java index f13e125ea9..662ca85255 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Signrank.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Signrank.java @@ -30,12 +30,12 @@ public final class Signrank { if (Double.isInfinite(nIn)) { // In GnuR these "results" seem to be generated due to the behaviour of R_forceint, // and the "(int) n" cast, which ends up casting +/-infinity to integer... - return nIn < 0 ? RMath.mlError() : 0; + return nIn < 0 ? RMathError.defaultError() : 0; } double n = forceint(nIn); if (n < 0) { - return RMath.mlError(); + return RMathError.defaultError(); } if (n == 0) { diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Unif.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Unif.java index 3110d7e227..b708907b8e 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Unif.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/Unif.java @@ -38,7 +38,7 @@ public final class Unif { double max = maxValueProfile.profile(maxIn); if (!RRuntime.isFinite(min) || !RRuntime.isFinite(max) || max < min) { errorProfile.enter(); - return RMath.mlError(); + return RMathError.defaultError(); } if (minEqualsMaxProfile.profile(min == max)) { return min; @@ -54,7 +54,7 @@ public final class Unif { return x + min + max; } if (max < min || !Double.isFinite(min) || !Double.isFinite(max)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (x >= max) { return DPQ.rdt1(lowerTail, logP); @@ -77,7 +77,7 @@ public final class Unif { return x + min + max; } if (max <= min) { - return RMath.mlError(); + return RMathError.defaultError(); } if (min <= x && x <= max) { return giveLog ? -Math.log(max - min) : 1. / (max - min); @@ -101,7 +101,7 @@ public final class Unif { } if (max < min || !Double.isFinite(min) || !Double.isFinite(max)) { - return RMath.mlError(); + return RMathError.defaultError(); } if (max == min) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index e61db9860a..71a773f403 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -282,6 +282,11 @@ public final class RError extends RuntimeException { ITEMS_NOT_MULTIPLE("number of items read is not a multiple of the number of columns"), TRACEMEM_NOT_NULL("cannot trace NULL"), INPUT_MUST_BE_STRING("input must be a character string"), + // mathlib errors/warnings + ML_ERROR_RANGE("value out of range in '%s'"), + ML_ERROR_NOCONV("convergence failed in '%s'"), + ML_ERROR_PRECISION("full precision may not have been achieved in '%s'"), + ML_ERROR_UNDERFLOW("underflow occurred in '%s'"), // below: GNU R gives also expression for the argument NOT_FUNCTION("'%s' is not a function, character or symbol"), NOT_A_FUNCTION("'%s' is not a function"), 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 4b5b757cc6..ed629c5bf0 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 @@ -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 { - Utils.writeStderr(String.format("There were %d or more warnings (use warnings() to see the first %d)", nWarnings, errorHandlingState.maxWarnings), true); + Utils.writeStderr(String.format("There were %d or more warnings (use warnings() to see the first %d)", errorHandlingState.maxWarnings, errorHandlingState.maxWarnings), true); } } Object[] wData = new Object[nWarnings]; diff --git a/mx.fastr/copyrights/gnu_r.core.copyright.star.regex b/mx.fastr/copyrights/gnu_r.core.copyright.star.regex index e625a25f30..b89f17651f 100644 --- a/mx.fastr/copyrights/gnu_r.core.copyright.star.regex +++ b/mx.fastr/copyrights/gnu_r.core.copyright.star.regex @@ -1 +1 @@ -/\*\n \* This material is distributed under the GNU General Public License\n \* Version 2. You may review the terms of this license at\n \* http://www.gnu.org/licenses/gpl-2.0.html\n \*\n \* Copyright \(c\) (?:[1-2][09][0-9][0-9]--)?[1-2][09][0-9][0-9], The R Core Team\n \* Copyright \(c\) (?:(20[0-9][0-9]), )?(20[0-9][0-9]), Oracle and/or its affiliates\n \*\n \* All rights reserved.\n \*/\n.* \ No newline at end of file +/\*\n \* This material is distributed under the GNU General Public License\n \* Version 2. You may review the terms of this license at\n \* http://www.gnu.org/licenses/gpl-2.0.html\n \*\n \* Copyright \(c\) (?:[1-2][09][0-9][0-9]--?)?[1-2][09][0-9][0-9], The R Core Team\n \* Copyright \(c\) (?:(20[0-9][0-9]), )?(20[0-9][0-9]), Oracle and/or its affiliates\n \*\n \* All rights reserved.\n \*/\n.* diff --git a/mx.fastr/copyrights/overrides b/mx.fastr/copyrights/overrides index 3a48c15e4f..f44ee24f90 100644 --- a/mx.fastr/copyrights/overrides +++ b/mx.fastr/copyrights/overrides @@ -69,6 +69,7 @@ com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/SplineFuncti com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/StatsFunctions.java,gnu_r_gentleman_ihaka.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RandGenerationFunctions.java,gnu_r_gentleman_ihaka.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMath.java,gnu_r_ihaka.copyright +com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/RMathError.java,gnu_r.core.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/LogNormal.java,gnu_r_ihaka.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/MathConstants.java,gnu_r_ihaka.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/TOMS708.java,gnu_r.copyright -- GitLab