diff --git a/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h b/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h index 1beddaf7e087244b71a4a1f9186e2adaf0c2319e..8593ff3f13c877a361a626850b2627906f3b0a3d 100644 --- a/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h +++ b/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h @@ -569,7 +569,7 @@ void test_AddElement() const IndexType cols = 5; Matrix m( 6, 5, { - { 0, 0, 1 }, + { 0, 0, 1 }, { 1, 0, 2 }, { 1, 1, 3 }, { 2, 1, 4 }, { 2, 2, 5 }, { 3, 2, 6 }, { 3, 3, 7 }, @@ -796,79 +796,45 @@ void test_VectorProduct() EXPECT_EQ( outVector_4.getElement( 6 ), 66 ); EXPECT_EQ( outVector_4.getElement( 7 ), 164 ); -############################################ /* * 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 + * / 1 0 0 0 0 0 0 0 \ + * | 0 2 0 0 0 0 0 0 | + * | 0 0 3 4 6 9 0 0 | + * | 0 0 4 5 7 10 0 0 | + * | 0 0 6 7 8 11 0 0 | + * | 0 0 9 10 11 12 0 0 | + * | 0 0 0 0 0 0 13 0 | + * \ 0 0 0 0 0 0 0 14 / */ const IndexType m_rows_5 = 8; const IndexType m_cols_5 = 8; - Matrix m_5( m_rows_5, m_cols_5 ); - typename Matrix::CompressedRowLengthsVector rowLengths_5{ 6, 3, 4, 5, 2, 7, 8, 8 }; - m_5.setCompressedRowLengths( rowLengths_5 ); - - RealType value_5 = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m_5.setElement( 0, i, value_5++ ); - - m_5.setElement( 0, 4, value_5++ ); // 0th row - m_5.setElement( 0, 5, value_5++ ); - - m_5.setElement( 1, 1, value_5++ ); // 1st row - m_5.setElement( 1, 3, value_5++ ); - - for( IndexType i = 1; i < 3; i++ ) // 2nd row - m_5.setElement( 2, i, value_5++ ); - - m_5.setElement( 2, 4, value_5++ ); // 2nd row - - for( IndexType i = 1; i < 5; i++ ) // 3rd row - m_5.setElement( 3, i, value_5++ ); - - m_5.setElement( 4, 1, value_5++ ); // 4th row - - for( IndexType i = 1; i < 7; i++ ) // 5th row - m_5.setElement( 5, i, value_5++ ); - - for( IndexType i = 0; i < 7; i++ ) // 6th row - m_5.setElement( 6, i, value_5++ ); - - for( IndexType i = 0; i < 8; i++ ) // 7th row - m_5.setElement( 7, i, value_5++ ); - - for( IndexType i = 0; i < 7; i++ ) // 1s at the end of rows - m_5.setElement( i, 7, 1); - - VectorType inVector_5; - inVector_5.setSize( m_cols_5 ); - for( IndexType i = 0; i < inVector_5.getSize(); i++ ) - inVector_5.setElement( i, 2 ); - - VectorType outVector_5; - outVector_5.setSize( m_rows_5 ); - for( IndexType j = 0; j < outVector_5.getSize(); j++ ) - outVector_5.setElement( j, 0 ); + Matrix m_5( m_rows_5, m_cols_5,{ + { 0, 0, 1 }, + { 1, 1, 2, }, + { 2, 2, 3 }, { 2, 3, 4 }, { 2, 4, 6 }, { 2, 5, 9 }, + { 3, 2, 4 }, { 3, 3, 5 }, { 3, 4, 7 }, { 3, 5, 10 }, + { 4, 2, 6 }, { 4, 3, 7 }, { 4, 4, 8 }, { 4, 5, 11 }, + { 5, 2, 9 }, { 5, 3, 10 }, { 5, 4, 11 }, { 5, 5, 12 }, + { 6, 6, 13 }, + { 7, 7, 14 } + } ); + VectorType inVector_5( m_cols_5, { 1, 2, 3, 4, 5, 6, 7, 8 } ); + VectorType outVector_5( m_rows_5, 0.0 ); m_5.vectorProduct( inVector_5, outVector_5 ); - EXPECT_EQ( outVector_5.getElement( 0 ), 32 ); - EXPECT_EQ( outVector_5.getElement( 1 ), 28 ); - EXPECT_EQ( outVector_5.getElement( 2 ), 56 ); - EXPECT_EQ( outVector_5.getElement( 3 ), 102 ); - EXPECT_EQ( outVector_5.getElement( 4 ), 32 ); - EXPECT_EQ( outVector_5.getElement( 5 ), 224 ); - EXPECT_EQ( outVector_5.getElement( 6 ), 352 ); - EXPECT_EQ( outVector_5.getElement( 7 ), 520 ); + EXPECT_EQ( outVector_5.getElement( 0 ), 1*1 ); + EXPECT_EQ( outVector_5.getElement( 1 ), 2*2 ); + EXPECT_EQ( outVector_5.getElement( 2 ), 3*3 + 4*4 + 5*6 + 6*9 ); + EXPECT_EQ( outVector_5.getElement( 3 ), 3*4 + 4*5 + 5*7 + 6*10 ); + EXPECT_EQ( outVector_5.getElement( 4 ), 3*6 + 4*7 + 5*8 + 6*11 ); + EXPECT_EQ( outVector_5.getElement( 5 ), 3*9 + 4*10 + 5*11 + 6*12 ); + EXPECT_EQ( outVector_5.getElement( 6 ), 7*13 ); + EXPECT_EQ( outVector_5.getElement( 7 ), 8*14 ); } template< typename Matrix > @@ -881,55 +847,29 @@ void test_RowsReduction() /* * 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 + * / 1 0 0 0 0 0 0 0 \ + * | 0 2 0 0 0 0 0 0 | + * | 0 0 3 4 6 9 0 0 | + * | 0 0 4 5 7 10 0 0 | + * | 0 0 6 7 8 11 0 0 | + * | 0 0 9 10 11 12 0 0 | + * | 0 0 0 0 0 0 13 0 | + * \ 0 0 0 0 0 0 0 14 / */ - const IndexType rows = 8; - const IndexType cols = 8; - - Matrix m; - m.setDimensions( rows, cols ); - typename Matrix::RowsCapacitiesType rowsCapacities{ 6, 3, 4, 5, 2, 7, 8, 8 }; - m.setCompressedRowLengths( rowsCapacities ); - - RealType value = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m.setElement( 0, i, value++ ); - - m.setElement( 0, 4, value++ ); // 0th row - m.setElement( 0, 5, value++ ); - - m.setElement( 1, 1, value++ ); // 1st row - m.setElement( 1, 3, value++ ); - - for( IndexType i = 1; i < 3; i++ ) // 2nd row - m.setElement( 2, i, value++ ); - - m.setElement( 2, 4, value++ ); // 2nd row - - for( IndexType i = 1; i < 5; i++ ) // 3rd row - m.setElement( 3, i, value++ ); - - m.setElement( 4, 1, value++ ); // 4th row - - for( IndexType i = 1; i < 7; i++ ) // 5th row - m.setElement( 5, i, value++ ); - - for( IndexType i = 0; i < 7; i++ ) // 6th row - m.setElement( 6, i, value++ ); - - for( IndexType i = 0; i < 8; i++ ) // 7th row - m.setElement( 7, i, value++ ); + const IndexType m_rows_5 = 8; + const IndexType m_cols_5 = 8; - for( IndexType i = 0; i < 7; i++ ) // 1s at the end of rows - m.setElement( i, 7, 1); + Matrix m_5( m_rows_5, m_cols_5,{ + { 0, 0, 1 }, + { 1, 1, 2, }, + { 2, 2, 3 }, { 2, 3, 4 }, { 2, 4, 6 }, { 2, 5, 9 }, + { 3, 2, 4 }, { 3, 3, 5 }, { 3, 4, 7 }, { 3, 5, 10 }, + { 4, 2, 6 }, { 4, 3, 7 }, { 4, 4, 8 }, { 4, 5, 11 }, + { 5, 2, 9 }, { 5, 3, 10 }, { 5, 4, 11 }, { 5, 5, 12 }, + { 6, 6, 13 }, + { 7, 7, 14 } + } ); //// // Compute number of non-zero elements in rows. @@ -986,24 +926,13 @@ void test_PerformSORIteration() const IndexType m_rows = 4; const IndexType m_cols = 4; - Matrix m( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths( m_rows ); - rowLengths = 3; - m.setCompressedRowLengths( rowLengths ); - - m.setElement( 0, 0, 4.0 ); // 0th row - m.setElement( 0, 1, 1.0); - - m.setElement( 1, 0, 1.0 ); // 1st row - m.setElement( 1, 1, 4.0 ); - m.setElement( 1, 2, 1.0 ); - - m.setElement( 2, 1, 1.0 ); // 2nd row - m.setElement( 2, 2, 4.0 ); - m.setElement( 2, 3, 1.0 ); - - m.setElement( 3, 2, 1.0 ); // 3rd row - m.setElement( 3, 3, 4.0 ); + Matrix m( m_rows, m_cols, { + { 0, 0, 4 }, { 0, 1, 1 }, + { 1, 0, 1 }, { 1, 1, 4 }, { 1, 2, 1 }, + { 2, 1, 1 }, { 2, 2, 4 }, { 2, 3, 1 }, + { 3, 2, 1 }, { 3, 3, 4 }, { 3, 4, 1 }, + { 4, 3, 1 }, { 4, 4, 4 } + } ); RealType bVector [ 4 ] = { 1, 1, 1, 1 }; RealType xVector [ 4 ] = { 1, 1, 1, 1 }; @@ -1048,41 +977,70 @@ void test_SaveAndLoad( const char* filename ) using IndexType = typename Matrix::IndexType; /* - * Sets up the following 4x4 sparse matrix: + * Sets up the following 6x5 sparse matrix: * - * / 1 2 3 0 \ - * | 0 4 0 5 | - * | 6 7 8 0 | - * \ 0 9 10 11 / + * / 1 2 0 0 0 \ + * | 2 3 4 0 0 | + * | 0 4 5 6 0 | + * | 0 0 6 7 8 | + * | 0 0 0 8 9 | + * \ 0 0 0 0 10 / */ - const IndexType m_rows = 4; - const IndexType m_cols = 4; + const IndexType rows = 6; + const IndexType cols = 5; - Matrix savedMatrix( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths( m_rows ); - rowLengths = 3; - savedMatrix.setCompressedRowLengths( rowLengths ); + Matrix savedMatrix( 6, 5, { + { 0, 0, 1 }, + { 1, 0, 2 }, { 1, 1, 3 }, + { 2, 1, 4 }, { 2, 2, 5 }, + { 3, 2, 6 }, { 3, 3, 7 }, + { 4, 3, 8 }, { 4, 4, 9 }, + { 5, 5, 10 } } ); - RealType value = 1; - for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row - savedMatrix.setElement( 0, i, value++ ); + // Check the set elements + EXPECT_EQ( m.getElement( 0, 0 ), 1 ); + EXPECT_EQ( m.getElement( 0, 1 ), 2 ); + EXPECT_EQ( m.getElement( 0, 2 ), 0 ); + EXPECT_EQ( m.getElement( 0, 3 ), 0 ); + EXPECT_EQ( m.getElement( 0, 4 ), 0 ); - savedMatrix.setElement( 1, 1, value++ ); - savedMatrix.setElement( 1, 3, value++ ); // 1st row + EXPECT_EQ( m.getElement( 1, 0 ), 2 ); + EXPECT_EQ( m.getElement( 1, 1 ), 3 ); + EXPECT_EQ( m.getElement( 1, 2 ), 4 ); + EXPECT_EQ( m.getElement( 1, 3 ), 0 ); + EXPECT_EQ( m.getElement( 1, 4 ), 0 ); - for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row - savedMatrix.setElement( 2, i, value++ ); + EXPECT_EQ( m.getElement( 2, 0 ), 0 ); + EXPECT_EQ( m.getElement( 2, 1 ), 4 ); + EXPECT_EQ( m.getElement( 2, 2 ), 5 ); + EXPECT_EQ( m.getElement( 2, 3 ), 6 ); + EXPECT_EQ( m.getElement( 2, 4 ), 0 ); - for( IndexType i = 1; i < m_cols; i++ ) // 3rd row - savedMatrix.setElement( 3, i, value++ ); + EXPECT_EQ( m.getElement( 3, 0 ), 0 ); + EXPECT_EQ( m.getElement( 3, 1 ), 0 ); + EXPECT_EQ( m.getElement( 3, 2 ), 6 ); + EXPECT_EQ( m.getElement( 3, 3 ), 7 ); + EXPECT_EQ( m.getElement( 3, 4 ), 8 ); + + EXPECT_EQ( m.getElement( 4, 0 ), 0 ); + EXPECT_EQ( m.getElement( 4, 1 ), 0 ); + EXPECT_EQ( m.getElement( 4, 2 ), 0 ); + EXPECT_EQ( m.getElement( 4, 3 ), 8 ); + EXPECT_EQ( m.getElement( 4, 4 ), 9 ); + + EXPECT_EQ( m.getElement( 5, 0 ), 0 ); + 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 ), 10 ); ASSERT_NO_THROW( savedMatrix.save( filename ) ); - Matrix loadedMatrix( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths2( m_rows ); - rowLengths2 = 3; - loadedMatrix.setCompressedRowLengths( rowLengths2 ); + Matrix loadedMatrix; + //typename Matrix::CompressedRowLengthsVector rowLengths2( m_rows ); + //rowLengths2 = 3; + //loadedMatrix.setCompressedRowLengths( rowLengths2 ); ASSERT_NO_THROW( loadedMatrix.load( filename ) ); @@ -1090,42 +1048,43 @@ void test_SaveAndLoad( const char* filename ) 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, 4 ), loadedMatrix.getElement( 0, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 0, 5 ), loadedMatrix.getElement( 0, 5 ) ); 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, 4 ), loadedMatrix.getElement( 1, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 1, 5 ), loadedMatrix.getElement( 1, 5 ) ); 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, 4 ), loadedMatrix.getElement( 2, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 2, 5 ), loadedMatrix.getElement( 2, 5 ) ); 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 ), 2 ); - EXPECT_EQ( savedMatrix.getElement( 0, 2 ), 3 ); - EXPECT_EQ( savedMatrix.getElement( 0, 3 ), 0 ); - - EXPECT_EQ( savedMatrix.getElement( 1, 0 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 1, 1 ), 4 ); - EXPECT_EQ( savedMatrix.getElement( 1, 2 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 1, 3 ), 5 ); - - EXPECT_EQ( savedMatrix.getElement( 2, 0 ), 6 ); - EXPECT_EQ( savedMatrix.getElement( 2, 1 ), 7 ); - EXPECT_EQ( savedMatrix.getElement( 2, 2 ), 8 ); - EXPECT_EQ( savedMatrix.getElement( 2, 3 ), 0 ); - - EXPECT_EQ( savedMatrix.getElement( 3, 0 ), 0 ); - EXPECT_EQ( savedMatrix.getElement( 3, 1 ), 9 ); - EXPECT_EQ( savedMatrix.getElement( 3, 2 ), 10 ); - EXPECT_EQ( savedMatrix.getElement( 3, 3 ), 11 ); - + EXPECT_EQ( savedMatrix.getElement( 3, 4 ), loadedMatrix.getElement( 3, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 3, 5 ), loadedMatrix.getElement( 3, 5 ) ); + + EXPECT_EQ( savedMatrix.getElement( 4, 0 ), loadedMatrix.getElement( 4, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 4, 1 ), loadedMatrix.getElement( 4, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 4, 2 ), loadedMatrix.getElement( 4, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 4, 3 ), loadedMatrix.getElement( 4, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 4, 4 ), loadedMatrix.getElement( 4, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 4, 5 ), loadedMatrix.getElement( 4, 5 ) ); + + EXPECT_EQ( savedMatrix.getElement( 5, 0 ), loadedMatrix.getElement( 5, 0 ) ); + EXPECT_EQ( savedMatrix.getElement( 5, 1 ), loadedMatrix.getElement( 5, 1 ) ); + EXPECT_EQ( savedMatrix.getElement( 5, 2 ), loadedMatrix.getElement( 5, 2 ) ); + EXPECT_EQ( savedMatrix.getElement( 5, 3 ), loadedMatrix.getElement( 5, 3 ) ); + EXPECT_EQ( savedMatrix.getElement( 5, 4 ), loadedMatrix.getElement( 5, 4 ) ); + EXPECT_EQ( savedMatrix.getElement( 5, 5 ), loadedMatrix.getElement( 5, 5 ) ); EXPECT_EQ( std::remove( filename ), 0 ); } @@ -1137,37 +1096,24 @@ void test_Print() using IndexType = typename Matrix::IndexType; /* - * Sets up the following 5x4 sparse matrix: + * Sets up the following 4x4 sparse matrix: * - * / 1 2 3 0 \ - * | 0 0 0 4 | - * | 5 6 7 0 | - * | 0 8 9 10 | - * \ 0 0 11 12 / + * / 4 1 0 0 \ + * | 1 4 1 0 | + * | 0 1 4 1 | + * \ 0 0 1 4 / */ - const IndexType m_rows = 5; + const IndexType m_rows = 4; const IndexType m_cols = 4; - Matrix m( m_rows, m_cols ); - typename Matrix::CompressedRowLengthsVector rowLengths( m_rows ); - rowLengths = 3; - m.setCompressedRowLengths( rowLengths ); - - RealType value = 1; - for( IndexType i = 0; i < m_cols - 1; i++ ) // 0th row - m.setElement( 0, i, value++ ); - - m.setElement( 1, 3, value++ ); // 1st row - - for( IndexType i = 0; i < m_cols - 1; i++ ) // 2nd row - m.setElement( 2, i, value++ ); - - for( IndexType i = 1; i < m_cols; i++ ) // 3rd row - m.setElement( 3, i, value++ ); - - for( IndexType i = 2; i < m_cols; i++ ) // 4th row - m.setElement( 4, i, value++ ); + Matrix m( m_rows, m_cols, { + { 0, 0, 4 }, { 0, 1, 1 }, + { 1, 0, 1 }, { 1, 1, 4 }, { 1, 2, 1 }, + { 2, 1, 1 }, { 2, 2, 4 }, { 2, 3, 1 }, + { 3, 2, 1 }, { 3, 3, 4 }, { 3, 4, 1 }, + { 4, 3, 1 }, { 4, 4, 4 } + } ); std::stringstream printed; std::stringstream couted; @@ -1179,11 +1125,10 @@ void test_Print() std::cout.rdbuf(old_buf); //reset - couted << "Row: 0 -> Col:0->1 Col:1->2 Col:2->3\t\n" - "Row: 1 -> Col:3->4\t\n" - "Row: 2 -> Col:0->5 Col:1->6 Col:2->7\t\n" - "Row: 3 -> Col:1->8 Col:2->9 Col:3->10\t\n" - "Row: 4 -> Col:2->11 Col:3->12\t\n"; + couted << "Row: 0 -> Col:0->4 Col:1->1\t\n" + "Row: 1 -> Col:0->1 Col:1->4 Col:2->1\t\n" + "Row: 2 -> Col:1->1 Col:2->4 Col:3->1\t\n" + "Row: 3 -> Col:2->1 Col:3->4\t\n"; EXPECT_EQ( printed.str(), couted.str() ); }