more summary testing
[pspp] / src / language / stats / ctables.c
index 5aa92f7e46ee6743d3b9611f0e7ba6783d47bd86..b2274f3e44d2d3abc2f5644086385eba27ce4b93 100644 (file)
@@ -2551,11 +2551,14 @@ ctables_summary_init (union ctables_summary *s,
       break;
 
     case CTSF_MEAN:
+    case CTSF_SUM:
+    case CTSF_areaPCT_SUM:
+      s->moments = moments1_create (MOMENT_MEAN);
+      break;
+
     case CTSF_SEMEAN:
     case CTSF_STDDEV:
-    case CTSF_SUM:
     case CTSF_VARIANCE:
-    case CTSF_areaPCT_SUM:
       s->moments = moments1_create (MOMENT_VARIANCE);
       break;
 
@@ -2714,11 +2717,15 @@ ctables_summary_add (union ctables_summary *s,
     case CTSF_STDDEV:
     case CTSF_SUM:
     case CTSF_VARIANCE:
-    case CTSF_areaPCT_SUM:
       if (!is_scale_missing)
         moments1_add (s->moments, value->f, ss->weighted ? e_weight : 1.0);
       break;
 
+    case CTSF_areaPCT_SUM:
+      if (!is_missing && !is_scale_missing)
+        moments1_add (s->moments, value->f, ss->weighted ? e_weight : 1.0);
+      break;
+
     case CTSF_MEDIAN:
     case CTSF_MODE:
     case CTSF_PTILE:
@@ -3726,8 +3733,8 @@ ctables_table_add_section (struct ctables_table *t, enum pivot_axis_type a,
             for (size_t i = 0; i < nest->n; i++)
               hmap_init (&s->occurrences[a][i]);
         }
-      for (size_t i = 0; i < N_CTATS; i++)
-        hmap_init (&s->areas[i]);
+      for (enum ctables_area_type at = 0; at < N_CTATS; at++)
+        hmap_init (&s->areas[at]);
     }
 }
 
@@ -4677,11 +4684,11 @@ ctables_prepare_table (struct ctables_table *t)
                     atb = PIVOT_AXIS_ROW;
                   }
 
-                if (((at == CTAT_LAYERCOL || at == CTAT_LAYERROW)
-                     && a == atb && t->label_axis[a] != a)
-                    || (at == CTAT_LAYER
-                        && a != PIVOT_AXIS_LAYER
-                        && t->label_axis[a] == PIVOT_AXIS_LAYER))
+                if (at == CTAT_LAYER
+                    ? a != PIVOT_AXIS_LAYER && t->label_axis[a] == PIVOT_AXIS_LAYER
+                    : at == CTAT_LAYERCOL || at == CTAT_LAYERROW
+                    ? a == atb && t->label_axis[a] != a
+                    : false)
                   {
                     for (size_t k = nest->n - 1; k < nest->n; k--)
                       if (k != nest->scale_idx)
@@ -4692,29 +4699,26 @@ ctables_prepare_table (struct ctables_table *t)
                     continue;
                   }
 
-                if (at == CTAT_LAYER ? a == PIVOT_AXIS_LAYER
-                    : at == CTAT_LAYERROW || at == CTAT_LAYERCOL ? a != atb
-                    : at == CTAT_TABLE ? false
-                    : true)
-                  for (size_t k = 0; k < nest->n; k++)
-                    {
-                      if (k == nest->scale_idx)
-                        continue;
-                      nest->areas[at][nest->n_areas[at]++] = k;
-                    }
+                if (at == CTAT_LAYER ? a != PIVOT_AXIS_LAYER
+                    : at == CTAT_LAYERROW || at == CTAT_LAYERCOL ? a == atb
+                    : at == CTAT_TABLE ? true
+                    : false)
+                  continue;
 
-                int n_drop = 0;
+                for (size_t k = 0; k < nest->n; k++)
+                  if (k != nest->scale_idx)
+                    nest->areas[at][nest->n_areas[at]++] = k;
+
+                int n_drop;
                 switch (at)
                   {
                   case CTAT_SUBTABLE:
-                    if (t->clabels_from_axis == PIVOT_AXIS_LAYER)
-                      n_drop = a != PIVOT_AXIS_LAYER;
-                    else if (t->clabels_to_axis != PIVOT_AXIS_LAYER)
-                      n_drop = a == t->clabels_from_axis ? 2 : 0;
-                    else if (a == t->clabels_from_axis)
-                      n_drop = -1;
-                    else
-                      n_drop = a != PIVOT_AXIS_LAYER;
+#define L PIVOT_AXIS_LAYER
+                    n_drop = (t->clabels_from_axis == L ? a != L
+                              : t->clabels_to_axis == L ? (t->clabels_from_axis == a ? -1 : a != L)
+                              : t->clabels_from_axis == a ? 2
+                              : 0);
+#undef L
                     break;
 
                   case CTAT_LAYERROW:
@@ -4724,19 +4728,16 @@ ctables_prepare_table (struct ctables_table *t)
 
                   case CTAT_ROW:
                   case CTAT_COL:
-                    if (a == atb)
-                      {
-                        if (t->clabels_from_axis == atb)
-                          n_drop = -1;
-                        else if (t->clabels_to_axis != atb)
-                          n_drop = 1;
-                      }
-                    else if (a == ata)
-                      n_drop = t->label_axis[ata] == atb;
+                    n_drop = (a == ata ? t->label_axis[ata] == atb
+                              : a != atb ? 0
+                              : t->clabels_from_axis == atb ? -1
+                              : t->clabels_to_axis != atb ? 1
+                              : 0);
                     break;
 
                   case CTAT_LAYER:
                   case CTAT_TABLE:
+                    n_drop = 0;
                     break;
                   }
 
@@ -5195,8 +5196,8 @@ ctables_section_uninit (struct ctables_section *s)
     }
 
   hmap_destroy (&s->cells);
-  for (size_t i = 0; i < N_CTATS; i++)
-    hmap_destroy (&s->areas[i]);
+  for (enum ctables_area_type at = 0; at < N_CTATS; at++)
+    hmap_destroy (&s->areas[at]);
 }
 
 static void