Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Main/RNGTestDriver.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 Random number generator test suite driver
9 : : \details Random number generator test suite driver.
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #include "Tags.hpp"
14 : : #include "Exception.hpp"
15 : : #include "Factory.hpp"
16 : : #include "Battery.hpp"
17 : : #include "TestU01Suite.hpp"
18 : : #include "RNGTestPrint.hpp"
19 : : #include "RNGTestDriver.hpp"
20 : : #include "RNGTest/InputDeck/InputDeck.hpp"
21 : : #include "RNGTest/InputDeck/Parser.hpp"
22 : : #include "TaggedTupleDeepPrint.hpp"
23 : : #include "Writer.hpp"
24 : :
25 : : namespace rngtest {
26 : :
27 : : extern ctr::InputDeck g_inputdeck;
28 : : extern ctr::InputDeck g_inputdeck_defaults;
29 : :
30 : : } // rngtest::
31 : :
32 : : using rngtest::RNGTestDriver;
33 : :
34 : 4 : RNGTestDriver::RNGTestDriver( const ctr::CmdLine& cmdline, int nrestart ) :
35 : 4 : m_print( cmdline.logname(
36 : : g_inputdeck_defaults.get< tag::cmd, tag::io, tag::screen >(),
37 : : nrestart ),
38 : 4 : cmdline.get< tag::verbose >() ? std::cout : std::clog,
39 [ - + ]: 4 : std::ios_base::app )
40 : : // *****************************************************************************
41 : : // Constructor
42 : : //! \param[in] cmdline Command line object storing data parsed from the command
43 : : //! line arguments
44 : : //! \param[in] nrestart Number of times restarted
45 : : // *****************************************************************************
46 : : {
47 : : // All global-scope data to be migrated to all PEs initialized here
48 : :
49 : : // Parse input deck into g_inputdeck
50 [ + - ][ + - ]: 4 : m_print.item( "Control file", cmdline.get< tag::io, tag::control >() );
51 [ + - ]: 4 : InputDeckParser inputdeckParser( m_print, cmdline, g_inputdeck );
52 [ + - ][ + - ]: 8 : m_print.item( "Parsed control file", "success" );
[ + - ]
53 : :
54 : : m_print.endpart();
55 : :
56 : : // Output input deck object to file
57 [ + - ][ + - ]: 4 : auto logfilename = tk::rngtest_executable() + "_input.log";
[ - - ]
58 [ + - ]: 4 : tk::Writer log( logfilename );
59 [ + - ][ + - ]: 8 : tk::print( log.stream(), "inputdeck", g_inputdeck );
60 : 4 : }
61 : :
62 : : void
63 : 4 : RNGTestDriver::execute() const
64 : : // *****************************************************************************
65 : : // Run battery
66 : : // *****************************************************************************
67 : : {
68 [ + - ][ + - ]: 8 : m_print.part( "Factory" );
[ + - ]
69 : :
70 : : // Register batteries
71 : : BatteryFactory bf;
72 : : using ctr::BatteryType;
73 : : // Note that TestU01Suite constructors take the BatteryType (enum class)
74 : : // value as their argument, which happens to be the same as the key in the
75 : : // factory - hence the double-specification of the battery type below.
76 : : // Record all into a factory passing the last 0 means instantiate on PE 0.
77 : : tk::recordCharmModel< Battery, TestU01Suite >
78 [ + - ]: 4 : ( bf, BatteryType::SMALLCRUSH, BatteryType::SMALLCRUSH, 0 );
79 : : tk::recordCharmModel< Battery, TestU01Suite >
80 [ + - ]: 4 : ( bf, BatteryType::CRUSH, BatteryType::CRUSH, 0 );
81 : : tk::recordCharmModel< Battery, TestU01Suite >
82 [ + - ]: 4 : ( bf, BatteryType::BIGCRUSH, BatteryType::BIGCRUSH, 0 );
83 [ + - ][ + - ]: 8 : m_print.list< ctr::Battery >( "Registered batteries", bf );
[ + - ]
84 : : m_print.endpart();
85 : :
86 [ + - ][ + - ]: 8 : m_print.part( "Problem" );
[ + - ]
87 [ + - ]: 4 : if ( !g_inputdeck.get< tag::title >().empty() )
88 [ + - ]: 4 : m_print.title( g_inputdeck.get< tag::title >() );
89 : :
90 : : // Instantiate and run battery
91 : : const auto s = bf.find( g_inputdeck.get< tag::selected, tag::battery >() );
92 [ + - ]: 4 : if (s != end(bf)) {
93 : 4 : s->second();
94 [ - - ][ - - ]: 0 : } else Throw( "Battery not found in factory" );
[ - - ][ - - ]
[ - - ][ - - ]
95 : 4 : }
|