squiggle.c/test/test.c

110 lines
3.1 KiB
C
Raw Normal View History

2023-07-23 10:41:05 +00:00
#include "../squiggle.h"
#include <stdint.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define N 1000 * 1000
#define PERCENTAGE_TOLERANCE 1.0/1000.0
2023-07-23 10:41:05 +00:00
2023-07-23 10:47:47 +00:00
void test_unit_uniform(uint64_t* seed){
double* unit_uniform_array = malloc(sizeof(double) * N);
2023-07-23 10:41:05 +00:00
for(int i=0; i<N; i++){
unit_uniform_array[i] = sample_unit_uniform(seed);
}
double mean = array_mean(unit_uniform_array, N);
double expected_mean = 0.5;
double delta_mean = mean - expected_mean;
2023-07-23 10:41:05 +00:00
double std = array_std(unit_uniform_array, N);
double expected_std = sqrt(1.0/12.0);
double delta_std = std - expected_std;
2023-07-23 10:41:05 +00:00
printf("Mean of unit uniform: %f, vs expected mean: %f, delta: %f\n", mean, expected_mean, delta_mean);
printf("Std of unit uniform: %f, vs expected std: %f, delta: %f\n", std, expected_std, delta_std);
if(fabs(delta_mean) > PERCENTAGE_TOLERANCE){
2023-07-23 10:41:05 +00:00
printf("[-] Mean test for unit uniform NOT passed.\n");
}else {
printf("[x] Mean test for unit uniform PASSED\n");
}
if(fabs(delta_std) > PERCENTAGE_TOLERANCE){
2023-07-23 10:41:05 +00:00
printf("[-] Std test for unit uniform NOT passed.\n");
}else {
printf("[x] Std test for unit uniform PASSED\n");
}
printf("\n");
}
void test_uniform(double start, double end, uint64_t* seed){
double* uniform_array = malloc(sizeof(double) * N);
2023-07-23 10:41:05 +00:00
for(int i=0; i<N; i++){
uniform_array[i] = sample_uniform(start, end, seed);
}
double mean = array_mean(uniform_array, N);
double expected_mean = (start + end) / 2;
double delta_mean = mean - expected_mean;
2023-07-23 10:41:05 +00:00
double std = array_std(uniform_array, N);
double expected_std = sqrt(1.0/12.0) * fabs(end-start);
double delta_std = std - expected_std;
2023-07-23 10:41:05 +00:00
double width = fabs(end - start);
if(fabs(delta_mean) > width * PERCENTAGE_TOLERANCE){
2023-07-23 10:41:05 +00:00
printf("[-] Mean test for [%.1f, %.1f] uniform NOT passed.\n", start, end);
printf("Mean of [%.1f, %.1f] uniform: %f, vs expected mean: %f, delta: %f\n", start, end, mean, expected_mean, mean - expected_mean);
}else {
printf("[x] Mean test for [%.1f, %.1f] uniform PASSED\n", start, end);
2023-07-23 10:41:05 +00:00
}
if(fabs(delta_std) > width * PERCENTAGE_TOLERANCE){
2023-07-23 10:41:05 +00:00
printf("[-] Std test for [%.1f, %.1f] uniform NOT passed.\n", start, end);
printf("Std of [%.1f, %.1f] uniform: %f, vs expected std: %f, delta: %f\n", start, end, std, expected_std, std - expected_std);
for(int i=0; i<10; i++){
printf("%.1f, ", uniform_array[i]);
}
2023-07-23 10:41:05 +00:00
}else {
printf("[x] Std test for [%.1f, %.1f] uniform PASSED\n", start, end);
2023-07-23 10:41:05 +00:00
}
printf("\n");
}
int main(){
// set randomness seed
2023-07-23 10:47:47 +00:00
uint64_t* seed = malloc(sizeof(uint64_t));
2023-07-23 10:41:05 +00:00
*seed = 1000; // xorshift can't start with a seed of 0
printf("Testing unit uniform\n");
2023-07-23 10:41:05 +00:00
test_unit_uniform(seed);
printf("Testing small uniforms\n");
for(int i=0; i<100; i++){
double start = sample_uniform(-10, 10, seed);
double end = sample_uniform(-10, 10, seed);
2023-07-23 10:41:05 +00:00
if ( end > start){
test_uniform(start, end, seed);
}
}
printf("Testing wide uniforms\n");
for(int i=0; i<100; i++){
double start = sample_uniform(-1000 * 1000, 1000 * 1000, seed);
double end = sample_uniform(-1000 * 1000, 1000 * 1000, seed);
if ( end > start){
test_uniform(start, end, seed);
}
}
2023-07-23 10:41:05 +00:00
free(seed);
}