feat: start adding paralellism; recompile.

This commit is contained in:
NunoSempere 2023-11-18 23:54:31 +00:00
parent 6387c0df70
commit d3af874403
37 changed files with 72 additions and 42 deletions

View File

@ -301,7 +301,8 @@ Overall, I'd describe the error handling capabilities of this library as pretty
## To do list
- [ ] Think about whether to write a simple version of this for [uxn](https://100r.co/site/uxn.html), a minimalistic portable programming stack which, sadly, doesn't have doubles (64 bit floats)
- [ ] Document paralellism
- [ ] Document confidence intervals
- [ ] Point out that, even though the C standard is ambiguous about this, this code assumes that doubles are 64 bit precision (otherwise the xorshift should be different).
- [ ] Document rudimentary algebra manipulations for normal/lognormal
- [ ] Think through whether to delete cdf => samples function
@ -310,11 +311,11 @@ Overall, I'd describe the error handling capabilities of this library as pretty
- complexify and use boxes for everything
- leave as is
- [ ] Systematize references
- [ ] Publish online
- [ ] Support all distribution functions in <https://www.squiggle-language.com/docs/Api/Dist>
- [ ] do so efficiently
- [ ] Add more functions to do algebra and get the 90% c.i. of normals, lognormals, betas, etc.
- Think through which of these make sense.
- [ ] Disambiguate sample_laplace--successes vs failures || successes vs total trials as two distinct and differently named functions
## Done
@ -373,5 +374,5 @@ Overall, I'd describe the error handling capabilities of this library as pretty
- [ ] Consider desirability of defining shortcuts for those functions. Adds a level of magic, though.
- [ ] Test results
- [x] Move to own file? Or signpost in file? => signposted in file.
- [ ] Disambiguate sample_laplace--successes vs failures || successes vs total trials as two distinct and differently named functions
- [ ] Write twitter thread.
- [x] Write twitter thread: now [here](https://twitter.com/NunoSempere/status/1707041153210564959); retweets appreciated.
- [ ] ~~Think about whether to write a simple version of this for [uxn](https://100r.co/site/uxn.html), a minimalistic portable programming stack which, sadly, doesn't have doubles (64 bit floats)~~

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,12 +9,13 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies
OPENMP=-fopenmp
MATH=-lm
DEPENDENCIES=$(MATH)
DEPENDENCIES=$(MATH) $(OPENMP)
# OPENMP=-fopenmp
## Flags

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

View File

@ -9,7 +9,7 @@ CC=gcc
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=example
## Dependencies

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@ CC=gcc
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=example
## Dependencies

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

Binary file not shown.

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>
@ -17,10 +17,10 @@ int main()
printf("The 90%% confidence interval of Lognormal(%f, %f) is [%f, %f]\n",
ln1.logmean, ln1.logstd,
ln1_ci.low, ln1_ci.high);
lognormal_params ln1_ci_paramas = convert_ci_to_lognormal_params(ln1_ci);
lognormal_params ln1_params2 = convert_ci_to_lognormal_params(ln1_ci);
printf("The lognormal which has 90%% confidence interval [%f, %f] is Lognormal(%f, %f)\n",
ln1_ci.low, ln1_ci.high,
ln1.logmean, ln1.logstd);
ln1_params2.logmean, ln1_params2.logstd);
lognormal_params ln2 = convert_ci_to_lognormal_params((ci) { .low = 1, .high = 10 });
lognormal_params ln3 = convert_ci_to_lognormal_params((ci) { .low = 5, .high = 50 });

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

View File

@ -1,5 +1,5 @@
#include "../../squiggle.h"
#include "../../extra.h"
#include "../../squiggle_more.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

View File

@ -9,7 +9,7 @@ CC=gcc # required for nested functions
# CC=tcc # <= faster compilation
# Main file
SRC=example.c ../../squiggle.c ../../extra.c
SRC=example.c ../../squiggle.c ../../squiggle_more.c
OUTPUT=./example
## Dependencies

Binary file not shown.

View File

@ -9,12 +9,14 @@ int main()
// set randomness seed
uint64_t* seed = malloc(sizeof(uint64_t));
*seed = 1000; // xorshift can't start with a seed of 0
/*
for (int i = 0; i < 100; i++) {
double draw = sample_unit_uniform(seed);
printf("%f\n", draw);
}
}*/
// Test division
printf("\n%d\n", 10 % 3);
free(seed);
}

View File

@ -1,15 +1,7 @@
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
// # Key functionality
// Define the minimum number of functions needed to do simple estimation
// Starts here, ends until the end of the mixture function
// math constants
#define PI 3.14159265358979323846 // M_PI in gcc gnu99

View File

@ -1,12 +1,11 @@
#include "squiggle.h"
#include <float.h>
#include <limits.h>
#include <math.h>
#include <limits.h>
#include <omp.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
#include "squiggle.h"
// math constants
#define PI 3.14159265358979323846 // M_PI in gcc gnu99
@ -18,7 +17,8 @@
#define PROCESS_ERROR(error_msg) process_error(error_msg, EXIT_ON_ERROR, __FILE__, __LINE__)
// Get confidence intervals, given a sampler
// Not in core yet because I'm not sure how much I like the interface,
// Not in core yet because I'm not sure how much I like the struct
// and the built-in 100k samples
// to do: add n to function parameters and document
typedef struct ci_t {
@ -303,3 +303,37 @@ ci convert_lognormal_params_to_ci(lognormal_params y)
ci result = { .low = exp(loglow), .high = exp(loghigh) };
return result;
}
// Paralellism
/*
void paralellize(float (*sampler)(uint64_t* seed), float* results, int n_threads, int n_samples){
if((n_samples % n_threads) != 0){
fprintf(stderr, "Number of samples isn't divisible by number of threads, aborting\n");
exit(1);
}
uint64_t** seeds = malloc(n_threads * sizeof(uint64_t*));
for (uint64_t i = 0; i < n_threads; i++) {
seeds[i] = malloc(sizeof(uint64_t));
*seeds[i] = i + 1; // xorshift can't start with 0
}
int i;
#pragma omp parallel private(i)
{
#pragma omp for
for (i = 0; i < n_threads; i++) {
int lower_bound = i * (n_samples / n_threads);
int upper_bound = ((i+1) * (n_samples / n_threads)) - 1;
// printf("Lower bound: %d, upper bound: %d\n", lower_bound, upper_bound);
for (int j = lower_bound; j < upper_bound; j++) {
results[j] = sampler(seeds[i]);
}
}
}
for (uint64_t i = 0; i < n_threads; i++) {
free(seeds[i]);
}
free(seeds);
}
*/