trick/trick_source/sim_services/MonteCarlo/include/MonteVarRandom.hh
Alex Lin 14a75508a3 Cleaning up once include variables and copyright cleanup.
Changed all header file once include variables to follow the same naming
convention and not start with any underscores.  Also deleted old
incorrect copyright notices.  Also removed $Id: tags from all files.

Fixes #14.  Fixes #22.
2015-03-23 16:03:14 -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 "MonteVar.hh"
#include "trick_utils/math/include/rand_generator.h"
#include "sim_services/MonteCarlo/include/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