[gnumeric] sstest: test RANDGAMMA



commit ab6af669162e90fc164cb0349dd8d0f9789fe2aa
Author: Morten Welinder <terra gnome org>
Date:   Fri Mar 20 13:38:09 2015 -0400

    sstest: test RANDGAMMA
    
    Also improve docs for RANDGAMMA.

 ChangeLog                     |    1 +
 plugins/fn-random/functions.c |    4 +-
 src/sstest.c                  |   69 ++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 71 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index a9f1055..a597669 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,7 @@
        (test_random_randnegbinom): New test.
        (test_random_randlog): New test.
        (test_random_randdiscrete): New test.
+       (test_random_randgamma): New test.
 
        * src/gnm-random.c (random_logarithmic): Fix.  See #746449.
 
diff --git a/plugins/fn-random/functions.c b/plugins/fn-random/functions.c
index 3b8dfe5..0d94415 100644
--- a/plugins/fn-random/functions.c
+++ b/plugins/fn-random/functions.c
@@ -472,8 +472,8 @@ gnumeric_randrayleightail (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 static GnmFuncHelp const help_randgamma[] = {
         { GNM_FUNC_HELP_NAME, F_("RANDGAMMA:random variate from a Gamma distribution") },
-        { GNM_FUNC_HELP_ARG, F_("a:parameter of the Gamma distribution") },
-        { GNM_FUNC_HELP_ARG, F_("b:parameter of the Gamma distribution") },
+        { GNM_FUNC_HELP_ARG, F_("a:shape parameter of the Gamma distribution") },
+        { GNM_FUNC_HELP_ARG, F_("b:scale parameter of the Gamma distribution") },
        { GNM_FUNC_HELP_NOTE, F_("If @{a} \xe2\x89\xa4 0, RANDGAMMA returns #NUM!") },
         { GNM_FUNC_HELP_EXAMPLES, "=RANDGAMMA(1,2)" },
         { GNM_FUNC_HELP_EXAMPLES, "=RANDGAMMA(1,2)" },
diff --git a/src/sstest.c b/src/sstest.c
index 4009e0c..a1ee5bd 100644
--- a/src/sstest.c
+++ b/src/sstest.c
@@ -1004,6 +1004,73 @@ test_random_randexp (int N)
 }
 
 static void
+test_random_randgamma (int N)
+{
+       gnm_float mean, var, skew, kurt;
+       gnm_float *vals;
+       gboolean ok;
+       gnm_float param_shape = gnm_floor (1 / (0.0001 + gnm_pow (random_01 (), 6)));
+       gnm_float param_scale = 0.001 + gnm_pow (random_01 (), 4) * 1000;
+       gnm_float mean_target = param_shape * param_scale;
+       gnm_float var_target = mean_target * param_scale;
+       gnm_float skew_target = 2 / gnm_sqrt (param_shape);
+       gnm_float kurt_target = 6 / param_shape;
+       char *expr;
+       gnm_float T;
+       int i;
+
+       expr = g_strdup_printf ("=RANDGAMMA(%.0" GNM_FORMAT_f ",%.10" GNM_FORMAT_g ")", param_shape, 
param_scale);
+       vals = test_random_1 (N, expr, &mean, &var, &skew, &kurt);
+       g_free (expr);
+
+       ok = TRUE;
+       for (i = 0; i < N; i++) {
+               gnm_float r = vals[i];
+               if (!(r > 0 && gnm_finite (r))) {
+                       g_printerr ("Range failure.\n");
+                       ok = FALSE;
+                       break;
+               }
+       }
+       g_free (vals);
+
+       T = mean_target;
+       g_printerr ("Expected mean: %.10" GNM_FORMAT_g "\n", T);
+       if (!(gnm_abs (mean - T) < 3 * gnm_sqrt (var_target / N))) {
+               g_printerr ("Mean failure.\n");
+               ok = FALSE;
+       }
+
+       T = var_target;
+       g_printerr ("Expected var: %.10" GNM_FORMAT_g "\n", T);
+       if (!(var >= 0 && gnm_finite (var))) {
+               /* That is a very simplistic test! */
+               g_printerr ("Var failure.\n");
+               ok = FALSE;
+       }
+
+       T = skew_target;
+       g_printerr ("Expected skew: %.10" GNM_FORMAT_g "\n", T);
+       if (!gnm_finite (skew)) {
+               /* That is a very simplistic test! */
+               g_printerr ("Skew failure.\n");
+               ok = FALSE;
+       }
+
+       T = kurt_target;
+       g_printerr ("Expected kurt: %.10" GNM_FORMAT_g "\n", T);
+       if (!(kurt >= -3 && gnm_finite (kurt))) {
+               /* That is a very simplistic test! */
+               g_printerr ("Kurt failure.\n");
+               ok = FALSE;
+       }
+
+       if (ok)
+               g_printerr ("OK\n");
+       g_printerr ("\n");
+}
+
+static void
 test_random_randbinom (int N)
 {
        gnm_float mean, var, skew, kurt;
@@ -1429,6 +1496,7 @@ test_random (void)
        test_random_randnorm (High_N);
        test_random_randsnorm (High_N);
        test_random_randexp (N);
+       test_random_randgamma (N);
 
        test_random_randbernoulli (N);
        test_random_randdiscrete (N);
@@ -1445,7 +1513,6 @@ test_random (void)
        test_random_randchisq (N);
        test_random_randexppow (N);
        test_random_randfdist (N);
-       test_random_randgamma (N);
        test_random_randnormtail (N);
        test_random_randgumbel (N);
        test_random_randhyperg (N);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]