2015-02-26 15:02:31 +00:00
# include <stdexcept>
2015-06-01 15:28:29 +00:00
# include "trick/StlRandomGenerator.hh"
2015-02-26 15:02:31 +00:00
StlRandomGenerator : : StlRandomGenerator ( double in_param_a ,
double in_param_b ,
2016-11-08 09:25:07 +00:00
unsigned long in_seed ,
2015-02-26 15:02:31 +00:00
StlDistribution in_dist_type ,
StlEngine in_engine_type )
: initialSeed ( in_seed ) ,
engineEnum ( in_engine_type ) ,
distEnum ( in_dist_type )
{
}
StlRandomGenerator : : ~ StlRandomGenerator ( )
{
}
2016-11-08 09:25:07 +00:00
///@details return a pointer-to-base-class for a new StlRandomGeneratorSub object
2015-02-26 15:02:31 +00:00
/// of the input-specified type
2016-11-08 09:25:07 +00:00
StlRandomGenerator *
2015-02-26 15:02:31 +00:00
StlRandomGeneratorFactory : : newGenerator (
double in_param_a ,
double in_param_b ,
unsigned long in_seed ,
StlRandomGenerator : : StlDistribution in_dist_type ,
StlRandomGenerator : : StlEngine in_engine_type )
{
# if (defined(_HAVE_TR1_RANDOM) || defined(_HAVE_STL_RANDOM))
# ifdef _HAVE_STL_RANDOM
# define UNIFORM_INT_DIST std::uniform_int_distribution
# define UNIFORM_REAL_DIST std::uniform_real_distribution
# define TRICK_DEFAULT_ENGINE_CLASS std::mt19937
# else
# define UNIFORM_INT_DIST std::uniform_int
# define UNIFORM_REAL_DIST std::uniform_real
# define TRICK_DEFAULT_ENGINE_CLASS std::ranlux_base_01 // because mt19937 doesnt return within canonical range for GCC 4.4.7
# endif
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
switch ( in_engine_type * 1000 + in_dist_type ) {
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
// ------------- TRICK_DEFAULT_ENGINE --------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : TRICK_DEFAULT_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < TRICK_DEFAULT_ENGINE_CLASS , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : TRICK_DEFAULT_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < TRICK_DEFAULT_ENGINE_CLASS , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : TRICK_DEFAULT_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < TRICK_DEFAULT_ENGINE_CLASS , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
# ifdef _HAVE_TR1_RANDOM
// ------------- RANLUX_BASE_01_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_BASE_01_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux_base_01 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_BASE_01_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux_base_01 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_BASE_01_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux_base_01 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- RANLUX_64_BASE_01_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_64_BASE_01_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux64_base_01 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_64_BASE_01_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux64_base_01 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_64_BASE_01_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux64_base_01 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
# else
2016-11-08 09:25:07 +00:00
// std::minstd_rand and mt19937 are not provided for TR1, because GCC 4.4.7 (at least)
// they return outside the canonical range 0 <= x < 1.
2015-02-26 15:02:31 +00:00
// This causes an infinite loop in std::normal_distribution
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
// ------------- MINSTD_RAND_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : MINSTD_RAND_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : minstd_rand , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MINSTD_RAND_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : minstd_rand , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MINSTD_RAND_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : minstd_rand , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- MT19937_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : MT19937_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MT19937_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MT19937_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
// these engines are all C++11 only
// ------------- MT19937_64_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : MT19937_64_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937_64 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MT19937_64_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937_64 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : MT19937_64_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : mt19937_64 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- RANLUX_24_BASE_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_24_BASE_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24_base , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_24_BASE_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24_base , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_24_BASE_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24_base , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- RANLUX_44_BASE_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_44_BASE_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48_base , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_44_BASE_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48_base , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_44_BASE_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48_base , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- RANLUX_24_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_24_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_24_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_24_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux24 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- RANLUX_44_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : RANLUX_44_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48 , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_44_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48 , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : RANLUX_44_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : ranlux48 , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
// ------------- KNUTH_B_ENGINE ---------------------------------------------
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
case StlRandomGenerator : : KNUTH_B_ENGINE * 1000 + StlRandomGenerator : : GAUSSIAN :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : knuth_b , std : : normal_distribution < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : KNUTH_B_ENGINE * 1000 + StlRandomGenerator : : FLAT :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : knuth_b , UNIFORM_REAL_DIST < double > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
case StlRandomGenerator : : KNUTH_B_ENGINE * 1000 + StlRandomGenerator : : POISSON :
return static_cast < StlRandomGenerator * > (
2016-11-08 09:25:07 +00:00
new StlRandomGeneratorSub < std : : knuth_b , std : : poisson_distribution < STL_POISSON_TEMPLATE_TYPES > >
2015-02-26 15:02:31 +00:00
( in_param_a , in_param_b , in_seed , in_dist_type , in_engine_type )
) ;
break ;
# endif
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
default :
throw std : : invalid_argument ( std : : string ( " error: StlRandomGeneratorFactory::newGenerator called for unimplemented std::random (engine,distribution) combination. " ) ) ;
}
2016-11-08 09:25:07 +00:00
2015-02-26 15:02:31 +00:00
# else
// without either _HAVE_TR1_RANDOM or _HAVE_STL_RANDOM, return null pointer.
return 0 ; // ???? what was I thinking here static_cast< StlRandomGenerator* >( 0 );
# endif
}