projects
/
pspp
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
887bf95
)
fix one bug with clabels
author
Ben Pfaff
<blp@cs.stanford.edu>
Mon, 17 Jan 2022 04:22:55 +0000
(20:22 -0800)
committer
Ben Pfaff
<blp@cs.stanford.edu>
Sun, 13 Mar 2022 23:56:02 +0000
(16:56 -0700)
src/language/stats/ctables.c
patch
|
blob
|
history
diff --git
a/src/language/stats/ctables.c
b/src/language/stats/ctables.c
index 4235002c28932deeb3dfe7ea4486d57758dcf4ab..af53a6b6c53643a9d577a0b06a01d43e5db06880 100644
(file)
--- a/
src/language/stats/ctables.c
+++ b/
src/language/stats/ctables.c
@@
-328,7
+328,7
@@
struct ctables_table
const struct variable *clabels_example;
struct hmap clabels_values_map;
const struct variable *clabels_example;
struct hmap clabels_values_map;
-
union value
*clabels_values;
+
struct ctables_value *
*clabels_values;
size_t n_clabels_values;
enum pivot_axis_type slabels_axis;
size_t n_clabels_values;
enum pivot_axis_type slabels_axis;
@@
-2589,15
+2589,11
@@
ctables_table_output (struct ctables *ct, struct ctables_table *t)
const struct ctables_categories *c = t->categories[var_get_dict_index (var)];
for (size_t i = 0; i < t->n_clabels_values; i++)
{
const struct ctables_categories *c = t->categories[var_get_dict_index (var)];
for (size_t i = 0; i < t->n_clabels_values; i++)
{
- const union value *value = &t->clabels_values[i];
- const struct ctables_category *cat = ctables_categories_match (c, value, var);
- if (!cat)
- {
- pivot_category_create_leaf (d->root, pivot_value_new_integer (value->f)); /* XXX */
- continue;
- }
+ const struct ctables_value *value = t->clabels_values[i];
+ const struct ctables_category *cat = ctables_categories_match (c, &value->value, var);
+ assert (cat != NULL);
pivot_category_create_leaf (d->root, ctables_category_create_label (
pivot_category_create_leaf (d->root, ctables_category_create_label (
- cat, t->clabels_example, value));
+ cat, t->clabels_example,
&value->
value));
}
}
}
}
@@
-2806,10
+2802,8
@@
ctables_table_output (struct ctables *ct, struct ctables_table *t)
const struct variable *var = clabels_nest->vars[clabels_nest->n - 1];
const union value *value = &cell->axes[t->clabels_from_axis].cvs[clabels_nest->n - 1].value;
const struct ctables_value *ctv = ctables_value_find (t, value, var_get_width (var));
const struct variable *var = clabels_nest->vars[clabels_nest->n - 1];
const union value *value = &cell->axes[t->clabels_from_axis].cvs[clabels_nest->n - 1].value;
const struct ctables_value *ctv = ctables_value_find (t, value, var_get_width (var));
-
- printf ("leaf=%d\n", ctv ? ctv->leaf : 0);
- dindexes[n_dindexes++] = ctv ? ctv->leaf : 0; /* XXX */
- //dindexes[n_dindexes++] = 0;
+ assert (ctv != NULL);
+ dindexes[n_dindexes++] = ctv->leaf;
}
for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++)
}
for (enum pivot_axis_type a = 0; a < PIVOT_N_AXES; a++)
@@
-3085,9
+3079,17
@@
ctables_insert_clabels_values (struct ctables_table *t, const struct ccase *c,
for (size_t i = 0; i < stack->n; i++)
{
const struct ctables_nest *nest = &stack->nests[i];
for (size_t i = 0; i < stack->n; i++)
{
const struct ctables_nest *nest = &stack->nests[i];
- const struct variable *v = nest->vars[nest->n - 1];
- int width = var_get_width (v);
- const union value *value = case_data (c, v);
+ const struct variable *var = nest->vars[nest->n - 1];
+ int width = var_get_width (var);
+ const union value *value = case_data (c, var);
+
+ if (var_is_numeric (var) && value->f == SYSMIS)
+ continue;
+
+ if (!ctables_categories_match (t->categories [var_get_dict_index (var)],
+ value, var))
+ continue;
+
unsigned int hash = value_hash (value, width, 0);
struct ctables_value *clv = ctables_value_find__ (t, value, width, hash);
unsigned int hash = value_hash (value, width, 0);
struct ctables_value *clv = ctables_value_find__ (t, value, width, hash);
@@
-3103,10
+3105,12
@@
ctables_insert_clabels_values (struct ctables_table *t, const struct ccase *c,
static int
compare_clabels_values_3way (const void *a_, const void *b_, const void *width_)
{
static int
compare_clabels_values_3way (const void *a_, const void *b_, const void *width_)
{
- const union value *a = a_;
- const union value *b = b_;
+ const struct ctables_value *const *ap = a_;
+ const struct ctables_value *const *bp = b_;
+ const struct ctables_value *a = *ap;
+ const struct ctables_value *b = *bp;
const int *width = width_;
const int *width = width_;
- return value_compare_3way (
a, b
, *width);
+ return value_compare_3way (
&a->value, &b->value
, *width);
}
static void
}
static void
@@
-3120,16
+3124,15
@@
ctables_sort_clabels_values (struct ctables_table *t)
struct ctables_value *clv;
size_t i = 0;
HMAP_FOR_EACH (clv, struct ctables_value, node, &t->clabels_values_map)
struct ctables_value *clv;
size_t i = 0;
HMAP_FOR_EACH (clv, struct ctables_value, node, &t->clabels_values_map)
- {
- clv->leaf = i;
- t->clabels_values[i] = clv->value;
- i++;
- }
+ t->clabels_values[i++] = clv;
t->n_clabels_values = n;
assert (i == n);
sort (t->clabels_values, n, sizeof *t->clabels_values,
compare_clabels_values_3way, &width);
t->n_clabels_values = n;
assert (i == n);
sort (t->clabels_values, n, sizeof *t->clabels_values,
compare_clabels_values_3way, &width);
+
+ for (size_t i = 0; i < n; i++)
+ t->clabels_values[i]->leaf = i;
}
static bool
}
static bool