Beginning to add domain functionality

This commit is contained in:
Ozzie Gooen 2020-02-23 12:40:18 +00:00
parent 0328b86833
commit d947d43b56
7 changed files with 64 additions and 66 deletions

View File

@ -3,7 +3,6 @@ let timeDist =
GenericDistribution.make(
~generationSource=
GuesstimatorString("mm(floor(normal(30,2)), normal(39,1), [.5,.5])"),
~probabilityType=Pdf,
~domain=Complete,
~unit=TimeDistribution({zero: MomentRe.momentNow(), unit: `days}),
(),

View File

@ -23,11 +23,6 @@ module ComplexPowerChart = {
};
};
let bar: DistributionTypes.xyShape = {
ys: [|0.5, 0.8, 0.4, 1.0, 2.0|],
xs: [|0.0, 1., 2., 5., 8.|],
};
module IntegralChart = {
[@react.component]
let make = (~complexPower: DistributionTypes.complexPower, ~onHover) => {

View File

@ -109,6 +109,7 @@ module Continuous = {
let pointwiseFmap = (fn, t: t) =>
t |> xyShape |> XYShape.pointwiseMap(fn) |> fromShape;
let toShape = (t: t): DistributionTypes.shape => Continuous(t);
// TODO: When Roman's PR comes in, fix this bit.
let xToY = (f, t) =>
shapeFn(CdfLibrary.Distribution.findY(f), t)
|> DistributionTypes.MixedPoint.makeContinuous;
@ -181,11 +182,11 @@ module Mixed = {
};
};
let scaleDiscrete =
let scaleDiscreteFn =
({discreteProbabilityMassFraction}: DistributionTypes.mixedShape, f) =>
f *. discreteProbabilityMassFraction;
let scaleContinuous =
let scaleContinuousFn =
({discreteProbabilityMassFraction}: DistributionTypes.mixedShape, f) =>
f *. (1.0 -. discreteProbabilityMassFraction);
@ -200,19 +201,15 @@ module Mixed = {
let toShape = (t: t): DistributionTypes.shape => Mixed(t);
let toContinuous = ({continuous}: t) => Some(continuous);
let toDiscrete = ({discrete}: t) => Some(discrete);
let xToY =
(
f,
{discrete, continuous, discreteProbabilityMassFraction} as t: t,
) => {
let xToY = (f, {discrete, continuous} as t: t) => {
let c =
continuous
|> Continuous.T.xToY(f)
|> DistributionTypes.MixedPoint.fmap(scaleContinuous(t));
|> DistributionTypes.MixedPoint.fmap(scaleContinuousFn(t));
let d =
discrete
|> Discrete.T.xToY(f)
|> DistributionTypes.MixedPoint.fmap(scaleDiscrete(t));
|> DistributionTypes.MixedPoint.fmap(scaleDiscreteFn(t));
DistributionTypes.MixedPoint.add(c, d);
};
@ -254,33 +251,23 @@ module Mixed = {
);
};
let integralSum =
(
~cache,
{discrete, continuous, discreteProbabilityMassFraction}: t,
) => {
// todo: Get last element of actual sum.
let integralSum = (~cache, {discrete, continuous} as t: t) => {
switch (cache) {
| Some(cache) => 3.0
| None =>
Discrete.T.Integral.sum(~cache=None, discrete)
*. discreteProbabilityMassFraction
+. Continuous.T.Integral.sum(~cache=None, continuous)
*. (1.0 -. discreteProbabilityMassFraction)
scaleDiscreteFn(t, Discrete.T.Integral.sum(~cache=None, discrete))
+. scaleContinuousFn(
t,
Continuous.T.Integral.sum(~cache=None, continuous),
)
};
};
let integralXtoY =
(
~cache,
f,
{discrete, continuous, discreteProbabilityMassFraction}: t,
) => {
let integralXtoY = (~cache, f, {discrete, continuous} as t: t) => {
let cont = Continuous.T.Integral.xToY(~cache, f, continuous);
let discrete = Discrete.T.Integral.xToY(~cache, f, discrete);
discrete
*. discreteProbabilityMassFraction
+. cont
*. (1.0 -. discreteProbabilityMassFraction);
scaleDiscreteFn(t, discrete) +. scaleContinuousFn(t, cont);
};
let pointwiseFmap =
@ -440,20 +427,57 @@ module ComplexPower = {
let toContinuous = shapeFn(Shape.T.toContinuous);
let toDiscrete = shapeFn(Shape.T.toDiscrete);
// todo: Adjust for total mass.
let toScaledContinuous = shapeFn(Shape.T.toContinuous);
let toScaledDiscrete = shapeFn(Shape.T.toScaledDiscrete);
let domainIncludedProbabilityMass = (t: t) =>
Domain.includedProbabilityMass(t.domain);
let domainIncludedProbabilityMassAdjustment = (t: t, f) =>
f *. Domain.includedProbabilityMass(t.domain);
let toScaledContinuous = (t: t) => {
t
|> toShape
|> Shape.T.toScaledContinuous
|> E.O.fmap(
Continuous.T.pointwiseFmap(r =>
r *. domainIncludedProbabilityMass(t)
),
);
};
let toScaledDiscrete = (t: t) => {
t
|> toShape
|> Shape.T.toScaledDiscrete
|> E.O.fmap(
Discrete.T.pointwiseFmap(
domainIncludedProbabilityMassAdjustment(t),
),
);
};
// todo: adjust for limit, and the fact that total mass is lower.
let xToY = f => shapeFn(Shape.T.xToY(f));
let xToY = (f, t: t) =>
t
|> toShape
|> Shape.T.xToY(f)
|> MixedPoint.fmap(domainIncludedProbabilityMassAdjustment(t));
let minX = shapeFn(Shape.T.minX);
let maxX = shapeFn(Shape.T.maxX);
let fromShape = (shape, t): t => update(~shape, t);
// todo: adjust for limit
let fromShape = (t, shape): t => update(~shape, t);
// todo: adjust for limit, maybe?
let pointwiseFmap = (fn, {shape, _} as t: t): t =>
fromShape(Shape.T.pointwiseFmap(fn, shape), t);
Shape.T.pointwiseFmap(fn, shape) |> fromShape(t);
// This bit is kind of akward, could probably use rethinking.
let integral = (~cache as _, t: t) =>
fromShape(Continuous(t.integralCache), t);
fromShape(t, Continuous(t.integralCache));
let integralSum = (~cache as _, t: t) =>
Shape.T.Integral.sum(~cache=Some(t.integralCache), toShape(t));
// TODO: Fix this below, obviously. Adjust for limit.
let integralXtoY = (~cache as _, f, t: t) => {
Shape.T.Integral.xToY(~cache=Some(t.integralCache), f, toShape(t));

View File

@ -14,16 +14,9 @@ type xyShape = {
ys: array(float),
};
let foo = {xs: [|1., 2., 5.|], ys: [|1., 2., 3.|]};
let answer = {xs: [|1., 2., 2., 5., 5.|], ys: [|1., 1., 2., 2., 3.|]};
let toStepwise = (xyShape: xyShape) => {};
type interpolationMethod = [ | `Stepwise | `Linear];
type continuousShape = {
xyShape,
interpolation: interpolationMethod,
interpolation: [ | `Stepwise | `Linear],
};
type discreteShape = xyShape;
@ -59,14 +52,8 @@ type distributionUnit =
| UnspecifiedDistribution
| TimeDistribution(TimeTypes.timeVector);
type probabilityType =
| Cdf
| Pdf
| Arbitrary;
type genericDistribution = {
generationSource,
probabilityType,
domain,
unit: distributionUnit,
};
@ -104,6 +91,9 @@ module Domain = {
};
};
let includedProbabilityMass = (t: domain) =>
1.0 -. excludedProbabilityMass(t);
let initialProbabilityMass = (t: domain) => {
switch (t) {
| Complete

View File

@ -1,16 +1,9 @@
open DistributionTypes;
let make =
(
~generationSource,
~probabilityType=Pdf,
~domain=Complete,
~unit=UnspecifiedDistribution,
(),
)
(~generationSource, ~domain=Complete, ~unit=UnspecifiedDistribution, ())
: genericDistribution => {
generationSource,
probabilityType,
domain,
unit,
};

View File

@ -158,7 +158,6 @@ module Model = {
let genericDistribution =
GenericDistribution.make(
~generationSource=GuesstimatorString(str),
~probabilityType=Cdf,
~domain=Complete,
~unit=UnspecifiedDistribution,
(),
@ -175,7 +174,6 @@ module Model = {
GuesstimatorDist.logNormal(40., 4.),
),
),
~probabilityType=Cdf,
~domain=RightLimited({xPoint: 100., excludingProbabilityMass: 0.3}),
~unit=TimeDistribution({zero: currentDateTime, unit: `years}),
(),

View File

@ -5,7 +5,6 @@ module Model = {
let genericDistribution =
GenericDistribution.make(
~generationSource=GuesstimatorString(guesstimatorString),
~probabilityType=Cdf,
~unit=TimeDistribution({zero: currentDateTime, unit: `years}),
(),
);