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; }