summaries work
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 2 Jan 2022 01:41:50 +0000 (17:41 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 13 Mar 2022 23:56:02 +0000 (16:56 -0700)
src/language/stats/ctables.c

index 4f23b3607d46aab491e832c407bc1a00ad8a40cd..26837f1b93c61fae51bd946c5f2c6b4b7238e242 100644 (file)
@@ -1406,7 +1406,6 @@ union ctables_summary
     /* XXX percentiles, median, mode, multiple response */
   };
 
-#if 0
 static void
 ctables_summary_init (union ctables_summary *s,
                       const struct ctables_summary_spec *ss)
@@ -1496,7 +1495,7 @@ ctables_summary_init (union ctables_summary *s,
     }
 }
 
-static void
+static void UNUSED
 ctables_summary_uninit (union ctables_summary *s,
                         const struct ctables_summary_spec *ss)
 {
@@ -1811,7 +1810,6 @@ ctables_summary_value (union ctables_summary *s,
 
   NOT_REACHED ();
 }
-#endif
 
 struct ctables_freq
   {
@@ -1825,8 +1823,7 @@ struct ctables_freq
       }
     axes[PIVOT_N_AXES];
 
-    //union ctables_summary *summaries;
-    double count;
+    union ctables_summary *summaries;
   };
 
 #if 0
@@ -1912,6 +1909,7 @@ ctables_freqtab_insert (struct ctables_table *t,
     [PIVOT_AXIS_COLUMN] = ic,
     [PIVOT_AXIS_LAYER] = il,
   };
+  const struct var_array *ss = &t->vaas[t->summary_axis].vas[ix[t->summary_axis]];
 
   size_t hash = 0;
   for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++)
@@ -1938,8 +1936,7 @@ ctables_freqtab_insert (struct ctables_table *t,
               goto not_equal;
         }
 
-      f->count += weight;
-      return;
+      goto summarize;
 
     not_equal: ;
     }
@@ -1956,8 +1953,15 @@ ctables_freqtab_insert (struct ctables_table *t,
         value_clone (&f->axes[a].values[i], case_data (c, va->vars[i]),
                      var_get_width (va->vars[i]));
     }
-  f->count = weight;
+  f->summaries = xmalloc (ss->n_summaries * sizeof *f->summaries);
+  for (size_t i = 0; i < ss->n_summaries; i++)
+    ctables_summary_init (&f->summaries[i], &ss->summaries[i]);
   hmap_insert (&t->ft, &f->node, hash);
+
+summarize:
+  for (size_t i = 0; i < ss->n_summaries; i++)
+    ctables_summary_add (&f->summaries[i], &ss->summaries[i], ss->summary_var,
+                         case_data (c, ss->summary_var), weight);
 }
 
 static bool
@@ -2142,14 +2146,25 @@ ctables_execute (struct dataset *ds, struct ctables *ct)
       struct ctables_freq *f;
       HMAP_FOR_EACH (f, struct ctables_freq, node, &t->ft)
         {
-          size_t dindexes[3];
-          size_t n_dindexes = 0;
-
-          for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++)
-            if (d[a])
-              dindexes[n_dindexes++] = f->axes[a].leaf;
-          pivot_table_put (pt, dindexes, n_dindexes,
-                           pivot_value_new_number (f->count));
+          const struct var_array *ss = &t->vaas[t->summary_axis].vas[f->axes[t->summary_axis].vaa_idx];
+          for (size_t j = 0; j < ss->n_summaries; j++)
+            {
+              size_t dindexes[3];
+              size_t n_dindexes = 0;
+
+              for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++)
+                if (d[a])
+                  {
+                    int leaf = f->axes[a].leaf;
+                    if (a == t->summary_axis)
+                      leaf += j;
+                    dindexes[n_dindexes++] = leaf;
+                  }
+
+              double value = ctables_summary_value (&f->summaries[j], &ss->summaries[j]);
+              pivot_table_put (pt, dindexes, n_dindexes,
+                               pivot_value_new_number (value));
+            }
         }
 
       pivot_table_submit (pt);