src/core/random-variable.cc
changeset 360 7bffd987426c
parent 346 4a76f247e7dc
child 364 9df87117d468
equal deleted inserted replaced
359:91b7ad7fa784 360:7bffd987426c
    99 RandomVariable::RandomVariable() 
    99 RandomVariable::RandomVariable() 
   100 {
   100 {
   101   m_generator = new RngStream();
   101   m_generator = new RngStream();
   102   RandomVariable::Initialize(); // sets the seed for the static object
   102   RandomVariable::Initialize(); // sets the seed for the static object
   103   m_generator->InitializeStream();
   103   m_generator->InitializeStream();
       
   104 }
       
   105 
       
   106 RandomVariable::RandomVariable(const RandomVariable& r)
       
   107 {
       
   108   m_generator = new RngStream(*r.m_generator);
       
   109   RandomVariable::Initialize();
   104 }
   110 }
   105 
   111 
   106 RandomVariable::~RandomVariable()
   112 RandomVariable::~RandomVariable()
   107 {
   113 {
   108   delete m_generator;
   114   delete m_generator;
   235   
   241   
   236 UniformVariable::UniformVariable(double s, double l) 
   242 UniformVariable::UniformVariable(double s, double l) 
   237   : m_min(s), m_max(l) { }
   243   : m_min(s), m_max(l) { }
   238 
   244 
   239 UniformVariable::UniformVariable(const UniformVariable& c) 
   245 UniformVariable::UniformVariable(const UniformVariable& c) 
   240   : m_min(c.m_min), m_max(c.m_max) { }
   246   : RandomVariable(c), m_min(c.m_min), m_max(c.m_max) { }
   241 
   247 
   242 double UniformVariable::GetValue()
   248 double UniformVariable::GetValue()
   243 {
   249 {
   244   return m_min + m_generator->RandU01() * (m_max - m_min);
   250   return m_min + m_generator->RandU01() * (m_max - m_min);
   245 }
   251 }
   256 
   262 
   257 ConstantVariable::ConstantVariable(double c) 
   263 ConstantVariable::ConstantVariable(double c) 
   258   : m_const(c) { };
   264   : m_const(c) { };
   259   
   265   
   260 ConstantVariable::ConstantVariable(const ConstantVariable& c) 
   266 ConstantVariable::ConstantVariable(const ConstantVariable& c) 
   261   : m_const(c.m_const) { }
   267   : RandomVariable(c), m_const(c.m_const) { }
   262 
   268 
   263 void ConstantVariable::NewConstant(double c) 
   269 void ConstantVariable::NewConstant(double c) 
   264   { m_const = c;}
   270   { m_const = c;}
   265   
   271   
   266 double ConstantVariable::GetValue()
   272 double ConstantVariable::GetValue()
   291     m_current(f), m_currentConsecutive(0)
   297     m_current(f), m_currentConsecutive(0)
   292 {
   298 {
   293 }
   299 }
   294 
   300 
   295 SequentialVariable::SequentialVariable(const SequentialVariable& c)
   301 SequentialVariable::SequentialVariable(const SequentialVariable& c)
   296   : m_min(c.m_min), m_max(c.m_max),
   302   : RandomVariable(c), m_min(c.m_min), m_max(c.m_max),
   297     m_increment(c.m_increment->Copy()), m_consecutive(c.m_consecutive),
   303     m_increment(c.m_increment->Copy()), m_consecutive(c.m_consecutive),
   298     m_current(c.m_current), m_currentConsecutive(c.m_currentConsecutive)
   304     m_current(c.m_current), m_currentConsecutive(c.m_currentConsecutive)
   299 {
   305 {
       
   306 }
       
   307 
       
   308 SequentialVariable::~SequentialVariable()
       
   309 {
       
   310   delete m_increment;
   300 }
   311 }
   301 
   312 
   302 double SequentialVariable::GetValue()
   313 double SequentialVariable::GetValue()
   303 { // Return a sequential series of values
   314 { // Return a sequential series of values
   304   double r = m_current;
   315   double r = m_current;
   327   
   338   
   328 ExponentialVariable::ExponentialVariable(double m, double b) 
   339 ExponentialVariable::ExponentialVariable(double m, double b) 
   329   : m_mean(m), m_bound(b) { }
   340   : m_mean(m), m_bound(b) { }
   330   
   341   
   331 ExponentialVariable::ExponentialVariable(const ExponentialVariable& c) 
   342 ExponentialVariable::ExponentialVariable(const ExponentialVariable& c) 
   332   : m_mean(c.m_mean), m_bound(c.m_bound) { }
   343   : RandomVariable(c), m_mean(c.m_mean), m_bound(c.m_bound) { }
   333 
   344 
   334 double ExponentialVariable::GetValue()
   345 double ExponentialVariable::GetValue()
   335 {
   346 {
   336   double r = -m_mean*log(m_generator->RandU01());
   347   double r = -m_mean*log(m_generator->RandU01());
   337   if (m_bound != 0 && r > m_bound) return m_bound;
   348   if (m_bound != 0 && r > m_bound) return m_bound;
   356 
   367 
   357 ParetoVariable::ParetoVariable(double m, double s, double b) 
   368 ParetoVariable::ParetoVariable(double m, double s, double b) 
   358   : m_mean(m), m_shape(s), m_bound(b) { }
   369   : m_mean(m), m_shape(s), m_bound(b) { }
   359 
   370 
   360 ParetoVariable::ParetoVariable(const ParetoVariable& c) 
   371 ParetoVariable::ParetoVariable(const ParetoVariable& c) 
   361   : m_mean(c.m_mean), m_shape(c.m_shape), m_bound(c.m_bound) { }
   372   : RandomVariable(c), m_mean(c.m_mean), m_shape(c.m_shape), 
       
   373     m_bound(c.m_bound) { }
   362 
   374 
   363 double ParetoVariable::GetValue()
   375 double ParetoVariable::GetValue()
   364 {
   376 {
   365   double scale = m_mean * ( m_shape - 1.0) / m_shape;
   377   double scale = m_mean * ( m_shape - 1.0) / m_shape;
   366   double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape)));
   378   double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape)));
   381 WeibullVariable::WeibullVariable(double m, double s) 
   393 WeibullVariable::WeibullVariable(double m, double s) 
   382   : m_mean(m), m_alpha(s), m_bound(0) { }
   394   : m_mean(m), m_alpha(s), m_bound(0) { }
   383 WeibullVariable::WeibullVariable(double m, double s, double b) 
   395 WeibullVariable::WeibullVariable(double m, double s, double b) 
   384   : m_mean(m), m_alpha(s), m_bound(b) { };
   396   : m_mean(m), m_alpha(s), m_bound(b) { };
   385 WeibullVariable::WeibullVariable(const WeibullVariable& c) 
   397 WeibullVariable::WeibullVariable(const WeibullVariable& c) 
   386   : m_mean(c.m_mean), m_alpha(c.m_alpha), m_bound(c.m_bound) { }
   398   : RandomVariable(c), m_mean(c.m_mean), m_alpha(c.m_alpha),
       
   399     m_bound(c.m_bound) { }
   387 
   400 
   388 double WeibullVariable::GetValue()
   401 double WeibullVariable::GetValue()
   389 {
   402 {
   390   double exponent = 1.0 / m_alpha;
   403   double exponent = 1.0 / m_alpha;
   391   double r = m_mean * pow( -log(m_generator->RandU01()), exponent);
   404   double r = m_mean * pow( -log(m_generator->RandU01()), exponent);
   405 
   418 
   406 NormalVariable::NormalVariable(double m, double v, double b)
   419 NormalVariable::NormalVariable(double m, double v, double b)
   407   : m_mean(m), m_variance(v), m_bound(b), m_nextValid(false) { }
   420   : m_mean(m), m_variance(v), m_bound(b), m_nextValid(false) { }
   408 
   421 
   409 NormalVariable::NormalVariable(const NormalVariable& c)
   422 NormalVariable::NormalVariable(const NormalVariable& c)
   410   : m_mean(c.m_mean), m_variance(c.m_variance), m_bound(c.m_bound) { }
   423   : RandomVariable(c), m_mean(c.m_mean), m_variance(c.m_variance),
       
   424     m_bound(c.m_bound) { }
   411 
   425 
   412 double NormalVariable::GetValue()
   426 double NormalVariable::GetValue()
   413 {
   427 {
   414   if (m_nextValid)
   428   if (m_nextValid)
   415     { // use previously generated
   429     { // use previously generated
   456 //-----------------------------------------------------------------------------
   470 //-----------------------------------------------------------------------------
   457 // EmpiricalVariable methods
   471 // EmpiricalVariable methods
   458 EmpiricalVariable::EmpiricalVariable() 
   472 EmpiricalVariable::EmpiricalVariable() 
   459   : validated(false) { }
   473   : validated(false) { }
   460 
   474 
   461 EmpiricalVariable::EmpiricalVariable(const EmpiricalVariable& c) 
   475 EmpiricalVariable::EmpiricalVariable(const EmpiricalVariable& c)
   462   : validated(c.validated), emp(c.emp) { }
   476   : RandomVariable(c), validated(c.validated), emp(c.emp) { }
   463 
   477 
   464 EmpiricalVariable::~EmpiricalVariable() { }
   478 EmpiricalVariable::~EmpiricalVariable() { }
   465 
   479 
   466 double EmpiricalVariable::GetValue()
   480 double EmpiricalVariable::GetValue()
   467 { // Return a value from the empirical distribution
   481 { // Return a value from the empirical distribution
   539 RandomVariable* IntEmpiricalVariable::Copy() const
   553 RandomVariable* IntEmpiricalVariable::Copy() const
   540 {
   554 {
   541   return new IntEmpiricalVariable(*this);
   555   return new IntEmpiricalVariable(*this);
   542 }
   556 }
   543 
   557 
   544 
       
   545 double IntEmpiricalVariable::Interpolate(double c1, double c2,
   558 double IntEmpiricalVariable::Interpolate(double c1, double c2,
   546                                    double v1, double v2, double r)
   559                                    double v1, double v2, double r)
   547 { // Interpolate random value in range [v1..v2) based on [c1 .. r .. c2)
   560 { // Interpolate random value in range [v1..v2) based on [c1 .. r .. c2)
   548   return ceil(v1 + ((v2 - v1) / (c2 - c1)) * (r - c1));
   561   return ceil(v1 + ((v2 - v1) / (c2 - c1)) * (r - c1));
   549 }
   562 }