diff options
author | Kevin Sheppard <kevin.k.sheppard@gmail.com> | 2021-03-22 12:28:45 +0000 |
---|---|---|
committer | Kevin Sheppard <kevin.k.sheppard@gmail.com> | 2021-03-22 17:13:07 +0000 |
commit | d4a270640b451636c76cb7cff52cc5a1a8a12b6c (patch) | |
tree | 4f073d7b6d8b32a43ade8ceef7b59651b685aacd /numpy/random/src | |
parent | 8ada030bd5b37c764ae83449b46c93d743455b40 (diff) | |
download | numpy-d4a270640b451636c76cb7cff52cc5a1a8a12b6c.tar.gz |
PERF: Use exponentials in place of inversion
Use exponentials rather than generating exponentials via inversion
Diffstat (limited to 'numpy/random/src')
-rw-r--r-- | numpy/random/src/distributions/distributions.c | 4 | ||||
-rw-r--r-- | numpy/random/src/legacy/legacy-distributions.c | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/numpy/random/src/distributions/distributions.c b/numpy/random/src/distributions/distributions.c index 6b4deb925..9bdfa9bea 100644 --- a/numpy/random/src/distributions/distributions.c +++ b/numpy/random/src/distributions/distributions.c @@ -508,7 +508,7 @@ double random_lognormal(bitgen_t *bitgen_state, double mean, double sigma) { } double random_rayleigh(bitgen_t *bitgen_state, double mode) { - return mode * sqrt(-2.0 * npy_log1p(-next_double(bitgen_state))); + return mode * sqrt(2.0 * random_standard_exponential(bitgen_state)); } double random_standard_t(bitgen_t *bitgen_state, double df) { @@ -960,7 +960,7 @@ RAND_INT_TYPE random_geometric_search(bitgen_t *bitgen_state, double p) { } int64_t random_geometric_inversion(bitgen_t *bitgen_state, double p) { - return (int64_t)ceil(npy_log1p(-next_double(bitgen_state)) / npy_log1p(-p)); + return (int64_t)ceil(-random_standard_exponential(bitgen_state) / npy_log1p(-p)); } int64_t random_geometric(bitgen_t *bitgen_state, double p) { diff --git a/numpy/random/src/legacy/legacy-distributions.c b/numpy/random/src/legacy/legacy-distributions.c index bfea15e40..443c1a4bf 100644 --- a/numpy/random/src/legacy/legacy-distributions.c +++ b/numpy/random/src/legacy/legacy-distributions.c @@ -112,6 +112,10 @@ double legacy_chisquare(aug_bitgen_t *aug_state, double df) { return 2.0 * legacy_standard_gamma(aug_state, df / 2.0); } +double legacy_rayleigh(bitgen_t *bitgen_state, double mode) { + return mode * sqrt(-2.0 * npy_log1p(-next_double(bitgen_state))); +} + double legacy_noncentral_chisquare(aug_bitgen_t *aug_state, double df, double nonc) { double out; |