From bf4625f877aee83325812c6c479af4df36a2c7e9 Mon Sep 17 00:00:00 2001 From: Hind Date: Thu, 22 Apr 2021 16:14:43 +0200 Subject: Replace hardcoded PI with M_PI from cmath --- src/common/include/gudhi/random_point_generators.h | 39 +++++++++++----------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/common/include/gudhi/random_point_generators.h b/src/common/include/gudhi/random_point_generators.h index 9dd88ac4..e02c1ed2 100644 --- a/src/common/include/gudhi/random_point_generators.h +++ b/src/common/include/gudhi/random_point_generators.h @@ -18,6 +18,7 @@ #include // for CGAL_VERSION_NR #include // for vector<> +#include // for M_PI // Make compilation fail - required for external projects - https://github.com/GUDHI/gudhi-devel/issues/10 #if CGAL_VERSION_NR < 1041101000 @@ -164,11 +165,11 @@ std::vector generate_points_on_torus_3D(std::size_t nu if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 6.2832 * k1 / num_lines; - v = 6.2832 * k2 / num_lines; + u = 2 * M_PI * k1 / num_lines; + v = 2 * M_PI * k2 / num_lines; } else { - u = rng.get_double(0, 6.2832); - v = rng.get_double(0, 6.2832); + u = rng.get_double(0, 2 * M_PI); + v = rng.get_double(0, 2 * M_PI); } Point p = construct_point(k, (R + r * std::cos(u)) * std::cos(v), @@ -200,7 +201,7 @@ static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::si (100. + radius_noise_percentage) / 100.); } std::vector cp2 = current_point; - double alpha = 6.2832 * slice_idx / num_slices; + double alpha = 2 * M_PI * slice_idx / num_slices; cp2.push_back(radius_noise_ratio * std::cos(alpha)); cp2.push_back(radius_noise_ratio * std::sin(alpha)); generate_uniform_points_on_torus_d( @@ -234,7 +235,7 @@ std::vector generate_points_on_torus_d(std::size_t num std::vector pt; pt.reserve(dim * 2); for (int curdim = 0; curdim < dim; ++curdim) { - FT alpha = rng.get_double(0, 6.2832); + FT alpha = rng.get_double(0, 2 * M_PI); pt.push_back(radius_noise_ratio * std::cos(alpha)); pt.push_back(radius_noise_ratio * std::sin(alpha)); } @@ -370,7 +371,7 @@ std::vector generate_points_on_3sphere_and_circle(std: for (std::size_t i = 0; i < num_points;) { Point p_sphere = *generator++; // First 3 coords - FT alpha = rng.get_double(0, 6.2832); + FT alpha = rng.get_double(0, 2 * M_PI); std::vector pt(5); pt[0] = k_coord(p_sphere, 0); pt[1] = k_coord(p_sphere, 1); @@ -403,11 +404,11 @@ std::vector generate_points_on_klein_bottle_3D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 6.2832 * k1 / num_lines; - v = 6.2832 * k2 / num_lines; + u = 2 * M_PI * k1 / num_lines; + v = 2 * M_PI * k2 / num_lines; } else { - u = rng.get_double(0, 6.2832); - v = rng.get_double(0, 6.2832); + u = rng.get_double(0, 2 * M_PI); + v = rng.get_double(0, 2 * M_PI); } double tmp = cos(u / 2) * sin(v) - sin(u / 2) * sin(2. * v); Point p = construct_point(k, @@ -439,11 +440,11 @@ std::vector generate_points_on_klein_bottle_4D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 6.2832 * k1 / num_lines; - v = 6.2832 * k2 / num_lines; + u = 2 * M_PI * k1 / num_lines; + v = 2 * M_PI * k2 / num_lines; } else { - u = rng.get_double(0, 6.2832); - v = rng.get_double(0, 6.2832); + u = rng.get_double(0, 2 * M_PI); + v = rng.get_double(0, 2 * M_PI); } Point p = construct_point(k, (a + b * cos(v)) * cos(u) + (noise == 0. ? 0. : rng.get_double(0, noise)), @@ -478,11 +479,11 @@ generate_points_on_klein_bottle_variant_5D( if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 6.2832 * k1 / num_lines; - v = 6.2832 * k2 / num_lines; + u = 2 * M_PI * k1 / num_lines; + v = 2 * M_PI * k2 / num_lines; } else { - u = rng.get_double(0, 6.2832); - v = rng.get_double(0, 6.2832); + u = rng.get_double(0, 2 * M_PI); + v = rng.get_double(0, 2 * M_PI); } FT x1 = (a + b * cos(v)) * cos(u); FT x2 = (a + b * cos(v)) * sin(u); -- cgit v1.2.3 From 9df34f942df8417db11c324fb0c4e2c475a5211f Mon Sep 17 00:00:00 2001 From: Hind Date: Fri, 23 Apr 2021 09:41:29 +0200 Subject: Get pi constant from boost instead of cmath (to be replaced with the C++20 standard one eventually) --- src/common/include/gudhi/random_point_generators.h | 42 +++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/common/include/gudhi/random_point_generators.h b/src/common/include/gudhi/random_point_generators.h index e02c1ed2..25a10232 100644 --- a/src/common/include/gudhi/random_point_generators.h +++ b/src/common/include/gudhi/random_point_generators.h @@ -18,7 +18,7 @@ #include // for CGAL_VERSION_NR #include // for vector<> -#include // for M_PI +#include // for pi constant // Make compilation fail - required for external projects - https://github.com/GUDHI/gudhi-devel/issues/10 #if CGAL_VERSION_NR < 1041101000 @@ -27,6 +27,8 @@ namespace Gudhi { +constexpr double pi = boost::math::constants::pi(); + /////////////////////////////////////////////////////////////////////////////// // Note: All these functions have been tested with the CGAL::Epick_d kernel /////////////////////////////////////////////////////////////////////////////// @@ -165,11 +167,11 @@ std::vector generate_points_on_torus_3D(std::size_t nu if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * M_PI * k1 / num_lines; - v = 2 * M_PI * k2 / num_lines; + u = 2 * pi * k1 / num_lines; + v = 2 * pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * M_PI); - v = rng.get_double(0, 2 * M_PI); + u = rng.get_double(0, 2 * pi); + v = rng.get_double(0, 2 * pi); } Point p = construct_point(k, (R + r * std::cos(u)) * std::cos(v), @@ -201,7 +203,7 @@ static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::si (100. + radius_noise_percentage) / 100.); } std::vector cp2 = current_point; - double alpha = 2 * M_PI * slice_idx / num_slices; + double alpha = 2 * pi * slice_idx / num_slices; cp2.push_back(radius_noise_ratio * std::cos(alpha)); cp2.push_back(radius_noise_ratio * std::sin(alpha)); generate_uniform_points_on_torus_d( @@ -235,7 +237,7 @@ std::vector generate_points_on_torus_d(std::size_t num std::vector pt; pt.reserve(dim * 2); for (int curdim = 0; curdim < dim; ++curdim) { - FT alpha = rng.get_double(0, 2 * M_PI); + FT alpha = rng.get_double(0, 2 * pi); pt.push_back(radius_noise_ratio * std::cos(alpha)); pt.push_back(radius_noise_ratio * std::sin(alpha)); } @@ -371,7 +373,7 @@ std::vector generate_points_on_3sphere_and_circle(std: for (std::size_t i = 0; i < num_points;) { Point p_sphere = *generator++; // First 3 coords - FT alpha = rng.get_double(0, 2 * M_PI); + FT alpha = rng.get_double(0, 2 * pi); std::vector pt(5); pt[0] = k_coord(p_sphere, 0); pt[1] = k_coord(p_sphere, 1); @@ -404,11 +406,11 @@ std::vector generate_points_on_klein_bottle_3D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * M_PI * k1 / num_lines; - v = 2 * M_PI * k2 / num_lines; + u = 2 * pi * k1 / num_lines; + v = 2 * pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * M_PI); - v = rng.get_double(0, 2 * M_PI); + u = rng.get_double(0, 2 * pi); + v = rng.get_double(0, 2 * pi); } double tmp = cos(u / 2) * sin(v) - sin(u / 2) * sin(2. * v); Point p = construct_point(k, @@ -440,11 +442,11 @@ std::vector generate_points_on_klein_bottle_4D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * M_PI * k1 / num_lines; - v = 2 * M_PI * k2 / num_lines; + u = 2 * pi * k1 / num_lines; + v = 2 * pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * M_PI); - v = rng.get_double(0, 2 * M_PI); + u = rng.get_double(0, 2 * pi); + v = rng.get_double(0, 2 * pi); } Point p = construct_point(k, (a + b * cos(v)) * cos(u) + (noise == 0. ? 0. : rng.get_double(0, noise)), @@ -479,11 +481,11 @@ generate_points_on_klein_bottle_variant_5D( if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * M_PI * k1 / num_lines; - v = 2 * M_PI * k2 / num_lines; + u = 2 * pi * k1 / num_lines; + v = 2 * pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * M_PI); - v = rng.get_double(0, 2 * M_PI); + u = rng.get_double(0, 2 * pi); + v = rng.get_double(0, 2 * pi); } FT x1 = (a + b * cos(v)) * cos(u); FT x2 = (a + b * cos(v)) * sin(u); -- cgit v1.2.3 From 245354222ed6090f9828dba24b3db9ad17f8dfbf Mon Sep 17 00:00:00 2001 From: Hind Date: Fri, 23 Apr 2021 15:17:28 +0200 Subject: Use double_constants instead of templated constants Use the boost double_constants namespace in each function that needs two_pi --- src/common/include/gudhi/random_point_generators.h | 54 +++++++++++++--------- 1 file changed, 33 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/common/include/gudhi/random_point_generators.h b/src/common/include/gudhi/random_point_generators.h index 25a10232..33fb182d 100644 --- a/src/common/include/gudhi/random_point_generators.h +++ b/src/common/include/gudhi/random_point_generators.h @@ -27,8 +27,6 @@ namespace Gudhi { -constexpr double pi = boost::math::constants::pi(); - /////////////////////////////////////////////////////////////////////////////// // Note: All these functions have been tested with the CGAL::Epick_d kernel /////////////////////////////////////////////////////////////////////////////// @@ -152,6 +150,8 @@ std::vector generate_points_on_moment_curve(std::size_ template std::vector generate_points_on_torus_3D(std::size_t num_points, double R, double r, bool uniform = false) { + using namespace boost::math::double_constants; + typedef typename Kernel::Point_d Point; typedef typename Kernel::FT FT; Kernel k; @@ -167,11 +167,11 @@ std::vector generate_points_on_torus_3D(std::size_t nu if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * pi * k1 / num_lines; - v = 2 * pi * k2 / num_lines; + u = two_pi * k1 / num_lines; + v = two_pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * pi); - v = rng.get_double(0, 2 * pi); + u = rng.get_double(0, two_pi); + v = rng.get_double(0, two_pi); } Point p = construct_point(k, (R + r * std::cos(u)) * std::cos(v), @@ -190,6 +190,8 @@ static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::si double radius_noise_percentage = 0., std::vector current_point = std::vector()) { + using namespace boost::math::double_constants; + CGAL::Random rng; int point_size = static_cast(current_point.size()); if (point_size == 2 * dim) { @@ -203,7 +205,7 @@ static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::si (100. + radius_noise_percentage) / 100.); } std::vector cp2 = current_point; - double alpha = 2 * pi * slice_idx / num_slices; + double alpha = two_pi * slice_idx / num_slices; cp2.push_back(radius_noise_ratio * std::cos(alpha)); cp2.push_back(radius_noise_ratio * std::sin(alpha)); generate_uniform_points_on_torus_d( @@ -215,6 +217,8 @@ static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::si template std::vector generate_points_on_torus_d(std::size_t num_points, int dim, bool uniform = false, double radius_noise_percentage = 0.) { + using namespace boost::math::double_constants; + typedef typename Kernel::Point_d Point; typedef typename Kernel::FT FT; Kernel k; @@ -237,7 +241,7 @@ std::vector generate_points_on_torus_d(std::size_t num std::vector pt; pt.reserve(dim * 2); for (int curdim = 0; curdim < dim; ++curdim) { - FT alpha = rng.get_double(0, 2 * pi); + FT alpha = rng.get_double(0, two_pi); pt.push_back(radius_noise_ratio * std::cos(alpha)); pt.push_back(radius_noise_ratio * std::sin(alpha)); } @@ -360,6 +364,8 @@ std::vector generate_points_on_two_spheres_d(std::size template std::vector generate_points_on_3sphere_and_circle(std::size_t num_points, double sphere_radius) { + using namespace boost::math::double_constants; + typedef typename Kernel::FT FT; typedef typename Kernel::Point_d Point; Kernel k; @@ -373,7 +379,7 @@ std::vector generate_points_on_3sphere_and_circle(std: for (std::size_t i = 0; i < num_points;) { Point p_sphere = *generator++; // First 3 coords - FT alpha = rng.get_double(0, 2 * pi); + FT alpha = rng.get_double(0, two_pi); std::vector pt(5); pt[0] = k_coord(p_sphere, 0); pt[1] = k_coord(p_sphere, 1); @@ -391,6 +397,8 @@ std::vector generate_points_on_3sphere_and_circle(std: template std::vector generate_points_on_klein_bottle_3D(std::size_t num_points, double a, double b, bool uniform = false) { + using namespace boost::math::double_constants; + typedef typename Kernel::Point_d Point; typedef typename Kernel::FT FT; Kernel k; @@ -406,11 +414,11 @@ std::vector generate_points_on_klein_bottle_3D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * pi * k1 / num_lines; - v = 2 * pi * k2 / num_lines; + u = two_pi * k1 / num_lines; + v = two_pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * pi); - v = rng.get_double(0, 2 * pi); + u = rng.get_double(0, two_pi); + v = rng.get_double(0, two_pi); } double tmp = cos(u / 2) * sin(v) - sin(u / 2) * sin(2. * v); Point p = construct_point(k, @@ -427,6 +435,8 @@ std::vector generate_points_on_klein_bottle_3D(std::si template std::vector generate_points_on_klein_bottle_4D(std::size_t num_points, double a, double b, double noise = 0., bool uniform = false) { + using namespace boost::math::double_constants; + typedef typename Kernel::Point_d Point; typedef typename Kernel::FT FT; Kernel k; @@ -442,11 +452,11 @@ std::vector generate_points_on_klein_bottle_4D(std::si if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * pi * k1 / num_lines; - v = 2 * pi * k2 / num_lines; + u = two_pi * k1 / num_lines; + v = two_pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * pi); - v = rng.get_double(0, 2 * pi); + u = rng.get_double(0, two_pi); + v = rng.get_double(0, two_pi); } Point p = construct_point(k, (a + b * cos(v)) * cos(u) + (noise == 0. ? 0. : rng.get_double(0, noise)), @@ -466,6 +476,8 @@ template std::vector generate_points_on_klein_bottle_variant_5D( std::size_t num_points, double a, double b, bool uniform = false) { + using namespace boost::math::double_constants; + typedef typename Kernel::Point_d Point; typedef typename Kernel::FT FT; Kernel k; @@ -481,11 +493,11 @@ generate_points_on_klein_bottle_variant_5D( if (uniform) { std::size_t k1 = i / num_lines; std::size_t k2 = i % num_lines; - u = 2 * pi * k1 / num_lines; - v = 2 * pi * k2 / num_lines; + u = two_pi * k1 / num_lines; + v = two_pi * k2 / num_lines; } else { - u = rng.get_double(0, 2 * pi); - v = rng.get_double(0, 2 * pi); + u = rng.get_double(0, two_pi); + v = rng.get_double(0, two_pi); } FT x1 = (a + b * cos(v)) * cos(u); FT x2 = (a + b * cos(v)) * sin(u); -- cgit v1.2.3