X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdescript.q;h=3e5c6a4e427a16be5e2886a2d1956468a0cc3db6;hb=14e7292894533c5491a774a2d749386362660812;hp=748655ca16cba1625776dc91ea1ecb05523328e6;hpb=a21135a117e6e3b7e605ab6d8b6959a791f871df;p=pspp diff --git a/src/descript.q b/src/descript.q index 748655ca16..3e5c6a4e42 100644 --- a/src/descript.q +++ b/src/descript.q @@ -30,7 +30,6 @@ #include "command.h" #include "lexer.h" #include "error.h" -#include "approx.h" #include "magic.h" #include "stats.h" #include "som.h" @@ -178,9 +177,9 @@ static void dump_z_table (void); static void run_z_pass (void); /* Procedure execution functions. */ -static int calc (struct ccase *); -static void precalc (void); -static void postcalc (void); +static int calc (struct ccase *, void *); +static void precalc (void *); +static void postcalc (void *); static void display (void); /* Parser and outline. */ @@ -288,9 +287,8 @@ cmd_descriptives (void) } /* Data pass! */ - update_weighting (&default_dict); bad_weight = 0; - procedure (precalc, calc, postcalc); + procedure_with_splits (precalc, calc, postcalc, NULL); if (bad_weight) msg (SW, _("At least one case in the data file had a weight value " @@ -313,10 +311,10 @@ cmd_descriptives (void) /* Parses the VARIABLES subcommand. */ static int -dsc_custom_variables (struct cmd_descriptives *cmd unused) +dsc_custom_variables (struct cmd_descriptives *cmd UNUSED) { if (!lex_match_id ("VARIABLES") - && (token != T_ID || !is_varname (tokid)) + && (token != T_ID || dict_lookup_var (default_dict, tokid) == NULL) && token != T_ALL) return 2; lex_match ('='); @@ -326,7 +324,7 @@ dsc_custom_variables (struct cmd_descriptives *cmd unused) int i, n; n = n_variables; - if (!parse_variables (NULL, &v_variables, &n_variables, + if (!parse_variables (default_dict, &v_variables, &n_variables, PV_DUPLICATE | PV_SINGLE | PV_APPEND | PV_NUMERIC | PV_NO_SCRATCH)) return 0; @@ -345,7 +343,7 @@ dsc_custom_variables (struct cmd_descriptives *cmd unused) msg (SE, _("Name for z-score variable expected.")); return 0; } - if (is_varname (tokid)) + if (dict_lookup_var (default_dict, tokid)) { msg (SE, _("Z-score variable name `%s' is a " "duplicate variable name with a current variable."), @@ -384,7 +382,7 @@ try_name (char *name) { int i; - if (is_varname (name)) + if (dict_lookup_var (default_dict, name) != NULL) return 0; for (i = 0; i < n_variables; i++) { @@ -478,7 +476,8 @@ dump_z_table (void) /* Transformation function to calculate Z-scores. */ static int -descriptives_trns_proc (struct trns_header * trns, struct ccase * c) +descriptives_trns_proc (struct trns_header * trns, struct ccase * c, + int case_num UNUSED) { struct descriptives_trns *t = (struct descriptives_trns *) trns; struct dsc_z_score *z; @@ -540,9 +539,9 @@ run_z_pass (void) struct variable *d; t->z[count].s = v; - t->z[count].d = d = force_create_variable (&default_dict, - v->p.dsc.zname, - NUMERIC, 0); + t->z[count].d = d = dict_create_var_assert (default_dict, + v->p.dsc.zname, 0); + d->init = 0; if (v->label) { d->label = xmalloc (strlen (v->label) + 12); @@ -557,8 +556,7 @@ run_z_pass (void) } t->z[count].mean = v->p.dsc.stats[dsc_mean]; t->z[count].std_dev = v->p.dsc.stats[dsc_stddev]; - if (t->z[count].std_dev == SYSMIS - || approx_eq (t->z[count].std_dev, 0.0)) + if (t->z[count].std_dev == SYSMIS || t->z[count].std_dev == 0.0) t->z[count].mean = SYSMIS; count++; } @@ -570,7 +568,7 @@ run_z_pass (void) /* Statistical calculation. */ static void -precalc (void) +precalc (void *aux UNUSED) { int i; @@ -594,7 +592,7 @@ precalc (void) } static int -calc (struct ccase * c) +calc (struct ccase * c, void *aux UNUSED) { int i; @@ -602,20 +600,13 @@ calc (struct ccase * c) static int case_id; /* Get the weight for this case. */ - double w; + double weight = dict_get_case_weight (default_dict, c); - if (default_dict.weight_index == -1) - w = 1.0; - else + if (weight <= 0.0) { - w = c->data[default_dict.weight_index].f; - if (w <= 0.0 || w == SYSMIS) - { - w = 0.0; - bad_weight = 1; - } + weight = 0.0; + bad_weight = 1; } - case_id++; /* Handle missing values. */ @@ -628,17 +619,17 @@ calc (struct ccase * c) { if (opt[op_excl_miss]) { - d_glob_missing += w; + d_glob_missing += weight; return 1; } else { - d_glob_miss_list += w; + d_glob_miss_list += weight; goto iterate; } } } - d_glob_valid += w; + d_glob_valid += weight; iterate: for (i = 0; i < n_variables; i++) @@ -658,7 +649,7 @@ iterate: if (X == SYSMIS || (!opt[op_incl_miss] && is_num_user_missing (X, v_variables[i]))) { - inf->miss += w; + inf->miss += weight; continue; } @@ -670,19 +661,19 @@ iterate: I am happy that mathematical formulas may not be copyrighted. */ W_old = inf->valid; - W_new = inf->valid += w; - v = (w / W_new) * (X - inf->X_bar); + W_new = inf->valid += weight; + v = (weight / W_new) * (X - inf->X_bar); v2 = v * v; v3 = v2 * v; v4 = v3 * v; - w2 = w * w; - w3 = w2 * w; - w4 = w3 * w; + w2 = weight * weight; + w3 = w2 * weight; + w4 = w3 * weight; inf->M4 += (-4.0 * v * inf->M3 + 6.0 * v2 * inf->M2 - + (W_new * W_new - 3 * w * W_old / w3) * v4 * W_old * W_new); + + (W_new * W_new - 3 * weight * W_old / w3) * v4 * W_old * W_new); inf->M3 += (-3.0 * v * inf->M2 + W_new * W_old / w2 - * (W_new - 2 * w) * v3); - inf->M2 += W_new * W_old / w * v2; + * (W_new - 2 * weight) * v3); + inf->M2 += W_new * W_old / weight * v2; inf->X_bar += v; if (X < inf->min) inf->min = X; @@ -693,7 +684,7 @@ iterate: } static void -postcalc (void) +postcalc (void *aux UNUSED) { int i;