REGRESSION: Add parser framework for confidence interval
[pspp] / src / language / stats / reliability.c
index 92f4ac1c22b8a8730a41e3f891a59603b2250527..a4c4b862fdb344f98a3cf2a49cce3f2ee39265ba 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include "data/casegrouper.h"
 #include "data/casereader.h"
+#include "data/dataset.h"
 #include "data/dictionary.h"
 #include "data/format.h"
 #include "data/missing-values.h"
-#include "data/procedure.h"
 #include "language/command.h"
 #include "language/lexer/lexer.h"
 #include "language/lexer/variable-parser.h"
@@ -108,6 +108,27 @@ struct reliability
 
 static bool run_reliability (struct dataset *ds, const struct reliability *reliability);
 
+static void
+reliability_destroy (struct reliability *rel)
+{
+  int j;
+  ds_destroy (&rel->scale_name);
+  if (rel->sc)
+    for (j = 0; j < rel->n_sc ; ++j)
+      {
+       int x;
+       free (rel->sc[j].items);
+        moments1_destroy (rel->sc[j].total);
+        if (rel->sc[j].m)
+          for (x = 0; x < rel->sc[j].n_items; ++x)
+            free (rel->sc[j].m[x]);
+       free (rel->sc[j].m);
+      }
+
+  free (rel->sc);
+  free (rel->variables);
+}
+
 int
 cmd_reliability (struct lexer *lexer, struct dataset *ds)
 {
@@ -117,12 +138,14 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
   reliability.n_variables = 0;
   reliability.variables = NULL;
   reliability.model = MODEL_ALPHA;
-    reliability.exclude = MV_ANY;
+  reliability.exclude = MV_ANY;
   reliability.summary = 0;
-
+  reliability.n_sc = 0;
+  reliability.sc = NULL;
   reliability.wv = dict_get_weight (dict);
-
   reliability.total_start = 0;
+  ds_init_empty (&reliability.scale_name);
+
 
   lex_match (lexer, T_SLASH);
 
@@ -149,7 +172,7 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
       reliability.n_sc = 1;
       reliability.sc = xzalloc (sizeof (struct cronbach) * reliability.n_sc);
 
-      ds_init_cstr (&reliability.scale_name, "ANY");
+      ds_assign_cstr (&reliability.scale_name, "ANY");
 
       c = &reliability.sc[0];
       c->n_items = reliability.n_variables;
@@ -174,7 +197,7 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
          if ( ! lex_force_string (lexer) ) 
            goto error;
 
-         ds_init_substring (&reliability.scale_name, lex_tokss (lexer));
+         ds_assign_substring (&reliability.scale_name, lex_tokss (lexer));
 
          lex_get (lexer);
 
@@ -185,7 +208,7 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
 
          vs = const_var_set_create_from_array (reliability.variables, reliability.n_variables);
 
-
+         free (reliability.sc->items);
          if (!parse_const_var_set_vars (lexer, vs, &reliability.sc->items, &reliability.sc->n_items, 0))
            {
              const_var_set_destroy (vs);
@@ -263,6 +286,12 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
       int i;
       const struct cronbach *s;
 
+      if ( reliability.split_point >= reliability.n_variables)
+        {
+          msg (ME, _("The split point must be less than the number of variables"));
+          goto error;
+        }
+
       reliability.n_sc += 2 ;
       reliability.sc = xrealloc (reliability.sc, sizeof (struct cronbach) * reliability.n_sc);
 
@@ -319,11 +348,11 @@ cmd_reliability (struct lexer *lexer, struct dataset *ds)
   if ( ! run_reliability (ds, &reliability)) 
     goto error;
 
-  free (reliability.variables);
+  reliability_destroy (&reliability);
   return CMD_SUCCESS;
 
  error:
-  free (reliability.variables);
+  reliability_destroy (&reliability);
   return CMD_FAILURE;
 }
 
@@ -346,6 +375,19 @@ run_reliability (struct dataset *ds, const struct reliability *reliability)
   struct casereader *group;
 
   struct casegrouper *grouper = casegrouper_create_splits (proc_open (ds), dict);
+  int si;
+
+  for (si = 0 ; si < reliability->n_sc; ++si)
+    {
+      struct cronbach *s = &reliability->sc[si];
+      int i;
+
+      s->m = xzalloc (sizeof *s->m * s->n_items);
+      s->total = moments1_create (MOMENT_VARIANCE);
+
+      for (i = 0 ; i < s->n_items ; ++i )
+       s->m[i] = moments1_create (MOMENT_VARIANCE);
+    }
 
 
   while (casegrouper_get_next_group (grouper, &group))
@@ -410,11 +452,10 @@ do_reliability (struct casereader *input, struct dataset *ds,
     {
       struct cronbach *s = &rel->sc[si];
 
-      s->m = xzalloc (sizeof (s->m) * s->n_items);
-      s->total = moments1_create (MOMENT_VARIANCE);
+      moments1_clear (s->total);
 
       for (i = 0 ; i < s->n_items ; ++i )
-       s->m[i] = moments1_create (MOMENT_VARIANCE);
+        moments1_clear (s->m[i]);
     }
 
   input = casereader_create_filter_missing (input,
@@ -472,7 +513,7 @@ do_reliability (struct casereader *input, struct dataset *ds,
        alpha (s->n_items, s->sum_of_variances, s->variance_of_sums);
     }
 
-  text_item_submit (text_item_create_format (TEXT_ITEM_PARAGRAPH, "Scale: %s",
+  text_item_submit (text_item_create_format (TEXT_ITEM_PARAGRAPH, _("Scale: %s"),
                                              ds_cstr (&rel->scale_name)));
 
   case_processing_summary (n_valid, n_missing, dataset_dict (ds));