Bug 485: implement deserialization of normal/gaussian random variables
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Tue Mar 03 10:57:42 2009 +0000 (11 months ago)
changeset 4249c2d4a91bcc8a
parent 4248 6e0c97efccd0
child 4250 724c9442a9f0
child 4253 732b877beb23
Bug 485: implement deserialization of normal/gaussian random variables
src/core/random-variable.cc
     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;