test_extents.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. // Copyright (c) 2018-2019 Cem Bassoy
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/test/unit_test.hpp>
  7. #include <boost/numeric/ublas/tensor/extents.hpp>
  8. #include <vector>
  9. BOOST_AUTO_TEST_SUITE ( test_extents )
  10. //*boost::unit_test::label("extents")
  11. //*boost::unit_test::label("constructor")
  12. BOOST_AUTO_TEST_CASE(test_extents_ctor)
  13. {
  14. using namespace boost::numeric;
  15. using extents = ublas::basic_extents<unsigned>;
  16. auto e0 = extents{};
  17. BOOST_CHECK( e0.empty());
  18. BOOST_CHECK_EQUAL ( e0.size(),0);
  19. auto e1 = extents{1,1};
  20. BOOST_CHECK(!e1.empty());
  21. BOOST_CHECK_EQUAL ( e1.size(),2);
  22. auto e2 = extents{1,2};
  23. BOOST_CHECK(!e2.empty());
  24. BOOST_CHECK_EQUAL ( e2.size(),2);
  25. auto e3 = extents{2,1};
  26. BOOST_CHECK (!e3.empty());
  27. BOOST_CHECK_EQUAL ( e3.size(),2);
  28. auto e4 = extents{2,3};
  29. BOOST_CHECK(!e4.empty());
  30. BOOST_CHECK_EQUAL ( e4.size(),2);
  31. auto e5 = extents{2,3,1};
  32. BOOST_CHECK (!e5.empty());
  33. BOOST_CHECK_EQUAL ( e5.size(),3);
  34. auto e6 = extents{1,2,3}; // 6
  35. BOOST_CHECK(!e6.empty());
  36. BOOST_CHECK_EQUAL ( e6.size(),3);
  37. auto e7 = extents{4,2,3}; // 7
  38. BOOST_CHECK(!e7.empty());
  39. BOOST_CHECK_EQUAL ( e7.size(),3);
  40. BOOST_CHECK_THROW( extents({1,0}), std::length_error );
  41. BOOST_CHECK_THROW( extents({0} ), std::length_error );
  42. BOOST_CHECK_THROW( extents({3} ), std::length_error );
  43. BOOST_CHECK_THROW( extents({0,1}), std::length_error );
  44. }
  45. struct fixture {
  46. using extents_type = boost::numeric::ublas::basic_extents<unsigned>;
  47. fixture() : extents{
  48. extents_type{}, // 0
  49. extents_type{1,1}, // 1
  50. extents_type{1,2}, // 2
  51. extents_type{2,1}, // 3
  52. extents_type{2,3}, // 4
  53. extents_type{2,3,1}, // 5
  54. extents_type{1,2,3}, // 6
  55. extents_type{1,1,2,3}, // 7
  56. extents_type{1,2,3,1,1}, // 8
  57. extents_type{4,2,3}, // 9
  58. extents_type{4,2,1,3}, // 10
  59. extents_type{4,2,1,3,1}, // 11
  60. extents_type{1,4,2,1,3,1}, // 12
  61. } // 13
  62. {}
  63. std::vector<extents_type> extents;
  64. };
  65. BOOST_FIXTURE_TEST_CASE(test_extents_access, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("access"))
  66. {
  67. using namespace boost::numeric;
  68. BOOST_REQUIRE_EQUAL(extents.size(),13);
  69. BOOST_CHECK_EQUAL (extents[ 0].size(), 0);
  70. BOOST_CHECK (extents[ 0].empty() );
  71. BOOST_REQUIRE_EQUAL(extents[ 1].size(), 2);
  72. BOOST_REQUIRE_EQUAL(extents[ 2].size(), 2);
  73. BOOST_REQUIRE_EQUAL(extents[ 3].size(), 2);
  74. BOOST_REQUIRE_EQUAL(extents[ 4].size(), 2);
  75. BOOST_REQUIRE_EQUAL(extents[ 5].size(), 3);
  76. BOOST_REQUIRE_EQUAL(extents[ 6].size(), 3);
  77. BOOST_REQUIRE_EQUAL(extents[ 7].size(), 4);
  78. BOOST_REQUIRE_EQUAL(extents[ 8].size(), 5);
  79. BOOST_REQUIRE_EQUAL(extents[ 9].size(), 3);
  80. BOOST_REQUIRE_EQUAL(extents[10].size(), 4);
  81. BOOST_REQUIRE_EQUAL(extents[11].size(), 5);
  82. BOOST_REQUIRE_EQUAL(extents[12].size(), 6);
  83. BOOST_CHECK_EQUAL(extents[1][0],1);
  84. BOOST_CHECK_EQUAL(extents[1][1],1);
  85. BOOST_CHECK_EQUAL(extents[2][0],1);
  86. BOOST_CHECK_EQUAL(extents[2][1],2);
  87. BOOST_CHECK_EQUAL(extents[3][0],2);
  88. BOOST_CHECK_EQUAL(extents[3][1],1);
  89. BOOST_CHECK_EQUAL(extents[4][0],2);
  90. BOOST_CHECK_EQUAL(extents[4][1],3);
  91. BOOST_CHECK_EQUAL(extents[5][0],2);
  92. BOOST_CHECK_EQUAL(extents[5][1],3);
  93. BOOST_CHECK_EQUAL(extents[5][2],1);
  94. BOOST_CHECK_EQUAL(extents[6][0],1);
  95. BOOST_CHECK_EQUAL(extents[6][1],2);
  96. BOOST_CHECK_EQUAL(extents[6][2],3);
  97. BOOST_CHECK_EQUAL(extents[7][0],1);
  98. BOOST_CHECK_EQUAL(extents[7][1],1);
  99. BOOST_CHECK_EQUAL(extents[7][2],2);
  100. BOOST_CHECK_EQUAL(extents[7][3],3);
  101. BOOST_CHECK_EQUAL(extents[8][0],1);
  102. BOOST_CHECK_EQUAL(extents[8][1],2);
  103. BOOST_CHECK_EQUAL(extents[8][2],3);
  104. BOOST_CHECK_EQUAL(extents[8][3],1);
  105. BOOST_CHECK_EQUAL(extents[8][4],1);
  106. BOOST_CHECK_EQUAL(extents[9][0],4);
  107. BOOST_CHECK_EQUAL(extents[9][1],2);
  108. BOOST_CHECK_EQUAL(extents[9][2],3);
  109. BOOST_CHECK_EQUAL(extents[10][0],4);
  110. BOOST_CHECK_EQUAL(extents[10][1],2);
  111. BOOST_CHECK_EQUAL(extents[10][2],1);
  112. BOOST_CHECK_EQUAL(extents[10][3],3);
  113. BOOST_CHECK_EQUAL(extents[11][0],4);
  114. BOOST_CHECK_EQUAL(extents[11][1],2);
  115. BOOST_CHECK_EQUAL(extents[11][2],1);
  116. BOOST_CHECK_EQUAL(extents[11][3],3);
  117. BOOST_CHECK_EQUAL(extents[11][4],1);
  118. BOOST_CHECK_EQUAL(extents[12][0],1);
  119. BOOST_CHECK_EQUAL(extents[12][1],4);
  120. BOOST_CHECK_EQUAL(extents[12][2],2);
  121. BOOST_CHECK_EQUAL(extents[12][3],1);
  122. BOOST_CHECK_EQUAL(extents[12][4],3);
  123. BOOST_CHECK_EQUAL(extents[12][5],1);
  124. }
  125. BOOST_FIXTURE_TEST_CASE(test_extents_copy_ctor, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("copy_ctor"))
  126. {
  127. BOOST_REQUIRE_EQUAL(extents.size(),13);
  128. auto e0 = extents[ 0]; // {}
  129. auto e1 = extents[ 1]; // {1,1}
  130. auto e2 = extents[ 2]; // {1,2}
  131. auto e3 = extents[ 3]; // {2,1}
  132. auto e4 = extents[ 4]; // {2,3}
  133. auto e5 = extents[ 5]; // {2,3,1}
  134. auto e6 = extents[ 6]; // {1,2,3}
  135. auto e7 = extents[ 7]; // {1,1,2,3}
  136. auto e8 = extents[ 8]; // {1,2,3,1,1}
  137. auto e9 = extents[ 9]; // {4,2,3}
  138. auto e10 = extents[10]; // {4,2,1,3}
  139. auto e11 = extents[11]; // {4,2,1,3,1}
  140. auto e12 = extents[12]; // {1,4,2,1,3,1}
  141. BOOST_CHECK_EQUAL (e0.size(), 0);
  142. BOOST_CHECK (e0.empty() );
  143. BOOST_REQUIRE_EQUAL(e1 .size(), 2);
  144. BOOST_REQUIRE_EQUAL(e2 .size(), 2);
  145. BOOST_REQUIRE_EQUAL(e3 .size(), 2);
  146. BOOST_REQUIRE_EQUAL(e4 .size(), 2);
  147. BOOST_REQUIRE_EQUAL(e5 .size(), 3);
  148. BOOST_REQUIRE_EQUAL(e6 .size(), 3);
  149. BOOST_REQUIRE_EQUAL(e7 .size(), 4);
  150. BOOST_REQUIRE_EQUAL(e8 .size(), 5);
  151. BOOST_REQUIRE_EQUAL(e9 .size(), 3);
  152. BOOST_REQUIRE_EQUAL(e10.size(), 4);
  153. BOOST_REQUIRE_EQUAL(e11.size(), 5);
  154. BOOST_REQUIRE_EQUAL(e12.size(), 6);
  155. BOOST_CHECK_EQUAL(e1[0],1);
  156. BOOST_CHECK_EQUAL(e1[1],1);
  157. BOOST_CHECK_EQUAL(e2[0],1);
  158. BOOST_CHECK_EQUAL(e2[1],2);
  159. BOOST_CHECK_EQUAL(e3[0],2);
  160. BOOST_CHECK_EQUAL(e3[1],1);
  161. BOOST_CHECK_EQUAL(e4[0],2);
  162. BOOST_CHECK_EQUAL(e4[1],3);
  163. BOOST_CHECK_EQUAL(e5[0],2);
  164. BOOST_CHECK_EQUAL(e5[1],3);
  165. BOOST_CHECK_EQUAL(e5[2],1);
  166. BOOST_CHECK_EQUAL(e6[0],1);
  167. BOOST_CHECK_EQUAL(e6[1],2);
  168. BOOST_CHECK_EQUAL(e6[2],3);
  169. BOOST_CHECK_EQUAL(e7[0],1);
  170. BOOST_CHECK_EQUAL(e7[1],1);
  171. BOOST_CHECK_EQUAL(e7[2],2);
  172. BOOST_CHECK_EQUAL(e7[3],3);
  173. BOOST_CHECK_EQUAL(e8[0],1);
  174. BOOST_CHECK_EQUAL(e8[1],2);
  175. BOOST_CHECK_EQUAL(e8[2],3);
  176. BOOST_CHECK_EQUAL(e8[3],1);
  177. BOOST_CHECK_EQUAL(e8[4],1);
  178. BOOST_CHECK_EQUAL(e9[0],4);
  179. BOOST_CHECK_EQUAL(e9[1],2);
  180. BOOST_CHECK_EQUAL(e9[2],3);
  181. BOOST_CHECK_EQUAL(e10[0],4);
  182. BOOST_CHECK_EQUAL(e10[1],2);
  183. BOOST_CHECK_EQUAL(e10[2],1);
  184. BOOST_CHECK_EQUAL(e10[3],3);
  185. BOOST_CHECK_EQUAL(e11[0],4);
  186. BOOST_CHECK_EQUAL(e11[1],2);
  187. BOOST_CHECK_EQUAL(e11[2],1);
  188. BOOST_CHECK_EQUAL(e11[3],3);
  189. BOOST_CHECK_EQUAL(e11[4],1);
  190. BOOST_CHECK_EQUAL(e12[0],1);
  191. BOOST_CHECK_EQUAL(e12[1],4);
  192. BOOST_CHECK_EQUAL(e12[2],2);
  193. BOOST_CHECK_EQUAL(e12[3],1);
  194. BOOST_CHECK_EQUAL(e12[4],3);
  195. BOOST_CHECK_EQUAL(e12[5],1);
  196. }
  197. BOOST_FIXTURE_TEST_CASE(test_extents_is, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("query"))
  198. {
  199. BOOST_REQUIRE_EQUAL(extents.size(),13);
  200. auto e0 = extents[ 0]; // {}
  201. auto e1 = extents[ 1]; // {1,1}
  202. auto e2 = extents[ 2]; // {1,2}
  203. auto e3 = extents[ 3]; // {2,1}
  204. auto e4 = extents[ 4]; // {2,3}
  205. auto e5 = extents[ 5]; // {2,3,1}
  206. auto e6 = extents[ 6]; // {1,2,3}
  207. auto e7 = extents[ 7]; // {1,1,2,3}
  208. auto e8 = extents[ 8]; // {1,2,3,1,1}
  209. auto e9 = extents[ 9]; // {4,2,3}
  210. auto e10 = extents[10]; // {4,2,1,3}
  211. auto e11 = extents[11]; // {4,2,1,3,1}
  212. auto e12 = extents[12]; // {1,4,2,1,3,1}
  213. BOOST_CHECK( e0.empty ());
  214. BOOST_CHECK( ! e0.is_scalar());
  215. BOOST_CHECK( ! e0.is_vector());
  216. BOOST_CHECK( ! e0.is_matrix());
  217. BOOST_CHECK( ! e0.is_tensor());
  218. BOOST_CHECK( ! e1.empty () );
  219. BOOST_CHECK( e1.is_scalar() );
  220. BOOST_CHECK( ! e1.is_vector() );
  221. BOOST_CHECK( ! e1.is_matrix() );
  222. BOOST_CHECK( ! e1.is_tensor() );
  223. BOOST_CHECK( ! e2.empty () );
  224. BOOST_CHECK( ! e2.is_scalar() );
  225. BOOST_CHECK( e2.is_vector() );
  226. BOOST_CHECK( ! e2.is_matrix() );
  227. BOOST_CHECK( ! e2.is_tensor() );
  228. BOOST_CHECK( ! e3.empty () );
  229. BOOST_CHECK( ! e3.is_scalar() );
  230. BOOST_CHECK( e3.is_vector() );
  231. BOOST_CHECK( ! e3.is_matrix() );
  232. BOOST_CHECK( ! e3.is_tensor() );
  233. BOOST_CHECK( ! e4.empty () );
  234. BOOST_CHECK( ! e4.is_scalar() );
  235. BOOST_CHECK( ! e4.is_vector() );
  236. BOOST_CHECK( e4.is_matrix() );
  237. BOOST_CHECK( ! e4.is_tensor() );
  238. BOOST_CHECK( ! e5.empty () );
  239. BOOST_CHECK( ! e5.is_scalar() );
  240. BOOST_CHECK( ! e5.is_vector() );
  241. BOOST_CHECK( e5.is_matrix() );
  242. BOOST_CHECK( ! e5.is_tensor() );
  243. BOOST_CHECK( ! e6.empty () );
  244. BOOST_CHECK( ! e6.is_scalar() );
  245. BOOST_CHECK( ! e6.is_vector() );
  246. BOOST_CHECK( ! e6.is_matrix() );
  247. BOOST_CHECK( e6.is_tensor() );
  248. BOOST_CHECK( ! e7.empty () );
  249. BOOST_CHECK( ! e7.is_scalar() );
  250. BOOST_CHECK( ! e7.is_vector() );
  251. BOOST_CHECK( ! e7.is_matrix() );
  252. BOOST_CHECK( e7.is_tensor() );
  253. BOOST_CHECK( ! e8.empty () );
  254. BOOST_CHECK( ! e8.is_scalar() );
  255. BOOST_CHECK( ! e8.is_vector() );
  256. BOOST_CHECK( ! e8.is_matrix() );
  257. BOOST_CHECK( e8.is_tensor() );
  258. BOOST_CHECK( ! e9.empty () );
  259. BOOST_CHECK( ! e9.is_scalar() );
  260. BOOST_CHECK( ! e9.is_vector() );
  261. BOOST_CHECK( ! e9.is_matrix() );
  262. BOOST_CHECK( e9.is_tensor() );
  263. BOOST_CHECK( ! e10.empty () );
  264. BOOST_CHECK( ! e10.is_scalar() );
  265. BOOST_CHECK( ! e10.is_vector() );
  266. BOOST_CHECK( ! e10.is_matrix() );
  267. BOOST_CHECK( e10.is_tensor() );
  268. BOOST_CHECK( ! e11.empty () );
  269. BOOST_CHECK( ! e11.is_scalar() );
  270. BOOST_CHECK( ! e11.is_vector() );
  271. BOOST_CHECK( ! e11.is_matrix() );
  272. BOOST_CHECK( e11.is_tensor() );
  273. BOOST_CHECK( ! e12.empty () );
  274. BOOST_CHECK( ! e12.is_scalar() );
  275. BOOST_CHECK( ! e12.is_vector() );
  276. BOOST_CHECK( ! e12.is_matrix() );
  277. BOOST_CHECK( e12.is_tensor() );
  278. }
  279. BOOST_FIXTURE_TEST_CASE(test_extents_squeeze, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("squeeze"))
  280. {
  281. BOOST_REQUIRE_EQUAL(extents.size(),13);
  282. auto e0 = extents[ 0].squeeze(); // {}
  283. auto e1 = extents[ 1].squeeze(); // {1,1}
  284. auto e2 = extents[ 2].squeeze(); // {1,2}
  285. auto e3 = extents[ 3].squeeze(); // {2,1}
  286. auto e4 = extents[ 4].squeeze(); // {2,3}
  287. auto e5 = extents[ 5].squeeze(); // {2,3}
  288. auto e6 = extents[ 6].squeeze(); // {2,3}
  289. auto e7 = extents[ 7].squeeze(); // {2,3}
  290. auto e8 = extents[ 8].squeeze(); // {2,3}
  291. auto e9 = extents[ 9].squeeze(); // {4,2,3}
  292. auto e10 = extents[10].squeeze(); // {4,2,3}
  293. auto e11 = extents[11].squeeze(); // {4,2,3}
  294. auto e12 = extents[12].squeeze(); // {4,2,3}
  295. BOOST_CHECK( (e0 == extents_type{} ) );
  296. BOOST_CHECK( (e1 == extents_type{1,1}) );
  297. BOOST_CHECK( (e2 == extents_type{1,2}) );
  298. BOOST_CHECK( (e3 == extents_type{2,1}) );
  299. BOOST_CHECK( (e4 == extents_type{2,3}) );
  300. BOOST_CHECK( (e5 == extents_type{2,3}) );
  301. BOOST_CHECK( (e6 == extents_type{2,3}) );
  302. BOOST_CHECK( (e7 == extents_type{2,3}) );
  303. BOOST_CHECK( (e8 == extents_type{2,3}) );
  304. BOOST_CHECK( (e9 == extents_type{4,2,3}) );
  305. BOOST_CHECK( (e10 == extents_type{4,2,3}) );
  306. BOOST_CHECK( (e11 == extents_type{4,2,3}) );
  307. BOOST_CHECK( (e12 == extents_type{4,2,3}) );
  308. }
  309. BOOST_FIXTURE_TEST_CASE(test_extents_valid, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("valid"))
  310. {
  311. using namespace boost::numeric;
  312. BOOST_REQUIRE_EQUAL(extents.size(),13);
  313. for(auto const& e : extents){
  314. if(e.empty())
  315. BOOST_CHECK_EQUAL(e.valid(),false);
  316. else
  317. BOOST_CHECK_EQUAL(e.valid(), true );
  318. }
  319. BOOST_CHECK_EQUAL( extents_type{}.valid() , false );
  320. BOOST_CHECK_THROW( ublas::basic_extents<unsigned>({0,1}), std::length_error );
  321. BOOST_CHECK_THROW( ublas::basic_extents<unsigned>({1,0,1}), std::length_error );
  322. }
  323. BOOST_FIXTURE_TEST_CASE(test_extents_product, fixture, *boost::unit_test::label("extents") *boost::unit_test::label("product"))
  324. {
  325. auto e0 = extents[ 0].product(); // {}
  326. auto e1 = extents[ 1].product(); // {1,1}
  327. auto e2 = extents[ 2].product(); // {1,2}
  328. auto e3 = extents[ 3].product(); // {2,1}
  329. auto e4 = extents[ 4].product(); // {2,3}
  330. auto e5 = extents[ 5].product(); // {2,3,1}
  331. auto e6 = extents[ 6].product(); // {1,2,3}
  332. auto e7 = extents[ 7].product(); // {1,1,2,3}
  333. auto e8 = extents[ 8].product(); // {1,2,3,1,1}
  334. auto e9 = extents[ 9].product(); // {4,2,3}
  335. auto e10 = extents[10].product(); // {4,2,1,3}
  336. auto e11 = extents[11].product(); // {4,2,1,3,1}
  337. auto e12 = extents[12].product(); // {1,4,2,1,3,1}
  338. BOOST_CHECK_EQUAL( e0 , 0 );
  339. BOOST_CHECK_EQUAL( e1 , 1 );
  340. BOOST_CHECK_EQUAL( e2 , 2 );
  341. BOOST_CHECK_EQUAL( e3 , 2 );
  342. BOOST_CHECK_EQUAL( e4 , 6 );
  343. BOOST_CHECK_EQUAL( e5 , 6 );
  344. BOOST_CHECK_EQUAL( e6 , 6 );
  345. BOOST_CHECK_EQUAL( e7 , 6 );
  346. BOOST_CHECK_EQUAL( e8 , 6 );
  347. BOOST_CHECK_EQUAL( e9 , 24 );
  348. BOOST_CHECK_EQUAL( e10, 24 );
  349. BOOST_CHECK_EQUAL( e11, 24 );
  350. BOOST_CHECK_EQUAL( e12, 24 );
  351. }
  352. BOOST_AUTO_TEST_SUITE_END()