Skip to content
Snippets Groups Projects
Commit d39ce5a2 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add missing tests for DenseMatrix

parent aff10f34
Branches
Tags
1 merge request!103Set AssertError to inherit from std::runtime_error
...@@ -66,7 +66,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -66,7 +66,7 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_columns == x.size()); Assert(m_nb_columns == x.size(), "cannot compute matrix-vector product: incompatible sizes");
const DenseMatrix& A = *this; const DenseMatrix& A = *this;
Vector<std::remove_const_t<DataType>> Ax{m_nb_rows}; Vector<std::remove_const_t<DataType>> Ax{m_nb_rows};
for (size_t i = 0; i < m_nb_rows; ++i) { for (size_t i = 0; i < m_nb_rows; ++i) {
...@@ -85,7 +85,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -85,7 +85,7 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_columns == B.numberOfRows()); Assert(m_nb_columns == B.numberOfRows(), "cannot compute matrix product: incompatible sizes");
const DenseMatrix& A = *this; const DenseMatrix& A = *this;
DenseMatrix<std::remove_const_t<DataType>> AB{m_nb_rows, B.numberOfColumns()}; DenseMatrix<std::remove_const_t<DataType>> AB{m_nb_rows, B.numberOfColumns()};
...@@ -124,8 +124,8 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -124,8 +124,8 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_rows == B.numberOfRows()); Assert((m_nb_rows == B.numberOfRows()) and (m_nb_columns == B.numberOfColumns()),
Assert(m_nb_columns == B.numberOfColumns()); "cannot substract matrix: incompatible sizes");
parallel_for( parallel_for(
m_values.size(), PUGS_LAMBDA(index_type i) { m_values[i] -= B.m_values[i]; }); m_values.size(), PUGS_LAMBDA(index_type i) { m_values[i] -= B.m_values[i]; });
...@@ -138,8 +138,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -138,8 +138,7 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_rows == B.numberOfRows()); Assert((m_nb_rows == B.numberOfRows()) and (m_nb_columns == B.numberOfColumns()), "incompatible matrix sizes");
Assert(m_nb_columns == B.numberOfColumns());
parallel_for( parallel_for(
m_values.size(), PUGS_LAMBDA(index_type i) { m_values[i] += B.m_values[i]; }); m_values.size(), PUGS_LAMBDA(index_type i) { m_values[i] += B.m_values[i]; });
...@@ -152,8 +151,9 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -152,8 +151,9 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_rows == B.numberOfRows()); Assert((m_nb_rows == B.numberOfRows()) and (m_nb_columns == B.numberOfColumns()),
Assert(m_nb_columns == B.numberOfColumns()); "cannot compute matrix sum: incompatible sizes");
DenseMatrix<std::remove_const_t<DataType>> sum{B.numberOfRows(), B.numberOfColumns()}; DenseMatrix<std::remove_const_t<DataType>> sum{B.numberOfRows(), B.numberOfColumns()};
parallel_for( parallel_for(
...@@ -168,8 +168,9 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -168,8 +168,9 @@ class DenseMatrix // LCOV_EXCL_LINE
{ {
static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>, static_assert(std::is_same_v<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>,
"incompatible data types"); "incompatible data types");
Assert(m_nb_rows == B.numberOfRows()); Assert((m_nb_rows == B.numberOfRows()) and (m_nb_columns == B.numberOfColumns()),
Assert(m_nb_columns == B.numberOfColumns()); "cannot compute matrix difference: incompatible sizes");
DenseMatrix<std::remove_const_t<DataType>> difference{B.numberOfRows(), B.numberOfColumns()}; DenseMatrix<std::remove_const_t<DataType>> difference{B.numberOfRows(), B.numberOfColumns()};
parallel_for( parallel_for(
...@@ -182,7 +183,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -182,7 +183,7 @@ class DenseMatrix // LCOV_EXCL_LINE
DataType& DataType&
operator()(index_type i, index_type j) const noexcept(NO_ASSERT) operator()(index_type i, index_type j) const noexcept(NO_ASSERT)
{ {
Assert((i < m_nb_rows and j < m_nb_columns), "invalid indices"); Assert(i < m_nb_rows and j < m_nb_columns, "cannot access element: invalid indices");
return m_values[i * m_nb_columns + j]; return m_values[i * m_nb_columns + j];
} }
...@@ -214,7 +215,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -214,7 +215,7 @@ class DenseMatrix // LCOV_EXCL_LINE
PUGS_INLINE DenseMatrix& operator=(IdentityType) noexcept(NO_ASSERT) PUGS_INLINE DenseMatrix& operator=(IdentityType) noexcept(NO_ASSERT)
{ {
Assert(m_nb_rows == m_nb_columns, "Identity must be a square matrix"); Assert(m_nb_rows == m_nb_columns, "identity must be a square matrix");
m_values.fill(0); m_values.fill(0);
parallel_for( parallel_for(
...@@ -286,7 +287,7 @@ class DenseMatrix // LCOV_EXCL_LINE ...@@ -286,7 +287,7 @@ class DenseMatrix // LCOV_EXCL_LINE
DenseMatrix(size_t nb_rows, size_t nb_columns, const Array<DataType> values) noexcept(NO_ASSERT) DenseMatrix(size_t nb_rows, size_t nb_columns, const Array<DataType> values) noexcept(NO_ASSERT)
: m_nb_rows{nb_rows}, m_nb_columns{nb_columns}, m_values{values} : m_nb_rows{nb_rows}, m_nb_columns{nb_columns}, m_values{values}
{ {
Assert(m_values.size() == m_nb_rows * m_nb_columns, "incompatible sizes"); Assert(m_values.size() == m_nb_rows * m_nb_columns, "cannot create matrix: incorrect number of values");
} }
public: public:
......
...@@ -20,6 +20,15 @@ TEST_CASE("DenseMatrix", "[algebra]") ...@@ -20,6 +20,15 @@ TEST_CASE("DenseMatrix", "[algebra]")
REQUIRE(A.numberOfColumns() == 3); REQUIRE(A.numberOfColumns() == 3);
} }
SECTION("is square")
{
REQUIRE(not DenseMatrix<int>{2, 3}.isSquare());
REQUIRE(not DenseMatrix<int>{4, 3}.isSquare());
REQUIRE(DenseMatrix<int>{1, 1}.isSquare());
REQUIRE(DenseMatrix<int>{2, 2}.isSquare());
REQUIRE(DenseMatrix<int>{3, 3}.isSquare());
}
SECTION("write access") SECTION("write access")
{ {
DenseMatrix<int> A{2, 3}; DenseMatrix<int> A{2, 3};
...@@ -56,6 +65,28 @@ TEST_CASE("DenseMatrix", "[algebra]") ...@@ -56,6 +65,28 @@ TEST_CASE("DenseMatrix", "[algebra]")
REQUIRE(A(1, 2) == 2); REQUIRE(A(1, 2) == 2);
} }
SECTION("zero matrix")
{
DenseMatrix<int> A{2, 3};
A = zero;
for (size_t i = 0; i < A.numberOfRows(); ++i) {
for (size_t j = 0; j < A.numberOfColumns(); ++j) {
REQUIRE(A(i, j) == 0);
}
}
}
SECTION("identity matrix")
{
DenseMatrix<int> A{3, 3};
A = identity;
for (size_t i = 0; i < A.numberOfRows(); ++i) {
for (size_t j = 0; j < A.numberOfColumns(); ++j) {
REQUIRE(A(i, j) == (i == j));
}
}
}
SECTION("copy constructor (shallow)") SECTION("copy constructor (shallow)")
{ {
DenseMatrix<int> A{2, 3}; DenseMatrix<int> A{2, 3};
...@@ -341,4 +372,62 @@ TEST_CASE("DenseMatrix", "[algebra]") ...@@ -341,4 +372,62 @@ TEST_CASE("DenseMatrix", "[algebra]")
REQUIRE(C(1, 0) == 64); REQUIRE(C(1, 0) == 64);
REQUIRE(C(1, 1) == 137); REQUIRE(C(1, 1) == 137);
} }
#ifndef NDEBUG
SECTION("non square identity matrix")
{
DenseMatrix<int> A(2, 3);
REQUIRE_THROWS_WITH(A = identity, "identity must be a square matrix");
}
SECTION("invalid matrix vector product")
{
DenseMatrix<int> A(2, 3);
Vector<int> u(2);
REQUIRE_THROWS_WITH(A * u, "cannot compute matrix-vector product: incompatible sizes");
}
SECTION("invalid matrix product")
{
DenseMatrix<int> A(2, 3);
DenseMatrix<int> B(2, 3);
REQUIRE_THROWS_WITH(A * B, "cannot compute matrix product: incompatible sizes");
}
SECTION("invalid matrix substract")
{
DenseMatrix<int> A(2, 3);
DenseMatrix<int> B(3, 2);
REQUIRE_THROWS_WITH(A -= B, "cannot substract matrix: incompatible sizes");
}
SECTION("invalid matrix sum")
{
DenseMatrix<int> A(2, 3);
DenseMatrix<int> B(3, 2);
REQUIRE_THROWS_WITH(A + B, "cannot compute matrix sum: incompatible sizes");
}
SECTION("invalid matrix difference")
{
DenseMatrix<int> A(2, 3);
DenseMatrix<int> B(3, 2);
REQUIRE_THROWS_WITH(A - B, "cannot compute matrix difference: incompatible sizes");
}
SECTION("invalid indices")
{
DenseMatrix<int> A(2, 3);
REQUIRE_THROWS_WITH(A(2, 0), "cannot access element: invalid indices");
REQUIRE_THROWS_WITH(A(0, 3), "cannot access element: invalid indices");
}
#endif // NDEBUG
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment