2
0
mirror of https://github.com/boostorg/ublas.git synced 2026-01-26 19:12:12 +00:00
Files
ublas/test/tensor/test_static_strides.cpp
Amit Singh dcc3163ef6 Fixing the ambiguous extents type and using constexpr function to get
strides rather than creating type traits just to do the same task.
2022-01-02 19:42:01 +05:30

157 lines
5.2 KiB
C++

//
// Copyright (c) 2020, Cem Bassoy, cem.bassoy@gmail.com
// Copyright (c) 2019, Amit Singh, amitsingh19975@gmail.com
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// The authors gratefully acknowledge the support of
// Google and Fraunhofer IOSB, Ettlingen, Germany
//
#include <boost/numeric/ublas/tensor/extents.hpp>
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(test_static_strides)
using test_types = std::tuple<boost::numeric::ublas::layout::first_order,
boost::numeric::ublas::layout::last_order>;
template<std::size_t ... es>
using extents = boost::numeric::ublas::extents<es...>;
using first_order = boost::numeric::ublas::layout::first_order;
using last_order = boost::numeric::ublas::layout::last_order;
BOOST_AUTO_TEST_CASE_TEMPLATE(test_static_strides_ctor, value, test_types)
{
namespace ublas = boost::numeric::ublas;
constexpr auto s11 = ublas::to_strides(extents <1,1>{},first_order{});
constexpr auto s12 = ublas::to_strides(extents <1,2>{},first_order{});
constexpr auto s21 = ublas::to_strides(extents <2,1>{},first_order{});
constexpr auto s23 = ublas::to_strides(extents <2,3>{},first_order{});
constexpr auto s231 = ublas::to_strides(extents<2,3,1>{},first_order{});
constexpr auto s123 = ublas::to_strides(extents<1,2,3>{},first_order{});
constexpr auto s423 = ublas::to_strides(extents<4,2,3>{},first_order{});
BOOST_CHECK_EQUAL(s11.empty(), false);
BOOST_CHECK_EQUAL(s12.empty(), false);
BOOST_CHECK_EQUAL(s21.empty(), false);
BOOST_CHECK_EQUAL(s23.empty(), false);
BOOST_CHECK_EQUAL(s231.empty(), false);
BOOST_CHECK_EQUAL(s123.empty(), false);
BOOST_CHECK_EQUAL(s423.empty(), false);
BOOST_CHECK_EQUAL(s11.size(), 2);
BOOST_CHECK_EQUAL(s12.size(), 2);
BOOST_CHECK_EQUAL(s21.size(), 2);
BOOST_CHECK_EQUAL(s23.size(), 2);
BOOST_CHECK_EQUAL(s231.size(), 3);
BOOST_CHECK_EQUAL(s123.size(), 3);
BOOST_CHECK_EQUAL(s423.size(), 3);
}
BOOST_AUTO_TEST_CASE(test_static_strides_ctor_access_first_order)
{
namespace ublas = boost::numeric::ublas;
constexpr auto s11 = ublas::to_strides(extents <1,1>{},first_order{});
constexpr auto s12 = ublas::to_strides(extents <1,2>{},first_order{});
constexpr auto s21 = ublas::to_strides(extents <2,1>{},first_order{});
constexpr auto s23 = ublas::to_strides(extents <2,3>{},first_order{});
constexpr auto s231 = ublas::to_strides(extents<2,3,1>{},first_order{});
constexpr auto s213 = ublas::to_strides(extents<2,1,3>{},first_order{});
constexpr auto s123 = ublas::to_strides(extents<1,2,3>{},first_order{});
constexpr auto s423 = ublas::to_strides(extents<4,2,3>{},first_order{});
BOOST_REQUIRE_EQUAL(s11.size(), 2);
BOOST_REQUIRE_EQUAL(s12.size(), 2);
BOOST_REQUIRE_EQUAL(s21.size(), 2);
BOOST_REQUIRE_EQUAL(s23.size(), 2);
BOOST_REQUIRE_EQUAL(s231.size(), 3);
BOOST_REQUIRE_EQUAL(s213.size(), 3);
BOOST_REQUIRE_EQUAL(s123.size(), 3);
BOOST_REQUIRE_EQUAL(s423.size(), 3);
BOOST_CHECK_EQUAL(s11[0], 1);
BOOST_CHECK_EQUAL(s11[1], 1);
BOOST_CHECK_EQUAL(s12[0], 1);
BOOST_CHECK_EQUAL(s12[1], 1);
BOOST_CHECK_EQUAL(s21[0], 1);
BOOST_CHECK_EQUAL(s21[1], 1);
BOOST_CHECK_EQUAL(s23[0], 1);
BOOST_CHECK_EQUAL(s23[1], 2);
BOOST_CHECK_EQUAL(s231[0], 1);
BOOST_CHECK_EQUAL(s231[1], 2);
BOOST_CHECK_EQUAL(s231[2], 6);
BOOST_CHECK_EQUAL(s123[0], 1);
BOOST_CHECK_EQUAL(s123[1], 1);
BOOST_CHECK_EQUAL(s123[2], 2);
BOOST_CHECK_EQUAL(s213[0], 1);
BOOST_CHECK_EQUAL(s213[1], 2);
BOOST_CHECK_EQUAL(s213[2], 2);
BOOST_CHECK_EQUAL(s423[0], 1);
BOOST_CHECK_EQUAL(s423[1], 4);
BOOST_CHECK_EQUAL(s423[2], 8);
}
BOOST_AUTO_TEST_CASE(test_static_strides_ctor_access_last_order)
{
namespace ublas = boost::numeric::ublas;
constexpr auto s11 = ublas::to_strides(extents <1,1>{},last_order{});
constexpr auto s12 = ublas::to_strides(extents <1,2>{},last_order{});
constexpr auto s21 = ublas::to_strides(extents <2,1>{},last_order{});
constexpr auto s23 = ublas::to_strides(extents <2,3>{},last_order{});
constexpr auto s231 = ublas::to_strides(extents<2,3,1>{},last_order{});
constexpr auto s213 = ublas::to_strides(extents<2,1,3>{},last_order{});
constexpr auto s123 = ublas::to_strides(extents<1,2,3>{},last_order{});
constexpr auto s423 = ublas::to_strides(extents<4,2,3>{},last_order{});
BOOST_REQUIRE_EQUAL(s11.size(), 2);
BOOST_REQUIRE_EQUAL(s12.size(), 2);
BOOST_REQUIRE_EQUAL(s21.size(), 2);
BOOST_REQUIRE_EQUAL(s23.size(), 2);
BOOST_REQUIRE_EQUAL(s231.size(), 3);
BOOST_REQUIRE_EQUAL(s213.size(), 3);
BOOST_REQUIRE_EQUAL(s123.size(), 3);
BOOST_REQUIRE_EQUAL(s423.size(), 3);
BOOST_CHECK_EQUAL(s11[0], 1);
BOOST_CHECK_EQUAL(s11[1], 1);
BOOST_CHECK_EQUAL(s12[0], 1);
BOOST_CHECK_EQUAL(s12[1], 1);
BOOST_CHECK_EQUAL(s21[0], 1);
BOOST_CHECK_EQUAL(s21[1], 1);
BOOST_CHECK_EQUAL(s23[0], 3);
BOOST_CHECK_EQUAL(s23[1], 1);
BOOST_CHECK_EQUAL(s231[0], 3);
BOOST_CHECK_EQUAL(s231[1], 1);
BOOST_CHECK_EQUAL(s231[2], 1);
BOOST_CHECK_EQUAL(s123[0], 6);
BOOST_CHECK_EQUAL(s123[1], 3);
BOOST_CHECK_EQUAL(s123[2], 1);
BOOST_CHECK_EQUAL(s213[0], 3);
BOOST_CHECK_EQUAL(s213[1], 3);
BOOST_CHECK_EQUAL(s213[2], 1);
}
BOOST_AUTO_TEST_SUITE_END()