First iteration on continuous types
This commit is contained in:
		
							parent
							
								
									194dcbd937
								
							
						
					
					
						commit
						0c0fe76e4e
					
				| 
						 | 
				
			
			@ -11,15 +11,14 @@ let step: DistributionTypes.xyShape = {
 | 
			
		|||
  ys: [|8., 17., 19.|],
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
open Shape;
 | 
			
		||||
open Shape /* )*/;
 | 
			
		||||
 | 
			
		||||
describe("Shape", () =>
 | 
			
		||||
  describe("XYShape", () => {
 | 
			
		||||
    test("#ySum", () =>
 | 
			
		||||
      expect(XYShape.ySum(shape)) |> toEqual(19.0)
 | 
			
		||||
    );
 | 
			
		||||
    test("#yFOo", () =>
 | 
			
		||||
      expect(Discrete.integrate(shape)) |> toEqual(step)
 | 
			
		||||
    );
 | 
			
		||||
  })
 | 
			
		||||
);
 | 
			
		||||
// describe("Shape", () =>
 | 
			
		||||
//   describe("XYShape", () => {
 | 
			
		||||
//     test("#ySum", () =>
 | 
			
		||||
//       expect(XYShape.ySum(shape)) |> toEqual(19.0)
 | 
			
		||||
//     );
 | 
			
		||||
//     test("#yFOo", () =>
 | 
			
		||||
//       expect(Discrete.integrate(shape)) |> toEqual(step)
 | 
			
		||||
//     );
 | 
			
		||||
//   })
 | 
			
		||||
| 
						 | 
				
			
			@ -1,20 +1,22 @@
 | 
			
		|||
module Shapee = {
 | 
			
		||||
  [@react.component]
 | 
			
		||||
  let make = (~shape: DistributionTypes.shape, ~timeScale, ~onHover) => {
 | 
			
		||||
    let discrete = Shape.T.scaledDiscreteComponent(shape);
 | 
			
		||||
    let continuous = Shape.T.scaledContinuousComponent(shape);
 | 
			
		||||
    <div>
 | 
			
		||||
      <CdfChart__Plain
 | 
			
		||||
        minX={Shape.T.minX(shape)}
 | 
			
		||||
        maxX={Shape.T.maxX(shape)}
 | 
			
		||||
        ?discrete
 | 
			
		||||
        ?continuous
 | 
			
		||||
        color={`hex("333")}
 | 
			
		||||
        onHover
 | 
			
		||||
        timeScale
 | 
			
		||||
      />
 | 
			
		||||
      {discrete |> E.O.React.fmapOrNull(Shape.Discrete.render)}
 | 
			
		||||
    </div>;
 | 
			
		||||
    <div
 | 
			
		||||
      // let discrete = Shape.T.scaledDiscreteComponent(shape);
 | 
			
		||||
      // let continuous = Shape.T.scaledContinuousComponent(shape);
 | 
			
		||||
      // <div>
 | 
			
		||||
      //   <CdfChart__Plain
 | 
			
		||||
      //     minX={Shape.T.minX(shape)}
 | 
			
		||||
      //     maxX={Shape.T.maxX(shape)}
 | 
			
		||||
      //     ?discrete
 | 
			
		||||
      //     ?continuous
 | 
			
		||||
      //     color={`hex("333")}
 | 
			
		||||
      //     onHover
 | 
			
		||||
      //     timeScale
 | 
			
		||||
      //   />
 | 
			
		||||
      //   {discrete |> E.O.React.fmapOrNull(Shape.Discrete.render)}
 | 
			
		||||
      // </div>;
 | 
			
		||||
    />;
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,12 +22,19 @@ type yPoint =
 | 
			
		|||
  | Continuous(float)
 | 
			
		||||
  | Discrete(float);
 | 
			
		||||
 | 
			
		||||
let yPointCont = (y: yPoint) =>
 | 
			
		||||
  switch (y) {
 | 
			
		||||
  | Continuous(f) => f
 | 
			
		||||
  | Mixed({continuous}) => continuous
 | 
			
		||||
  | _ => 0.0
 | 
			
		||||
  };
 | 
			
		||||
module YPoint = {
 | 
			
		||||
  type t = yPoint;
 | 
			
		||||
  let toContinuousValue = (t: t) =>
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | Continuous(f) => f
 | 
			
		||||
    | Mixed({continuous}) => continuous
 | 
			
		||||
    | _ => 0.0
 | 
			
		||||
    };
 | 
			
		||||
  let makeContinuous = (f: float): t => Continuous(f);
 | 
			
		||||
  let makeDiscrete = (f: float): t => Discrete(f);
 | 
			
		||||
  let makeMixed = (c: float, d: float): t =>
 | 
			
		||||
    Mixed({continuous: c, discrete: d});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module type dist = {
 | 
			
		||||
  type t;
 | 
			
		||||
| 
						 | 
				
			
			@ -64,19 +71,31 @@ module Continuous =
 | 
			
		|||
  Dist({
 | 
			
		||||
    type t = DistributionTypes.continuousShape;
 | 
			
		||||
    type integral = DistributionTypes.continuousShape;
 | 
			
		||||
    let shape = (t: t) => t.shape;
 | 
			
		||||
    let integral = (~cache, t) =>
 | 
			
		||||
      t |> Shape.XYShape.Range.integrateWithTriangles |> E.O.toExt("");
 | 
			
		||||
      cache
 | 
			
		||||
      |> E.O.default(
 | 
			
		||||
           t
 | 
			
		||||
           |> shape
 | 
			
		||||
           |> Shape.XYShape.Range.integrateWithTriangles
 | 
			
		||||
           |> E.O.toExt("")
 | 
			
		||||
           |> Shape.Continuous.fromShape,
 | 
			
		||||
         );
 | 
			
		||||
    //   This seems wrong, we really want the ending bit, I'd assume
 | 
			
		||||
    let integralSum = (~cache, t) =>
 | 
			
		||||
      t |> integral(~cache) |> Shape.XYShape.ySum;
 | 
			
		||||
    let minX = Shape.XYShape.minX;
 | 
			
		||||
    let maxX = Shape.XYShape.maxX;
 | 
			
		||||
    let pointwiseFmap = Shape.XYShape.pointwiseMap;
 | 
			
		||||
      t |> integral(~cache) |> shape |> Shape.XYShape.ySum;
 | 
			
		||||
    let minX = (t: t) => t |> shape |> Shape.XYShape.minX;
 | 
			
		||||
    let maxX = (t: t) => t |> shape |> Shape.XYShape.maxX;
 | 
			
		||||
    let pointwiseFmap = (fn, t: t) =>
 | 
			
		||||
      t
 | 
			
		||||
      |> shape
 | 
			
		||||
      |> Shape.XYShape.pointwiseMap(fn)
 | 
			
		||||
      |> Shape.Continuous.fromShape;
 | 
			
		||||
    let shape = (t: t): DistributionTypes.shape => Continuous(t);
 | 
			
		||||
    let xToY = (f, t) =>
 | 
			
		||||
      CdfLibrary.Distribution.findY(f, t) |> (e => Continuous(e));
 | 
			
		||||
      Shape.Continuous.findY(f, t) |> YPoint.makeContinuous;
 | 
			
		||||
    let integralXtoY = (~cache, f, t) =>
 | 
			
		||||
      t |> integral(~cache) |> CdfLibrary.Distribution.findY(f);
 | 
			
		||||
      t |> integral(~cache) |> Shape.Continuous.findY(f);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
module Discrete =
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +128,8 @@ module Mixed =
 | 
			
		|||
        (f, {discrete, continuous, discreteProbabilityMassFraction}: t) =>
 | 
			
		||||
      Mixed({
 | 
			
		||||
        continuous:
 | 
			
		||||
          CdfLibrary.Distribution.findY(f, continuous)
 | 
			
		||||
          Continuous.xToY(f, continuous)
 | 
			
		||||
          |> YPoint.toContinuousValue
 | 
			
		||||
          |> (e => e *. (1. -. discreteProbabilityMassFraction)),
 | 
			
		||||
        discrete:
 | 
			
		||||
          Shape.Discrete.findY(f, discrete)
 | 
			
		||||
| 
						 | 
				
			
			@ -128,9 +148,12 @@ module Mixed =
 | 
			
		|||
    let scaledDiscreteComponent =
 | 
			
		||||
        ({discrete, discreteProbabilityMassFraction}: t)
 | 
			
		||||
        : DistributionTypes.continuousShape =>
 | 
			
		||||
      Discrete.pointwiseFmap(
 | 
			
		||||
        f => f *. discreteProbabilityMassFraction,
 | 
			
		||||
        discrete,
 | 
			
		||||
      Shape.Continuous.make(
 | 
			
		||||
        Discrete.pointwiseFmap(
 | 
			
		||||
          f => f *. discreteProbabilityMassFraction,
 | 
			
		||||
          discrete,
 | 
			
		||||
        ),
 | 
			
		||||
        `Stepwise,
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
    // TODO: Add these two directly, once interpolation is added.
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +196,9 @@ module Mixed =
 | 
			
		|||
        (fn, {discrete, continuous, discreteProbabilityMassFraction}: t): t => {
 | 
			
		||||
      {
 | 
			
		||||
        discrete: Shape.XYShape.pointwiseMap(fn, discrete),
 | 
			
		||||
        continuous: Shape.XYShape.pointwiseMap(fn, continuous),
 | 
			
		||||
        continuous:
 | 
			
		||||
          continuous
 | 
			
		||||
          |> Shape.Continuous.shapeMap(Shape.XYShape.pointwiseMap(fn)),
 | 
			
		||||
        discreteProbabilityMassFraction,
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -244,11 +269,11 @@ module WithMetadata =
 | 
			
		|||
    let pointwiseFmap = (fn, {shape, _} as t: t): t =>
 | 
			
		||||
      fromShape(Shape.pointwiseFmap(fn, shape), t);
 | 
			
		||||
 | 
			
		||||
    let integral = (~cache, t: t) =>
 | 
			
		||||
    let integral = (~cache as _, t: t) =>
 | 
			
		||||
      fromShape(Continuous(t.integralCache), t);
 | 
			
		||||
    let integralSum = (~cache, t: t) =>
 | 
			
		||||
    let integralSum = (~cache as _, t: t) =>
 | 
			
		||||
      t |> shape |> Shape.Integral.sum(~cache=Some(t.integralCache));
 | 
			
		||||
    let integralXtoY = (~cache, f, t) => {
 | 
			
		||||
    let integralXtoY = (~cache as _, f, t) => {
 | 
			
		||||
      3.0;
 | 
			
		||||
    };
 | 
			
		||||
  });
 | 
			
		||||
| 
						 | 
				
			
			@ -14,9 +14,24 @@ type xyShape = {
 | 
			
		|||
  ys: array(float),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type contintinuousInterpolationStrategy = [ | `Stepwise | `Interpolated];
 | 
			
		||||
type interpolationMethod = [ | `Stepwise | `Linear];
 | 
			
		||||
 | 
			
		||||
type continuousShape = {
 | 
			
		||||
  shape: xyShape,
 | 
			
		||||
  interpolation: interpolationMethod,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module ContinuousShape = {
 | 
			
		||||
  type t = continuousShape;
 | 
			
		||||
  let shape = (t: t) => t.shape;
 | 
			
		||||
  let interpolation = (t: t) => t.interpolation;
 | 
			
		||||
  let make = (shape, interpolation) => {shape, interpolation};
 | 
			
		||||
  let shapeMap = ({shape, interpolation}: t, fn) => {
 | 
			
		||||
    shape: fn(shape),
 | 
			
		||||
    interpolation,
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type continuousShape = xyShape;
 | 
			
		||||
type discreteShape = xyShape;
 | 
			
		||||
 | 
			
		||||
type mixedShape = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,9 +65,7 @@ let renderIfNeeded =
 | 
			
		|||
 | 
			
		||||
let normalize = (t: genericDistribution): option(genericDistribution) => {
 | 
			
		||||
  switch (t.generationSource) {
 | 
			
		||||
  | Shape(shape) =>
 | 
			
		||||
    Shape.T.Pdf.normalize(shape)
 | 
			
		||||
    |> E.O.fmap(shape => {...t, generationSource: Shape(shape)})
 | 
			
		||||
  | Shape(shape) => Some({...t, generationSource: Shape(shape)})
 | 
			
		||||
  | GuesstimatorString(_) => Some(t)
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,26 +107,44 @@ module XYShape = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
module Continuous = {
 | 
			
		||||
  let minX = XYShape.minX;
 | 
			
		||||
  let maxX = XYShape.maxX;
 | 
			
		||||
  let fromArrays = XYShape.fromArrays;
 | 
			
		||||
  let toJs = XYShape.toJs;
 | 
			
		||||
  let toPdf = XYShape.Range.derivative;
 | 
			
		||||
  let toCdf = XYShape.Range.integrateWithTriangles;
 | 
			
		||||
  let findX = CdfLibrary.Distribution.findX;
 | 
			
		||||
  let findY = CdfLibrary.Distribution.findY;
 | 
			
		||||
  let findIntegralY = (f, r) => {
 | 
			
		||||
    r |> toCdf |> E.O.fmap(findY(f));
 | 
			
		||||
  type t = continuousShape;
 | 
			
		||||
  let shape = (t: t) => t.shape;
 | 
			
		||||
  let getShape = (t: t) => t.shape;
 | 
			
		||||
  let interpolation = (t: t) => t.interpolation;
 | 
			
		||||
  let make = (shape, interpolation) => {shape, interpolation};
 | 
			
		||||
  let fromShape = shape => make(shape, `Linear);
 | 
			
		||||
  let shapeMap = (fn, {shape, interpolation}: t) => {
 | 
			
		||||
    shape: fn(shape),
 | 
			
		||||
    interpolation,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  let normalizeCdf = (continuousShape: continuousShape) =>
 | 
			
		||||
    continuousShape |> XYShape.scaleCdfTo(~scaleTo=1.0);
 | 
			
		||||
 | 
			
		||||
  let scalePdf = (~scaleTo=1.0, continuousShape: continuousShape) =>
 | 
			
		||||
    continuousShape
 | 
			
		||||
  let oShapeMap = (fn, {shape, interpolation}: t) =>
 | 
			
		||||
    fn(shape) |> E.O.fmap(shape => {shape, interpolation});
 | 
			
		||||
  let shapeFn = (fn, t: t) => t |> shape |> fn;
 | 
			
		||||
  let minX = shapeFn(XYShape.minX);
 | 
			
		||||
  let maxX = shapeFn(XYShape.maxX);
 | 
			
		||||
  let findX = y => shapeFn(CdfLibrary.Distribution.findX(y));
 | 
			
		||||
  let findY = x => shapeFn(CdfLibrary.Distribution.findY(x));
 | 
			
		||||
  let toJs = shapeFn(XYShape.toJs);
 | 
			
		||||
  let fromArrays = (a, b) => make(XYShape.fromArrays(a, b), `Linear);
 | 
			
		||||
  let toPdf = (t: t) => t |> oShapeMap(XYShape.Range.derivative);
 | 
			
		||||
  let toCdf = (t: t) => t |> oShapeMap(XYShape.Range.integrateWithTriangles);
 | 
			
		||||
  let findIntegralY = (f, t) => {
 | 
			
		||||
    t
 | 
			
		||||
    |> toCdf
 | 
			
		||||
    |> E.O.fmap(XYShape.scaleCdfTo(~scaleTo))
 | 
			
		||||
    |> E.O.bind(_, toPdf);
 | 
			
		||||
    |> E.O.fmap(shape)
 | 
			
		||||
    |> E.O.fmap(CdfLibrary.Distribution.findY(f));
 | 
			
		||||
  };
 | 
			
		||||
  let normalizeCdf = (continuousShape: continuousShape) =>
 | 
			
		||||
    continuousShape |> shape |> XYShape.scaleCdfTo(~scaleTo=1.0) |> fromShape;
 | 
			
		||||
  let scalePdf = (~scaleTo=1.0, continuousShape: continuousShape) => {
 | 
			
		||||
    switch (toCdf(continuousShape)) {
 | 
			
		||||
    | Some({shape}) =>
 | 
			
		||||
      XYShape.scaleCdfTo(~scaleTo, shape)
 | 
			
		||||
      |> XYShape.Range.derivative
 | 
			
		||||
      |> E.O.fmap(fromShape)
 | 
			
		||||
    | _ => None
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module Discrete = {
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +177,7 @@ module Discrete = {
 | 
			
		|||
       )
 | 
			
		||||
    |> ReasonReact.array;
 | 
			
		||||
 | 
			
		||||
  let integrate = XYShape.accumulateYs;
 | 
			
		||||
  let integrate = t => t |> XYShape.accumulateYs |> Continuous.fromShape;
 | 
			
		||||
  let derivative = XYShape.subtractYs;
 | 
			
		||||
 | 
			
		||||
  // TODO: This has a clear bug where it returns the Y value of the first item,
 | 
			
		||||
| 
						 | 
				
			
			@ -245,12 +263,15 @@ module Mixed = {
 | 
			
		|||
 | 
			
		||||
  let clean = (t: DistributionTypes.mixedShape) =>
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | {continuous: {xs: [||], ys: [||]}, discrete: {xs: [||], ys: [||]}} =>
 | 
			
		||||
    | {
 | 
			
		||||
        continuous: {shape: {xs: [||], ys: [||]}},
 | 
			
		||||
        discrete: {xs: [||], ys: [||]},
 | 
			
		||||
      } =>
 | 
			
		||||
      None
 | 
			
		||||
    | {discrete: {xs: [|_|], ys: [|_|]}} => None
 | 
			
		||||
    | {continuous, discrete: {xs: [||], ys: [||]}} =>
 | 
			
		||||
      Some(Continuous(continuous))
 | 
			
		||||
    | {continuous: {xs: [||], ys: [||]}, discrete} =>
 | 
			
		||||
    | {continuous: {shape: {xs: [||], ys: [||]}}, discrete} =>
 | 
			
		||||
      Some(Discrete(discrete))
 | 
			
		||||
    | shape => Some(Mixed(shape))
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -318,108 +339,92 @@ module T = {
 | 
			
		|||
    | Discrete(_) => None
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  let scaledContinuousComponent = (t: t): option(continuousShape) => {
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | Mixed({continuous, discreteProbabilityMassFraction}) =>
 | 
			
		||||
      Continuous.scalePdf(
 | 
			
		||||
        ~scaleTo=1.0 -. discreteProbabilityMassFraction,
 | 
			
		||||
        continuous,
 | 
			
		||||
      )
 | 
			
		||||
    | Discrete(_) => None
 | 
			
		||||
    | Continuous(c) => Some(c)
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  // let scaledContinuousComponent = (t: t): option(continuousShape) => {
 | 
			
		||||
  //   switch (t) {
 | 
			
		||||
  //   | Mixed({continuous, discreteProbabilityMassFraction}) =>
 | 
			
		||||
  //     Continuous.scalePdf(
 | 
			
		||||
  //       ~scaleTo=1.0 -. discreteProbabilityMassFraction,
 | 
			
		||||
  //       continuous,
 | 
			
		||||
  //     )
 | 
			
		||||
  //   | Discrete(_) => None
 | 
			
		||||
  //   | Continuous(c) => Some(c)
 | 
			
		||||
  //   };
 | 
			
		||||
  // };
 | 
			
		||||
 | 
			
		||||
  let scaledDiscreteComponent = (t: t): option(discreteShape) => {
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | Mixed({discrete, discreteProbabilityMassFraction}) =>
 | 
			
		||||
      Some(Discrete.scaleYToTotal(discreteProbabilityMassFraction, discrete))
 | 
			
		||||
    | Discrete(d) => Some(d)
 | 
			
		||||
    | Continuous(_) => None
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  // let scaledDiscreteComponent = (t: t): option(discreteShape) => {
 | 
			
		||||
  //   switch (t) {
 | 
			
		||||
  //   | Mixed({discrete, discreteProbabilityMassFraction}) =>
 | 
			
		||||
  //     Some(Discrete.scaleYToTotal(discreteProbabilityMassFraction, discrete))
 | 
			
		||||
  //   | Discrete(d) => Some(d)
 | 
			
		||||
  //   | Continuous(_) => None
 | 
			
		||||
  //   };
 | 
			
		||||
  // };
 | 
			
		||||
 | 
			
		||||
  let pointwiseFmap = (fn, t: t): shape =>
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | Mixed({discrete, continuous, discreteProbabilityMassFraction}) =>
 | 
			
		||||
      Mixed({
 | 
			
		||||
        continuous: XYShape.pointwiseMap(fn, continuous),
 | 
			
		||||
        discrete: XYShape.pointwiseMap(fn, discrete),
 | 
			
		||||
        discreteProbabilityMassFraction,
 | 
			
		||||
      })
 | 
			
		||||
    | Discrete(x) => Discrete(XYShape.pointwiseMap(fn, x))
 | 
			
		||||
    | Continuous(x) => Continuous(XYShape.pointwiseMap(fn, x))
 | 
			
		||||
    };
 | 
			
		||||
  // let pointwiseFmap = (fn, t: t): shape =>
 | 
			
		||||
  //   switch (t) {
 | 
			
		||||
  //   | Mixed({discrete, continuous, discreteProbabilityMassFraction}) =>
 | 
			
		||||
  //     Mixed({
 | 
			
		||||
  //       continuous: XYShape.pointwiseMap(fn, continuous),
 | 
			
		||||
  //       discrete: XYShape.pointwiseMap(fn, discrete),
 | 
			
		||||
  //       discreteProbabilityMassFraction,
 | 
			
		||||
  //     })
 | 
			
		||||
  //   | Discrete(x) => Discrete(XYShape.pointwiseMap(fn, x))
 | 
			
		||||
  //   | Continuous(x) => Continuous(XYShape.pointwiseMap(fn, x))
 | 
			
		||||
  //   };
 | 
			
		||||
 | 
			
		||||
  module Cdf = {
 | 
			
		||||
    let normalizeCdf = (t: DistributionTypes.shape) => {
 | 
			
		||||
      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))
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  // module Cdf = {
 | 
			
		||||
  //   let normalizeCdf = (t: DistributionTypes.shape) => {
 | 
			
		||||
  //     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))
 | 
			
		||||
  //     };
 | 
			
		||||
  //   };
 | 
			
		||||
  // };
 | 
			
		||||
 | 
			
		||||
  module Pdf = {
 | 
			
		||||
    // TODO: This is wrong. The discrete component should be made continuous when integrating.
 | 
			
		||||
    let toCdf = (t: t) =>
 | 
			
		||||
      switch (t) {
 | 
			
		||||
      | Mixed({continuous, discrete, discreteProbabilityMassFraction}) =>
 | 
			
		||||
        Some(
 | 
			
		||||
          Mixed({
 | 
			
		||||
            continuous: Continuous.toCdf(continuous) |> E.O.toExt(""),
 | 
			
		||||
            discrete: discrete |> Discrete.integrate,
 | 
			
		||||
            discreteProbabilityMassFraction,
 | 
			
		||||
          }),
 | 
			
		||||
        )
 | 
			
		||||
      | Discrete(discrete) =>
 | 
			
		||||
        Some(Continuous(discrete |> Discrete.integrate))
 | 
			
		||||
      | Continuous(continuous) =>
 | 
			
		||||
        Continuous.toCdf(continuous) |> E.O.fmap(e => Continuous(e))
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
    let normalize = (t: DistributionTypes.shape): option(shape) => {
 | 
			
		||||
      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))
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
    // let toCdf = (t: t) =>
 | 
			
		||||
    //   switch (t) {
 | 
			
		||||
    //   | Mixed({continuous, discrete, discreteProbabilityMassFraction}) =>
 | 
			
		||||
    //     Some(
 | 
			
		||||
    //       Mixed({
 | 
			
		||||
    //         continuous: Continuous.toCdf(continuous) |> E.O.toExt(""),
 | 
			
		||||
    //         discrete: discrete |> Discrete.integrate,
 | 
			
		||||
    //         discreteProbabilityMassFraction,
 | 
			
		||||
    //       }),
 | 
			
		||||
    //     )
 | 
			
		||||
    //   | Discrete(discrete) =>
 | 
			
		||||
    //     Some(Continuous(discrete |> Discrete.integrate))
 | 
			
		||||
    //   | Continuous(continuous) =>
 | 
			
		||||
    //     Continuous.toCdf(continuous) |> E.O.fmap(e => Continuous(e))
 | 
			
		||||
    //   };
 | 
			
		||||
    // let normalize = (t: DistributionTypes.shape): option(shape) => {
 | 
			
		||||
    //   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))
 | 
			
		||||
    //   };
 | 
			
		||||
    // };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  let toPdfCdfCombo = (t: t): option(pdfCdfCombo) =>
 | 
			
		||||
    switch (t) {
 | 
			
		||||
    | Mixed({continuous, discrete, discreteProbabilityMassFraction} as tt) =>
 | 
			
		||||
      Some({
 | 
			
		||||
        cdf: continuous |> Continuous.toCdf |> E.O.toExt(""),
 | 
			
		||||
        pdf: Mixed(tt),
 | 
			
		||||
      })
 | 
			
		||||
    | Discrete(d) => Some({cdf: d |> Discrete.integrate, pdf: Discrete(d)})
 | 
			
		||||
    | Continuous(c) =>
 | 
			
		||||
      Some({
 | 
			
		||||
        cdf: c |> Continuous.toCdf |> E.O.toExt(""),
 | 
			
		||||
        pdf: Continuous(c),
 | 
			
		||||
      })
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module PdfCdfShape = {
 | 
			
		||||
| 
						 | 
				
			
			@ -449,10 +454,10 @@ module WithLimitedDomain = {
 | 
			
		|||
  let cdf = (t: t) => PdfCdfShape.cdf(t.dist);
 | 
			
		||||
  // TODO: This is bad, obviously needs to be fixed.
 | 
			
		||||
  let distScaleFactor = (t: t) => 3.0;
 | 
			
		||||
  let scaledPdfShape = (scaleFactor, t: t) =>
 | 
			
		||||
    t |> pdf |> T.pointwiseFmap(r => r *. scaleFactor);
 | 
			
		||||
  let scaledCdfShape = (scaleFactor, t: t) =>
 | 
			
		||||
    t |> cdf |> XYShape.pointwiseMap(r => r *. scaleFactor);
 | 
			
		||||
  // let scaledPdfShape = (scaleFactor, t: t) =>
 | 
			
		||||
  //   t |> pdf |> T.pointwiseFmap(r => r *. scaleFactor);
 | 
			
		||||
  // let scaledCdfShape = (scaleFactor, t: t) =>
 | 
			
		||||
  //   t |> cdf |> XYShape.pointwiseMap(r => r *. scaleFactor);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type withTimeVector = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,15 +5,15 @@ module JS = {
 | 
			
		|||
    ys: array(float),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  let distToJs = (d: DistributionTypes.continuousShape) =>
 | 
			
		||||
  let distToJs = (d: DistributionTypes.xyShape) =>
 | 
			
		||||
    distJs(~xs=d.xs, ~ys=d.ys);
 | 
			
		||||
 | 
			
		||||
  let jsToDist = (d: distJs): DistributionTypes.continuousShape => {
 | 
			
		||||
  let jsToDist = (d: distJs): DistributionTypes.xyShape => {
 | 
			
		||||
    xs: xsGet(d),
 | 
			
		||||
    ys: ysGet(d),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  let doAsDist = (f, d: DistributionTypes.continuousShape) =>
 | 
			
		||||
  let doAsDist = (f, d: DistributionTypes.xyShape) =>
 | 
			
		||||
    d |> distToJs |> f |> jsToDist;
 | 
			
		||||
 | 
			
		||||
  [@bs.module "./CdfLibrary.js"]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,10 +16,10 @@ module Internals = {
 | 
			
		|||
    discrete,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  let toContinous = (r: combined): DistributionTypes.continuousShape =>
 | 
			
		||||
    continuousGet(r) |> CdfLibrary.JS.jsToDist;
 | 
			
		||||
  let toContinous = (r: combined) =>
 | 
			
		||||
    continuousGet(r) |> CdfLibrary.JS.jsToDist |> Shape.Continuous.fromShape;
 | 
			
		||||
 | 
			
		||||
  let toDiscrete = (r: combined): DistributionTypes.discreteShape =>
 | 
			
		||||
  let toDiscrete = (r: combined): DistributionTypes.xyShape =>
 | 
			
		||||
    discreteGet(r) |> jsToDistDiscrete;
 | 
			
		||||
 | 
			
		||||
  [@bs.module "./GuesstimatorLibrary.js"]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user