X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fexamine.q;h=aded6a8f7384bce9b8a822b5659ea78a7ed73531;hb=f5c108becd49d78f4898cab11352291f5689d24e;hp=abbf9fc3890aada913b5b771fb57353d2362dd4d;hpb=9f650fc3d2946c216e6cd3c7922a8a63d0f97117;p=pspp-builds.git diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index abbf9fc3..aded6a8f 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -26,7 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA #include #include -#include +#include +#include #include #include #include @@ -84,7 +85,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA static struct cmd_examine cmd; -static struct variable **dependent_vars; +static const struct variable **dependent_vars; static size_t n_dependent_vars; @@ -116,19 +117,19 @@ static int examine_parse_independent_vars (struct lexer *lexer, const struct dic /* Output functions */ -static void show_summary (struct variable **dependent_var, int n_dep_var, +static void show_summary (const struct variable **dependent_var, int n_dep_var, const struct factor *f); -static void show_extremes (struct variable **dependent_var, +static void show_extremes (const struct variable **dependent_var, int n_dep_var, const struct factor *factor, int n_extremities); -static void show_descriptives (struct variable **dependent_var, +static void show_descriptives (const struct variable **dependent_var, int n_dep_var, struct factor *factor); -static void show_percentiles (struct variable **dependent_var, +static void show_percentiles (const struct variable **dependent_var, int n_dep_var, struct factor *factor); @@ -152,8 +153,8 @@ void box_plot_variables (const struct factor *fctr, /* Per Split function */ -static bool run_examine (const struct ccase *, - const struct casefile *cf, void *cmd_, const struct dataset *); +static void run_examine (struct cmd_examine *, struct casereader *, + struct dataset *); static void output_examine (void); @@ -193,6 +194,8 @@ static short sbc_percentile; int cmd_examine (struct lexer *lexer, struct dataset *ds) { + struct casegrouper *grouper; + struct casereader *group; bool ok; subc_list_double_create (&percentile_list); @@ -222,7 +225,11 @@ cmd_examine (struct lexer *lexer, struct dataset *ds) subc_list_double_push (&percentile_list, 75); } - ok = multipass_procedure_with_splits (ds, run_examine, &cmd); + grouper = casegrouper_create_splits (proc_open (ds), dataset_dict (ds)); + while (casegrouper_get_next_group (grouper, &group)) + run_examine (&cmd, group, ds); + ok = casegrouper_destroy (grouper); + ok = proc_commit (ds) && ok; if ( totals ) { @@ -525,7 +532,7 @@ xmn_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_examin return 2; } - if (!parse_variables (lexer, dict, &dependent_vars, &n_dependent_vars, + if (!parse_variables_const (lexer, dict, &dependent_vars, &n_dependent_vars, PV_NO_DUPLICATE | PV_NUMERIC | PV_NO_SCRATCH) ) { free (dependent_vars); @@ -627,9 +634,6 @@ void populate_summary (struct tab_table *t, int col, int row, -static bool bad_weight_warn = true; - - /* Perform calculations for the sub factors */ void factor_calc (const struct ccase *c, int case_no, double weight, @@ -706,23 +710,28 @@ factor_calc (const struct ccase *c, int case_no, double weight, } } -static bool -run_examine (const struct ccase *first, const struct casefile *cf, - void *cmd_, const struct dataset *ds) +static void +run_examine (struct cmd_examine *cmd, struct casereader *input, + struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); - struct casereader *r; + casenumber case_no; struct ccase c; int v; - - const struct cmd_examine *cmd = (struct cmd_examine *) cmd_; + bool ok; struct factor *fctr; - output_split_file_values (ds, first); + if (!casereader_peek (input, 0, &c)) + return; + output_split_file_values (ds, &c); + case_destroy (&c); + + input = casereader_create_filter_weight (input, dict, NULL, NULL); + input = casereader_create_counter (input, &case_no, 0); /* Make sure we haven't got rubbish left over from a - previous split */ + previous split. */ fctr = factors; while (fctr) { @@ -738,15 +747,10 @@ run_examine (const struct ccase *first, const struct casefile *cf, for ( v = 0 ; v < n_dependent_vars ; ++v ) metrics_precalc (&totals[v]); - for (r = casefile_get_reader (cf, NULL); - casereader_read (r, &c) ; - case_destroy (&c) ) + for (; casereader_read (input, &c); case_destroy (&c)) { - int case_missing=0; - const int case_no = casereader_cnum (r); - - const double weight = - dict_get_case_weight (dict, &c, &bad_weight_warn); + int case_missing = 0; + const double weight = dict_get_case_weight (dict, &c, NULL); if ( cmd->miss == XMN_LISTWISE ) { @@ -787,6 +791,7 @@ run_examine (const struct ccase *first, const struct casefile *cf, factor_calc (&c, case_no, weight, case_missing); } + ok = casereader_destroy (input); for ( v = 0 ; v < n_dependent_vars ; ++v) { @@ -882,7 +887,8 @@ run_examine (const struct ccase *first, const struct casefile *cf, fctr = fctr->next; } - output_examine (); + if (ok) + output_examine (); if ( totals ) @@ -893,13 +899,11 @@ run_examine (const struct ccase *first, const struct casefile *cf, metrics_destroy (&totals[i]); } } - - return true; } static void -show_summary (struct variable **dependent_var, int n_dep_var, +show_summary (const struct variable **dependent_var, int n_dep_var, const struct factor *fctr) { static const char *subtitle[]= @@ -1124,7 +1128,7 @@ populate_summary (struct tab_table *t, int col, int row, static void -show_extremes (struct variable **dependent_var, int n_dep_var, +show_extremes (const struct variable **dependent_var, int n_dep_var, const struct factor *fctr, int n_extremities) { int i; @@ -1361,7 +1365,7 @@ populate_extremes (struct tab_table *t, /* Show the descriptives table */ void -show_descriptives (struct variable **dependent_var, +show_descriptives (const struct variable **dependent_var, int n_dep_var, struct factor *fctr) { @@ -1507,18 +1511,14 @@ show_descriptives (struct variable **dependent_var, } - - /* Fill in the descriptives data */ void populate_descriptives (struct tab_table *tbl, int col, int row, const struct metrics *m) { - - const double t = gsl_cdf_tdist_Qinv (1 - cmd.n_cinterval[0]/100.0/2.0, \ + const double t = gsl_cdf_tdist_Qinv ((1 - cmd.n_cinterval[0] / 100.0)/2.0, m->n -1); - tab_text (tbl, col, row, TAB_LEFT | TAT_TITLE, @@ -1947,7 +1947,7 @@ np_plot (const struct metrics *m, const char *factorname) /* Show the percentiles */ void -show_percentiles (struct variable **dependent_var, +show_percentiles (const struct variable **dependent_var, int n_dep_var, struct factor *fctr) {