/* Writes case C to CSV file W. */ static void csv_file_casewriter_write (struct casewriter *writer, void *w_, struct ccase *c) { struct csv_writer *w = w_; if (ferror (w->file)) { casewriter_force_error (writer); case_unref (c); return; } csv_write_case (w, c); case_unref (c); }
/* Update IA according to the contents of DICT and CREADER. CREADER will be destroyed by this function. */ void update_assistant (struct import_assistant *ia) { struct sheet_spec_page *ssp = ia->sheet_spec; int rows = 0; if (ssp->dict) { struct ccase *c; int col; ia->column_cnt = dict_get_var_cnt (ssp->dict); ia->columns = xcalloc (ia->column_cnt, sizeof (*ia->columns)); for (col = 0; col < ia->column_cnt ; ++col) { const struct variable *var = dict_get_var (ssp->dict, col); ia->columns[col].name = xstrdup (var_get_name (var)); ia->columns[col].contents = NULL; } for (; (c = casereader_read (ssp->reader)) != NULL; case_unref (c)) { rows++; for (col = 0; col < ia->column_cnt ; ++col) { char *ss; const struct variable *var = dict_get_var (ssp->dict, col); ia->columns[col].contents = xrealloc (ia->columns[col].contents, sizeof (struct substring) * rows); ss = data_out (case_data (c, var), dict_get_encoding (ssp->dict), var_get_print_format (var)); ia->columns[col].contents[rows - 1] = ss_cstr (ss); } if (rows > MAX_PREVIEW_LINES) { case_unref (c); break; } } } ia->file.line_cnt = rows; }
/* Advances FILE to its next case. If BY is nonnull, then FILE's is_minimal member is updated based on whether the new case's BY values still match those in BY. */ static void advance_file (struct comb_file *file, union value by[]) { case_unref (file->data); file->data = casereader_read (file->reader); if (by) file->is_minimal = (file->data != NULL && subcase_equal_cx (&file->by_vars, file->data, by)); }
void order_stats_accumulate_idx (struct order_stats **os, size_t nos, struct casereader *reader, int wt_idx, int val_idx) { struct ccase *cx; struct ccase *prev_cx = NULL; double prev_value = -DBL_MAX; double cc_i = 0; double c_i = 0; for (; (cx = casereader_read (reader)) != NULL; case_unref (cx)) { const double weight = (wt_idx == -1) ? 1.0 : case_data_idx (cx, wt_idx)->f; const double this_value = case_data_idx (cx, val_idx)->f; /* The casereader MUST be sorted */ assert (this_value >= prev_value); if ( prev_value == -DBL_MAX || prev_value == this_value) c_i += weight; if ( prev_value > -DBL_MAX && this_value > prev_value) { update_k_values (prev_cx, prev_value, c_i, cc_i, os, nos); c_i = weight; } case_unref (prev_cx); cc_i += weight; prev_value = this_value; prev_cx = case_ref (cx); } update_k_values (prev_cx, prev_value, c_i, cc_i, os, nos); case_unref (prev_cx); casereader_destroy (reader); }
/* Reads FILE, which must be of type COMB_TABLE, until it encounters a case with BY or greater for its BY variables. Returns true if a case with exactly BY for its BY variables was found, otherwise false. */ static bool scan_table (struct comb_file *file, union value by[]) { while (file->data != NULL) { int cmp = subcase_compare_3way_xc (&file->by_vars, by, file->data); if (cmp > 0) { case_unref (file->data); file->data = casereader_read (file->reader); } else return cmp == 0; } return false; }
/* Frees all the data for the procedure. */ static void free_comb_proc (struct comb_proc *proc) { close_all_comb_files (proc); dict_destroy (proc->dict); casewriter_destroy (proc->output); case_matcher_destroy (proc->matcher); if (proc->prev_BY) { caseproto_destroy_values (subcase_get_proto (&proc->by_vars), proc->prev_BY); free (proc->prev_BY); } subcase_destroy (&proc->by_vars); case_unref (proc->buffered_case); }
static GString * clip_to_html (void) { casenumber r; GString *string; const size_t val_cnt = caseproto_get_n_widths (casereader_get_proto (clip_datasheet)); const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet); const size_t var_cnt = dict_get_var_cnt (clip_dict); /* Guestimate the size needed */ string = g_string_sized_new (80 + 20 * val_cnt * case_cnt); g_string_append (string, "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"); g_string_append (string, "<table>\n"); for (r = 0 ; r < case_cnt ; ++r ) { int c; struct ccase *cc = casereader_peek (clip_datasheet, r); if (cc == NULL) { g_warning ("Clipboard seems to have inexplicably shrunk"); break; } g_string_append (string, "<tr>\n"); for (c = 0 ; c < var_cnt ; ++c) { const struct variable *v = dict_get_var (clip_dict, c); g_string_append (string, "<td>"); data_out_g_string (string, v, cc); g_string_append (string, "</td>\n"); } g_string_append (string, "</tr>\n"); case_unref (cc); } g_string_append (string, "</table>\n"); return string; }
static GString * clip_to_text (void) { casenumber r; GString *string; const size_t val_cnt = caseproto_get_n_widths (casereader_get_proto (clip_datasheet)); const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet); const size_t var_cnt = dict_get_var_cnt (clip_dict); string = g_string_sized_new (10 * val_cnt * case_cnt); for (r = 0 ; r < case_cnt ; ++r ) { int c; struct ccase *cc; cc = casereader_peek (clip_datasheet, r); if (cc == NULL) { g_warning ("Clipboard seems to have inexplicably shrunk"); break; } for (c = 0 ; c < var_cnt ; ++c) { const struct variable *v = dict_get_var (clip_dict, c); data_out_g_string (string, v, cc); if ( c < val_cnt - 1 ) g_string_append (string, "\t"); } if ( r < case_cnt) g_string_append (string, "\n"); case_unref (cc); } return string; }
/* Closes all the files in PROC and frees their associated data. */ static void close_all_comb_files (struct comb_proc *proc) { size_t i; for (i = 0; i < proc->n_files; i++) { struct comb_file *file = &proc->files[i]; subcase_destroy (&file->by_vars); subcase_destroy (&file->src); subcase_destroy (&file->dst); free (file->mv); fh_unref (file->handle); dict_destroy (file->dict); casereader_destroy (file->reader); case_unref (file->data); free (file->in_name); } free (proc->files); proc->files = NULL; proc->n_files = 0; }
/* Parses and executes the AGGREGATE procedure. */ int cmd_aggregate (struct lexer *lexer, struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); struct agr_proc agr; struct file_handle *out_file = NULL; struct casereader *input = NULL, *group; struct casegrouper *grouper; struct casewriter *output = NULL; bool copy_documents = false; bool presorted = false; bool saw_direction; bool ok; memset(&agr, 0 , sizeof (agr)); agr.missing = ITEMWISE; agr.src_dict = dict; subcase_init_empty (&agr.sort); /* OUTFILE subcommand must be first. */ lex_match (lexer, T_SLASH); if (!lex_force_match_id (lexer, "OUTFILE")) goto error; lex_match (lexer, T_EQUALS); if (!lex_match (lexer, T_ASTERISK)) { out_file = fh_parse (lexer, FH_REF_FILE, dataset_session (ds)); if (out_file == NULL) goto error; } if (out_file == NULL && lex_match_id (lexer, "MODE")) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "ADDVARIABLES")) { agr.add_variables = true; /* presorted is assumed in ADDVARIABLES mode */ presorted = true; } else if (lex_match_id (lexer, "REPLACE")) { agr.add_variables = false; } else goto error; } if ( agr.add_variables ) agr.dict = dict_clone (dict); else agr.dict = dict_create (dict_get_encoding (dict)); dict_set_label (agr.dict, dict_get_label (dict)); dict_set_documents (agr.dict, dict_get_documents (dict)); /* Read most of the subcommands. */ for (;;) { lex_match (lexer, T_SLASH); if (lex_match_id (lexer, "MISSING")) { lex_match (lexer, T_EQUALS); if (!lex_match_id (lexer, "COLUMNWISE")) { lex_error_expecting (lexer, "COLUMNWISE", NULL); goto error; } agr.missing = COLUMNWISE; } else if (lex_match_id (lexer, "DOCUMENT")) copy_documents = true; else if (lex_match_id (lexer, "PRESORTED")) presorted = true; else if (lex_force_match_id (lexer, "BREAK")) { int i; lex_match (lexer, T_EQUALS); if (!parse_sort_criteria (lexer, dict, &agr.sort, &agr.break_vars, &saw_direction)) goto error; agr.break_var_cnt = subcase_get_n_fields (&agr.sort); if (! agr.add_variables) for (i = 0; i < agr.break_var_cnt; i++) dict_clone_var_assert (agr.dict, agr.break_vars[i]); /* BREAK must follow the options. */ break; } else goto error; } if (presorted && saw_direction) msg (SW, _("When PRESORTED is specified, specifying sorting directions " "with (A) or (D) has no effect. Output data will be sorted " "the same way as the input data.")); /* Read in the aggregate functions. */ lex_match (lexer, T_SLASH); if (!parse_aggregate_functions (lexer, dict, &agr)) goto error; /* Delete documents. */ if (!copy_documents) dict_clear_documents (agr.dict); /* Cancel SPLIT FILE. */ dict_set_split_vars (agr.dict, NULL, 0); /* Initialize. */ agr.case_cnt = 0; if (out_file == NULL) { /* The active dataset will be replaced by the aggregated data, so TEMPORARY is moot. */ proc_cancel_temporary_transformations (ds); proc_discard_output (ds); output = autopaging_writer_create (dict_get_proto (agr.dict)); } else { output = any_writer_open (out_file, agr.dict); if (output == NULL) goto error; } input = proc_open (ds); if (!subcase_is_empty (&agr.sort) && !presorted) { input = sort_execute (input, &agr.sort); subcase_clear (&agr.sort); } for (grouper = casegrouper_create_vars (input, agr.break_vars, agr.break_var_cnt); casegrouper_get_next_group (grouper, &group); casereader_destroy (group)) { struct casereader *placeholder = NULL; struct ccase *c = casereader_peek (group, 0); if (c == NULL) { casereader_destroy (group); continue; } initialize_aggregate_info (&agr); if ( agr.add_variables ) placeholder = casereader_clone (group); { struct ccase *cg; for (; (cg = casereader_read (group)) != NULL; case_unref (cg)) accumulate_aggregate_info (&agr, cg); } if (agr.add_variables) { struct ccase *cg; for (; (cg = casereader_read (placeholder)) != NULL; case_unref (cg)) dump_aggregate_info (&agr, output, cg); casereader_destroy (placeholder); } else { dump_aggregate_info (&agr, output, c); } case_unref (c); } if (!casegrouper_destroy (grouper)) goto error; if (!proc_commit (ds)) { input = NULL; goto error; } input = NULL; if (out_file == NULL) { struct casereader *next_input = casewriter_make_reader (output); if (next_input == NULL) goto error; dataset_set_dict (ds, agr.dict); dataset_set_source (ds, next_input); agr.dict = NULL; } else { ok = casewriter_destroy (output); output = NULL; if (!ok) goto error; } agr_destroy (&agr); fh_unref (out_file); return CMD_SUCCESS; error: if (input != NULL) proc_commit (ds); casewriter_destroy (output); agr_destroy (&agr); fh_unref (out_file); return CMD_CASCADING_FAILURE; }
static void do_reliability (struct casereader *input, struct dataset *ds, const struct reliability *rel) { int i; int si; struct ccase *c; casenumber n_missing ; casenumber n_valid = 0; for (si = 0 ; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; s->m = xzalloc (sizeof (s->m) * s->n_items); s->total = moments1_create (MOMENT_VARIANCE); for (i = 0 ; i < s->n_items ; ++i ) s->m[i] = moments1_create (MOMENT_VARIANCE); } input = casereader_create_filter_missing (input, rel->variables, rel->n_variables, rel->exclude, &n_missing, NULL); for (si = 0 ; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; s->totals_idx = caseproto_get_n_widths (casereader_get_proto (input)); input = casereader_create_append_numeric (input, append_sum, s, NULL); } for (; (c = casereader_read (input)) != NULL; case_unref (c)) { double weight = 1.0; n_valid ++; for (si = 0; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; for (i = 0 ; i < s->n_items ; ++i ) moments1_add (s->m[i], case_data (c, s->items[i])->f, weight); moments1_add (s->total, case_data_idx (c, s->totals_idx)->f, weight); } } casereader_destroy (input); for (si = 0; si < rel->n_sc; ++si) { struct cronbach *s = &rel->sc[si]; s->sum_of_variances = 0; for (i = 0 ; i < s->n_items ; ++i ) { double weight, mean, variance; moments1_calculate (s->m[i], &weight, &mean, &variance, NULL, NULL); s->sum_of_variances += variance; } moments1_calculate (s->total, NULL, NULL, &s->variance_of_sums, NULL, NULL); s->alpha = alpha (s->n_items, s->sum_of_variances, s->variance_of_sums); } text_item_submit (text_item_create_format (TEXT_ITEM_PARAGRAPH, _("Scale: %s"), ds_cstr (&rel->scale_name))); case_processing_summary (n_valid, n_missing, dataset_dict (ds)); }
void sign_execute (const struct dataset *ds, struct casereader *input, enum mv_class exclude, const struct npar_test *test, bool exact UNUSED, double timer UNUSED) { int i; bool warn = true; const struct dictionary *dict = dataset_dict (ds); const struct two_sample_test *t2s = UP_CAST (test, const struct two_sample_test, parent); struct ccase *c; struct sign_test_params *stp = xcalloc (t2s->n_pairs, sizeof *stp); struct casereader *r = input; for (; (c = casereader_read (r)) != NULL; case_unref (c)) { const double weight = dict_get_case_weight (dict, c, &warn); for (i = 0 ; i < t2s->n_pairs; ++i ) { variable_pair *vp = &t2s->pairs[i]; const union value *value0 = case_data (c, (*vp)[0]); const union value *value1 = case_data (c, (*vp)[1]); const double diff = value0->f - value1->f; if (var_is_value_missing ((*vp)[0], value0, exclude)) continue; if (var_is_value_missing ((*vp)[1], value1, exclude)) continue; if ( diff > 0) stp[i].pos += weight; else if (diff < 0) stp[i].neg += weight; else stp[i].ties += weight; } } casereader_destroy (r); for (i = 0 ; i < t2s->n_pairs; ++i ) { int r = MIN (stp[i].pos, stp[i].neg); stp[i].one_tailed_sig = gsl_cdf_binomial_P (r, 0.5, stp[i].pos + stp[i].neg); stp[i].point_prob = gsl_ran_binomial_pdf (r, 0.5, stp[i].pos + stp[i].neg); } output_frequency_table (t2s, stp, dict); output_statistics_table (t2s, stp); free (stp); }