Spaces:
Runtime error
Runtime error
File size: 3,061 Bytes
be11144 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
#pragma once
#include <thrust/host_vector.h>
#include <thrust/random.h>
#include <thrust/detail/type_traits.h>
#include <limits>
namespace unittest
{
inline unsigned int hash(unsigned int a)
{
a = (a+0x7ed55d16) + (a<<12);
a = (a^0xc761c23c) ^ (a>>19);
a = (a+0x165667b1) + (a<<5);
a = (a+0xd3a2646c) ^ (a<<9);
a = (a+0xfd7046c5) + (a<<3);
a = (a^0xb55a4f09) ^ (a>>16);
return a;
}
template<typename T, typename = void>
struct generate_random_integer;
template<typename T>
struct generate_random_integer<T,
typename thrust::detail::disable_if<
thrust::detail::is_non_bool_arithmetic<T>::value
>::type
>
{
T operator()(unsigned int i) const
{
thrust::default_random_engine rng(hash(i));
return static_cast<T>(rng());
}
};
template<typename T>
struct generate_random_integer<T,
typename thrust::detail::enable_if<
thrust::detail::is_non_bool_integral<T>::value
>::type
>
{
T operator()(unsigned int i) const
{
thrust::default_random_engine rng(hash(i));
thrust::uniform_int_distribution<T> dist;
return static_cast<T>(dist(rng));
}
};
template<typename T>
struct generate_random_integer<T,
typename thrust::detail::enable_if<
thrust::detail::is_floating_point<T>::value
>::type
>
{
T operator()(unsigned int i) const
{
T const min = std::numeric_limits<T>::min();
T const max = std::numeric_limits<T>::max();
thrust::default_random_engine rng(hash(i));
thrust::uniform_real_distribution<T> dist(min, max);
return static_cast<T>(dist(rng));
}
};
template<>
struct generate_random_integer<bool>
{
bool operator()(unsigned int i) const
{
thrust::default_random_engine rng(hash(i));
thrust::uniform_int_distribution<unsigned int> dist(0,1);
return dist(rng) == 1;
}
};
template<typename T>
struct generate_random_sample
{
T operator()(unsigned int i) const
{
thrust::default_random_engine rng(hash(i));
thrust::uniform_int_distribution<unsigned int> dist(0,20);
return static_cast<T>(dist(rng));
}
};
template<typename T>
thrust::host_vector<T> random_integers(const size_t N)
{
thrust::host_vector<T> vec(N);
thrust::transform(thrust::counting_iterator<unsigned int>(static_cast<unsigned int>(0)),
thrust::counting_iterator<unsigned int>(static_cast<unsigned int>(N)),
vec.begin(),
generate_random_integer<T>());
return vec;
}
template<typename T>
T random_integer()
{
return generate_random_integer<T>()(0);
}
template<typename T>
thrust::host_vector<T> random_samples(const size_t N)
{
thrust::host_vector<T> vec(N);
thrust::transform(thrust::counting_iterator<unsigned int>(static_cast<unsigned int>(0)),
thrust::counting_iterator<unsigned int>(static_cast<unsigned int>(N)),
vec.begin(),
generate_random_sample<T>());
return vec;
}
}; //end namespace unittest
|