Merge pull request #1171 from quantified-uncertainty/sampleset-cdf
This commit is contained in:
commit
6d1bc4009f
|
@ -98,6 +98,7 @@ describe("eval on distribution functions", () => {
|
||||||
"log(normal(5,2), normal(10,1))",
|
"log(normal(5,2), normal(10,1))",
|
||||||
"Error(Distribution Math Error: Logarithm of input error: First input must be completely greater than 0)",
|
"Error(Distribution Math Error: Logarithm of input error: First input must be completely greater than 0)",
|
||||||
)
|
)
|
||||||
|
testEval("log(2, SampleSet.fromDist(0.0001 to 5))", "Ok(Sample Set Distribution)") // log with low values, see https://github.com/quantified-uncertainty/squiggle/issues/1098
|
||||||
testEval("log(uniform(5,8))", "Ok(Sample Set Distribution)")
|
testEval("log(uniform(5,8))", "Ok(Sample Set Distribution)")
|
||||||
testEval("log10(uniform(5,8))", "Ok(Sample Set Distribution)")
|
testEval("log10(uniform(5,8))", "Ok(Sample Set Distribution)")
|
||||||
})
|
})
|
||||||
|
|
|
@ -86,6 +86,7 @@ let toFloatOperation = (
|
||||||
| (SampleSet(sampleSet), #Inv(r)) => SampleSetDist.percentile(sampleSet, r)->Some
|
| (SampleSet(sampleSet), #Inv(r)) => SampleSetDist.percentile(sampleSet, r)->Some
|
||||||
| (SampleSet(sampleSet), #Min) => SampleSetDist.min(sampleSet)->Some
|
| (SampleSet(sampleSet), #Min) => SampleSetDist.min(sampleSet)->Some
|
||||||
| (SampleSet(sampleSet), #Max) => SampleSetDist.max(sampleSet)->Some
|
| (SampleSet(sampleSet), #Max) => SampleSetDist.max(sampleSet)->Some
|
||||||
|
| (SampleSet(sampleSet), #Cdf(r)) => SampleSetDist.cdf(sampleSet, r)->Some
|
||||||
| _ => None
|
| _ => None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,22 +278,14 @@ module AlgebraicCombination = {
|
||||||
Right now we don't yet have a way of getting probability mass, so I'll leave this for later.
|
Right now we don't yet have a way of getting probability mass, so I'll leave this for later.
|
||||||
*/
|
*/
|
||||||
let getLogarithmInputError = (t1: t, t2: t, ~toPointSetFn: toPointSetFn): option<error> => {
|
let getLogarithmInputError = (t1: t, t2: t, ~toPointSetFn: toPointSetFn): option<error> => {
|
||||||
let firstOperandIsGreaterThanZero =
|
let isDistGreaterThanZero = t =>
|
||||||
toFloatOperation(
|
toFloatOperation(
|
||||||
t1,
|
t,
|
||||||
~toPointSetFn,
|
~toPointSetFn,
|
||||||
~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten),
|
~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten),
|
||||||
) |> E.R.fmap(r => r > 0.)
|
)->E.R2.fmap(r => r > 0.)
|
||||||
let secondOperandIsGreaterThanZero =
|
|
||||||
toFloatOperation(
|
let items = E.A.R.firstErrorOrOpen([isDistGreaterThanZero(t1), isDistGreaterThanZero(t2)])
|
||||||
t2,
|
|
||||||
~toPointSetFn,
|
|
||||||
~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten),
|
|
||||||
) |> E.R.fmap(r => r > 0.)
|
|
||||||
let items = E.A.R.firstErrorOrOpen([
|
|
||||||
firstOperandIsGreaterThanZero,
|
|
||||||
secondOperandIsGreaterThanZero,
|
|
||||||
])
|
|
||||||
switch items {
|
switch items {
|
||||||
| Error(r) => Some(r)
|
| Error(r) => Some(r)
|
||||||
| Ok([true, _]) =>
|
| Ok([true, _]) =>
|
||||||
|
|
|
@ -131,6 +131,10 @@ let max = t => T.get(t)->E.A.Floats.max
|
||||||
let stdev = t => T.get(t)->E.A.Floats.stdev
|
let stdev = t => T.get(t)->E.A.Floats.stdev
|
||||||
let variance = t => T.get(t)->E.A.Floats.variance
|
let variance = t => T.get(t)->E.A.Floats.variance
|
||||||
let percentile = (t, f) => T.get(t)->E.A.Floats.percentile(f)
|
let percentile = (t, f) => T.get(t)->E.A.Floats.percentile(f)
|
||||||
|
let cdf = (t: t, f: float) => {
|
||||||
|
let countBelowF = t->E.A.reduce(0, (acc, x) => acc + (x <= f ? 1 : 0))
|
||||||
|
countBelowF->Js.Int.toFloat /. t->length->Js.Int.toFloat
|
||||||
|
}
|
||||||
|
|
||||||
let mixture = (values: array<(t, float)>, intendedLength: int) => {
|
let mixture = (values: array<(t, float)>, intendedLength: int) => {
|
||||||
let totalWeight = values->E.A2.fmap(E.Tuple2.second)->E.A.Floats.sum
|
let totalWeight = values->E.A2.fmap(E.Tuple2.second)->E.A.Floats.sum
|
||||||
|
|
Loading…
Reference in New Issue
Block a user