X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ft-test.q;h=9fd09e7be0c185798de218166ffa23ee1d261b85;hb=48386ee68a5283653435d05a9ea4e449710fd370;hp=570be9318e8a8d76c75623b0e6bd93bcfc3bf02a;hpb=f43378497b8400e9c22a3485c534693dc1bc9554;p=pspp diff --git a/src/language/stats/t-test.q b/src/language/stats/t-test.q index 570be9318e..9fd09e7be0 100644 --- a/src/language/stats/t-test.q +++ b/src/language/stats/t-test.q @@ -1,8 +1,6 @@ /* PSPP - computes sample statistics. -*-c-*- Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by John Williams . - Almost completly re-written by John Darrington 2004 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -112,7 +110,7 @@ static int n_pairs = 0 ; struct pair { /* The variables comprising the pair */ - struct variable *v[2]; + const struct variable *v[2]; /* The number of valid variable pairs */ double n; @@ -154,7 +152,7 @@ struct pair static struct pair *pairs=0; -static int parse_value (union value * v, int type) ; +static int parse_value (struct lexer *lexer, union value * v, enum var_type); /* Structures and Functions for the Statistics Summary Box */ struct ssbox; @@ -258,11 +256,11 @@ static unsigned hash_group_binary(const struct group_statistics *g, int -cmd_t_test (struct dataset *ds) +cmd_t_test (struct lexer *lexer, struct dataset *ds) { bool ok; - if ( !parse_t_test (ds, &cmd, NULL) ) + if ( !parse_t_test (lexer, ds, &cmd, NULL) ) return CMD_FAILURE; if (! cmd.sbc_criteria) @@ -306,29 +304,29 @@ cmd_t_test (struct dataset *ds) int i; struct hsh_iterator hi; - struct hsh_table *hash; - struct variable *v; + struct const_hsh_table *hash; + const struct variable *v; - hash = hsh_create (n_pairs, compare_var_names, hash_var_name, 0, 0); + hash = const_hsh_create (n_pairs, compare_vars_by_name, hash_var_by_name, + 0, 0); for (i=0; i < n_pairs; ++i) { - hsh_insert(hash,pairs[i].v[0]); - hsh_insert(hash,pairs[i].v[1]); + const_hsh_insert (hash, pairs[i].v[0]); + const_hsh_insert (hash, pairs[i].v[1]); } assert(cmd.n_variables == 0); - cmd.n_variables = hsh_count(hash); + cmd.n_variables = const_hsh_count (hash); cmd.v_variables = xnrealloc (cmd.v_variables, cmd.n_variables, sizeof *cmd.v_variables); /* Iterate through the hash */ - for (i=0,v = (struct variable *) hsh_first(hash,&hi); + for (i=0,v = const_hsh_first (hash, &hi); v != 0; - v=hsh_next(hash,&hi) ) + v = const_hsh_next (hash, &hi) ) cmd.v_variables[i++]=v; - - hsh_destroy(hash); + const_hsh_destroy(hash); } } else if ( !cmd.sbc_variables) @@ -362,29 +360,29 @@ cmd_t_test (struct dataset *ds) } static int -tts_custom_groups (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux UNUSED) +tts_custom_groups (struct lexer *lexer, struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux UNUSED) { int n_group_values=0; - lex_match('='); + lex_match (lexer, '='); - indep_var = parse_variable (dataset_dict (ds)); + indep_var = parse_variable (lexer, dataset_dict (ds)); if (!indep_var) { - lex_error ("expecting variable name in GROUPS subcommand"); + lex_error (lexer, "expecting variable name in GROUPS subcommand"); return 0; } - if (indep_var->type == T_STRING && indep_var->width > MAX_SHORT_STRING) + if (var_is_long_string (indep_var)) { msg (SE, _("Long string variable %s is not valid here."), - indep_var->name); + var_get_name (indep_var)); return 0; } - if (!lex_match ('(')) + if (!lex_match (lexer, '(')) { - if (indep_var->type == NUMERIC) + if (var_is_numeric (indep_var)) { gp.v.g_value[0].f = 1; gp.v.g_value[1].f = 2; @@ -403,15 +401,14 @@ tts_custom_groups (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux } } - if (!parse_value (&gp.v.g_value[0], indep_var->type)) + if (!parse_value (lexer, &gp.v.g_value[0], var_get_type (indep_var))) return 0; - lex_match (','); - if (lex_match (')')) + lex_match (lexer, ','); + if (lex_match (lexer, ')')) { - if (indep_var->type != NUMERIC) + if (var_is_alpha (indep_var)) { - msg (SE, _("When applying GROUPS to a string variable, two " "values must be specified.")); return 0; @@ -423,11 +420,11 @@ tts_custom_groups (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux return 1; } - if (!parse_value (&gp.v.g_value[1], indep_var->type)) + if (!parse_value (lexer, &gp.v.g_value[1], var_get_type (indep_var))) return 0; n_group_values = 2; - if (!lex_force_match (')')) + if (!lex_force_match (lexer, ')')) return 0; if ( n_group_values == 2 ) @@ -441,9 +438,9 @@ tts_custom_groups (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux static int -tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux UNUSED) +tts_custom_pairs (struct lexer *lexer, struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux UNUSED) { - struct variable **vars; + const struct variable **vars; size_t n_vars; size_t n_pairs_local; @@ -451,10 +448,10 @@ tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux U size_t n_after_WITH = SIZE_MAX; int paired ; /* Was the PAIRED keyword given ? */ - lex_match('='); + lex_match (lexer, '='); n_vars=0; - if (!parse_variables (dataset_dict (ds), &vars, &n_vars, + if (!parse_variables_const (lexer, dataset_dict (ds), &vars, &n_vars, PV_DUPLICATE | PV_NUMERIC | PV_NO_SCRATCH)) { free (vars); @@ -463,10 +460,10 @@ tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux U assert (n_vars); n_before_WITH = 0; - if (lex_match (T_WITH)) + if (lex_match (lexer, T_WITH)) { n_before_WITH = n_vars; - if (!parse_variables (dataset_dict (ds), &vars, &n_vars, + if (!parse_variables_const (lexer, dataset_dict (ds), &vars, &n_vars, PV_DUPLICATE | PV_APPEND | PV_NUMERIC | PV_NO_SCRATCH)) { @@ -476,7 +473,7 @@ tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux U n_after_WITH = n_vars - n_before_WITH; } - paired = (lex_match ('(') && lex_match_id ("PAIRED") && lex_match (')')); + paired = (lex_match (lexer, '(') && lex_match_id (lexer, "PAIRED") && lex_match (lexer, ')')); /* Determine the number of pairs needed */ if (paired) @@ -487,7 +484,7 @@ tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux U msg (SE, _("PAIRED was specified but the number of variables " "preceding WITH (%d) did not match the number " "following (%d)."), - n_before_WITH, n_after_WITH ); + (int) n_before_WITH, (int) n_after_WITH ); return 0; } n_pairs_local = n_before_WITH; @@ -566,22 +563,22 @@ tts_custom_pairs (struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux U /* Parses the current token (numeric or string, depending on type) value v and returns success. */ static int -parse_value (union value * v, int type ) +parse_value (struct lexer *lexer, union value * v, enum var_type type) { - if (type == NUMERIC) + if (type == VAR_NUMERIC) { - if (!lex_force_num ()) + if (!lex_force_num (lexer)) return 0; - v->f = tokval; + v->f = lex_tokval (lexer); } else { - if (!lex_force_string ()) + if (!lex_force_string (lexer)) return 0; - strncpy (v->s, ds_cstr (&tokstr), ds_length (&tokstr)); + strncpy (v->s, ds_cstr (lex_tokstr (lexer)), ds_length (lex_tokstr (lexer))); } - lex_get (); + lex_get (lexer); return 1; } @@ -702,7 +699,7 @@ ssbox_independent_samples_init(struct ssbox *this, ssbox_base_init(this, hsize,vsize); tab_vline (this->t, TAL_GAP, 1, 0,vsize - 1); tab_title (this->t, _("Group Statistics")); - tab_text (this->t, 1, 0, TAB_CENTER | TAT_TITLE, indep_var->name); + tab_text (this->t, 1, 0, TAB_CENTER | TAT_TITLE, var_get_name (indep_var)); tab_text (this->t, 2, 0, TAB_CENTER | TAT_TITLE, _("N")); tab_text (this->t, 3, 0, TAB_CENTER | TAT_TITLE, _("Mean")); tab_text (this->t, 4, 0, TAB_CENTER | TAT_TITLE, _("Std. Deviation")); @@ -717,16 +714,16 @@ ssbox_independent_samples_populate(struct ssbox *ssb, { int i; - char *val_lab0=0; - char *val_lab1=0; + const char *val_lab0; + const char *val_lab1; double indep_value[2]; char prefix[2][3]={"",""}; - if ( indep_var->type == NUMERIC ) + if ( var_is_numeric (indep_var) ) { - val_lab0 = val_labs_find( indep_var->val_labs,gp.v.g_value[0]); - val_lab1 = val_labs_find( indep_var->val_labs,gp.v.g_value[1]); + val_lab0 = var_lookup_value_label (indep_var, &gp.v.g_value[0]); + val_lab1 = var_lookup_value_label (indep_var, &gp.v.g_value[1]); } else { @@ -751,11 +748,12 @@ ssbox_independent_samples_populate(struct ssbox *ssb, for (i=0; i < cmd->n_variables; ++i) { - struct variable *var = cmd->v_variables[i]; + const struct variable *var = cmd->v_variables[i]; struct hsh_table *grp_hash = group_proc_get (var)->group_hash; int count=0; - tab_text (ssb->t, 0, i*2+1, TAB_LEFT, cmd->v_variables[i]->name); + tab_text (ssb->t, 0, i*2+1, TAB_LEFT, + var_get_name (cmd->v_variables[i])); if (val_lab0) tab_text (ssb->t, 1, i*2+1, TAB_LEFT | TAT_PRINTF, @@ -856,7 +854,8 @@ ssbox_paired_populate(struct ssbox *ssb,struct cmd_t_test *cmd UNUSED) /* Titles */ - tab_text (ssb->t, 1, i*2+j+1, TAB_LEFT, pairs[i].v[j]->name); + tab_text (ssb->t, 1, i*2+j+1, TAB_LEFT, + var_get_name (pairs[i].v[j])); /* Values */ tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, pairs[i].mean[j], 8, 2); @@ -880,7 +879,7 @@ ssbox_one_sample_populate(struct ssbox *ssb, struct cmd_t_test *cmd) { struct group_statistics *gs = &group_proc_get (cmd->v_variables[i])->ugs; - tab_text (ssb->t, 0, i+1, TAB_LEFT, cmd->v_variables[i]->name); + tab_text (ssb->t, 0, i+1, TAB_LEFT, var_get_name (cmd->v_variables[i])); tab_float (ssb->t,1, i+1, TAB_RIGHT, gs->n, 2, 0); tab_float (ssb->t,2, i+1, TAB_RIGHT, gs->mean, 8, 2); tab_float (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, 8, 2); @@ -1012,7 +1011,7 @@ trbox_independent_samples_populate(struct trbox *self, double std_err_diff; double mean_diff; - struct variable *var = cmd->v_variables[i]; + const struct variable *var = cmd->v_variables[i]; struct group_proc *grp_data = group_proc_get (var); struct hsh_table *grp_hash = grp_data->group_hash; @@ -1039,7 +1038,7 @@ trbox_independent_samples_populate(struct trbox *self, assert(gs1); - tab_text (self->t, 0, i*2+3, TAB_LEFT, cmd->v_variables[i]->name); + tab_text (self->t, 0, i*2+3, TAB_LEFT, var_get_name (cmd->v_variables[i])); tab_text (self->t, 1, i*2+3, TAB_LEFT, _("Equal variances assumed")); @@ -1193,7 +1192,8 @@ trbox_paired_populate(struct trbox *trb, tab_text (trb->t, 0, i+3, TAB_LEFT | TAT_PRINTF, _("Pair %d"),i); tab_text (trb->t, 1, i+3, TAB_LEFT | TAT_PRINTF, "%s - %s", - pairs[i].v[0]->name, pairs[i].v[1]->name); + var_get_name (pairs[i].v[0]), + var_get_name (pairs[i].v[1])); tab_float(trb->t, 2, i+3, TAB_RIGHT, pairs[i].mean_diff, 8, 4); @@ -1287,7 +1287,7 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) struct group_statistics *gs = &group_proc_get (cmd->v_variables[i])->ugs; - tab_text (trb->t, 0, i+3, TAB_LEFT, cmd->v_variables[i]->name); + tab_text (trb->t, 0, i+3, TAB_LEFT, var_get_name (cmd->v_variables[i])); t = (gs->mean - cmd->n_testval[0] ) * sqrt(gs->n) / gs->std_dev ; @@ -1383,7 +1383,9 @@ pscbox(void) _("Pair %d"), i); tab_text(table, 1,i+1, TAB_LEFT | TAT_TITLE | TAT_PRINTF, - _("%s & %s"), pairs[i].v[0]->name, pairs[i].v[1]->name); + _("%s & %s"), + var_get_name (pairs[i].v[0]), + var_get_name (pairs[i].v[1])); /* row data */ @@ -1426,12 +1428,12 @@ common_calc (const struct dictionary *dict, for(i = 0; i < cmd->n_variables ; ++i) { - struct variable *v = cmd->v_variables[i]; + const struct variable *v = cmd->v_variables[i]; if (! casefilter_variable_missing (filter, c, v) ) { struct group_statistics *gs; - const union value *val = case_data (c, v->fv); + const union value *val = case_data (c, v); gs = &group_proc_get (cmd->v_variables[i])->ugs; gs->n += weight; @@ -1502,8 +1504,8 @@ one_sample_calc (const struct dictionary *dict, for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - struct variable *v = cmd->v_variables[i]; - const union value *val = case_data (c, v->fv); + const struct variable *v = cmd->v_variables[i]; + const union value *val = case_data (c, v); gs= &group_proc_get (cmd->v_variables[i])->ugs; @@ -1575,11 +1577,11 @@ paired_calc (const struct dictionary *dict, const struct ccase *c, for(i=0; i < n_pairs ; ++i ) { - struct variable *v0 = pairs[i].v[0]; - struct variable *v1 = pairs[i].v[1]; + const struct variable *v0 = pairs[i].v[0]; + const struct variable *v1 = pairs[i].v[1]; - const union value *val0 = case_data (c, v0->fv); - const union value *val1 = case_data (c, v1->fv); + const union value *val0 = case_data (c, v0); + const union value *val1 = case_data (c, v1); if ( ! casefilter_variable_missing (filter, c, v0) && ! casefilter_variable_missing (filter, c, v1) ) @@ -1653,7 +1655,7 @@ group_precalc (struct cmd_t_test *cmd ) /* There's always 2 groups for a T - TEST */ ttpr->n_groups = 2; - gp.indep_width = indep_var->width; + gp.indep_width = var_get_width (indep_var); ttpr->group_hash = hsh_create(2, (hsh_compare_func *) compare_group_binary, @@ -1704,12 +1706,12 @@ group_calc (const struct dictionary *dict, if ( casefilter_variable_missing (filter, c, indep_var)) return 0; - gv = case_data (c, indep_var->fv); + gv = case_data (c, indep_var); for(i=0; i< cmd->n_variables ; ++i) { - struct variable *var = cmd->v_variables[i]; - const union value *val = case_data (c, var->fv); + const struct variable *var = cmd->v_variables[i]; + const union value *val = case_data (c, var); struct hsh_table *grp_hash = group_proc_get (var)->group_hash; struct group_statistics *gs; @@ -1739,7 +1741,7 @@ group_postcalc ( struct cmd_t_test *cmd ) for (i = 0; i < cmd->n_variables ; ++i) { - struct variable *var = cmd->v_variables[i]; + const struct variable *var = cmd->v_variables[i]; struct hsh_table *grp_hash = group_proc_get (var)->group_hash; struct hsh_iterator g; struct group_statistics *gs; @@ -1782,7 +1784,8 @@ calculate(const struct ccase *first, const struct casefile *cf, struct cmd_t_test *cmd = (struct cmd_t_test *) cmd_; - struct casefilter *filter = casefilter_create (cmd->miss != TTS_INCLUDE, + struct casefilter *filter = casefilter_create ((cmd->miss != TTS_INCLUDE + ? MV_ANY : MV_SYSTEM), NULL, 0); if ( cmd->miss == TTS_LISTWISE )