From e3adf9d9793aa1302548a63a1e7d84a25e1420a8 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Sat, 8 Jan 2022 12:46:58 +0530 Subject: Add C code for experiments. * experiments/cube.c, experiments/integral.c, experiments/spheroid.c, experiments/volume.c: New files. --- experiments/volume.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 experiments/volume.c (limited to 'experiments/volume.c') diff --git a/experiments/volume.c b/experiments/volume.c new file mode 100644 index 0000000..3a20d43 --- /dev/null +++ b/experiments/volume.c @@ -0,0 +1,106 @@ +#include +#include + +#include + +#include "extent-sampling.h" +#include "oracles.h" +#include "utils.h" + +#define RTOLS 3 +#define RTOL1 0.2 +#define RTOL2 0.1 +#define RTOL3 0.05 + +typedef double (*true_volume_t) (unsigned int); +gsl_rng* r; + +#define MAX_EXTENT 1.0 +double uniform_oracle (const gsl_vector* x) { + return gsl_ran_flat(r, 0, MAX_EXTENT); +} + +double uniform_true_volume_dim (unsigned int dim) +{ + return uniform_true_volume(0, MAX_EXTENT, dim); +} +#undef MAX_EXTENT + +#define ALPHA 2 +#define BETA 2 +double beta_oracle (const gsl_vector* x) { + return beta_extent_generator(r, ALPHA, BETA); +} + +double beta_true_volume_dim (unsigned int dim) +{ + return beta_true_volume(ALPHA, BETA, dim); +} +#undef ALPHA +#undef BETA + +double arcsine_oracle (const gsl_vector* x) { + return beta_extent_generator(r, 0.5, 0.5); +} + +double arcsine_true_volume_dim (unsigned int dim) +{ + return beta_true_volume(0.5, 0.5, dim); +} + +#define EDGE 1.0 +double cube_oracle (const gsl_vector* x) { + return cube_extent_oracle(x, EDGE); +} + +double cube_true_volume_dim (unsigned int dim) +{ + return cube_true_volume(EDGE, dim); +} +#undef EDGE + +void run_experiment (extent_oracle_t oracle, true_volume_t true_volume, const char* filename_prefix, + int dim_start, int dim_step, int dim_stop) +{ + gsl_rstat_workspace* stats = gsl_rstat_alloc(); + printf("dimension\trtol=%g\trtol=%g\trtol=%g\n", RTOL1, RTOL2, RTOL3); + double rtol[RTOLS] = {RTOL1, RTOL2, RTOL3}; + FILE *fp[RTOLS]; + for (int i=0; i