trick/include/trick/MonteVarRandom.hh
Alex Lin 19025d77ad Standardize directory names
Reorganized.  Created a new top level include directory that will hold all of Trick's header files. Moved all of the Trick headers to this directory.  Created a libexec directory that holds all of the executables that users don't need to execute directly.  Changed all of the executables remaining in bin to start with "trick-".  In the sim_services directories changed all source files to find the Trick headers in their new location.  Since all of the include files are gone in sim_services, removed the src directories as well, moving all of the source files up a level.  Moved the makefiles, docs, man, and other architecture independent files into a top level share directory.  Renamed lib_${TRICK_HOST_CPU} to lib64 or lib depending on the platform we're currently on.

refs #63
2015-06-09 08:44:42 -05:00

185 lines
5.9 KiB
C++

/*
PURPOSE: (Monte carlo structures)
REFERENCE: (Trick Users Guide)
ASSUMPTIONS AND LIMITATIONS: (None)
PROGRAMMERS: ((Keith Vetter) (LinCom) (7/2003))
*/
#ifndef MONTEVARRANDOM_HH
#define MONTEVARRANDOM_HH
#include <string>
#include "trick/MonteVar.hh"
#include "trick/rand_generator.h"
#include "trick/StlRandomGenerator.hh"
namespace Trick {
/**
* A variable whose values are taken from a random distribution.
*
* @author Alex Lin
* @author Donna Panter
* @author Derek Bankieris
*
* @date August 2010
*/
class MonteVarRandom : public Trick::MonteVar {
public:
///@brief Random number generation engine type.
///
///@details Used for TR1 and C++11 random number generation facilities
///
///@note: Values for this type must match those of StlRandomGenerator::StlEngine
///
enum StlEngine {
NO_ENGINE = 0, /**< -- This selection causes the Trick hand coded fallback algorithms to be used */
TRICK_DEFAULT_ENGINE = 1, /**< -- std::ranlux_base_01 for TR1, std::mt19937 for _HAVE_STD_RANDOM */
#ifdef _HAVE_TR1_RANDOM
RANLUX_BASE_01_ENGINE = 2, /**< -- TR1 only std::ranlux_base_01 Engine, note: replaced for c++11 */
RANLUX_64_BASE_01_ENGINE = 3, /**< -- TR1 only std::ranlux64_base_01 Engine, note: replaced for c++11 */
#endif
#ifdef _HAVE_STL_RANDOM
// NOTE: MINSTD_RAND_ENGINE and MT19937_ENGINE return out of canonical range
// for (at least) GCC 4.4.7,so are not provided for _HAVE_TR1_RANDOM
MINSTD_RAND_ENGINE = 2, /**< -- std::minstd_rand Minimal Standard Linear Congruential Engine */
MT19937_ENGINE = 3, /**< -- std::mt19937 Mersenne Twister Engine */
MT19937_64_ENGINE = 4, /**< -- std::mt19937_64 64 bit Mersenne Twister Engine. Not available TR1 */
RANLUX_24_BASE_ENGINE = 5, /**< -- std::ranlux24_base Engine */
RANLUX_44_BASE_ENGINE = 6, /**< -- std::ranlux48_base Engine */
RANLUX_24_ENGINE = 7, /**< -- std::ranlux24 Engine */
RANLUX_44_ENGINE = 8, /**< -- std::ranlux48 Engine */
KNUTH_B_ENGINE = 9 /**< -- std::knuth_b Engine */
#endif
};
/** A random distribution. */
enum Distribution {
GAUSSIAN = TRICK_GSL_GAUSS, /**< Gaussian distribution */
FLAT = TRICK_GSL_FLAT, /**< flat distribution */
POISSON = TRICK_GSL_POISSON /**< Poisson distribution */
};
protected:
/** Engine. */
StlEngine engineType; /**< trick_units(--) STL C++11 random number generation engine enum */
/** Distribution. */
Distribution distribution; /**< \n trick_units(--) */
/** Random distribution structure. */
TRICK_GSL_RANDIST randist; /**< \n trick_units(**) */
StlRandomGenerator* stlGenPtr; /**< trick_units(**) STL pseudo-random number generator */
public:
/**
* Constructs a MonteVarRandom with the given name, distribution, and units.
*
* @param name the fully qualified name of the simulation variable to which this MonteVarRandom refers
* @param distribution this variable's distribution
* @param unit this variable's units
* @param engine this variables's pseudo-random number 'engine'. Defaulted to NO_ENGINE (use Trick algorithms)
*/
MonteVarRandom(std::string name, Distribution distribution, std::string unit = "", StlEngine engine = MonteVarRandom::NO_ENGINE);
/**
* Destructor
*/
~MonteVarRandom();
/**
* Sets the seed.
*
* @param seed the seed
*/
void set_seed(unsigned long seed);
/**
* Sets the standard deviation.
*
* @param sigma the standard deviation
*/
void set_sigma(double sigma);
/**
* Sets the sigma range for the Trick RNG.
*
* @param sigma_range the range for the output random number
*/
void set_sigma_range(int sigma_range);
/**
* Sets the mean.
*
* @param mu the mean
*/
void set_mu(double mu);
/**
* Sets the minimum.
*
* @param min the minimum
*/
void set_min(double min);
/**
* Sets the maximum.
*
* @param max the maximum
*/
void set_max(double max);
/**
* Sets the relativity of the minimum.
*
* @param relativity the relativity
*/
void set_min_is_relative(bool relativity);
/**
* Sets the relativity of the maximum.
*
* @param relativity the relativity
*/
void set_max_is_relative(bool relativity);
/**
* Sets the Uniform Random number generator option.
*
* @param uniform the RNG option
*/
void set_uniform_generator(uniform_generator uniform);
/**
* @return value of the absolute minimum, taking into account all options (relative or absolute input)
*/
double get_absolute_min() const { return (randist.rel_min) ? (randist.mu + randist.min) : randist.min; }
/**
* @return value of the absolute maximum, taking into account all options (relative or absolute input)
*/
double get_absolute_max() const { return (randist.rel_max) ? (randist.mu + randist.max) : randist.max; }
protected:
virtual std::string get_next_value();
/**
* updates the STL randomization subobject when settings are changed, maintaining consistency
*/
void updateStlRandom();
};
};
#endif