00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00039 #ifndef eoUniformInit_h
00040 #define eoUniformInit_h
00041
00042 #include "eoRNG.h"
00043 #include "eoInit.h"
00044 #include "eoRealBounds.h"
00045 #include <stdexcept>
00046
00047 using eo::rng;
00048
00062 template <class T = double> class eoUniformInit : public eoInit<T>
00063 {
00064 public :
00066 eoUniformInit(T _max = T(1.0), eoRng& _rng = rng) :
00067 minim(T(0.0)), range(_max), uniform(_rng)
00068 {}
00069
00071 eoUniformInit(eoRealBounds & _bound, eoRng& _rng = rng) :
00072 minim(_bound.minimum()), range(_bound.range()), uniform(_rng)
00073 {}
00074
00076 eoUniformInit(T _min, T _max, eoRng& _rng = rng) :
00077 minim(_min), range(_max-_min), uniform(_rng)
00078 {
00079 if (_min>_max)
00080 throw std::logic_error("Min is greater than Max in uniform_generator");
00081 }
00082
00087 void operator()(T & _t)
00088 {
00089 _t = minim+static_cast<T>(uniform.uniform(range));
00090 }
00091
00092 private :
00093 T minim;
00094 T range;
00095 eoRng& uniform;
00096 };
00097
00098
00100 template <>
00101 inline void eoUniformInit<bool>::operator()(bool & _b)
00102 {
00103 _b = uniform.flip(0.5);
00104 }
00105
00110 class eoBooleanInit : public eoInit<bool>
00111 {
00112 public :
00113 eoBooleanInit(float _bias = 0.5, eoRng& _rng = rng) : bias(_bias), gen(_rng) {}
00114
00115 void operator()(bool & _b) { _b = gen.flip(bias); }
00116 private :
00117 float bias;
00118 eoRng& gen;
00119 };
00120
00126 template <class T = double> class eoNormalInit : public eoInit<T>
00127 {
00128 public :
00129 eoNormalInit(T _stdev = T(1.0), eoRng& _rng = rng) : stdev(_stdev), normal(_rng) {}
00130
00131 void operator()(T & _t) { _t = (T) normal.normal(stdev); }
00132
00133 private :
00134 T stdev;
00135 eoRng& normal;
00136 };
00137
00143 template <class T = double> class eoNegExpInit : public eoInit<T>
00144 {
00145 public :
00146 eoNegExpInit(T _mean = 1.0, eoRng& _rng = rng) : mean(_mean), negexp(_rng) {}
00147
00148 void operator()(T & _t) { _t = (T) negexp.negexp(mean); }
00149
00150 private :
00151 T mean;
00152 eoRng& negexp;
00153 };
00154
00155 #endif