diff --git a/src/UnitTests/Matrices/BinarySparseMatrixTest.hpp b/src/UnitTests/Matrices/BinarySparseMatrixTest.hpp index 3d177597296819987ec170e67253202b69d6a220..8b3d8f8333439dda85061c5673a8dcc00dd5d570 100644 --- a/src/UnitTests/Matrices/BinarySparseMatrixTest.hpp +++ b/src/UnitTests/Matrices/BinarySparseMatrixTest.hpp @@ -13,11 +13,7 @@ #include <TNL/Math.h> #include <TNL/Algorithms/ParallelFor.h> #include <iostream> - -// Temporary, until test_OperatorEquals doesn't work for all formats. -#include <TNL/Matrices/Legacy/ChunkedEllpack.h> -#include <TNL/Matrices/Legacy/AdEllpack.h> -#include <TNL/Matrices/Legacy/BiEllpack.h> +#include <sstream> #ifdef HAVE_GTEST #include <gtest/gtest.h> @@ -25,92 +21,93 @@ template< typename MatrixHostFloat, typename MatrixHostInt > void host_test_GetType() { - bool testRan = false; - EXPECT_TRUE( testRan ); - std::cout << "\nTEST DID NOT RUN. NOT WORKING.\n\n"; - std::cerr << "This test has not been implemented properly yet.\n" << std::endl; + bool testRan = false; + EXPECT_TRUE( testRan ); + std::cout << "\nTEST DID NOT RUN. NOT WORKING.\n\n"; + std::cerr << "This test has not been implemented properly yet.\n" << std::endl; } template< typename MatrixCudaFloat, typename MatrixCudaInt > void cuda_test_GetType() { - bool testRan = false; - EXPECT_TRUE( testRan ); - std::cout << "\nTEST DID NOT RUN. NOT WORKING.\n\n"; - std::cerr << "This test has not been implemented properly yet.\n" << std::endl; + bool testRan = false; + EXPECT_TRUE( testRan ); + std::cout << "\nTEST DID NOT RUN. NOT WORKING.\n\n"; + std::cerr << "This test has not been implemented properly yet.\n" << std::endl; } template< typename Matrix > void test_SetDimensions() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; - const IndexType rows = 9; - const IndexType cols = 8; + const IndexType rows = 9; + const IndexType cols = 8; - Matrix m; - m.setDimensions( rows, cols ); + Matrix m; + m.setDimensions( rows, cols ); + + EXPECT_EQ( m.getRows(), 9 ); + EXPECT_EQ( m.getColumns(), 8 ); - EXPECT_EQ( m.getRows(), 9 ); - EXPECT_EQ( m.getColumns(), 8 ); + Matrix m2( rows, cols ); + EXPECT_EQ( m2.getRows(), 9 ); + EXPECT_EQ( m2.getColumns(), 8 ); } template< typename Matrix > void test_SetCompressedRowLengths() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - - const IndexType rows = 10; - const IndexType cols = 11; + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; - Matrix m; - m.reset(); - m.setDimensions( rows, cols ); - typename Matrix::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( rows ); - rowLengths.setValue( 3 ); + const IndexType rows = 10; + const IndexType cols = 11; - IndexType rowLength = 1; - for( IndexType i = 2; i < rows; i++ ) - rowLengths.setElement( i, rowLength++ ); + Matrix m( rows, cols ); + typename Matrix::CompressedRowLengthsVector rowLengths; + rowLengths.setSize( rows ); + rowLengths.setValue( 3 ); - m.setCompressedRowLengths( rowLengths ); + IndexType rowLength = 1; + for( IndexType i = 2; i < rows; i++ ) + rowLengths.setElement( i, rowLength++ ); - // Insert values into the rows. + m.setCompressedRowLengths( rowLengths ); - for( IndexType i = 0; i < 3; i++ ) // 0th row - m.setElement( 0, i, 1 ); + // Insert values into the rows. + for( IndexType i = 0; i < 3; i++ ) // 0th row + m.setElement( 0, i, 1 ); - for( IndexType i = 0; i < 3; i++ ) // 1st row - m.setElement( 1, i, 1 ); + for( IndexType i = 0; i < 3; i++ ) // 1st row + m.setElement( 1, i, 1 ); - for( IndexType i = 0; i < 1; i++ ) // 2nd row - m.setElement( 2, i, 1 ); + for( IndexType i = 0; i < 1; i++ ) // 2nd row + m.setElement( 2, i, 1 ); - for( IndexType i = 0; i < 2; i++ ) // 3rd row - m.setElement( 3, i, 1 ); + for( IndexType i = 0; i < 2; i++ ) // 3rd row + m.setElement( 3, i, 1 ); - for( IndexType i = 0; i < 3; i++ ) // 4th row - m.setElement( 4, i, 1 ); + for( IndexType i = 0; i < 3; i++ ) // 4th row + m.setElement( 4, i, 1 ); - for( IndexType i = 0; i < 4; i++ ) // 5th row - m.setElement( 5, i, 1 ); + for( IndexType i = 0; i < 4; i++ ) // 5th row + m.setElement( 5, i, 1 ); - for( IndexType i = 0; i < 5; i++ ) // 6th row - m.setElement( 6, i, 1 ); + for( IndexType i = 0; i < 5; i++ ) // 6th row + m.setElement( 6, i, 1 ); - for( IndexType i = 0; i < 6; i++ ) // 7th row - m.setElement( 7, i, 1 ); + for( IndexType i = 0; i < 6; i++ ) // 7th row + m.setElement( 7, i, 1 ); - for( IndexType i = 0; i < 7; i++ ) // 8th row - m.setElement( 8, i, 1 ); + for( IndexType i = 0; i < 7; i++ ) // 8th row + m.setElement( 8, i, 1 ); - for( IndexType i = 0; i < 8; i++ ) // 9th row - m.setElement( 9, i, 1 ); + for( IndexType i = 0; i < 8; i++ ) // 9th row + m.setElement( 9, i, 1 ); rowLengths = 0; m.getCompressedRowLengths( rowLengths ); @@ -121,26 +118,20 @@ void test_SetCompressedRowLengths() template< typename Matrix1, typename Matrix2 > void test_SetLike() { - using RealType = typename Matrix1::RealType; - using DeviceType = typename Matrix1::DeviceType; - using IndexType = typename Matrix1::IndexType; - - const IndexType rows = 8; - const IndexType cols = 7; - - Matrix1 m1; - m1.reset(); - m1.setDimensions( rows + 1, cols + 2 ); + using RealType = typename Matrix1::RealType; + using DeviceType = typename Matrix1::DeviceType; + using IndexType = typename Matrix1::IndexType; - Matrix2 m2; - m2.reset(); - m2.setDimensions( rows, cols ); + const IndexType rows = 8; + const IndexType cols = 7; - m1.setLike( m2 ); + Matrix1 m1( rows + 1, cols + 2 ); + Matrix2 m2( rows, cols ); + m1.setLike( m2 ); - EXPECT_EQ( m1.getRows(), m2.getRows() ); - EXPECT_EQ( m1.getColumns(), m2.getColumns() ); + EXPECT_EQ( m1.getRows(), m2.getRows() ); + EXPECT_EQ( m1.getColumns(), m2.getColumns() ); } template< typename Matrix > @@ -168,10 +159,7 @@ void test_GetNumberOfNonzeroMatrixElements() const IndexType rows = 10; const IndexType cols = 10; - Matrix m; - m.reset(); - - m.setDimensions( rows, cols ); + Matrix m( rows, cols ); typename Matrix::CompressedRowLengthsVector rowLengths; rowLengths.setSize( rows ); @@ -180,9 +168,8 @@ void test_GetNumberOfNonzeroMatrixElements() rowLengths.setElement( 2, 1 ); rowLengths.setElement( 3, 1 ); for( IndexType i = 4; i < rows - 2; i++ ) - { rowLengths.setElement( i, 1 ); - } + rowLengths.setElement( 8, 1 ); rowLengths.setElement( 9, 1 ); m.setCompressedRowLengths( rowLengths ); @@ -203,10 +190,8 @@ void test_GetNumberOfNonzeroMatrixElements() m.setElement( i, 0, 1 ); for( IndexType j = 8; j < rows; j++) - { for( IndexType i = 0; i < cols; i++ ) m.setElement( j, i, 1 ); - } EXPECT_EQ( m.getNumberOfNonzeroMatrixElements(), 41 ); } @@ -214,405 +199,395 @@ void test_GetNumberOfNonzeroMatrixElements() template< typename Matrix > void test_Reset() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - -/* - * Sets up the following 5x4 sparse matrix: - * - * / 0 0 0 0 \ - * | 0 0 0 0 | - * | 0 0 0 0 | - * | 0 0 0 0 | - * \ 0 0 0 0 / - */ - - const IndexType rows = 5; - const IndexType cols = 4; + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; - Matrix m; - m.setDimensions( rows, cols ); + /* + * Sets up the following 5x4 sparse matrix: + * + * / 0 0 0 0 \ + * | 0 0 0 0 | + * | 0 0 0 0 | + * | 0 0 0 0 | + * \ 0 0 0 0 / + */ - m.reset(); + const IndexType rows = 5; + const IndexType cols = 4; + Matrix m( rows, cols ); + m.reset(); - EXPECT_EQ( m.getRows(), 0 ); - EXPECT_EQ( m.getColumns(), 0 ); + EXPECT_EQ( m.getRows(), 0 ); + EXPECT_EQ( m.getColumns(), 0 ); } template< typename Matrix > void test_GetRow() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - -/* - * Sets up the following 10x10 sparse matrix: - * - * / 1 0 1 0 1 0 1 0 0 0 \ - * | 1 1 1 0 0 0 0 0 0 0 | - * | 1 1 1 1 1 1 1 1 0 0 | - * | 1 1 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 1 1 1 1 1 1 1 1 1 | - * \ 1 1 1 1 1 1 1 1 1 1 / - */ - - const IndexType rows = 10; - const IndexType cols = 10; - - Matrix m( rows, cols ); - - typename Matrix::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( rows ); - rowLengths.setElement( 0, 4 ); - rowLengths.setElement( 1, 3 ); - rowLengths.setElement( 2, 8 ); - rowLengths.setElement( 3, 2 ); - for( IndexType i = 4; i < rows - 2; i++ ) - { - rowLengths.setElement( i, 1 ); - } - rowLengths.setElement( 8, 10 ); - rowLengths.setElement( 9, 10 ); - m.setCompressedRowLengths( rowLengths ); - - auto matrixView = m.getView(); - auto f = [=] __cuda_callable__ ( const IndexType rowIdx ) mutable { - auto row = matrixView.getRow( rowIdx ); - switch( rowIdx ) - { - case 0: - for( IndexType i = 0; i < 4; i++ ) - row.setElement( i, 2 * i, 1 ); - break; - case 1: - for( IndexType i = 0; i < 3; i++ ) - row.setElement( i, i, 1 ); - break; - case 2: - for( IndexType i = 0; i < 8; i++ ) + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; + + /* + * Sets up the following 10x10 sparse matrix: + * + * / 1 0 1 0 1 0 1 0 0 0 \ + * | 1 1 1 0 0 0 0 0 0 0 | + * | 1 1 1 1 1 1 1 1 0 0 | + * | 1 1 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 1 1 1 1 1 1 1 1 1 | + * \ 1 1 1 1 1 1 1 1 1 1 / + */ + + const IndexType rows = 10; + const IndexType cols = 10; + + Matrix m( rows, cols ); + + typename Matrix::CompressedRowLengthsVector rowLengths; + rowLengths.setSize( rows ); + rowLengths.setElement( 0, 4 ); + rowLengths.setElement( 1, 3 ); + rowLengths.setElement( 2, 8 ); + rowLengths.setElement( 3, 2 ); + for( IndexType i = 4; i < rows - 2; i++ ) + rowLengths.setElement( i, 1 ); + + rowLengths.setElement( 8, 10 ); + rowLengths.setElement( 9, 10 ); + m.setCompressedRowLengths( rowLengths ); + + auto matrixView = m.getView(); + auto f = [=] __cuda_callable__ ( const IndexType rowIdx ) mutable { + auto row = matrixView.getRow( rowIdx ); + switch( rowIdx ) + { + case 0: + for( IndexType i = 0; i < 4; i++ ) + row.setElement( i, 2 * i, 1 ); + break; + case 1: + for( IndexType i = 0; i < 3; i++ ) + row.setElement( i, i, 1 ); + break; + case 2: + for( IndexType i = 0; i < 8; i++ ) + row.setElement( i, i, 1 ); + break; + case 3: + for( IndexType i = 0; i < 2; i++ ) + row.setElement( i, i, 1 ); + break; + case 4: + row.setElement( 0, 0, 1 ); + break; + case 5: + row.setElement( 0, 0, 1 ); + break; + case 6: + row.setElement( 0, 0, 1 ); + break; + case 7: + row.setElement( 0, 0, 1 ); + break; + case 8: + for( IndexType i = 0; i < rows; i++ ) row.setElement( i, i, 1 ); break; - case 3: - for( IndexType i = 0; i < 2; i++ ) + case 9: + for( IndexType i = 0; i < rows; i++ ) row.setElement( i, i, 1 ); break; - case 4: - row.setElement( 0, 0, 1 ); - break; - case 5: - row.setElement( 0, 0, 1 ); - break; - case 6: - row.setElement( 0, 0, 1 ); - break; - case 7: - row.setElement( 0, 0, 1 ); - break; - case 8: - for( IndexType i = 0; i < rows; i++ ) - row.setElement( i, i, 1 ); - break; - case 9: - for( IndexType i = 0; i < rows; i++ ) - row.setElement( i, i, 1 ); - break; - } - }; - TNL::Algorithms::ParallelFor< DeviceType >::exec( ( IndexType ) 0, rows, f ); - - EXPECT_EQ( m.getElement( 0, 0 ), 1 ); - EXPECT_EQ( m.getElement( 0, 1 ), 0 ); - EXPECT_EQ( m.getElement( 0, 2 ), 1 ); - EXPECT_EQ( m.getElement( 0, 3 ), 0 ); - EXPECT_EQ( m.getElement( 0, 4 ), 1 ); - EXPECT_EQ( m.getElement( 0, 5 ), 0 ); - EXPECT_EQ( m.getElement( 0, 6 ), 1 ); - EXPECT_EQ( m.getElement( 0, 7 ), 0 ); - EXPECT_EQ( m.getElement( 0, 8 ), 0 ); - EXPECT_EQ( m.getElement( 0, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 1, 0 ), 1 ); - EXPECT_EQ( m.getElement( 1, 1 ), 1 ); - EXPECT_EQ( m.getElement( 1, 2 ), 1 ); - EXPECT_EQ( m.getElement( 1, 3 ), 0 ); - EXPECT_EQ( m.getElement( 1, 4 ), 0 ); - EXPECT_EQ( m.getElement( 1, 5 ), 0 ); - EXPECT_EQ( m.getElement( 1, 6 ), 0 ); - EXPECT_EQ( m.getElement( 1, 7 ), 0 ); - EXPECT_EQ( m.getElement( 1, 8 ), 0 ); - EXPECT_EQ( m.getElement( 1, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 2, 0 ), 1 ); - EXPECT_EQ( m.getElement( 2, 1 ), 1 ); - EXPECT_EQ( m.getElement( 2, 2 ), 1 ); - EXPECT_EQ( m.getElement( 2, 3 ), 1 ); - EXPECT_EQ( m.getElement( 2, 4 ), 1 ); - EXPECT_EQ( m.getElement( 2, 5 ), 1 ); - EXPECT_EQ( m.getElement( 2, 6 ), 1 ); - EXPECT_EQ( m.getElement( 2, 7 ), 1 ); - EXPECT_EQ( m.getElement( 2, 8 ), 0 ); - EXPECT_EQ( m.getElement( 2, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 3, 0 ), 1 ); - EXPECT_EQ( m.getElement( 3, 1 ), 1 ); - EXPECT_EQ( m.getElement( 3, 2 ), 0 ); - EXPECT_EQ( m.getElement( 3, 3 ), 0 ); - EXPECT_EQ( m.getElement( 3, 4 ), 0 ); - EXPECT_EQ( m.getElement( 3, 5 ), 0 ); - EXPECT_EQ( m.getElement( 3, 6 ), 0 ); - EXPECT_EQ( m.getElement( 3, 7 ), 0 ); - EXPECT_EQ( m.getElement( 3, 8 ), 0 ); - EXPECT_EQ( m.getElement( 3, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 4, 0 ), 1 ); - EXPECT_EQ( m.getElement( 4, 1 ), 0 ); - EXPECT_EQ( m.getElement( 4, 2 ), 0 ); - EXPECT_EQ( m.getElement( 4, 3 ), 0 ); - EXPECT_EQ( m.getElement( 4, 4 ), 0 ); - EXPECT_EQ( m.getElement( 4, 5 ), 0 ); - EXPECT_EQ( m.getElement( 4, 6 ), 0 ); - EXPECT_EQ( m.getElement( 4, 7 ), 0 ); - EXPECT_EQ( m.getElement( 4, 8 ), 0 ); - EXPECT_EQ( m.getElement( 4, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 5, 0 ), 1 ); - EXPECT_EQ( m.getElement( 5, 1 ), 0 ); - EXPECT_EQ( m.getElement( 5, 2 ), 0 ); - EXPECT_EQ( m.getElement( 5, 3 ), 0 ); - EXPECT_EQ( m.getElement( 5, 4 ), 0 ); - EXPECT_EQ( m.getElement( 5, 5 ), 0 ); - EXPECT_EQ( m.getElement( 5, 6 ), 0 ); - EXPECT_EQ( m.getElement( 5, 7 ), 0 ); - EXPECT_EQ( m.getElement( 5, 8 ), 0 ); - EXPECT_EQ( m.getElement( 5, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 6, 0 ), 1 ); - EXPECT_EQ( m.getElement( 6, 1 ), 0 ); - EXPECT_EQ( m.getElement( 6, 2 ), 0 ); - EXPECT_EQ( m.getElement( 6, 3 ), 0 ); - EXPECT_EQ( m.getElement( 6, 4 ), 0 ); - EXPECT_EQ( m.getElement( 6, 5 ), 0 ); - EXPECT_EQ( m.getElement( 6, 6 ), 0 ); - EXPECT_EQ( m.getElement( 6, 7 ), 0 ); - EXPECT_EQ( m.getElement( 6, 8 ), 0 ); - EXPECT_EQ( m.getElement( 6, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 7, 0 ), 1 ); - EXPECT_EQ( m.getElement( 7, 1 ), 0 ); - EXPECT_EQ( m.getElement( 7, 2 ), 0 ); - EXPECT_EQ( m.getElement( 7, 3 ), 0 ); - EXPECT_EQ( m.getElement( 7, 4 ), 0 ); - EXPECT_EQ( m.getElement( 7, 5 ), 0 ); - EXPECT_EQ( m.getElement( 7, 6 ), 0 ); - EXPECT_EQ( m.getElement( 7, 7 ), 0 ); - EXPECT_EQ( m.getElement( 7, 8 ), 0 ); - EXPECT_EQ( m.getElement( 7, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 8, 0 ), 1 ); - EXPECT_EQ( m.getElement( 8, 1 ), 1 ); - EXPECT_EQ( m.getElement( 8, 2 ), 1 ); - EXPECT_EQ( m.getElement( 8, 3 ), 1 ); - EXPECT_EQ( m.getElement( 8, 4 ), 1 ); - EXPECT_EQ( m.getElement( 8, 5 ), 1 ); - EXPECT_EQ( m.getElement( 8, 6 ), 1 ); - EXPECT_EQ( m.getElement( 8, 7 ), 1 ); - EXPECT_EQ( m.getElement( 8, 8 ), 1 ); - EXPECT_EQ( m.getElement( 8, 9 ), 1 ); - - EXPECT_EQ( m.getElement( 9, 0 ), 1 ); - EXPECT_EQ( m.getElement( 9, 1 ), 1 ); - EXPECT_EQ( m.getElement( 9, 2 ), 1 ); - EXPECT_EQ( m.getElement( 9, 3 ), 1 ); - EXPECT_EQ( m.getElement( 9, 4 ), 1 ); - EXPECT_EQ( m.getElement( 9, 5 ), 1 ); - EXPECT_EQ( m.getElement( 9, 6 ), 1 ); - EXPECT_EQ( m.getElement( 9, 7 ), 1 ); - EXPECT_EQ( m.getElement( 9, 8 ), 1 ); - EXPECT_EQ( m.getElement( 9, 9 ), 1 ); + } + }; + TNL::Algorithms::ParallelFor< DeviceType >::exec( ( IndexType ) 0, rows, f ); + + EXPECT_EQ( m.getElement( 0, 0 ), 1 ); + EXPECT_EQ( m.getElement( 0, 1 ), 0 ); + EXPECT_EQ( m.getElement( 0, 2 ), 1 ); + EXPECT_EQ( m.getElement( 0, 3 ), 0 ); + EXPECT_EQ( m.getElement( 0, 4 ), 1 ); + EXPECT_EQ( m.getElement( 0, 5 ), 0 ); + EXPECT_EQ( m.getElement( 0, 6 ), 1 ); + EXPECT_EQ( m.getElement( 0, 7 ), 0 ); + EXPECT_EQ( m.getElement( 0, 8 ), 0 ); + EXPECT_EQ( m.getElement( 0, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 1, 0 ), 1 ); + EXPECT_EQ( m.getElement( 1, 1 ), 1 ); + EXPECT_EQ( m.getElement( 1, 2 ), 1 ); + EXPECT_EQ( m.getElement( 1, 3 ), 0 ); + EXPECT_EQ( m.getElement( 1, 4 ), 0 ); + EXPECT_EQ( m.getElement( 1, 5 ), 0 ); + EXPECT_EQ( m.getElement( 1, 6 ), 0 ); + EXPECT_EQ( m.getElement( 1, 7 ), 0 ); + EXPECT_EQ( m.getElement( 1, 8 ), 0 ); + EXPECT_EQ( m.getElement( 1, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 2, 0 ), 1 ); + EXPECT_EQ( m.getElement( 2, 1 ), 1 ); + EXPECT_EQ( m.getElement( 2, 2 ), 1 ); + EXPECT_EQ( m.getElement( 2, 3 ), 1 ); + EXPECT_EQ( m.getElement( 2, 4 ), 1 ); + EXPECT_EQ( m.getElement( 2, 5 ), 1 ); + EXPECT_EQ( m.getElement( 2, 6 ), 1 ); + EXPECT_EQ( m.getElement( 2, 7 ), 1 ); + EXPECT_EQ( m.getElement( 2, 8 ), 0 ); + EXPECT_EQ( m.getElement( 2, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 3, 0 ), 1 ); + EXPECT_EQ( m.getElement( 3, 1 ), 1 ); + EXPECT_EQ( m.getElement( 3, 2 ), 0 ); + EXPECT_EQ( m.getElement( 3, 3 ), 0 ); + EXPECT_EQ( m.getElement( 3, 4 ), 0 ); + EXPECT_EQ( m.getElement( 3, 5 ), 0 ); + EXPECT_EQ( m.getElement( 3, 6 ), 0 ); + EXPECT_EQ( m.getElement( 3, 7 ), 0 ); + EXPECT_EQ( m.getElement( 3, 8 ), 0 ); + EXPECT_EQ( m.getElement( 3, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 4, 0 ), 1 ); + EXPECT_EQ( m.getElement( 4, 1 ), 0 ); + EXPECT_EQ( m.getElement( 4, 2 ), 0 ); + EXPECT_EQ( m.getElement( 4, 3 ), 0 ); + EXPECT_EQ( m.getElement( 4, 4 ), 0 ); + EXPECT_EQ( m.getElement( 4, 5 ), 0 ); + EXPECT_EQ( m.getElement( 4, 6 ), 0 ); + EXPECT_EQ( m.getElement( 4, 7 ), 0 ); + EXPECT_EQ( m.getElement( 4, 8 ), 0 ); + EXPECT_EQ( m.getElement( 4, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 5, 0 ), 1 ); + EXPECT_EQ( m.getElement( 5, 1 ), 0 ); + EXPECT_EQ( m.getElement( 5, 2 ), 0 ); + EXPECT_EQ( m.getElement( 5, 3 ), 0 ); + EXPECT_EQ( m.getElement( 5, 4 ), 0 ); + EXPECT_EQ( m.getElement( 5, 5 ), 0 ); + EXPECT_EQ( m.getElement( 5, 6 ), 0 ); + EXPECT_EQ( m.getElement( 5, 7 ), 0 ); + EXPECT_EQ( m.getElement( 5, 8 ), 0 ); + EXPECT_EQ( m.getElement( 5, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 6, 0 ), 1 ); + EXPECT_EQ( m.getElement( 6, 1 ), 0 ); + EXPECT_EQ( m.getElement( 6, 2 ), 0 ); + EXPECT_EQ( m.getElement( 6, 3 ), 0 ); + EXPECT_EQ( m.getElement( 6, 4 ), 0 ); + EXPECT_EQ( m.getElement( 6, 5 ), 0 ); + EXPECT_EQ( m.getElement( 6, 6 ), 0 ); + EXPECT_EQ( m.getElement( 6, 7 ), 0 ); + EXPECT_EQ( m.getElement( 6, 8 ), 0 ); + EXPECT_EQ( m.getElement( 6, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 7, 0 ), 1 ); + EXPECT_EQ( m.getElement( 7, 1 ), 0 ); + EXPECT_EQ( m.getElement( 7, 2 ), 0 ); + EXPECT_EQ( m.getElement( 7, 3 ), 0 ); + EXPECT_EQ( m.getElement( 7, 4 ), 0 ); + EXPECT_EQ( m.getElement( 7, 5 ), 0 ); + EXPECT_EQ( m.getElement( 7, 6 ), 0 ); + EXPECT_EQ( m.getElement( 7, 7 ), 0 ); + EXPECT_EQ( m.getElement( 7, 8 ), 0 ); + EXPECT_EQ( m.getElement( 7, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 8, 0 ), 1 ); + EXPECT_EQ( m.getElement( 8, 1 ), 1 ); + EXPECT_EQ( m.getElement( 8, 2 ), 1 ); + EXPECT_EQ( m.getElement( 8, 3 ), 1 ); + EXPECT_EQ( m.getElement( 8, 4 ), 1 ); + EXPECT_EQ( m.getElement( 8, 5 ), 1 ); + EXPECT_EQ( m.getElement( 8, 6 ), 1 ); + EXPECT_EQ( m.getElement( 8, 7 ), 1 ); + EXPECT_EQ( m.getElement( 8, 8 ), 1 ); + EXPECT_EQ( m.getElement( 8, 9 ), 1 ); + + EXPECT_EQ( m.getElement( 9, 0 ), 1 ); + EXPECT_EQ( m.getElement( 9, 1 ), 1 ); + EXPECT_EQ( m.getElement( 9, 2 ), 1 ); + EXPECT_EQ( m.getElement( 9, 3 ), 1 ); + EXPECT_EQ( m.getElement( 9, 4 ), 1 ); + EXPECT_EQ( m.getElement( 9, 5 ), 1 ); + EXPECT_EQ( m.getElement( 9, 6 ), 1 ); + EXPECT_EQ( m.getElement( 9, 7 ), 1 ); + EXPECT_EQ( m.getElement( 9, 8 ), 1 ); + EXPECT_EQ( m.getElement( 9, 9 ), 1 ); } template< typename Matrix > void test_SetElement() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - -/* - * Sets up the following 10x10 sparse matrix: - * - * / 1 0 1 0 1 0 1 0 0 0 \ - * | 1 1 1 0 0 0 0 0 0 0 | - * | 1 1 1 1 1 1 1 1 0 0 | - * | 1 1 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 0 0 0 0 0 0 0 0 0 | - * | 1 1 1 1 1 1 1 1 1 1 | - * \ 1 1 1 1 1 1 1 1 1 1 / - */ - - const IndexType rows = 10; - const IndexType cols = 10; - - Matrix m; - m.reset(); - - m.setDimensions( rows, cols ); - - typename Matrix::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( rows ); - rowLengths.setElement( 0, 4 ); - rowLengths.setElement( 1, 3 ); - rowLengths.setElement( 2, 8 ); - rowLengths.setElement( 3, 2 ); - for( IndexType i = 4; i < rows - 2; i++ ) - { - rowLengths.setElement( i, 1 ); - } - rowLengths.setElement( 8, 10 ); - rowLengths.setElement( 9, 10 ); - m.setCompressedRowLengths( rowLengths ); - - for( IndexType i = 0; i < 4; i++ ) - m.setElement( 0, 2 * i, 1 ); - - for( IndexType i = 0; i < 3; i++ ) - m.setElement( 1, i, 1 ); - - for( IndexType i = 0; i < 8; i++ ) - m.setElement( 2, i, 1 ); - - for( IndexType i = 0; i < 2; i++ ) - m.setElement( 3, i, 1 ); - - for( IndexType i = 4; i < 8; i++ ) - m.setElement( i, 0, 1 ); - - for( IndexType j = 8; j < rows; j++) - { - for( IndexType i = 0; i < cols; i++ ) - m.setElement( j, i, 1 ); - } - - EXPECT_EQ( m.getElement( 0, 0 ), 1 ); - EXPECT_EQ( m.getElement( 0, 1 ), 0 ); - EXPECT_EQ( m.getElement( 0, 2 ), 1 ); - EXPECT_EQ( m.getElement( 0, 3 ), 0 ); - EXPECT_EQ( m.getElement( 0, 4 ), 1 ); - EXPECT_EQ( m.getElement( 0, 5 ), 0 ); - EXPECT_EQ( m.getElement( 0, 6 ), 1 ); - EXPECT_EQ( m.getElement( 0, 7 ), 0 ); - EXPECT_EQ( m.getElement( 0, 8 ), 0 ); - EXPECT_EQ( m.getElement( 0, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 1, 0 ), 1 ); - EXPECT_EQ( m.getElement( 1, 1 ), 1 ); - EXPECT_EQ( m.getElement( 1, 2 ), 1 ); - EXPECT_EQ( m.getElement( 1, 3 ), 0 ); - EXPECT_EQ( m.getElement( 1, 4 ), 0 ); - EXPECT_EQ( m.getElement( 1, 5 ), 0 ); - EXPECT_EQ( m.getElement( 1, 6 ), 0 ); - EXPECT_EQ( m.getElement( 1, 7 ), 0 ); - EXPECT_EQ( m.getElement( 1, 8 ), 0 ); - EXPECT_EQ( m.getElement( 1, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 2, 0 ), 1 ); - EXPECT_EQ( m.getElement( 2, 1 ), 1 ); - EXPECT_EQ( m.getElement( 2, 2 ), 1 ); - EXPECT_EQ( m.getElement( 2, 3 ), 1 ); - EXPECT_EQ( m.getElement( 2, 4 ), 1 ); - EXPECT_EQ( m.getElement( 2, 5 ), 1 ); - EXPECT_EQ( m.getElement( 2, 6 ), 1 ); - EXPECT_EQ( m.getElement( 2, 7 ), 1 ); - EXPECT_EQ( m.getElement( 2, 8 ), 0 ); - EXPECT_EQ( m.getElement( 2, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 3, 0 ), 1 ); - EXPECT_EQ( m.getElement( 3, 1 ), 1 ); - EXPECT_EQ( m.getElement( 3, 2 ), 0 ); - EXPECT_EQ( m.getElement( 3, 3 ), 0 ); - EXPECT_EQ( m.getElement( 3, 4 ), 0 ); - EXPECT_EQ( m.getElement( 3, 5 ), 0 ); - EXPECT_EQ( m.getElement( 3, 6 ), 0 ); - EXPECT_EQ( m.getElement( 3, 7 ), 0 ); - EXPECT_EQ( m.getElement( 3, 8 ), 0 ); - EXPECT_EQ( m.getElement( 3, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 4, 0 ), 1 ); - EXPECT_EQ( m.getElement( 4, 1 ), 0 ); - EXPECT_EQ( m.getElement( 4, 2 ), 0 ); - EXPECT_EQ( m.getElement( 4, 3 ), 0 ); - EXPECT_EQ( m.getElement( 4, 4 ), 0 ); - EXPECT_EQ( m.getElement( 4, 5 ), 0 ); - EXPECT_EQ( m.getElement( 4, 6 ), 0 ); - EXPECT_EQ( m.getElement( 4, 7 ), 0 ); - EXPECT_EQ( m.getElement( 4, 8 ), 0 ); - EXPECT_EQ( m.getElement( 4, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 5, 0 ), 1 ); - EXPECT_EQ( m.getElement( 5, 1 ), 0 ); - EXPECT_EQ( m.getElement( 5, 2 ), 0 ); - EXPECT_EQ( m.getElement( 5, 3 ), 0 ); - EXPECT_EQ( m.getElement( 5, 4 ), 0 ); - EXPECT_EQ( m.getElement( 5, 5 ), 0 ); - EXPECT_EQ( m.getElement( 5, 6 ), 0 ); - EXPECT_EQ( m.getElement( 5, 7 ), 0 ); - EXPECT_EQ( m.getElement( 5, 8 ), 0 ); - EXPECT_EQ( m.getElement( 5, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 6, 0 ), 1 ); - EXPECT_EQ( m.getElement( 6, 1 ), 0 ); - EXPECT_EQ( m.getElement( 6, 2 ), 0 ); - EXPECT_EQ( m.getElement( 6, 3 ), 0 ); - EXPECT_EQ( m.getElement( 6, 4 ), 0 ); - EXPECT_EQ( m.getElement( 6, 5 ), 0 ); - EXPECT_EQ( m.getElement( 6, 6 ), 0 ); - EXPECT_EQ( m.getElement( 6, 7 ), 0 ); - EXPECT_EQ( m.getElement( 6, 8 ), 0 ); - EXPECT_EQ( m.getElement( 6, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 7, 0 ), 1 ); - EXPECT_EQ( m.getElement( 7, 1 ), 0 ); - EXPECT_EQ( m.getElement( 7, 2 ), 0 ); - EXPECT_EQ( m.getElement( 7, 3 ), 0 ); - EXPECT_EQ( m.getElement( 7, 4 ), 0 ); - EXPECT_EQ( m.getElement( 7, 5 ), 0 ); - EXPECT_EQ( m.getElement( 7, 6 ), 0 ); - EXPECT_EQ( m.getElement( 7, 7 ), 0 ); - EXPECT_EQ( m.getElement( 7, 8 ), 0 ); - EXPECT_EQ( m.getElement( 7, 9 ), 0 ); - - EXPECT_EQ( m.getElement( 8, 0 ), 1 ); - EXPECT_EQ( m.getElement( 8, 1 ), 1 ); - EXPECT_EQ( m.getElement( 8, 2 ), 1 ); - EXPECT_EQ( m.getElement( 8, 3 ), 1 ); - EXPECT_EQ( m.getElement( 8, 4 ), 1 ); - EXPECT_EQ( m.getElement( 8, 5 ), 1 ); - EXPECT_EQ( m.getElement( 8, 6 ), 1 ); - EXPECT_EQ( m.getElement( 8, 7 ), 1 ); - EXPECT_EQ( m.getElement( 8, 8 ), 1 ); - EXPECT_EQ( m.getElement( 8, 9 ), 1 ); - - EXPECT_EQ( m.getElement( 9, 0 ), 1 ); - EXPECT_EQ( m.getElement( 9, 1 ), 1 ); - EXPECT_EQ( m.getElement( 9, 2 ), 1 ); - EXPECT_EQ( m.getElement( 9, 3 ), 1 ); - EXPECT_EQ( m.getElement( 9, 4 ), 1 ); - EXPECT_EQ( m.getElement( 9, 5 ), 1 ); - EXPECT_EQ( m.getElement( 9, 6 ), 1 ); - EXPECT_EQ( m.getElement( 9, 7 ), 1 ); - EXPECT_EQ( m.getElement( 9, 8 ), 1 ); - EXPECT_EQ( m.getElement( 9, 9 ), 1 ); + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; + + /* + * Sets up the following 10x10 sparse matrix: + * + * / 1 0 1 0 1 0 1 0 0 0 \ + * | 1 1 1 0 0 0 0 0 0 0 | + * | 1 1 1 1 1 1 1 1 0 0 | + * | 1 1 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 0 0 0 0 0 0 0 0 0 | + * | 1 1 1 1 1 1 1 1 1 1 | + * \ 1 1 1 1 1 1 1 1 1 1 / + */ + + const IndexType rows = 10; + const IndexType cols = 10; + + Matrix m( rows, cols ); + + typename Matrix::CompressedRowLengthsVector rowLengths; + rowLengths.setSize( rows ); + rowLengths.setElement( 0, 4 ); + rowLengths.setElement( 1, 3 ); + rowLengths.setElement( 2, 8 ); + rowLengths.setElement( 3, 2 ); + for( IndexType i = 4; i < rows - 2; i++ ) + rowLengths.setElement( i, 1 ); + + rowLengths.setElement( 8, 10 ); + rowLengths.setElement( 9, 10 ); + m.setCompressedRowLengths( rowLengths ); + + for( IndexType i = 0; i < 4; i++ ) + m.setElement( 0, 2 * i, 1 ); + + for( IndexType i = 0; i < 3; i++ ) + m.setElement( 1, i, 1 ); + + for( IndexType i = 0; i < 8; i++ ) + m.setElement( 2, i, 1 ); + + for( IndexType i = 0; i < 2; i++ ) + m.setElement( 3, i, 1 ); + + for( IndexType i = 4; i < 8; i++ ) + m.setElement( i, 0, 1 ); + + for( IndexType j = 8; j < rows; j++) + for( IndexType i = 0; i < cols; i++ ) + m.setElement( j, i, 1 ); + + EXPECT_EQ( m.getElement( 0, 0 ), 1 ); + EXPECT_EQ( m.getElement( 0, 1 ), 0 ); + EXPECT_EQ( m.getElement( 0, 2 ), 1 ); + EXPECT_EQ( m.getElement( 0, 3 ), 0 ); + EXPECT_EQ( m.getElement( 0, 4 ), 1 ); + EXPECT_EQ( m.getElement( 0, 5 ), 0 ); + EXPECT_EQ( m.getElement( 0, 6 ), 1 ); + EXPECT_EQ( m.getElement( 0, 7 ), 0 ); + EXPECT_EQ( m.getElement( 0, 8 ), 0 ); + EXPECT_EQ( m.getElement( 0, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 1, 0 ), 1 ); + EXPECT_EQ( m.getElement( 1, 1 ), 1 ); + EXPECT_EQ( m.getElement( 1, 2 ), 1 ); + EXPECT_EQ( m.getElement( 1, 3 ), 0 ); + EXPECT_EQ( m.getElement( 1, 4 ), 0 ); + EXPECT_EQ( m.getElement( 1, 5 ), 0 ); + EXPECT_EQ( m.getElement( 1, 6 ), 0 ); + EXPECT_EQ( m.getElement( 1, 7 ), 0 ); + EXPECT_EQ( m.getElement( 1, 8 ), 0 ); + EXPECT_EQ( m.getElement( 1, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 2, 0 ), 1 ); + EXPECT_EQ( m.getElement( 2, 1 ), 1 ); + EXPECT_EQ( m.getElement( 2, 2 ), 1 ); + EXPECT_EQ( m.getElement( 2, 3 ), 1 ); + EXPECT_EQ( m.getElement( 2, 4 ), 1 ); + EXPECT_EQ( m.getElement( 2, 5 ), 1 ); + EXPECT_EQ( m.getElement( 2, 6 ), 1 ); + EXPECT_EQ( m.getElement( 2, 7 ), 1 ); + EXPECT_EQ( m.getElement( 2, 8 ), 0 ); + EXPECT_EQ( m.getElement( 2, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 3, 0 ), 1 ); + EXPECT_EQ( m.getElement( 3, 1 ), 1 ); + EXPECT_EQ( m.getElement( 3, 2 ), 0 ); + EXPECT_EQ( m.getElement( 3, 3 ), 0 ); + EXPECT_EQ( m.getElement( 3, 4 ), 0 ); + EXPECT_EQ( m.getElement( 3, 5 ), 0 ); + EXPECT_EQ( m.getElement( 3, 6 ), 0 ); + EXPECT_EQ( m.getElement( 3, 7 ), 0 ); + EXPECT_EQ( m.getElement( 3, 8 ), 0 ); + EXPECT_EQ( m.getElement( 3, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 4, 0 ), 1 ); + EXPECT_EQ( m.getElement( 4, 1 ), 0 ); + EXPECT_EQ( m.getElement( 4, 2 ), 0 ); + EXPECT_EQ( m.getElement( 4, 3 ), 0 ); + EXPECT_EQ( m.getElement( 4, 4 ), 0 ); + EXPECT_EQ( m.getElement( 4, 5 ), 0 ); + EXPECT_EQ( m.getElement( 4, 6 ), 0 ); + EXPECT_EQ( m.getElement( 4, 7 ), 0 ); + EXPECT_EQ( m.getElement( 4, 8 ), 0 ); + EXPECT_EQ( m.getElement( 4, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 5, 0 ), 1 ); + EXPECT_EQ( m.getElement( 5, 1 ), 0 ); + EXPECT_EQ( m.getElement( 5, 2 ), 0 ); + EXPECT_EQ( m.getElement( 5, 3 ), 0 ); + EXPECT_EQ( m.getElement( 5, 4 ), 0 ); + EXPECT_EQ( m.getElement( 5, 5 ), 0 ); + EXPECT_EQ( m.getElement( 5, 6 ), 0 ); + EXPECT_EQ( m.getElement( 5, 7 ), 0 ); + EXPECT_EQ( m.getElement( 5, 8 ), 0 ); + EXPECT_EQ( m.getElement( 5, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 6, 0 ), 1 ); + EXPECT_EQ( m.getElement( 6, 1 ), 0 ); + EXPECT_EQ( m.getElement( 6, 2 ), 0 ); + EXPECT_EQ( m.getElement( 6, 3 ), 0 ); + EXPECT_EQ( m.getElement( 6, 4 ), 0 ); + EXPECT_EQ( m.getElement( 6, 5 ), 0 ); + EXPECT_EQ( m.getElement( 6, 6 ), 0 ); + EXPECT_EQ( m.getElement( 6, 7 ), 0 ); + EXPECT_EQ( m.getElement( 6, 8 ), 0 ); + EXPECT_EQ( m.getElement( 6, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 7, 0 ), 1 ); + EXPECT_EQ( m.getElement( 7, 1 ), 0 ); + EXPECT_EQ( m.getElement( 7, 2 ), 0 ); + EXPECT_EQ( m.getElement( 7, 3 ), 0 ); + EXPECT_EQ( m.getElement( 7, 4 ), 0 ); + EXPECT_EQ( m.getElement( 7, 5 ), 0 ); + EXPECT_EQ( m.getElement( 7, 6 ), 0 ); + EXPECT_EQ( m.getElement( 7, 7 ), 0 ); + EXPECT_EQ( m.getElement( 7, 8 ), 0 ); + EXPECT_EQ( m.getElement( 7, 9 ), 0 ); + + EXPECT_EQ( m.getElement( 8, 0 ), 1 ); + EXPECT_EQ( m.getElement( 8, 1 ), 1 ); + EXPECT_EQ( m.getElement( 8, 2 ), 1 ); + EXPECT_EQ( m.getElement( 8, 3 ), 1 ); + EXPECT_EQ( m.getElement( 8, 4 ), 1 ); + EXPECT_EQ( m.getElement( 8, 5 ), 1 ); + EXPECT_EQ( m.getElement( 8, 6 ), 1 ); + EXPECT_EQ( m.getElement( 8, 7 ), 1 ); + EXPECT_EQ( m.getElement( 8, 8 ), 1 ); + EXPECT_EQ( m.getElement( 8, 9 ), 1 ); + + EXPECT_EQ( m.getElement( 9, 0 ), 1 ); + EXPECT_EQ( m.getElement( 9, 1 ), 1 ); + EXPECT_EQ( m.getElement( 9, 2 ), 1 ); + EXPECT_EQ( m.getElement( 9, 3 ), 1 ); + EXPECT_EQ( m.getElement( 9, 4 ), 1 ); + EXPECT_EQ( m.getElement( 9, 5 ), 1 ); + EXPECT_EQ( m.getElement( 9, 6 ), 1 ); + EXPECT_EQ( m.getElement( 9, 7 ), 1 ); + EXPECT_EQ( m.getElement( 9, 8 ), 1 ); + EXPECT_EQ( m.getElement( 9, 9 ), 1 ); } template< typename Matrix > @@ -648,7 +623,7 @@ void test_VectorProduct() m_1.setElement( 1, 1, 1 ); // 1st row m_1.setElement( 1, 3, 1 ); - + m_1.setElement( 2, 1, 1 ); // 2nd row m_1.setElement( 3, 2, 1 ); // 3rd row @@ -690,12 +665,12 @@ void test_VectorProduct() for( IndexType i = 0; i < 3; i++ ) // 0th row m_2.setElement( 0, i, 1 ); - m_2.setElement( 1, 3, 1 ); // 1st row + m_2.setElement( 1, 3, 1 ); // 1st row for( IndexType i = 0; i < 3; i++ ) // 2nd row m_2.setElement( 2, i, 1 ); - for( IndexType i = 1; i < 2; i++ ) // 3rd row + for( IndexType i = 1; i < 2; i++ ) // 3rd row m_2.setElement( 3, i, 1 ); VectorType inVector_2( m_cols_2 ); @@ -706,13 +681,11 @@ void test_VectorProduct() m_2.vectorProduct( inVector_2, outVector_2 ); - EXPECT_EQ( outVector_2.getElement( 0 ), 6 ); EXPECT_EQ( outVector_2.getElement( 1 ), 2 ); EXPECT_EQ( outVector_2.getElement( 2 ), 6 ); EXPECT_EQ( outVector_2.getElement( 3 ), 2 ); - /* * Sets up the following 4x4 sparse matrix: * @@ -943,32 +916,32 @@ void test_RowsReduction() for( IndexType i = 0; i < 3; i++ ) // 0th row m.setElement( 0, i, 1 ); - m.setElement( 0, 4, 1 ); // 0th row + m.setElement( 0, 4, 1 ); // 0th row m.setElement( 0, 5, 1 ); - m.setElement( 1, 1, 1 ); // 1st row + m.setElement( 1, 1, 1 ); // 1st row m.setElement( 1, 3, 1 ); - for( IndexType i = 1; i < 3; i++ ) // 2nd row + for( IndexType i = 1; i < 3; i++ ) // 2nd row m.setElement( 2, i, 1 ); - m.setElement( 2, 4, 1 ); // 2nd row + m.setElement( 2, 4, 1 ); // 2nd row - for( IndexType i = 1; i < 5; i++ ) // 3rd row + for( IndexType i = 1; i < 5; i++ ) // 3rd row m.setElement( 3, i, 1 ); - m.setElement( 4, 1, 1 ); // 4th row + m.setElement( 4, 1, 1 ); // 4th row - for( IndexType i = 1; i < 7; i++ ) // 5th row + for( IndexType i = 1; i < 7; i++ ) // 5th row m.setElement( 5, i, 1 ); - for( IndexType i = 0; i < 7; i++ ) // 6th row + for( IndexType i = 0; i < 7; i++ ) // 6th row m.setElement( 6, i, 1 ); - for( IndexType i = 0; i < 8; i++ ) // 7th row + for( IndexType i = 0; i < 8; i++ ) // 7th row m.setElement( 7, i, 1 ); - for( IndexType i = 0; i < 7; i++ ) // 1s at the end of rows + for( IndexType i = 0; i < 7; i++ ) // 1s at the end of rows m.setElement( i, 7, 1); //// @@ -1085,268 +1058,6 @@ void test_PerformSORIteration() EXPECT_EQ( xVector[ 3 ], 0.25 ); } -// This test is only for AdEllpack -template< typename Matrix > -void test_OperatorEquals() -{ - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - - if( std::is_same< DeviceType, TNL::Devices::Cuda >::value ) - return; - else - { - using AdELL_host = TNL::Matrices::AdEllpack< RealType, TNL::Devices::Host, IndexType >; - using AdELL_cuda = TNL::Matrices::AdEllpack< RealType, TNL::Devices::Cuda, IndexType >; - - /* - * Sets up the following 8x8 sparse matrix: - * - * / 1 2 3 0 4 5 0 1 \ 6 - * | 0 6 0 7 0 0 0 1 | 3 - * | 0 8 9 0 10 0 0 1 | 4 - * | 0 11 12 13 14 0 0 1 | 5 - * | 0 15 0 0 0 0 0 1 | 2 - * | 0 16 17 18 19 20 21 1 | 7 - * | 22 23 24 25 26 27 28 1 | 8 - * \ 29 30 31 32 33 34 35 36 / 8 - */ - - const IndexType m_rows = 8; - const IndexType m_cols = 8; - - AdELL_host m_host; - - m_host.reset(); - m_host.setDimensions( m_rows, m_cols ); - typename AdELL_host::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( m_rows ); - rowLengths.setElement(0, 6); - rowLengths.setElement(1, 3); - rowLengths.setElement(2, 4); - rowLengths.setElement(3, 5); - rowLengths.setElement(4, 2); - rowLengths.setElement(5, 7); - rowLengths.setElement(6, 8); - rowLengths.setElement(7, 8); - m_host.setCompressedRowLengths( rowLengths ); - - RealType value = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m_host.setElement( 0, i, value++ ); - - m_host.setElement( 0, 4, value++ ); // 0th row - m_host.setElement( 0, 5, value++ ); - - m_host.setElement( 1, 1, value++ ); // 1st row - m_host.setElement( 1, 3, value++ ); - - for( IndexType i = 1; i < 3; i++ ) // 2nd row - m_host.setElement( 2, i, value++ ); - - m_host.setElement( 2, 4, value++ ); // 2nd row - - - for( IndexType i = 1; i < 5; i++ ) // 3rd row - m_host.setElement( 3, i, value++ ); - - m_host.setElement( 4, 1, value++ ); // 4th row - - for( IndexType i = 1; i < 7; i++ ) // 5th row - m_host.setElement( 5, i, value++ ); - - for( IndexType i = 0; i < 7; i++ ) // 6th row - m_host.setElement( 6, i, value++ ); - - for( IndexType i = 0; i < 8; i++ ) // 7th row - m_host.setElement( 7, i, value++ ); - - for( IndexType i = 0; i < 7; i++ ) // 1s at the end or rows: 5, 6 - m_host.setElement( i, 7, 1); - - EXPECT_EQ( m_host.getElement( 0, 0 ), 1 ); - EXPECT_EQ( m_host.getElement( 0, 1 ), 2 ); - EXPECT_EQ( m_host.getElement( 0, 2 ), 3 ); - EXPECT_EQ( m_host.getElement( 0, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 0, 4 ), 4 ); - EXPECT_EQ( m_host.getElement( 0, 5 ), 5 ); - EXPECT_EQ( m_host.getElement( 0, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 0, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 1, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 1 ), 6 ); - EXPECT_EQ( m_host.getElement( 1, 2 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 3 ), 7 ); - EXPECT_EQ( m_host.getElement( 1, 4 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 2, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 1 ), 8 ); - EXPECT_EQ( m_host.getElement( 2, 2 ), 9 ); - EXPECT_EQ( m_host.getElement( 2, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 4 ), 10 ); - EXPECT_EQ( m_host.getElement( 2, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 3, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 1 ), 11 ); - EXPECT_EQ( m_host.getElement( 3, 2 ), 12 ); - EXPECT_EQ( m_host.getElement( 3, 3 ), 13 ); - EXPECT_EQ( m_host.getElement( 3, 4 ), 14 ); - EXPECT_EQ( m_host.getElement( 3, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 4, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 1 ), 15 ); - EXPECT_EQ( m_host.getElement( 4, 2 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 4 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 5, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 5, 1 ), 16 ); - EXPECT_EQ( m_host.getElement( 5, 2 ), 17 ); - EXPECT_EQ( m_host.getElement( 5, 3 ), 18 ); - EXPECT_EQ( m_host.getElement( 5, 4 ), 19 ); - EXPECT_EQ( m_host.getElement( 5, 5 ), 20 ); - EXPECT_EQ( m_host.getElement( 5, 6 ), 21 ); - EXPECT_EQ( m_host.getElement( 5, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 6, 0 ), 22 ); - EXPECT_EQ( m_host.getElement( 6, 1 ), 23 ); - EXPECT_EQ( m_host.getElement( 6, 2 ), 24 ); - EXPECT_EQ( m_host.getElement( 6, 3 ), 25 ); - EXPECT_EQ( m_host.getElement( 6, 4 ), 26 ); - EXPECT_EQ( m_host.getElement( 6, 5 ), 27 ); - EXPECT_EQ( m_host.getElement( 6, 6 ), 28 ); - EXPECT_EQ( m_host.getElement( 6, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 7, 0 ), 29 ); - EXPECT_EQ( m_host.getElement( 7, 1 ), 30 ); - EXPECT_EQ( m_host.getElement( 7, 2 ), 31 ); - EXPECT_EQ( m_host.getElement( 7, 3 ), 32 ); - EXPECT_EQ( m_host.getElement( 7, 4 ), 33 ); - EXPECT_EQ( m_host.getElement( 7, 5 ), 34 ); - EXPECT_EQ( m_host.getElement( 7, 6 ), 35 ); - EXPECT_EQ( m_host.getElement( 7, 7 ), 36 ); - - AdELL_cuda m_cuda; - - // Copy the host matrix into the cuda matrix - m_cuda = m_host; - - // Reset the host matrix - m_host.reset(); - - // Copy the cuda matrix back into the host matrix - m_host = m_cuda; - - // Check the newly created double-copy host matrix - EXPECT_EQ( m_host.getElement( 0, 0 ), 1 ); - EXPECT_EQ( m_host.getElement( 0, 1 ), 2 ); - EXPECT_EQ( m_host.getElement( 0, 2 ), 3 ); - EXPECT_EQ( m_host.getElement( 0, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 0, 4 ), 4 ); - EXPECT_EQ( m_host.getElement( 0, 5 ), 5 ); - EXPECT_EQ( m_host.getElement( 0, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 0, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 1, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 1 ), 6 ); - EXPECT_EQ( m_host.getElement( 1, 2 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 3 ), 7 ); - EXPECT_EQ( m_host.getElement( 1, 4 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 1, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 2, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 1 ), 8 ); - EXPECT_EQ( m_host.getElement( 2, 2 ), 9 ); - EXPECT_EQ( m_host.getElement( 2, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 4 ), 10 ); - EXPECT_EQ( m_host.getElement( 2, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 2, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 3, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 1 ), 11 ); - EXPECT_EQ( m_host.getElement( 3, 2 ), 12 ); - EXPECT_EQ( m_host.getElement( 3, 3 ), 13 ); - EXPECT_EQ( m_host.getElement( 3, 4 ), 14 ); - EXPECT_EQ( m_host.getElement( 3, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 3, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 4, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 1 ), 15 ); - EXPECT_EQ( m_host.getElement( 4, 2 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 3 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 4 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 5 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 6 ), 0 ); - EXPECT_EQ( m_host.getElement( 4, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 5, 0 ), 0 ); - EXPECT_EQ( m_host.getElement( 5, 1 ), 16 ); - EXPECT_EQ( m_host.getElement( 5, 2 ), 17 ); - EXPECT_EQ( m_host.getElement( 5, 3 ), 18 ); - EXPECT_EQ( m_host.getElement( 5, 4 ), 19 ); - EXPECT_EQ( m_host.getElement( 5, 5 ), 20 ); - EXPECT_EQ( m_host.getElement( 5, 6 ), 21 ); - EXPECT_EQ( m_host.getElement( 5, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 6, 0 ), 22 ); - EXPECT_EQ( m_host.getElement( 6, 1 ), 23 ); - EXPECT_EQ( m_host.getElement( 6, 2 ), 24 ); - EXPECT_EQ( m_host.getElement( 6, 3 ), 25 ); - EXPECT_EQ( m_host.getElement( 6, 4 ), 26 ); - EXPECT_EQ( m_host.getElement( 6, 5 ), 27 ); - EXPECT_EQ( m_host.getElement( 6, 6 ), 28 ); - EXPECT_EQ( m_host.getElement( 6, 7 ), 1 ); - - EXPECT_EQ( m_host.getElement( 7, 0 ), 29 ); - EXPECT_EQ( m_host.getElement( 7, 1 ), 30 ); - EXPECT_EQ( m_host.getElement( 7, 2 ), 31 ); - EXPECT_EQ( m_host.getElement( 7, 3 ), 32 ); - EXPECT_EQ( m_host.getElement( 7, 4 ), 33 ); - EXPECT_EQ( m_host.getElement( 7, 5 ), 34 ); - EXPECT_EQ( m_host.getElement( 7, 6 ), 35 ); - EXPECT_EQ( m_host.getElement( 7, 7 ), 36 ); - - // Try vectorProduct with copied cuda matrix to see if it works correctly. - using VectorType = TNL::Containers::Vector< RealType, TNL::Devices::Cuda, IndexType >; - - VectorType inVector; - inVector.setSize( m_cols ); - for( IndexType i = 0; i < inVector.getSize(); i++ ) - inVector.setElement( i, 2 ); - - VectorType outVector; - outVector.setSize( m_rows ); - for( IndexType j = 0; j < outVector.getSize(); j++ ) - outVector.setElement( j, 0 ); - - m_cuda.vectorProduct( inVector, outVector ); - - EXPECT_EQ( outVector.getElement( 0 ), 32 ); - EXPECT_EQ( outVector.getElement( 1 ), 28 ); - EXPECT_EQ( outVector.getElement( 2 ), 56 ); - EXPECT_EQ( outVector.getElement( 3 ), 102 ); - EXPECT_EQ( outVector.getElement( 4 ), 32 ); - EXPECT_EQ( outVector.getElement( 5 ), 224 ); - EXPECT_EQ( outVector.getElement( 6 ), 352 ); - EXPECT_EQ( outVector.getElement( 7 ), 520 ); - } -} - template< typename Matrix > void test_SaveAndLoad( const char* filename ) { @@ -1363,148 +1074,144 @@ void test_SaveAndLoad( const char* filename ) * \ 0 1 1 1 / */ - const IndexType m_rows = 4; - const IndexType m_cols = 4; + const IndexType m_rows = 4; + const IndexType m_cols = 4; - Matrix savedMatrix; - savedMatrix.reset(); - savedMatrix.setDimensions( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( m_rows ); - rowLengths.setValue( 3 ); - savedMatrix.setCompressedRowLengths( rowLengths ); + Matrix savedMatrix( m_rows, m_cols ); + typename Matrix::CompressedRowLengthsVector rowLengths; + rowLengths.setSize( m_rows ); + rowLengths.setValue( 3 ); + savedMatrix.setCompressedRowLengths( rowLengths ); - for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row - savedMatrix.setElement( 0, i, 1 ); + for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row + savedMatrix.setElement( 0, i, 1 ); - savedMatrix.setElement( 1, 1, 1 ); - savedMatrix.setElement( 1, 3, 1 ); // 1st row + savedMatrix.setElement( 1, 1, 1 ); + savedMatrix.setElement( 1, 3, 1 ); // 1st row - for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row - savedMatrix.setElement( 2, i, 1 ); + for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row + savedMatrix.setElement( 2, i, 1 ); - for( IndexType i = 1; i < m_cols; i++ ) // 3rd row - savedMatrix.setElement( 3, i, 1 ); + for( IndexType i = 1; i < m_cols; i++ ) // 3rd row + savedMatrix.setElement( 3, i, 1 ); - ASSERT_NO_THROW( savedMatrix.save( filename ) ); + ASSERT_NO_THROW( savedMatrix.save( filename ) ); - Matrix loadedMatrix; - loadedMatrix.reset(); - loadedMatrix.setDimensions( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths2; - rowLengths2.setSize( m_rows ); - rowLengths2.setValue( 3 ); - loadedMatrix.setCompressedRowLengths( rowLengths2 ); + Matrix loadedMatrix; + loadedMatrix.reset(); + loadedMatrix.setDimensions( m_rows, m_cols ); + typename Matrix::CompressedRowLengthsVector rowLengths2; + rowLengths2.setSize( m_rows ); + rowLengths2.setValue( 3 ); + loadedMatrix.setCompressedRowLengths( rowLengths2 ); - ASSERT_NO_THROW( loadedMatrix.load( filename ) ); + ASSERT_NO_THROW( loadedMatrix.load( filename ) ); - EXPECT_EQ( savedMatrix.getElement( 0, 0 ), loadedMatrix.getElement( 0, 0 ) ); - EXPECT_EQ( savedMatrix.getElement( 0, 1 ), loadedMatrix.getElement( 0, 1 ) ); - EXPECT_EQ( savedMatrix.getElement( 0, 2 ), loadedMatrix.getElement( 0, 2 ) ); - EXPECT_EQ( savedMatrix.getElement( 0, 3 ), loadedMatrix.getElement( 0, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 0, 0 ), loadedMatrix.getElement( 0, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 0, 1 ), loadedMatrix.getElement( 0, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 0, 2 ), loadedMatrix.getElement( 0, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 0, 3 ), loadedMatrix.getElement( 0, 3 ) ); - EXPECT_EQ( savedMatrix.getElement( 1, 0 ), loadedMatrix.getElement( 1, 0 ) ); - EXPECT_EQ( savedMatrix.getElement( 1, 1 ), loadedMatrix.getElement( 1, 1 ) ); - EXPECT_EQ( savedMatrix.getElement( 1, 2 ), loadedMatrix.getElement( 1, 2 ) ); - EXPECT_EQ( savedMatrix.getElement( 1, 3 ), loadedMatrix.getElement( 1, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 1, 0 ), loadedMatrix.getElement( 1, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 1, 1 ), loadedMatrix.getElement( 1, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 1, 2 ), loadedMatrix.getElement( 1, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 1, 3 ), loadedMatrix.getElement( 1, 3 ) ); - EXPECT_EQ( savedMatrix.getElement( 2, 0 ), loadedMatrix.getElement( 2, 0 ) ); - EXPECT_EQ( savedMatrix.getElement( 2, 1 ), loadedMatrix.getElement( 2, 1 ) ); - EXPECT_EQ( savedMatrix.getElement( 2, 2 ), loadedMatrix.getElement( 2, 2 ) ); - EXPECT_EQ( savedMatrix.getElement( 2, 3 ), loadedMatrix.getElement( 2, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 2, 0 ), loadedMatrix.getElement( 2, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 2, 1 ), loadedMatrix.getElement( 2, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 2, 2 ), loadedMatrix.getElement( 2, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 2, 3 ), loadedMatrix.getElement( 2, 3 ) ); - EXPECT_EQ( savedMatrix.getElement( 3, 0 ), loadedMatrix.getElement( 3, 0 ) ); - EXPECT_EQ( savedMatrix.getElement( 3, 1 ), loadedMatrix.getElement( 3, 1 ) ); - EXPECT_EQ( savedMatrix.getElement( 3, 2 ), loadedMatrix.getElement( 3, 2 ) ); - EXPECT_EQ( savedMatrix.getElement( 3, 3 ), loadedMatrix.getElement( 3, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 3, 0 ), loadedMatrix.getElement( 3, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 3, 1 ), loadedMatrix.getElement( 3, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 3, 2 ), loadedMatrix.getElement( 3, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 3, 3 ), loadedMatrix.getElement( 3, 3 ) ); - EXPECT_EQ( savedMatrix.getElement( 0, 0 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 0, 1 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 0, 2 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 0, 3 ), 0 ); + EXPECT_EQ( savedMatrix.getElement( 0, 0 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 0, 1 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 0, 2 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 0, 3 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 1, 0 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 1, 1 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 1, 2 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 1, 3 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 1, 0 ), 0 ); + EXPECT_EQ( savedMatrix.getElement( 1, 1 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 1, 2 ), 0 ); + EXPECT_EQ( savedMatrix.getElement( 1, 3 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 2, 0 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 2, 1 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 2, 2 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 2, 3 ), 0 ); + EXPECT_EQ( savedMatrix.getElement( 2, 0 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 2, 1 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 2, 2 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 2, 3 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 3, 0 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 3, 1 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 3, 2 ), 1 ); - EXPECT_EQ( savedMatrix.getElement( 3, 3 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 3, 0 ), 0 ); + EXPECT_EQ( savedMatrix.getElement( 3, 1 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 3, 2 ), 1 ); + EXPECT_EQ( savedMatrix.getElement( 3, 3 ), 1 ); - EXPECT_EQ( std::remove( filename ), 0 ); + EXPECT_EQ( std::remove( filename ), 0 ); } template< typename Matrix > void test_Print() { - using RealType = typename Matrix::RealType; - using DeviceType = typename Matrix::DeviceType; - using IndexType = typename Matrix::IndexType; - -/* - * Sets up the following 5x4 sparse matrix: - * - * / 1 1 1 0 \ - * | 0 0 0 1 | - * | 1 1 1 0 | - * | 0 1 1 1 | - * \ 0 0 1 1 / - */ + using RealType = typename Matrix::RealType; + using DeviceType = typename Matrix::DeviceType; + using IndexType = typename Matrix::IndexType; - const IndexType m_rows = 5; - const IndexType m_cols = 4; + /* + * Sets up the following 5x4 sparse matrix: + * + * / 1 1 1 0 \ + * | 0 0 0 1 | + * | 1 1 1 0 | + * | 0 1 1 1 | + * \ 0 0 1 1 / + */ - Matrix m; - m.reset(); - m.setDimensions( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths; - rowLengths.setSize( m_rows ); - rowLengths.setValue( 3 ); - m.setCompressedRowLengths( rowLengths ); + const IndexType m_rows = 5; + const IndexType m_cols = 4; - RealType value = 1; - for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row - m.setElement( 0, i, 1 ); + Matrix m; + m.reset(); + m.setDimensions( m_rows, m_cols ); + typename Matrix::CompressedRowLengthsVector rowLengths; + rowLengths.setSize( m_rows ); + rowLengths.setValue( 3 ); + m.setCompressedRowLengths( rowLengths ); - m.setElement( 1, 3, 1 ); // 1st row + RealType value = 1; + for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row + m.setElement( 0, i, 1 ); - for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row - m.setElement( 2, i, 1 ); + m.setElement( 1, 3, 1 ); // 1st row - for( IndexType i = 1; i < m_cols; i++ ) // 3rd row - m.setElement( 3, i, 1 ); + for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row + m.setElement( 2, i, 1 ); - for( IndexType i = 2; i < m_cols; i++ ) // 4th row - m.setElement( 4, i, 1 ); + for( IndexType i = 1; i < m_cols; i++ ) // 3rd row + m.setElement( 3, i, 1 ); - #include <sstream> - std::stringstream printed; - std::stringstream couted; + for( IndexType i = 2; i < m_cols; i++ ) // 4th row + m.setElement( 4, i, 1 ); - //change the underlying buffer and save the old buffer - auto old_buf = std::cout.rdbuf(printed.rdbuf()); + std::stringstream printed; + std::stringstream couted; - m.print( std::cout ); //all the std::cout goes to ss + //change the underlying buffer and save the old buffer + auto old_buf = std::cout.rdbuf(printed.rdbuf()); - std::cout.rdbuf(old_buf); //reset + m.print( std::cout ); //all the std::cout goes to ss - couted << "Row: 0 -> Col:0->1 Col:1->1 Col:2->1\t\n" - "Row: 1 -> Col:3->1\t\n" - "Row: 2 -> Col:0->1 Col:1->1 Col:2->1\t\n" - "Row: 3 -> Col:1->1 Col:2->1 Col:3->1\t\n" - "Row: 4 -> Col:2->1 Col:3->1\t\n"; + std::cout.rdbuf(old_buf); //reset + couted << "Row: 0 -> Col:0->1 Col:1->1 Col:2->1\t\n" + "Row: 1 -> Col:3->1\t\n" + "Row: 2 -> Col:0->1 Col:1->1 Col:2->1\t\n" + "Row: 3 -> Col:1->1 Col:2->1 Col:3->1\t\n" + "Row: 4 -> Col:2->1 Col:3->1\t\n"; - EXPECT_EQ( printed.str(), couted.str() ); + EXPECT_EQ( printed.str(), couted.str() ); } #endif