Improved handling of mixed discreteProbabilityMassFraction
This commit is contained in:
parent
03cc7293a4
commit
5de75a402b
|
@ -61,10 +61,19 @@ module Value = {
|
|||
let newDistribution =
|
||||
GenericDistribution.renderIfNeeded(~sampleCount=1000, r);
|
||||
switch (newDistribution) {
|
||||
| Some({generationSource: Shape(Mixed({continuous: n, discrete: d}))}) =>
|
||||
| Some({
|
||||
generationSource:
|
||||
Shape(
|
||||
Mixed({
|
||||
continuous: n,
|
||||
discrete: d,
|
||||
discreteProbabilityMassFraction: f,
|
||||
}),
|
||||
),
|
||||
}) =>
|
||||
<div>
|
||||
<Chart height=100 data={n |> Shape.Continuous.toJs} />
|
||||
{Shape.Discrete.render(d)}
|
||||
{d |> Shape.Discrete.scaleYToTotal(f) |> Shape.Discrete.render}
|
||||
</div>
|
||||
| None => "Something went wrong" |> ReasonReact.string
|
||||
| _ => <div />
|
||||
|
|
|
@ -38,7 +38,7 @@ module Discrete = {
|
|||
Belt.Array.zip(p.xs, p.ys)
|
||||
->Belt.Array.reduce([||], (items, (x, y)) =>
|
||||
switch (_lastElement(items)) {
|
||||
| Some((_, yLast)) => [|(x, y +. yLast)|]
|
||||
| Some((_, yLast)) => E.A.append(items, [|(x, y +. yLast)|])
|
||||
| None => [|(x, y)|]
|
||||
}
|
||||
)
|
||||
|
@ -46,6 +46,16 @@ module Discrete = {
|
|||
fromArrays(xs, ys);
|
||||
};
|
||||
|
||||
let ySum = (t: t) => {
|
||||
E.A.fold_left((a, b) => a +. b, 0., t.ys);
|
||||
};
|
||||
|
||||
let scaleYToTotal = (totalDesired, t: t): t => {
|
||||
let currentSum = ySum(t);
|
||||
let difference = totalDesired /. currentSum;
|
||||
{xs: t.xs, ys: t.ys |> E.A.fmap(y => y *. difference)};
|
||||
};
|
||||
|
||||
let render = (t: t) =>
|
||||
Belt.Array.zip(t.xs, t.ys)
|
||||
|> E.A.fmap(((x, y)) =>
|
||||
|
@ -109,11 +119,11 @@ module Mixed = {
|
|||
| {
|
||||
continuous: ADDS_TO_1,
|
||||
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
||||
discreteProbabilityMass: Some(r),
|
||||
discreteProbabilityMass: None,
|
||||
} =>
|
||||
Some(
|
||||
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
||||
)
|
||||
let discreteProbabilityMassFraction = Discrete.ySum(discrete);
|
||||
let discrete = Discrete.scaleYToTotal(1.0, discrete);
|
||||
Some(make(~continuous, ~discrete, ~discreteProbabilityMassFraction));
|
||||
| _ => None
|
||||
};
|
||||
};
|
||||
|
|
|
@ -28,7 +28,7 @@ module Internals = {
|
|||
let assumptions: Shape.Mixed.Builder.assumptions = {
|
||||
continuous: ADDS_TO_1,
|
||||
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
||||
discreteProbabilityMass: Some(0.3),
|
||||
discreteProbabilityMass: None,
|
||||
};
|
||||
Shape.Mixed.Builder.build(
|
||||
~continuous=toContinous(r),
|
||||
|
|
Loading…
Reference in New Issue
Block a user