brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 79c0af4 Raw
102 lines · plain
1//  (C) Copyright Nick Thompson 2018.2//  (C) Copyright Matt Borland 2021.3//  Use, modification and distribution are subject to the4//  Boost Software License, Version 1.0. (See accompanying file5//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)6 7#include <cstddef>8#include <random>9#include <type_traits>10#include <vector>11 12namespace boost { namespace math {13 14// To stress test, set global_seed = 0, global_size = huge.15static constexpr std::size_t global_seed = 0;16static constexpr std::size_t global_size = 128;17 18template<typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true>19std::vector<T> generate_random_vector(std::size_t size, std::size_t seed)20{21    if (seed == 0)22    {23        std::random_device rd;24        seed = rd();25    }26    std::vector<T> v(size);27 28    std::mt19937_64 gen(seed);29 30    std::normal_distribution<T> dis(0, 1);31    for (auto& x : v)32    {33        x = dis(gen);34    }35    return v;36}37 38template<typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true>39std::vector<T> generate_random_uniform_vector(std::size_t size, std::size_t seed, T lower_bound = T(0), T upper_bound = T(1))40{41    if (seed == 0)42    {43        std::random_device rd;44        seed = rd();45    }46    std::vector<T> v(size);47 48    std::mt19937 gen(seed);49 50    std::uniform_real_distribution<T> dis(lower_bound, upper_bound);51 52    for (auto& x : v)53    {54        x = dis(gen);55    }56    57    return v;58}59 60template<typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true>61std::vector<T> generate_random_vector(std::size_t size, std::size_t seed, T mean, T stddev)62{63    if (seed == 0)64    {65        std::random_device rd;66        seed = rd();67    }68    std::vector<T> v(size);69 70    std::mt19937 gen(seed);71 72    std::normal_distribution<T> dis(mean, stddev);73    for (auto& x : v)74    {75        x = dis(gen);76    }77    return v;78}79 80template<typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>81std::vector<T> generate_random_vector(std::size_t size, std::size_t seed)82{83    if (seed == 0)84    {85        std::random_device rd;86        seed = rd();87    }88    std::vector<T> v(size);89 90    std::mt19937_64 gen(seed);91 92    // Rescaling by larger than 2 is UB!93    std::uniform_int_distribution<T> dis(std::numeric_limits<T>::lowest()/2, (std::numeric_limits<T>::max)()/2);94    for (auto& x : v)95    {96        x = dis(gen);97    }98    return v;99}100 101}} // Namespaces102