Merge remote branch 'origin/master' into import-gui
[pspp] / src / language / stats / means.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "data/case.h"
20 #include "data/casegrouper.h"
21 #include "data/casereader.h"
22 #include "data/dataset.h"
23 #include "data/dictionary.h"
24 #include "data/format.h"
25 #include "data/variable.h"
26
27 #include "language/command.h"
28 #include "language/lexer/lexer.h"
29 #include "language/lexer/variable-parser.h"
30
31 #include "libpspp/misc.h"
32 #include "libpspp/pool.h"
33
34 #include "math/categoricals.h"
35 #include "math/interaction.h"
36 #include "math/moments.h"
37
38 #include "output/tab.h"
39
40 #include <math.h>
41
42 #include "gettext.h"
43 #define _(msgid) gettext (msgid)
44 #define N_(msgid) (msgid)
45
46
47 struct means;
48
49 struct per_var_data
50 {
51   void **cell_stats;
52   struct moments1 *mom;
53 };
54
55
56 typedef void *stat_create (struct pool *pool);
57 typedef void stat_update  (void *stat, double w, double x);
58 typedef double stat_get   (const struct per_var_data *, void *aux);
59
60 struct cell_spec
61 {
62   /* Printable title for output */
63   const char *title;
64
65   /* Keyword for syntax */
66   const char *keyword;
67
68   stat_create *sc;
69   stat_update *su;
70   stat_get *sd;
71 };
72
73 struct harmonic_mean
74 {
75   double rsum;
76   double n;
77 };
78
79 static void *
80 harmonic_create (struct pool *pool)
81 {
82   struct harmonic_mean *hm = pool_alloc (pool, sizeof *hm);
83
84   hm->rsum = 0;
85   hm->n = 0;
86
87   return hm;
88 }
89
90
91 static void
92 harmonic_update (void *stat, double w, double x)
93 {
94   struct harmonic_mean *hm = stat;
95   hm->rsum  += w / x;
96   hm->n += w;
97 }
98
99
100 static double
101 harmonic_get (const struct per_var_data *pvd UNUSED, void *stat)
102 {
103   struct harmonic_mean *hm = stat;
104
105   return hm->n / hm->rsum;
106 }
107
108 \f
109
110 struct geometric_mean
111 {
112   double prod;
113   double n;
114 };
115
116
117 static void *
118 geometric_create (struct pool *pool)
119 {
120   struct geometric_mean *gm = pool_alloc (pool, sizeof *gm);
121
122   gm->prod = 1.0;
123   gm->n = 0;
124
125   return gm;
126 }
127
128
129 static void
130 geometric_update (void *stat, double w, double x)
131 {
132   struct geometric_mean *gm = stat;
133   gm->prod  *=  pow (x, w);
134   gm->n += w;
135 }
136
137
138 static double
139 geometric_get (const struct per_var_data *pvd UNUSED, void *stat)
140 {
141   struct geometric_mean *gm = stat;
142
143   return pow (gm->prod, 1.0 / gm->n);
144 }
145
146 \f
147
148 static double
149 sum_get (const struct per_var_data *pvd, void *stat UNUSED)
150 {
151   double n, mean;
152
153   moments1_calculate (pvd->mom, &n, &mean, 0, 0, 0);
154
155   return mean * n;
156 }
157
158
159 static double
160 n_get (const struct per_var_data *pvd, void *stat UNUSED)
161 {
162   double n;
163
164   moments1_calculate (pvd->mom, &n, 0, 0, 0, 0);
165
166   return n;
167 }
168
169 static double
170 arithmean_get (const struct per_var_data *pvd, void *stat UNUSED)
171 {
172   double n, mean;
173
174   moments1_calculate (pvd->mom, &n, &mean, 0, 0, 0);
175
176   return mean;
177 }
178
179 static double
180 variance_get (const struct per_var_data *pvd, void *stat UNUSED)
181 {
182   double n, mean, variance;
183
184   moments1_calculate (pvd->mom, &n, &mean, &variance, 0, 0);
185
186   return variance;
187 }
188
189
190 static double
191 stddev_get (const struct per_var_data *pvd, void *stat)
192 {
193   return sqrt (variance_get (pvd, stat));
194 }
195
196
197 \f
198
199 static double
200 skew_get (const struct per_var_data *pvd, void *stat UNUSED)
201 {
202   double skew;
203
204   moments1_calculate (pvd->mom, NULL, NULL, NULL, &skew, 0);
205
206   return skew;
207 }
208
209 static double
210 sekurt_get (const struct per_var_data *pvd, void *stat UNUSED)
211 {
212   double n;
213
214   moments1_calculate (pvd->mom, &n, NULL, NULL, NULL, NULL);
215
216   return calc_sekurt (n);
217 }
218
219 static double
220 seskew_get (const struct per_var_data *pvd, void *stat UNUSED)
221 {
222   double n;
223
224   moments1_calculate (pvd->mom, &n, NULL, NULL, NULL, NULL);
225
226   return calc_seskew (n);
227 }
228
229 static double
230 kurt_get (const struct per_var_data *pvd, void *stat UNUSED)
231 {
232   double kurt;
233
234   moments1_calculate (pvd->mom, NULL, NULL, NULL, NULL, &kurt);
235
236   return kurt;
237 }
238
239 static double
240 semean_get (const struct per_var_data *pvd, void *stat UNUSED)
241 {
242   double n, var;
243
244   moments1_calculate (pvd->mom, &n, NULL, &var, NULL, NULL);
245
246   return sqrt (var / n);
247 }
248
249 \f
250
251 static void *
252 min_create (struct pool *pool)
253 {
254   double *r = pool_alloc (pool, sizeof *r);
255
256   *r = DBL_MAX;
257
258   return r;
259 }
260
261 static void
262 min_update (void *stat, double w UNUSED, double x)
263 {
264   double *r = stat;
265
266   if (x < *r)
267     *r = x;
268 }
269
270 static double
271 min_get (const struct per_var_data *pvd UNUSED, void *stat)
272 {
273   double *r = stat;
274
275   return *r;
276 }
277
278 static void *
279 max_create (struct pool *pool)
280 {
281   double *r = pool_alloc (pool, sizeof *r);
282
283   *r = -DBL_MAX;
284
285   return r;
286 }
287
288 static void
289 max_update (void *stat, double w UNUSED, double x)
290 {
291   double *r = stat;
292
293   if (x > *r)
294     *r = x;
295 }
296
297 static double
298 max_get (const struct per_var_data *pvd UNUSED, void *stat)
299 {
300   double *r = stat;
301
302   return *r;
303 }
304
305 \f
306
307 struct range
308 {
309   double min;
310   double max;
311 };
312
313 static void *
314 range_create (struct pool *pool)
315 {
316   struct range *r = pool_alloc (pool, sizeof *r);
317
318   r->min = DBL_MAX;
319   r->max = -DBL_MAX;
320
321   return r;
322 }
323
324 static void
325 range_update (void *stat, double w UNUSED, double x)
326 {
327   struct range *r = stat;
328
329   if (x > r->max)
330     r->max = x;
331
332   if (x < r->min)
333     r->min = x;
334 }
335
336 static double
337 range_get (const struct per_var_data *pvd UNUSED, void *stat)
338 {
339   struct range *r = stat;
340
341   return r->max - r->min;
342 }
343
344 \f
345
346 static void *
347 last_create (struct pool *pool)
348 {
349   double *l = pool_alloc (pool, sizeof *l);
350
351   return l;
352 }
353
354 static void
355 last_update (void *stat, double w UNUSED, double x)
356 {
357   double *l = stat;
358
359   *l = x;
360 }
361
362 static double
363 last_get (const struct per_var_data *pvd UNUSED, void *stat)
364 {
365   double *l = stat;
366
367   return *l;
368 }
369
370
371 static void *
372 first_create (struct pool *pool)
373 {
374   double *f = pool_alloc (pool, sizeof *f);
375
376   *f = SYSMIS;
377
378   return f;
379 }
380
381 static void
382 first_update (void *stat, double w UNUSED, double x)
383 {
384   double *f = stat;
385
386   if (*f == SYSMIS)
387      *f = x;
388 }
389
390 static double
391 first_get (const struct per_var_data *pvd UNUSED,  void *stat)
392 {
393   double *f = stat;
394
395   return *f;
396 }
397
398 enum 
399   {
400     MEANS_MEAN = 0,
401     MEANS_N,
402     MEANS_STDDEV
403   };
404
405 /* Table of cell_specs */
406 static const struct cell_spec cell_spec[] = {
407   {N_("Mean"), "MEAN", NULL, NULL, arithmean_get},
408   {N_("N"), "COUNT", NULL, NULL, n_get},
409   {N_("Std. Deviation"), "STDDEV", NULL, NULL, stddev_get},
410 #if 0
411   {N_("Median"), "MEDIAN", NULL, NULL, NULL},
412   {N_("Group Median"), "GMEDIAN", NULL, NULL, NULL},
413 #endif
414   {N_("S.E. Mean"), "SEMEAN", NULL, NULL, semean_get},
415   {N_("Sum"), "SUM", NULL, NULL, sum_get},
416   {N_("Min"), "MIN", min_create, min_update, min_get},
417   {N_("Max"), "MAX", max_create, max_update, max_get},
418   {N_("Range"), "RANGE", range_create, range_update, range_get},
419   {N_("Variance"), "VARIANCE", NULL, NULL, variance_get},
420   {N_("Kurtosis"), "KURT", NULL, NULL, kurt_get},
421   {N_("S.E. Kurt"), "SEKURT", NULL, NULL, sekurt_get},
422   {N_("Skewness"), "SKEW", NULL, NULL, skew_get},
423   {N_("S.E. Skew"), "SESKEW", NULL, NULL, seskew_get},
424   {N_("First"), "FIRST", first_create, first_update, first_get},
425   {N_("Last"), "LAST", last_create, last_update, last_get},
426 #if 0
427   {N_("Percent N"), "NPCT", NULL, NULL, NULL},
428   {N_("Percent Sum"), "SPCT", NULL, NULL, NULL},
429 #endif
430   {N_("Harmonic Mean"), "HARMONIC", harmonic_create, harmonic_update, harmonic_get},
431   {N_("Geom. Mean"), "GEOMETRIC", geometric_create, geometric_update, geometric_get}
432 };
433
434 #define n_C (sizeof (cell_spec) / sizeof (struct cell_spec))
435
436
437 struct summary
438 {
439   casenumber missing;
440   casenumber non_missing;
441 };
442
443
444 struct layer
445 {
446   size_t n_factor_vars;
447   const struct variable **factor_vars;
448 };
449
450 /* The thing parsed after TABLES= */
451 struct mtable
452 {
453   size_t n_dep_vars;
454   const struct variable **dep_vars;
455
456   int n_layers;
457   struct layer *layers;
458
459   struct interaction **interactions;
460   struct summary *summary;
461
462   int ii;
463
464   struct categoricals *cats;
465 };
466
467 struct means
468 {
469   const struct dictionary *dict;
470
471   struct mtable *table;
472   size_t n_tables;
473
474   /* Missing value class for categorical variables */
475   enum mv_class exclude;
476
477   /* Missing value class for dependent variables */
478   enum mv_class dep_exclude;
479
480   bool listwise_exclude;
481
482   /* an array  indicating which statistics are to be calculated */
483   int *cells;
484
485   /* Size of cells */
486   int n_cells;
487
488   /* Pool on which cell functions may allocate data */
489   struct pool *pool;
490 };
491
492
493 static void
494 run_means (struct means *cmd, struct casereader *input,
495            const struct dataset *ds);
496
497
498
499 static bool
500 parse_means_table_syntax (struct lexer *lexer, const struct means *cmd, struct mtable *table)
501 {
502   table->ii = 0;
503   table->n_layers = 0;
504   table->layers = NULL;
505
506   /* Dependent variable (s) */
507   if (!parse_variables_const_pool (lexer, cmd->pool, cmd->dict,
508                               &table->dep_vars, &table->n_dep_vars,
509                               PV_NO_DUPLICATE | PV_NUMERIC))
510     return false;
511
512   /* Factor variable (s) */
513   while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH)
514     {
515       if (lex_match (lexer, T_BY))
516         {
517           table->n_layers++;
518           table->layers = 
519             pool_realloc (cmd->pool, table->layers, 
520                       sizeof (*table->layers) * table->n_layers);
521
522           if (!parse_variables_const_pool 
523               (lexer, cmd->pool, cmd->dict,
524                &table->layers[table->n_layers - 1].factor_vars,
525                &table->layers[table->n_layers - 1].n_factor_vars,
526                PV_NO_DUPLICATE))
527             return false;
528
529         }
530     }
531
532   /* There is always at least one layer.
533      However the final layer is the total, and not
534      normally considered by the user as a 
535      layer.
536   */
537
538   table->n_layers++;
539   table->layers = 
540     pool_realloc (cmd->pool, table->layers, 
541               sizeof (*table->layers) * table->n_layers);
542   table->layers[table->n_layers - 1].factor_vars = NULL;
543   table->layers[table->n_layers - 1].n_factor_vars = 0;
544
545   return true;
546 }
547
548 /* Match a variable.
549    If the match succeeds, the variable will be placed in VAR.
550    Returns true if successful */
551 static bool
552 lex_is_variable (struct lexer *lexer, const struct dictionary *dict,
553                  int n)
554 {
555   const char *tstr;
556   if (lex_next_token (lexer, n) !=  T_ID)
557     return false;
558
559   tstr = lex_next_tokcstr (lexer, n);
560
561   if (NULL == dict_lookup_var (dict, tstr) )
562     return false;
563
564   return true;
565 }
566
567
568 int
569 cmd_means (struct lexer *lexer, struct dataset *ds)
570 {
571   int t;
572   int i;
573   int l;
574   struct means means;
575   bool more_tables = true;
576
577   means.pool = pool_create ();
578
579   means.exclude = MV_ANY;
580   means.dep_exclude = MV_ANY;
581   means.listwise_exclude = false;
582   means.table = NULL;
583   means.n_tables = 0;
584
585   means.dict = dataset_dict (ds);
586
587   means.n_cells = 3;
588   means.cells = pool_calloc (means.pool, means.n_cells, sizeof (*means.cells));
589
590
591   /* The first three items (MEAN, COUNT, STDDEV) are the default */
592   for (i = 0; i < 3; ++i)
593     means.cells[i] = i;
594
595
596   /*   Optional TABLES =   */
597   if (lex_match_id (lexer, "TABLES"))
598     {
599       lex_force_match (lexer, T_EQUALS);
600     }
601
602
603   more_tables = true;
604   /* Parse the "tables" */
605   while (more_tables)
606     {
607       means.n_tables ++;
608       means.table = pool_realloc (means.pool, means.table, means.n_tables * sizeof (*means.table));
609
610       if (! parse_means_table_syntax (lexer, &means, 
611                                       &means.table[means.n_tables - 1]))
612         {
613           goto error;
614         }
615
616       /* Look ahead to see if there are more tables to be parsed */
617       more_tables = false;
618       if ( T_SLASH == lex_next_token (lexer, 0) )
619         {
620           if (lex_is_variable (lexer, means.dict, 1) )
621             {
622               more_tables = true;
623               lex_force_match (lexer, T_SLASH);
624             }
625         }
626     }
627
628   /* /MISSING subcommand */
629   while (lex_token (lexer) != T_ENDCMD)
630     {
631       lex_match (lexer, T_SLASH);
632
633       if (lex_match_id (lexer, "MISSING"))
634         {
635           /*
636              If no MISSING subcommand is specified, each combination of
637              a dependent variable and categorical variables is handled
638              separately.
639            */
640           lex_match (lexer, T_EQUALS);
641           if (lex_match_id (lexer, "INCLUDE"))
642             {
643               /*
644                 Use the subcommand  "/MISSING=INCLUDE" to include user-missing
645                 values in the analysis.
646               */
647
648               means.exclude = MV_SYSTEM;
649               means.dep_exclude = MV_SYSTEM;
650             }
651           else if (lex_match_id (lexer, "TABLE"))
652             /*
653               This is the default. (I think).
654               Every case containing a complete set of variables for a given
655               table. If any variable, categorical or dependent for in a table
656               is missing (as defined by what?), then that variable will
657               be dropped FOR THAT TABLE ONLY.
658             */
659             {
660               means.listwise_exclude = true;
661             }
662           else if (lex_match_id (lexer, "DEPENDENT"))
663             /*
664              Use the command "/MISSING=DEPENDENT" to
665              include user-missing values for the categorical variables, 
666              while excluding them for the dependent variables.
667
668              Cases are dropped only when user-missing values
669              appear in dependent  variables.  User-missing
670              values for categorical variables are treated according to
671              their face value.
672
673              Cases are ALWAYS dropped when System Missing values appear 
674              in the categorical variables.
675             */
676             {
677               means.dep_exclude = MV_ANY;
678               means.exclude = MV_SYSTEM;
679             }
680           else
681             {
682               lex_error (lexer, NULL);
683               goto error;
684             }
685         }
686       else if (lex_match_id (lexer, "CELLS"))
687         {
688           lex_match (lexer, T_EQUALS);
689
690           /* The default values become overwritten */
691           means.n_cells = 0;
692           while (lex_token (lexer) != T_ENDCMD
693                  && lex_token (lexer) != T_SLASH)
694             {
695               int k = 0;
696               if (lex_match (lexer, T_ALL))
697                 {
698                   int x;
699                   means.cells =
700                     pool_realloc (means.pool, means.cells,
701                               (means.n_cells += n_C) * sizeof (*means.cells));
702
703                   for (x = 0; x < n_C; ++x)
704                     means.cells[means.n_cells - (n_C - 1 - x) - 1] = x;
705                 }
706               else if (lex_match_id (lexer, "NONE"))
707                 {
708                   /* Do nothing */
709                 }
710               else if (lex_match_id (lexer, "DEFAULT"))
711                 {
712                   means.cells =
713                     pool_realloc (means.pool, means.cells,
714                               (means.n_cells += 3) * sizeof (*means.cells));
715                   
716                   means.cells[means.n_cells - 2 - 1] = MEANS_MEAN;
717                   means.cells[means.n_cells - 1 - 1] = MEANS_N;
718                   means.cells[means.n_cells - 0 - 1] = MEANS_STDDEV;
719                 }
720               else
721                 {
722                   for (; k < n_C; ++k)
723                     {
724                       if (lex_match_id (lexer, cell_spec[k].keyword))
725                         {
726                           means.cells =
727                             pool_realloc (means.pool, means.cells,
728                                       ++means.n_cells * sizeof (*means.cells));
729                         
730                           means.cells[means.n_cells - 1] = k;
731                           break;
732                         }
733                     }
734                 }
735               if (k >= n_C)
736                 {
737                   lex_error (lexer, NULL);
738                   goto error;
739                 }
740             }
741         }
742       else
743         {
744           lex_error (lexer, NULL);
745           goto error;
746         }
747     }
748
749
750
751   for (t = 0; t < means.n_tables; ++t)
752   {
753     struct mtable *table = &means.table[t];
754
755     table->interactions =
756       pool_calloc (means.pool, table->n_layers, sizeof (*table->interactions));
757
758     table->summary =
759       pool_calloc (means.pool, table->n_dep_vars * table->n_layers, sizeof (*table->summary));
760
761     for (l = 0; l < table->n_layers; ++l)
762       {
763         int v;
764         const struct layer *lyr = &table->layers[l];
765         const int n_vars = lyr->n_factor_vars;
766         table->interactions[l] = interaction_create (NULL);
767         for (v = 0; v < n_vars ; ++v)
768           {
769             interaction_add_variable (table->interactions[l],
770                                       lyr->factor_vars[v]);
771           }
772       }
773   }
774
775   {
776     struct casegrouper *grouper;
777     struct casereader *group;
778     bool ok;
779
780     grouper = casegrouper_create_splits (proc_open (ds), means.dict);
781     while (casegrouper_get_next_group (grouper, &group))
782       {
783         run_means (&means, group, ds);
784       }
785     ok = casegrouper_destroy (grouper);
786     ok = proc_commit (ds) && ok;
787   }
788
789   for (t = 0; t < means.n_tables; ++t)
790   {
791     int l;
792     struct mtable *table = &means.table[t];
793     for (l = 0; l < table->n_layers; ++l)
794       {
795         interaction_destroy (table->interactions[l]);
796       }
797   }
798
799   pool_destroy (means.pool);
800   return CMD_SUCCESS;
801
802 error:
803
804   for (t = 0; t < means.n_tables; ++t)
805     {
806       int l;
807       struct mtable *table = &means.table[t];
808       for (l = 0; l < table->n_layers; ++l)
809         {
810           interaction_destroy (table->interactions[l]);
811         }
812     }
813   
814   pool_destroy (means.pool);
815   return CMD_FAILURE;
816 }
817
818
819 static bool
820 is_missing (const struct means *cmd,
821             const struct variable *dvar,
822             const struct interaction *iact,
823             const struct ccase *c)
824 {
825   if ( interaction_case_is_missing (iact, c, cmd->exclude) )
826     return true;
827
828
829   if (var_is_value_missing (dvar,
830                             case_data (c, dvar),
831                             cmd->dep_exclude))
832     return true;
833
834   return false;
835 }
836
837 static void output_case_processing_summary (const struct mtable *);
838
839 static void output_report (const struct means *, int, const struct mtable *);
840
841
842 struct per_cat_data
843 {
844   struct per_var_data *pvd;
845
846   bool warn;
847 };
848
849
850 static void 
851 destroy_n (const void *aux1 UNUSED, void *aux2, void *user_data)
852 {
853   struct mtable *table = aux2;
854   int v;
855   struct per_cat_data *per_cat_data = user_data;
856   struct per_var_data *pvd = per_cat_data->pvd;
857
858   for (v = 0; v < table->n_dep_vars; ++v)
859     {
860       struct per_var_data *pp = &pvd[v];
861       moments1_destroy (pp->mom);
862     }
863 }
864
865 static void *
866 create_n (const void *aux1, void *aux2)
867 {
868   int i, v;
869   const struct means *means = aux1;
870   struct mtable *table = aux2;
871   struct per_cat_data *per_cat_data = pool_malloc (means->pool, sizeof *per_cat_data);
872
873   struct per_var_data *pvd = pool_calloc (means->pool, table->n_dep_vars, sizeof *pvd);
874
875   for (v = 0; v < table->n_dep_vars; ++v)
876     {
877       enum moment maxmom = MOMENT_KURTOSIS;
878       struct per_var_data *pp = &pvd[v];
879
880       pp->cell_stats = pool_calloc (means->pool, means->n_cells, sizeof *pp->cell_stats);
881       
882
883       for (i = 0; i < means->n_cells; ++i)
884         {
885           int csi = means->cells[i];
886           const struct cell_spec *cs = &cell_spec[csi];
887           if (cs->sc)
888             {
889               pp->cell_stats[i] = cs->sc (means->pool);
890             }
891         }
892       pp->mom = moments1_create (maxmom);
893     }
894
895
896   per_cat_data->pvd = pvd;
897   per_cat_data->warn = true;
898   return per_cat_data;
899 }
900
901 static void
902 update_n (const void *aux1, void *aux2, void *user_data, const struct ccase *c, double weight)
903 {
904   int i;
905   int v = 0;
906   const struct means *means = aux1;
907   struct mtable *table = aux2;
908   struct per_cat_data *per_cat_data = user_data;
909
910   for (v = 0; v < table->n_dep_vars; ++v)
911     {
912       struct per_var_data *pvd = &per_cat_data->pvd[v];
913
914       const double x = case_data (c, table->dep_vars[v])->f;
915
916       for (i = 0; i < table->n_layers; ++i)
917         {
918           if ( is_missing (means, table->dep_vars[v],
919                            table->interactions[i], c))
920             goto end;
921         }
922
923       for (i = 0; i < means->n_cells; ++i)
924         {
925           const int csi = means->cells[i];
926           const struct cell_spec *cs = &cell_spec[csi];
927
928
929           if (cs->su)
930             cs->su (pvd->cell_stats[i],
931                     weight, x);
932         }
933
934       moments1_add (pvd->mom, x, weight);
935
936     end:
937       continue;
938     }
939 }
940
941 static void
942 calculate_n (const void *aux1, void *aux2, void *user_data)
943 {
944   int i;
945   int v = 0;
946   struct per_cat_data *per_cat_data = user_data;
947   const struct means *means = aux1;
948   struct mtable *table = aux2;
949
950   for (v = 0; v < table->n_dep_vars; ++v)
951     {
952       struct per_var_data *pvd = &per_cat_data->pvd[v];
953       for (i = 0; i < means->n_cells; ++i)
954         {
955           int csi = means->cells[i];
956           const struct cell_spec *cs = &cell_spec[csi];
957
958           if (cs->su)
959             cs->sd (pvd, pvd->cell_stats[i]);
960         }
961     }
962 }
963
964 static void
965 run_means (struct means *cmd, struct casereader *input,
966            const struct dataset *ds UNUSED)
967 {
968   int t;
969   const struct variable *wv = dict_get_weight (cmd->dict);
970   struct ccase *c;
971   struct casereader *reader;
972
973   struct payload payload;
974   payload.create = create_n;
975   payload.update = update_n;
976   payload.calculate = calculate_n;
977   payload.destroy = destroy_n;
978   
979   for (t = 0; t < cmd->n_tables; ++t)
980   {
981     struct mtable *table = &cmd->table[t];
982     table->cats
983       = categoricals_create (table->interactions,
984                              table->n_layers, wv, cmd->dep_exclude, cmd->exclude);
985
986     categoricals_set_payload (table->cats, &payload, cmd, table);
987   }
988
989   for (reader = input;
990        (c = casereader_read (reader)) != NULL; case_unref (c))
991     {
992       for (t = 0; t < cmd->n_tables; ++t)
993         {
994           bool something_missing = false;
995           int  v;
996           struct mtable *table = &cmd->table[t];
997
998           for (v = 0; v < table->n_dep_vars; ++v)
999             {
1000               int i;
1001               for (i = 0; i < table->n_layers; ++i)
1002                 {
1003                   const bool missing =
1004                     is_missing (cmd, table->dep_vars[v],
1005                                 table->interactions[i], c);
1006                   if (missing)
1007                     {
1008                       something_missing = true;
1009                       table->summary[v * table->n_layers + i].missing++;
1010                     }
1011                   else
1012                     table->summary[v * table->n_layers  + i].non_missing++;
1013                 }
1014             }
1015           if ( something_missing && cmd->listwise_exclude)
1016             continue;
1017
1018           categoricals_update (table->cats, c);
1019         }
1020     }
1021   casereader_destroy (reader);
1022
1023   for (t = 0; t < cmd->n_tables; ++t)
1024     {
1025       struct mtable *table = &cmd->table[t];
1026
1027       categoricals_done (table->cats);
1028     }
1029
1030
1031   for (t = 0; t < cmd->n_tables; ++t)
1032     {
1033       int i;
1034       const struct mtable *table = &cmd->table[t];
1035
1036       output_case_processing_summary (table);
1037
1038       for (i = 0; i < table->n_layers; ++i)
1039         {
1040           output_report (cmd, i, table);
1041         }
1042       categoricals_destroy (table->cats);
1043     }
1044
1045 }
1046
1047
1048
1049 static void
1050 output_case_processing_summary (const struct mtable *table)
1051 {
1052   int i, v;
1053   const int heading_columns = 1;
1054   const int heading_rows = 3;
1055   struct tab_table *t;
1056
1057   const int nr = heading_rows + table->n_layers * table->n_dep_vars;
1058   const int nc = 7;
1059
1060   t = tab_create (nc, nr);
1061   tab_title (t, _("Case Processing Summary"));
1062
1063   tab_headers (t, heading_columns, 0, heading_rows, 0);
1064
1065   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1066
1067   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1068   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1069
1070
1071   tab_joint_text (t, heading_columns, 0,
1072                   nc - 1, 0, TAB_CENTER | TAT_TITLE, _("Cases"));
1073
1074   tab_joint_text (t, 1, 1, 2, 1, TAB_CENTER | TAT_TITLE, _("Included"));
1075   tab_joint_text (t, 3, 1, 4, 1, TAB_CENTER | TAT_TITLE, _("Excluded"));
1076   tab_joint_text (t, 5, 1, 6, 1, TAB_CENTER | TAT_TITLE, _("Total"));
1077
1078   tab_hline (t, TAL_1, heading_columns, nc - 1, 1);
1079   tab_hline (t, TAL_1, heading_columns, nc - 1, 2);
1080
1081
1082   for (i = 0; i < 3; ++i)
1083     {
1084       tab_text (t, heading_columns + i * 2, 2, TAB_CENTER | TAT_TITLE,
1085                 _("N"));
1086       tab_text (t, heading_columns + i * 2 + 1, 2, TAB_CENTER | TAT_TITLE,
1087                 _("Percent"));
1088     }
1089
1090   for (v = 0; v < table->n_dep_vars; ++v)
1091     {
1092       const struct variable *var = table->dep_vars[v];
1093       const char *dv_name = var_to_string (var);
1094       for (i = 0; i < table->n_layers; ++i)
1095         {
1096           const int row = v * table->n_layers + i;
1097           const struct interaction *iact = table->interactions[i];
1098           casenumber n_total;
1099
1100           struct string str;
1101           ds_init_cstr (&str, dv_name);
1102           ds_put_cstr (&str, ": ");
1103
1104           interaction_to_string (iact, &str);
1105
1106           tab_text (t, 0, row + heading_rows,
1107                     TAB_LEFT | TAT_TITLE, ds_cstr (&str));
1108
1109
1110           n_total = table->summary[row].missing + 
1111             table->summary[row].non_missing;
1112
1113           tab_double (t, 1, row + heading_rows,
1114                       0, table->summary[row].non_missing, &F_8_0);
1115
1116           tab_text_format (t, 2, row + heading_rows,
1117                            0, _("%g%%"), 
1118                            table->summary[row].non_missing / (double) n_total * 100.0);
1119
1120
1121           tab_double (t, 3, row + heading_rows,
1122                       0, table->summary[row].missing, &F_8_0);
1123
1124
1125           tab_text_format (t, 4, row + heading_rows,
1126                            0, _("%g%%"), 
1127                            table->summary[row].missing / (double) n_total * 100.0);
1128
1129
1130           tab_double (t, 5, row + heading_rows,
1131                       0, table->summary[row].missing + 
1132                       table->summary[row].non_missing, &F_8_0);
1133
1134           tab_text_format (t, 6, row + heading_rows,
1135                            0, _("%g%%"), 
1136                            n_total / (double) n_total * 100.0);
1137
1138
1139           ds_destroy (&str);
1140         }
1141     }
1142
1143   tab_submit (t);
1144 }
1145
1146
1147 static void
1148 output_report (const struct means *cmd,  int iact_idx,
1149                const struct mtable *table)
1150 {
1151   int grp;
1152   int i;
1153
1154   const struct interaction *iact = table->interactions[iact_idx];
1155
1156   const int heading_columns = 1 + iact->n_vars;
1157   const int heading_rows = 1;
1158   struct tab_table *t;
1159
1160   const int n_cats = categoricals_n_count (table->cats, iact_idx);
1161
1162   const int nr = n_cats * table->n_dep_vars + heading_rows;
1163
1164   const int nc = heading_columns + cmd->n_cells;
1165
1166   t = tab_create (nc, nr);
1167   tab_title (t, _("Report"));
1168
1169   tab_headers (t, heading_columns, 0, heading_rows, 0);
1170
1171   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1172
1173   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1174   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1175
1176   for (i = 0; i < iact->n_vars; ++i)
1177     {
1178       tab_text (t, 1 + i, 0, TAB_CENTER | TAT_TITLE,
1179                 var_to_string (iact->vars[i]));
1180     }
1181
1182   for (i = 0; i < cmd->n_cells; ++i)
1183     {
1184       tab_text (t, heading_columns + i, 0,
1185                 TAB_CENTER | TAT_TITLE,
1186                 gettext (cell_spec[cmd->cells[i]].title));
1187     }
1188
1189
1190   for (i = 0; i < n_cats; ++i)
1191     {
1192       int v, dv;
1193       const struct ccase *c =
1194         categoricals_get_case_by_category_real (table->cats, iact_idx, i);
1195
1196       for (dv = 0; dv < table->n_dep_vars; ++dv)
1197         {
1198           tab_text (t, 0,
1199                     heading_rows + dv * n_cats,
1200                     TAB_RIGHT | TAT_TITLE,
1201                     var_to_string (table->dep_vars[dv])
1202                     );
1203
1204           if ( dv > 0)
1205             tab_hline (t, TAL_1, 0, nc - 1, heading_rows + dv * n_cats);
1206
1207           for (v = 0; v < iact->n_vars; ++v)
1208             {
1209               const struct variable *var = iact->vars[v];
1210               const union value *val = case_data (c, var);
1211               struct string str;
1212               ds_init_empty (&str);
1213               var_append_value_name (var, val, &str);
1214
1215               tab_text (t, 1 + v, heading_rows + dv * n_cats + i,
1216                         TAB_RIGHT | TAT_TITLE, ds_cstr (&str));
1217
1218               ds_destroy (&str);
1219             }
1220         }
1221     }
1222
1223   for (grp = 0; grp < n_cats; ++grp)
1224     {
1225       int dv;
1226       struct per_cat_data *per_cat_data =
1227         categoricals_get_user_data_by_category_real (table->cats, iact_idx, grp);
1228
1229       for (dv = 0; dv < table->n_dep_vars; ++dv)
1230         {
1231           const struct per_var_data *pvd = &per_cat_data->pvd[dv];
1232           for (i = 0; i < cmd->n_cells; ++i)
1233             {
1234               const int csi = cmd->cells[i];
1235               const struct cell_spec *cs = &cell_spec[csi];
1236
1237               double result = cs->sd (pvd, pvd->cell_stats[i]);
1238
1239               tab_double (t, heading_columns + i,
1240                           heading_rows + grp + dv * n_cats,
1241                           0, result, 0);
1242             }
1243         }
1244     }
1245
1246   tab_submit (t);
1247 }