+size_t categoricals_n_total (const struct categoricals *cat);
+
+/* Degrees of freedom.
+
+ A categorical variable with N_CATS categories has N_CATS - 1 degrees of
+ freedom.
+
+ An interaction's degrees of freedom is the product of its variables' degrees
+ of freedom.
+
+ A categorical object's degrees of freedom is the sum of its interactions'
+ degrees of freedom. */
+size_t categoricals_df (const struct categoricals *cat, size_t n);
+size_t categoricals_df_total (const struct categoricals *cat);
+
+size_t categoricals_get_n_variables (const struct categoricals *cat);
+
+/* Sanity. */
+bool categoricals_sane (const struct categoricals *cat);
+
+/* "Short map".
+
+ These look up an interaction within a categoricals object on the basis of a
+ "subscript". Interaction 0 with DF_0 degrees of freedom is assigned
+ subscripts [0, DF_0 - 1], interaction 1 with DF_1 degrees of freedom is
+ assigned subscripts [DF_0, DF_0 + DF_1 - 1], and so on. The subscripts
+ passed in must be in the range [0, DF_SUM - 1] where DF_SUM is the total
+ number of degrees of freedom for the object, as returned by
+ categoricals_df_total().
+
+ These functions are intended for covariance matrix routines, where normally
+ 1 less than the total number of distinct values of each categorical variable
+ should be considered.
+
+ These functions may be used on an object only after calling
+ categoricals_done().
+*/
+double categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript);
+const struct interaction *categoricals_get_interaction_by_subscript (const struct categoricals *cat, int subscript);
+
+double categoricals_get_sum_by_subscript (const struct categoricals *cat, int subscript);
+double
+categoricals_get_dummy_code_for_case (const struct categoricals *cat, int subscript,
+ const struct ccase *c);
+double
+categoricals_get_effects_code_for_case (const struct categoricals *cat, int subscript,
+ const struct ccase *c);
+
+
+/* "Long map".
+
+ These look up an interaction within a categoricals object on the basis of a
+ "category index". Interaction 0 in CAT with CAT_0 categories has indexes
+ [0, CAT_0 - 1], interaction 1 with CAT_1 categories has indexes [CAT_0,
+ CAT_0 + CAT_1 - 1], and so on. The indexes passed in must be in the range
+ [0, CAT_TOTAL - 1] where CAT_TOTAL is the total number of categories for the
+ object, as returned by categoricals_n_total().
+
+ These functions are useful for descriptive statistics.
+
+ These functions may be used on an object only after calling
+ categoricals_done().
+*/
+const struct ccase *
+categoricals_get_case_by_category_real (const struct categoricals *cat, int iact, int n);
+void *
+categoricals_get_user_data_by_category_real (const struct categoricals *cat, int iact, int n);
+void * categoricals_get_user_data_by_category (const struct categoricals *cat, int category);
+const struct ccase * categoricals_get_case_by_category (const struct categoricals *cat, int subscript);