Walker test code coverage report
Current view: top level - RNGTest - TestU01Stack.cpp (source / functions) Hit Total Coverage
Commit: test_coverage.info Lines: 97 217 44.7 %
Date: 2022-09-21 18:57:21 Functions: 22 59 37.3 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 62 188 33.0 %

           Branch data     Line data    Source code
       1                 :            : // *****************************************************************************
       2                 :            : /*!
       3                 :            :   \file      src/RNGTest/TestU01Stack.cpp
       4                 :            :   \copyright 2012-2015 J. Bakosi,
       5                 :            :              2016-2018 Los Alamos National Security, LLC.,
       6                 :            :              2019-2021 Triad National Security, LLC.
       7                 :            :              All rights reserved. See the LICENSE file for details.
       8                 :            :   \brief     Stack of TestU01 RNG statistical tests
       9                 :            :   \details   Stack of TestU01 RNG statistical tests
      10                 :            : */
      11                 :            : // *****************************************************************************
      12                 :            : 
      13                 :            : #include <array>
      14                 :            : #include <iterator>
      15                 :            : #include <memory>
      16                 :            : #include <utility>
      17                 :            : #include <cfenv>
      18                 :            : 
      19                 :            : #include "Tags.hpp"
      20                 :            : #include "Exception.hpp"
      21                 :            : #include "TestU01Stack.hpp"
      22                 :            : #include "TestU01Wrappers.hpp"
      23                 :            : #include "RNGTest/InputDeck/InputDeck.hpp"
      24                 :            : #include "WalkerBuildConfig.hpp"
      25                 :            : 
      26                 :            : extern "C" {
      27                 :            :   #include <svaria.h>
      28                 :            :   #include <gofw.h>
      29                 :            :   #include <snpair.h>
      30                 :            : }
      31                 :            : 
      32                 :            : namespace rngtest {
      33                 :            : 
      34                 :            : extern ctr::InputDeck g_inputdeck;
      35                 :            : 
      36                 :            : } // rngtest::
      37                 :            : 
      38                 :            : using rngtest::TestU01Stack;
      39                 :            : 
      40                 :         32 : TestU01Stack::TestU01Stack() : m_generator()
      41                 :            : // *****************************************************************************
      42                 :            : //  Constructor
      43                 :            : //! \details Associate RNGs to global-scope wrappers. Admittedly, this code is
      44                 :            : //!   ugly and looks stupid at first sight. However, this is a translation of
      45                 :            : //!   runtime information (user-selected RNGs) to compile-time information:
      46                 :            : //!   associating RNG ids from an enum class, tk::ctr::RNGType::value, to a
      47                 :            : //!   compile-time constant, underlying_type value, facilitating a different
      48                 :            : //!   pair of global-scope RNG wrappers (uniform and uniform_bits) with code
      49                 :            : //!   reuse. Note that uniform and uniform_bits wrappers must be global-scope as
      50                 :            : //!   they are used as external generators to TestU01. Templating them on the
      51                 :            : //!   id enables the compiler generate a different wrapper for a different RNG
      52                 :            : //!   facilitating simultaneous calls to any or all wrappers as they are unique
      53                 :            : //!   functions.
      54                 :            : // *****************************************************************************
      55                 :            : {
      56         [ +  + ]:         80 :   for (const auto& r : g_inputdeck.get< tag::selected, tag::rng >()) {
      57                 :            :     using tk::ctr::RNGType;
      58                 :            :     using tk::ctr::raw;
      59                 :            :     #ifdef HAS_MKL
      60         [ +  + ]:         48 :     if (r == RNGType::MKL_MCG31)
      61         [ +  - ]:          8 :       addRNG< raw(RNGType::MKL_MCG31) >( r );
      62         [ -  + ]:         40 :     else if (r == RNGType::MKL_R250)
      63         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_R250) >( r );
      64         [ -  + ]:         40 :     else if (r == RNGType::MKL_MRG32K3A)
      65         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_MRG32K3A) >( r );
      66         [ +  + ]:         40 :     else if (r == RNGType::MKL_MCG59)
      67         [ +  - ]:          4 :       addRNG< raw(RNGType::MKL_MCG59) >( r );
      68         [ +  + ]:         36 :     else if (r == RNGType::MKL_WH)
      69         [ +  - ]:          4 :       addRNG< raw(RNGType::MKL_WH) >( r );
      70         [ -  + ]:         32 :     else if (r == RNGType::MKL_MT19937)
      71         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_MT19937) >( r );
      72         [ -  + ]:         32 :     else if (r == RNGType::MKL_MT2203)
      73         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_MT2203) >( r );
      74         [ -  + ]:         32 :     else if (r == RNGType::MKL_SFMT19937)
      75         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_SFMT19937) >( r );
      76         [ -  + ]:         32 :     else if (r == RNGType::MKL_SOBOL)
      77         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_SOBOL) >( r );
      78         [ -  + ]:         32 :     else if (r == RNGType::MKL_NIEDERR)
      79         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_NIEDERR) >( r );
      80                 :            :     //else if (r == RNGType::MKL_IABSTRACT)
      81                 :            :     //  addRNG< raw(RNGType::MKL_IABSTRACT) >( r );
      82                 :            :     //else if (r == RNGType::MKL_DABSTRACT)
      83                 :            :     //  addRNG< raw(RNGType::MKL_DABSTRACT) >( r );
      84                 :            :     //else if (r == RNGType::MKL_SABSTRACT)
      85                 :            :     //  addRNG< raw(RNGType::MKL_SABSTRACT) >( r );
      86         [ -  + ]:         32 :     else if (r == RNGType::MKL_NONDETERM)
      87         [ -  - ]:          0 :       addRNG< raw(RNGType::MKL_NONDETERM) >( r );
      88                 :            :     else
      89                 :            :     #endif
      90                 :            :     #ifdef HAS_RNGSSE2
      91         [ -  + ]:         32 :     if (r == RNGType::RNGSSE_GM19)
      92         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_GM19) >( r );
      93         [ -  + ]:         32 :     else if (r == RNGType::RNGSSE_GM29)    
      94         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_GM29) >( r );
      95         [ +  + ]:         32 :     else if (r == RNGType::RNGSSE_GM31)    
      96         [ +  - ]:          4 :       addRNG< raw(RNGType::RNGSSE_GM31) >( r );
      97         [ +  + ]:         28 :     else if (r == RNGType::RNGSSE_GM55)    
      98         [ +  - ]:          4 :       addRNG< raw(RNGType::RNGSSE_GM55) >( r );
      99         [ -  + ]:         24 :     else if (r == RNGType::RNGSSE_GM61)    
     100         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_GM61) >( r );
     101         [ +  + ]:         24 :     else if (r == RNGType::RNGSSE_GQ581)   
     102         [ +  - ]:          4 :       addRNG< raw(RNGType::RNGSSE_GQ581) >( r );
     103         [ -  + ]:         20 :     else if (r == RNGType::RNGSSE_GQ583)   
     104         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_GQ583) >( r );
     105         [ -  + ]:         20 :     else if (r == RNGType::RNGSSE_GQ584)   
     106         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_GQ584) >( r );
     107         [ -  + ]:         20 :     else if (r == RNGType::RNGSSE_MT19937) 
     108         [ -  - ]:          0 :       addRNG< raw(RNGType::RNGSSE_MT19937) >( r );
     109         [ +  + ]:         20 :     else if (r == RNGType::RNGSSE_LFSR113) 
     110         [ +  - ]:          4 :       addRNG< raw(RNGType::RNGSSE_LFSR113) >( r );
     111         [ +  + ]:         16 :     else if (r == RNGType::RNGSSE_MRG32K3A)
     112         [ +  - ]:          4 :       addRNG< raw(RNGType::RNGSSE_MRG32K3A) >( r );
     113                 :            :     else
     114                 :            :     #endif
     115         [ +  + ]:         12 :     if (r == RNGType::R123_THREEFRY)
     116         [ +  - ]:          4 :       addRNG< raw(RNGType::R123_THREEFRY) >( r );
     117         [ +  - ]:          8 :     else if (r == RNGType::R123_PHILOX)
     118         [ +  - ]:          8 :       addRNG< raw(RNGType::R123_PHILOX) >( r );
     119                 :            :   }
     120                 :         32 : }
     121                 :            : 
     122                 :            : template< tk::ctr::RawRNGType id >
     123                 :         48 : void TestU01Stack::addRNG( tk::ctr::RNGType r )
     124                 :            : // *****************************************************************************
     125                 :            : //! Create TestU01 RNG wrapper
     126                 :            : //! \param[in] r RNG ID enum
     127                 :            : // *****************************************************************************
     128                 :            : {
     129         [ +  - ]:         48 :   m_generator.emplace( r,
     130 [ +  - ][ +  - ]:         96 :     Gen01Ptr( createTestU01Gen<id>( tk::ctr::RNG().name(r) ) ) );
     131                 :         48 : }
     132                 :            : 
     133                 :            : unif01_Gen*
     134                 :        132 : TestU01Stack::generator( tk::ctr::RNGType r ) const
     135                 :            : // *****************************************************************************
     136                 :            : //! Find TestU01 RNG wrapper based on RNG id
     137                 :            : //! \param[in] r RNG ID enum
     138                 :            : //! \return Raw function pointer to TestU01 statistical test
     139                 :            : // *****************************************************************************
     140                 :            : {
     141         [ +  - ]:        132 :   const auto& gen = m_generator.find( r );
     142 [ -  + ][ -  - ]:        132 :   if (gen == end(m_generator)) Throw( "RNG not found" );
         [ -  - ][ -  - ]
     143                 :        264 :   return gen->second.get();
     144                 :            : }
     145                 :            : 
     146                 :            : std::vector< double >
     147                 :         12 : TestU01Stack::BirthdaySpacings( unif01_Gen* gen, sres_Poisson* res,
     148                 :            :   const std::tuple<long, long, int, long, int, int>& xargs )
     149                 :            : // *****************************************************************************
     150                 :            : //  Run Marsaglia's BirthdaySpacings test
     151                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     152                 :            : //! \param[in] res Pointer to test results object
     153                 :            : //! \param[in] xargs Test arguments
     154                 :            : //! \return Vector p-values as a result of the statistical test
     155                 :            : // *****************************************************************************
     156                 :            : {
     157                 :            :   using std::get;
     158                 :            : 
     159                 :            :   fenv_t fe;
     160                 :         12 :   feholdexcept( &fe );
     161                 :            : 
     162         [ +  - ]:         12 :   smarsa_BirthdaySpacings( gen, res, get<0>(xargs), get<1>(xargs),
     163                 :         12 :                            get<2>(xargs), get<3>(xargs), get<4>(xargs),
     164                 :         12 :                            get<5>(xargs) );
     165                 :            : 
     166                 :         12 :   feclearexcept( FE_UNDERFLOW );
     167                 :         12 :   feupdateenv( &fe );
     168                 :            : 
     169         [ +  - ]:         24 :   return { res->pVal2 };
     170                 :            : }
     171                 :            : 
     172                 :            : std::vector< double >
     173                 :         12 : TestU01Stack::Collision( unif01_Gen* gen, sknuth_Res2* res,
     174                 :            :   const std::tuple<long, long, int, long, int>& xargs )
     175                 :            : // *****************************************************************************
     176                 :            : //  Run Knuth's Collision test
     177                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     178                 :            : //! \param[in] res Pointer to test results object
     179                 :            : //! \param[in] xargs Test arguments
     180                 :            : //! \return Vector p-values as a result of the statistical test
     181                 :            : // *****************************************************************************
     182                 :            : {
     183                 :            :   using std::get;
     184                 :         12 :   sknuth_Collision( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     185                 :         12 :                     get<3>(xargs), get<4>(xargs) );
     186         [ +  - ]:         24 :   return { res->Pois->pVal2 };
     187                 :            : }
     188                 :            : 
     189                 :            : std::vector< double >
     190                 :         12 : TestU01Stack::Gap( unif01_Gen* gen, sres_Chi2* res,
     191                 :            :   const std::tuple<long, long, int, double, double>& xargs )
     192                 :            : // *****************************************************************************
     193                 :            : //  Run Knuth's Gap test
     194                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     195                 :            : //! \param[in] res Pointer to test results object
     196                 :            : //! \param[in] xargs Test arguments
     197                 :            : //! \return Vector p-values as a result of the statistical test
     198                 :            : // *****************************************************************************
     199                 :            : {
     200                 :            :   using std::get;
     201                 :         12 :   sknuth_Gap( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     202                 :         12 :               get<3>(xargs), get<4>(xargs) );
     203         [ +  - ]:         24 :   return { res->pVal2[gofw_Mean] };
     204                 :            : }
     205                 :            : 
     206                 :            : std::vector< double >
     207                 :         12 : TestU01Stack::SimplePoker( unif01_Gen* gen, sres_Chi2* res,
     208                 :            :   const std::tuple<long, long, int, int, int>& xargs )
     209                 :            : // *****************************************************************************
     210                 :            : //  Run Knuth's Simplified Poker test
     211                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     212                 :            : //! \param[in] res Pointer to test results object
     213                 :            : //! \param[in] xargs Test arguments
     214                 :            : //! \return Vector p-values as a result of the statistical test
     215                 :            : // *****************************************************************************
     216                 :            : {
     217                 :            :   using std::get;
     218                 :         12 :   sknuth_SimpPoker( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     219                 :         12 :                     get<3>(xargs), get<4>(xargs) );
     220         [ +  - ]:         24 :   return { res->pVal2[gofw_Mean] };
     221                 :            : }
     222                 :            : 
     223                 :            : std::vector< double >
     224                 :         12 : TestU01Stack::CouponCollector( unif01_Gen* gen, sres_Chi2* res,
     225                 :            :   const std::tuple<long, long, int, int>& xargs )
     226                 :            : // *****************************************************************************
     227                 :            : //  Run Knuth's Coupon Collector test
     228                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     229                 :            : //! \param[in] res Pointer to test results object
     230                 :            : //! \param[in] xargs Test arguments
     231                 :            : //! \return Vector p-values as a result of the statistical test
     232                 :            : // *****************************************************************************
     233                 :            : {
     234                 :            :   using std::get;
     235                 :         12 :   sknuth_CouponCollector( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     236                 :         12 :                           get<3>(xargs) );
     237         [ +  - ]:         24 :   return { res->pVal2[gofw_Mean] };
     238                 :            : }
     239                 :            : 
     240                 :            : std::vector< double >
     241                 :         12 : TestU01Stack::MaxOft( unif01_Gen* gen, sknuth_Res1* res,
     242                 :            :   const std::tuple<long, long, int, int, int, int, int>& xargs )
     243                 :            : // *****************************************************************************
     244                 :            : //  Run Knuth's Maximum-of-t test
     245                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     246                 :            : //! \param[in] res Pointer to test results object
     247                 :            : //! \param[in] xargs Test arguments
     248                 :            : //! \return Vector p-values as a result of the statistical test
     249                 :            : // *****************************************************************************
     250                 :            : {
     251                 :            :   using std::get;
     252                 :         12 :   sknuth_MaxOft( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     253                 :         12 :                  get<3>(xargs), get<4>(xargs) );
     254                 :         12 :   return { res->Chi->pVal2[get<5>(xargs)],
     255         [ +  - ]:         24 :            res->Bas->pVal2[get<6>(xargs)] };
     256                 :            : }
     257                 :            : 
     258                 :            : std::vector< double >
     259                 :         12 : TestU01Stack::WeightDistrib( unif01_Gen* gen, sres_Chi2* res,
     260                 :            :   const std::tuple<long, long, int, long, double, double>& xargs )
     261                 :            : // *****************************************************************************
     262                 :            : //  Run Matsumoto's Weight Distribution test
     263                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     264                 :            : //! \param[in] res Pointer to test results object
     265                 :            : //! \param[in] xargs Test arguments
     266                 :            : //! \return Vector p-values as a result of the statistical test
     267                 :            : // *****************************************************************************
     268                 :            : {
     269                 :            :   using std::get;
     270                 :         12 :   svaria_WeightDistrib( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     271                 :         12 :                         get<3>(xargs), get<4>(xargs), get<5>(xargs) );
     272         [ +  - ]:         24 :   return { res->pVal2[gofw_Mean] };
     273                 :            : }
     274                 :            : 
     275                 :            : std::vector< double >
     276                 :         12 : TestU01Stack::MatrixRank( unif01_Gen* gen, sres_Chi2* res,
     277                 :            :   const std::tuple<long, long, int, int, int, int>& xargs )
     278                 :            : // *****************************************************************************
     279                 :            : //  Run Marsaglia's Matrix Rank test
     280                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     281                 :            : //! \param[in] res Pointer to test results object
     282                 :            : //! \param[in] xargs Test arguments
     283                 :            : //! \return Vector p-values as a result of the statistical test
     284                 :            : // *****************************************************************************
     285                 :            : {
     286                 :            :   using std::get;
     287                 :            : 
     288                 :            :   fenv_t fe;
     289                 :         12 :   feholdexcept( &fe );
     290                 :            : 
     291         [ +  - ]:         12 :   smarsa_MatrixRank( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     292                 :         12 :                      get<3>(xargs), get<4>(xargs), get<5>(xargs) );
     293                 :            : 
     294                 :         12 :   feclearexcept( FE_UNDERFLOW );
     295                 :         12 :   feupdateenv( &fe );
     296                 :            : 
     297         [ +  - ]:         24 :   return { res->pVal2[gofw_Mean] };
     298                 :            : }
     299                 :            : 
     300                 :            : std::vector< double >
     301                 :         12 : TestU01Stack::HammingIndep( unif01_Gen* gen, sstring_Res* res,
     302                 :            :   const std::tuple<long, long, int, int, int, int>& xargs )
     303                 :            : // *****************************************************************************
     304                 :            : //  Run L'Ecuyer's Hamming Independence test
     305                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     306                 :            : //! \param[in] res Pointer to test results object
     307                 :            : //! \param[in] xargs Test arguments
     308                 :            : //! \return Vector p-values as a result of the statistical test
     309                 :            : // *****************************************************************************
     310                 :            : {
     311                 :            :   using std::get;
     312                 :         12 :   sstring_HammingIndep( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     313                 :         12 :                         get<3>(xargs), get<4>(xargs), get<5>(xargs) );
     314         [ +  - ]:         24 :   return { res->Bas->pVal2[gofw_Mean] };
     315                 :            : }
     316                 :            : 
     317                 :            : std::vector< double >
     318                 :         12 : TestU01Stack::RandomWalk1( unif01_Gen* gen, swalk_Res* res,
     319                 :            :   const std::tuple<long, long, int, int, long, long>& xargs )
     320                 :            : // *****************************************************************************
     321                 :            : //  Run Random Walk 1 test
     322                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     323                 :            : //! \param[in] res Pointer to test results object
     324                 :            : //! \param[in] xargs Test arguments
     325                 :            : //! \return Vector p-values as a result of the statistical test
     326                 :            : // *****************************************************************************
     327                 :            : {
     328                 :            :   using std::get;
     329                 :         12 :   swalk_RandomWalk1( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     330                 :         12 :                      get<3>(xargs), get<4>(xargs), get<5>(xargs) );
     331                 :         12 :   return { res->H[0]->pVal2[gofw_Mean],
     332                 :         12 :            res->M[0]->pVal2[gofw_Mean],
     333                 :         12 :            res->J[0]->pVal2[gofw_Mean],
     334                 :         12 :            res->R[0]->pVal2[gofw_Mean],
     335         [ +  - ]:         24 :            res->C[0]->pVal2[gofw_Mean] };
     336                 :            : }
     337                 :            : 
     338                 :            : std::vector< double >
     339                 :          0 : TestU01Stack::SerialOver( unif01_Gen* gen, sres_Basic* res,
     340                 :            :   const std::tuple<long, long, int, long, int>& xargs )
     341                 :            : // *****************************************************************************
     342                 :            : //  Run Marsaglia's Serial Over test, t = 2
     343                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     344                 :            : //! \param[in] res Pointer to test results object
     345                 :            : //! \param[in] xargs Test arguments
     346                 :            : //! \return Vector p-values as a result of the statistical test
     347                 :            : // *****************************************************************************
     348                 :            : {
     349                 :            :   using std::get;
     350                 :          0 :   smarsa_SerialOver( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     351                 :          0 :                      get<3>(xargs), get<4>(xargs) );
     352         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     353                 :            : }
     354                 :            : 
     355                 :            : std::vector< double >
     356                 :          0 : TestU01Stack::CollisionOver( unif01_Gen* gen, smarsa_Res* res,
     357                 :            :   const std::tuple<long, long, int, long, int>& xargs )
     358                 :            : // *****************************************************************************
     359                 :            : //  Run Marsaglia's Serial Over test, t = 2
     360                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     361                 :            : //! \param[in] res Pointer to test results object
     362                 :            : //! \param[in] xargs Test arguments
     363                 :            : //! \return Vector p-values as a result of the statistical test
     364                 :            : // *****************************************************************************
     365                 :            : {
     366                 :            :   using std::get;
     367                 :          0 :   smarsa_CollisionOver( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     368                 :          0 :                         get<3>(xargs), get<4>(xargs) );
     369         [ -  - ]:          0 :   return { res->Pois->pVal2 };
     370                 :            : }
     371                 :            : 
     372                 :            : std::vector< double >
     373                 :          0 : TestU01Stack::ClosePairs( unif01_Gen* gen, snpair_Res* res,
     374                 :            :   const std::tuple<long, long, int, int, int, int, int>& xargs )
     375                 :            : // *****************************************************************************
     376                 :            : //  Run the close-pairs test, t = 2
     377                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     378                 :            : //! \param[in] res Pointer to test results object
     379                 :            : //! \param[in] xargs Test arguments
     380                 :            : //! \return Vector p-values as a result of the statistical test
     381                 :            : // *****************************************************************************
     382                 :            : {
     383                 :            :   using std::get;
     384                 :          0 :   snpair_ClosePairs( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     385                 :          0 :                         get<3>(xargs), get<4>(xargs), get<5>(xargs) );
     386         [ -  - ]:          0 :   if (get<6>(xargs)) {
     387                 :          0 :     return { res->pVal[snpair_NP],
     388                 :          0 :              res->pVal[snpair_mNP],
     389                 :          0 :              res->pVal[snpair_mNP1],
     390                 :          0 :              res->pVal[snpair_mNP2],
     391                 :          0 :              res->pVal[snpair_NJumps],
     392         [ -  - ]:          0 :              res->pVal[snpair_mNP2S] };
     393                 :            :   } else {
     394                 :          0 :     return { res->pVal[snpair_NP],
     395                 :          0 :              res->pVal[snpair_mNP],
     396                 :          0 :              res->pVal[snpair_mNP1],
     397                 :          0 :              res->pVal[snpair_mNP2],
     398         [ -  - ]:          0 :              res->pVal[snpair_NJumps] };
     399                 :            :   }
     400                 :            : }
     401                 :            : 
     402                 :            : std::vector< double >
     403                 :          0 : TestU01Stack::ClosePairsBitMatch( unif01_Gen* gen, snpair_Res* res,
     404                 :            :   const std::tuple<long, long, int, int>& xargs )
     405                 :            : // *****************************************************************************
     406                 :            : //  Run the close-pairs test using bit match distance, t = 2
     407                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     408                 :            : //! \param[in] res Pointer to test results object
     409                 :            : //! \param[in] xargs Test arguments
     410                 :            : //! \return Vector p-values as a result of the statistical test
     411                 :            : // *****************************************************************************
     412                 :            : {
     413                 :            :   using std::get;
     414                 :          0 :   snpair_ClosePairsBitMatch( gen, res, get<0>(xargs), get<1>(xargs),
     415                 :          0 :                              get<2>(xargs), get<3>(xargs) );
     416         [ -  - ]:          0 :   return { res->pVal[snpair_BM] };
     417                 :            : }
     418                 :            : 
     419                 :            : std::vector< double >
     420                 :          0 : TestU01Stack::Run( unif01_Gen* gen, sres_Chi2* res,
     421                 :            :   const std::tuple<long, long, int, int>& xargs )
     422                 :            : // *****************************************************************************
     423                 :            : //  Run Knuth's Run test
     424                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     425                 :            : //! \param[in] res Pointer to test results object
     426                 :            : //! \param[in] xargs Test arguments
     427                 :            : //! \return Vector p-values as a result of the statistical test
     428                 :            : // *****************************************************************************
     429                 :            : {
     430                 :            :   using std::get;
     431                 :          0 :   sknuth_Run( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     432                 :          0 :               get<3>(xargs) );
     433         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     434                 :            : }
     435                 :            : 
     436                 :            : std::vector< double >
     437                 :          0 : TestU01Stack::Permutation( unif01_Gen* gen, sres_Chi2* res,
     438                 :            :   const std::tuple<long, long, int, int>& xargs )
     439                 :            : // *****************************************************************************
     440                 :            : //  Run Knuth's Permutation test
     441                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     442                 :            : //! \param[in] res Pointer to test results object
     443                 :            : //! \param[in] xargs Test arguments
     444                 :            : //! \return Vector p-values as a result of the statistical test
     445                 :            : // *****************************************************************************
     446                 :            : {
     447                 :            :   using std::get;
     448                 :          0 :   sknuth_Permutation( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     449                 :          0 :                       get<3>(xargs) );
     450         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     451                 :            : }
     452                 :            : 
     453                 :            : std::vector< double >
     454                 :          0 : TestU01Stack::CollisionPermut( unif01_Gen* gen, sknuth_Res2* res,
     455                 :            :   const std::tuple<long, long, int, int>& xargs )
     456                 :            : // *****************************************************************************
     457                 :            : //  Run Knuth's Collision test with permutations
     458                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     459                 :            : //! \param[in] res Pointer to test results object
     460                 :            : //! \param[in] xargs Test arguments
     461                 :            : //! \return Vector p-values as a result of the statistical test
     462                 :            : // *****************************************************************************
     463                 :            : {
     464                 :            :   using std::get;
     465                 :          0 :   sknuth_CollisionPermut( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     466                 :          0 :                           get<3>(xargs) );
     467         [ -  - ]:          0 :   return { res->Pois->pVal2 };
     468                 :            : }
     469                 :            : 
     470                 :            : std::vector< double >
     471                 :          0 : TestU01Stack::SampleProd( unif01_Gen* gen, sres_Basic* res,
     472                 :            :   const std::tuple<long, long, int, int>& xargs )
     473                 :            : // *****************************************************************************
     474                 :            : //  Run Sample Products test
     475                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     476                 :            : //! \param[in] res Pointer to test results object
     477                 :            : //! \param[in] xargs Test arguments
     478                 :            : //! \return Vector p-values as a result of the statistical test
     479                 :            : // *****************************************************************************
     480                 :            : {
     481                 :            :   using std::get;
     482                 :          0 :   svaria_SampleProd( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     483                 :          0 :                      get<3>(xargs) );
     484         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     485                 :            : }
     486                 :            : 
     487                 :            : std::vector< double >
     488                 :          0 : TestU01Stack::SampleMean( unif01_Gen* gen, sres_Basic* res,
     489                 :            :   const std::tuple<long, long, int>& xargs )
     490                 :            : // *****************************************************************************
     491                 :            : //  Run Sample Mean test
     492                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     493                 :            : //! \param[in] res Pointer to test results object
     494                 :            : //! \param[in] xargs Test arguments
     495                 :            : //! \return Vector p-values as a result of the statistical test
     496                 :            : // *****************************************************************************
     497                 :            : {
     498                 :            :   using std::get;
     499                 :          0 :   svaria_SampleMean( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs) );
     500         [ -  - ]:          0 :   return { res->pVal2[gofw_AD] };
     501                 :            : }
     502                 :            : 
     503                 :            : std::vector< double >
     504                 :          0 : TestU01Stack::SampleCorr( unif01_Gen* gen, sres_Basic* res,
     505                 :            :   const std::tuple<long, long, int, int>& xargs )
     506                 :            : // *****************************************************************************
     507                 :            : //  Run Sample Autocorrelation test
     508                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     509                 :            : //! \param[in] res Pointer to test results object
     510                 :            : //! \param[in] xargs Test arguments
     511                 :            : //! \return Vector p-values as a result of the statistical test
     512                 :            : // *****************************************************************************
     513                 :            : {
     514                 :            :   using std::get;
     515                 :          0 :   svaria_SampleCorr( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     516                 :          0 :                      get<3>(xargs) );
     517         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     518                 :            : }
     519                 :            : 
     520                 :            : std::vector< double >
     521                 :          0 : TestU01Stack::AppearanceSpacings( unif01_Gen* gen, sres_Basic* res,
     522                 :            :   const std::tuple<long, long, long, int, int, int>& xargs )
     523                 :            : // *****************************************************************************
     524                 :            : //  Run Maurer's "universal" test
     525                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     526                 :            : //! \param[in] res Pointer to test results object
     527                 :            : //! \param[in] xargs Test arguments
     528                 :            : //! \return Vector p-values as a result of the statistical test
     529                 :            : // *****************************************************************************
     530                 :            : {
     531                 :            :   using std::get;
     532                 :          0 :   svaria_AppearanceSpacings( gen, res, get<0>(xargs), get<1>(xargs),
     533                 :          0 :                              get<2>(xargs), get<3>(xargs), get<4>(xargs),
     534                 :          0 :                              get<5>(xargs) );
     535         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     536                 :            : }
     537                 :            : 
     538                 :            : std::vector< double >
     539                 :          0 : TestU01Stack::SumCollector( unif01_Gen* gen, sres_Chi2* res,
     540                 :            :   const std::tuple<long, long, int, double>& xargs )
     541                 :            : // *****************************************************************************
     542                 :            : //  Run Sum Collector test
     543                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     544                 :            : //! \param[in] res Pointer to test results object
     545                 :            : //! \param[in] xargs Test arguments
     546                 :            : //! \return Vector p-values as a result of the statistical test
     547                 :            : // *****************************************************************************
     548                 :            : {
     549                 :            :   using std::get;
     550                 :          0 :   svaria_SumCollector( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     551                 :          0 :                        get<3>(xargs) );
     552         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     553                 :            : }
     554                 :            : 
     555                 :            : std::vector< double >
     556                 :          0 : TestU01Stack::Savir2( unif01_Gen* gen, sres_Chi2* res,
     557                 :            :   const std::tuple<long, long, int, long, int>& xargs )
     558                 :            : // *****************************************************************************
     559                 :            : //  Run Marsaglia's modified Savir test
     560                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     561                 :            : //! \param[in] res Pointer to test results object
     562                 :            : //! \param[in] xargs Test arguments
     563                 :            : //! \return Vector p-values as a result of the statistical test
     564                 :            : // *****************************************************************************
     565                 :            : {
     566                 :            :   using std::get;
     567                 :          0 :   smarsa_Savir2( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     568                 :          0 :                  get<3>(xargs), get<4>(xargs) );
     569         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     570                 :            : }
     571                 :            : 
     572                 :            : std::vector< double >
     573                 :          0 : TestU01Stack::GCD( unif01_Gen* gen, smarsa_Res2* res,
     574                 :            :   const std::tuple<long, long, int, int>& xargs )
     575                 :            : // *****************************************************************************
     576                 :            : //  Run Marsaglia's greatest common divisor test
     577                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     578                 :            : //! \param[in] res Pointer to test results object
     579                 :            : //! \param[in] xargs Test arguments
     580                 :            : //! \return Vector p-values as a result of the statistical test
     581                 :            : // *****************************************************************************
     582                 :            : {
     583                 :            :   using std::get;
     584                 :          0 :   smarsa_GCD( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     585                 :          0 :               get<3>(xargs) );
     586         [ -  - ]:          0 :   return { res->GCD->pVal2[gofw_Mean] };
     587                 :            : }
     588                 :            : 
     589                 :            : std::vector< double >
     590                 :          0 : TestU01Stack::LinearComp( unif01_Gen* gen, scomp_Res* res,
     591                 :            :   const std::tuple<long, long, int, int>& xargs )
     592                 :            : // *****************************************************************************
     593                 :            : //  Run Linear Complexity test
     594                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     595                 :            : //! \param[in] res Pointer to test results object
     596                 :            : //! \param[in] xargs Test arguments
     597                 :            : //! \return Vector p-values as a result of the statistical test
     598                 :            : // *****************************************************************************
     599                 :            : {
     600                 :            :   using std::get;
     601                 :          0 :   scomp_LinearComp( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     602                 :          0 :                     get<3>(xargs) );
     603                 :          0 :   return { res->JumpNum->pVal2[gofw_Mean],
     604         [ -  - ]:          0 :            res->JumpSize->pVal2[gofw_Mean] };
     605                 :            : }
     606                 :            : 
     607                 :            : std::vector< double >
     608                 :          0 : TestU01Stack::LempelZiv( unif01_Gen* gen, sres_Basic* res,
     609                 :            :   const std::tuple<long, int, int, int>& xargs )
     610                 :            : // *****************************************************************************
     611                 :            : //  Run Lempel-Ziv Compressibility test
     612                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     613                 :            : //! \param[in] res Pointer to test results object
     614                 :            : //! \param[in] xargs Test arguments
     615                 :            : //! \return Vector p-values as a result of the statistical test
     616                 :            : // *****************************************************************************
     617                 :            : {
     618                 :            :   using std::get;
     619                 :          0 :   scomp_LempelZiv( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     620                 :          0 :                    get<3>(xargs) );
     621         [ -  - ]:          0 :   return { res->pVal2[gofw_Sum] };
     622                 :            : }
     623                 :            : 
     624                 :            : std::vector< double >
     625                 :          0 : TestU01Stack::Fourier3( unif01_Gen* gen, sspectral_Res* res,
     626                 :            :   const std::tuple<long, int, int, int>& xargs )
     627                 :            : // *****************************************************************************
     628                 :            : //  Run Fourier3 test
     629                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     630                 :            : //! \param[in] res Pointer to test results object
     631                 :            : //! \param[in] xargs Test arguments
     632                 :            : //! \return Vector p-values as a result of the statistical test
     633                 :            : // *****************************************************************************
     634                 :            : {
     635                 :            :   using std::get;
     636                 :          0 :   sspectral_Fourier3( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     637                 :          0 :                       get<3>(xargs) );
     638         [ -  - ]:          0 :   return { res->Bas->pVal2[gofw_AD] };
     639                 :            : }
     640                 :            : 
     641                 :            : std::vector< double >
     642                 :          0 : TestU01Stack::LongestHeadRun( unif01_Gen* gen, sstring_Res2* res,
     643                 :            :   const std::tuple<long, long, int, int, long>& xargs )
     644                 :            : // *****************************************************************************
     645                 :            : //  Run Longest Head Run test
     646                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     647                 :            : //! \param[in] res Pointer to test results object
     648                 :            : //! \param[in] xargs Test arguments
     649                 :            : //! \return Vector p-values as a result of the statistical test
     650                 :            : // *****************************************************************************
     651                 :            : {
     652                 :            :   using std::get;
     653                 :          0 :   sstring_LongestHeadRun( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     654                 :          0 :                           get<3>(xargs), get<4>(xargs) );
     655                 :          0 :   return { res->Chi->pVal2[gofw_Mean],
     656         [ -  - ]:          0 :            res->Disc->pVal2 };
     657                 :            : }
     658                 :            : 
     659                 :            : std::vector< double >
     660                 :          0 : TestU01Stack::PeriodsInStrings( unif01_Gen* gen, sres_Chi2* res,
     661                 :            :   const std::tuple<long, long, int, int>& xargs )
     662                 :            : // *****************************************************************************
     663                 :            : //  Run Periods In Strings test
     664                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     665                 :            : //! \param[in] res Pointer to test results object
     666                 :            : //! \param[in] xargs Test arguments
     667                 :            : //! \return Vector p-values as a result of the statistical test
     668                 :            : // *****************************************************************************
     669                 :            : {
     670                 :            :   using std::get;
     671                 :          0 :   sstring_PeriodsInStrings( gen, res, get<0>(xargs), get<1>(xargs),
     672                 :          0 :                             get<2>(xargs), get<3>(xargs) );
     673         [ -  - ]:          0 :   return { res->pVal2[gofw_Mean] };
     674                 :            : }
     675                 :            : 
     676                 :            : std::vector< double >
     677                 :          0 : TestU01Stack::HammingWeight2( unif01_Gen* gen, sres_Basic* res,
     678                 :            :   const std::tuple<long, long, int, int, long>& xargs )
     679                 :            : // *****************************************************************************
     680                 :            : //  Run Hamming Weight 2 test
     681                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     682                 :            : //! \param[in] res Pointer to test results object
     683                 :            : //! \param[in] xargs Test arguments
     684                 :            : //! \return Vector p-values as a result of the statistical test
     685                 :            : // *****************************************************************************
     686                 :            : {
     687                 :            :   using std::get;
     688                 :          0 :   sstring_HammingWeight2( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     689                 :          0 :                           get<3>(xargs), get<4>(xargs) );
     690         [ -  - ]:          0 :   return { res->pVal2[gofw_Sum] };
     691                 :            : }
     692                 :            : 
     693                 :            : std::vector< double >
     694                 :          0 : TestU01Stack::HammingCorr( unif01_Gen* gen, sstring_Res* res,
     695                 :            :   const std::tuple<long, long, int, int, int>& xargs )
     696                 :            : // *****************************************************************************
     697                 :            : //  Run Hamming Weight Correlation test
     698                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     699                 :            : //! \param[in] res Pointer to test results object
     700                 :            : //! \param[in] xargs Test arguments
     701                 :            : //! \return Vector p-values as a result of the statistical test
     702                 :            : // *****************************************************************************
     703                 :            : {
     704                 :            :   using std::get;
     705                 :          0 :   sstring_HammingCorr( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     706                 :          0 :                        get<3>(xargs), get<4>(xargs) );
     707         [ -  - ]:          0 :   return { res->Bas->pVal2[gofw_Mean] };
     708                 :            : }
     709                 :            : 
     710                 :            : std::vector< double >
     711                 :          0 : TestU01Stack::StringRun( unif01_Gen* gen, sstring_Res3* res,
     712                 :            :   const std::tuple<long, long, int, int>& xargs )
     713                 :            : // *****************************************************************************
     714                 :            : //  Run String Run test
     715                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     716                 :            : //! \param[in] res Pointer to test results object
     717                 :            : //! \param[in] xargs Test arguments
     718                 :            : //! \return Vector p-values as a result of the statistical test
     719                 :            : // *****************************************************************************
     720                 :            : {
     721                 :            :   using std::get;
     722                 :          0 :   sstring_Run( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     723                 :          0 :                get<3>(xargs) );
     724                 :          0 :   return { res->NRuns->pVal2[gofw_Mean],
     725         [ -  - ]:          0 :            res->NBits->pVal2[gofw_Mean] };
     726                 :            : }
     727                 :            : 
     728                 :            : std::vector< double >
     729                 :          0 : TestU01Stack::AutoCorr( unif01_Gen* gen, sres_Basic* res,
     730                 :            :   const std::tuple<long, long, int, int, int>& xargs )
     731                 :            : // *****************************************************************************
     732                 :            : //  Run Autocorrelation test
     733                 :            : //! \param[in] gen Raw function pointer to TestU01 statistical test
     734                 :            : //! \param[in] res Pointer to test results object
     735                 :            : //! \param[in] xargs Test arguments
     736                 :            : //! \return Vector p-values as a result of the statistical test
     737                 :            : // *****************************************************************************
     738                 :            : {
     739                 :            :   using std::get;
     740                 :          0 :   sstring_AutoCor( gen, res, get<0>(xargs), get<1>(xargs), get<2>(xargs),
     741                 :          0 :                    get<3>(xargs), get<4>(xargs) );
     742         [ -  - ]:          0 :   return { res->pVal2[gofw_Sum] };
     743                 :            : }

Generated by: LCOV version 1.14