diff --git a/src/components/charts/GenericDistributionChart.re b/src/components/charts/GenericDistributionChart.re index 675c9cb7..42bf3200 100644 --- a/src/components/charts/GenericDistributionChart.re +++ b/src/components/charts/GenericDistributionChart.re @@ -1,12 +1,12 @@ module Shapee = { [@react.component] let make = (~shape: DistributionTypes.pointsType, ~timeScale, ~onHover) => { - let discrete = Shape.Any.scaledDiscreteComponent(shape); - let continuous = Shape.Any.scaledContinuousComponent(shape); + let discrete = Shape.PointsType.scaledDiscreteComponent(shape); + let continuous = Shape.PointsType.scaledContinuousComponent(shape);
{ - switch (t) { - | Mixed({continuous, discrete, discreteProbabilityMassFraction}) => - Mixed({ - continuous: continuous |> Shape.Continuous.normalizeCdf, - discrete: discrete |> Shape.Discrete.scaleYToTotal(1.0), - discreteProbabilityMassFraction, - }) - | Discrete(d) => Discrete(d |> Shape.Discrete.scaleYToTotal(1.0)) - | Continuous(continuousShape) => - Continuous(Shape.Continuous.normalizeCdf(continuousShape)) - }; -}; - -let normalizePdf = (t: DistributionTypes.pointsType) => { - switch (t) { - | Mixed({continuous, discrete, discreteProbabilityMassFraction}) => - continuous - |> Shape.Continuous.scalePdf(~scaleTo=1.0) - |> E.O.fmap(r => - Mixed({ - continuous: r, - discrete: discrete |> Shape.Discrete.scaleYToTotal(1.0), - discreteProbabilityMassFraction, - }) - ) - | Discrete(d) => Some(Discrete(d |> Shape.Discrete.scaleYToTotal(1.0))) - | Continuous(continuousShape) => - continuousShape - |> Shape.Continuous.scalePdf(~scaleTo=1.0) - |> E.O.fmap(r => Continuous(r)) - }; -}; - let normalize = (t: genericDistribution): option(genericDistribution) => { switch (t.generationSource) { | Shape(shape) => - normalizePdf(shape) + Shape.PointsType.normalizePdf(shape) |> E.O.fmap(shape => {...t, generationSource: Shape(shape)}) | GuesstimatorString(_) => Some(t) }; @@ -125,7 +91,7 @@ let yIntegral = (t: DistributionTypes.genericDistribution, x) => { let normalize = n => n *. Domain.normalizeProbabilityMass(t.domain); switch (t) { | {generationSource: Shape(shape)} => - Shape.Any.yIntegral(shape, x) + Shape.PointsType.yIntegral(shape, x) |> E.O.fmap(addInitialMass) |> E.O.fmap(normalize) | _ => None diff --git a/src/core/Shape.re b/src/core/Shape.re index 58689e91..f54ade9e 100644 --- a/src/core/Shape.re +++ b/src/core/Shape.re @@ -234,7 +234,7 @@ module Mixed = { }; }; -module Any = { +module PointsType = { type t = DistributionTypes.pointsType; let y = (t: t, x: float) => @@ -318,4 +318,38 @@ module Any = { | Continuous(_) => None }; }; + + let normalizeCdf = (t: DistributionTypes.pointsType) => { + switch (t) { + | Mixed({continuous, discrete, discreteProbabilityMassFraction}) => + Mixed({ + continuous: continuous |> Continuous.normalizeCdf, + discrete: discrete |> Discrete.scaleYToTotal(1.0), + discreteProbabilityMassFraction, + }) + | Discrete(d) => Discrete(d |> Discrete.scaleYToTotal(1.0)) + | Continuous(continuousShape) => + Continuous(Continuous.normalizeCdf(continuousShape)) + }; + }; + + let normalizePdf = (t: DistributionTypes.pointsType) => { + switch (t) { + | Mixed({continuous, discrete, discreteProbabilityMassFraction}) => + continuous + |> Continuous.scalePdf(~scaleTo=1.0) + |> E.O.fmap(r => + Mixed({ + continuous: r, + discrete: discrete |> Discrete.scaleYToTotal(1.0), + discreteProbabilityMassFraction, + }) + ) + | Discrete(d) => Some(Discrete(d |> Discrete.scaleYToTotal(1.0))) + | Continuous(continuousShape) => + continuousShape + |> Continuous.scalePdf(~scaleTo=1.0) + |> E.O.fmap(r => Continuous(r)) + }; + }; }; \ No newline at end of file diff --git a/src/models/EAFunds.re b/src/models/EAFunds.re index 818081ba..e34c1899 100644 --- a/src/models/EAFunds.re +++ b/src/models/EAFunds.re @@ -107,6 +107,21 @@ module Model = { let xRisk = conditionals => Prop.Value.ConditionalArray.get(conditionals, "Global Existential Event"); + // TODO: Fixe number that integral is calculated for + let getGlobalCatastropheChance = dateTime => { + let model = GlobalCatastrophe.Model.make(dateTime); + switch (model) { + | Prop.Value.GenericDistribution(genericDistribution) => + GenericDistribution.renderIfNeeded( + ~sampleCount=1000, + genericDistribution, + ) + |> E.O.bind(_, GenericDistribution.normalize) + |> E.O.bind(_, GenericDistribution.yIntegral(_, 18.0)) + | _ => None + }; + }; + let make = ( group: group, @@ -131,7 +146,14 @@ module Model = { switch (xRisk) { | Some({truthValue: true}) => "0" | Some({truthValue: false}) => difference - | None => "uniform(0,1) > .3 ? " ++ difference ++ ": 0" + | None => + let foo = + getGlobalCatastropheChance(dateTime) + |> E.O.fmap(E.Float.with2DigitsPrecision) + |> E.O.fmap((r: string) => + "uniform(0,1) > " ++ r ++ " ? " ++ difference ++ ": 0" + ); + foo |> E.O.default(""); }; let genericDistribution = diff --git a/src/models/GlobalCatastrophe.re b/src/models/GlobalCatastrophe.re index a0c7ef21..5be38fd7 100644 --- a/src/models/GlobalCatastrophe.re +++ b/src/models/GlobalCatastrophe.re @@ -1,4 +1,4 @@ -let guesstimatorString = "mm(10 to 30, floor(20 to 25), [.5,.5])"; +let guesstimatorString = "20 to 80"; module Model = { let make = (currentDateTime: MomentRe.Moment.t) => { @@ -6,7 +6,6 @@ module Model = { GenericDistribution.make( ~generationSource=GuesstimatorString(guesstimatorString), ~probabilityType=Cdf, - ~domain=RightLimited({xPoint: 200., excludingProbabilityMass: 0.3}), ~unit=TimeDistribution({zero: currentDateTime, unit: `years}), (), );