X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fctables.c;h=bb7f5c37aa973afe6a6b6431e37d81bef9ff9079;hb=c6caca37f19989f96ad843e2baee09a54c4f23ba;hp=2490efde10e9803917180b2f4981061161112c6d;hpb=a2bc5467fbee81ad9b493f7a9471d76cbb4d7caf;p=pspp diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index 2490efde10..bb7f5c37aa 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -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; @@ -2652,24 +2655,37 @@ ctables_summary_add (union ctables_summary *s, switch (ss->function) { case CTSF_TOTALN: - case CTSF_areaPCT_TOTALN: s->count += ss->weighted ? d_weight : 1.0; break; + case CTSF_areaPCT_TOTALN: + s->count += ss->weighted ? e_weight : 1.0; + break; + case CTSF_COUNT: - case CTSF_areaPCT_COUNT: if (is_scale || !excluded_missing) s->count += ss->weighted ? d_weight : 1.0; break; + case CTSF_areaPCT_COUNT: + if (is_scale || !excluded_missing) + s->count += ss->weighted ? e_weight : 1.0; + break; + case CTSF_VALIDN: - case CTSF_areaPCT_VALIDN: if (is_scale ? !is_scale_missing : !is_missing) s->count += ss->weighted ? d_weight : 1.0; break; + case CTSF_areaPCT_VALIDN: + if (is_scale + ? !is_scale_missing + : !is_missing) + s->count += ss->weighted ? e_weight : 1.0; + break; + case CTSF_areaID: break; @@ -2677,7 +2693,7 @@ ctables_summary_add (union ctables_summary *s, if (is_scale ? is_scale_missing : is_missing) - s->count += ss->weighted ? d_weight : 1.0; + s->count += ss->weighted ? e_weight : 1.0; break; case CTSF_ECOUNT: @@ -2714,11 +2730,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 +3746,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]); } } @@ -4665,32 +4685,6 @@ ctables_prepare_table (struct ctables_table *t) nest->areas[at] = xmalloc (nest->n * sizeof *nest->areas[at]); nest->n_areas[at] = 0; - bool add_vars = (at == CTAT_LAYER ? a == PIVOT_AXIS_LAYER - : at == CTAT_LAYERROW ? a != PIVOT_AXIS_COLUMN - : at == CTAT_LAYERCOL ? a != PIVOT_AXIS_ROW - : at == CTAT_TABLE ? false - : true); - if (add_vars) - for (size_t k = 0; k < nest->n; k++) - { - if (k == nest->scale_idx) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - } - else if ((at == CTAT_LAYERCOL && a == PIVOT_AXIS_ROW && t->label_axis[a] != a) - || (at == CTAT_LAYERROW && a == PIVOT_AXIS_COLUMN && t->label_axis[a] != a) - || (at == CTAT_LAYER && t->label_axis[a] == PIVOT_AXIS_LAYER)) - { - for (size_t k = nest->n - 1; k < nest->n; k--) - { - if (k == nest->scale_idx) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - break; - } - continue; - } - enum pivot_axis_type ata, atb; if (at == CTAT_ROW || at == CTAT_LAYERROW) { @@ -4703,19 +4697,41 @@ ctables_prepare_table (struct ctables_table *t) atb = PIVOT_AXIS_ROW; } - size_t n_drop = 0; - bool drop_inner = false; + 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) + { + nest->areas[at][nest->n_areas[at]++] = k; + break; + } + continue; + } + + if (at == CTAT_LAYER ? a != PIVOT_AXIS_LAYER + : at == CTAT_LAYERROW || at == CTAT_LAYERCOL ? a == atb + : at == CTAT_TABLE ? true + : false) + continue; + + 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) - drop_inner = true; - 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: @@ -4725,23 +4741,20 @@ ctables_prepare_table (struct ctables_table *t) case CTAT_ROW: case CTAT_COL: - if (a == atb) - { - if (t->clabels_from_axis == atb) - drop_inner = true; - 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; } - if (drop_inner) + if (n_drop < 0) { size_t n = nest->n_areas[at]; if (n > 1) @@ -4750,9 +4763,12 @@ ctables_prepare_table (struct ctables_table *t) nest->n_areas[at]--; } } - for (size_t i = 0; i < n_drop; i++) - if (nest->n_areas[at] > 0) - nest->n_areas[at]--; + else + { + for (int i = 0; i < n_drop; i++) + if (nest->n_areas[at] > 0) + nest->n_areas[at]--; + } } } } @@ -5193,8 +5209,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 @@ -5261,7 +5277,7 @@ ctables_execute (struct dataset *ds, struct casereader *input, for (struct ccase *c = casereader_read (group); c; case_unref (c), c = casereader_read (group)) { - double d_weight = dict_get_case_weight (dict, c, &warn_on_invalid); + double d_weight = dict_get_rounded_case_weight (dict, c, &warn_on_invalid); double e_weight = (ct->e_weight ? var_force_valid_weight (ct->e_weight, case_num (c, ct->e_weight),