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()); }
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 }
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 }
double Gaussian::nextSample() { return rejectionSampling(pdf(mean), getLeftMargin(), getRightMargin()); }