Beginning of massWithin functionality

This commit is contained in:
Ozzie Gooen 2020-02-18 13:23:02 +00:00
parent c99a294f44
commit 9e5561a7b8
6 changed files with 59 additions and 8 deletions

View File

@ -7,13 +7,14 @@ let data: DistributionTypes.xyShape = {
let mixedDist =
GenericDistribution.make(
~generationSource=GuesstimatorString("mm(3, normal(5,1), [.5,.5])"),
~generationSource=
GuesstimatorString("mm(uniform(10,12), normal(5,1), [.5,.5])"),
~probabilityType=Pdf,
~domain=Complete,
~unit=Unspecified,
(),
)
|> GenericDistribution.renderIfNeeded(~sampleCount=3000);
|> GenericDistribution.renderIfNeeded(~sampleCount=1000);
let timeDist =
GenericDistribution.make(
@ -23,7 +24,7 @@ let timeDist =
~unit=Time({zero: MomentRe.momentNow(), unit: `years}),
(),
)
|> GenericDistribution.renderIfNeeded(~sampleCount=3000);
|> GenericDistribution.renderIfNeeded(~sampleCount=1000);
let domainLimitedDist =
GenericDistribution.make(
@ -33,7 +34,7 @@ let domainLimitedDist =
~unit=Unspecified,
(),
)
|> GenericDistribution.renderIfNeeded(~sampleCount=3000);
|> GenericDistribution.renderIfNeeded(~sampleCount=1000);
let distributions = () =>
<div>

View File

@ -61,7 +61,8 @@ let make = (~dist) => {
),
}) =>
<div>
<Continuous data={n |> Shape.Continuous.toPdf} />
<Continuous data=n />
<Continuous data={n |> Shape.XYShape.integral} />
{d |> Shape.Discrete.scaleYToTotal(f) |> Shape.Discrete.render}
</div>
| _ => <div />

View File

@ -31,4 +31,17 @@ let renderIfNeeded =
);
| Shape(_) => Some(t)
};
};
} /* }*/;
// let getTimeY =
// (t: genericDistribution, point: TimeTypes.RelativeTimePoint.timeInVector) => {
// switch (t) {
// | {
// generationSource: Shape(shape),
// probabilityType: Pdf,
// unit: Time(timeVector),
// } =>
// TimeTypes.RelativeTimePoint.toXValue(timeVector, point)
// |> E.O.fmap(x => Shape.Mixed.getY(t, x))
// | _ => 2.0
// };

View File

@ -6,6 +6,10 @@ let _lastElement = (a: array('a)) =>
| n => Belt.Array.get(a, n - 1)
};
type pointInRange =
| Unbounded
| X(float);
module XYShape = {
type t = xyShape;
@ -37,8 +41,19 @@ module XYShape = {
fromArrays(xs, ys);
};
let getY = (t: t, x: float) => x;
let integral = transverse((aCurrent, aLast) => aCurrent +. aLast);
let derivative = transverse((aCurrent, aLast) => aCurrent -. aLast);
let massWithin = (t: t, left: pointInRange, right: pointInRange) => {
switch (left, right) {
| (Unbounded, Unbounded) => t |> ySum
| (Unbounded, X(f)) => t |> integral |> getY(_, f)
| (X(f), Unbounded) => ySum(t) -. getY(integral(t), f)
| (X(l), X(r)) => getY(integral(t), r) -. getY(integral(t), l)
};
};
};
module Continuous = {
@ -99,6 +114,25 @@ module Mixed = {
};
};
module Any = {
type t = DistributionTypes.pointsType;
let x = (t: t, x: float) =>
switch (t) {
| Mixed(m) => `mixed(Mixed.getY(m, x))
| Discrete(discreteShape) => `discrete(Discrete.findY(x, discreteShape))
| Continuous(continuousShape) =>
`continuous(Continuous.findY(x, continuousShape))
};
let massInRange = (t: t, left: pointInRange, right: pointInRange) =>
switch (t) {
| Mixed(m) => 3.0
| Discrete(discreteShape) => 2.0
| Continuous(continuousShape) => 3.0
};
};
module DomainMixed = {
type t = {
mixedShape,

View File

@ -126,12 +126,14 @@ module Model = {
currentDateTime,
yearlyMeanGrowthRateIfNotClosed(group),
);
let str =
switch (xRisk) {
| Some({truthValue: true}) => "0"
| Some({truthValue: false}) => difference
| None => "uniform(0,1) > .3 ? " ++ difference ++ ": 0"
};
let genericDistribution =
GenericDistribution.make(
~generationSource=GuesstimatorString(str),

View File

@ -48,8 +48,8 @@ const toPdf = (values, sampleCount, min, max) => {
const ratioSize$ = ratioSize(samples);
const width = ratioSize$ === 'SMALL' ? 20 : 1;
const cdf = samples.toCdf({ size: sampleCount, width, min, max });
continuous = cdf;
const pdf = samples.toPdf({ size: sampleCount, width, min, max });
continuous = pdf;
}
return {continuous, discrete};
};