Commit 3f278b0e authored by Tomáš Oberhuber's avatar Tomáš Oberhuber Committed by Tomáš Oberhuber
Browse files

Fixing dense matrix unit tests.

parent 873b9a9c
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ class Dense : public Matrix< Real, Device, Index >
      using BaseType = Matrix< Real, Device, Index >;
      using ValuesType = typename BaseType::ValuesVector;
      using ValuesViewType = typename ValuesType::ViewType;
      using SegmentsType = Containers::Segments::Ellpack< DeviceType, IndexType, typename Allocators::Default< Device >::template Allocator< IndexType >, RowMajorOrder >;
      using SegmentsType = Containers::Segments::Ellpack< DeviceType, IndexType, typename Allocators::Default< Device >::template Allocator< IndexType >, RowMajorOrder, 1 >;
      using SegmentViewType = typename SegmentsType::SegmentViewType;
      using RowView = DenseMatrixRowView< SegmentViewType, ValuesViewType >;

@@ -60,6 +60,8 @@ class Dense : public Matrix< Real, Device, Index >

      Dense();

      Dense( const IndexType rows, const IndexType columns );

      static String getSerializationType();

      virtual String getSerializationTypeVirtual() const;
@@ -75,6 +77,9 @@ class Dense : public Matrix< Real, Device, Index >
       */
      void setCompressedRowLengths( ConstCompressedRowLengthsVectorView rowLengths );

      template< typename Vector >
      void getCompressedRowLengths( Vector& rowLengths ) const;

      [[deprecated]]
      IndexType getRowLength( const IndexType row ) const;

@@ -84,10 +89,6 @@ class Dense : public Matrix< Real, Device, Index >

      IndexType getNumberOfNonzeroMatrixElements() const;

      template< typename Vector >
      void getCompressedRowLengths( Vector& rowLengths ) const;


      void reset();

      __cuda_callable__
+11 −0
Original line number Diff line number Diff line
@@ -26,6 +26,17 @@ Dense< Real, Device, Index, RowMajorOrder, RealAllocator >::Dense()
{
}

template< typename Real,
          typename Device,
          typename Index,
          bool RowMajorOrder,
          typename RealAllocator >
Dense< Real, Device, Index, RowMajorOrder, RealAllocator >::
Dense( const IndexType rows, const IndexType columns )
{
   this->setDimensions( rows, columns );
}

template< typename Real,
          typename Device,
          typename Index,
+249 −170
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#include <TNL/Matrices/Matrix.h>
#include <TNL/Matrices/Dense.h>
#include <TNL/Containers/Array.h>
#include <TNL/Pointers/SharedPointer.h>
#include <TNL/Pointers/SmartPointersRegister.h>

#include <TNL/Containers/Vector.h>
#include <TNL/Containers/VectorView.h>
@@ -92,6 +94,58 @@ void test_SetLike()
    EXPECT_EQ( m1.getColumns(), m2.getColumns() );
}

template< typename Matrix >
void test_GetCompressedRowLengths()
{
   using RealType = typename Matrix::RealType;
   using DeviceType = typename Matrix::DeviceType;
   using IndexType = typename Matrix::IndexType;

   const IndexType rows = 10;
   const IndexType cols = 11;

    Matrix m( rows, cols );

    // Insert values into the rows.
    RealType value = 1;

    for( IndexType i = 0; i < 3; i++ )      // 0th row
        m.setElement( 0, i, value++ );

    for( IndexType i = 0; i < 3; i++ )      // 1st row
        m.setElement( 1, i, value++ );

    for( IndexType i = 0; i < 1; i++ )      // 2nd row
        m.setElement( 2, i, value++ );

    for( IndexType i = 0; i < 2; i++ )      // 3rd row
        m.setElement( 3, i, value++ );

    for( IndexType i = 0; i < 3; i++ )      // 4th row
        m.setElement( 4, i, value++ );

    for( IndexType i = 0; i < 4; i++ )      // 5th row
        m.setElement( 5, i, value++ );

    for( IndexType i = 0; i < 5; i++ )      // 6th row
        m.setElement( 6, i, value++ );

    for( IndexType i = 0; i < 6; i++ )      // 7th row
        m.setElement( 7, i, value++ );

    for( IndexType i = 0; i < 7; i++ )      // 8th row
        m.setElement( 8, i, value++ );

    for( IndexType i = 0; i < 8; i++ )      // 9th row
        m.setElement( 9, i, value++ );

   typename Matrix::CompressedRowLengthsVector rowLengths;
   rowLengths = 0;
   m.getCompressedRowLengths( rowLengths );
   typename Matrix::CompressedRowLengthsVector correctRowLengths{ 3, 3, 1, 2, 3, 4, 5, 6, 7, 8 };
   EXPECT_EQ( rowLengths, correctRowLengths );
}

template< typename Matrix >
void test_GetRowLength()
{
@@ -511,6 +565,7 @@ void test_SetRow()
   using RealType = typename Matrix::RealType;
   using DeviceType = typename Matrix::DeviceType;
   using IndexType = typename Matrix::IndexType;

   /*
    * Sets up the following 3x7 dense matrix:
    *
@@ -521,50 +576,55 @@ void test_SetRow()
   const IndexType rows = 3;
   const IndexType cols = 7;

    Matrix m;
    m.reset();
    m.setDimensions( rows, cols );
   TNL::Pointers::SharedPointer< Matrix > m;
   m->reset();
   m->setDimensions( rows, cols );

   RealType value = 1;
   for( IndexType i = 0; i < rows; i++ )
      for( IndexType j = 0; j < cols; j++ )
            m.setElement( i, j, value++ );       
    
    RealType row1 [ 5 ] = { 11, 11, 11, 11, 11 }; IndexType colIndexes1 [ 5 ] = { 0, 1, 2, 3, 4 };
    RealType row2 [ 5 ] = { 22, 22, 22, 22, 22 }; IndexType colIndexes2 [ 5 ] = { 0, 1, 2, 3, 4 };
    RealType row3 [ 5 ] = { 33, 33, 33, 33, 33 }; IndexType colIndexes3 [ 5 ] = { 2, 3, 4, 5, 6 };
    
    IndexType row = 0;
    IndexType elements = 5;
    
    // TODO: Fix this
    /*m.setRow( row++, colIndexes1, row1, elements );
    m.setRow( row++, colIndexes2, row2, elements );
    m.setRow( row++, colIndexes3, row3, elements );*/
    
    EXPECT_EQ( m.getElement( 0, 0 ), 11 );
    EXPECT_EQ( m.getElement( 0, 1 ), 11 );
    EXPECT_EQ( m.getElement( 0, 2 ), 11 );
    EXPECT_EQ( m.getElement( 0, 3 ), 11 );
    EXPECT_EQ( m.getElement( 0, 4 ), 11 );
    EXPECT_EQ( m.getElement( 0, 5 ),  6 );
    EXPECT_EQ( m.getElement( 0, 6 ),  7 );
    
    EXPECT_EQ( m.getElement( 1, 0 ), 22 );
    EXPECT_EQ( m.getElement( 1, 1 ), 22 );
    EXPECT_EQ( m.getElement( 1, 2 ), 22 );
    EXPECT_EQ( m.getElement( 1, 3 ), 22 );
    EXPECT_EQ( m.getElement( 1, 4 ), 22 );
    EXPECT_EQ( m.getElement( 1, 5 ), 13 );
    EXPECT_EQ( m.getElement( 1, 6 ), 14 );
    
    EXPECT_EQ( m.getElement( 2, 0 ), 15 );
    EXPECT_EQ( m.getElement( 2, 1 ), 16 );
    EXPECT_EQ( m.getElement( 2, 2 ), 33 );
    EXPECT_EQ( m.getElement( 2, 3 ), 33 );
    EXPECT_EQ( m.getElement( 2, 4 ), 33 );
    EXPECT_EQ( m.getElement( 2, 5 ), 33 );
    EXPECT_EQ( m.getElement( 2, 6 ), 33 );
         m->setElement( i, j, value++ );

   Matrix* m_ptr = &m.template modifyData< DeviceType >();
   auto f = [=] __cuda_callable__ ( IndexType rowIdx ) mutable {
      RealType values[ 3 ][ 5 ] {
         { 11, 11, 11, 11, 11 },
         { 22, 22, 22, 22, 22 },
         { 33, 33, 33, 33, 33 } };
      IndexType columnIndexes[ 3 ][ 5 ] {
         { 0, 1, 2, 3, 4 },
         { 0, 1, 2, 3, 4 },
         { 2, 3, 4, 5, 6 } };
      auto row = m_ptr->getRow( rowIdx );
      for( IndexType i = 0; i < 5; i++ )
         row.setElement( columnIndexes[ rowIdx ][ i ], values[ rowIdx ][ i ] );
   };
   TNL::Pointers::synchronizeSmartPointersOnDevice< DeviceType >();
   TNL::Algorithms::ParallelFor< DeviceType >::exec( 0, 3, f );

   EXPECT_EQ( m->getElement( 0, 0 ), 11 );
   EXPECT_EQ( m->getElement( 0, 1 ), 11 );
   EXPECT_EQ( m->getElement( 0, 2 ), 11 );
   EXPECT_EQ( m->getElement( 0, 3 ), 11 );
   EXPECT_EQ( m->getElement( 0, 4 ), 11 );
   EXPECT_EQ( m->getElement( 0, 5 ),  6 );
   EXPECT_EQ( m->getElement( 0, 6 ),  7 );

   EXPECT_EQ( m->getElement( 1, 0 ), 22 );
   EXPECT_EQ( m->getElement( 1, 1 ), 22 );
   EXPECT_EQ( m->getElement( 1, 2 ), 22 );
   EXPECT_EQ( m->getElement( 1, 3 ), 22 );
   EXPECT_EQ( m->getElement( 1, 4 ), 22 );
   EXPECT_EQ( m->getElement( 1, 5 ), 13 );
   EXPECT_EQ( m->getElement( 1, 6 ), 14 );

   EXPECT_EQ( m->getElement( 2, 0 ), 15 );
   EXPECT_EQ( m->getElement( 2, 1 ), 16 );
   EXPECT_EQ( m->getElement( 2, 2 ), 33 );
   EXPECT_EQ( m->getElement( 2, 3 ), 33 );
   EXPECT_EQ( m->getElement( 2, 4 ), 33 );
   EXPECT_EQ( m->getElement( 2, 5 ), 33 );
   EXPECT_EQ( m->getElement( 2, 6 ), 33 );
}

template< typename Matrix >
@@ -583,54 +643,53 @@ void test_AddRow()
    *    | 21 22 23 24 25 |
    *    \ 26 27 28 29 30 /
    */

   const IndexType rows = 6;
   const IndexType cols = 5;

    Matrix m;
    m.reset();
    m.setDimensions( rows, cols );
   TNL::Pointers::SharedPointer< Matrix > m( rows, cols );

   RealType value = 1;
   for( IndexType i = 0; i < rows; i++ )
      for( IndexType j = 0; j < cols; j++ )
            m.setElement( i, j, value++ );
         m->setElement( i, j, value++ );

   // Check the added elements
    EXPECT_EQ( m.getElement( 0, 0 ),  1 );
    EXPECT_EQ( m.getElement( 0, 1 ),  2 );
    EXPECT_EQ( m.getElement( 0, 2 ),  3 );
    EXPECT_EQ( m.getElement( 0, 3 ),  4 );
    EXPECT_EQ( m.getElement( 0, 4 ),  5 );
    
    EXPECT_EQ( m.getElement( 1, 0 ),  6 );
    EXPECT_EQ( m.getElement( 1, 1 ),  7 );
    EXPECT_EQ( m.getElement( 1, 2 ),  8 );
    EXPECT_EQ( m.getElement( 1, 3 ),  9 );
    EXPECT_EQ( m.getElement( 1, 4 ), 10 );
    
    EXPECT_EQ( m.getElement( 2, 0 ), 11 );
    EXPECT_EQ( m.getElement( 2, 1 ), 12 );
    EXPECT_EQ( m.getElement( 2, 2 ), 13 );
    EXPECT_EQ( m.getElement( 2, 3 ), 14 );
    EXPECT_EQ( m.getElement( 2, 4 ), 15 );
    
    EXPECT_EQ( m.getElement( 3, 0 ), 16 );
    EXPECT_EQ( m.getElement( 3, 1 ), 17 );
    EXPECT_EQ( m.getElement( 3, 2 ), 18 );
    EXPECT_EQ( m.getElement( 3, 3 ), 19 );
    EXPECT_EQ( m.getElement( 3, 4 ), 20 );
    
    EXPECT_EQ( m.getElement( 4, 0 ), 21 );
    EXPECT_EQ( m.getElement( 4, 1 ), 22 );
    EXPECT_EQ( m.getElement( 4, 2 ), 23 );
    EXPECT_EQ( m.getElement( 4, 3 ), 24 );
    EXPECT_EQ( m.getElement( 4, 4 ), 25 );
    
    EXPECT_EQ( m.getElement( 5, 0 ), 26 );
    EXPECT_EQ( m.getElement( 5, 1 ), 27 );
    EXPECT_EQ( m.getElement( 5, 2 ), 28 );
    EXPECT_EQ( m.getElement( 5, 3 ), 29 );
    EXPECT_EQ( m.getElement( 5, 4 ), 30 );
   EXPECT_EQ( m->getElement( 0, 0 ),  1 );
   EXPECT_EQ( m->getElement( 0, 1 ),  2 );
   EXPECT_EQ( m->getElement( 0, 2 ),  3 );
   EXPECT_EQ( m->getElement( 0, 3 ),  4 );
   EXPECT_EQ( m->getElement( 0, 4 ),  5 );

   EXPECT_EQ( m->getElement( 1, 0 ),  6 );
   EXPECT_EQ( m->getElement( 1, 1 ),  7 );
   EXPECT_EQ( m->getElement( 1, 2 ),  8 );
   EXPECT_EQ( m->getElement( 1, 3 ),  9 );
   EXPECT_EQ( m->getElement( 1, 4 ), 10 );

   EXPECT_EQ( m->getElement( 2, 0 ), 11 );
   EXPECT_EQ( m->getElement( 2, 1 ), 12 );
   EXPECT_EQ( m->getElement( 2, 2 ), 13 );
   EXPECT_EQ( m->getElement( 2, 3 ), 14 );
   EXPECT_EQ( m->getElement( 2, 4 ), 15 );

   EXPECT_EQ( m->getElement( 3, 0 ), 16 );
   EXPECT_EQ( m->getElement( 3, 1 ), 17 );
   EXPECT_EQ( m->getElement( 3, 2 ), 18 );
   EXPECT_EQ( m->getElement( 3, 3 ), 19 );
   EXPECT_EQ( m->getElement( 3, 4 ), 20 );

   EXPECT_EQ( m->getElement( 4, 0 ), 21 );
   EXPECT_EQ( m->getElement( 4, 1 ), 22 );
   EXPECT_EQ( m->getElement( 4, 2 ), 23 );
   EXPECT_EQ( m->getElement( 4, 3 ), 24 );
   EXPECT_EQ( m->getElement( 4, 4 ), 25 );

   EXPECT_EQ( m->getElement( 5, 0 ), 26 );
   EXPECT_EQ( m->getElement( 5, 1 ), 27 );
   EXPECT_EQ( m->getElement( 5, 2 ), 28 );
   EXPECT_EQ( m->getElement( 5, 3 ), 29 );
   EXPECT_EQ( m->getElement( 5, 4 ), 30 );

   // Add new elements to the old elements with a multiplying factor applied to the old elements.
   /*
@@ -663,41 +722,61 @@ void test_AddRow()
    m.addRow( row++, colIndexes4, row4, elements, thisRowMultiplicator++ );
    m.addRow( row++, colIndexes5, row5, elements, thisRowMultiplicator++ );*/

    EXPECT_EQ( m.getElement( 0, 0 ),  11 );
    EXPECT_EQ( m.getElement( 0, 1 ),  11 );
    EXPECT_EQ( m.getElement( 0, 2 ),  11 );
    EXPECT_EQ( m.getElement( 0, 3 ),  11 );
    EXPECT_EQ( m.getElement( 0, 4 ),   0 );
    
    EXPECT_EQ( m.getElement( 1, 0 ),  28 );
    EXPECT_EQ( m.getElement( 1, 1 ),  29 );
    EXPECT_EQ( m.getElement( 1, 2 ),  30 );
    EXPECT_EQ( m.getElement( 1, 3 ),  31 );
    EXPECT_EQ( m.getElement( 1, 4 ),  10 );
    
    EXPECT_EQ( m.getElement( 2, 0 ),  55 );
    EXPECT_EQ( m.getElement( 2, 1 ),  57 );
    EXPECT_EQ( m.getElement( 2, 2 ),  59 );
    EXPECT_EQ( m.getElement( 2, 3 ),  61 );
    EXPECT_EQ( m.getElement( 2, 4 ),  30 );
    
    EXPECT_EQ( m.getElement( 3, 0 ),  92 );
    EXPECT_EQ( m.getElement( 3, 1 ),  95 );
    EXPECT_EQ( m.getElement( 3, 2 ),  98 );
    EXPECT_EQ( m.getElement( 3, 3 ), 101 );
    EXPECT_EQ( m.getElement( 3, 4 ),  60 );
    
    EXPECT_EQ( m.getElement( 4, 0 ), 139 );
    EXPECT_EQ( m.getElement( 4, 1 ), 143 );
    EXPECT_EQ( m.getElement( 4, 2 ), 147 );
    EXPECT_EQ( m.getElement( 4, 3 ), 151 );
    EXPECT_EQ( m.getElement( 4, 4 ), 100 );
    
    EXPECT_EQ( m.getElement( 5, 0 ), 196 );
    EXPECT_EQ( m.getElement( 5, 1 ), 201 );
    EXPECT_EQ( m.getElement( 5, 2 ), 206 );
    EXPECT_EQ( m.getElement( 5, 3 ), 211 );
    EXPECT_EQ( m.getElement( 5, 4 ), 150 );
   Matrix* m_ptr = &m.template modifyData< DeviceType >();
   auto f = [=] __cuda_callable__ ( IndexType rowIdx ) mutable {
      RealType values[ 6 ][ 5 ] {
         { 11, 11, 11, 11, 0 },
         { 22, 22, 22, 22, 0 },
         { 33, 33, 33, 33, 0 },
         { 44, 44, 44, 44, 0 },
         { 55, 55, 55, 55, 0 },
         { 66, 66, 66, 66, 0 } };
      auto row = m_ptr->getRow( rowIdx );
      for( IndexType i = 0; i < 5; i++ )
      {
         RealType& val = row.getValue( i );
         val = rowIdx * val + values[ rowIdx ][ i ];
      }
   };
   TNL::Pointers::synchronizeSmartPointersOnDevice< DeviceType >();
   TNL::Algorithms::ParallelFor< DeviceType >::exec( 0, 6, f );

    
    EXPECT_EQ( m->getElement( 0, 0 ),  11 );
    EXPECT_EQ( m->getElement( 0, 1 ),  11 );
    EXPECT_EQ( m->getElement( 0, 2 ),  11 );
    EXPECT_EQ( m->getElement( 0, 3 ),  11 );
    EXPECT_EQ( m->getElement( 0, 4 ),   0 );
    
    EXPECT_EQ( m->getElement( 1, 0 ),  28 );
    EXPECT_EQ( m->getElement( 1, 1 ),  29 );
    EXPECT_EQ( m->getElement( 1, 2 ),  30 );
    EXPECT_EQ( m->getElement( 1, 3 ),  31 );
    EXPECT_EQ( m->getElement( 1, 4 ),  10 );
    
    EXPECT_EQ( m->getElement( 2, 0 ),  55 );
    EXPECT_EQ( m->getElement( 2, 1 ),  57 );
    EXPECT_EQ( m->getElement( 2, 2 ),  59 );
    EXPECT_EQ( m->getElement( 2, 3 ),  61 );
    EXPECT_EQ( m->getElement( 2, 4 ),  30 );
    
    EXPECT_EQ( m->getElement( 3, 0 ),  92 );
    EXPECT_EQ( m->getElement( 3, 1 ),  95 );
    EXPECT_EQ( m->getElement( 3, 2 ),  98 );
    EXPECT_EQ( m->getElement( 3, 3 ), 101 );
    EXPECT_EQ( m->getElement( 3, 4 ),  60 );
    
    EXPECT_EQ( m->getElement( 4, 0 ), 139 );
    EXPECT_EQ( m->getElement( 4, 1 ), 143 );
    EXPECT_EQ( m->getElement( 4, 2 ), 147 );
    EXPECT_EQ( m->getElement( 4, 3 ), 151 );
    EXPECT_EQ( m->getElement( 4, 4 ), 100 );
    
    EXPECT_EQ( m->getElement( 5, 0 ), 196 );
    EXPECT_EQ( m->getElement( 5, 1 ), 201 );
    EXPECT_EQ( m->getElement( 5, 2 ), 206 );
    EXPECT_EQ( m->getElement( 5, 3 ), 211 );
    EXPECT_EQ( m->getElement( 5, 4 ), 150 );
}

template< typename Matrix >
@@ -1352,12 +1431,12 @@ TYPED_TEST( MatrixTest, addRowTest )
    test_AddRow< MatrixType >();
}

TYPED_TEST( MatrixTest, vectorProductTest )
/*TYPED_TEST( MatrixTest, vectorProductTest )
{
    using MatrixType = typename TestFixture::MatrixType;
    
    test_VectorProduct< MatrixType >();
}
}*/

TYPED_TEST( MatrixTest, addMatrixTest )
{
@@ -1499,6 +1578,6 @@ TEST( DenseMatrixTest, Dense_performSORIterationTest_Cuda )
}
#endif

#endif
#endif // HAVE_GTEST

#include "../main.h"