projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Encapsulated lexer and updated calling functions accordingly.
[pspp]
/
src
/
language
/
stats
/
regression.q
diff --git
a/src/language/stats/regression.q
b/src/language/stats/regression.q
index 6f9dc6ccaaa1d63c980e0435790ba2509eab97bf..1b35970366b0a1bd449b40d66913e20f03bb0bcc 100644
(file)
--- a/
src/language/stats/regression.q
+++ b/
src/language/stats/regression.q
@@
-118,7
+118,8
@@
static struct file_handle *model_file;
static int pspp_reg_rc = CMD_SUCCESS;
static bool run_regression (const struct ccase *,
static int pspp_reg_rc = CMD_SUCCESS;
static bool run_regression (const struct ccase *,
- const struct casefile *, void *);
+ const struct casefile *, void *,
+ const struct dataset *);
/*
STATISTICS subcommand output functions.
/*
STATISTICS subcommand output functions.
@@
-544,8
+545,8
@@
regression_trns_free (void *t_)
Gets the predicted values.
*/
static int
Gets the predicted values.
*/
static int
-regression_trns_pred_proc (void *t_, struct ccase *c,
- casenum
_t
case_idx UNUSED)
+regression_trns_pred_proc (void *t_, struct ccase *c,
+ casenum
ber
case_idx UNUSED)
{
size_t i;
size_t n_vals;
{
size_t i;
size_t n_vals;
@@
-583,8
+584,8
@@
regression_trns_pred_proc (void *t_, struct ccase *c,
Gets the residuals.
*/
static int
Gets the residuals.
*/
static int
-regression_trns_resid_proc (void *t_, struct ccase *c,
- casenum
_t
case_idx UNUSED)
+regression_trns_resid_proc (void *t_, struct ccase *c,
+ casenum
ber
case_idx UNUSED)
{
size_t i;
size_t n_vals;
{
size_t i;
size_t n_vals;
@@
-621,32
+622,35
@@
regression_trns_resid_proc (void *t_, struct ccase *c,
}
/*
}
/*
- Returns
0
if NAME is a duplicate of any existing variable name.
+ Returns
false
if NAME is a duplicate of any existing variable name.
*/
*/
-static
int
-try_name (char *name)
+static
bool
+try_name (c
onst struct dictionary *dict, const c
har *name)
{
{
- if (dict_lookup_var (d
ataset_dict (current_dataset)
, name) != NULL)
- return
0
;
+ if (dict_lookup_var (d
ict
, name) != NULL)
+ return
false
;
- return
1
;
+ return
true
;
}
}
+
static void
static void
-reg_get_name (char name[LONG_NAME_LEN], const char prefix[LONG_NAME_LEN])
+reg_get_name (c
onst struct dictionary *dict, c
har name[LONG_NAME_LEN], const char prefix[LONG_NAME_LEN])
{
int i = 1;
snprintf (name, LONG_NAME_LEN, "%s%d", prefix, i);
{
int i = 1;
snprintf (name, LONG_NAME_LEN, "%s%d", prefix, i);
- while (!try_name (name))
+ while (!try_name (
dict,
name))
{
i++;
snprintf (name, LONG_NAME_LEN, "%s%d", prefix, i);
}
}
{
i++;
snprintf (name, LONG_NAME_LEN, "%s%d", prefix, i);
}
}
+
static void
static void
-reg_save_var (const char *prefix, trns_proc_func * f,
+reg_save_var (
struct dataset *ds,
const char *prefix, trns_proc_func * f,
pspp_linreg_cache * c, struct variable **v, int n_trns)
{
pspp_linreg_cache * c, struct variable **v, int n_trns)
{
+ struct dictionary *dict = dataset_dict (ds);
static int trns_index = 1;
char name[LONG_NAME_LEN];
struct variable *new_var;
static int trns_index = 1;
char name[LONG_NAME_LEN];
struct variable *new_var;
@@
-656,15
+660,16
@@
reg_save_var (const char *prefix, trns_proc_func * f,
t->trns_id = trns_index;
t->n_trns = n_trns;
t->c = c;
t->trns_id = trns_index;
t->n_trns = n_trns;
t->c = c;
- reg_get_name (name, prefix);
- new_var = dict_create_var (d
ataset_dict (current_dataset)
, name, 0);
+ reg_get_name (
dict,
name, prefix);
+ new_var = dict_create_var (d
ict
, name, 0);
assert (new_var != NULL);
*v = new_var;
assert (new_var != NULL);
*v = new_var;
- add_transformation (
current_dataset
, f, regression_trns_free, t);
+ add_transformation (
ds
, f, regression_trns_free, t);
trns_index++;
}
trns_index++;
}
+
static void
static void
-subcommand_save (int save, pspp_linreg_cache ** models)
+subcommand_save (
struct dataset *ds,
int save, pspp_linreg_cache ** models)
{
pspp_linreg_cache **lc;
int n_trns = 0;
{
pspp_linreg_cache **lc;
int n_trns = 0;
@@
-690,12
+695,12
@@
subcommand_save (int save, pspp_linreg_cache ** models)
assert ((*lc)->depvar != NULL);
if (cmd.a_save[REGRESSION_SV_RESID])
{
assert ((*lc)->depvar != NULL);
if (cmd.a_save[REGRESSION_SV_RESID])
{
- reg_save_var ("RES", regression_trns_resid_proc, *lc,
+ reg_save_var (
ds,
"RES", regression_trns_resid_proc, *lc,
&(*lc)->resid, n_trns);
}
if (cmd.a_save[REGRESSION_SV_PRED])
{
&(*lc)->resid, n_trns);
}
if (cmd.a_save[REGRESSION_SV_PRED])
{
- reg_save_var ("PRED", regression_trns_pred_proc, *lc,
+ reg_save_var (
ds,
"PRED", regression_trns_pred_proc, *lc,
&(*lc)->pred, n_trns);
}
}
&(*lc)->pred, n_trns);
}
}
@@
-709,6
+714,7
@@
subcommand_save (int save, pspp_linreg_cache ** models)
}
}
}
}
}
}
+
static int
reg_inserted (const struct variable *v, struct variable **varlist, int n_vars)
{
static int
reg_inserted (const struct variable *v, struct variable **varlist, int n_vars)
{
@@
-723,6
+729,7
@@
reg_inserted (const struct variable *v, struct variable **varlist, int n_vars)
}
return 0;
}
}
return 0;
}
+
static void
reg_print_categorical_encoding (FILE * fp, pspp_linreg_cache * c)
{
static void
reg_print_categorical_encoding (FILE * fp, pspp_linreg_cache * c)
{
@@
-832,7
+839,6
@@
subcommand_export (int export, pspp_linreg_cache * c)
size_t i;
size_t j;
int n_quantiles = 100;
size_t i;
size_t j;
int n_quantiles = 100;
- double increment;
double tmp;
struct pspp_coeff *coeff;
double tmp;
struct pspp_coeff *coeff;
@@
-849,7
+855,6
@@
subcommand_export (int export, pspp_linreg_cache * c)
reg_print_categorical_encoding (fp, c);
}
fprintf (fp, "%s", reg_export_t_quantiles_1);
reg_print_categorical_encoding (fp, c);
}
fprintf (fp, "%s", reg_export_t_quantiles_1);
- increment = 0.5 / (double) increment;
for (i = 0; i < n_quantiles - 1; i++)
{
tmp = 0.5 + 0.005 * (double) i;
for (i = 0; i < n_quantiles - 1; i++)
{
tmp = 0.5 + 0.005 * (double) i;
@@
-909,38
+914,39
@@
subcommand_export (int export, pspp_linreg_cache * c)
fclose (fp);
}
}
fclose (fp);
}
}
+
static int
static int
-regression_custom_export (struct cmd_regression *cmd UNUSED, void *aux UNUSED)
+regression_custom_export (struct
lexer *lexer, struct dataset *ds UNUSED, struct
cmd_regression *cmd UNUSED, void *aux UNUSED)
{
/* 0 on failure, 1 on success, 2 on failure that should result in syntax error */
{
/* 0 on failure, 1 on success, 2 on failure that should result in syntax error */
- if (!lex_force_match ('('))
+ if (!lex_force_match (
lexer,
'('))
return 0;
return 0;
- if (lex_match ('*'))
+ if (lex_match (
lexer,
'*'))
model_file = NULL;
else
{
model_file = NULL;
else
{
- model_file = fh_parse (FH_REF_FILE);
+ model_file = fh_parse (
lexer,
FH_REF_FILE);
if (model_file == NULL)
return 0;
}
if (model_file == NULL)
return 0;
}
- if (!lex_force_match (')'))
+ if (!lex_force_match (
lexer,
')'))
return 0;
return 1;
}
int
return 0;
return 1;
}
int
-cmd_regression (
void
)
+cmd_regression (
struct lexer *lexer, struct dataset *ds
)
{
{
- if (!parse_regression (&cmd, NULL))
+ if (!parse_regression (
lexer, ds,
&cmd, NULL))
return CMD_FAILURE;
models = xnmalloc (cmd.n_dependent, sizeof *models);
return CMD_FAILURE;
models = xnmalloc (cmd.n_dependent, sizeof *models);
- if (!multipass_procedure_with_splits (
current_dataset
, run_regression, &cmd))
+ if (!multipass_procedure_with_splits (
ds
, run_regression, &cmd))
return CMD_CASCADING_FAILURE;
return CMD_CASCADING_FAILURE;
- subcommand_save (cmd.sbc_save, models);
+ subcommand_save (
ds,
cmd.sbc_save, models);
free (v_variables);
free (models);
return pspp_reg_rc;
free (v_variables);
free (models);
return pspp_reg_rc;
@@
-974,7
+980,7
@@
mark_missing_cases (const struct casefile *cf, struct variable *v,
size_t row;
const union value *val;
size_t row;
const union value *val;
- for (r = casefile_get_reader (cf);
+ for (r = casefile_get_reader (cf
, NULL
);
casereader_read (r, &c); case_destroy (&c))
{
row = casereader_cnum (r) - 1;
casereader_read (r, &c); case_destroy (&c))
{
row = casereader_cnum (r) - 1;
@@
-998,18
+1004,20
@@
mark_missing_cases (const struct casefile *cf, struct variable *v,
/* Parser for the variables sub command */
static int
/* Parser for the variables sub command */
static int
-regression_custom_variables (struct cmd_regression *cmd UNUSED,
- void *aux UNUSED)
+regression_custom_variables (struct lexer *lexer, struct dataset *ds,
+ struct cmd_regression *cmd UNUSED,
+ void *aux UNUSED)
{
{
+ const struct dictionary *dict = dataset_dict (ds);
- lex_match ('=');
+ lex_match (
lexer,
'=');
- if ((
token != T_ID || dict_lookup_var (dataset_dict (current_dataset), tokid
) == NULL)
- &&
token
!= T_ALL)
+ if ((
lex_token (lexer) != T_ID || dict_lookup_var (dict, lex_tokid (lexer)
) == NULL)
+ &&
lex_token (lexer)
!= T_ALL)
return 2;
return 2;
- if (!parse_variables (
dataset_dict (current_dataset)
, &v_variables, &n_variables, PV_NONE))
+ if (!parse_variables (
lexer, dict
, &v_variables, &n_variables, PV_NONE))
{
free (v_variables);
return 0;
{
free (v_variables);
return 0;
@@
-1081,16
+1089,17
@@
prepare_data (int n_data, int is_missing_case[],
return n_data;
}
static void
return n_data;
}
static void
-coeff_init (pspp_linreg_cache *c, struct design_matrix *dm)
+coeff_init (pspp_linreg_cache *
c, struct design_matrix *dm)
{
c->coeff = xnmalloc (dm->m->size2 + 1, sizeof (*c->coeff));
{
c->coeff = xnmalloc (dm->m->size2 + 1, sizeof (*c->coeff));
- c->coeff[0] = xmalloc (sizeof (*(c->coeff[0]))); /* The first coefficient is the intercept. */
+ c->coeff[0] = xmalloc (sizeof (*(c->coeff[0])));
/* The first coefficient is the intercept. */
c->coeff[0]->v_info = NULL; /* Intercept has no associated variable. */
pspp_coeff_init (c->coeff + 1, dm);
}
c->coeff[0]->v_info = NULL; /* Intercept has no associated variable. */
pspp_coeff_init (c->coeff + 1, dm);
}
+
static bool
run_regression (const struct ccase *first,
static bool
run_regression (const struct ccase *first,
-
const struct casefile *cf, void *cmd_ UNUSED
)
+
const struct casefile *cf, void *cmd_ UNUSED, const struct dataset *ds
)
{
size_t i;
size_t n_data = 0; /* Number of valide cases. */
{
size_t i;
size_t n_data = 0; /* Number of valide cases. */
@@
-1114,11
+1123,11
@@
run_regression (const struct ccase *first,
assert (models != NULL);
assert (models != NULL);
- output_split_file_values (first);
+ output_split_file_values (
ds,
first);
if (!v_variables)
{
if (!v_variables)
{
- dict_get_vars (dataset_dict (
current_dataset
), &v_variables, &n_variables,
+ dict_get_vars (dataset_dict (
ds
), &v_variables, &n_variables,
1u << DC_SYSTEM);
}
1u << DC_SYSTEM);
}
@@
-1177,7
+1186,7
@@
run_regression (const struct ccase *first,
The second pass fills the design matrix.
*/
row = 0;
The second pass fills the design matrix.
*/
row = 0;
- for (r = casefile_get_reader (cf); casereader_read (r, &c);
+ for (r = casefile_get_reader (cf
, NULL
); casereader_read (r, &c);
case_destroy (&c))
/* Iterate over the cases. */
{
case_destroy (&c))
/* Iterate over the cases. */
{
@@
-1223,7
+1232,7
@@
run_regression (const struct ccase *first,
coefficients.
*/
coeff_init (models[k], X);
coefficients.
*/
coeff_init (models[k], X);
-
+
/*
Find the least-squares estimates and other statistics.
*/
/*
Find the least-squares estimates and other statistics.
*/