function metalogBounded(
randIn,
lowValueIn,
medianValueIn,
highValueIn,
upperBound,
lowerBound
) {
const lowProb = 0.1;
const low = lowValueIn;
const median = medianValueIn;
const high = highValueIn;
const probabilityOfy = randIn;
const cdfX =
(lowerBound +
upperBound *
Math.exp(
Math.log((median - lowerBound) / (upperBound - median)) +
(1 / 2) *
Math.log((1 - lowProb) / lowProb) *
Math.pow(-1, -1) *
Math.log(
(high - lowerBound) /
(upperBound - high) /
(low - lowerBound) /
(upperBound - low)
) *
Math.log(probabilityOfy / (1 - probabilityOfy)) +
Math.pow(
Math.pow(
(1 - 2 * lowProb) * Math.log((1 - lowProb) / lowProb),
-1
) *
Math.log(
(((high - lowerBound) / (upperBound - high)) *
((low - lowerBound) / (upperBound - low))) /
Math.pow((median - lowerBound) / (upperBound - median), 2)
) *
(probabilityOfy - 0.5) *
Math.log(probabilityOfy / (1 - probabilityOfy)),
1
)
)) /
(1 +
Math.exp(
Math.log((median - lowerBound) / (upperBound - median)) +
(1 / 2) *
Math.log((1 - lowProb) / lowProb) *
Math.pow(-1, -1) *
Math.log(
(high - lowerBound) /
(upperBound - high) /
(low - lowerBound) /
(upperBound - low)
) *
Math.log(probabilityOfy / (1 - probabilityOfy)) +
Math.pow(
Math.pow(
(1 - 2 * lowProb) * Math.log((1 - lowProb) / lowProb),
-1
) *
Math.log(
(((high - lowerBound) / (upperBound - high)) *
((low - lowerBound) / (upperBound - low))) /
Math.pow((median - lowerBound) / (upperBound - median), 2)
) *
(probabilityOfy - 0.5) *
Math.log(probabilityOfy / (1 - probabilityOfy)),
1
)
));
return cdfX;
}