1.1 --- a/src/core/random-variable.cc Sat Feb 28 15:02:15 2009 +0000
1.2 +++ b/src/core/random-variable.cc Tue Mar 03 10:57:42 2009 +0000
1.3 @@ -763,6 +763,10 @@
1.4 virtual double GetValue();
1.5 virtual RandomVariableBase* Copy(void) const;
1.6
1.7 + double GetMean (void) const;
1.8 + double GetVariance (void) const;
1.9 + double GetBound (void) const;
1.10 +
1.11 private:
1.12 double m_mean; // Mean value of RV
1.13 double m_variance; // Mean value of RV
1.14 @@ -835,6 +839,24 @@
1.15 return new NormalVariableImpl(*this);
1.16 }
1.17
1.18 +double
1.19 +NormalVariableImpl::GetMean (void) const
1.20 +{
1.21 + return m_mean;
1.22 +}
1.23 +
1.24 +double
1.25 +NormalVariableImpl::GetVariance (void) const
1.26 +{
1.27 + return m_variance;
1.28 +}
1.29 +
1.30 +double
1.31 +NormalVariableImpl::GetBound (void) const
1.32 +{
1.33 + return m_bound;
1.34 +}
1.35 +
1.36 NormalVariable::NormalVariable()
1.37 : RandomVariable (NormalVariableImpl ())
1.38 {}
1.39 @@ -1280,6 +1302,17 @@
1.40 os << "Uniform:" << uniform->GetMin () << ":" << uniform->GetMax ();
1.41 return os;
1.42 }
1.43 + NormalVariableImpl *normal = dynamic_cast<NormalVariableImpl *> (base);
1.44 + if (normal != 0)
1.45 + {
1.46 + os << "Normal:" << normal->GetMean () << ":" << normal->GetVariance ();
1.47 + double bound = normal->GetBound ();
1.48 + if (bound != NormalVariableImpl::INFINITE_VALUE)
1.49 + {
1.50 + os << ":" << bound;
1.51 + }
1.52 + return os;
1.53 + }
1.54 // XXX: support other distributions
1.55 os.setstate (std::ios_base::badbit);
1.56 return os;
1.57 @@ -1325,6 +1358,44 @@
1.58 var = UniformVariable (a, b);
1.59 }
1.60 }
1.61 + else if (type == "Normal")
1.62 + {
1.63 + if (value.size () == 0)
1.64 + {
1.65 + var = NormalVariable ();
1.66 + }
1.67 + else
1.68 + {
1.69 + tmp = value.find (":");
1.70 + if (tmp == value.npos)
1.71 + {
1.72 + NS_FATAL_ERROR ("bad Normal value: " << value);
1.73 + }
1.74 + std::string::size_type tmp2;
1.75 + std::string sub = value.substr (tmp + 1, value.npos);
1.76 + tmp2 = sub.find (":");
1.77 + if (tmp2 == value.npos)
1.78 + {
1.79 + istringstream issA (value.substr (0, tmp));
1.80 + istringstream issB (sub);
1.81 + double a, b;
1.82 + issA >> a;
1.83 + issB >> b;
1.84 + var = NormalVariable (a, b);
1.85 + }
1.86 + else
1.87 + {
1.88 + istringstream issA (value.substr (0, tmp));
1.89 + istringstream issB (sub.substr (0, tmp2));
1.90 + istringstream issC (sub.substr (tmp2 + 1, value.npos));
1.91 + double a, b, c;
1.92 + issA >> a;
1.93 + issB >> b;
1.94 + issC >> c;
1.95 + var = NormalVariable (a, b, c);
1.96 + }
1.97 + }
1.98 + }
1.99 else
1.100 {
1.101 NS_FATAL_ERROR ("RandomVariable deserialization not implemented for " << type);
1.102 @@ -1396,10 +1467,24 @@
1.103
1.104 // Test attribute serialization
1.105 {
1.106 - RandomVariableValue val;
1.107 - val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
1.108 - RandomVariable rng = val.Get ();
1.109 - NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2");
1.110 + {
1.111 + RandomVariableValue val;
1.112 + val.DeserializeFromString ("Uniform:0.1:0.2", MakeRandomVariableChecker ());
1.113 + RandomVariable rng = val.Get ();
1.114 + NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Uniform:0.1:0.2");
1.115 + }
1.116 + {
1.117 + RandomVariableValue val;
1.118 + val.DeserializeFromString ("Normal:0.1:0.2", MakeRandomVariableChecker ());
1.119 + RandomVariable rng = val.Get ();
1.120 + NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2");
1.121 + }
1.122 + {
1.123 + RandomVariableValue val;
1.124 + val.DeserializeFromString ("Normal:0.1:0.2:0.15", MakeRandomVariableChecker ());
1.125 + RandomVariable rng = val.Get ();
1.126 + NS_TEST_ASSERT_EQUAL (val.SerializeToString (MakeRandomVariableChecker ()), "Normal:0.1:0.2:0.15");
1.127 + }
1.128 }
1.129
1.130 return result;