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=e5a1ca5b19dda4c5964d53e4f0e346c55a1ac10e;hpb=c8adc6783134063d4ada34a58f9e7abf6a039bb2;p=pspp diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index e5a1ca5b19..bb7f5c37aa 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -455,6 +455,7 @@ struct ctables_table */ enum pivot_axis_type label_axis[PIVOT_N_AXES]; enum pivot_axis_type clabels_from_axis; + enum pivot_axis_type clabels_to_axis; const struct variable *clabels_example; struct hmap clabels_values_map; struct ctables_value **clabels_values; @@ -2550,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; @@ -2651,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; @@ -2676,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: @@ -2713,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: @@ -3725,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]); } } @@ -4497,8 +4518,6 @@ ctables_check_label_position (struct ctables_table *t, enum pivot_axis_type a) if (label_pos == a) return true; - t->clabels_from_axis = a; - const char *subcommand_name = a == PIVOT_AXIS_ROW ? "ROWLABELS" : "COLLABELS"; const char *pos_name = label_pos == PIVOT_AXIS_LAYER ? "LAYER" : "OPPOSITE"; @@ -4666,91 +4685,76 @@ 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[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) + enum pivot_axis_type ata, atb; + if (at == CTAT_ROW || at == CTAT_LAYERROW) { - 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; - } + ata = PIVOT_AXIS_ROW; + atb = PIVOT_AXIS_COLUMN; } - else if (at == CTAT_LAYERROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + else if (at == CTAT_COL || at == CTAT_LAYERCOL) { - 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; - } + ata = PIVOT_AXIS_COLUMN; + atb = PIVOT_AXIS_ROW; } - else if (at == CTAT_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) - continue; - nest->areas[at][nest->n_areas[at]++] = k; - break; - } + if (k != nest->scale_idx) + { + nest->areas[at][nest->n_areas[at]++] = k; + break; + } continue; } - if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) - { - size_t n_drop = (a == PIVOT_AXIS_LAYER ? 0 - : a == PIVOT_AXIS_ROW ? 2 - : 0); - for (size_t i = 0; i < n_drop; i++) - if (nest->n_areas[at] > 0) - nest->n_areas[at]--; - continue; - } - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_LAYER) - { - if (a == PIVOT_AXIS_ROW) - { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; - nest->n_areas[at]--; - } - } - else if (a == PIVOT_AXIS_COLUMN) - { - if (nest->n_areas[at] > 0) - nest->n_areas[at]--; - } - continue; - } - else if (at == CTAT_SUBTABLE && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + 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) { - size_t n_drop = (a == PIVOT_AXIS_LAYER ? 0 - : a == PIVOT_AXIS_COLUMN ? 2 - : 0); - for (size_t i = 0; i < n_drop; i++) - if (nest->n_areas[at] > 0) - nest->n_areas[at]--; - continue; + case CTAT_SUBTABLE: +#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: + case CTAT_LAYERCOL: + n_drop = a == ata && t->label_axis[ata] == atb; + break; + + case CTAT_ROW: + case CTAT_COL: + 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; } - else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) - continue; - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN) + + if (n_drop < 0) { size_t n = nest->n_areas[at]; if (n > 1) @@ -4758,33 +4762,13 @@ ctables_prepare_table (struct ctables_table *t) nest->areas[at][n - 2] = nest->areas[at][n - 1]; nest->n_areas[at]--; } - continue; } - else if (at == CTAT_COL && a == PIVOT_AXIS_ROW && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) - continue; - else if (at == CTAT_ROW && a == PIVOT_AXIS_COLUMN && t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW) + else { - size_t n = nest->n_areas[at]; - if (n > 1) - { - nest->areas[at][n - 2] = nest->areas[at][n - 1]; + for (int i = 0; i < n_drop; i++) + if (nest->n_areas[at] > 0) nest->n_areas[at]--; - } - continue; } - - bool drop_last = (at == CTAT_SUBTABLE ? a != PIVOT_AXIS_LAYER - : at == CTAT_ROW ? a == PIVOT_AXIS_COLUMN - : at == CTAT_COL ? a == PIVOT_AXIS_ROW - : false); - if (drop_last && nest->n_areas[at] > 0) - nest->n_areas[at]--; - - bool drop_additional - = ((t->label_axis[PIVOT_AXIS_ROW] == PIVOT_AXIS_COLUMN && (at == CTAT_ROW || at == CTAT_LAYERROW) && a == PIVOT_AXIS_ROW) - || (t->label_axis[PIVOT_AXIS_COLUMN] == PIVOT_AXIS_ROW && (at == CTAT_COL || at == CTAT_LAYERCOL) && a == PIVOT_AXIS_COLUMN)); - if (drop_additional && nest->n_areas[at] > 0) - nest->n_areas[at]--; } } } @@ -5225,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 @@ -5293,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), @@ -6306,6 +6290,7 @@ cmd_ctables (struct lexer *lexer, struct dataset *ds) [PIVOT_AXIS_LAYER] = PIVOT_AXIS_LAYER, }, .clabels_from_axis = PIVOT_AXIS_LAYER, + .clabels_to_axis = PIVOT_AXIS_LAYER, .categories = categories, .n_categories = n_vars, .cilevel = 95, @@ -6744,12 +6729,18 @@ cmd_ctables (struct lexer *lexer, struct dataset *ds) break; } - if (t->label_axis[PIVOT_AXIS_ROW] != PIVOT_AXIS_ROW - && t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + if (t->label_axis[PIVOT_AXIS_ROW] != PIVOT_AXIS_ROW) { - msg (SE, _("ROWLABELS and COLLABELS may not both be specified.")); - goto error; + t->clabels_from_axis = PIVOT_AXIS_ROW; + if (t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + { + msg (SE, _("ROWLABELS and COLLABELS may not both be specified.")); + goto error; + } } + else if (t->label_axis[PIVOT_AXIS_COLUMN] != PIVOT_AXIS_COLUMN) + t->clabels_from_axis = PIVOT_AXIS_COLUMN; + t->clabels_to_axis = t->label_axis[t->clabels_from_axis]; if (!ctables_prepare_table (t)) goto error;