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 } |