bug 181: Normal Variable Infinite Value & Bounds

This commit is contained in:
Raj Bhattacharjea
2008-06-13 17:19:53 -07:00
parent de189d447c
commit 1aef4543cc
2 changed files with 43 additions and 9 deletions

View File

@@ -1043,11 +1043,21 @@ double NormalVariableImpl::GetValue()
{ // Got good pair
double y = sqrt((-2 * log(w))/w);
m_next = m_mean + v2 * y * sqrt(m_variance);
if (fabs(m_next) > m_bound) m_next = m_bound * (m_next)/fabs(m_next);
m_nextValid = true;
//if next is in bounds, it is valid
m_nextValid = fabs(m_next-m_mean) <= m_bound;
double x1 = m_mean + v1 * y * sqrt(m_variance);
if (fabs(x1) > m_bound) x1 = m_bound * (x1)/fabs(x1);
return x1;
//if x1 is in bounds, return it
if (fabs(x1-m_mean) <= m_bound)
{
return x1;
}
//otherwise try and return m_next if it is valid
else if (m_nextValid)
{
m_nextValid = false;
return m_next;
}
//otherwise, just run this loop again
}
}
}
@@ -1094,10 +1104,18 @@ double NormalVariableImpl::GetSingleValue(double m, double v, double b)
NormalVariable::NormalVariable()
: RandomVariable (NormalVariableImpl ())
{}
NormalVariable::NormalVariable(double m, double v)
: RandomVariable (NormalVariableImpl (m, v))
{}
NormalVariable::NormalVariable(double m, double v, double b)
: RandomVariable (NormalVariableImpl (m, v, b))
{}
double
NormalVariable::GetSingleValue(double m, double v)
{
return NormalVariableImpl::GetSingleValue (m, v);
}
double
NormalVariable::GetSingleValue(double m, double v, double b)
{
return NormalVariableImpl::GetSingleValue (m, v, b);

View File

@@ -490,27 +490,43 @@ public:
class NormalVariable : public RandomVariable
{
public:
static const double INFINITE_VALUE;
/**
* Constructs an normal random variable with a mean
* value of 0 and variance of 1.
*/
NormalVariable();
/**
* \brief Construct a normal random variable with specified mean and variance.
* \param m Mean value
* \param v Variance
*/
NormalVariable(double m, double v);
/**
* \brief Construct a normal random variable with specified mean and variance
* \param m Mean value
* \param v Variance
* \param b Bound. The NormalVariable is bounded within +-bound.
* \param b Bound. The NormalVariable is bounded symetrically about the mean
* [mean-bound,mean+bound]
*/
NormalVariable(double m, double v, double b = INFINITE_VALUE);
NormalVariable(double m, double v, double b);
/**
* \param m Mean value
* \param v Variance
* \param b Bound. The NormalVariable is bounded within +-bound.
* \return A random number from a distribution specified by m, and v.
*/
static double GetSingleValue(double m, double v);
/**
* \param m Mean value
* \param v Variance
* \param b Bound. The NormalVariable is bounded symetrically about the mean
* [mean-bound,mean+bound]
* \return A random number from a distribution specified by m,v, and b.
*/
static double GetSingleValue(double m, double v, double b = INFINITE_VALUE);
static double GetSingleValue(double m, double v, double b);
};
/**