Ejemplo n.º 1
0
double SumOfUniforms::nextSample()
{
	double maxprob;
	switch(case_flag)
	{
		case 0:
			maxprob = 1 / range1;
			break;
		case 1:
			maxprob = 1 / range2;
			break;
		case 2:
			maxprob = pdf(a1 + b2);
			break;
		default:
			break;
	}
	return rejectionSampling(maxprob, getLeftMargin(), getRightMargin());
}
Ejemplo n.º 2
0
double SumOfUniforms::cdf(double x)
{
	if (x <= getLeftMargin())
		return 0;
	if (x >= getRightMargin())
		return 1;

	switch(case_flag)
	{
		case 0:
			if (x < a1 + b2)
				return (x * x - 2 *
						a12 * x) / (2 * range1 * range2) + c1;
			else if (x < a2 + b1)
				return x / range1 + c2;
			else // if (x < b1 + b2) // covered in the beginning
				return (-(x * x) + 2 * b12 * x) / (2 * range1 * range2) + c3;
			break;
		case 1:
			if (x < a2 + b1)
				return (x * x - 2 * a12 * x) / (2 * range1 * range2) + c1;
			else if (x < a1 + b2)
				return x / range2 + c2;
			else // if (x < b1 + b2) // covered in the beginning
				return (-(x * x) + 2 * b12 * x) / (2 * range1 * range2) + c3;
			break;
		case 2:
			if (x <= a1 + b2)
				return (x * x - 2 * a12 * x) / (2 * range1 * range2) + c1;
			else // if (x < b1 + b2) // cover in the beginning
				return (-(x * x) + 2 * b12 * x) / (2 * range1 * range2) + c3;
			break;
		default:
			break;
	}
	throw 0; // this should never happen
}
Ejemplo n.º 3
0
double SumOfUniforms::pdf(double x)
{
	if (x <= getLeftMargin())
		return 0;
	if (x >= getRightMargin())
		return 0;

	switch(case_flag)
	{
		case 0:
			if (x < a1 + b2)
				return (x - a12) / (range1 * range2);
			else if (x < a2 + b1)
				return 1 / range1;
			else // if (x < b1 + b2) // covered in the beginning
				return (-x + b12) / (range1 * range2);
			break;
		case 1:
			if (x < a2 + b1)
				return (x - a12) / (range1 * range2);
			else if (x < a1 + b2)
				return 1 / range2;
			else // if (x < b1 + b2) // covered in the beginning
				return (-x + b12) / (range1 * range2);
			break;
		case 2:
			if (x <= a1 + b2)
				return (x - a12) / (range1 * range2);
			else // if (x < b1 + b2) // cover in the beginning
				return (-x + b12) / (range1 * range2);
			break;
		default:
			break;
	}
	throw 0; // this should never happen
}
Ejemplo n.º 4
0
double Gaussian::nextSample()
{
	return rejectionSampling(pdf(mean), getLeftMargin(), getRightMargin());
}