Spaces:
Runtime error
Runtime error
File size: 6,208 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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
#include <unittest/unittest.h>
#include <thrust/adjacent_difference.h>
#include <thrust/iterator/discard_iterator.h>
#include <thrust/iterator/retag.h>
#include <thrust/device_malloc.h>
#include <thrust/device_free.h>
template <class Vector>
void TestAdjacentDifferenceSimple(void)
{
typedef typename Vector::value_type T;
Vector input(3);
Vector output(3);
input[0] = 1; input[1] = 4; input[2] = 6;
typename Vector::iterator result;
result = thrust::adjacent_difference(input.begin(), input.end(), output.begin());
ASSERT_EQUAL(result - output.begin(), 3);
ASSERT_EQUAL(output[0], T(1));
ASSERT_EQUAL(output[1], T(3));
ASSERT_EQUAL(output[2], T(2));
result = thrust::adjacent_difference(input.begin(), input.end(), output.begin(), thrust::plus<T>());
ASSERT_EQUAL(result - output.begin(), 3);
ASSERT_EQUAL(output[0], T( 1));
ASSERT_EQUAL(output[1], T( 5));
ASSERT_EQUAL(output[2], T(10));
// test in-place operation, result and first are permitted to be the same
result = thrust::adjacent_difference(input.begin(), input.end(), input.begin());
ASSERT_EQUAL(result - input.begin(), 3);
ASSERT_EQUAL(input[0], T(1));
ASSERT_EQUAL(input[1], T(3));
ASSERT_EQUAL(input[2], T(2));
}
DECLARE_VECTOR_UNITTEST(TestAdjacentDifferenceSimple);
template <typename T>
void TestAdjacentDifference(const size_t n)
{
thrust::host_vector<T> h_input = unittest::random_samples<T>(n);
thrust::device_vector<T> d_input = h_input;
thrust::host_vector<T> h_output(n);
thrust::device_vector<T> d_output(n);
typename thrust::host_vector<T>::iterator h_result;
typename thrust::device_vector<T>::iterator d_result;
h_result = thrust::adjacent_difference(h_input.begin(), h_input.end(), h_output.begin());
d_result = thrust::adjacent_difference(d_input.begin(), d_input.end(), d_output.begin());
ASSERT_EQUAL(std::size_t(h_result - h_output.begin()), n);
ASSERT_EQUAL(std::size_t(d_result - d_output.begin()), n);
ASSERT_EQUAL(h_output, d_output);
h_result = thrust::adjacent_difference(h_input.begin(), h_input.end(), h_output.begin(), thrust::plus<T>());
d_result = thrust::adjacent_difference(d_input.begin(), d_input.end(), d_output.begin(), thrust::plus<T>());
ASSERT_EQUAL(std::size_t(h_result - h_output.begin()), n);
ASSERT_EQUAL(std::size_t(d_result - d_output.begin()), n);
ASSERT_EQUAL(h_output, d_output);
// in-place operation
h_result = thrust::adjacent_difference(h_input.begin(), h_input.end(), h_input.begin(), thrust::plus<T>());
d_result = thrust::adjacent_difference(d_input.begin(), d_input.end(), d_input.begin(), thrust::plus<T>());
ASSERT_EQUAL(std::size_t(h_result - h_input.begin()), n);
ASSERT_EQUAL(std::size_t(d_result - d_input.begin()), n);
ASSERT_EQUAL(h_input, h_output); //computed previously
ASSERT_EQUAL(d_input, d_output); //computed previously
}
DECLARE_VARIABLE_UNITTEST(TestAdjacentDifference);
template<typename T>
void TestAdjacentDifferenceInPlaceWithRelatedIteratorTypes(const size_t n)
{
thrust::host_vector<T> h_input = unittest::random_samples<T>(n);
thrust::device_vector<T> d_input = h_input;
thrust::host_vector<T> h_output(n);
thrust::device_vector<T> d_output(n);
typename thrust::host_vector<T>::iterator h_result;
typename thrust::device_vector<T>::iterator d_result;
h_result = thrust::adjacent_difference(h_input.begin(), h_input.end(), h_output.begin(), thrust::plus<T>());
d_result = thrust::adjacent_difference(d_input.begin(), d_input.end(), d_output.begin(), thrust::plus<T>());
// in-place operation with different iterator types
h_result = thrust::adjacent_difference(h_input.cbegin(), h_input.cend(), h_input.begin(), thrust::plus<T>());
d_result = thrust::adjacent_difference(d_input.cbegin(), d_input.cend(), d_input.begin(), thrust::plus<T>());
ASSERT_EQUAL(std::size_t(h_result - h_input.begin()), n);
ASSERT_EQUAL(std::size_t(d_result - d_input.begin()), n);
ASSERT_EQUAL(h_output, h_input); // reference computed previously
ASSERT_EQUAL(d_output, d_input); // reference computed previously
}
DECLARE_VARIABLE_UNITTEST(TestAdjacentDifferenceInPlaceWithRelatedIteratorTypes);
template <typename T>
void TestAdjacentDifferenceDiscardIterator(const size_t n)
{
thrust::host_vector<T> h_input = unittest::random_samples<T>(n);
thrust::device_vector<T> d_input = h_input;
thrust::discard_iterator<> h_result =
thrust::adjacent_difference(h_input.begin(), h_input.end(), thrust::make_discard_iterator());
thrust::discard_iterator<> d_result =
thrust::adjacent_difference(d_input.begin(), d_input.end(), thrust::make_discard_iterator());
thrust::discard_iterator<> reference(n);
ASSERT_EQUAL_QUIET(reference, h_result);
ASSERT_EQUAL_QUIET(reference, d_result);
}
DECLARE_VARIABLE_UNITTEST(TestAdjacentDifferenceDiscardIterator);
template<typename InputIterator, typename OutputIterator>
OutputIterator adjacent_difference(my_system &system, InputIterator, InputIterator, OutputIterator result)
{
system.validate_dispatch();
return result;
}
void TestAdjacentDifferenceDispatchExplicit()
{
thrust::device_vector<int> d_input(1);
my_system sys(0);
thrust::adjacent_difference(sys,
d_input.begin(),
d_input.end(),
d_input.begin());
ASSERT_EQUAL(true, sys.is_valid());
}
DECLARE_UNITTEST(TestAdjacentDifferenceDispatchExplicit);
template<typename InputIterator, typename OutputIterator>
OutputIterator adjacent_difference(my_tag, InputIterator, InputIterator, OutputIterator result)
{
*result = 13;
return result;
}
void TestAdjacentDifferenceDispatchImplicit()
{
thrust::device_vector<int> d_input(1);
thrust::adjacent_difference(thrust::retag<my_tag>(d_input.begin()),
thrust::retag<my_tag>(d_input.end()),
thrust::retag<my_tag>(d_input.begin()));
ASSERT_EQUAL(13, d_input.front());
}
DECLARE_UNITTEST(TestAdjacentDifferenceDispatchImplicit);
|