2020-02-16 11:45:19 +00:00
|
|
|
type assumption =
|
|
|
|
| ADDS_TO_1
|
|
|
|
| ADDS_TO_CORRECT_PROBABILITY;
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-02-16 11:45:19 +00:00
|
|
|
type assumptions = {
|
|
|
|
continuous: assumption,
|
|
|
|
discrete: assumption,
|
|
|
|
discreteProbabilityMass: option(float),
|
|
|
|
};
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-04-04 20:37:58 +00:00
|
|
|
let buildSimple = (~continuous: option(DistTypes.continuousShape), ~discrete): option(DistTypes.shape) => {
|
|
|
|
let continuous = continuous |> E.O.default(Distributions.Continuous.make(`Linear, {xs: [||], ys: [||]}))
|
2020-02-24 21:01:29 +00:00
|
|
|
let cLength =
|
2020-03-14 21:18:34 +00:00
|
|
|
continuous
|
|
|
|
|> Distributions.Continuous.getShape
|
|
|
|
|> XYShape.T.xs
|
|
|
|
|> E.A.length;
|
|
|
|
let dLength = discrete |> XYShape.T.xs |> E.A.length;
|
2020-02-24 21:01:29 +00:00
|
|
|
switch (cLength, dLength) {
|
|
|
|
| (0 | 1, 0) => None
|
|
|
|
| (0 | 1, _) => Some(Discrete(discrete))
|
|
|
|
| (_, 0) => Some(Continuous(continuous))
|
|
|
|
| (_, _) =>
|
|
|
|
let discreteProbabilityMassFraction =
|
|
|
|
Distributions.Discrete.T.Integral.sum(~cache=None, discrete);
|
|
|
|
let discrete =
|
|
|
|
Distributions.Discrete.T.scaleToIntegralSum(~intendedSum=1.0, discrete);
|
2020-02-25 12:54:52 +00:00
|
|
|
let continuous =
|
|
|
|
Distributions.Continuous.T.scaleToIntegralSum(
|
|
|
|
~intendedSum=1.0,
|
|
|
|
continuous,
|
|
|
|
);
|
|
|
|
let mixedDist =
|
2020-02-24 21:01:29 +00:00
|
|
|
Distributions.Mixed.make(
|
|
|
|
~continuous,
|
|
|
|
~discrete,
|
|
|
|
~discreteProbabilityMassFraction,
|
2020-02-25 12:54:52 +00:00
|
|
|
);
|
|
|
|
Some(Mixed(mixedDist));
|
2020-02-24 21:01:29 +00:00
|
|
|
};
|
|
|
|
};
|
2020-02-25 12:54:52 +00:00
|
|
|
|
2020-04-05 06:36:14 +00:00
|
|
|
|
|
|
|
// TODO: Delete, only being used in tests
|
2020-02-16 11:45:19 +00:00
|
|
|
let build = (~continuous, ~discrete, ~assumptions) =>
|
|
|
|
switch (assumptions) {
|
|
|
|
| {
|
|
|
|
continuous: ADDS_TO_CORRECT_PROBABILITY,
|
|
|
|
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
|
|
|
discreteProbabilityMass: Some(r),
|
|
|
|
} =>
|
|
|
|
// TODO: Fix this, it's wrong :(
|
|
|
|
Some(
|
2020-02-23 13:14:14 +00:00
|
|
|
Distributions.Mixed.make(
|
2020-02-16 11:45:19 +00:00
|
|
|
~continuous,
|
|
|
|
~discrete,
|
|
|
|
~discreteProbabilityMassFraction=r,
|
|
|
|
),
|
|
|
|
)
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-02-16 11:45:19 +00:00
|
|
|
| {
|
|
|
|
continuous: ADDS_TO_1,
|
|
|
|
discrete: ADDS_TO_1,
|
|
|
|
discreteProbabilityMass: Some(r),
|
|
|
|
} =>
|
|
|
|
Some(
|
2020-02-23 13:14:14 +00:00
|
|
|
Distributions.Mixed.make(
|
2020-02-16 11:45:19 +00:00
|
|
|
~continuous,
|
|
|
|
~discrete,
|
|
|
|
~discreteProbabilityMassFraction=r,
|
|
|
|
),
|
|
|
|
)
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-02-16 11:45:19 +00:00
|
|
|
| {
|
|
|
|
continuous: ADDS_TO_1,
|
|
|
|
discrete: ADDS_TO_1,
|
|
|
|
discreteProbabilityMass: None,
|
|
|
|
} =>
|
|
|
|
None
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-02-16 11:45:19 +00:00
|
|
|
| {
|
|
|
|
continuous: ADDS_TO_CORRECT_PROBABILITY,
|
|
|
|
discrete: ADDS_TO_1,
|
|
|
|
discreteProbabilityMass: None,
|
|
|
|
} =>
|
|
|
|
None
|
2020-02-18 08:51:11 +00:00
|
|
|
|
2020-02-16 11:45:19 +00:00
|
|
|
| {
|
|
|
|
continuous: ADDS_TO_1,
|
|
|
|
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
|
|
|
discreteProbabilityMass: None,
|
|
|
|
} =>
|
2020-02-22 19:21:04 +00:00
|
|
|
let discreteProbabilityMassFraction =
|
2020-02-23 13:14:14 +00:00
|
|
|
Distributions.Discrete.T.Integral.sum(~cache=None, discrete);
|
2020-02-22 19:21:04 +00:00
|
|
|
let discrete =
|
2020-02-23 13:14:14 +00:00
|
|
|
Distributions.Discrete.T.scaleToIntegralSum(~intendedSum=1.0, discrete);
|
2020-02-16 11:45:19 +00:00
|
|
|
Some(
|
2020-02-23 13:14:14 +00:00
|
|
|
Distributions.Mixed.make(
|
2020-02-16 11:45:19 +00:00
|
|
|
~continuous,
|
|
|
|
~discrete,
|
|
|
|
~discreteProbabilityMassFraction,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
| _ => None
|
|
|
|
};
|