star-sp

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

commit 179d474e4484fda313cd385dce77843775a706b3
parent 4cd944558355e2906b109aa34c6ccf16f32bd6ee
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 27 Oct 2015 16:19:29 +0100

Add and test the ssp_rng_[proxy_]_get_type functions

Retrieve the type used by the [proxy] RNG. Add the ssp_rng_type_eq
inline function that test if 2 types are equals.

Diffstat:
Msrc/ssp.h | 30++++++++++++++++++++++++++++++
Msrc/ssp_rng.c | 8++++++++
Msrc/ssp_rng_proxy.c | 9+++++++++
Msrc/test_ssp_rng.c | 7+++++++
Msrc/test_ssp_rng_proxy.c | 15+++++++++++++++
5 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/src/ssp.h b/src/ssp.h @@ -81,6 +81,26 @@ struct ssp_rng_type { size_t sizeof_state; }; +static FINLINE char +ssp_rng_type_eq(const struct ssp_rng_type* t0, const struct ssp_rng_type* t1) +{ + ASSERT(t0 && t1); + return t0->init == t1->init + && t0->release == t1->release + && t0->set == t1->set + && t0->get == t1->get + && t0->discard == t1->discard + && t0->uniform_uint64 == t1->uniform_uint64 + && t0->uniform_double == t1->uniform_double + && t0->canonical == t1->canonical + && t0->read == t1->read + && t0->write == t1->write + && t0->entropy == t1->entropy + && t0->min == t1->min + && t0->max == t1->max + && t0->sizeof_state == t1->sizeof_state; +} + BEGIN_DECLS /* David Jones's Keep It Simple Stupid builtin PRNG type. Suitable for fast @@ -122,6 +142,11 @@ ssp_rng_ref_get (struct ssp_rng* rng); SSP_API res_T +ssp_rng_get_type + (struct ssp_rng* rng, + struct ssp_rng_type* type); + +SSP_API res_T ssp_rng_set (struct ssp_rng* rng, const uint64_t seed); @@ -205,6 +230,11 @@ ssp_rng_proxy_create_rng const size_t ibucket, struct ssp_rng** rng); +SSP_API res_T +ssp_rng_proxy_get_type + (struct ssp_rng_proxy* proxy, + struct ssp_rng_type* type); + /******************************************************************************* * Miscellaneous distributions ******************************************************************************/ diff --git a/src/ssp_rng.c b/src/ssp_rng.c @@ -585,6 +585,14 @@ ssp_rng_ref_put(struct ssp_rng* rng) return RES_OK; } +res_T +ssp_rng_get_type(struct ssp_rng* rng, struct ssp_rng_type* type) +{ + if(!rng || !type) return RES_BAD_ARG; + *type = rng->type; + return RES_OK; +} + uint64_t ssp_rng_get(struct ssp_rng* rng) { diff --git a/src/ssp_rng_proxy.c b/src/ssp_rng_proxy.c @@ -496,3 +496,12 @@ error: goto exit; } +res_T +ssp_rng_proxy_get_type + (struct ssp_rng_proxy* proxy, + struct ssp_rng_type* type) +{ + if(!proxy || !type) return RES_BAD_ARG; + *type = proxy->type; + return RES_OK; +} diff --git a/src/test_ssp_rng.c b/src/test_ssp_rng.c @@ -41,6 +41,7 @@ static void /* Really basic test */ test_rng(const struct ssp_rng_type* type) { FILE* stream; + struct ssp_rng_type type2; struct ssp_rng* rng = NULL; struct ssp_rng* rng1 = NULL; struct ssp_rng* rng2 = NULL; @@ -77,6 +78,12 @@ test_rng(const struct ssp_rng_type* type) #endif CHECK(r, RES_OK); + CHECK(ssp_rng_get_type(NULL, NULL), RES_BAD_ARG); + CHECK(ssp_rng_get_type(rng, NULL), RES_BAD_ARG); + CHECK(ssp_rng_get_type(NULL, &type2), RES_BAD_ARG); + CHECK(ssp_rng_get_type(rng, &type2), RES_OK); + CHECK(ssp_rng_type_eq(type, &type2), 1); + CHECK(ssp_rng_ref_get(NULL), RES_BAD_ARG); CHECK(ssp_rng_ref_get(rng), RES_OK); CHECK(ssp_rng_ref_put(NULL), RES_BAD_ARG); diff --git a/src/test_ssp_rng_proxy.c b/src/test_ssp_rng_proxy.c @@ -34,6 +34,7 @@ int main(int argc, char** argv) { + struct ssp_rng_type type; struct ssp_rng_proxy* proxy; struct ssp_rng_proxy* proxy1, *proxy2; struct ssp_rng* rng[4]; @@ -54,6 +55,13 @@ main(int argc, char** argv) CHECK(ssp_rng_proxy_create(NULL, NULL, 4, &proxy), RES_BAD_ARG); CHECK(ssp_rng_proxy_create(NULL, &ssp_rng_mt19937_64, 4, &proxy), RES_OK); + CHECK(ssp_rng_proxy_get_type(NULL, NULL), RES_BAD_ARG); + CHECK(ssp_rng_proxy_get_type(proxy, NULL), RES_BAD_ARG); + CHECK(ssp_rng_proxy_get_type(NULL, &type), RES_BAD_ARG); + CHECK(ssp_rng_proxy_get_type(proxy, &type), RES_OK); + + CHECK(ssp_rng_type_eq(&type, &ssp_rng_kiss), 0); + CHECK(ssp_rng_type_eq(&type, &ssp_rng_mt19937_64), 1); CHECK(ssp_rng_proxy_ref_get(NULL), RES_BAD_ARG); CHECK(ssp_rng_proxy_ref_get(proxy), RES_OK); @@ -75,6 +83,13 @@ main(int argc, char** argv) } CHECK(ssp_rng_proxy_ref_put(proxy), RES_OK); + CHECK(ssp_rng_get_type(rng[0], &type), RES_OK); + FOR_EACH(i, 1, 4) { + struct ssp_rng_type type2; + CHECK(ssp_rng_get_type(rng[i], &type2), RES_OK); + CHECK(ssp_rng_type_eq(&type, &type2), 1); + } + FOR_EACH(i, 0, 2000000) { uint64_t r[4]; int j;