star-sp

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

commit d5ed87cb20609915dae7f58da83782d1a954c893
parent f79e41908caa31a4d83af8095dced7762f05627d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 10 Jul 2018 10:00:56 +0200

Test the uniform sphere cap random variate

Diffstat:
Mcmake/CMakeLists.txt | 11++++++-----
Asrc/test_ssp_ran_sphere_cap.c | 43+++++++++++++++++++++++++++++++++++++++++++
Asrc/test_ssp_ran_sphere_cap.h | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 196 insertions(+), 5 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -167,15 +167,16 @@ if(NOT NO_TEST) if(BUILD_R123_AES) register_test(test_ssp_rng_aes test_ssp_rng aes) endif() + new_test(test_ssp_ran_circle ${MATH_LIB}) new_test(test_ssp_ran_discrete) + new_test(test_ssp_ran_gaussian) new_test(test_ssp_ran_hemisphere ${MATH_LIB}) - new_test(test_ssp_ran_sphere ${MATH_LIB}) - new_test(test_ssp_ran_circle ${MATH_LIB}) new_test(test_ssp_ran_hg ${MATH_LIB}) - new_test(test_ssp_ran_triangle ${MATH_LIB}) - new_test(test_ssp_rng_proxy) - new_test(test_ssp_ran_gaussian) new_test(test_ssp_ran_piecewise_linear) + new_test(test_ssp_rng_proxy) + new_test(test_ssp_ran_sphere ${MATH_LIB}) + new_test(test_ssp_ran_sphere_cap ${MATH_LIB}) + new_test(test_ssp_ran_triangle ${MATH_LIB}) new_test(test_ssp_ran_uniform_disk) rcmake_copy_runtime_libraries(test_ssp_rng) endif() diff --git a/src/test_ssp_ran_sphere_cap.c b/src/test_ssp_ran_sphere_cap.c @@ -0,0 +1,43 @@ +/* Copyright (C) |Meso|Star> 2015-2018 (contact@meso-star.com) + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. */ + +#define TYPE_FLOAT 0 +#include "test_ssp_ran_sphere_cap.h" + +#define TYPE_FLOAT 1 +#include "test_ssp_ran_sphere_cap.h" + +int +main(int argc, char** argv) +{ + (void)argc, (void)argv; + test_float(); + test_double(); + return 0; +} + diff --git a/src/test_ssp_ran_sphere_cap.h b/src/test_ssp_ran_sphere_cap.h @@ -0,0 +1,147 @@ +/* Copyright (C) |Meso|Star> 2015-2018 (contact@meso-star.com) + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. */ + +#ifndef TEST_SSP_RAN_SPHERE_CAP_H +#define TEST_SSP_RAN_SPHERE_CAP_H + +#include "ssp.h" +#include "test_ssp_utils.h" + +#define NSAMPS 1024 + +#endif /* TEST_SSP_RAN_SPHERE_H */ + +#if TYPE_FLOAT==0 + #define REAL double + #define TEST test_double + #define RAN_SPHERE_CAP_UNIFORM_LOCAL ssp_ran_sphere_cap_uniform_local + #define RAN_SPHERE_CAP_UNIFORM_PDF ssp_ran_sphere_cap_uniform_pdf + #define RAN_SPHERE_CAP_UNIFORM ssp_ran_sphere_cap_uniform + #define RAN_SPHERE_UNIFORM ssp_ran_sphere_uniform + #define EQ_EPS eq_eps + #define R3_EQ_EPS d3_eq_eps + #define R3_IS_NORMALIZED d3_is_normalized + #define R3_NORMALIZE d3_normalize + #define R3_DOT d3_dot +#elif TYPE_FLOAT==1 + #define REAL float + #define TEST test_float + #define RAN_SPHERE_CAP_UNIFORM_LOCAL ssp_ran_sphere_cap_uniform_float_local + #define RAN_SPHERE_CAP_UNIFORM_PDF ssp_ran_sphere_cap_uniform_float_pdf + #define RAN_SPHERE_CAP_UNIFORM ssp_ran_sphere_cap_uniform_float + #define RAN_SPHERE_UNIFORM ssp_ran_sphere_uniform_float + #define EQ_EPS eq_epsf + #define R3_EQ_EPS f3_eq_eps + #define R3_IS_NORMALIZED f3_is_normalized + #define R3_NORMALIZE f3_normalize + #define R3_DOT f3_dot +#else + #error "TYPE_FLOAT must be defined either 0 or 1" +#endif + +static void +TEST(void) +{ + struct ssp_rng* rng; + struct mem_allocator allocator; + REAL pdf; + REAL samps[NSAMPS][3]; + REAL up[3]; + int i, j; + + mem_init_proxy_allocator(&allocator, &mem_default_allocator); + CHK(ssp_rng_create(&allocator, &ssp_rng_mt19937_64, &rng) == RES_OK); + + CHK(RAN_SPHERE_CAP_UNIFORM_LOCAL(rng, 1, samps[0], &pdf) == samps[0]); + CHK(samps[0][0] == 0); + CHK(samps[0][1] == 0); + CHK(samps[0][2] == 1); + CHK(IS_INF(pdf)); + + CHK(RAN_SPHERE_CAP_UNIFORM_LOCAL(rng,-1, samps[0], &pdf) == samps[0]); + CHK(EQ_EPS(pdf, 1/(4*(REAL)PI), (REAL)1.e-6)); + + /* Check NULL pdf */ + CHK(RAN_SPHERE_CAP_UNIFORM_LOCAL(rng, (REAL)0.2, samps[0], NULL) == samps[0]); + + FOR_EACH(i, 0, NSAMPS) { + const REAL height = (REAL)-0.7; + CHK(RAN_SPHERE_CAP_UNIFORM_LOCAL(rng, height, samps[i], &pdf) == samps[i]); + CHK(R3_IS_NORMALIZED(samps[i])); + CHK(EQ_EPS(pdf, 1/(2*(REAL)PI*(1-height)), (REAL)1.e-6)); + CHK(EQ_EPS(pdf, RAN_SPHERE_CAP_UNIFORM_PDF(height), (REAL)1.e-6)); + CHK(samps[i][2] >= height); + FOR_EACH(j, 0, i) { + CHK(!R3_EQ_EPS(samps[j], samps[i], (REAL)1.e-6)); + } + } + + /* Sample an up vector */ + RAN_SPHERE_UNIFORM(rng, up, NULL); + + CHK(RAN_SPHERE_CAP_UNIFORM(rng, up, 1, samps[0], &pdf) == samps[0]); + CHK(R3_EQ_EPS(samps[0], up, (REAL)1.e-6)); + CHK(IS_INF(pdf)); + + CHK(RAN_SPHERE_CAP_UNIFORM(rng, up, -1, samps[0], &pdf) == samps[0]); + CHK(EQ_EPS(pdf, 1/(4*(REAL)PI), (REAL)1.e-6)); + + /* Check NULL pdf */ + CHK(RAN_SPHERE_CAP_UNIFORM(rng, up, (REAL)0.2, samps[0], NULL) == samps[0]); + + FOR_EACH(i, 0, NSAMPS) { + const REAL height = (REAL)0.3; + CHK(RAN_SPHERE_CAP_UNIFORM(rng, up, height, samps[i], &pdf) == samps[i]); + CHK(R3_IS_NORMALIZED(samps[i])); + CHK(EQ_EPS(pdf, 1/(2*(REAL)PI*(1-height)), (REAL)1.e-6)); + CHK(EQ_EPS(pdf, RAN_SPHERE_CAP_UNIFORM_PDF(height), (REAL)1.e-6)); + CHK(R3_DOT(up, samps[i]) >= height); + FOR_EACH(j, 0, i) { + CHK(!R3_EQ_EPS(samps[j], samps[i], (REAL)1.e-6)); + } + } + + ssp_rng_ref_put(rng); + check_memory_allocator(&allocator); + mem_shutdown_proxy_allocator(&allocator); + + CHK(mem_allocated_size() == 0); +} + +#undef REAL +#undef TEST +#undef RAN_SPHERE_CAP_UNIFORM_LOCAL +#undef RAN_SPHERE_CAP_UNIFORM_PDF +#undef RAN_SPHERE_CAP_UNIFORM +#undef RAN_SPHERE_UNIFORM +#undef EQ_EPS +#undef R3_EQ_EPS +#undef R3_IS_NORMALIZED +#undef R3_NORMALIZE +#undef R3_DOT +#undef TYPE_FLOAT