star-sp

Random number generators and distributions
git clone git://git.meso-star.fr/star-sp.git
Log | Files | Refs | README | LICENSE

commit 5a90e5071b7981ee82146989272cd1c382c5431f
parent 04a54103593f5de0d826fee23d370f03002d4547
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue,  5 Jul 2016 14:52:31 +0200

API Fix: needed an arg to return value.

Diffstat:
Msrc/ssp.h | 18++++++++++++------
Msrc/ssp_distributions.cpp | 29+++++++++++++++++------------
Msrc/test_ssp_ran_gaussian.c | 8+++++---
Msrc/test_ssp_ran_piecewise_linear.c | 8+++++---
4 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/src/ssp.h b/src/ssp.h @@ -602,13 +602,17 @@ SSP_API res_T ssp_ran_gaussian_ref_put (struct ssp_ran_gaussian* ran); -SSP_API double +SSP_API res_T ssp_ran_gaussian_get - (const struct ssp_ran_gaussian* ran, struct ssp_rng* rng); + (const struct ssp_ran_gaussian* ran, + struct ssp_rng* rng, + double* res); -SSP_API double +SSP_API res_T ssp_distribution_gaussian_pdf - (const struct ssp_ran_gaussian* ran, double x); + (const struct ssp_ran_gaussian* ran, + double x, + double* res); /******************************************************************************* * Piecewise linear distribution @@ -634,9 +638,11 @@ SSP_API res_T ssp_ran_piecewise_linear_ref_put (struct ssp_ran_piecewise_linear* ran); -SSP_API double +SSP_API res_T ssp_ran_piecewise_linear_get - (const struct ssp_ran_piecewise_linear *ran, struct ssp_rng* rng); + (const struct ssp_ran_piecewise_linear *ran, + struct ssp_rng* rng, + double *res); END_DECLS diff --git a/src/ssp_distributions.cpp b/src/ssp_distributions.cpp @@ -144,22 +144,24 @@ ssp_ran_gaussian_ref_put return RES_OK; } -double +res_T ssp_ran_gaussian_get - (const struct ssp_ran_gaussian *ran, struct ssp_rng* rng) + (const struct ssp_ran_gaussian *ran, struct ssp_rng* rng, double* res) { - if(!ran || !rng) return RES_BAD_ARG; + if(!ran || !rng || !res) return RES_BAD_ARG; class rng_cxx r(*rng); - return ran->state->distrib->operator()(r); + *res = ran->state->distrib->operator()(r); + return RES_OK; } -double +res_T ssp_ran_gaussian_pdf - (const struct ssp_ran_gaussian *ran, double x) + (const struct ssp_ran_gaussian *ran, double x, double* res) { - if(!ran) return RES_BAD_ARG; + if(!ran || !res) return RES_BAD_ARG; const double tmp = (x - ran->state->mu) * ran->state->K1; - return ran->state->K2 * exp(-0.5 * tmp * tmp); + *res = ran->state->K2 * exp(-0.5 * tmp * tmp); + return RES_OK; } /******************************************************************************* @@ -245,11 +247,14 @@ ssp_ran_piecewise_linear_ref_put return RES_OK; } -double +res_T ssp_ran_piecewise_linear_get - (const struct ssp_ran_piecewise_linear *ran, struct ssp_rng* rng) + (const struct ssp_ran_piecewise_linear *ran, + struct ssp_rng* rng, + double* res) { - if(!ran || !rng) return RES_BAD_ARG; + if(!ran || !rng || !res) return RES_BAD_ARG; class rng_cxx r(*rng); - return ran->state->distrib->operator()(r); + *res = ran->state->distrib->operator()(r); + return RES_OK; } diff --git a/src/test_ssp_ran_gaussian.c b/src/test_ssp_ran_gaussian.c @@ -71,12 +71,14 @@ main(int argc, char** argv) CHECK(ssp_ran_gaussian_ref_put(NULL), RES_BAD_ARG); CHECK(ssp_ran_gaussian_ref_put(gaussian), RES_OK); - CHECK(ssp_ran_gaussian_get(NULL, rng), RES_BAD_ARG); - CHECK(ssp_ran_gaussian_get(gaussian, NULL), RES_BAD_ARG); + CHECK(ssp_ran_gaussian_get(NULL, rng, &x), RES_BAD_ARG); + CHECK(ssp_ran_gaussian_get(gaussian, NULL, &x), RES_BAD_ARG); + CHECK(ssp_ran_gaussian_get(NULL, NULL, &x), RES_BAD_ARG); time_current(&start); for (i = 0; i < NBS; i++) { - double _x = ssp_ran_gaussian_get(gaussian, rng); + double _x; + CHECK(ssp_ran_gaussian_get(gaussian, rng, &_x), RES_OK); x += _x; x2 += _x * _x; } diff --git a/src/test_ssp_ran_piecewise_linear.c b/src/test_ssp_ran_piecewise_linear.c @@ -72,11 +72,13 @@ main(int argc, char** argv) CHECK(ssp_ran_piecewise_linear_ref_put(NULL), RES_BAD_ARG); CHECK(ssp_ran_piecewise_linear_ref_put(pwl), RES_OK); - CHECK(ssp_ran_piecewise_linear_get(NULL, rng), RES_BAD_ARG); - CHECK(ssp_ran_piecewise_linear_get(pwl, NULL), RES_BAD_ARG); + CHECK(ssp_ran_piecewise_linear_get(NULL, rng, &x), RES_BAD_ARG); + CHECK(ssp_ran_piecewise_linear_get(NULL, rng, &x), RES_BAD_ARG); + CHECK(ssp_ran_piecewise_linear_get(pwl, rng, NULL), RES_BAD_ARG); for (i = 0; i < NBS; i++) { - double _x = ssp_ran_piecewise_linear_get(pwl, rng); + double _x; + ssp_ran_piecewise_linear_get(pwl, rng, &_x); CHECK(0 <= _x && _x <= 10, 1); x += _x; x2 += _x * _x;