Adding clang-format configuration file and formatting all source files
Co-authored-by: Jules Pénuchot <jules@penuchot.com> Co-authored-by: Joel FALCOU <jfalcou@codereckons.com> See merge request oss/rotgen!41
This commit is contained in:
parent
e92e824a18
commit
648dd768ee
94 changed files with 6778 additions and 4722 deletions
|
|
@ -9,104 +9,104 @@
|
|||
#include "unit/common/arithmetic.hpp"
|
||||
#include <rotgen/rotgen.hpp>
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block transposition-like operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test dynamic block transposition-like operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
rotgen::tests::check_shape_functions(input);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block transposition-like operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block transposition-like operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
rotgen::tests::check_shape_functions(input);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block reduction-like operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test dynamic block reduction-like operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
rotgen::tests::check_reduction_functions(input);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block reduction-like operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block reduction-like operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
rotgen::tests::check_reduction_functions(input);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dot product", float, double)<typename T>(tts::type<T>){
|
||||
{auto v = rotgen::setConstant<rotgen::matrix<T, 1, rotgen::Dynamic>>(1,
|
||||
16,
|
||||
2);
|
||||
auto a = rotgen::head(v, 8);
|
||||
auto b = rotgen::tail(v, 8);
|
||||
|
||||
TTS_EQUAL(rotgen::dot(a, b), 32);
|
||||
}
|
||||
|
||||
TTS_CASE_TPL("Test dot product", float, double)
|
||||
<typename T>( tts::type<T> )
|
||||
{
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T,1,rotgen::Dynamic>>(1,16,2);
|
||||
auto a = rotgen::head(v,8);
|
||||
auto b = rotgen::tail(v,8);
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T, rotgen::Dynamic, 1>>(16, 1, 2);
|
||||
auto a = rotgen::head(v, 8);
|
||||
auto b = rotgen::tail(v, 8);
|
||||
|
||||
TTS_EQUAL(rotgen::dot(a,b), 32);
|
||||
}
|
||||
TTS_EQUAL(rotgen::dot(a, b), 32);
|
||||
}
|
||||
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T,rotgen::Dynamic,1>>(16,1,2);
|
||||
auto a = rotgen::head(v,8);
|
||||
auto b = rotgen::tail(v,8);
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T, 1, rotgen::Dynamic>>(1, 16, 2);
|
||||
auto a = rotgen::head<8>(v);
|
||||
auto b = rotgen::tail<8>(v);
|
||||
|
||||
TTS_EQUAL(rotgen::dot(a,b), 32);
|
||||
}
|
||||
TTS_EQUAL(rotgen::dot(a, b), 32);
|
||||
}
|
||||
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T,1,rotgen::Dynamic>>(1,16,2);
|
||||
auto a = rotgen::head<8>(v);
|
||||
auto b = rotgen::tail<8>(v);
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T, rotgen::Dynamic, 1>>(16, 1, 2);
|
||||
auto a = rotgen::head<8>(v);
|
||||
auto b = rotgen::tail<8>(v);
|
||||
|
||||
TTS_EQUAL(rotgen::dot(a,b), 32);
|
||||
}
|
||||
|
||||
{
|
||||
auto v = rotgen::setConstant<rotgen::matrix<T,rotgen::Dynamic,1>>(16,1,2);
|
||||
auto a = rotgen::head<8>(v);
|
||||
auto b = rotgen::tail<8>(v);
|
||||
|
||||
TTS_EQUAL(rotgen::dot(a,b), 32);
|
||||
}
|
||||
};
|
||||
TTS_EQUAL(rotgen::dot(a, b), 32);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
|
|
|||
|
|
@ -12,109 +12,116 @@
|
|||
// NB: This function must not be turned into a lambda, otherwise
|
||||
// `test-ubuntu-gcc-release` will not pass and the CI will fail.
|
||||
// This is likely due to a compilation bug from GCC 13.3.0.
|
||||
void fill(auto &m, int r, int c, auto data[]) {
|
||||
for (int k = 0; k < r * c; ++k)
|
||||
m.data()[k] = data[k];
|
||||
void fill(auto& m, int r, int c, auto data[])
|
||||
{
|
||||
for (int k = 0; k < r * c; ++k) m.data()[k] = data[k];
|
||||
}
|
||||
|
||||
TTS_CASE_TPL("Function size", rotgen::tests::types)
|
||||
<typename T, typename O>(tts::type<tts::types<T, O>>)
|
||||
TTS_CASE_TPL("Function size", rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
T data[] = {1,2,3,4,5,6,7,8,9,10,11,12};
|
||||
T data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
|
||||
|
||||
// 1x12 dynamic block at (0,0)
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> dm(1,12);
|
||||
fill(dm,1,12,data);
|
||||
auto b1 = rotgen::block<decltype(dm), rotgen::Dynamic, rotgen::Dynamic>(dm, 0,0,1,12);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> dm(1, 12);
|
||||
fill(dm, 1, 12, data);
|
||||
auto b1 = rotgen::block<decltype(dm), rotgen::Dynamic, rotgen::Dynamic>(
|
||||
dm, 0, 0, 1, 12);
|
||||
TTS_EQUAL(b1.rows(), rotgen::Index{1});
|
||||
TTS_EQUAL(b1.cols(), rotgen::Index{12});
|
||||
|
||||
// 1x5 dynamic block at (0,2)
|
||||
auto b2 = rotgen::block<decltype(dm), rotgen::Dynamic, rotgen::Dynamic>(dm, 0,2,1,5);
|
||||
auto b2 = rotgen::block<decltype(dm), rotgen::Dynamic, rotgen::Dynamic>(
|
||||
dm, 0, 2, 1, 5);
|
||||
TTS_EQUAL(b2.rows(), rotgen::Index{1});
|
||||
TTS_EQUAL(b2.cols(), rotgen::Index{5});
|
||||
|
||||
// 3x2 dynamic block at (1,4) in 4x6
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> dm2(4,6);
|
||||
fill(dm2,4,6,data);
|
||||
auto b3 = rotgen::block<decltype(dm2), rotgen::Dynamic, rotgen::Dynamic>(dm2, 1,4,3,2);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> dm2(4, 6);
|
||||
fill(dm2, 4, 6, data);
|
||||
auto b3 = rotgen::block<decltype(dm2), rotgen::Dynamic, rotgen::Dynamic>(
|
||||
dm2, 1, 4, 3, 2);
|
||||
TTS_EQUAL(b3.rows(), rotgen::Index{3});
|
||||
TTS_EQUAL(b3.cols(), rotgen::Index{2});
|
||||
TTS_EQUAL(b3.size(), rotgen::Index{6});
|
||||
|
||||
// 3x4 static block
|
||||
rotgen::matrix<T,3,4,O::value> sm;
|
||||
fill(sm,3,4,data);
|
||||
auto b4 = rotgen::block<decltype(sm), 3, 4>(sm, 0,0);
|
||||
rotgen::matrix<T, 3, 4, O::value> sm;
|
||||
fill(sm, 3, 4, data);
|
||||
auto b4 = rotgen::block<decltype(sm), 3, 4>(sm, 0, 0);
|
||||
TTS_EQUAL(b4.rows(), rotgen::Index{3});
|
||||
TTS_EQUAL(b4.cols(), rotgen::Index{4});
|
||||
TTS_EQUAL(b4.size(), rotgen::Index{12});
|
||||
|
||||
// 6x2 static block
|
||||
rotgen::matrix<T,6,2,O::value> sm2;
|
||||
fill(sm2,6,2,data);
|
||||
auto b5 = rotgen::block<decltype(sm2), 6, 2>(sm2, 0,0);
|
||||
rotgen::matrix<T, 6, 2, O::value> sm2;
|
||||
fill(sm2, 6, 2, data);
|
||||
auto b5 = rotgen::block<decltype(sm2), 6, 2>(sm2, 0, 0);
|
||||
TTS_EQUAL(b5.rows(), rotgen::Index{6});
|
||||
TTS_EQUAL(b5.cols(), rotgen::Index{2});
|
||||
TTS_EQUAL(b5.size(), rotgen::Index{12});
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test coefficient accessors", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test coefficient accessors",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using base = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
using base = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
|
||||
T data[] = {1,2,3,4,5,6,7,8,9,10,11,12};
|
||||
base mat(4,3);
|
||||
for(int k=0;k<12;++k) mat.data()[k] = data[k];
|
||||
T data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
|
||||
base mat(4, 3);
|
||||
for (int k = 0; k < 12; ++k) mat.data()[k] = data[k];
|
||||
|
||||
auto b = rotgen::block<base,rotgen::Dynamic,rotgen::Dynamic>(mat, 0, 0, 4, 3);
|
||||
for(rotgen::Index i=0;i<4;i++)
|
||||
auto b =
|
||||
rotgen::block<base, rotgen::Dynamic, rotgen::Dynamic>(mat, 0, 0, 4, 3);
|
||||
for (rotgen::Index i = 0; i < 4; i++)
|
||||
{
|
||||
for(rotgen::Index j=0;j<3;j++)
|
||||
for (rotgen::Index j = 0; j < 3; j++)
|
||||
{
|
||||
if constexpr(O::value) TTS_EQUAL(b(i,j), data[j+3*i]);
|
||||
else TTS_EQUAL(b(i,j), data[i+4*j]);
|
||||
if constexpr (O::value) TTS_EQUAL(b(i, j), data[j + 3 * i]);
|
||||
else TTS_EQUAL(b(i, j), data[i + 4 * j]);
|
||||
}
|
||||
}
|
||||
|
||||
b(1, 1) = 42;
|
||||
TTS_EQUAL(b(1,1), 42);
|
||||
TTS_EQUAL(b(1, 1), 42);
|
||||
|
||||
T& ref = b(2, 2);
|
||||
ref = 17;
|
||||
TTS_EQUAL(b(2, 2), 17);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test one index coefficient accessors", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test one index coefficient accessors",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto vs = [&]()
|
||||
{
|
||||
if constexpr(O::value == rotgen::ColMajor)
|
||||
auto vs = [&]() {
|
||||
if constexpr (O::value == rotgen::ColMajor)
|
||||
{
|
||||
using base = rotgen::matrix<T,1,rotgen::Dynamic>;
|
||||
using base = rotgen::matrix<T, 1, rotgen::Dynamic>;
|
||||
base m(12);
|
||||
for(int k=0;k<12;++k) m(k) = k+1;
|
||||
return std::tuple{m,rotgen::block<base,1,rotgen::Dynamic>(m, 0, 0, 1, 12)};
|
||||
for (int k = 0; k < 12; ++k) m(k) = k + 1;
|
||||
return std::tuple{
|
||||
m, rotgen::block<base, 1, rotgen::Dynamic>(m, 0, 0, 1, 12)};
|
||||
}
|
||||
else
|
||||
{
|
||||
using base = rotgen::matrix<T,rotgen::Dynamic,1>;
|
||||
using base = rotgen::matrix<T, rotgen::Dynamic, 1>;
|
||||
base m(12);
|
||||
for(int k=0;k<12;++k) m(k) = k+1;
|
||||
return std::tuple{m,rotgen::block<base,rotgen::Dynamic,1>(m, 0, 0, 12, 1)};
|
||||
for (int k = 0; k < 12; ++k) m(k) = k + 1;
|
||||
return std::tuple{
|
||||
m, rotgen::block<base, rotgen::Dynamic, 1>(m, 0, 0, 12, 1)};
|
||||
}
|
||||
}();
|
||||
|
||||
auto mat = get<0>(vs);
|
||||
auto b = get<1>(vs);
|
||||
auto b = get<1>(vs);
|
||||
TTS_EXPECT(b.IsVectorAtCompileTime);
|
||||
|
||||
for(rotgen::Index i=0;i<b.size();i++)
|
||||
for (rotgen::Index i = 0; i < b.size(); i++)
|
||||
TTS_EQUAL(b(i), mat(i)) << "Index: " << i << "\n";
|
||||
|
||||
for(rotgen::Index i=0;i<b.size();i++)
|
||||
for (rotgen::Index i = 0; i < b.size(); i++)
|
||||
TTS_EQUAL(b[i], mat(i)) << "Index: " << i << "\n";
|
||||
|
||||
b(1) = 42;
|
||||
|
|
|
|||
|
|
@ -9,34 +9,35 @@
|
|||
#include "unit/common/cwise.hpp"
|
||||
#include <rotgen/rotgen.hpp>
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block cwise operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test dynamic block cwise operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
rotgen::tests::check_cwise_functions(input);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block cwise operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block cwise operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
rotgen::tests::check_cwise_functions(input);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -11,41 +11,44 @@
|
|||
template<typename EigenType, typename F>
|
||||
void for_each_element(EigenType const& m, F&& f)
|
||||
{
|
||||
for(rotgen::Index i = 0; i < m.rows(); ++i)
|
||||
for(rotgen::Index j = 0; j < m.cols(); ++j)
|
||||
f(i, j, m(i,j));
|
||||
for (rotgen::Index i = 0; i < m.rows(); ++i)
|
||||
for (rotgen::Index j = 0; j < m.cols(); ++j) f(i, j, m(i, j));
|
||||
}
|
||||
|
||||
template<typename EigenType, typename F>
|
||||
void for_each_element(EigenType& m, F&& f)
|
||||
{
|
||||
for(rotgen::Index i = 0; i < m.rows(); ++i)
|
||||
for(rotgen::Index j = 0; j < m.cols(); ++j)
|
||||
f(i, j, m(i,j));
|
||||
for (rotgen::Index i = 0; i < m.rows(); ++i)
|
||||
for (rotgen::Index j = 0; j < m.cols(); ++j) f(i, j, m(i, j));
|
||||
}
|
||||
|
||||
template<typename MatrixType, typename T>
|
||||
MatrixType make_initialized_matrix(rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct)
|
||||
MatrixType make_initialized_matrix(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct)
|
||||
{
|
||||
auto[d,i0,j0,ni,nj] = matrix_construct;
|
||||
auto[r,c,fn] = d;
|
||||
auto [d, i0, j0, ni, nj] = matrix_construct;
|
||||
auto [r, c, fn] = d;
|
||||
|
||||
MatrixType matrix;
|
||||
|
||||
if constexpr(MatrixType::RowsAtCompileTime == -1 &&MatrixType::ColsAtCompileTime == -1)
|
||||
if constexpr (MatrixType::RowsAtCompileTime == -1 &&
|
||||
MatrixType::ColsAtCompileTime == -1)
|
||||
rotgen::resize(matrix, r, c);
|
||||
|
||||
for(rotgen::Index i = 0; i < r; ++i)
|
||||
for(rotgen::Index j = 0; j < c; ++j)
|
||||
for (rotgen::Index i = 0; i < r; ++i)
|
||||
for (rotgen::Index j = 0; j < c; ++j)
|
||||
matrix(i, j) = static_cast<T>(fn(i, j));
|
||||
|
||||
return matrix;
|
||||
}
|
||||
|
||||
template<typename MatrixType, typename BlockType>
|
||||
void validate_block_behavior(MatrixType& matrix, BlockType& block,
|
||||
rotgen::Index block_i, rotgen::Index block_j,
|
||||
rotgen::Index block_m, rotgen::Index block_n)
|
||||
void validate_block_behavior(MatrixType& matrix,
|
||||
BlockType& block,
|
||||
rotgen::Index block_i,
|
||||
rotgen::Index block_j,
|
||||
rotgen::Index block_m,
|
||||
rotgen::Index block_n)
|
||||
{
|
||||
using T = typename MatrixType::value_type;
|
||||
TTS_EQUAL(block.rows(), block_m);
|
||||
|
|
@ -58,12 +61,11 @@ void validate_block_behavior(MatrixType& matrix, BlockType& block,
|
|||
});
|
||||
|
||||
// test aliasing if non immutable
|
||||
if constexpr(!BlockType::is_immutable)
|
||||
if constexpr (!BlockType::is_immutable)
|
||||
{
|
||||
T value = 1;
|
||||
for_each_element(block, [&](auto i, auto j, auto&) {
|
||||
block(i, j) = value++;
|
||||
});
|
||||
for_each_element(block,
|
||||
[&](auto i, auto j, auto&) { block(i, j) = value++; });
|
||||
|
||||
value = 1;
|
||||
for_each_element(block, [&](auto i, auto j, auto&) {
|
||||
|
|
@ -81,99 +83,140 @@ void validate_block_behavior(MatrixType& matrix, BlockType& block,
|
|||
}
|
||||
|
||||
template<typename MatrixType, typename T>
|
||||
void test_dynamic_block_extraction(rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct)
|
||||
void test_dynamic_block_extraction(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct)
|
||||
{
|
||||
MatrixType matrix = make_initialized_matrix<MatrixType, T>(matrix_construct);
|
||||
|
||||
MatrixType const c_matrix = matrix;
|
||||
|
||||
auto c_block_main = rotgen::extract(c_matrix, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_top_left_corner = rotgen::topLeftCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_top_right_corner = rotgen::topRightCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_bottom_left_corner = rotgen::bottomLeftCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_bottom_right_corner = rotgen::bottomRightCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_main =
|
||||
rotgen::extract(c_matrix, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_top_left_corner =
|
||||
rotgen::topLeftCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_top_right_corner =
|
||||
rotgen::topRightCorner(c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_bottom_left_corner = rotgen::bottomLeftCorner(
|
||||
c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto c_block_bottom_right_corner = rotgen::bottomRightCorner(
|
||||
c_matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
|
||||
auto c_block_top_rows = rotgen::topRows(c_matrix, matrix_construct.ni);
|
||||
auto c_block_middle_rows = rotgen::middleRows(c_matrix, matrix_construct.i0, matrix_construct.ni);
|
||||
auto c_block_bottom_rows = rotgen::bottomRows(c_matrix, matrix_construct.ni);
|
||||
auto c_block_top_rows = rotgen::topRows(c_matrix, matrix_construct.ni);
|
||||
auto c_block_middle_rows =
|
||||
rotgen::middleRows(c_matrix, matrix_construct.i0, matrix_construct.ni);
|
||||
auto c_block_bottom_rows = rotgen::bottomRows(c_matrix, matrix_construct.ni);
|
||||
|
||||
auto c_block_left_cols = rotgen::leftCols(c_matrix, matrix_construct.nj);
|
||||
auto c_block_middle_cols = rotgen::middleCols(c_matrix, matrix_construct.j0, matrix_construct.nj);
|
||||
auto c_block_right_cols = rotgen::rightCols(c_matrix, matrix_construct.nj);
|
||||
auto c_block_left_cols = rotgen::leftCols(c_matrix, matrix_construct.nj);
|
||||
auto c_block_middle_cols =
|
||||
rotgen::middleCols(c_matrix, matrix_construct.j0, matrix_construct.nj);
|
||||
auto c_block_right_cols = rotgen::rightCols(c_matrix, matrix_construct.nj);
|
||||
|
||||
auto block_main = rotgen::extract(matrix, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_top_left_corner = rotgen::topLeftCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_top_right_corner = rotgen::topRightCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_bottom_left_corner = rotgen::bottomLeftCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_bottom_right_corner = rotgen::bottomRightCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_main =
|
||||
rotgen::extract(matrix, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_top_left_corner =
|
||||
rotgen::topLeftCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_top_right_corner =
|
||||
rotgen::topRightCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_bottom_left_corner =
|
||||
rotgen::bottomLeftCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
auto block_bottom_right_corner =
|
||||
rotgen::bottomRightCorner(matrix, matrix_construct.ni, matrix_construct.nj);
|
||||
|
||||
auto block_top_rows = rotgen::topRows(matrix, matrix_construct.ni);
|
||||
auto block_middle_rows = rotgen::middleRows(matrix, matrix_construct.i0, matrix_construct.ni);
|
||||
auto block_bottom_rows = rotgen::bottomRows(matrix, matrix_construct.ni);
|
||||
auto block_top_rows = rotgen::topRows(matrix, matrix_construct.ni);
|
||||
auto block_middle_rows =
|
||||
rotgen::middleRows(matrix, matrix_construct.i0, matrix_construct.ni);
|
||||
auto block_bottom_rows = rotgen::bottomRows(matrix, matrix_construct.ni);
|
||||
|
||||
auto block_left_cols = rotgen::leftCols(matrix, matrix_construct.nj);
|
||||
auto block_middle_cols = rotgen::middleCols(matrix, matrix_construct.j0, matrix_construct.nj);
|
||||
auto block_right_cols = rotgen::rightCols(matrix, matrix_construct.nj);
|
||||
auto block_left_cols = rotgen::leftCols(matrix, matrix_construct.nj);
|
||||
auto block_middle_cols =
|
||||
rotgen::middleCols(matrix, matrix_construct.j0, matrix_construct.nj);
|
||||
auto block_right_cols = rotgen::rightCols(matrix, matrix_construct.nj);
|
||||
|
||||
auto blocks = std::make_tuple(
|
||||
// --- CONST TESTS
|
||||
std::make_tuple(c_block_main, matrix_construct.i0, matrix_construct.j0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(c_block_top_left_corner, 0, 0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(c_block_top_right_corner, 0, matrix.cols() - matrix_construct.nj, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(c_block_bottom_left_corner, matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(c_block_bottom_right_corner, matrix.rows() - matrix_construct.ni, matrix.cols() - matrix_construct.nj,
|
||||
std::make_tuple(c_block_main, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(c_block_top_left_corner, 0, 0, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(c_block_top_right_corner, 0,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(c_block_bottom_left_corner,
|
||||
matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(c_block_bottom_right_corner,
|
||||
matrix.rows() - matrix_construct.ni,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
|
||||
std::make_tuple(c_block_top_rows, 0, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(c_block_middle_rows, matrix_construct.i0, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(c_block_bottom_rows, matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(c_block_middle_rows, matrix_construct.i0, 0,
|
||||
matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(c_block_bottom_rows, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix.cols()),
|
||||
|
||||
std::make_tuple(c_block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj),
|
||||
std::make_tuple(c_block_middle_cols, 0, matrix_construct.j0, matrix.rows(), matrix_construct.nj),
|
||||
std::make_tuple(c_block_right_cols, 0, matrix.cols() - matrix_construct.nj, matrix.rows(), matrix_construct.nj),
|
||||
std::make_tuple(c_block_left_cols, 0, 0, matrix.rows(),
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(c_block_middle_cols, 0, matrix_construct.j0, matrix.rows(),
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(c_block_right_cols, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix.rows(), matrix_construct.nj),
|
||||
// --- REGULAR TESTS
|
||||
std::make_tuple(block_main, matrix_construct.i0, matrix_construct.j0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(block_top_left_corner, 0, 0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(block_top_right_corner, 0, matrix.cols() - matrix_construct.nj, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(block_bottom_left_corner, matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(block_bottom_right_corner, matrix.rows() - matrix_construct.ni, matrix.cols() - matrix_construct.nj,
|
||||
std::make_tuple(block_main, matrix_construct.i0, matrix_construct.j0,
|
||||
matrix_construct.ni, matrix_construct.nj),
|
||||
std::make_tuple(block_top_left_corner, 0, 0, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(block_top_right_corner, 0,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(block_bottom_left_corner,
|
||||
matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(block_bottom_right_corner,
|
||||
matrix.rows() - matrix_construct.ni,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj),
|
||||
|
||||
std::make_tuple(block_top_rows, 0, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(block_middle_rows, matrix_construct.i0, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(block_bottom_rows, matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(block_middle_rows, matrix_construct.i0, 0,
|
||||
matrix_construct.ni, matrix.cols()),
|
||||
std::make_tuple(block_bottom_rows, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix.cols()),
|
||||
|
||||
std::make_tuple(block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj),
|
||||
std::make_tuple(block_middle_cols, 0, matrix_construct.j0, matrix.rows(), matrix_construct.nj),
|
||||
std::make_tuple(block_right_cols, 0, matrix.cols() - matrix_construct.nj, matrix.rows(), matrix_construct.nj)
|
||||
);
|
||||
std::make_tuple(block_middle_cols, 0, matrix_construct.j0, matrix.rows(),
|
||||
matrix_construct.nj),
|
||||
std::make_tuple(block_right_cols, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix.rows(), matrix_construct.nj));
|
||||
|
||||
std::apply([&](auto&&... block_entries)
|
||||
{
|
||||
(([&]
|
||||
{
|
||||
auto&& [block, i_offset, j_offset, ni, nj] = block_entries;
|
||||
using block_t = std::remove_reference_t<decltype(block)>;
|
||||
std::apply(
|
||||
[&](auto&&... block_entries) {
|
||||
(([&] {
|
||||
auto&& [block, i_offset, j_offset, ni, nj] = block_entries;
|
||||
using block_t = std::remove_reference_t<decltype(block)>;
|
||||
|
||||
TTS_EQUAL(block_t::RowsAtCompileTime, rotgen::Dynamic);
|
||||
TTS_EQUAL(block_t::ColsAtCompileTime, rotgen::Dynamic);
|
||||
TTS_EQUAL(block_t::storage_order, MatrixType::storage_order);
|
||||
|
||||
validate_block_behavior(matrix, block, i_offset, j_offset, ni, nj);
|
||||
})(), ...);
|
||||
}, blocks);
|
||||
TTS_EQUAL(block_t::RowsAtCompileTime, rotgen::Dynamic);
|
||||
TTS_EQUAL(block_t::ColsAtCompileTime, rotgen::Dynamic);
|
||||
TTS_EQUAL(block_t::storage_order, MatrixType::storage_order);
|
||||
|
||||
validate_block_behavior(matrix, block, i_offset, j_offset, ni, nj);
|
||||
})(),
|
||||
...);
|
||||
},
|
||||
blocks);
|
||||
}
|
||||
|
||||
template<typename MatrixType, typename T, rotgen::Index NI, rotgen::Index NJ>
|
||||
void test_static_block_extraction(rotgen::tests::static_matrix_block_test_case<MatrixType, NI, NJ> const& matrix_construct)
|
||||
void test_static_block_extraction(
|
||||
rotgen::tests::static_matrix_block_test_case<MatrixType, NI, NJ> const&
|
||||
matrix_construct)
|
||||
{
|
||||
auto[d,i0,j0] = matrix_construct;
|
||||
auto[r,c,fn] = d;
|
||||
auto [d, i0, j0] = matrix_construct;
|
||||
auto [r, c, fn] = d;
|
||||
|
||||
MatrixType matrix(r,c);
|
||||
MatrixType matrix(r, c);
|
||||
|
||||
for (rotgen::Index i = 0; i < r; ++i)
|
||||
for (rotgen::Index j = 0; j < c; ++j)
|
||||
|
|
@ -181,177 +224,219 @@ void test_static_block_extraction(rotgen::tests::static_matrix_block_test_case<M
|
|||
|
||||
MatrixType const c_matrix = matrix;
|
||||
|
||||
auto c_block_main = rotgen::extract<NI, NJ>(c_matrix, i0, j0);
|
||||
auto c_block_top_left_corner = rotgen::topLeftCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_top_right_corner = rotgen::topRightCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_bottom_left_corner = rotgen::bottomLeftCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_bottom_right_corner = rotgen::bottomRightCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_top_rows = rotgen::topRows<NI>(c_matrix);
|
||||
auto c_block_middle_rows = rotgen::middleRows<NI>(c_matrix, i0);
|
||||
auto c_block_bottom_rows = rotgen::bottomRows<NI>(c_matrix);
|
||||
auto c_block_left_cols = rotgen::leftCols<NJ>(c_matrix);
|
||||
auto c_block_middle_cols = rotgen::middleCols<NJ>(c_matrix, j0);
|
||||
auto c_block_right_cols = rotgen::rightCols<NJ>(c_matrix);
|
||||
auto c_block_row = rotgen::row(c_matrix, i0);
|
||||
auto c_block_col = rotgen::col(c_matrix, j0);
|
||||
auto c_block_main = rotgen::extract<NI, NJ>(c_matrix, i0, j0);
|
||||
auto c_block_top_left_corner = rotgen::topLeftCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_top_right_corner = rotgen::topRightCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_bottom_left_corner = rotgen::bottomLeftCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_bottom_right_corner =
|
||||
rotgen::bottomRightCorner<NI, NJ>(c_matrix);
|
||||
auto c_block_top_rows = rotgen::topRows<NI>(c_matrix);
|
||||
auto c_block_middle_rows = rotgen::middleRows<NI>(c_matrix, i0);
|
||||
auto c_block_bottom_rows = rotgen::bottomRows<NI>(c_matrix);
|
||||
auto c_block_left_cols = rotgen::leftCols<NJ>(c_matrix);
|
||||
auto c_block_middle_cols = rotgen::middleCols<NJ>(c_matrix, j0);
|
||||
auto c_block_right_cols = rotgen::rightCols<NJ>(c_matrix);
|
||||
auto c_block_row = rotgen::row(c_matrix, i0);
|
||||
auto c_block_col = rotgen::col(c_matrix, j0);
|
||||
|
||||
auto block_main = rotgen::extract<NI, NJ>(matrix, i0, j0);
|
||||
auto block_top_left_corner = rotgen::topLeftCorner<NI, NJ>(matrix);
|
||||
auto block_top_right_corner = rotgen::topRightCorner<NI, NJ>(matrix);
|
||||
auto block_bottom_left_corner = rotgen::bottomLeftCorner<NI, NJ>(matrix);
|
||||
auto block_main = rotgen::extract<NI, NJ>(matrix, i0, j0);
|
||||
auto block_top_left_corner = rotgen::topLeftCorner<NI, NJ>(matrix);
|
||||
auto block_top_right_corner = rotgen::topRightCorner<NI, NJ>(matrix);
|
||||
auto block_bottom_left_corner = rotgen::bottomLeftCorner<NI, NJ>(matrix);
|
||||
auto block_bottom_right_corner = rotgen::bottomRightCorner<NI, NJ>(matrix);
|
||||
auto block_top_rows = rotgen::topRows<NI>(matrix);
|
||||
auto block_middle_rows = rotgen::middleRows<NI>(matrix, i0);
|
||||
auto block_bottom_rows = rotgen::bottomRows<NI>(matrix);
|
||||
auto block_left_cols = rotgen::leftCols<NJ>(matrix);
|
||||
auto block_middle_cols = rotgen::middleCols<NJ>(matrix, j0);
|
||||
auto block_right_cols = rotgen::rightCols<NJ>(matrix);
|
||||
auto block_row = rotgen::row(matrix, i0);
|
||||
auto block_col = rotgen::col(matrix, j0);
|
||||
auto block_top_rows = rotgen::topRows<NI>(matrix);
|
||||
auto block_middle_rows = rotgen::middleRows<NI>(matrix, i0);
|
||||
auto block_bottom_rows = rotgen::bottomRows<NI>(matrix);
|
||||
auto block_left_cols = rotgen::leftCols<NJ>(matrix);
|
||||
auto block_middle_cols = rotgen::middleCols<NJ>(matrix, j0);
|
||||
auto block_right_cols = rotgen::rightCols<NJ>(matrix);
|
||||
auto block_row = rotgen::row(matrix, i0);
|
||||
auto block_col = rotgen::col(matrix, j0);
|
||||
|
||||
auto blocks = std::make_tuple(
|
||||
|
||||
// ----- TEST ON BLOCK FROM CONST MATRIX
|
||||
std::make_tuple(c_block_main, i0, j0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_top_left_corner, 0, 0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_top_right_corner, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_bottom_left_corner, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_bottom_right_corner, matrix.rows() - matrix_construct.ni,
|
||||
// ----- TEST ON BLOCK FROM CONST MATRIX
|
||||
std::make_tuple(c_block_main, i0, j0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_top_left_corner, 0, 0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_top_right_corner, 0,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_bottom_left_corner,
|
||||
matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(c_block_bottom_right_corner,
|
||||
matrix.rows() - matrix_construct.ni,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
|
||||
std::make_tuple(c_block_top_rows, 0, 0, matrix_construct.ni, matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(c_block_top_rows, 0, 0, matrix_construct.ni, matrix.cols(),
|
||||
int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(c_block_middle_rows, i0, 0, matrix_construct.ni,
|
||||
matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(c_block_bottom_rows, matrix.rows() - matrix_construct.ni,
|
||||
0, matrix_construct.ni, matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(c_block_bottom_rows, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix.cols(), int(NI),
|
||||
rotgen::Dynamic),
|
||||
|
||||
std::make_tuple(c_block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(c_block_middle_cols, 0, j0,
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(c_block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj,
|
||||
rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(c_block_middle_cols, 0, j0, matrix.rows(),
|
||||
matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(c_block_right_cols, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic,
|
||||
int(NJ)),
|
||||
|
||||
std::make_tuple(c_block_row, i0, 0,
|
||||
1, matrix.cols(), 1, rotgen::Dynamic),
|
||||
std::make_tuple(c_block_col, 0, j0,
|
||||
matrix.rows(), 1, rotgen::Dynamic, 1),
|
||||
std::make_tuple(c_block_row, i0, 0, 1, matrix.cols(), 1, rotgen::Dynamic),
|
||||
std::make_tuple(c_block_col, 0, j0, matrix.rows(), 1, rotgen::Dynamic, 1),
|
||||
// -- Block to NON CONST
|
||||
std::make_tuple(block_main, i0, j0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_top_left_corner, 0, 0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_top_right_corner, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_bottom_left_corner, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_bottom_right_corner, matrix.rows() - matrix_construct.ni,
|
||||
std::make_tuple(block_main, i0, j0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_top_left_corner, 0, 0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_top_right_corner, 0,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_bottom_left_corner,
|
||||
matrix.rows() - matrix_construct.ni, 0, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
std::make_tuple(block_bottom_right_corner,
|
||||
matrix.rows() - matrix_construct.ni,
|
||||
matrix.cols() - matrix_construct.nj, matrix_construct.ni,
|
||||
matrix_construct.nj, int(NI), int(NJ)),
|
||||
|
||||
std::make_tuple(block_top_rows, 0, 0, matrix_construct.ni, matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(block_top_rows, 0, 0, matrix_construct.ni, matrix.cols(),
|
||||
int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(block_middle_rows, i0, 0, matrix_construct.ni,
|
||||
matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(block_bottom_rows, matrix.rows() - matrix_construct.ni,
|
||||
0, matrix_construct.ni, matrix.cols(), int(NI), rotgen::Dynamic),
|
||||
std::make_tuple(block_bottom_rows, matrix.rows() - matrix_construct.ni, 0,
|
||||
matrix_construct.ni, matrix.cols(), int(NI),
|
||||
rotgen::Dynamic),
|
||||
|
||||
std::make_tuple(block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(block_middle_cols, 0, j0,
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(block_left_cols, 0, 0, matrix.rows(), matrix_construct.nj,
|
||||
rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(block_middle_cols, 0, j0, matrix.rows(),
|
||||
matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
std::make_tuple(block_right_cols, 0, matrix.cols() - matrix_construct.nj,
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic, int(NJ)),
|
||||
matrix.rows(), matrix_construct.nj, rotgen::Dynamic,
|
||||
int(NJ)),
|
||||
|
||||
std::make_tuple(block_row, i0, 0,
|
||||
1, matrix.cols(), 1, rotgen::Dynamic),
|
||||
std::make_tuple(block_col, 0, j0,
|
||||
matrix.rows(), 1, rotgen::Dynamic, 1)
|
||||
);
|
||||
std::make_tuple(block_row, i0, 0, 1, matrix.cols(), 1, rotgen::Dynamic),
|
||||
std::make_tuple(block_col, 0, j0, matrix.rows(), 1, rotgen::Dynamic, 1));
|
||||
|
||||
std::apply([&](auto&&... block_entries)
|
||||
{
|
||||
(([&]
|
||||
{
|
||||
auto&& [block, i_offset, j_offset, ni, nj, rows_ct, cols_ct] = block_entries;
|
||||
using block_t = std::remove_reference_t<decltype(block)>;
|
||||
std::apply(
|
||||
[&](auto&&... block_entries) {
|
||||
(([&] {
|
||||
auto&& [block, i_offset, j_offset, ni, nj, rows_ct, cols_ct] =
|
||||
block_entries;
|
||||
using block_t = std::remove_reference_t<decltype(block)>;
|
||||
|
||||
TTS_EQUAL(block_t::RowsAtCompileTime, rows_ct);
|
||||
TTS_EQUAL(block_t::ColsAtCompileTime, cols_ct);
|
||||
TTS_EQUAL(block_t::RowsAtCompileTime, rows_ct);
|
||||
TTS_EQUAL(block_t::ColsAtCompileTime, cols_ct);
|
||||
|
||||
validate_block_behavior(matrix, block, i_offset, j_offset, ni, nj);
|
||||
})(), ...);
|
||||
}, blocks);
|
||||
validate_block_behavior(matrix, block, i_offset, j_offset, ni, nj);
|
||||
})(),
|
||||
...);
|
||||
},
|
||||
blocks);
|
||||
}
|
||||
|
||||
TTS_CASE_TPL("Check all dynamic block extractions on a dynamic row-major matrix", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL(
|
||||
"Check all dynamic block extractions on a dynamic row-major matrix",
|
||||
rotgen::tests::types)<typename T, typename O>(tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value, 1>;
|
||||
using mat_t =
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value, 1>;
|
||||
|
||||
std::vector<rotgen::tests::matrix_block_test_case<mat_t>> cases = {
|
||||
{ {6, 11, [](rotgen::Index i, rotgen::Index j) { return T(i * 10 + j); }}, 1, 2, 3, 2 },
|
||||
{ {7, 10, [](rotgen::Index i, rotgen::Index j) { return T(std::sin(i + j)); }}, 4, 4, 3, 3 },
|
||||
{ {5, 5, [](rotgen::Index i, rotgen::Index j) { return T((i + j) % 7); }}, 0, 0, 5, 5 },
|
||||
{ {9, 14, [](rotgen::Index i, rotgen::Index j) { return T(i+j + 3*j); }}, 3, 7, 1, 1 }
|
||||
};
|
||||
{{6, 11, [](rotgen::Index i, rotgen::Index j) { return T(i * 10 + j); }},
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
2},
|
||||
{{7, 10,
|
||||
[](rotgen::Index i, rotgen::Index j) { return T(std::sin(i + j)); }},
|
||||
4,
|
||||
4,
|
||||
3,
|
||||
3},
|
||||
{{5, 5, [](rotgen::Index i, rotgen::Index j) { return T((i + j) % 7); }},
|
||||
0,
|
||||
0,
|
||||
5,
|
||||
5},
|
||||
{{9, 14, [](rotgen::Index i, rotgen::Index j) { return T(i + j + 3 * j); }},
|
||||
3,
|
||||
7,
|
||||
1,
|
||||
1}};
|
||||
|
||||
for (auto const& matrix_case : cases) {
|
||||
for (auto const& matrix_case : cases)
|
||||
{
|
||||
test_dynamic_block_extraction<mat_t, T>(matrix_case);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check all dynamic block extractions on a static column-major matrix", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL(
|
||||
"Check all dynamic block extractions on a static column-major matrix",
|
||||
rotgen::tests::types)<typename T, typename O>(tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,4,5,O::value, 0>;
|
||||
using mat_t = rotgen::matrix<T, 4, 5, O::value, 0>;
|
||||
|
||||
std::vector<rotgen::tests::matrix_block_test_case<mat_t>> cases = {
|
||||
{ {4, 5, [](auto i, auto j) { return T(2*i + j*j*j - 42); } }, 1, 2, 3, 2 },
|
||||
{ {4, 5, [](auto i, auto j) { return T(std::tan(i*i*j)); } }, 0, 1, 2, 1 },
|
||||
{ {4, 5, [](auto i, auto j) { return T((i*i + j*j) / 6); } }, 2, 0, 0, 0 }
|
||||
};
|
||||
{{4, 5, [](auto i, auto j) { return T(2 * i + j * j * j - 42); }},
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
2},
|
||||
{{4, 5, [](auto i, auto j) { return T(std::tan(i * i * j)); }}, 0, 1, 2, 1},
|
||||
{{4, 5, [](auto i, auto j) { return T((i * i + j * j) / 6); }},
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
0}};
|
||||
|
||||
for (auto const& matrix_case : cases) {
|
||||
for (auto const& matrix_case : cases)
|
||||
{
|
||||
test_dynamic_block_extraction<mat_t, T>(matrix_case);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check all static block extractions", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check all static block extractions",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
|
||||
test_static_block_extraction<mat_t, T, 1, 2>(
|
||||
rotgen::tests::static_matrix_block_test_case<mat_t, 1, 2>{
|
||||
{11, 11, [](rotgen::Index i, rotgen::Index j) { return T(i*i*i + 3*j - 127); } },
|
||||
3, 2
|
||||
}
|
||||
);
|
||||
{11, 11,
|
||||
[](rotgen::Index i, rotgen::Index j) {
|
||||
return T(i * i * i + 3 * j - 127);
|
||||
}},
|
||||
3,
|
||||
2});
|
||||
|
||||
test_static_block_extraction<mat_t, double, 4, 3>(
|
||||
rotgen::tests::static_matrix_block_test_case<mat_t, 4, 3>{
|
||||
{14, 15,[](rotgen::Index i, rotgen::Index j) { return T(std::cos(i * j * 2)); }},
|
||||
5, 1
|
||||
}
|
||||
);
|
||||
{14, 15,
|
||||
[](rotgen::Index i, rotgen::Index j) { return T(std::cos(i * j * 2)); }},
|
||||
5,
|
||||
1});
|
||||
|
||||
test_static_block_extraction<mat_t, double, 0, 0>(
|
||||
rotgen::tests::static_matrix_block_test_case<mat_t, 0, 0>{
|
||||
{5, 5,[](rotgen::Index i, rotgen::Index j) { return T((i + j) % 9); }},
|
||||
0, 0
|
||||
}
|
||||
);
|
||||
{5, 5, [](rotgen::Index i, rotgen::Index j) { return T((i + j) % 9); }},
|
||||
0,
|
||||
0});
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check vector-only extractions",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>) {
|
||||
auto run_case = [](auto &&matrix, auto &&block, int i_offset, int j_offset,
|
||||
int ni, int nj, auto const &rows_ct, auto const &cols_ct) {
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto run_case = [](auto&& matrix, auto&& block, int i_offset, int j_offset,
|
||||
int ni, int nj, auto const& rows_ct, auto const& cols_ct) {
|
||||
using block_t = std::remove_reference_t<decltype(block)>;
|
||||
|
||||
TTS_EQUAL(block_t::RowsAtCompileTime, rows_ct);
|
||||
|
|
@ -360,12 +445,12 @@ TTS_CASE_TPL("Check vector-only extractions",
|
|||
validate_block_behavior(matrix, block, i_offset, j_offset, ni, nj);
|
||||
};
|
||||
|
||||
if constexpr (O::value == rotgen::RowMajor) {
|
||||
if constexpr (O::value == rotgen::RowMajor)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T, 1, rotgen::Dynamic, O::value>;
|
||||
mat_t m(1, 11);
|
||||
|
||||
for (rotgen::Index i = 0; i < 11; ++i)
|
||||
m(i) = 1 + i;
|
||||
for (rotgen::Index i = 0; i < 11; ++i) m(i) = 1 + i;
|
||||
|
||||
run_case(m, head(m, 1), 0, 0, 1, 1, 1, rotgen::Dynamic);
|
||||
run_case(m, head(m, 5), 0, 0, 1, 5, 1, rotgen::Dynamic);
|
||||
|
|
@ -385,12 +470,13 @@ TTS_CASE_TPL("Check vector-only extractions",
|
|||
run_case(m, segment<11>(m, 0), 0, 0, 1, 11, 1, 11);
|
||||
run_case(m, segment<7>(m, 0), 0, 0, 1, 7, 1, 7);
|
||||
run_case(m, segment<6>(m, 5), 0, 5, 1, 6, 1, 6);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, 1, O::value>;
|
||||
mat_t m(11, 1);
|
||||
|
||||
for (rotgen::Index i = 0; i < 11; ++i)
|
||||
m(i) = 1 + i;
|
||||
for (rotgen::Index i = 0; i < 11; ++i) m(i) = 1 + i;
|
||||
|
||||
run_case(m, head(m, 1), 0, 0, 1, 1, rotgen::Dynamic, 1);
|
||||
run_case(m, head(m, 5), 0, 0, 5, 1, rotgen::Dynamic, 1);
|
||||
|
|
|
|||
|
|
@ -8,261 +8,269 @@
|
|||
#include "unit/tests.hpp"
|
||||
#include <rotgen/rotgen.hpp>
|
||||
|
||||
void test_value ( const auto& matrix, auto value
|
||||
, rotgen::Index i0, rotgen::Index j0
|
||||
, rotgen::Index rows, rotgen::Index cols
|
||||
)
|
||||
void test_value(auto const& matrix,
|
||||
auto value,
|
||||
rotgen::Index i0,
|
||||
rotgen::Index j0,
|
||||
rotgen::Index rows,
|
||||
rotgen::Index cols)
|
||||
{
|
||||
for(rotgen::Index r=0;r<rows;++r)
|
||||
for(rotgen::Index c=0;c<cols;++c)
|
||||
TTS_EQUAL(matrix(i0+r, j0+c), value);
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
TTS_EQUAL(matrix(i0 + r, j0 + c), value);
|
||||
}
|
||||
|
||||
void test_identity( const auto& matrix
|
||||
, rotgen::Index i0, rotgen::Index j0
|
||||
, rotgen::Index rows, rotgen::Index cols
|
||||
)
|
||||
void test_identity(auto const& matrix,
|
||||
rotgen::Index i0,
|
||||
rotgen::Index j0,
|
||||
rotgen::Index rows,
|
||||
rotgen::Index cols)
|
||||
{
|
||||
for(rotgen::Index r=0;r<rows;++r)
|
||||
for(rotgen::Index c=0;c<cols;++c)
|
||||
TTS_EQUAL(matrix(i0+r, j0+c), r==c ? 1 : 0);
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
TTS_EQUAL(matrix(i0 + r, j0 + c), r == c ? 1 : 0);
|
||||
}
|
||||
|
||||
void test_random( const auto& matrix
|
||||
, rotgen::Index i0, rotgen::Index j0
|
||||
, rotgen::Index rows, rotgen::Index cols
|
||||
)
|
||||
void test_random(auto const& matrix,
|
||||
rotgen::Index i0,
|
||||
rotgen::Index j0,
|
||||
rotgen::Index rows,
|
||||
rotgen::Index cols)
|
||||
{
|
||||
for(rotgen::Index r=0;r<rows;++r)
|
||||
for(rotgen::Index c=0;c<cols;++c)
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
{
|
||||
TTS_GREATER_EQUAL(matrix(i0+r, j0+c), -1.0);
|
||||
TTS_LESS_EQUAL(matrix(i0+r, j0+c), 1.0);
|
||||
TTS_GREATER_EQUAL(matrix(i0 + r, j0 + c), -1.0);
|
||||
TTS_LESS_EQUAL(matrix(i0 + r, j0 + c), 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block::setZero", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>>)
|
||||
TTS_CASE_TPL("Test dynamic block::setZero",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
|
||||
input.setZero();
|
||||
test_value(m,T{0},i0,j0,ni,nj);
|
||||
test_value(m, T{0}, i0, j0, ni, nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract(m, i0, j0, ni, nj));
|
||||
auto values = input_type::Zero(ni,nj);
|
||||
test_value(values,T{0},0,0,ni,nj);
|
||||
auto values = input_type::Zero(ni, nj);
|
||||
test_value(values, T{0}, 0, 0, ni, nj);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block:setZero", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block:setZero",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
|
||||
input.setZero();
|
||||
test_value(m,T{0},i0,j0,D::ni,D::nj);
|
||||
test_value(m, T{0}, i0, j0, D::ni, D::nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract<D::ni,D::nj>(m, i0, j0));
|
||||
using input_type = decltype(rotgen::extract<D::ni, D::nj>(m, i0, j0));
|
||||
auto values = input_type::Zero();
|
||||
test_value(values,T{0},0,0,D::ni,D::nj);
|
||||
test_value(values, T{0}, 0, 0, D::ni, D::nj);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block::setOnes", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>>)
|
||||
TTS_CASE_TPL("Test dynamic block::setOnes",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
|
||||
input.setOnes();
|
||||
test_value(m,T{1},i0,j0,ni,nj);
|
||||
test_value(m, T{1}, i0, j0, ni, nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract(m, i0, j0, ni, nj));
|
||||
auto values = input_type::Ones(ni,nj);
|
||||
test_value(values,T{1},0,0,ni,nj);
|
||||
auto values = input_type::Ones(ni, nj);
|
||||
test_value(values, T{1}, 0, 0, ni, nj);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block:setOnes", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block:setOnes",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
|
||||
input.setOnes();
|
||||
test_value(m,T{1},i0,j0,D::ni,D::nj);
|
||||
test_value(m, T{1}, i0, j0, D::ni, D::nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract<D::ni,D::nj>(m, i0, j0));
|
||||
using input_type = decltype(rotgen::extract<D::ni, D::nj>(m, i0, j0));
|
||||
auto values = input_type::Ones();
|
||||
test_value(values,T{1},0,0,D::ni,D::nj);
|
||||
test_value(values, T{1}, 0, 0, D::ni, D::nj);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block::setConstant", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>>)
|
||||
TTS_CASE_TPL("Test dynamic block::setConstant",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
|
||||
input.setConstant(T{13.37f});
|
||||
test_value(m,T{13.37f},i0,j0,ni,nj);
|
||||
test_value(m, T{13.37f}, i0, j0, ni, nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract(m, i0, j0, ni, nj));
|
||||
auto values = input_type::Constant(ni,nj,T{13.37f});
|
||||
test_value(values,T{13.37f},0,0,ni,nj);
|
||||
auto values = input_type::Constant(ni, nj, T{13.37f});
|
||||
test_value(values, T{13.37f}, 0, 0, ni, nj);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block:setConstant", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block:setConstant",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
|
||||
input.setConstant(T{13.37f});
|
||||
test_value(m,T{13.37f},i0,j0,D::ni,D::nj);
|
||||
test_value(m, T{13.37f}, i0, j0, D::ni, D::nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract<D::ni,D::nj>(m, i0, j0));
|
||||
using input_type = decltype(rotgen::extract<D::ni, D::nj>(m, i0, j0));
|
||||
auto values = input_type::Constant(T{13.37f});
|
||||
test_value(values,T{13.37f},0,0,D::ni,D::nj);
|
||||
test_value(values, T{13.37f}, 0, 0, D::ni, D::nj);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block::setIdentity", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>>)
|
||||
TTS_CASE_TPL("Test dynamic block::setIdentity",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
|
||||
input.setIdentity();
|
||||
test_identity(m,i0,j0,ni,nj);
|
||||
test_identity(m, i0, j0, ni, nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract(m, i0, j0, ni, nj));
|
||||
auto values = input_type::Identity(ni,nj);
|
||||
test_identity(values,0,0,ni,nj);
|
||||
auto values = input_type::Identity(ni, nj);
|
||||
test_identity(values, 0, 0, ni, nj);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block:setIdentity", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block:setIdentity",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
|
||||
input.setIdentity();
|
||||
test_identity(m,i0,j0,D::ni,D::nj);
|
||||
test_identity(m, i0, j0, D::ni, D::nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract<D::ni,D::nj>(m, i0, j0));
|
||||
using input_type = decltype(rotgen::extract<D::ni, D::nj>(m, i0, j0));
|
||||
auto values = input_type::Identity();
|
||||
test_identity(values,0,0,D::ni,D::nj);
|
||||
test_identity(values, 0, 0, D::ni, D::nj);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block::setRandom", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>>)
|
||||
TTS_CASE_TPL("Test dynamic block::setRandom",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
|
||||
input.setRandom();
|
||||
test_random(m,i0,j0,ni,nj);
|
||||
test_random(m, i0, j0, ni, nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract(m, i0, j0, ni, nj));
|
||||
auto values = input_type::Random(ni,nj);
|
||||
test_random(values,0,0,ni,nj);
|
||||
auto values = input_type::Random(ni, nj);
|
||||
test_random(values, 0, 0, ni, nj);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
TTS_CASE_TPL("Test static block:setRandom", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block:setRandom",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
|
||||
input.setRandom();
|
||||
test_random(m,i0,j0,D::ni,D::nj);
|
||||
test_random(m, i0, j0, D::ni, D::nj);
|
||||
|
||||
using input_type = decltype(rotgen::extract<D::ni,D::nj>(m, i0, j0));
|
||||
using input_type = decltype(rotgen::extract<D::ni, D::nj>(m, i0, j0));
|
||||
auto values = input_type::Random();
|
||||
test_random(values,0,0,D::ni,D::nj);
|
||||
test_random(values, 0, 0, D::ni, D::nj);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
};
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -9,34 +9,35 @@
|
|||
#include "unit/common/norms.hpp"
|
||||
#include <rotgen/rotgen.hpp>
|
||||
|
||||
TTS_CASE_TPL("Test dynamic block norm operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test dynamic block norm operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_block_references<T,O>();
|
||||
for (const auto& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
auto const cases = rotgen::tests::generate_block_references<T, O>();
|
||||
for (auto const& [matrix_desc, i0, j0, ni, nj] : cases)
|
||||
{
|
||||
auto[rows,cols,fn] = matrix_desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto [rows, cols, fn] = matrix_desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract(m, i0, j0, ni, nj);
|
||||
rotgen::tests::check_norms_functions(input);
|
||||
}
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Test static block norm operations", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Test static block norm operations",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T,O>();
|
||||
auto const cases = rotgen::tests::generate_static_block_references<T, O>();
|
||||
|
||||
auto process = []<typename D>(D const& d)
|
||||
{
|
||||
auto[desc,i0,j0] = d;
|
||||
auto[rows,cols,fn] = desc;
|
||||
rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows,cols,fn,m);
|
||||
auto input = rotgen::extract<D::ni,D::nj>(m, i0, j0);
|
||||
auto process = []<typename D>(D const& d) {
|
||||
auto [desc, i0, j0] = d;
|
||||
auto [rows, cols, fn] = desc;
|
||||
rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value> m(rows, cols);
|
||||
rotgen::tests::prepare(rows, cols, fn, m);
|
||||
auto input = rotgen::extract<D::ni, D::nj>(m, i0, j0);
|
||||
rotgen::tests::check_norms_functions(input);
|
||||
};
|
||||
|
||||
std::apply([&](auto const&... d) { (process(d),...);}, cases);
|
||||
std::apply([&](auto const&... d) { (process(d), ...); }, cases);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -9,35 +9,38 @@
|
|||
#include <rotgen/rotgen.hpp>
|
||||
#include <Eigen/Dense>
|
||||
|
||||
template <typename MatrixType, typename T>
|
||||
void test_block_matrix_operations(rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
auto b_init_fn, auto ops, auto self_ops)
|
||||
template<typename MatrixType, typename T>
|
||||
void test_block_matrix_operations(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
auto b_init_fn,
|
||||
auto ops,
|
||||
auto self_ops)
|
||||
{
|
||||
using EigenMatrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
||||
|
||||
auto[d,i0,j0,ni,nj] = matrix_construct;
|
||||
auto[r,c,fn] = d;
|
||||
auto [d, i0, j0, ni, nj] = matrix_construct;
|
||||
auto [r, c, fn] = d;
|
||||
|
||||
MatrixType a(r, c);
|
||||
MatrixType b(r, c);
|
||||
EigenMatrix ref_a(r, c);
|
||||
EigenMatrix ref_b(r, c);
|
||||
|
||||
TTS_EXPECT(verify_rotgen_reentrance(ops(a,b)));
|
||||
TTS_EXPECT(verify_rotgen_reentrance(ops(a, b)));
|
||||
|
||||
for (rotgen::Index rr = 0; rr < r; ++rr)
|
||||
{
|
||||
for (rotgen::Index cc = 0; cc < c; ++cc)
|
||||
{
|
||||
ref_a(rr,cc) = a(rr,cc) = static_cast<T>(fn(rr,cc));
|
||||
ref_b(rr,cc) = b(rr,cc) = static_cast<T>(b_init_fn(rr,cc));
|
||||
ref_a(rr, cc) = a(rr, cc) = static_cast<T>(fn(rr, cc));
|
||||
ref_b(rr, cc) = b(rr, cc) = static_cast<T>(b_init_fn(rr, cc));
|
||||
}
|
||||
}
|
||||
|
||||
auto a_block = rotgen::extract(a, i0, j0,ni, nj);
|
||||
auto b_block = rotgen::extract(b, i0, j0,ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0,ni, nj);
|
||||
auto ref_b_block = ref_b.block(i0, j0,ni, nj);
|
||||
auto a_block = rotgen::extract(a, i0, j0, ni, nj);
|
||||
auto b_block = rotgen::extract(b, i0, j0, ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0, ni, nj);
|
||||
auto ref_b_block = ref_b.block(i0, j0, ni, nj);
|
||||
|
||||
auto result_block = ops(a_block, b_block);
|
||||
auto ref_result_block = ops(ref_a_block, ref_b_block);
|
||||
|
|
@ -46,7 +49,7 @@ void test_block_matrix_operations(rotgen::tests::matrix_block_test_case<MatrixTy
|
|||
for (rotgen::Index cc = 0; cc < nj; ++cc)
|
||||
TTS_EQUAL(result_block(rr, cc), ref_result_block(rr, cc));
|
||||
|
||||
self_ops(a_block,b_block);
|
||||
self_ops(a_block, b_block);
|
||||
self_ops(ref_a_block, ref_b_block);
|
||||
|
||||
for (rotgen::Index rr = 0; rr < ni; ++rr)
|
||||
|
|
@ -63,26 +66,29 @@ void test_block_matrix_operations(rotgen::tests::matrix_block_test_case<MatrixTy
|
|||
}
|
||||
}
|
||||
|
||||
template <typename MatrixType, typename T>
|
||||
void test_block_scalar_operations(rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
auto scalar, auto ops, auto self_ops)
|
||||
template<typename MatrixType, typename T>
|
||||
void test_block_scalar_operations(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
auto scalar,
|
||||
auto ops,
|
||||
auto self_ops)
|
||||
{
|
||||
using EigenMatrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
||||
|
||||
auto[d,i0,j0,ni,nj] = matrix_construct;
|
||||
auto[rows,cols,fn] = d;
|
||||
auto [d, i0, j0, ni, nj] = matrix_construct;
|
||||
auto [rows, cols, fn] = d;
|
||||
|
||||
MatrixType a(rows, cols);
|
||||
EigenMatrix ref_a(rows, cols);
|
||||
|
||||
TTS_EXPECT(verify_rotgen_reentrance(ops(a,scalar)));
|
||||
TTS_EXPECT(verify_rotgen_reentrance(ops(a, scalar)));
|
||||
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
ref_a(r,c) = a(r,c) = static_cast<T>(fn(r, c));
|
||||
ref_a(r, c) = a(r, c) = static_cast<T>(fn(r, c));
|
||||
|
||||
auto a_block = rotgen::extract(a, i0, j0,ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0,ni, nj);
|
||||
auto a_block = rotgen::extract(a, i0, j0, ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0, ni, nj);
|
||||
|
||||
auto result = ops(a_block, scalar);
|
||||
auto ref_result = ops(ref_a_block, scalar);
|
||||
|
|
@ -91,7 +97,7 @@ void test_block_scalar_operations(rotgen::tests::matrix_block_test_case<MatrixTy
|
|||
for (rotgen::Index c = 0; c < nj; ++c)
|
||||
TTS_EQUAL(result(r, c), ref_result(r, c));
|
||||
|
||||
self_ops(a_block,scalar);
|
||||
self_ops(a_block, scalar);
|
||||
self_ops(ref_a_block, scalar);
|
||||
|
||||
for (rotgen::Index r = 0; r < ni; ++r)
|
||||
|
|
@ -99,18 +105,18 @@ void test_block_scalar_operations(rotgen::tests::matrix_block_test_case<MatrixTy
|
|||
TTS_EQUAL(a_block(r, c), ref_a_block(r, c));
|
||||
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
for (rotgen::Index c = 0; c < cols; ++c) TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
}
|
||||
|
||||
template <typename MatrixType, typename T>
|
||||
void test_scalar_block_multiplications(rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
T scalar)
|
||||
template<typename MatrixType, typename T>
|
||||
void test_scalar_block_multiplications(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& matrix_construct,
|
||||
T scalar)
|
||||
{
|
||||
using EigenMatrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
||||
|
||||
auto[d,i0,j0,ni,nj] = matrix_construct;
|
||||
auto[rows,cols,fn] = d;
|
||||
auto [d, i0, j0, ni, nj] = matrix_construct;
|
||||
auto [rows, cols, fn] = d;
|
||||
|
||||
MatrixType a(rows, cols);
|
||||
EigenMatrix ref_a(rows, cols);
|
||||
|
|
@ -120,12 +126,10 @@ void test_scalar_block_multiplications(rotgen::tests::matrix_block_test_case<Mat
|
|||
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
ref_a(r,c) = a(r,c) = static_cast<T>(fn(r, c));
|
||||
ref_a(r, c) = a(r, c) = static_cast<T>(fn(r, c));
|
||||
|
||||
auto a_block = rotgen::extract(a, i0, j0,
|
||||
ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0,
|
||||
ni, nj);
|
||||
auto a_block = rotgen::extract(a, i0, j0, ni, nj);
|
||||
auto ref_a_block = ref_a.block(i0, j0, ni, nj);
|
||||
|
||||
auto a_scalar_multiplication = a_block * scalar;
|
||||
auto scalar_a_multiplication = scalar * a_block;
|
||||
|
|
@ -136,8 +140,10 @@ void test_scalar_block_multiplications(rotgen::tests::matrix_block_test_case<Mat
|
|||
{
|
||||
for (rotgen::Index c = 0; c < nj; ++c)
|
||||
{
|
||||
TTS_EQUAL(a_scalar_multiplication (r, c), a_scalar_multiplication_ref(r, c));
|
||||
TTS_EQUAL(scalar_a_multiplication(r, c), scalar_a_multiplication_ref(r, c));
|
||||
TTS_EQUAL(a_scalar_multiplication(r, c),
|
||||
a_scalar_multiplication_ref(r, c));
|
||||
TTS_EQUAL(scalar_a_multiplication(r, c),
|
||||
scalar_a_multiplication_ref(r, c));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -149,22 +155,21 @@ void test_scalar_block_multiplications(rotgen::tests::matrix_block_test_case<Mat
|
|||
TTS_EQUAL(a_block(r, c), ref_a_block(r, c));
|
||||
|
||||
for (rotgen::Index r = 0; r < rows; ++r)
|
||||
for (rotgen::Index c = 0; c < cols; ++c)
|
||||
TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
for (rotgen::Index c = 0; c < cols; ++c) TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
}
|
||||
|
||||
template <typename MatrixType, typename T>
|
||||
void test_block_multiplication(rotgen::tests::matrix_block_test_case<MatrixType> const& a_matrix_construct,
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& b_matrix_construct)
|
||||
template<typename MatrixType, typename T>
|
||||
void test_block_multiplication(
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& a_matrix_construct,
|
||||
rotgen::tests::matrix_block_test_case<MatrixType> const& b_matrix_construct)
|
||||
{
|
||||
using EigenMatrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
|
||||
|
||||
auto[a_d,a_i0,a_j0,a_ni,a_nj] = a_matrix_construct;
|
||||
auto[a_rows,a_cols,a_fn] = a_d;
|
||||
|
||||
auto[b_d,b_i0,b_j0,b_ni,b_nj] = b_matrix_construct;
|
||||
auto[b_rows,b_cols,b_fn] = b_d;
|
||||
auto [a_d, a_i0, a_j0, a_ni, a_nj] = a_matrix_construct;
|
||||
auto [a_rows, a_cols, a_fn] = a_d;
|
||||
|
||||
auto [b_d, b_i0, b_j0, b_ni, b_nj] = b_matrix_construct;
|
||||
auto [b_rows, b_cols, b_fn] = b_d;
|
||||
|
||||
MatrixType a(a_rows, a_cols);
|
||||
MatrixType b(b_rows, b_cols);
|
||||
|
|
@ -173,17 +178,16 @@ void test_block_multiplication(rotgen::tests::matrix_block_test_case<MatrixType>
|
|||
|
||||
for (rotgen::Index r = 0; r < a_rows; ++r)
|
||||
for (rotgen::Index c = 0; c < a_cols; ++c)
|
||||
ref_a(r,c) = a(r,c) = static_cast<T>(a_fn(r, c));
|
||||
ref_a(r, c) = a(r, c) = static_cast<T>(a_fn(r, c));
|
||||
|
||||
for (rotgen::Index r = 0; r < b_rows; ++r)
|
||||
for (rotgen::Index c = 0; c < b_cols; ++c)
|
||||
ref_b(r,c) = b(r,c) = static_cast<T>(b_fn(r, c));
|
||||
ref_b(r, c) = b(r, c) = static_cast<T>(b_fn(r, c));
|
||||
|
||||
|
||||
auto a_block = rotgen::extract(a, a_i0, a_j0,a_ni, a_nj);
|
||||
auto b_block = rotgen::extract(b, b_i0, b_j0,b_ni, b_nj);
|
||||
auto ref_a_block = ref_a.block(a_i0, a_j0,a_ni, a_nj);
|
||||
auto ref_b_block = ref_b.block(b_i0, b_j0,b_ni, b_nj);
|
||||
auto a_block = rotgen::extract(a, a_i0, a_j0, a_ni, a_nj);
|
||||
auto b_block = rotgen::extract(b, b_i0, b_j0, b_ni, b_nj);
|
||||
auto ref_a_block = ref_a.block(a_i0, a_j0, a_ni, a_nj);
|
||||
auto ref_b_block = ref_b.block(b_i0, b_j0, b_ni, b_nj);
|
||||
|
||||
TTS_EXPECT(verify_rotgen_reentrance(a_block * b_block));
|
||||
|
||||
|
|
@ -192,7 +196,7 @@ void test_block_multiplication(rotgen::tests::matrix_block_test_case<MatrixType>
|
|||
|
||||
for (rotgen::Index r = 0; r < a_ni; ++r)
|
||||
for (rotgen::Index c = 0; c < a_nj; ++c)
|
||||
TTS_EQUAL(a_b_product_original (r, c), a_b_product_ref(r, c));
|
||||
TTS_EQUAL(a_b_product_original(r, c), a_b_product_ref(r, c));
|
||||
|
||||
a_block *= b_block;
|
||||
ref_a_block *= ref_b_block;
|
||||
|
|
@ -202,106 +206,162 @@ void test_block_multiplication(rotgen::tests::matrix_block_test_case<MatrixType>
|
|||
TTS_EQUAL(a_block(r, c), ref_a_block(r, c));
|
||||
|
||||
for (rotgen::Index r = 0; r < a_rows; ++r)
|
||||
for (rotgen::Index c = 0; c < a_cols; ++c)
|
||||
TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
for (rotgen::Index c = 0; c < a_cols; ++c) TTS_EQUAL(a(r, c), ref_a(r, c));
|
||||
|
||||
for (rotgen::Index r = 0; r < b_rows; ++r)
|
||||
for (rotgen::Index c = 0; c < b_cols; ++c)
|
||||
TTS_EQUAL(b(r, c), ref_b(r, c));
|
||||
for (rotgen::Index c = 0; c < b_cols; ++c) TTS_EQUAL(b(r, c), ref_b(r, c));
|
||||
}
|
||||
|
||||
// Basic initializers
|
||||
inline constexpr auto init_a = [](auto r, auto c) { return 9.9*r*r*r - 6*c -12; };
|
||||
inline constexpr auto init_b = [](auto r, auto c) { return 3.1*r + 4.2*c - 12.3; };
|
||||
inline constexpr auto init_0 = [](auto , auto ) { return 0; };
|
||||
inline constexpr auto init_a = [](auto r, auto c) {
|
||||
return 9.9 * r * r * r - 6 * c - 12;
|
||||
};
|
||||
inline constexpr auto init_b = [](auto r, auto c) {
|
||||
return 3.1 * r + 4.2 * c - 12.3;
|
||||
};
|
||||
inline constexpr auto init_0 = [](auto, auto) { return 0; };
|
||||
|
||||
TTS_CASE_TPL("Check block addition", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check block addition",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
auto op = [](auto a, auto b) { return a + b; };
|
||||
auto s_op = [](auto& a, auto b) { return a += b; };
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
auto op = [](auto a, auto b) { return a + b; };
|
||||
auto s_op = [](auto& a, auto b) { return a += b; };
|
||||
|
||||
test_block_matrix_operations<mat_t, T>({{ 1, 1, init_a}, 0, 0, 1, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 5, 9, init_a}, 2, 2, 2, 2}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 5, 5, init_b}, 1, 0, 3, 2}, init_a, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 1, 10, init_a}, 0, 0, 1, 5}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, init_0, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{5, 9, init_a}, 2, 2, 2, 2}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{5, 5, init_b}, 1, 0, 3, 2}, init_a,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{1, 10, init_a}, 0, 0, 1, 5}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, init_0,
|
||||
op, s_op);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check block subtraction", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check block subtraction",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
auto op = [](auto a, auto b) { return a - b; };
|
||||
auto s_op = [](auto& a, auto b) { return a -= b; };
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
auto op = [](auto a, auto b) { return a - b; };
|
||||
auto s_op = [](auto& a, auto b) { return a -= b; };
|
||||
|
||||
test_block_matrix_operations<mat_t, T>({{ 1, 1, init_a}, 0, 0, 1, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 1, 1, init_a}, 0, 0, 1, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 5, 9, init_a}, 2, 2, 2, 2}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 5, 5, init_b}, 1, 0, 3, 2}, init_a, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{ 1, 10, init_a}, 0, 0, 1, 5}, init_b,op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{21 , 5, init_0}, 4, 4, 10, 1}, init_b, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{11 , 7, init_a}, 2, 0, 7, 5}, init_0, op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{5, 9, init_a}, 2, 2, 2, 2}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{5, 5, init_b}, 1, 0, 3, 2}, init_a,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{1, 10, init_a}, 0, 0, 1, 5}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, init_b,
|
||||
op, s_op);
|
||||
test_block_matrix_operations<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, init_0,
|
||||
op, s_op);
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check block multiplications", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check block multiplications",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
auto init_id = [](rotgen::Index r, rotgen::Index c) { return r == c ? 1 : 0; };
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
auto init_id = [](rotgen::Index r, rotgen::Index c) {
|
||||
return r == c ? 1 : 0;
|
||||
};
|
||||
|
||||
test_block_multiplication<mat_t, T>({{ 1, 1, init_a }, 0, 0, 1, 1}, {{ 1, 1, init_b }, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{13, 15, init_b }, 1, 2, 4, 4}, {{13, 15, init_b }, 0, 1, 4, 4});
|
||||
test_block_multiplication<mat_t, T>({{ 6, 9, init_a }, 2, 2, 2, 2}, {{ 5, 9, init_b }, 2, 2, 2, 2});
|
||||
test_block_multiplication<mat_t, T>({{15, 15, init_a }, 3, 4, 5, 5}, {{15, 15, init_b }, 0, 0, 5, 5});
|
||||
test_block_multiplication<mat_t, T>({{ 5, 5, init_b }, 1, 0, 3, 3}, {{ 5, 5, init_a }, 0, 0, 3, 3});
|
||||
test_block_multiplication<mat_t, T>({{11, 3, init_id}, 2, 0, 2, 2}, {{18, 7, init_a }, 2, 0, 2, 2});
|
||||
test_block_multiplication<mat_t, T>({{10, 1, init_a }, 0, 0, 1, 1}, {{10, 1, init_a }, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{ 1, 10, init_a }, 0, 0, 1, 1}, {{ 1, 10, init_id}, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{21, 5, init_0 }, 1, 1, 3, 3}, {{12, 7, init_0 }, 4, 4, 3, 3});
|
||||
test_block_multiplication<mat_t, T>({{11, 7, init_a }, 2, 0, 7, 7}, {{11, 11, init_a }, 2, 1, 7, 7});
|
||||
test_block_multiplication<mat_t, T>({{11, 7, init_a }, 2, 0, 5, 5}, {{11, 12, init_id}, 0, 0, 5, 5});
|
||||
test_block_multiplication<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1},
|
||||
{{1, 1, init_b}, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{13, 15, init_b}, 1, 2, 4, 4},
|
||||
{{13, 15, init_b}, 0, 1, 4, 4});
|
||||
test_block_multiplication<mat_t, T>({{6, 9, init_a}, 2, 2, 2, 2},
|
||||
{{5, 9, init_b}, 2, 2, 2, 2});
|
||||
test_block_multiplication<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5},
|
||||
{{15, 15, init_b}, 0, 0, 5, 5});
|
||||
test_block_multiplication<mat_t, T>({{5, 5, init_b}, 1, 0, 3, 3},
|
||||
{{5, 5, init_a}, 0, 0, 3, 3});
|
||||
test_block_multiplication<mat_t, T>({{11, 3, init_id}, 2, 0, 2, 2},
|
||||
{{18, 7, init_a}, 2, 0, 2, 2});
|
||||
test_block_multiplication<mat_t, T>({{10, 1, init_a}, 0, 0, 1, 1},
|
||||
{{10, 1, init_a}, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{1, 10, init_a}, 0, 0, 1, 1},
|
||||
{{1, 10, init_id}, 0, 0, 1, 1});
|
||||
test_block_multiplication<mat_t, T>({{21, 5, init_0}, 1, 1, 3, 3},
|
||||
{{12, 7, init_0}, 4, 4, 3, 3});
|
||||
test_block_multiplication<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 7},
|
||||
{{11, 11, init_a}, 2, 1, 7, 7});
|
||||
test_block_multiplication<mat_t, T>({{11, 7, init_a}, 2, 0, 5, 5},
|
||||
{{11, 12, init_id}, 0, 0, 5, 5});
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check block multiplication with scalar", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check block multiplication with scalar",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
|
||||
test_scalar_block_multiplications<mat_t, T>({{ 1, 1, init_a}, 0, 0, 1, 1}, T{ 3.5});
|
||||
test_scalar_block_multiplications<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, T{ 0.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{ 5 , 9, init_a}, 2, 2, 2, 2}, T{-2.5});
|
||||
test_scalar_block_multiplications<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, T{ 42. });
|
||||
test_scalar_block_multiplications<mat_t, T>({{ 5, 5, init_b}, 1, 0, 3, 2}, T{-5. });
|
||||
test_scalar_block_multiplications<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, T{ 1. });
|
||||
test_scalar_block_multiplications<mat_t, T>({{ 1, 10, init_a}, 0, 0, 1, 5}, T{ 6. });
|
||||
test_scalar_block_multiplications<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, T{ 10.1});
|
||||
test_scalar_block_multiplications<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, T{-0.5});
|
||||
test_scalar_block_multiplications<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1},
|
||||
T{3.5});
|
||||
test_scalar_block_multiplications<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4},
|
||||
T{0.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{5, 9, init_a}, 2, 2, 2, 2},
|
||||
T{-2.5});
|
||||
test_scalar_block_multiplications<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5},
|
||||
T{42.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{5, 5, init_b}, 1, 0, 3, 2},
|
||||
T{-5.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1},
|
||||
T{1.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{1, 10, init_a}, 0, 0, 1, 5},
|
||||
T{6.});
|
||||
test_scalar_block_multiplications<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1},
|
||||
T{10.1});
|
||||
test_scalar_block_multiplications<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5},
|
||||
T{-0.5});
|
||||
};
|
||||
|
||||
TTS_CASE_TPL("Check block division with scalar", rotgen::tests::types)
|
||||
<typename T, typename O>( tts::type< tts::types<T,O>> )
|
||||
TTS_CASE_TPL("Check block division with scalar",
|
||||
rotgen::tests::types)<typename T, typename O>(
|
||||
tts::type<tts::types<T, O>>)
|
||||
{
|
||||
using mat_t = rotgen::matrix<T,rotgen::Dynamic,rotgen::Dynamic,O::value>;
|
||||
auto op = [](auto a, auto b) { return a / b; };
|
||||
auto s_op = [](auto& a, auto b) { return a /= b; };
|
||||
using mat_t = rotgen::matrix<T, rotgen::Dynamic, rotgen::Dynamic, O::value>;
|
||||
auto op = [](auto a, auto b) { return a / b; };
|
||||
auto s_op = [](auto& a, auto b) { return a /= b; };
|
||||
|
||||
test_block_scalar_operations<mat_t, T>({{ 1, 1, init_a}, 0, 0, 1, 1}, T{ 3.5}, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4}, T{-2.5}, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{ 5, 9, init_a}, 2, 2, 2, 2}, T{ 42. }, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, T{-5. }, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{ 5, 5, init_b}, 1, 0, 3, 2}, T{ 1. }, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, T{ 0. }, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{ 1, 10, init_a}, 0, 0, 1, 5}, T{ 6. }, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, T{ 10.}, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, T{-0.5}, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{1, 1, init_a}, 0, 0, 1, 1}, T{3.5},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{13, 15, init_a}, 1, 2, 3, 4},
|
||||
T{-2.5}, op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{5, 9, init_a}, 2, 2, 2, 2}, T{42.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{15, 15, init_a}, 3, 4, 5, 5}, T{-5.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{5, 5, init_b}, 1, 0, 3, 2}, T{1.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{10, 1, init_a}, 0, 0, 5, 1}, T{0.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{1, 10, init_a}, 0, 0, 1, 5}, T{6.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{21, 5, init_0}, 4, 4, 10, 1}, T{10.},
|
||||
op, s_op);
|
||||
test_block_scalar_operations<mat_t, T>({{11, 7, init_a}, 2, 0, 7, 5}, T{-0.5},
|
||||
op, s_op);
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue