#include "../../squiggle.h" #include #include #include #include #include #define NUM_SAMPLES 1000000 // Example cdf float cdf_uniform_0_1(float x) { if (x < 0) { return 0; } else if (x > 1) { return 1; } else { return x; } } float cdf_squared_0_1(float x) { if (x < 0) { return 0; } else if (x > 1) { return 1; } else { return x * x; } } float cdf_normal_0_1(float x) { float mean = 0; float std = 1; return 0.5 * (1 + erf((x - mean) / (std * sqrt(2)))); // erf from math.h } // Some testers void test_inverse_cdf_float(char* cdf_name, float cdf_float(float)) { struct box result = inverse_cdf_float(cdf_float, 0.5); if (result.empty) { printf("Inverse for %s not calculated\n", cdf_name); exit(1); } else { printf("Inverse of %s at %f is: %f\n", cdf_name, 0.5, result.content); } } void test_and_time_sampler_float(char* cdf_name, float cdf_float(float), uint32_t* seed) { printf("\nGetting some samples from %s:\n", cdf_name); clock_t begin = clock(); for (int i = 0; i < NUM_SAMPLES; i++) { struct box sample = sampler_float_cdf(cdf_float, seed); if (sample.empty) { printf("Error in sampler function for %s", cdf_name); } else { // printf("%f\n", sample.content); } } clock_t end = clock(); float time_spent = (float)(end - begin) / CLOCKS_PER_SEC; printf("Time spent: %f\n", time_spent); } int main() { // Test inverse cdf float test_inverse_cdf_float("cdf_uniform_0_1", cdf_uniform_0_1); test_inverse_cdf_float("cdf_squared_0_1", cdf_squared_0_1); test_inverse_cdf_float("cdf_normal_0_1", cdf_normal_0_1); // Testing samplers // set randomness seed uint32_t* seed = malloc(sizeof(uint32_t)); *seed = 1000; // xorshift can't start with 0 // Test float sampler test_and_time_sampler_float("cdf_uniform_0_1", cdf_uniform_0_1, seed); test_and_time_sampler_float("cdf_squared_0_1", cdf_squared_0_1, seed); test_and_time_sampler_float("cdf_normal_0_1", cdf_normal_0_1, seed); // Get some normal samples using a previous approach printf("\nGetting some samples from unit_normal\n"); clock_t begin_2 = clock(); for (int i = 0; i < NUM_SAMPLES; i++) { float normal_sample = unit_normal(seed); // printf("%f\n", normal_sample); } clock_t end_2 = clock(); float time_spent_2 = (float)(end_2 - begin_2) / CLOCKS_PER_SEC; printf("Time spent: %f\n", time_spent_2); free(seed); return 0; }