+
+int
+cmd_debug_matrix_read (struct lexer *lexer, struct dataset *ds)
+{
+ if (lex_match_id (lexer, "NODATA"))
+ {
+ struct casereader *cr = casewriter_make_reader (
+ mem_writer_create (dict_get_proto (dataset_dict (ds))));
+ struct matrix_reader *mr = matrix_reader_create (dataset_dict (ds), cr);
+ if (!mr)
+ {
+ casereader_destroy (cr);
+ return CMD_FAILURE;
+ }
+ matrix_reader_destroy (mr);
+ return CMD_SUCCESS;
+ }
+
+ struct matrix_reader *mr = matrix_reader_create (dataset_dict (ds),
+ proc_open (ds));
+ if (!mr)
+ return CMD_FAILURE;
+
+ struct pivot_table *pt = pivot_table_create ("Debug Matrix Reader");
+
+ enum mm_stat
+ {
+ MM_CORR,
+ MM_COV,
+ MM_N,
+ MM_MEAN,
+ MM_STDDEV,
+ };
+ const char *mm_stat_names[] = {
+ [MM_CORR] = "Correlation",
+ [MM_COV] = "Covariance",
+ [MM_N] = "N",
+ [MM_MEAN] = "Mean",
+ [MM_STDDEV] = "Standard Deviation",
+ };
+ enum { N_STATS = sizeof mm_stat_names / sizeof *mm_stat_names };
+ for (size_t i = 0; i < 2; i++)
+ {
+ struct pivot_dimension *d = pivot_dimension_create (
+ pt,
+ i ? PIVOT_AXIS_COLUMN : PIVOT_AXIS_ROW,
+ i ? "Column" : "Row");
+ if (!i)
+ pivot_category_create_leaf_rc (d->root, pivot_value_new_text ("Value"),
+ PIVOT_RC_CORRELATION);
+ for (size_t j = 0; j < mr->n_cvars; j++)
+ pivot_category_create_leaf_rc (
+ d->root, pivot_value_new_variable (mr->cvars[j]),
+ PIVOT_RC_CORRELATION);
+ }
+
+ struct pivot_dimension *stat = pivot_dimension_create (pt, PIVOT_AXIS_ROW,
+ "Statistic");
+ for (size_t i = 0; i < N_STATS; i++)
+ pivot_category_create_leaf (stat->root,
+ pivot_value_new_text (mm_stat_names[i]));
+
+ struct pivot_dimension *split = pivot_dimension_create (
+ pt, PIVOT_AXIS_ROW, "Split");
+
+ int split_num = 0;
+
+ struct matrix_material mm = MATRIX_MATERIAL_INIT;
+ while (matrix_reader_next (&mm, mr, NULL))
+ {
+ pivot_category_create_leaf (split->root,
+ pivot_value_new_integer (split_num + 1));
+
+ const gsl_matrix *m[N_STATS] = {
+ [MM_CORR] = mm.corr,
+ [MM_COV] = mm.cov,
+ [MM_N] = mm.n,
+ [MM_MEAN] = mm.mean_matrix,
+ [MM_STDDEV] = mm.var_matrix,
+ };
+
+ for (size_t i = 0; i < N_STATS; i++)
+ if (m[i])
+ {
+ if (i == MM_COV || i == MM_CORR)
+ {
+ for (size_t y = 0; y < mr->n_cvars; y++)
+ for (size_t x = 0; x < mr->n_cvars; x++)
+ pivot_table_put4 (
+ pt, y + 1, x, i, split_num,
+ pivot_value_new_number (gsl_matrix_get (m[i], y, x)));
+ }
+ else
+ for (size_t x = 0; x < mr->n_cvars; x++)
+ {
+ double n = gsl_matrix_get (m[i], 0, x);
+ if (i == MM_STDDEV)
+ n = sqrt (n);
+ pivot_table_put4 (pt, 0, x, i, split_num,
+ pivot_value_new_number (n));
+ }
+ }
+
+ split_num++;
+ matrix_material_uninit (&mm);
+ }
+ pivot_table_submit (pt);
+
+ proc_commit (ds);
+
+ matrix_reader_destroy (mr);
+ return CMD_SUCCESS;
+}