diff --git a/showcase/entries/Continuous.re b/showcase/entries/Continuous.re index 0a1cb4af..e10812ac 100644 --- a/showcase/entries/Continuous.re +++ b/showcase/entries/Continuous.re @@ -5,13 +5,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=UnspecifiedDistribution, (), ) - |> GenericDistribution.renderIfNeeded(~sampleCount=3000); + |> GenericDistribution.renderIfNeeded(~sampleCount=1000); let timeDist = GenericDistribution.make( @@ -30,7 +31,7 @@ let timeDist = }), (), ) - |> GenericDistribution.renderIfNeeded(~sampleCount=3000); + |> GenericDistribution.renderIfNeeded(~sampleCount=1000); let domainLimitedDist = GenericDistribution.make( @@ -40,7 +41,7 @@ let domainLimitedDist = ~unit=UnspecifiedDistribution, (), ) - |> GenericDistribution.renderIfNeeded(~sampleCount=3000); + |> GenericDistribution.renderIfNeeded(~sampleCount=1000); let distributions = () =>
diff --git a/src/core/GenericDistribution.re b/src/core/GenericDistribution.re index f4b4e871..f6bcade7 100644 --- a/src/core/GenericDistribution.re +++ b/src/core/GenericDistribution.re @@ -32,4 +32,17 @@ let renderIfNeeded = ); | Shape(_) => Some(t) }; -}; \ No newline at end of file +} /* }*/; + +// 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 +// }; \ No newline at end of file diff --git a/src/core/Shape.re b/src/core/Shape.re index 7d0ebe06..e2df2f5f 100644 --- a/src/core/Shape.re +++ b/src/core/Shape.re @@ -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, diff --git a/src/models/EAFunds.re b/src/models/EAFunds.re index 82bd736d..4917756f 100644 --- a/src/models/EAFunds.re +++ b/src/models/EAFunds.re @@ -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), diff --git a/src/utility/GuesstimatorLibrary.js b/src/utility/GuesstimatorLibrary.js index 7037dc46..80afdc8d 100644 --- a/src/utility/GuesstimatorLibrary.js +++ b/src/utility/GuesstimatorLibrary.js @@ -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}; };