Skip to content
Snippets Groups Projects
VectorTest-3.h 6.13 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***************************************************************************
    
                              VectorTest-3.h  -  description
    
                                 -------------------
        begin                : Oct 25, 2010
        copyright            : (C) 2010 by Tomas Oberhuber
        email                : tomas.oberhuber@fjfi.cvut.cz
     ***************************************************************************/
    
    /* See Copyright Notice in tnl/Copyright */
    
    // NOTE: Vector = Array + VectorOperations, so we test Vector and VectorOperations at the same time
    
    #pragma once
    
    #ifdef HAVE_GTEST
    #include <limits>
    
    #include <TNL/Experimental/Arithmetics/Quad.h>
    #include <TNL/Containers/Vector.h>
    #include <TNL/Containers/VectorView.h>
    #include "VectorTestSetup.h"
    
    #include "gtest/gtest.h"
    
    using namespace TNL;
    using namespace TNL::Containers;
    using namespace TNL::Containers::Algorithms;
    using namespace TNL::Arithmetics;
    
    // should be small enough to have fast tests, but larger than minGPUReductionDataSize
    // and large enough to require multiple CUDA blocks for reduction
    constexpr int VECTOR_TEST_SIZE = 5000;
    
    TYPED_TEST( VectorTest, differenceAbsMin )
    {
       using VectorType = typename TestFixture::VectorType;
       using VectorOperations = typename TestFixture::VectorOperations;
       using ViewType = typename TestFixture::ViewType;
       const int size = VECTOR_TEST_SIZE;
    
       VectorType u( size ), v( size );
       ViewType u_view( u ), v_view( v );
       setNegativeLinearSequence( u );
       setConstantSequence( v, - size / 2 );
    
       EXPECT_EQ( u.differenceAbsMin( v ), 0 );
       EXPECT_EQ( u_view.differenceAbsMin( v_view ), 0 );
       EXPECT_EQ( VectorOperations::getVectorDifferenceAbsMin( u, v ), 0 );
       EXPECT_EQ( v.differenceAbsMin( u ), 0 );
       EXPECT_EQ( v_view.differenceAbsMin( u_view ), 0 );
       EXPECT_EQ( VectorOperations::getVectorDifferenceAbsMin( v, u ), 0 );
    }
    
    TYPED_TEST( VectorTest, differenceLpNorm )
    {
       using VectorType = typename TestFixture::VectorType;
       using RealType = typename VectorType::RealType;
       using VectorOperations = typename TestFixture::VectorOperations;
       using ViewType = typename TestFixture::ViewType;
       const int size = VECTOR_TEST_SIZE;
       const RealType epsilon = 64 * std::numeric_limits< RealType >::epsilon();
    
       VectorType u( size ), v( size );
       ViewType u_view( u ), v_view( v );
       u.setValue( 3.0 );
       v.setValue( 1.0 );
    
       const RealType expectedL1norm = 2.0 * size;
       const RealType expectedL2norm = std::sqrt( 4.0 * size );
       const RealType expectedL3norm = std::cbrt( 8.0 * size );
       EXPECT_EQ( u.differenceLpNorm( v, 1.0 ), expectedL1norm );
       EXPECT_EQ( u.differenceLpNorm( v, 2.0 ), expectedL2norm );
       EXPECT_NEAR( u.differenceLpNorm( v, 3.0 ), expectedL3norm, epsilon );
       EXPECT_EQ( u_view.differenceLpNorm( v_view, 1.0 ), expectedL1norm );
       EXPECT_EQ( u_view.differenceLpNorm( v_view, 2.0 ), expectedL2norm );
       EXPECT_NEAR( u_view.differenceLpNorm( v_view, 3.0 ), expectedL3norm, epsilon );
       EXPECT_EQ( VectorOperations::getVectorDifferenceLpNorm( u, v, 1.0 ), expectedL1norm );
       EXPECT_EQ( VectorOperations::getVectorDifferenceLpNorm( u, v, 2.0 ), expectedL2norm );
       EXPECT_NEAR( VectorOperations::getVectorDifferenceLpNorm( u, v, 3.0 ), expectedL3norm, epsilon );
    }
    
    TYPED_TEST( VectorTest, differenceSum )
    {
       using VectorType = typename TestFixture::VectorType;
       using VectorOperations = typename TestFixture::VectorOperations;
       using ViewType = typename TestFixture::ViewType;
       // this test expect an even size
       const int size = VECTOR_TEST_SIZE % 2 ? VECTOR_TEST_SIZE - 1 : VECTOR_TEST_SIZE;
    
       VectorType u( size ), v( size );
       ViewType u_view( u ), v_view( v );
       v.setValue( 1.0 );
    
       setConstantSequence( u, 2 );
       EXPECT_EQ( u.differenceSum( v ), size );
       EXPECT_EQ( u_view.differenceSum( v_view ), size );
       EXPECT_EQ( VectorOperations::getVectorDifferenceSum( u, v ), size );
    
       setLinearSequence( u );
       EXPECT_EQ( u.differenceSum( v ), 0.5 * size * ( size - 1 ) - size );
       EXPECT_EQ( u_view.differenceSum( v_view ), 0.5 * size * ( size - 1 ) - size );
       EXPECT_EQ( VectorOperations::getVectorDifferenceSum( u, v ), 0.5 * size * ( size - 1 ) - size );
    
       setNegativeLinearSequence( u );
       EXPECT_EQ( u.differenceSum( v ), - 0.5 * size * ( size - 1 ) - size );
       EXPECT_EQ( u_view.differenceSum( v_view ), - 0.5 * size * ( size - 1 ) - size );
       EXPECT_EQ( VectorOperations::getVectorDifferenceSum( u, v ), - 0.5 * size * ( size - 1 ) - size );
    
       setOscilatingSequence( u, 1.0 );
       EXPECT_EQ( u.differenceSum( v ), - size );
       EXPECT_EQ( u_view.differenceSum( v_view ), - size );
       EXPECT_EQ( VectorOperations::getVectorDifferenceSum( u, v ), - size );
    }
    
    TYPED_TEST( VectorTest, scalarMultiplication )
    {
       using VectorType = typename TestFixture::VectorType;
       using VectorOperations = typename TestFixture::VectorOperations;
       using ViewType = typename TestFixture::ViewType;
       const int size = VECTOR_TEST_SIZE;
    
       VectorType u( size );
       ViewType u_view( u );
    
       typename VectorType::HostType expected;
       expected.setSize( size );
       for( int i = 0; i < size; i++ )
          expected[ i ] = 2.0 * i;
    
       setLinearSequence( u );
       VectorOperations::vectorScalarMultiplication( u, 2.0 );
       EXPECT_EQ( u, expected );
    
       setLinearSequence( u );
       u.scalarMultiplication( 2.0 );
       EXPECT_EQ( u, expected );
    
       setLinearSequence( u );
       u_view.scalarMultiplication( 2.0 );
       EXPECT_EQ( u, expected );
    
       setLinearSequence( u );
       u *= 2.0;
       EXPECT_EQ( u, expected );
    
       setLinearSequence( u );
       u_view *= 2.0;
       EXPECT_EQ( u, expected );
    }
    
    TYPED_TEST( VectorTest, scalarProduct )
    {
       using VectorType = typename TestFixture::VectorType;
       using VectorOperations = typename TestFixture::VectorOperations;
       using ViewType = typename TestFixture::ViewType;
       // this test expects an odd size
       const int size = VECTOR_TEST_SIZE % 2 ? VECTOR_TEST_SIZE : VECTOR_TEST_SIZE - 1;
    
       VectorType u( size ), v( size );
       ViewType u_view( u ), v_view( v );
       setOscilatingSequence( u, 1.0 );
       setConstantSequence( v, 1 );
    
       EXPECT_EQ( u.scalarProduct( v ), 1.0 );
       EXPECT_EQ( u_view.scalarProduct( v_view ), 1.0 );
       EXPECT_EQ( VectorOperations::getScalarProduct( u, v ), 1.0 );
    }
    
    #endif // HAVE_GTEST