Skip to content

Commit

Permalink
Matrix print (#711)
Browse files Browse the repository at this point in the history
add matrix print
  • Loading branch information
mattldawson authored Jan 24, 2025
1 parent 51ddf39 commit 45e9f7b
Show file tree
Hide file tree
Showing 11 changed files with 147 additions and 1 deletion.
14 changes: 14 additions & 0 deletions include/micm/util/matrix.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,20 @@ namespace micm
this->data_.assign(other.AsVector().begin(), other.AsVector().end());
}

// Print the matrix to the output stream
friend std::ostream &operator<<(std::ostream &os, const Matrix &matrix)
{
for (std::size_t i = 0; i < matrix.x_dim_; ++i)
{
for (std::size_t j = 0; j < matrix.y_dim_-1; ++j)
{
os << matrix[i][j] << ',';
}
os << matrix[i][matrix.y_dim_-1] << std::endl;
}
return os;
}

std::vector<T> &AsVector()
{
return data_;
Expand Down
26 changes: 26 additions & 0 deletions include/micm/util/sparse_matrix.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <stdexcept>
#include <utility>
#include <vector>
#include <ostream>

namespace micm
{
Expand Down Expand Up @@ -263,6 +264,30 @@ namespace micm
std::transform(data_.begin(), data_.end(), data_.begin(), [&](auto& _) { return val; });
return *this;
}

friend std::ostream &operator<<(std::ostream &os, const SparseMatrix &matrix)
{
for (std::size_t i = 0; i < matrix.number_of_blocks_; ++i)
{
os << "Block " << i << std::endl;
for (std::size_t j = 0; j < matrix.block_size_; ++j)
{
for (std::size_t k = 0; k < matrix.block_size_-1; ++k)
{
if (matrix.IsZero(j, k))
os << "0,";
else
os << matrix[i][j][k] << ',';
}
if (matrix.IsZero(j, matrix.block_size_-1))
os << "0" << std::endl;
else
os << matrix[i][j][matrix.block_size_-1] << std::endl;
}
}
return os;
}

};

template<class T, class OrderingPolicy = SparseMatrixStandardOrdering>
Expand Down Expand Up @@ -311,6 +336,7 @@ namespace micm
{
return non_zero_elements_.size() * number_of_blocks_;
}

};

} // namespace micm
14 changes: 14 additions & 0 deletions include/micm/util/vector_matrix.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,20 @@ namespace micm
this->data_.assign(other.AsVector().begin(), other.AsVector().end());
}

// Print the VectorMatrix to the output stream
friend std::ostream &operator<<(std::ostream &os, const VectorMatrix &matrix)
{
for (std::size_t i = 0; i < matrix.x_dim_; ++i)
{
for (std::size_t j = 0; j < matrix.y_dim_-1; ++j)
{
os << matrix[i][j] << ',';
}
os << matrix[i][matrix.y_dim_-1] << std::endl;
}
return os;
}

std::vector<T> &AsVector()
{
return data_;
Expand Down
5 changes: 5 additions & 0 deletions test/unit/util/test_matrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,9 @@ TEST(Matrix, Max)
TEST(Matrix, Min)
{
testMin<micm::Matrix>();
}

TEST(Matrix, Print)
{
testPrint<micm::Matrix>();
}
16 changes: 16 additions & 0 deletions test/unit/util/test_matrix_policy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,5 +329,21 @@ MatrixPolicy<double> testMin()
EXPECT_EQ(matrix[1][1], 2.0);
EXPECT_EQ(matrix[1][2], 1.0);

return matrix;
}

template<template<class> class MatrixPolicy>
MatrixPolicy<double> testPrint()
{
MatrixPolicy<double> matrix{ 2, 3, 0.0 };

matrix[1][1] = 3.0;

std::stringstream ss, endline;
ss << matrix;
endline << std::endl;

EXPECT_EQ(ss.str(), "0,0,0"+endline.str()+"0,3,0"+endline.str());

return matrix;
}
37 changes: 37 additions & 0 deletions test/unit/util/test_sparse_matrix_policy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -466,3 +466,40 @@ MatrixPolicy<int, OrderingPolicy> testAddToDiagonal()

return matrix;
}

template<template<class, class> class MatrixPolicy, class OrderingPolicy>
MatrixPolicy<int, OrderingPolicy> testPrint()
{
auto builder = MatrixPolicy<int, OrderingPolicy>::Create(4)
.WithElement(0, 1)
.WithElement(3, 2)
.WithElement(0, 1)
.WithElement(2, 3)
.WithElement(1, 1)
.WithElement(2, 1)
.InitialValue(24)
.SetNumberOfBlocks(3);
// 0 X 0 0
// 0 X 0 0
// 0 X 0 X
// 0 0 X 0
MatrixPolicy<int, OrderingPolicy> matrix{ builder };

matrix[0][1][1] = 1;
matrix[1][1][1] = 3;
matrix[2][1][1] = 5;

matrix.AddToDiagonal(7);

std::stringstream ss, endline;
ss << matrix;
endline << std::endl;

std::string expected_output = "Block 0"+endline.str()+"0,24,0,0"+endline.str()+"0,8,0,0"+endline.str()+"0,24,0,24"+endline.str()+"0,0,24,0"+endline.str()
+ "Block 1"+endline.str()+"0,24,0,0"+endline.str()+"0,10,0,0"+endline.str()+"0,24,0,24"+endline.str()+"0,0,24,0"+endline.str()
+ "Block 2"+endline.str()+"0,24,0,0"+endline.str()+"0,12,0,0"+endline.str()+"0,24,0,24"+endline.str()+"0,0,24,0"+endline.str();
EXPECT_EQ(ss.str(), expected_output);

return matrix;
}

Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ TEST(SparseCompressedColumnMatrix, MultiBlockMatrix)
}
}

TEST(SparseCompressedColumnMatrix, Print)
{
auto matrix = testPrint<micm::SparseMatrix, StandardOrdering>();
}

TEST(SparseMatrixBuilder, BadConfiguration)
{
EXPECT_THROW(
Expand All @@ -104,4 +109,4 @@ TEST(SparseMatrixBuilder, BadConfiguration)
throw;
},
std::system_error);
}
}
5 changes: 5 additions & 0 deletions test/unit/util/test_sparse_matrix_standard_ordering_row.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ TEST(SparseCompressedRowMatrix, MultiBlockMatrix)
}
}

TEST(SparseCompressedRowMatrix, Print)
{
testPrint<micm::SparseMatrix, StandardOrdering>();
}

TEST(SparseMatrixBuilder, BadConfiguration)
{
EXPECT_THROW(
Expand Down
8 changes: 8 additions & 0 deletions test/unit/util/test_sparse_matrix_vector_ordering_column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,11 @@ TEST(SparseVectorCompressedColumnMatrix, MultiBlockMatrix)
EXPECT_EQ(matrix.GroupSize(), 2 * 5);
EXPECT_EQ(matrix.NumberOfGroups(4), 2);
}

TEST(SparseVectorCompressedColumnMatrix, Print)
{
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseColumn<1>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseColumn<2>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseColumn<3>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseColumn<4>>();
}
8 changes: 8 additions & 0 deletions test/unit/util/test_sparse_matrix_vector_ordering_row.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,11 @@ TEST(SparseVectorCompressedRowMatrix, MultiBlockMatrix)
EXPECT_EQ(matrix.GroupSize(), 2 * 5);
EXPECT_EQ(matrix.NumberOfGroups(4), 2);
}

TEST(SparseVectorCompressedRowMatrix, Print)
{
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseRow<1>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseRow<2>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseRow<3>>();
testPrint<micm::SparseMatrix, micm::SparseMatrixVectorOrderingCompressedSparseRow<4>>();
}
8 changes: 8 additions & 0 deletions test/unit/util/test_vector_matrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,12 @@ TEST(VectorMatrix, Min)
testMin<Group2MatrixAlias>();
testMin<Group3MatrixAlias>();
testMin<Group4MatrixAlias>();
}

TEST(VectorMatrix, Print)
{
testPrint<Group1MatrixAlias>();
testPrint<Group2MatrixAlias>();
testPrint<Group3MatrixAlias>();
testPrint<Group4MatrixAlias>();
}

0 comments on commit 45e9f7b

Please sign in to comment.