Spaces:
Runtime error
Runtime error
| struct hash32 | |
| { | |
| __host__ __device__ | |
| unsigned int operator()(unsigned int h) const | |
| { | |
| h = ~h + (h << 15); | |
| h = h ^ (h >> 12); | |
| h = h + (h << 2); | |
| h = h ^ (h >> 4); | |
| h = h + (h << 3) + (h << 11); | |
| h = h ^ (h >> 16); | |
| return h; | |
| } | |
| }; | |
| struct hash64 | |
| { | |
| __host__ __device__ | |
| unsigned long long operator()(unsigned long long h) const | |
| { | |
| h = ~h + (h << 21); | |
| h = h ^ (h >> 24); | |
| h = (h + (h << 3)) + (h << 8); | |
| h = h ^ (h >> 14); | |
| h = (h + (h << 2)) + (h << 4); | |
| h = h ^ (h >> 28); | |
| h = h + (h << 31); | |
| return h; | |
| } | |
| }; | |
| struct hashtofloat | |
| { | |
| __host__ __device__ | |
| float operator()(unsigned int h) const | |
| { | |
| return static_cast<float>(hash32()(h)) / 4294967296.0f; | |
| } | |
| }; | |
| struct hashtodouble | |
| { | |
| __host__ __device__ | |
| double operator()(unsigned long long h) const | |
| { | |
| return static_cast<double>(hash64()(h)) / 18446744073709551616.0; | |
| } | |
| }; | |
| template <typename Vector, typename T> | |
| void _randomize(Vector& v, T) | |
| { | |
| thrust::transform(thrust::counting_iterator<unsigned int>(0), | |
| thrust::counting_iterator<unsigned int>(0) + v.size(), | |
| v.begin(), | |
| hash32()); | |
| } | |
| template <typename Vector> | |
| void _randomize(Vector& v, long long) | |
| { | |
| thrust::transform(thrust::counting_iterator<unsigned long long>(0), | |
| thrust::counting_iterator<unsigned long long>(0) + v.size(), | |
| v.begin(), | |
| hash64()); | |
| } | |
| template <typename Vector> | |
| void _randomize(Vector& v, float) | |
| { | |
| thrust::transform(thrust::counting_iterator<unsigned int>(0), | |
| thrust::counting_iterator<unsigned int>(0) + v.size(), | |
| v.begin(), | |
| hashtofloat()); | |
| } | |
| template <typename Vector> | |
| void _randomize(Vector& v, double) | |
| { | |
| thrust::transform(thrust::counting_iterator<unsigned long long>(0), | |
| thrust::counting_iterator<unsigned long long>(0) + v.size(), | |
| v.begin(), | |
| hashtodouble()); | |
| } | |
| // fill Vector with random values | |
| template <typename Vector> | |
| void randomize(Vector& v) | |
| { | |
| _randomize(v, typename Vector::value_type()); | |
| } | |