Changed all the licence notices in all the files.
[pspp-builds.git] / src / sample.c
index 84f2e8992f65340a5062be3afc7f7afe682dffcb..631736d013f2083259d8b851a62ea76459253268 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
 
 #include <config.h>
+#include <gsl/gsl_rng.h>
+#include <limits.h>
 #include <stdio.h>
 #include <math.h>
 #include "alloc.h"
 #include "command.h"
 #include "error.h"
 #include "lexer.h"
-#include "random.h"
+#include "settings.h"
 #include "str.h"
 #include "var.h"
 
-#undef DEBUGGING
-/*#define DEBUGGING 1 */
 #include "debug-print.h"
 
 /* The two different types of samples. */
@@ -45,11 +45,11 @@ struct sample_trns
     struct trns_header h;
     int type;                  /* One of TYPE_*. */
     int n, N;                  /* TYPE_A_FROM_B: n from N. */
-    int m, t;                  /* TYPE_A_FROM_B: # selected so far; # so far. */
-    int frac;                  /* TYPE_FRACTION: a fraction out of 65536. */
+    int m, t;                  /* TYPE_A_FROM_B: # picked so far; # so far. */
+    unsigned frac;              /* TYPE_FRACTION: a fraction of UINT_MAX. */
   };
 
-int sample_trns_proc (struct trns_header *, struct ccase *);
+static trns_proc_func sample_trns_proc;
 
 int
 cmd_sample (void)
@@ -58,14 +58,15 @@ cmd_sample (void)
 
   int type;
   int a, b;
-  int frac;
-
-  lex_match_id ("SAMPLE");
+  unsigned frac;
 
   if (!lex_force_num ())
     return CMD_FAILURE;
-  if (!lex_integer_p ())
+  if (!lex_is_integer ())
     {
+      unsigned long min = gsl_rng_min (get_rng ());
+      unsigned long max = gsl_rng_max (get_rng ());
+
       type = TYPE_FRACTION;
       if (tokval <= 0 || tokval >= 1)
        {
@@ -74,7 +75,7 @@ cmd_sample (void)
          return CMD_FAILURE;
        }
          
-      frac = tokval * 65536;
+      frac = tokval * (max - min) + min;
       a = b = 0;
     }
   else
@@ -99,13 +100,6 @@ cmd_sample (void)
     }
   lex_get ();
 
-#if DEBUGGING
-  if (type == TYPE_FRACTION)
-    printf ("SAMPLE %g.\n", frac / 65536.);
-  else
-    printf ("SAMPLE %d FROM %d.\n", a, b);
-#endif
-
   trns = xmalloc (sizeof *trns);
   trns->h.proc = sample_trns_proc;
   trns->h.free = NULL;
@@ -119,19 +113,26 @@ cmd_sample (void)
   return lex_end_of_command ();
 }
 
-int
-sample_trns_proc (struct trns_header * trns, struct ccase *c unused)
+/* Executes a SAMPLE transformation. */
+static int
+sample_trns_proc (struct trns_header * trns, struct ccase *c UNUSED,
+                  int case_num UNUSED)
 {
   struct sample_trns *t = (struct sample_trns *) trns;
   double U;
 
-  if (t->type == TYPE_FRACTION)
-    return (rand_simple (0x10000) <= t->frac) - 2;
+  if (t->type == TYPE_FRACTION) 
+    {
+      if (gsl_rng_get (get_rng ()) <= t->frac)
+        return -1;
+      else
+        return -2;
+    }
 
   if (t->m >= t->n)
     return -2;
 
-  U = rand_uniform (1);
+  U = gsl_rng_uniform (get_rng ());
   if ((t->N - t->t) * U >= t->n - t->m)
     {
       t->t++;