src/core/random-variable.cc
changeset 2628 88cdcd394491
parent 2445 e1b65471f159
child 2947 b0fec3381418
--- a/src/core/random-variable.cc	Wed Mar 19 15:43:08 2008 -0700
+++ b/src/core/random-variable.cc	Thu Mar 20 15:10:56 2008 +0000
@@ -1630,18 +1630,38 @@
       return is;
     }
   std::string type = value.substr (0, tmp);
-  if (value == "Constant")
+  value = value.substr (tmp + 1, value.npos);
+  if (type == "Constant")
     {
-      // XXX parse
-      var = ConstantVariable ();
+      istringstream iss (value);
+      double constant;
+      iss >> constant;
+      var = ConstantVariable (constant);
     }
-  else if (value == "Uniform")
+  else if (type == "Uniform")
     {
-      // XXX parse
-      var = UniformVariable ();
+      if (value.size () == 0)
+        {
+          var = UniformVariable ();
+        }
+      else
+        {
+          tmp = value.find (":");
+          if (tmp == value.npos)
+            {
+              NS_FATAL_ERROR ("bad Uniform value: " << value);
+            }
+          istringstream issA (value.substr (0, tmp));
+          istringstream issB (value.substr (tmp + 1, value.npos));
+          double a, b;
+          issA >> a;
+          issB >> b;
+          var = UniformVariable (a, b);
+        }
     }
   else
     {
+      NS_FATAL_ERROR ("RandomVariable deserialization not implemented for " << type);
       // XXX: support other distributions.
     }
   return is;
@@ -1665,7 +1685,7 @@
   RandomVariableTest () : Test ("RandomVariable") {}
   virtual bool RunTests (void)
   {
-    bool ok = true;
+    bool result = true;
     const double desired_mean = 1.0;
     const double desired_stddev = 1.0;
     double tmp = log (1 + (desired_stddev/desired_mean)*(desired_stddev/desired_mean));
@@ -1695,13 +1715,13 @@
 
       if (not (obtained_mean/desired_mean > 0.90 and obtained_mean/desired_mean < 1.10))
         {
-          ok = false;
+          result = false;
           Failure () << "Obtained lognormal mean value " << obtained_mean << ", expected " << desired_mean << std::endl;
         }
 
       if (not (obtained_stddev/desired_stddev > 0.90 and obtained_stddev/desired_stddev < 1.10))
         {
-          ok = false;
+          result = false;
           Failure () << "Obtained lognormal stddev value " << obtained_stddev <<
             ", expected " << desired_stddev << std::endl;
         }
@@ -1729,20 +1749,28 @@
 
       if (not (obtained_mean/desired_mean > 0.90 and obtained_mean/desired_mean < 1.10))
         {
-          ok = false;
+          result = false;
           Failure () << "Obtained LogNormalVariable::GetSingleValue mean value " << obtained_mean
                      << ", expected " << desired_mean << std::endl;
         }
 
       if (not (obtained_stddev/desired_stddev > 0.90 and obtained_stddev/desired_stddev < 1.10))
         {
-          ok = false;
+          result = false;
           Failure () << "Obtained LogNormalVariable::GetSingleValue stddev value " << obtained_stddev <<
             ", expected " << desired_stddev << std::endl;
         }
     }
 
-    return ok;
+    // 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");
+    }
+
+    return result;
   }
 };