Making model accessible with GenericDistribution
This commit is contained in:
parent
626b4f65c3
commit
beda0b61ed
|
@ -26,19 +26,18 @@ let _lastElement = (a: array('a)) =>
|
||||||
|
|
||||||
let probabilityBeforeDomainMax = (t: t) => _lastElement(t.distribution.ys);
|
let probabilityBeforeDomainMax = (t: t) => _lastElement(t.distribution.ys);
|
||||||
|
|
||||||
let domainMaxX = (t: t) => t.domainMaxX;
|
let domainMaxX = (t: t) => t.domainMaxX /* CdfLibrary.Distribution.findX(yPoint, t.distribution)*/;
|
||||||
|
|
||||||
let probabilityDistribution = (t: t) =>
|
// let probabilityDistribution = (t: t) =>
|
||||||
t.distribution |> CdfLibrary.Distribution.toPdf;
|
// t.distribution |> CdfLibrary.Distribution.toPdf;
|
||||||
|
|
||||||
let probability = (t: t, xPoint: float) =>
|
// let probability = (t: t, xPoint: float) =>
|
||||||
CdfLibrary.Distribution.findY(xPoint, probabilityDistribution(t));
|
// CdfLibrary.Distribution.findY(xPoint, probabilityDistribution(t));
|
||||||
|
|
||||||
let probabilityInverse = (t: t, yPoint: float) =>
|
// let probabilityInverse = (t: t, yPoint: float) =>
|
||||||
CdfLibrary.Distribution.findX(yPoint, probabilityDistribution(t));
|
// CdfLibrary.Distribution.findX(yPoint, probabilityDistribution(t));
|
||||||
|
|
||||||
let cumulativeProbability = (t: t, xPoint: float) =>
|
// let cumulativeProbability = (t: t, xPoint: float) =>
|
||||||
CdfLibrary.Distribution.findY(xPoint, t.distribution);
|
// CdfLibrary.Distribution.findY(xPoint, t.distribution);
|
||||||
|
|
||||||
let cumulativeProbabilityInverse = (t: t, yPoint: float) =>
|
// let cumulativeProbabilityInverse = (t: t, yPoint: float) =>
|
||||||
CdfLibrary.Distribution.findX(yPoint, t.distribution);
|
|
|
@ -27,21 +27,20 @@ let probabilityBeforeDomainMax = (t: t) =>
|
||||||
LimitedDomainCdf.probabilityBeforeDomainMax(t.limitedDomainCdf);
|
LimitedDomainCdf.probabilityBeforeDomainMax(t.limitedDomainCdf);
|
||||||
|
|
||||||
let domainMaxX = (t: t) =>
|
let domainMaxX = (t: t) =>
|
||||||
LimitedDomainCdf.probabilityBeforeDomainMax(t.limitedDomainCdf);
|
LimitedDomainCdf.probabilityBeforeDomainMax(t.limitedDomainCdf) /* |> (r => RelativeTimePoint.toTime(t.timeVector, XValue(r)))*/;
|
||||||
|
|
||||||
let probability = (t: t, m: MomentRe.Moment.t) => {
|
// let probability = (t: t, m: MomentRe.Moment.t) => {
|
||||||
RelativeTimePoint.toXValue(t.timeVector, Time(m))
|
// RelativeTimePoint.toXValue(t.timeVector, Time(m))
|
||||||
|> LimitedDomainCdf.probability(t.limitedDomainCdf);
|
// |> LimitedDomainCdf.probability(t.limitedDomainCdf);
|
||||||
};
|
// };
|
||||||
|
|
||||||
let probabilityInverse = (t: t, y: float) =>
|
// let probabilityInverse = (t: t, y: float) =>
|
||||||
LimitedDomainCdf.probabilityInverse(t.limitedDomainCdf, y)
|
// LimitedDomainCdf.probabilityInverse(t.limitedDomainCdf, y)
|
||||||
|> (r => RelativeTimePoint.toTime(t.timeVector, XValue(r)));
|
// |> (r => RelativeTimePoint.toTime(t.timeVector, XValue(r)));
|
||||||
|
|
||||||
let cumulativeProbability = (t: t, m: MomentRe.Moment.t) =>
|
// let cumulativeProbability = (t: t, m: MomentRe.Moment.t) =>
|
||||||
RelativeTimePoint.toXValue(t.timeVector, Time(m))
|
// RelativeTimePoint.toXValue(t.timeVector, Time(m))
|
||||||
|> LimitedDomainCdf.cumulativeProbability(t.limitedDomainCdf);
|
// |> LimitedDomainCdf.cumulativeProbability(t.limitedDomainCdf);
|
||||||
|
|
||||||
let cumulativeProbabilityInverse = (t: t, y: float) =>
|
// let cumulativeProbabilityInverse = (t: t, y: float) =>
|
||||||
LimitedDomainCdf.cumulativeProbabilityInverse(t.limitedDomainCdf, y)
|
// LimitedDomainCdf.cumulativeProbabilityInverse(t.limitedDomainCdf, y)
|
||||||
|> (r => RelativeTimePoint.toTime(t.timeVector, XValue(r)));
|
|
|
@ -49,88 +49,3 @@ type genericDistribution = {
|
||||||
domain,
|
domain,
|
||||||
unit: distributionUnit,
|
unit: distributionUnit,
|
||||||
};
|
};
|
||||||
|
|
||||||
module Shape = {
|
|
||||||
module Continuous = {
|
|
||||||
let fromArrays = (xs, ys): continuousShape => {xs, ys};
|
|
||||||
};
|
|
||||||
|
|
||||||
module Discrete = {
|
|
||||||
let fromArrays = (xs, ys): continuousShape => {xs, ys};
|
|
||||||
};
|
|
||||||
|
|
||||||
module Mixed = {
|
|
||||||
let make = (~continuous, ~discrete, ~discreteProbabilityMassFraction) => {
|
|
||||||
continuous,
|
|
||||||
discrete,
|
|
||||||
discreteProbabilityMassFraction,
|
|
||||||
};
|
|
||||||
|
|
||||||
module Builder = {
|
|
||||||
type assumption =
|
|
||||||
| ADDS_TO_1
|
|
||||||
| ADDS_TO_CORRECT_PROBABILITY;
|
|
||||||
type assumptions = {
|
|
||||||
continuous: assumption,
|
|
||||||
discrete: assumption,
|
|
||||||
discreteProbabilityMass: option(float),
|
|
||||||
};
|
|
||||||
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(
|
|
||||||
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
|
||||||
)
|
|
||||||
| {
|
|
||||||
continuous: ADDS_TO_1,
|
|
||||||
discrete: ADDS_TO_1,
|
|
||||||
discreteProbabilityMass: Some(r),
|
|
||||||
} =>
|
|
||||||
Some(
|
|
||||||
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
|
||||||
)
|
|
||||||
| {
|
|
||||||
continuous: ADDS_TO_1,
|
|
||||||
discrete: ADDS_TO_1,
|
|
||||||
discreteProbabilityMass: None,
|
|
||||||
} =>
|
|
||||||
None
|
|
||||||
| {
|
|
||||||
continuous: ADDS_TO_CORRECT_PROBABILITY,
|
|
||||||
discrete: ADDS_TO_1,
|
|
||||||
discreteProbabilityMass: None,
|
|
||||||
} =>
|
|
||||||
None
|
|
||||||
| {
|
|
||||||
continuous: ADDS_TO_1,
|
|
||||||
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
|
||||||
discreteProbabilityMass: None,
|
|
||||||
} =>
|
|
||||||
None
|
|
||||||
| _ => None
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
module GenericDistribution = {
|
|
||||||
let make =
|
|
||||||
(
|
|
||||||
~generationSource,
|
|
||||||
~probabilityType=Pdf,
|
|
||||||
~domain=Complete,
|
|
||||||
~unit=Unspecified,
|
|
||||||
(),
|
|
||||||
)
|
|
||||||
: genericDistribution => {
|
|
||||||
generationSource,
|
|
||||||
probabilityType,
|
|
||||||
domain,
|
|
||||||
unit,
|
|
||||||
};
|
|
||||||
};
|
|
34
src/lib/GenericDistribution.re
Normal file
34
src/lib/GenericDistribution.re
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
open DistributionTypes;
|
||||||
|
let make =
|
||||||
|
(
|
||||||
|
~generationSource,
|
||||||
|
~probabilityType=Pdf,
|
||||||
|
~domain=Complete,
|
||||||
|
~unit=Unspecified,
|
||||||
|
(),
|
||||||
|
)
|
||||||
|
: genericDistribution => {
|
||||||
|
generationSource,
|
||||||
|
probabilityType,
|
||||||
|
domain,
|
||||||
|
unit,
|
||||||
|
};
|
||||||
|
|
||||||
|
let renderIfNeeded =
|
||||||
|
(~sampleCount=1000, t: genericDistribution): option(genericDistribution) => {
|
||||||
|
switch (t.generationSource) {
|
||||||
|
| GuesstimatorString(s) =>
|
||||||
|
let shape = Guesstimator.stringToMixedShape(~string=s, ~sampleCount, ());
|
||||||
|
shape
|
||||||
|
|> E.O.fmap((shape: DistributionTypes.mixedShape) =>
|
||||||
|
make(
|
||||||
|
~generationSource=Shape(Mixed(shape)),
|
||||||
|
~probabilityType=Cdf,
|
||||||
|
~domain=t.domain,
|
||||||
|
~unit=t.unit,
|
||||||
|
(),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
| Shape(_) => Some(t)
|
||||||
|
};
|
||||||
|
};
|
|
@ -15,6 +15,7 @@ module Value = {
|
||||||
| FloatPoint(float)
|
| FloatPoint(float)
|
||||||
| Probability(float)
|
| Probability(float)
|
||||||
| Conditional(conditional)
|
| Conditional(conditional)
|
||||||
|
| GenericDistribution(DistributionTypes.genericDistribution)
|
||||||
| TimeLimitedDomainCdf(TimeLimitedDomainCdf.t)
|
| TimeLimitedDomainCdf(TimeLimitedDomainCdf.t)
|
||||||
| TimeLimitedDomainCdfLazy(
|
| TimeLimitedDomainCdfLazy(
|
||||||
(string => Types.ContinuousDistribution.t) => TimeLimitedDomainCdf.t,
|
(string => Types.ContinuousDistribution.t) => TimeLimitedDomainCdf.t,
|
||||||
|
@ -31,6 +32,7 @@ module Value = {
|
||||||
}
|
}
|
||||||
| SelectSingle(r) => r
|
| SelectSingle(r) => r
|
||||||
| FloatCdf(r) => r
|
| FloatCdf(r) => r
|
||||||
|
| GenericDistribution(_) => ""
|
||||||
| TimeLimitedDomainCdf(_) => ""
|
| TimeLimitedDomainCdf(_) => ""
|
||||||
| TimeLimitedDomainCdfLazy(_) => ""
|
| TimeLimitedDomainCdfLazy(_) => ""
|
||||||
| Probability(r) => (r *. 100. |> Js.Float.toFixed) ++ "%"
|
| Probability(r) => (r *. 100. |> Js.Float.toFixed) ++ "%"
|
||||||
|
@ -55,41 +57,29 @@ module Value = {
|
||||||
| SelectSingle(r) => r |> ReasonReact.string
|
| SelectSingle(r) => r |> ReasonReact.string
|
||||||
| ConditionalArray(r) => "Array" |> ReasonReact.string
|
| ConditionalArray(r) => "Array" |> ReasonReact.string
|
||||||
| Conditional(r) => r.name |> ReasonReact.string
|
| Conditional(r) => r.name |> ReasonReact.string
|
||||||
| TimeLimitedDomainCdfLazy(r) => <div />
|
| GenericDistribution(r) =>
|
||||||
// let timeLimited = r(CdfLibrary.Distribution.fromString(_, 1000));
|
let newDistribution =
|
||||||
// let cdf = timeLimited.limitedDomainCdf.distribution;
|
GenericDistribution.renderIfNeeded(~sampleCount=1000, r);
|
||||||
// <>
|
switch (newDistribution) {
|
||||||
// <Chart height=100 data={cdf |> Types.ContinuousDistribution.toJs} />
|
| Some({generationSource: Shape(Mixed({continuous: n}))}) =>
|
||||||
// <Chart
|
<div>
|
||||||
// height=100
|
<Chart height=100 data={n |> Shape.Continuous.toJs} />
|
||||||
// data={
|
<Chart
|
||||||
// cdf
|
height=100
|
||||||
// |> CdfLibrary.Distribution.toPdf
|
data={n |> Shape.Continuous.toCdf |> Shape.Continuous.toJs}
|
||||||
// |> Types.ContinuousDistribution.toJs
|
/>
|
||||||
// }
|
</div>
|
||||||
// />
|
| None => "Something went wrong" |> ReasonReact.string
|
||||||
// {FloatCdf.logNormal(50., 20.) |> ReasonReact.string}
|
| _ => <div />
|
||||||
// </>;
|
};
|
||||||
|
| TimeLimitedDomainCdfLazy(_) => <div />
|
||||||
| TimeLimitedDomainCdf(r) =>
|
| TimeLimitedDomainCdf(r) =>
|
||||||
let cdf: Types.ContinuousDistribution.t =
|
let cdf: Types.ContinuousDistribution.t =
|
||||||
r.limitedDomainCdf.distribution;
|
r.limitedDomainCdf.distribution;
|
||||||
<>
|
<>
|
||||||
<Chart height=100 data={cdf |> Types.ContinuousDistribution.toJs} />
|
<Chart height=100 data={cdf |> Types.ContinuousDistribution.toJs} />
|
||||||
</>;
|
</>;
|
||||||
| FloatCdf(r) => <div />
|
| FloatCdf(_) => <div />
|
||||||
// let cdf: Types.MixedDistribution.t =
|
|
||||||
// CdfLibrary.Distribution.fromString(r, 2000);
|
|
||||||
// <>
|
|
||||||
// <Chart
|
|
||||||
// height=100
|
|
||||||
// data={
|
|
||||||
// cdf
|
|
||||||
// |> CdfLibrary.Distribution.toPdf
|
|
||||||
// |> Types.ContinuousDistribution.toJs
|
|
||||||
// }
|
|
||||||
// />
|
|
||||||
// {r |> ReasonReact.string}
|
|
||||||
// </>;
|
|
||||||
| Probability(r) =>
|
| Probability(r) =>
|
||||||
(r *. 100. |> Js.Float.toFixed) ++ "%" |> ReasonReact.string
|
(r *. 100. |> Js.Float.toFixed) ++ "%" |> ReasonReact.string
|
||||||
| DateTime(r) => r |> MomentRe.Moment.defaultFormat |> ReasonReact.string
|
| DateTime(r) => r |> MomentRe.Moment.defaultFormat |> ReasonReact.string
|
||||||
|
|
108
src/lib/Shape.re
Normal file
108
src/lib/Shape.re
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
open DistributionTypes;
|
||||||
|
|
||||||
|
module Continuous = {
|
||||||
|
let fromArrays = (xs, ys): continuousShape => {xs, ys};
|
||||||
|
let toJs = (t: continuousShape) => {
|
||||||
|
{"xs": t.xs, "ys": t.ys};
|
||||||
|
};
|
||||||
|
let toPdf = CdfLibrary.Distribution.toPdf;
|
||||||
|
let toCdf = CdfLibrary.Distribution.toCdf;
|
||||||
|
let findX = CdfLibrary.Distribution.findX;
|
||||||
|
let findY = CdfLibrary.Distribution.findY;
|
||||||
|
};
|
||||||
|
|
||||||
|
module Discrete = {
|
||||||
|
type t = discreteShape;
|
||||||
|
let fromArrays = (xs, ys): discreteShape => {xs, ys};
|
||||||
|
let _lastElement = (a: array('a)) =>
|
||||||
|
switch (Belt.Array.size(a)) {
|
||||||
|
| 0 => None
|
||||||
|
| n => Belt.Array.get(a, n)
|
||||||
|
};
|
||||||
|
|
||||||
|
let derivative = (p: t) => {
|
||||||
|
let (xs, ys) =
|
||||||
|
Belt.Array.zip(p.xs, p.ys)
|
||||||
|
->Belt.Array.reduce([||], (items, (x, y)) =>
|
||||||
|
switch (_lastElement(items)) {
|
||||||
|
| Some((_, yLast)) => [|(x, y -. yLast)|]
|
||||||
|
| None => [|(x, y)|]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|> Belt.Array.unzip;
|
||||||
|
fromArrays(xs, ys);
|
||||||
|
};
|
||||||
|
|
||||||
|
let integral = (p: t) => {
|
||||||
|
let (xs, ys) =
|
||||||
|
Belt.Array.zip(p.xs, p.ys)
|
||||||
|
->Belt.Array.reduce([||], (items, (x, y)) =>
|
||||||
|
switch (_lastElement(items)) {
|
||||||
|
| Some((_, yLast)) => [|(x, y +. yLast)|]
|
||||||
|
| None => [|(x, y)|]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|> Belt.Array.unzip;
|
||||||
|
fromArrays(xs, ys);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module Mixed = {
|
||||||
|
let make = (~continuous, ~discrete, ~discreteProbabilityMassFraction) => {
|
||||||
|
continuous,
|
||||||
|
discrete,
|
||||||
|
discreteProbabilityMassFraction,
|
||||||
|
};
|
||||||
|
|
||||||
|
module Builder = {
|
||||||
|
type assumption =
|
||||||
|
| ADDS_TO_1
|
||||||
|
| ADDS_TO_CORRECT_PROBABILITY;
|
||||||
|
type assumptions = {
|
||||||
|
continuous: assumption,
|
||||||
|
discrete: assumption,
|
||||||
|
discreteProbabilityMass: option(float),
|
||||||
|
};
|
||||||
|
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(
|
||||||
|
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
||||||
|
)
|
||||||
|
| {
|
||||||
|
continuous: ADDS_TO_1,
|
||||||
|
discrete: ADDS_TO_1,
|
||||||
|
discreteProbabilityMass: Some(r),
|
||||||
|
} =>
|
||||||
|
Some(
|
||||||
|
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
||||||
|
)
|
||||||
|
| {
|
||||||
|
continuous: ADDS_TO_1,
|
||||||
|
discrete: ADDS_TO_1,
|
||||||
|
discreteProbabilityMass: None,
|
||||||
|
} =>
|
||||||
|
None
|
||||||
|
| {
|
||||||
|
continuous: ADDS_TO_CORRECT_PROBABILITY,
|
||||||
|
discrete: ADDS_TO_1,
|
||||||
|
discreteProbabilityMass: None,
|
||||||
|
} =>
|
||||||
|
None
|
||||||
|
| {
|
||||||
|
continuous: ADDS_TO_1,
|
||||||
|
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
||||||
|
discreteProbabilityMass: Some(r),
|
||||||
|
} =>
|
||||||
|
Some(
|
||||||
|
make(~continuous, ~discrete, ~discreteProbabilityMassFraction=r),
|
||||||
|
)
|
||||||
|
| _ => None
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -113,14 +113,22 @@ module Model = {
|
||||||
switch (output) {
|
switch (output) {
|
||||||
| DONATIONS
|
| DONATIONS
|
||||||
| PAYOUTS =>
|
| PAYOUTS =>
|
||||||
Prop.Value.FloatCdf(
|
let difference =
|
||||||
calculateDifference(
|
calculateDifference(
|
||||||
currentValue(group, output),
|
currentValue(group, output),
|
||||||
dateTime,
|
dateTime,
|
||||||
currentDateTime,
|
currentDateTime,
|
||||||
yearlyMeanGrowthRateIfNotClosed(group),
|
yearlyMeanGrowthRateIfNotClosed(group),
|
||||||
),
|
);
|
||||||
)
|
let genericDistribution =
|
||||||
|
GenericDistribution.make(
|
||||||
|
~generationSource=GuesstimatorString(difference),
|
||||||
|
~probabilityType=Cdf,
|
||||||
|
~domain=Complete,
|
||||||
|
~unit=Unspecified,
|
||||||
|
(),
|
||||||
|
);
|
||||||
|
Prop.Value.GenericDistribution(genericDistribution);
|
||||||
| CHANCE_OF_EXISTENCE =>
|
| CHANCE_OF_EXISTENCE =>
|
||||||
let lazyDistribution = r =>
|
let lazyDistribution = r =>
|
||||||
TimeLimitedDomainCdf.make(
|
TimeLimitedDomainCdf.make(
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
module Model = {
|
module Model = {
|
||||||
let make = (currentDateTime: MomentRe.Moment.t) => {
|
let make = (currentDateTime: MomentRe.Moment.t) => {
|
||||||
let lazyDistribution = r =>
|
let genericDistribution =
|
||||||
TimeLimitedDomainCdf.make(
|
GenericDistribution.make(
|
||||||
~timeVector={zero: currentDateTime, unit: `years},
|
~generationSource=GuesstimatorString(FloatCdf.logNormal(20., 3.)),
|
||||||
~distribution=r(FloatCdf.logNormal(20., 3.)),
|
~probabilityType=Cdf,
|
||||||
~probabilityAtMaxX=0.7,
|
~domain=RightLimited({xPoint: 200., excludingProbabilityMass: 0.3}),
|
||||||
~maxX=`x(200.),
|
~unit=Time({zero: currentDateTime, unit: `years}),
|
||||||
|
(),
|
||||||
);
|
);
|
||||||
Prop.Value.TimeLimitedDomainCdfLazy(lazyDistribution);
|
Prop.Value.GenericDistribution(genericDistribution);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,15 +5,15 @@ module JS = {
|
||||||
ys: array(float),
|
ys: array(float),
|
||||||
};
|
};
|
||||||
|
|
||||||
let distToJs = (d: Types.ContinuousDistribution.t) =>
|
let distToJs = (d: DistributionTypes.continuousShape) =>
|
||||||
distJs(~xs=d.xs, ~ys=d.ys);
|
distJs(~xs=d.xs, ~ys=d.ys);
|
||||||
|
|
||||||
let jsToDist = (d: distJs): Types.ContinuousDistribution.t => {
|
let jsToDist = (d: distJs): DistributionTypes.continuousShape => {
|
||||||
xs: xsGet(d),
|
xs: xsGet(d),
|
||||||
ys: ysGet(d),
|
ys: ysGet(d),
|
||||||
};
|
};
|
||||||
|
|
||||||
let doAsDist = (f, d: Types.ContinuousDistribution.t) =>
|
let doAsDist = (f, d: DistributionTypes.continuousShape) =>
|
||||||
d |> distToJs |> f |> jsToDist;
|
d |> distToJs |> f |> jsToDist;
|
||||||
|
|
||||||
[@bs.module "./CdfLibrary.js"]
|
[@bs.module "./CdfLibrary.js"]
|
||||||
|
@ -34,40 +34,6 @@ module JS = {
|
||||||
[@bs.module "./CdfLibrary.js"]
|
[@bs.module "./CdfLibrary.js"]
|
||||||
external differentialEntropy: (int, distJs) => distJs =
|
external differentialEntropy: (int, distJs) => distJs =
|
||||||
"differentialEntropy";
|
"differentialEntropy";
|
||||||
|
|
||||||
[@bs.module "./CdfLibrary.js"]
|
|
||||||
external scoreNonMarketCdfCdf: (int, distJs, distJs, float) => distJs =
|
|
||||||
"scoreNonMarketCdfCdf";
|
|
||||||
|
|
||||||
module Guesstimator = {
|
|
||||||
[@bs.deriving abstract]
|
|
||||||
type discrete = {
|
|
||||||
xs: array(float),
|
|
||||||
ys: array(float),
|
|
||||||
};
|
|
||||||
|
|
||||||
let jsToDistDiscrete = (d: discrete): Types.DiscreteDistribution.t => {
|
|
||||||
xs: xsGet(d),
|
|
||||||
ys: ysGet(d),
|
|
||||||
};
|
|
||||||
|
|
||||||
[@bs.deriving abstract]
|
|
||||||
type combined = {
|
|
||||||
continuous: distJs,
|
|
||||||
discrete,
|
|
||||||
};
|
|
||||||
|
|
||||||
let toContinous = (r: combined) => continuousGet(r) |> jsToDist;
|
|
||||||
let toDiscrete = (r: combined): Types.DiscreteDistribution.t =>
|
|
||||||
discreteGet(r) |> jsToDistDiscrete;
|
|
||||||
let toMixed = (r: combined): Types.MixedDistribution.t => {
|
|
||||||
discrete: toDiscrete(r),
|
|
||||||
continuous: toContinous(r),
|
|
||||||
};
|
|
||||||
|
|
||||||
[@bs.module "./GuesstimatorLibrary.js"]
|
|
||||||
external toGuesstimator: (string, int) => combined = "run";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module Distribution = {
|
module Distribution = {
|
||||||
|
@ -75,9 +41,6 @@ module Distribution = {
|
||||||
let toCdf = dist => dist |> JS.doAsDist(JS.cdfToPdf);
|
let toCdf = dist => dist |> JS.doAsDist(JS.cdfToPdf);
|
||||||
let findX = (y, dist) => dist |> JS.distToJs |> JS.findX(y);
|
let findX = (y, dist) => dist |> JS.distToJs |> JS.findX(y);
|
||||||
let findY = (x, dist) => dist |> JS.distToJs |> JS.findY(x);
|
let findY = (x, dist) => dist |> JS.distToJs |> JS.findY(x);
|
||||||
let fromString = (str: string, sampleCount: int) =>
|
|
||||||
JS.Guesstimator.toGuesstimator(str, sampleCount)
|
|
||||||
|> JS.Guesstimator.toMixed;
|
|
||||||
let integral = dist => dist |> JS.distToJs |> JS.integral;
|
let integral = dist => dist |> JS.distToJs |> JS.integral;
|
||||||
let differentialEntropy = (maxCalculationLength, dist) =>
|
let differentialEntropy = (maxCalculationLength, dist) =>
|
||||||
dist
|
dist
|
||||||
|
|
42
src/utility/Guesstimator.re
Normal file
42
src/utility/Guesstimator.re
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
module Internals = {
|
||||||
|
[@bs.deriving abstract]
|
||||||
|
type discrete = {
|
||||||
|
xs: array(float),
|
||||||
|
ys: array(float),
|
||||||
|
};
|
||||||
|
|
||||||
|
let jsToDistDiscrete = (d: discrete): DistributionTypes.discreteShape => {
|
||||||
|
xs: xsGet(d),
|
||||||
|
ys: ysGet(d),
|
||||||
|
};
|
||||||
|
|
||||||
|
[@bs.deriving abstract]
|
||||||
|
type combined = {
|
||||||
|
continuous: CdfLibrary.JS.distJs,
|
||||||
|
discrete,
|
||||||
|
};
|
||||||
|
|
||||||
|
let toContinous = (r: combined): DistributionTypes.continuousShape =>
|
||||||
|
continuousGet(r) |> CdfLibrary.JS.jsToDist;
|
||||||
|
let toDiscrete = (r: combined): DistributionTypes.discreteShape =>
|
||||||
|
discreteGet(r) |> jsToDistDiscrete;
|
||||||
|
|
||||||
|
[@bs.module "./GuesstimatorLibrary.js"]
|
||||||
|
external toCombinedFormat: (string, int) => combined = "run";
|
||||||
|
|
||||||
|
let toMixedShape = (r: combined): option(DistributionTypes.mixedShape) => {
|
||||||
|
let assumptions: Shape.Mixed.Builder.assumptions = {
|
||||||
|
continuous: ADDS_TO_1,
|
||||||
|
discrete: ADDS_TO_CORRECT_PROBABILITY,
|
||||||
|
discreteProbabilityMass: Some(0.3),
|
||||||
|
};
|
||||||
|
Shape.Mixed.Builder.build(
|
||||||
|
~continuous=toContinous(r),
|
||||||
|
~discrete=toDiscrete(r),
|
||||||
|
~assumptions,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
let stringToMixedShape = (~string, ~sampleCount=1000, ()) =>
|
||||||
|
Internals.toCombinedFormat(string, sampleCount) |> Internals.toMixedShape;
|
Loading…
Reference in New Issue
Block a user