Bug 485: implement deserialization of normal/gaussian random variables
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Tue, 03 Mar 2009 10:57:42 +0000
changeset 4249 c2d4a91bcc8a
parent 4248 6e0c97efccd0
child 4250 724c9442a9f0
child 4253 732b877beb23
Bug 485: implement deserialization of normal/gaussian random variables
src/core/random-variable.cc
--- a/src/core/random-variable.cc	Sat Feb 28 15:02:15 2009 +0000
+++ b/src/core/random-variable.cc	Tue Mar 03 10:57:42 2009 +0000
@@ -763,6 +763,10 @@
   virtual double GetValue();
   virtual RandomVariableBase* Copy(void) const;
 
+  double GetMean (void) const;
+  double GetVariance (void) const;
+  double GetBound (void) const;
+
 private:
   double m_mean;      // Mean value of RV
   double m_variance;  // Mean value of RV
@@ -835,6 +839,24 @@
   return new NormalVariableImpl(*this);
 }
 
+double
+NormalVariableImpl::GetMean (void) const
+{
+  return m_mean;
+}
+
+double
+NormalVariableImpl::GetVariance (void) const
+{
+  return m_variance;
+}
+
+double
+NormalVariableImpl::GetBound (void) const
+{
+  return m_bound;
+}
+
 NormalVariable::NormalVariable()
   : RandomVariable (NormalVariableImpl ())
 {}
@@ -1280,6 +1302,17 @@
       os << "Uniform:" << uniform->GetMin () << ":" << uniform->GetMax ();
       return os;
     }
+  NormalVariableImpl *normal = dynamic_cast<NormalVariableImpl *> (base);
+  if (normal != 0)
+    {
+      os << "Normal:" << normal->GetMean () << ":" << normal->GetVariance ();
+      double bound = normal->GetBound ();
+      if (bound != NormalVariableImpl::INFINITE_VALUE)
+        {
+          os << ":" << bound;
+        }
+      return os;
+    }
   // XXX: support other distributions
   os.setstate (std::ios_base::badbit);
   return os;
@@ -1325,6 +1358,44 @@
           var = UniformVariable (a, b);
         }
     }
+  else if (type == "Normal")
+    {
+      if (value.size () == 0)
+        {
+          var = NormalVariable ();
+        }
+      else
+        {
+          tmp = value.find (":");
+          if (tmp == value.npos)
+            {
+              NS_FATAL_ERROR ("bad Normal value: " << value);
+            }
+          std::string::size_type tmp2;
+          std::string sub = value.substr (tmp + 1, value.npos);
+          tmp2 = sub.find (":");
+          if (tmp2 == value.npos)
+            {
+              istringstream issA (value.substr (0, tmp));
+              istringstream issB (sub);
+              double a, b;
+              issA >> a;
+              issB >> b;
+              var = NormalVariable (a, b);
+            }
+          else
+            {
+              istringstream issA (value.substr (0, tmp));
+              istringstream issB (sub.substr (0, tmp2));
+              istringstream issC (sub.substr (tmp2 + 1, value.npos));
+              double a, b, c;
+              issA >> a;
+              issB >> b;
+              issC >> c;
+              var = NormalVariable (a, b, c);
+            }
+        }
+    }
   else
     {
       NS_FATAL_ERROR ("RandomVariable deserialization not implemented for " << type);
@@ -1396,10 +1467,24 @@
 
     // Test attribute serialization
     {
-      RandomVariableValue val;
-      val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
-      RandomVariable rng = val.Get ();
-      NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2");
+      {
+        RandomVariableValue val;
+        val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
+        RandomVariable rng = val.Get ();
+        NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2");
+      }
+      {
+        RandomVariableValue val;
+        val.DeserializeFromString ("Normal:0.1:0.2", MakeRandomVariableChecker ());
+        RandomVariable rng = val.Get ();
+        NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2");
+      }
+      {
+        RandomVariableValue val;
+        val.DeserializeFromString ("Normal:0.1:0.2:0.15", MakeRandomVariableChecker ());
+        RandomVariable rng = val.Get ();
+        NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2:0.15");
+      }
     }
 
     return result;