From a8f991079acc2cecfd8a26ffe6dff2e8aa8d9d22 Mon Sep 17 00:00:00 2001 From: Raj Bhattacharjea Date: Thu, 22 Jan 2009 14:10:40 -0500 Subject: [PATCH] Commit Mathieu's coding style cleanup of random-variable --- src/core/random-variable.cc | 256 +++++++++++++----------------------- src/core/random-variable.h | 108 +++++++-------- src/core/rng-stream.cc | 130 +++++++++++------- src/core/rng-stream.h | 7 +- 4 files changed, 237 insertions(+), 264 deletions(-) diff --git a/src/core/random-variable.cc b/src/core/random-variable.cc index 44a921348..9775be908 100644 --- a/src/core/random-variable.cc +++ b/src/core/random-variable.cc @@ -45,72 +45,39 @@ namespace ns3{ // Seed Manager //----------------------------------------------------------------------------- -uint32_t SeedManager::seed_[6]={1,2,3,4,5,6}; -bool SeedManager::seedSet=false; -uint32_t SeedManager::runNumber=0; - void SeedManager::SetSeed(uint32_t seed[6]) { - if (SeedManager::seedSet) - { - cerr << "Seed Manager already set!" << endl; - cerr << "Call to SeedManager::SetSeed(...) ignored" << endl; - return; - } - SeedManager::seed_[0]=seed[0]; - SeedManager::seed_[1]=seed[1]; - SeedManager::seed_[2]=seed[2]; - SeedManager::seed_[3]=seed[3]; - SeedManager::seed_[4]=seed[4]; - SeedManager::seed_[5]=seed[5]; - if (!RngStream::CheckSeed(SeedManager::seed_)) - NS_FATAL_ERROR("Invalid seed"); - - SeedManager::seedSet = true; + RngStream::SetPackageSeed (seed); } void SeedManager::GetSeed(uint32_t seed[6]) { - for (int i=0; i<6; i++) - { - seed[i] = seed_[i]; - } + RngStream::GetPackageSeed (seed); } void SeedManager::SetSeed(uint32_t seed) { - uint32_t s[6]; - s[0]=s[1]=s[2]=s[3]=s[4]=s[5]=seed; - SetSeed(s); -} - -uint32_t SeedManager::GetSeed() -{ - uint32_t s[6]; - GetSeed(s); - return s[0]; + RngStream::SetPackageSeed (seed); } void SeedManager::SetRun(uint32_t run) { - runNumber=run; + RngStream::SetPackageRun (run); } uint32_t SeedManager::GetRun() { - return runNumber; + return RngStream::GetPackageRun (); } bool SeedManager::CheckSeed (uint32_t seed) { - uint32_t s[6]; - s[0]=s[1]=s[2]=s[3]=s[4]=s[5]=seed; - return RngStream::CheckSeed(s); + return RngStream::CheckSeed(seed); } bool SeedManager::CheckSeed (uint32_t seed[6]) { - return RngStream::CheckSeed(seed); + return RngStream::CheckSeed(seed); } //----------------------------------------------------------------------------- @@ -129,31 +96,21 @@ public: virtual RandomVariableBase* Copy(void) const = 0; protected: - static void Initialize(); // Initialize the RNG system - static bool initialized; // True if package seed is set RngStream* m_generator; //underlying generator being wrapped }; -bool RandomVariableBase::initialized = false; // True if RngStream seed set - - RandomVariableBase::RandomVariableBase() : m_generator(NULL) { - // it's better to be initialzed first and then set run number, - // it happens in GetValue() automatically - //m_generator = new RngStream(); - //m_generator->InitializeStream(); - //m_generator->ResetNthSubstream(SeedManager::GetRun()); } RandomVariableBase::RandomVariableBase(const RandomVariableBase& r) :m_generator(0) { - if(r.m_generator) - { - m_generator = new RngStream(*r.m_generator); - } + if (r.m_generator) + { + m_generator = new RngStream(*r.m_generator); + } } RandomVariableBase::~RandomVariableBase() @@ -166,15 +123,6 @@ uint32_t RandomVariableBase::GetInteger() return (uint32_t)GetValue(); } -void RandomVariableBase::Initialize() -{ - uint32_t s[6]; - if (RandomVariableBase::initialized) return; // Already initialized and seeded - RandomVariableBase::initialized = true; - SeedManager::GetSeed(s); - RngStream::SetPackageSeed(s); -} - //------------------------------------------------------- RandomVariable::RandomVariable() @@ -287,32 +235,20 @@ UniformVariableImpl::GetMax (void) const double UniformVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } return m_min + m_generator->RandU01() * (m_max - m_min); } double UniformVariableImpl::GetValue(double s, double l) { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } - if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } - return s + m_generator->RandU01() * (l-s); + if(!m_generator) + { + m_generator = new RngStream(); + } + return s + m_generator->RandU01() * (l-s); } RandomVariableBase* UniformVariableImpl::Copy() const @@ -329,7 +265,7 @@ UniformVariable::UniformVariable(double s, double l) double UniformVariable::GetValue() { - return Peek()->GetValue(); + return Peek()->GetValue(); } double UniformVariable::GetValue(double s, double l) @@ -567,18 +503,15 @@ ExponentialVariableImpl::ExponentialVariableImpl(const ExponentialVariableImpl& double ExponentialVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } double r = -m_mean*log(m_generator->RandU01()); - if (m_bound != 0 && r > m_bound) return m_bound; + if (m_bound != 0 && r > m_bound) + { + return m_bound; + } return r; } @@ -669,19 +602,16 @@ ParetoVariableImpl::ParetoVariableImpl(const ParetoVariableImpl& c) double ParetoVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } double scale = m_mean * ( m_shape - 1.0) / m_shape; double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape))); - if (m_bound != 0 && r > m_bound) return m_bound; + if (m_bound != 0 && r > m_bound) + { + return m_bound; + } return r; } @@ -771,19 +701,16 @@ WeibullVariableImpl::WeibullVariableImpl(const WeibullVariableImpl& c) double WeibullVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } double exponent = 1.0 / m_alpha; double r = m_mean * pow( -log(m_generator->RandU01()), exponent); - if (m_bound != 0 && r > m_bound) return m_bound; + if (m_bound != 0 && r > m_bound) + { + return m_bound; + } return r; } @@ -861,16 +788,10 @@ NormalVariableImpl::NormalVariableImpl(const NormalVariableImpl& c) double NormalVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } if (m_nextValid) { // use previously generated m_nextValid = false; @@ -889,10 +810,16 @@ double NormalVariableImpl::GetValue() { // Got good pair double y = sqrt((-2 * log(w))/w); m_next = m_mean + v2 * y * sqrt(m_variance); - if (fabs(m_next) > m_bound) m_next = m_bound * (m_next)/fabs(m_next); + if (fabs(m_next) > m_bound) + { + m_next = m_bound * (m_next)/fabs(m_next); + } m_nextValid = true; double x1 = m_mean + v1 * y * sqrt(m_variance); - if (fabs(x1) > m_bound) x1 = m_bound * (x1)/fabs(x1); + if (fabs(x1) > m_bound) + { + x1 = m_bound * (x1)/fabs(x1); + } return x1; } } @@ -974,21 +901,27 @@ EmpiricalVariableImpl::~EmpiricalVariableImpl() { } double EmpiricalVariableImpl::GetValue() { // Return a value from the empirical distribution // This code based (loosely) on code by Bruce Mah (Thanks Bruce!) - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } - if (emp.size() == 0) return 0.0; // HuH? No empirical data - if (!validated) Validate(); // Insure in non-decreasing + { + m_generator = new RngStream(); + } + if (emp.size() == 0) + { + return 0.0; // HuH? No empirical data + } + if (!validated) + { + Validate(); // Insure in non-decreasing + } double r = m_generator->RandU01(); - if (r <= emp.front().cdf)return emp.front().value; // Less than first - if (r >= emp.back().cdf) return emp.back().value; // Greater than last + if (r <= emp.front().cdf) + { + return emp.front().value; // Less than first + } + if (r >= emp.back().cdf) + { + return emp.back().value; // Greater than last + } // Binary search std::vector::size_type bottom = 0; std::vector::size_type top = emp.size() - 1; @@ -1002,8 +935,14 @@ double EmpiricalVariableImpl::GetValue() r); } // Not here, adjust bounds - if (r < emp[c].cdf) top = c - 1; - else bottom = c + 1; + if (r < emp[c].cdf) + { + top = c - 1; + } + else + { + bottom = c + 1; + } } } @@ -1140,7 +1079,10 @@ DeterministicVariableImpl::~DeterministicVariableImpl() { } double DeterministicVariableImpl::GetValue() { - if (next == count) next = 0; + if (next == count) + { + next = 0; + } return data[next++]; } @@ -1215,16 +1157,10 @@ LogNormalVariableImpl::LogNormalVariableImpl (double mu, double sigma) double LogNormalVariableImpl::GetValue () { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } double u, v, r2, normal, z; do @@ -1296,21 +1232,19 @@ TriangularVariableImpl::TriangularVariableImpl(const TriangularVariableImpl& c) double TriangularVariableImpl::GetValue() { - if(!RandomVariableBase::initialized) - { - RandomVariableBase::Initialize(); - } if(!m_generator) - { - m_generator = new RngStream(); - m_generator->InitializeStream(); - m_generator->ResetNthSubstream(SeedManager::GetRun()); - } + { + m_generator = new RngStream(); + } double u = m_generator->RandU01(); if(u <= (m_mode - m_min) / (m_max - m_min) ) - return m_min + sqrt(u * (m_max - m_min) * (m_mode - m_min) ); + { + return m_min + sqrt(u * (m_max - m_min) * (m_mode - m_min) ); + } else - return m_max - sqrt( (1-u) * (m_max - m_min) * (m_max - m_mode) ); + { + return m_max - sqrt( (1-u) * (m_max - m_min) * (m_max - m_mode) ); + } } RandomVariableBase* TriangularVariableImpl::Copy() const diff --git a/src/core/random-variable.h b/src/core/random-variable.h index ba811ea0f..8e5057cfc 100644 --- a/src/core/random-variable.h +++ b/src/core/random-variable.h @@ -42,50 +42,45 @@ class RandomVariableBase; class SeedManager { -private: - static uint32_t runNumber; - static bool seedSet; - static uint32_t seed_[6]; - public: - /** - * \brief set the seed - * it will duplicate the seed value 6 times - * \code - * SeedManger::SetSeed(15); - * UniformVariable x(2,3); //these will give the same output everytime - * ExponentialVariable y(120); //as long as the seed stays the same - * \endcode - * \param seed - */ - static void SetSeed (uint32_t seed); + /** + * \brief set the seed + * it will duplicate the seed value 6 times + * \code + * SeedManger::SetSeed(15); + * UniformVariable x(2,3); //these will give the same output everytime + * ExponentialVariable y(120); //as long as the seed stays the same + * \endcode + * \param seed + */ + static void SetSeed (uint32_t seed); - /** - * \brief Get the seed value - * \return seed value - */ - static uint32_t GetSeed (); + /** + * \brief Get the seed value + * \return seed value + */ + static uint32_t GetSeed (); - /** - * \brief set the seed - * \code - * uint32_t seed[6]={10,5,2,3,5,11}; - * SeedManger::SetSeed(seed); - * UniformVariable x(2,3); //these will give the same output everytime - * ExponentialVariable y(120); //as long as the seed stays the same - * \endcode - * \param seed - */ - static void SetSeed (uint32_t seed[6]); + /** + * \brief set the seed + * \code + * uint32_t seed[6]={10,5,2,3,5,11}; + * SeedManger::SetSeed(seed); + * UniformVariable x(2,3); //these will give the same output everytime + * ExponentialVariable y(120); //as long as the seed stays the same + * \endcode + * \param seed + */ + static void SetSeed (uint32_t seed[6]); - /** - * \brief Get the seed value - * \param array of size 6 which will hold returned seed values - */ - static void GetSeed (uint32_t seed[6]); + /** + * \brief Get the seed value + * \param array of size 6 which will hold returned seed values + */ + static void GetSeed (uint32_t seed[6]); - /** + /** * \brief Set the run number of simulation * * \code @@ -106,25 +101,24 @@ public: * ...Results for run 1:... * \endcode */ - static void SetRun (uint32_t run); - - /** - * \brief Get the run number - * \return run number - */ - static uint32_t GetRun (); - - /** - * \brief Check if seed value is valid if wanted to be used as seed - * \return true if valid and false if invalid - */ - static bool CheckSeed (uint32_t seed); - - /** - * \brief Checks if seed array has valid values if wanted to be used as further seed - * \return true if valid and false if invalid - */ - static bool CheckSeed (uint32_t seed[6]); + static void SetRun (uint32_t run); + /** + * \returns the current run number + * @sa SetRun + */ + static uint32_t GetRun (void); + + /** + * \brief Check if seed value is valid if wanted to be used as seed + * \return true if valid and false if invalid + */ + static bool CheckSeed (uint32_t seed); + + /** + * \brief Checks if seed array has valid values if wanted to be used as further seed + * \return true if valid and false if invalid + */ + static bool CheckSeed (uint32_t seed[6]); }; diff --git a/src/core/rng-stream.cc b/src/core/rng-stream.cc index bf815dc37..89b76ad94 100644 --- a/src/core/rng-stream.cc +++ b/src/core/rng-stream.cc @@ -300,15 +300,15 @@ bool RngStream::CheckSeed (const uint32_t seed[6]) return true; } -void +uint32_t RngStream::EnsureGlobalInitialized (void) { static bool initialized = false; + static uint32_t run = 0; if (!initialized) { initialized = true; uint32_t seed; - uint32_t run; // First, initialize ourselves from the global value. { IntegerValue value; @@ -351,8 +351,8 @@ RngStream::EnsureGlobalInitialized (void) // finally, actually use these values to do something. uint32_t seedArray [] = {seed, seed, seed, seed, seed, seed}; SetPackageSeed (seedArray); - //XXX set the run number } + return run; } //************************************************************************* @@ -365,7 +365,7 @@ RngStream::EnsureGlobalInitialized (void) // double RngStream::nextSeed[6] = { - 12345.0, 12345.0, 12345.0, 12345.0, 12345.0, 12345.0 + 12345.0, 12345.0, 12345.0, 12345.0, 12345.0, 12345.0 }; //------------------------------------------------------------------------- @@ -373,21 +373,23 @@ double RngStream::nextSeed[6] = // RngStream::RngStream () { - EnsureGlobalInitialized (); - anti = false; - incPrec = false; - // Stream initialization moved to separate method. + uint32_t run = EnsureGlobalInitialized (); + anti = false; + incPrec = false; + // Stream initialization moved to separate method. + InitializeStream (); + ResetNthSubstream (run); } RngStream::RngStream(const RngStream& r) { - anti = r.anti; - incPrec = r.incPrec; - for (int i = 0; i < 6; ++i) { - Cg[i] = r.Cg[i]; - Bg[i] = r.Bg[i]; - Ig[i] = r.Ig[i]; - } + anti = r.anti; + incPrec = r.incPrec; + for (int i = 0; i < 6; ++i) { + Cg[i] = r.Cg[i]; + Bg[i] = r.Bg[i]; + Ig[i] = r.Ig[i]; + } } @@ -395,19 +397,19 @@ void RngStream::InitializeStream() { // Moved from the RngStream constructor above to allow seeding // AFTER the global package seed has been set in the Random // object constructor. - /* Information on a stream. The arrays {Cg, Bg, Ig} contain the current - state of the stream, the starting state of the current SubStream, and the - starting state of the stream. This stream generates antithetic variates - if anti = true. It also generates numbers with extended precision (53 - bits if machine follows IEEE 754 standard) if incPrec = true. nextSeed - will be the seed of the next declared RngStream. */ + /* Information on a stream. The arrays {Cg, Bg, Ig} contain the current + state of the stream, the starting state of the current SubStream, and the + starting state of the stream. This stream generates antithetic variates + if anti = true. It also generates numbers with extended precision (53 + bits if machine follows IEEE 754 standard) if incPrec = true. nextSeed + will be the seed of the next declared RngStream. */ - for (int i = 0; i < 6; ++i) { - Bg[i] = Cg[i] = Ig[i] = nextSeed[i]; - } + for (int i = 0; i < 6; ++i) { + Bg[i] = Cg[i] = Ig[i] = nextSeed[i]; + } - MatVecModM (A1p127, nextSeed, nextSeed, m1); - MatVecModM (A2p127, &nextSeed[3], &nextSeed[3], m2); + MatVecModM (A1p127, nextSeed, nextSeed, m1); + MatVecModM (A2p127, &nextSeed[3], &nextSeed[3], m2); } //------------------------------------------------------------------------- @@ -415,8 +417,8 @@ void RngStream::InitializeStream() // void RngStream::ResetStartStream () { - for (int i = 0; i < 6; ++i) - Cg[i] = Bg[i] = Ig[i]; + for (int i = 0; i < 6; ++i) + Cg[i] = Bg[i] = Ig[i]; } @@ -425,8 +427,8 @@ void RngStream::ResetStartStream () // void RngStream::ResetStartSubstream () { - for (int i = 0; i < 6; ++i) - Cg[i] = Bg[i]; + for (int i = 0; i < 6; ++i) + Cg[i] = Bg[i]; } @@ -435,10 +437,10 @@ void RngStream::ResetStartSubstream () // void RngStream::ResetNextSubstream () { - MatVecModM(A1p76, Bg, Bg, m1); - MatVecModM(A2p76, &Bg[3], &Bg[3], m2); - for (int i = 0; i < 6; ++i) - Cg[i] = Bg[i]; + MatVecModM(A1p76, Bg, Bg, m1); + MatVecModM(A2p76, &Bg[3], &Bg[3], m2); + for (int i = 0; i < 6; ++i) + Cg[i] = Bg[i]; } //------------------------------------------------------------------------- @@ -446,32 +448,70 @@ void RngStream::ResetNextSubstream () // void RngStream::ResetNthSubstream (uint32_t N) { - if(N==0) return; - for(uint32_t i=0;i