Actually use cache when needed

This commit is contained in:
Ozzie Gooen 2020-02-25 12:28:26 +00:00
parent 6c536183d4
commit 67ee34d821
7 changed files with 66 additions and 47 deletions

View File

@ -3,7 +3,7 @@
let timeDist = let timeDist =
DistPlusIngredients.make( DistPlusIngredients.make(
~guesstimatorString="mm(floor(10 to 15), 10 to 11, [.9,.1])", ~guesstimatorString="(floor(10 to 15))",
~domain=Complete, ~domain=Complete,
~unit= ~unit=
DistTypes.TimeDistribution({zero: MomentRe.momentNow(), unit: `years}), DistTypes.TimeDistribution({zero: MomentRe.momentNow(), unit: `years}),
@ -12,7 +12,11 @@ let timeDist =
let setup = dist => let setup = dist =>
dist dist
|> DistPlusIngredients.toDistPlus(~sampleCount=5000, ~outputXYPoints=1000); |> DistPlusIngredients.toDistPlus(
~sampleCount=10000,
~outputXYPoints=2000,
~truncateTo=Some(1000),
);
let distributions = () => let distributions = () =>
<div> <div>
@ -20,7 +24,7 @@ let distributions = () =>
<h2> {"Single-Discrete" |> ReasonReact.string} </h2> <h2> {"Single-Discrete" |> ReasonReact.string} </h2>
{setup( {setup(
DistPlusIngredients.make( DistPlusIngredients.make(
~guesstimatorString="8 to 12, [.5,.5])", ~guesstimatorString="mm(5 to 20, floor(normal(20,2)), [.5, .05])",
~domain=Complete, ~domain=Complete,
(), (),
), ),

View File

@ -37,7 +37,6 @@ module IntegralChart = {
let minX = integral |> Distributions.Continuous.T.minX; let minX = integral |> Distributions.Continuous.T.minX;
let maxX = integral |> Distributions.Continuous.T.maxX; let maxX = integral |> Distributions.Continuous.T.maxX;
let timeScale = distPlus.unit |> DistTypes.DistributionUnit.toJson; let timeScale = distPlus.unit |> DistTypes.DistributionUnit.toJson;
Js.log3("HIHI", continuous, distPlus);
<DistributionPlot <DistributionPlot
minX minX
maxX maxX

View File

@ -9,13 +9,19 @@ let make =
}; };
let toDistPlus = let toDistPlus =
(~sampleCount=1000, ~outputXYPoints=1000, t: distPlusIngredients) (
~sampleCount=2000,
~outputXYPoints=2000,
~truncateTo=Some(100),
t: distPlusIngredients,
)
: option(distPlus) => { : option(distPlus) => {
let shape = let shape =
Guesstimator.stringToMixedShape( Guesstimator.stringToMixedShape(
~string=t.guesstimatorString, ~string=t.guesstimatorString,
~sampleCount, ~sampleCount,
~outputXYPoints, ~outputXYPoints,
~truncateTo,
(), (),
); );
let distPlus = let distPlus =

View File

@ -127,14 +127,15 @@ module Continuous = {
// }; // };
let integral = (~cache, t) => let integral = (~cache, t) =>
cache switch (cache) {
|> E.O.default( | Some(cache) => cache
t | None =>
|> xyShape t
|> XYShape.Range.integrateWithTriangles |> xyShape
|> E.O.toExt("This should not have happened") |> XYShape.Range.integrateWithTriangles
|> fromShape, |> E.O.toExt("This should not have happened")
); |> fromShape
};
let integralEndY = (~cache, t) => t |> integral(~cache) |> lastY; let integralEndY = (~cache, t) => t |> integral(~cache) |> lastY;
let integralXtoY = (~cache, f, t) => let integralXtoY = (~cache, f, t) =>
t |> integral(~cache) |> shapeFn(CdfLibrary.Distribution.findY(f)); t |> integral(~cache) |> shapeFn(CdfLibrary.Distribution.findY(f));
@ -151,8 +152,10 @@ module Discrete = {
type t = DistTypes.discreteShape; type t = DistTypes.discreteShape;
type integral = DistTypes.continuousShape; type integral = DistTypes.continuousShape;
let integral = (~cache, t) => let integral = (~cache, t) =>
cache switch (cache) {
|> E.O.default(Continuous.make(XYShape.accumulateYs(t), `Stepwise)); | Some(c) => c
| None => Continuous.make(XYShape.accumulateYs(t), `Stepwise)
};
let integralEndY = (~cache, t) => let integralEndY = (~cache, t) =>
t |> integral(~cache) |> Continuous.lastY; t |> integral(~cache) |> Continuous.lastY;
let minX = XYShape.minX; let minX = XYShape.minX;
@ -253,32 +256,27 @@ module Mixed = {
~cache, ~cache,
{continuous, discrete, discreteProbabilityMassFraction} as t: t, {continuous, discrete, discreteProbabilityMassFraction} as t: t,
) => { ) => {
cache switch (cache) {
|> E.O.default( | Some(cache) => cache
{ | None =>
let cont = let cont =
continuous continuous
|> Continuous.T.Integral.get(~cache=None) |> Continuous.T.Integral.get(~cache=None)
|> scaleContinuous(t); |> scaleContinuous(t);
let dist = let dist =
discrete discrete
|> Discrete.T.Integral.get(~cache=None) |> Discrete.T.Integral.get(~cache=None)
|> Continuous.toLinear |> Continuous.toLinear
|> E.O.toExn("") |> E.O.toExn("")
|> Continuous.T.scaleBy( |> Continuous.T.scaleBy(~scale=discreteProbabilityMassFraction);
~scale=discreteProbabilityMassFraction, Continuous.make(
); XYShape.Combine.combineLinear(
Continuous.make( Continuous.getShape(cont), Continuous.getShape(dist), (a, b) =>
XYShape.Combine.combineLinear( a +. b
Continuous.getShape(cont), ),
Continuous.getShape(dist), `Linear,
(a, b) => );
a +. b };
),
`Linear,
);
},
);
}; };
let integralEndY = (~cache, t: t) => { let integralEndY = (~cache, t: t) => {

View File

@ -1,4 +1,4 @@
let guesstimatorString = "floor(10 to 20)"; let guesstimatorString = "normal(40,10)";
let makeI = (currentDateTime: MomentRe.Moment.t) => { let makeI = (currentDateTime: MomentRe.Moment.t) => {
DistPlusIngredients.make( DistPlusIngredients.make(

View File

@ -29,9 +29,15 @@ module Internals = {
external toCombinedFormat: (string, int, int) => combined = "run"; external toCombinedFormat: (string, int, int) => combined = "run";
// todo: Format to correct mass, also normalize the pdf. // todo: Format to correct mass, also normalize the pdf.
let toMixedShape = (r: combined): option(DistTypes.shape) => { let toMixedShape =
(~truncateTo=Some(500), r: combined): option(DistTypes.shape) => {
let continuous = toContinous(r);
let continuous = let continuous =
toContinous(r) |> Distributions.Continuous.convertToNewLength(100); switch (truncateTo) {
| Some(t) =>
continuous |> Distributions.Continuous.convertToNewLength(t)
| None => continuous
};
let discrete = toDiscrete(r); let discrete = toDiscrete(r);
// let continuousProb = // let continuousProb =
// cont |> Distributions.Continuous.T.Integral.sum(~cache=None); // cont |> Distributions.Continuous.T.Integral.sum(~cache=None);
@ -44,6 +50,12 @@ module Internals = {
}; };
let stringToMixedShape = let stringToMixedShape =
(~string, ~sampleCount=1000, ~outputXYPoints=1000, ()) => (
~string,
~sampleCount=1000,
~outputXYPoints=1000,
~truncateTo=Some(500),
(),
) =>
Internals.toCombinedFormat(string, sampleCount, outputXYPoints) Internals.toCombinedFormat(string, sampleCount, outputXYPoints)
|> Internals.toMixedShape; |> Internals.toMixedShape(~truncateTo);

View File

@ -42,7 +42,7 @@ const toPdf = (values, outputResolutionCount, min, max) => {
let discrete = {xs: frequencies.map(f => f.value), ys: frequencies.map(f => f.percentage)}; let discrete = {xs: frequencies.map(f => f.value), ys: frequencies.map(f => f.percentage)};
let continuous = {ys: [], xs: []}; let continuous = {ys: [], xs: []};
if (continuousSamples.length > 1){ if (continuousSamples.length > 20){
const samples = new Samples(continuousSamples); const samples = new Samples(continuousSamples);
const ratioSize$ = ratioSize(samples); const ratioSize$ = ratioSize(samples);