printf ("</category>\n");
}
-static void
+static int
dump_dim(int indx)
{
int n_categories;
check_permutation(indexes, n_indexes, "categories");
fprintf (stdout, "</dimension>\n");
+ return n_indexes;
}
int n_dims;
+static int dim_n_cats[64];
+#define MAX_DIMS (sizeof dim_n_cats / sizeof *dim_n_cats)
+
static void
dump_dims(void)
{
n_dims = get_u32();
+ assert(n_dims < MAX_DIMS);
for (int i = 0; i < n_dims; i++)
- dump_dim (i);
+ dim_n_cats[i] = dump_dim (i);
}
static void
printf ("<data>\n");
for (int i = 0; i < x; i++)
{
- printf (" <datum index=\"%d\">\n", get_u32());
+ unsigned int indx = get_u32();
+ printf (" <datum index=\"%d\" coords=", indx);
+
+ int coords[MAX_DIMS];
+ for (int i = n_dims; i-- > 0; )
+ {
+ coords[i] = indx % dim_n_cats[i];
+ indx /= dim_n_cats[i];
+ }
+ for (int i = 0; i < n_dims; i++)
+ printf("%c%d", i ? ',' : '"', coords[i]);
+
+ printf ("\">\n");
match_u32_assert(0);
if (version == 1)
match_byte(0);
@example
data := int[layers] int[rows] int[columns] int*[n-dimensions]
+ int[n-data] datum*[n-data]
@end example
The values of @code{layers}, @code{rows}, and @code{columns} each
@code{columns} of them specify the dimensions represented by columns.
When there is more than one dimension of a given kind, the inner
dimensions are given first.
+
+@example
+datum := int64[index] 00? value @r{# Version 1.}
+datum := int64[index] value @r{# Version 3.}
+@end example
+
+A datum consists of an index and a value. Suppose there are @math{d}
+dimensions and dimension @math{i} for @math{0 \le i < d} has
+@math{n_i} categories. Consider the datum at coordinates @math{x_i}
+for @math{0 \le i < d}; note that @math{0 \le x_i < n_i}. Then the
+index is calculated by the following algorithm:
+
+@display
+let index = 0
+for each @math{i} from 0 to @math{d - 1}:
+ index = @math{n_i \times} index + @math{x_i}
+@end display
+
+For example, suppose there are 3 dimensions with 3, 4, and 5
+categories, respectively. The datum at coordinates (1, 2, 3) has
+index @math{5 \times (4 \times (3 \times 0 + 1) + 2) + 3 = 33}.
+
+The format of a datum varies slightly from version 1 to version 3, in
+that version 1 has an extra optional 00 byte.