test_stable_sort_by_key.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2016 Jakub Szuppe <j.szuppe@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #define BOOST_TEST_MODULE TestStableSortByKey
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/compute/system.hpp>
  13. #include <boost/compute/algorithm/stable_sort_by_key.hpp>
  14. #include <boost/compute/algorithm/is_sorted.hpp>
  15. #include <boost/compute/container/vector.hpp>
  16. #include "check_macros.hpp"
  17. #include "context_setup.hpp"
  18. namespace compute = boost::compute;
  19. BOOST_AUTO_TEST_CASE(empty_int_by_int)
  20. {
  21. compute::vector<compute::int_> keys(size_t(0), compute::int_(0), queue);
  22. compute::vector<compute::int_> values(size_t(0), compute::int_(0), queue);
  23. BOOST_CHECK_EQUAL(keys.size(), size_t(0));
  24. BOOST_CHECK_EQUAL(values.size(), size_t(0));
  25. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  26. BOOST_CHECK(compute::is_sorted(values.begin(), values.end(), queue));
  27. compute::stable_sort_by_key(
  28. keys.begin(), keys.end(), values.begin(), queue
  29. );
  30. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end()));
  31. BOOST_CHECK(compute::is_sorted(values.begin(), values.end()));
  32. }
  33. BOOST_AUTO_TEST_CASE(one_element_int_by_int)
  34. {
  35. compute::int_ keys_data[] = { 1 };
  36. compute::int_ values_data[] = { 2 };
  37. compute::vector<compute::int_> keys(keys_data, keys_data + 1, queue);
  38. compute::vector<compute::int_> values(values_data, values_data + 1, queue);
  39. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  40. BOOST_CHECK(compute::is_sorted(values.begin(), values.end(), queue));
  41. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  42. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  43. BOOST_CHECK(compute::is_sorted(values.begin(), values.end(), queue));
  44. }
  45. BOOST_AUTO_TEST_CASE(two_elements_int_by_int)
  46. {
  47. compute::int_ keys_data[] = { 1, -1 };
  48. compute::int_ values_data[] = { -10, 1 };
  49. compute::vector<compute::int_> keys(keys_data, keys_data + 2, queue);
  50. compute::vector<compute::int_> values(values_data, values_data + 2, queue);
  51. BOOST_CHECK(!compute::is_sorted(keys.begin(), keys.end(), queue));
  52. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  53. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  54. }
  55. BOOST_AUTO_TEST_CASE(stable_sort_int_by_int)
  56. {
  57. compute::int_ keys_data[] = { 10, 9, 2, 7, 6, -1, 4, 2, 2, 10 };
  58. compute::int_ values_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  59. compute::vector<compute::int_> keys(keys_data, keys_data + 10, queue);
  60. compute::vector<compute::int_> values(values_data, values_data + 10, queue);
  61. BOOST_CHECK(!compute::is_sorted(keys.begin(), keys.end(), queue));
  62. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  63. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  64. CHECK_RANGE_EQUAL(
  65. compute::int_, 10, keys,
  66. (-1, 2, 2, 2, 4, 6, 7, 9, 10, 10) // keys
  67. // ( 6, 3, 8, 9, 7, 5, 4, 2, 1, 10) values
  68. );
  69. CHECK_RANGE_EQUAL(
  70. compute::int_, 10, values,
  71. // (-1, 2, 2, 2, 4, 6, 7, 9, 10, 10) keys
  72. ( 6, 3, 8, 9, 7, 5, 4, 2, 1, 10) // values
  73. );
  74. }
  75. BOOST_AUTO_TEST_CASE(stable_sort_uint_by_uint)
  76. {
  77. compute::uint_ keys_data[] = { 10, 9, 2, 7, 6, 1, 4, 2, 2, 10 };
  78. compute::uint_ values_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  79. compute::vector<compute::uint_> keys(keys_data, keys_data + 10, queue);
  80. compute::vector<compute::uint_> values(values_data, values_data + 10, queue);
  81. BOOST_CHECK(!compute::is_sorted(keys.begin(), keys.end(), queue));
  82. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  83. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  84. CHECK_RANGE_EQUAL(
  85. compute::uint_, 10, keys,
  86. (1, 2, 2, 2, 4, 6, 7, 9, 10, 10) // keys
  87. // (6, 3, 8, 9, 7, 5, 4, 2, 1, 10) values
  88. );
  89. CHECK_RANGE_EQUAL(
  90. compute::uint_, 10, values,
  91. // (1, 2, 2, 2, 4, 6, 7, 9, 10, 10) keys
  92. (6, 3, 8, 9, 7, 5, 4, 2, 1, 10) // values
  93. );
  94. }
  95. BOOST_AUTO_TEST_CASE(stable_sort_int_by_float)
  96. {
  97. compute::float_ keys_data[] = { 10., 5.5, 10., 7., 5.5};
  98. compute::int_ values_data[] = { 1, 200, -10, 2, 4 };
  99. compute::vector<compute::float_> keys(keys_data, keys_data + 5, queue);
  100. compute::vector<compute::uint_> values(values_data, values_data + 5, queue);
  101. BOOST_CHECK(!compute::is_sorted(keys.begin(), keys.end(), queue));
  102. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  103. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), queue));
  104. CHECK_RANGE_EQUAL(
  105. compute::float_, 5, keys,
  106. (5.5, 5.5, 7., 10., 10.) // keys
  107. // (200, 4, 2, 1, -10) values
  108. );
  109. CHECK_RANGE_EQUAL(
  110. compute::int_, 5, values,
  111. // (5.5, 5.5, 7., 10., 10.) keys
  112. (200, 4, 2, 1, -10) // values
  113. );
  114. }
  115. BOOST_AUTO_TEST_CASE(stable_sort_char_by_int)
  116. {
  117. compute::int_ keys_data[] = { 6, 1, 1, 3, 4, 7, 5, 1 };
  118. compute::char_ values_data[] = { 'g', 'c', 'b', 'd', 'e', 'h', 'f', 'a' };
  119. compute::vector<compute::int_> keys(keys_data, keys_data + 8, queue);
  120. compute::vector<compute::char_> values(values_data, values_data + 8, queue);
  121. compute::sort_by_key(keys.begin(), keys.end(), values.begin(), queue);
  122. CHECK_RANGE_EQUAL(
  123. compute::int_, 8, keys,
  124. (1, 1, 1, 3, 4, 5, 6, 7)
  125. );
  126. CHECK_RANGE_EQUAL(
  127. compute::char_, 8, values,
  128. ('c', 'b', 'a', 'd', 'e', 'f', 'g', 'h')
  129. );
  130. }
  131. BOOST_AUTO_TEST_CASE(stable_sort_mid_uint_by_uint)
  132. {
  133. using boost::compute::int_;
  134. const int_ size = 128;
  135. std::vector<int_> keys_data(size);
  136. std::vector<int_> values_data(size);
  137. for(int_ i = 0; i < size; i++){
  138. keys_data[i] = -i;
  139. values_data[i] = -i;
  140. }
  141. keys_data[size/2] = -256;
  142. keys_data[size - 2] = -256;
  143. keys_data[size - 1] = -256;
  144. values_data[size/2] = 3;
  145. values_data[size - 2] = 1;
  146. values_data[size - 1] = 2;
  147. compute::vector<int_> keys(keys_data.begin(), keys_data.end(), queue);
  148. compute::vector<int_> values(values_data.begin(), values_data.end(), queue);
  149. // less function for float
  150. BOOST_COMPUTE_FUNCTION(bool, comp, (int_ a, int_ b),
  151. {
  152. return a < b;
  153. });
  154. BOOST_CHECK(!compute::is_sorted(keys.begin(), keys.end(), comp, queue));
  155. compute::stable_sort_by_key(keys.begin(), keys.end(), values.begin(), comp, queue);
  156. BOOST_CHECK(compute::is_sorted(keys.begin(), keys.end(), comp, queue));
  157. BOOST_CHECK(keys.begin().read(queue) == -256);
  158. BOOST_CHECK((keys.begin() + 1).read(queue) == -256);
  159. BOOST_CHECK((keys.begin() + 2).read(queue) == -256);
  160. BOOST_CHECK(values.begin().read(queue) == 3);
  161. BOOST_CHECK((values.begin() + 1).read(queue) == 1);
  162. BOOST_CHECK((values.begin() + 2).read(queue) == 2);
  163. }
  164. BOOST_AUTO_TEST_SUITE_END()