Example #1
0
void generateW(double * x, double mean, int len, double demand_jump_factor)
{
	std::default_random_engine generator;
	double sigma = sqrt(mean)*demand_jump_factor;
	double sigmaJump = mean / 4;
	std::normal_distribution<double> jumpdistribution(0, sigmaJump);

	x[0] = mean;
	double curP = probabilityDensity(x[0], mean, sigma);

	for (int i = 1; i < len; i++)
	{
		x[i] = x[i - 1];
		double nextX = x[i - 1];
		if (getRandNum(100) <= demand_jump_factor)
			nextX += uniondist(mean);
		else 
			nextX +=jumpdistribution(generator);
		double nextP = probabilityDensity(nextX, mean, sigma);
		if (nextP >= curP)
		{
			curP = nextP;
			x[i] = nextX;
		}
		else
		{
			double u = (0.0+abso(getRandNum(10000))) / 10000;
			if (u < nextP / curP)
			{
				curP = nextP;
				x[i] = nextX;
			}
		}
		if (x[i] < 0)
		{
			x[i] = 0;
			curP = probabilityDensity(0, mean, sigma);
		}
        if (isnan(x[i]))
            printf("Nan...........\n");
	}
}
vector<double>* GaussianEstimator::estimatedWeight_LessThan_EqualTo_GreaterThan_Value(double value) {
    double equalToWeight = probabilityDensity(value) * this->m_weightSum;
    double stdDev = getStdDev();
    double lessThanWeight = stdDev > 0.0 ? normalProbability((value - getMean()) / stdDev)
            * this->m_weightSum - equalToWeight
            : (value < getMean() ? this->m_weightSum - equalToWeight : 0.0);
    double greaterThanWeight = this->m_weightSum - equalToWeight
            - lessThanWeight;
    if (greaterThanWeight < 0.0) {
        greaterThanWeight = 0.0;
    }
    vector<double>* retVec = new vector<double>{lessThanWeight, equalToWeight, greaterThanWeight};
    return retVec;
}