Bug 485: implement deserialization of normal/gaussian random variables

This commit is contained in:
Gustavo J. A. M. Carneiro
2009-03-03 10:57:42 +00:00
parent 50e0ba8801
commit 34c7ac0277

View File

@@ -763,6 +763,10 @@ public:
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 @@ RandomVariableBase* NormalVariableImpl::Copy() const
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 @@ std::ostream &operator << (std::ostream &os, const RandomVariable &var)
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 @@ std::istream &operator >> (std::istream &is, RandomVariable &var)
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 @@ public:
// 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;