Files
llama.cpp-mtp-turboquant/tests/test-turbo-quant.c

55 lines
2.7 KiB
C

#include <stdio.h>
#include <math.h>
#include <string.h>
extern void quantize_row_turbo3_0_ref(const float * x, void * y, long long k);
extern void dequantize_row_turbo3_0(const void * x, float * y, long long k);
extern void quantize_row_turbo4_0_ref(const float * x, void * y, long long k);
extern void dequantize_row_turbo4_0(const void * x, float * y, long long k);
int main(void) {
const int d = 128;
char buf[256];
float input[128], output[128];
float mse, cosv, ni, no;
printf("=== TurboQuant C Round-Trip Test ===\n\n");
/* Test 1: basis vector */
memset(input, 0, sizeof(input));
input[0] = 1.0f;
quantize_row_turbo3_0_ref(input, buf, d);
dequantize_row_turbo3_0(buf, output, d);
printf("Test 1 (turbo3): e0 = [1, 0, ...]\n");
printf(" In: [%.6f, %.6f, %.6f, %.6f]\n", input[0], input[1], input[2], input[3]);
printf(" Out: [%.6f, %.6f, %.6f, %.6f]\n", output[0], output[1], output[2], output[3]);
mse = cosv = ni = no = 0;
for (int i = 0; i < d; i++) { mse += (input[i]-output[i])*(input[i]-output[i]); cosv += input[i]*output[i]; ni += input[i]*input[i]; no += output[i]*output[i]; }
printf(" MSE=%.8f Cosine=%.6f OutNorm=%.6f\n\n", mse/d, ni > 0 && no > 0 ? cosv/sqrtf(ni)/sqrtf(no) : 0, sqrtf(no));
/* Test 2: large-norm vector */
for (int i = 0; i < d; i++) input[i] = sinf(i*0.1f+0.5f) * 10.0f;
quantize_row_turbo3_0_ref(input, buf, d);
dequantize_row_turbo3_0(buf, output, d);
printf("Test 2 (turbo3): sin*10\n");
printf(" In: [%.4f, %.4f, %.4f, %.4f]\n", input[0], input[1], input[2], input[3]);
printf(" Out: [%.4f, %.4f, %.4f, %.4f]\n", output[0], output[1], output[2], output[3]);
mse = cosv = ni = no = 0;
for (int i = 0; i < d; i++) { mse += (input[i]-output[i])*(input[i]-output[i]); cosv += input[i]*output[i]; ni += input[i]*input[i]; no += output[i]*output[i]; }
printf(" MSE=%.8f Cosine=%.6f InNorm=%.2f OutNorm=%.2f\n\n", mse/d, cosv/sqrtf(ni)/sqrtf(no), sqrtf(ni), sqrtf(no));
/* Test 3: turbo4 */
for (int i = 0; i < d; i++) input[i] = cosf(i*0.2f) * 5.0f;
quantize_row_turbo4_0_ref(input, buf, d);
dequantize_row_turbo4_0(buf, output, d);
printf("Test 3 (turbo4): cos*5\n");
printf(" In: [%.4f, %.4f, %.4f, %.4f]\n", input[0], input[1], input[2], input[3]);
printf(" Out: [%.4f, %.4f, %.4f, %.4f]\n", output[0], output[1], output[2], output[3]);
mse = cosv = ni = no = 0;
for (int i = 0; i < d; i++) { mse += (input[i]-output[i])*(input[i]-output[i]); cosv += input[i]*output[i]; ni += input[i]*input[i]; no += output[i]*output[i]; }
printf(" MSE=%.8f Cosine=%.6f\n\n", mse/d, cosv/sqrtf(ni)/sqrtf(no));
printf("=== Done ===\n");
return 0;
}