projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Categoricals.c Create entries for all groups.
[pspp]
/
src
/
math
/
categoricals.c
diff --git
a/src/math/categoricals.c
b/src/math/categoricals.c
index 5c96c40cc359a1ec87f00594890eb00cfe75c577..c544f97e98000ade273bd78785bd9a9a4b924e1b 100644
(file)
--- a/
src/math/categoricals.c
+++ b/
src/math/categoricals.c
@@
-91,14
+91,18
@@
void
categoricals_destroy ( struct categoricals *cat)
{
int i;
categoricals_destroy ( struct categoricals *cat)
{
int i;
- for (i = 0 ; i < cat->n_vp; ++i)
- hmap_destroy (&cat->vp[i].map);
-
- pool_destroy (cat->pool);
- free (cat);
+ if (cat != NULL)
+ {
+ for (i = 0 ; i < cat->n_vp; ++i)
+ hmap_destroy (&cat->vp[i].map);
+
+ pool_destroy (cat->pool);
+ free (cat);
+ }
}
}
+#if 0
void
categoricals_dump (const struct categoricals *cat)
{
void
categoricals_dump (const struct categoricals *cat)
{
@@
-129,8
+133,8
@@
categoricals_dump (const struct categoricals *cat)
for (node = hmap_first (m); node; node = hmap_next (m, node))
{
struct string s;
for (node = hmap_first (m); node; node = hmap_next (m, node))
{
struct string s;
- ds_init_empty (&s);
const struct value_node *vn = HMAP_DATA (node, struct value_node, node);
const struct value_node *vn = HMAP_DATA (node, struct value_node, node);
+ ds_init_empty (&s);
var_append_value_name (vp->var, &vn->value, &s);
printf ("Value: %s; Index %d; CC %g\n",
ds_cstr (&s),
var_append_value_name (vp->var, &vn->value, &s);
printf ("Value: %s; Index %d; CC %g\n",
ds_cstr (&s),
@@
-148,10
+152,11
@@
categoricals_dump (const struct categoricals *cat)
printf ("\nReverse variable map:\n");
printf ("\nReverse variable map:\n");
- for (v = 0 ; v < cat->n_cats_total
- cat->n_vars
; ++v)
+ for (v = 0 ; v < cat->n_cats_total; ++v)
printf ("%d ", cat->reverse_variable_map[v]);
printf ("\n");
}
printf ("%d ", cat->reverse_variable_map[v]);
printf ("\n");
}
+#endif
@@
-278,7
+283,7
@@
categoricals_done (struct categoricals *cat)
int v;
int idx = 0;
cat->reverse_variable_map = pool_calloc (cat->pool,
int v;
int idx = 0;
cat->reverse_variable_map = pool_calloc (cat->pool,
- cat->n_cats_total
- cat->n_vars
,
+ cat->n_cats_total,
sizeof *cat->reverse_variable_map);
for (v = 0 ; v < cat->n_vp; ++v)
sizeof *cat->reverse_variable_map);
for (v = 0 ; v < cat->n_vp; ++v)
@@
-299,9
+304,8
@@
categoricals_done (struct categoricals *cat)
}
/* Populate the reverse variable map.
}
/* Populate the reverse variable map.
- This implementation considers the first value of each categorical variable
- as the basis. Therefore, this loop starts from 1 instead of 0 */
- for (i = 1; i < vp->n_cats; ++i)
+ */
+ for (i = 0; i < vp->n_cats; ++i)
cat->reverse_variable_map[idx++] = v;
}
cat->reverse_variable_map[idx++] = v;
}
@@
-309,26
+313,31
@@
categoricals_done (struct categoricals *cat)
}
}
+static int
+reverse_variable_lookup (const struct categoricals *cat, int subscript)
+{
+ assert (cat->reverse_variable_map);
+ assert (subscript >= 0);
+ assert (subscript < cat->n_cats_total);
+
+ return cat->reverse_variable_map[subscript];
+}
+
/* Return the categorical variable corresponding to SUBSCRIPT */
const struct variable *
categoricals_get_variable_by_subscript (const struct categoricals *cat, int subscript)
{
/* Return the categorical variable corresponding to SUBSCRIPT */
const struct variable *
categoricals_get_variable_by_subscript (const struct categoricals *cat, int subscript)
{
- int index;
-
- assert (cat->reverse_variable_map);
-
- index = cat->reverse_variable_map[subscript];
+ int index = reverse_variable_lookup (cat, subscript);
return cat->vp[index].var;
}
return cat->vp[index].var;
}
-
/* Return the value corresponding to SUBSCRIPT */
const union value *
categoricals_get_value_by_subscript (const struct categoricals *cat, int subscript)
{
/* Return the value corresponding to SUBSCRIPT */
const union value *
categoricals_get_value_by_subscript (const struct categoricals *cat, int subscript)
{
- int vindex =
cat->reverse_variable_map[subscript]
;
+ int vindex =
reverse_variable_lookup (cat, subscript)
;
const struct var_params *vp = &cat->vp[vindex];
const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];
const struct var_params *vp = &cat->vp[vindex];
const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];
@@
-339,7
+348,7
@@
categoricals_get_value_by_subscript (const struct categoricals *cat, int subscri
double
categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript)
{
double
categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript)
{
- int vindex =
cat->reverse_variable_map[subscript]
;
+ int vindex =
reverse_variable_lookup (cat, subscript)
;
const struct var_params *vp = &cat->vp[vindex];
return vp->cc;
const struct var_params *vp = &cat->vp[vindex];
return vp->cc;
@@
-348,7
+357,7
@@
categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscr
double
categoricals_get_sum_by_subscript (const struct categoricals *cat, int subscript)
{
double
categoricals_get_sum_by_subscript (const struct categoricals *cat, int subscript)
{
- int vindex =
cat->reverse_variable_map[subscript]
;
+ int vindex =
reverse_variable_lookup (cat, subscript)
;
const struct var_params *vp = &cat->vp[vindex];
const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];
const struct var_params *vp = &cat->vp[vindex];
const struct value_node *vn = vp->reverse_value_map [subscript - vp->base_subscript];