Commit: 6ec7908d14402bbfa240372c5ee79f8eb2be67f2
Parent: 0e5c533b5dedfafec57b5f8016e1b98abaa4ce01
Author: Randy Palamar
Date: Fri, 20 Jun 2025 15:03:57 -0600
core: support hadamard dims 20, 40, 80, 160
Diffstat:
M | util.c | | | 44 | +++++++++++++++++++++++++++++++++----------- |
1 file changed, 33 insertions(+), 11 deletions(-)
diff --git a/util.c b/util.c
@@ -840,6 +840,29 @@ make_hadamard_transpose(Arena *a, u32 dim)
1, -1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1,
};
+ read_only local_persist i32 hadamard_20_20_transpose[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1,
+ 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1,
+ 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1,
+ 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1,
+ 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1,
+ 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1,
+ 1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1,
+ 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1,
+ 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1,
+ 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1,
+ 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1,
+ 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1,
+ 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1,
+ 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1,
+ 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1,
+ 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
+ 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1,
+ 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1,
+ 1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1,
+ };
+
i32 *result = 0;
b32 power_of_2 = ISPOWEROF2(dim);
@@ -850,11 +873,10 @@ make_hadamard_transpose(Arena *a, u32 dim)
u32 base_dim = 0;
if (power_of_2) {
base_dim = dim;
- } else if (multiple_of_20) {
- /* TODO(rnp): hadamard 20 */
- //base_dim = 20;
- //dim /= 20;
- } else if (multiple_of_12 && dim != 36) {
+ } else if (multiple_of_20 && ISPOWEROF2(dim / 20)) {
+ base_dim = 20;
+ dim /= 20;
+ } else if (multiple_of_12 && ISPOWEROF2(dim / 12)) {
base_dim = 12;
dim /= 12;
}
@@ -879,13 +901,13 @@ make_hadamard_transpose(Arena *a, u32 dim)
}
#undef IND
- if (dim != base_dim) {
- ASSERT(base_dim == 12);
- i32 *m2 = hadamard_12_12_transpose;
- kronecker_product(result,
- m, (uv2){.x = dim, .y = dim},
- m2, (uv2){.x = base_dim, .y = base_dim});
+ i32 *m2 = 0;
+ uv2 m2_dim;
+ switch (base_dim) {
+ case 12:{ m2 = hadamard_12_12_transpose; m2_dim = (uv2){{12, 12}}; }break;
+ case 20:{ m2 = hadamard_20_20_transpose; m2_dim = (uv2){{20, 20}}; }break;
}
+ if (m2) kronecker_product(result, m, (uv2){{dim, dim}}, m2, m2_dim);
}
return result;