#ifndef SQUIGGLEC #define SQUIGGLEC // uint64_t header #include // Pseudo Random number generator uint64_t xorshift64(uint64_t* seed); // Basic distribution sampling functions double sample_unit_uniform(uint64_t* seed); double sample_unit_normal(uint64_t* seed); // Composite distribution sampling functions double sample_uniform(double start, double end, uint64_t* seed); double sample_normal(double mean, double sigma, uint64_t* seed); double sample_lognormal(double logmean, double logsigma, uint64_t* seed); double sample_to(double low, double high, uint64_t* seed); double sample_gamma(double alpha, uint64_t* seed); double sample_beta(double a, double b, uint64_t* seed); double sample_laplace(double successes, double failures, uint64_t* seed); // Array helpers double array_sum(double* array, int length); void array_cumsum(double* array_to_sum, double* array_cumsummed, int length); double array_mean(double* array, int length); double array_std(double* array, int length); // Mixture function double sample_mixture(double (*samplers[])(uint64_t*), double* weights, int n_dists, uint64_t* seed); // Box struct box { int empty; double content; char* error_msg; }; // Macros to handle errors #define MAX_ERROR_LENGTH 500 #define EXIT_ON_ERROR 0 #define PROCESS_ERROR(error_msg) process_error(error_msg, EXIT_ON_ERROR, __FILE__, __LINE__) struct box process_error(const char* error_msg, int should_exit, char* file, int line); // Inverse cdf struct box inverse_cdf_double(double cdf(double), double p); struct box inverse_cdf_box(struct box cdf_box(double), double p); // Samplers from cdf struct box sampler_cdf_double(double cdf(double), uint64_t* seed); struct box sampler_cdf_box(struct box cdf(double), uint64_t* seed); // Get 90% confidence interval struct c_i { float low; float high; }; struct c_i get_90_confidence_interval(double (*sampler)(uint64_t*), uint64_t* seed); // small algebra system typedef struct normal_params_t { double mean; double std; } normal_params; typedef struct lognormal_params_t { double logmean; double logstd; } lognormal_params; normal_params algebra_sum_normals(normal_params a, normal_params b); normal_params algebra_shift_normal(normal_params a, double shift); lognormal_params algebra_product_lognormals(lognormal_params a, lognormal_params b); lognormal_params algebra_scale_lognormal(lognormal_params a, double k); #endif