diff --git a/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h b/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h index fd6bd84641b05059426bfa7ff1691e22749bf780..1beddaf7e087244b71a4a1f9186e2adaf0c2319e 100644 --- a/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h +++ b/src/UnitTests/Matrices/SymmetricSparseMatrixTest.h @@ -612,74 +612,58 @@ void test_AddElement() EXPECT_EQ( m.getElement( 5, 2 ), 0 ); EXPECT_EQ( m.getElement( 5, 3 ), 0 ); EXPECT_EQ( m.getElement( 5, 4 ), 10 ); -############################################################################ + // Add new elements to the old elements with a multiplying factor applied to the old elements. /* * The following setup results in the following 6x5 sparse matrix: * - * / 3 6 9 0 0 \ - * | 0 12 15 18 0 | - * | 0 0 21 24 27 | - * | 30 11 12 0 0 | - * | 0 35 14 15 0 | - * \ 0 0 16 41 18 / + * / 1 2 0 0 0 \ / 0 1 0 0 0 \ / 2 5 0 0 0 \ + * | 2 3 4 0 0 | | 1 0 1 0 0 | | 5 6 9 0 0 | + * 2 | 0 4 5 6 0 | + | 0 1 0 1 0 | = | 0 9 10 13 0 | + * | 0 0 6 7 8 | | 0 0 1 0 1 | | 0 0 13 14 17 | + * | 0 0 0 8 9 | | 0 0 0 1 0 | | 0 0 0 17 18 | + * \ 0 0 0 0 10 / \ 0 0 0 0 1 / \ 0 0 0 0 21 / */ - RealType newValue = 1; - for( IndexType i = 0; i < cols - 2; i++ ) // 0th row - m.addElement( 0, i, newValue++, 2.0 ); - - for( IndexType i = 1; i < cols - 1; i++ ) // 1st row - m.addElement( 1, i, newValue++, 2.0 ); - - for( IndexType i = 2; i < cols; i++ ) // 2nd row - m.addElement( 2, i, newValue++, 2.0 ); - - for( IndexType i = 0; i < cols - 2; i++ ) // 3rd row - m.addElement( 3, i, newValue++, 2.0 ); + for( IndexType i = 1; i < rows; i++ ) + m.addElement( i, i - 1, 1.0, 2.0 ); - for( IndexType i = 1; i < cols - 1; i++ ) // 4th row - m.addElement( 4, i, newValue++, 2.0 ); - for( IndexType i = 2; i < cols; i++ ) // 5th row - m.addElement( 5, i, newValue++, 2.0 ); - - - EXPECT_EQ( m.getElement( 0, 0 ), 3 ); - EXPECT_EQ( m.getElement( 0, 1 ), 6 ); - EXPECT_EQ( m.getElement( 0, 2 ), 9 ); + EXPECT_EQ( m.getElement( 0, 0 ), 2 ); + EXPECT_EQ( m.getElement( 0, 1 ), 5 ); + EXPECT_EQ( m.getElement( 0, 2 ), 0 ); EXPECT_EQ( m.getElement( 0, 3 ), 0 ); EXPECT_EQ( m.getElement( 0, 4 ), 0 ); - EXPECT_EQ( m.getElement( 1, 0 ), 0 ); - EXPECT_EQ( m.getElement( 1, 1 ), 12 ); - EXPECT_EQ( m.getElement( 1, 2 ), 15 ); - EXPECT_EQ( m.getElement( 1, 3 ), 18 ); + EXPECT_EQ( m.getElement( 1, 0 ), 5 ); + EXPECT_EQ( m.getElement( 1, 1 ), 6 ); + EXPECT_EQ( m.getElement( 1, 2 ), 9 ); + EXPECT_EQ( m.getElement( 1, 3 ), 0 ); EXPECT_EQ( m.getElement( 1, 4 ), 0 ); EXPECT_EQ( m.getElement( 2, 0 ), 0 ); - EXPECT_EQ( m.getElement( 2, 1 ), 0 ); - EXPECT_EQ( m.getElement( 2, 2 ), 21 ); - EXPECT_EQ( m.getElement( 2, 3 ), 24 ); - EXPECT_EQ( m.getElement( 2, 4 ), 27 ); - - EXPECT_EQ( m.getElement( 3, 0 ), 30 ); - EXPECT_EQ( m.getElement( 3, 1 ), 11 ); - EXPECT_EQ( m.getElement( 3, 2 ), 12 ); - EXPECT_EQ( m.getElement( 3, 3 ), 0 ); - EXPECT_EQ( m.getElement( 3, 4 ), 0 ); + EXPECT_EQ( m.getElement( 2, 1 ), 9 ); + EXPECT_EQ( m.getElement( 2, 2 ), 10 ); + EXPECT_EQ( m.getElement( 2, 3 ), 13 ); + EXPECT_EQ( m.getElement( 2, 4 ), 0 ); + + EXPECT_EQ( m.getElement( 3, 0 ), 0 ); + EXPECT_EQ( m.getElement( 3, 1 ), 0 ); + EXPECT_EQ( m.getElement( 3, 2 ), 13 ); + EXPECT_EQ( m.getElement( 3, 3 ), 14 ); + EXPECT_EQ( m.getElement( 3, 4 ), 17 ); EXPECT_EQ( m.getElement( 4, 0 ), 0 ); - EXPECT_EQ( m.getElement( 4, 1 ), 35 ); - EXPECT_EQ( m.getElement( 4, 2 ), 14 ); - EXPECT_EQ( m.getElement( 4, 3 ), 15 ); - EXPECT_EQ( m.getElement( 4, 4 ), 0 ); + EXPECT_EQ( m.getElement( 4, 1 ), 0 ); + EXPECT_EQ( m.getElement( 4, 2 ), 0 ); + EXPECT_EQ( m.getElement( 4, 3 ), 17 ); + EXPECT_EQ( m.getElement( 4, 4 ), 18 ); EXPECT_EQ( m.getElement( 5, 0 ), 0 ); EXPECT_EQ( m.getElement( 5, 1 ), 0 ); - EXPECT_EQ( m.getElement( 5, 2 ), 16 ); - EXPECT_EQ( m.getElement( 5, 3 ), 41 ); - EXPECT_EQ( m.getElement( 5, 4 ), 18 ); + EXPECT_EQ( m.getElement( 5, 2 ), 0 ); + EXPECT_EQ( m.getElement( 5, 3 ), 0 ); + EXPECT_EQ( m.getElement( 5, 4 ), 21 ); } template< typename Matrix > @@ -690,226 +674,129 @@ void test_VectorProduct() using IndexType = typename Matrix::IndexType; using VectorType = TNL::Containers::Vector< RealType, DeviceType, IndexType >; - /* + /** * Sets up the following 4x4 sparse matrix: * * / 1 0 0 0 \ - * | 0 2 0 3 | - * | 0 4 0 0 | - * \ 0 0 5 0 / + * | 0 2 3 4 | + * | 0 3 0 5 | + * \ 0 4 5 0 / */ const IndexType m_rows_1 = 4; const IndexType m_cols_1 = 4; - Matrix m_1; - m_1.reset(); - m_1.setDimensions( m_rows_1, m_cols_1 ); - typename Matrix::CompressedRowLengthsVector rowLengths_1; - rowLengths_1.setSize( m_rows_1 ); - rowLengths_1.setElement( 0, 1 ); - rowLengths_1.setElement( 1, 2 ); - rowLengths_1.setElement( 2, 1 ); - rowLengths_1.setElement( 3, 1 ); - m_1.setCompressedRowLengths( rowLengths_1 ); - - RealType value_1 = 1; - m_1.setElement( 0, 0, value_1++ ); // 0th row - - m_1.setElement( 1, 1, value_1++ ); // 1st row - m_1.setElement( 1, 3, value_1++ ); - - m_1.setElement( 2, 1, value_1++ ); // 2nd row - - m_1.setElement( 3, 2, value_1++ ); // 3rd row - - VectorType inVector_1; - inVector_1.setSize( m_cols_1 ); - for( IndexType i = 0; i < inVector_1.getSize(); i++ ) - inVector_1.setElement( i, 2 ); - - VectorType outVector_1; - outVector_1.setSize( m_rows_1 ); - for( IndexType j = 0; j < outVector_1.getSize(); j++ ) - outVector_1.setElement( j, 0 ); - + Matrix m_1( m_rows_1, m_cols_1, { + { 0, 0, 1 }, + { 1, 1, 2 }, + { 2, 1, 3 }, + { 3, 1, 4 }, { 3, 2, 5 } } ); + VectorType inVector_1( m_cols, 2 ); + VectorType outVector_1( m_rows, 1 ); m_1.vectorProduct( inVector_1, outVector_1 ); - EXPECT_EQ( outVector_1.getElement( 0 ), 2 ); - EXPECT_EQ( outVector_1.getElement( 1 ), 10 ); - EXPECT_EQ( outVector_1.getElement( 2 ), 8 ); - EXPECT_EQ( outVector_1.getElement( 3 ), 10 ); + EXPECT_EQ( outVector_1.getElement( 1 ), 18 ); + EXPECT_EQ( outVector_1.getElement( 2 ), 16 ); + EXPECT_EQ( outVector_1.getElement( 3 ), 18 ); - /* + /** * Sets up the following 4x4 sparse matrix: * * / 1 2 3 0 \ - * | 0 0 0 4 | - * | 5 6 7 0 | - * \ 0 8 0 0 / + * | 2 0 6 8 | + * | 3 6 7 0 | + * \ 0 8 0 9 / */ const IndexType m_rows_2 = 4; const IndexType m_cols_2 = 4; - Matrix m_2( m_rows_2, m_cols_2 ); - typename Matrix::CompressedRowLengthsVector rowLengths_2{ 3, 1, 3, 1 }; - /*rowLengths_2 = 3; - rowLengths_2.setElement( 1, 1 ); - rowLengths_2.setElement( 3, 1 );*/ - m_2.setCompressedRowLengths( rowLengths_2 ); - - RealType value_2 = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m_2.setElement( 0, i, value_2++ ); - - m_2.setElement( 1, 3, value_2++ ); // 1st row - - for( IndexType i = 0; i < 3; i++ ) // 2nd row - m_2.setElement( 2, i, value_2++ ); - - for( IndexType i = 1; i < 2; i++ ) // 3rd row - m_2.setElement( 3, i, value_2++ ); - - VectorType inVector_2; - inVector_2.setSize( m_cols_2 ); - for( IndexType i = 0; i < inVector_2.getSize(); i++ ) - inVector_2.setElement( i, 2 ); - - VectorType outVector_2; - outVector_2.setSize( m_rows_2 ); - for( IndexType j = 0; j < outVector_2.getSize(); j++ ) - outVector_2.setElement( j, 0 ); + Matrix m_2( m_rows_2, m_cols_2, { + { 0, 0, 1 }, { 0, 1, 2 }, { 0, 2, 3 }, + { 1, 0, 2 }, { 1, 2, 6 }, { 1, 3, 8 }, + { 2, 0, 3 }, { 2, 1, 6 }, { 2, 2, 7 }, + { 3, 2, 8 }, { 3, 3, 9 } } ); + VectorType inVector_2( m_cols_2, 2 ); + VectorType outVector_2( m_rows_2, 0 ); m_2.vectorProduct( inVector_2, outVector_2 ); EXPECT_EQ( outVector_2.getElement( 0 ), 12 ); - EXPECT_EQ( outVector_2.getElement( 1 ), 8 ); - EXPECT_EQ( outVector_2.getElement( 2 ), 36 ); - EXPECT_EQ( outVector_2.getElement( 3 ), 16 ); + EXPECT_EQ( outVector_2.getElement( 1 ), 32 ); + EXPECT_EQ( outVector_2.getElement( 2 ), 32 ); + EXPECT_EQ( outVector_2.getElement( 3 ), 34 ); /* * Sets up the following 4x4 sparse matrix: * - * / 1 2 3 0 \ - * | 0 4 5 6 | - * | 7 8 9 0 | - * \ 0 10 11 12 / + * / 1 2 3 4 \ + * | 2 5 0 0 | + * | 3 0 6 0 | + * \ 4 0 0 7 / */ const IndexType m_rows_3 = 4; const IndexType m_cols_3 = 4; - Matrix m_3( m_rows_3, m_cols_3 ); - typename Matrix::CompressedRowLengthsVector rowLengths_3{ 3, 3, 3, 3 }; - m_3.setCompressedRowLengths( rowLengths_3 ); - - RealType value_3 = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m_3.setElement( 0, i, value_3++ ); - - for( IndexType i = 1; i < 4; i++ ) - m_3.setElement( 1, i, value_3++ ); // 1st row - - for( IndexType i = 0; i < 3; i++ ) // 2nd row - m_3.setElement( 2, i, value_3++ ); - - for( IndexType i = 1; i < 4; i++ ) // 3rd row - m_3.setElement( 3, i, value_3++ ); - - VectorType inVector_3; - inVector_3.setSize( m_cols_3 ); - for( IndexType i = 0; i < inVector_3.getSize(); i++ ) - inVector_3.setElement( i, 2 ); - - VectorType outVector_3; - outVector_3.setSize( m_rows_3 ); - for( IndexType j = 0; j < outVector_3.getSize(); j++ ) - outVector_3.setElement( j, 0 ); + Matrix m_3( m_rows_3, m_cols_3, { + { 0, 0, 1 }, { 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 4 }, + { 1, 0, 2 }, { 1, 1, 5 }, + { 2, 0, 3 }, { 2, 2, 6 }, + { 3, 0, 4 }, { 3, 3, 7 } + } ); + VectorType inVector_3( { 0, 1, 2, 3 } ); + VectorType outVector_3( m_rows_3, 0 ); m_3.vectorProduct( inVector_3, outVector_3 ); - EXPECT_EQ( outVector_3.getElement( 0 ), 12 ); - EXPECT_EQ( outVector_3.getElement( 1 ), 30 ); - EXPECT_EQ( outVector_3.getElement( 2 ), 48 ); - EXPECT_EQ( outVector_3.getElement( 3 ), 66 ); + EXPECT_EQ( outVector_3.getElement( 0 ), 20 ); + EXPECT_EQ( outVector_3.getElement( 1 ), 5 ); + EXPECT_EQ( outVector_3.getElement( 2 ), 12 ); + EXPECT_EQ( outVector_3.getElement( 3 ), 21 ); /* * Sets up the following 8x8 sparse matrix: * - * / 1 2 3 0 0 4 0 0 \ - * | 0 5 6 7 8 0 0 0 | - * | 9 10 11 12 13 0 0 0 | - * | 0 14 15 16 17 0 0 0 | - * | 0 0 18 19 20 21 0 0 | - * | 0 0 0 22 23 24 25 0 | - * | 26 27 28 29 30 0 0 0 | - * \ 31 32 33 34 35 0 0 0 / + * / 1 0 3 0 9 0 15 0 \ + * | 0 2 0 6 0 12 0 19 | + * | 3 0 5 0 10 0 16 0 | + * | 0 6 0 8 0 13 0 20 | + * | 9 0 10 0 11 0 17 0 | + * | 0 12 0 13 0 14 0 21 | + * | 15 0 16 0 17 0 18 0 | + * \ 0 19 0 20 0 21 0 22 / */ const IndexType m_rows_4 = 8; const IndexType m_cols_4 = 8; - Matrix m_4( m_rows_4, m_cols_4 ); - typename Matrix::CompressedRowLengthsVector rowLengths_4{ 4, 4, 5, 4, 4, 4, 5, 5 }; - /*rowLengths_4.setSize( m_rows_4 ); - rowLengths_4.setValue( 4 ); - rowLengths_4.setElement( 2, 5 ); - rowLengths_4.setElement( 6, 5 ); - rowLengths_4.setElement( 7, 5 );*/ - m_4.setCompressedRowLengths( rowLengths_4 ); - - RealType value_4 = 1; - for( IndexType i = 0; i < 3; i++ ) // 0th row - m_4.setElement( 0, i, value_4++ ); - - m_4.setElement( 0, 5, value_4++ ); - - for( IndexType i = 1; i < 5; i++ ) // 1st row - m_4.setElement( 1, i, value_4++ ); - - for( IndexType i = 0; i < 5; i++ ) // 2nd row - m_4.setElement( 2, i, value_4++ ); - - for( IndexType i = 1; i < 5; i++ ) // 3rd row - m_4.setElement( 3, i, value_4++ ); - - for( IndexType i = 2; i < 6; i++ ) // 4th row - m_4.setElement( 4, i, value_4++ ); - - for( IndexType i = 3; i < 7; i++ ) // 5th row - m_4.setElement( 5, i, value_4++ ); - - for( IndexType i = 0; i < 5; i++ ) // 6th row - m_4.setElement( 6, i, value_4++ ); - - for( IndexType i = 0; i < 5; i++ ) // 7th row - m_4.setElement( 7, i, value_4++ ); - - VectorType inVector_4; - inVector_4.setSize( m_cols_4 ); - for( IndexType i = 0; i < inVector_4.getSize(); i++ ) - inVector_4.setElement( i, 2 ); - - VectorType outVector_4; - outVector_4.setSize( m_rows_4 ); - for( IndexType j = 0; j < outVector_4.getSize(); j++ ) - outVector_4.setElement( j, 0 ); + Matrix m_4( m_rows_4, m_cols_4, { + { 0, 0, 1 }, + { 1, 1, 2 }, + { 2, 0, 3 }, { 2, 2, 5 }, + { 3, 1, 6 }, { 3, 3, 8 }, + { 4, 0, 9 }, { 4, 2, 10 }, { 4, 4, 11 }, + { 5, 1, 12 }, { 5, 3, 13 }, { 5, 5, 14 }, + { 6, 0, 15 }, { 6, 2, 16 }, { 6, 4, 17 }, { 6, 6, 18 }, + { 7, 1, 19 }, { 7, 3, 20 }, { 7, 5, 21 }, { 7, 7, 22 } + } ); + VectorType inVector_4 { 1, 2, 1, 2, 1, 2, 1, 2 }; + VectorType outVector_4( m_rows_4, 0 ); m_4.vectorProduct( inVector_4, outVector_4 ); - EXPECT_EQ( outVector_4.getElement( 0 ), 20 ); - EXPECT_EQ( outVector_4.getElement( 1 ), 52 ); - EXPECT_EQ( outVector_4.getElement( 2 ), 110 ); - EXPECT_EQ( outVector_4.getElement( 3 ), 124 ); - EXPECT_EQ( outVector_4.getElement( 4 ), 156 ); - EXPECT_EQ( outVector_4.getElement( 5 ), 188 ); - EXPECT_EQ( outVector_4.getElement( 6 ), 280 ); - EXPECT_EQ( outVector_4.getElement( 7 ), 330 ); - + EXPECT_EQ( outVector_4.getElement( 0 ), 28 ); + EXPECT_EQ( outVector_4.getElement( 1 ), 78 ); + EXPECT_EQ( outVector_4.getElement( 2 ), 34 ); + EXPECT_EQ( outVector_4.getElement( 3 ), 94 ); + EXPECT_EQ( outVector_4.getElement( 4 ), 47 ); + EXPECT_EQ( outVector_4.getElement( 5 ), 120 ); + EXPECT_EQ( outVector_4.getElement( 6 ), 66 ); + EXPECT_EQ( outVector_4.getElement( 7 ), 164 ); +############################################ /* * Sets up the following 8x8 sparse matrix: *