Simple mixed distribution
This commit is contained in:
		
							parent
							
								
									5bd66be29e
								
							
						
					
					
						commit
						ab9c8726d6
					
				| 
						 | 
					@ -1,12 +1,17 @@
 | 
				
			||||||
type t = {
 | 
					type t = {
 | 
				
			||||||
  distribution: Types.distribution,
 | 
					  distribution: Types.ContinuousDistribution.t,
 | 
				
			||||||
  domainMaxX: float,
 | 
					  domainMaxX: float,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let make = (~distribution, ~domainMaxX): t => {distribution, domainMaxX};
 | 
					let make = (~distribution, ~domainMaxX): t => {distribution, domainMaxX};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let fromCdf = (cdf: Types.cdf, domainMaxX: float, probabilityAtMaxX: float) => {
 | 
					let fromCdf =
 | 
				
			||||||
  let distribution: Types.distribution = {
 | 
					    (
 | 
				
			||||||
 | 
					      cdf: Types.ContinuousDistribution.t,
 | 
				
			||||||
 | 
					      domainMaxX: float,
 | 
				
			||||||
 | 
					      probabilityAtMaxX: float,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
 | 
					  let distribution: Types.ContinuousDistribution.t = {
 | 
				
			||||||
    xs: cdf.xs,
 | 
					    xs: cdf.xs,
 | 
				
			||||||
    ys: cdf.ys |> E.A.fmap(r => r *. probabilityAtMaxX),
 | 
					    ys: cdf.ys |> E.A.fmap(r => r *. probabilityAtMaxX),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ type t = {
 | 
				
			||||||
let make =
 | 
					let make =
 | 
				
			||||||
    (
 | 
					    (
 | 
				
			||||||
      ~timeVector: timeVector,
 | 
					      ~timeVector: timeVector,
 | 
				
			||||||
      ~distribution: Types.distribution,
 | 
					      ~distribution: Types.ContinuousDistribution.t,
 | 
				
			||||||
      ~probabilityAtMaxX: float,
 | 
					      ~probabilityAtMaxX: float,
 | 
				
			||||||
      ~maxX: [ | `time(MomentRe.Moment.t) | `x(float)],
 | 
					      ~maxX: [ | `time(MomentRe.Moment.t) | `x(float)],
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ module Value = {
 | 
				
			||||||
    | Conditional(conditional)
 | 
					    | Conditional(conditional)
 | 
				
			||||||
    | TimeLimitedDomainCdf(TimeLimitedDomainCdf.t)
 | 
					    | TimeLimitedDomainCdf(TimeLimitedDomainCdf.t)
 | 
				
			||||||
    | TimeLimitedDomainCdfLazy(
 | 
					    | TimeLimitedDomainCdfLazy(
 | 
				
			||||||
        (string => Types.distribution) => TimeLimitedDomainCdf.t,
 | 
					        (string => Types.ContinuousDistribution.t) => TimeLimitedDomainCdf.t,
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    | ConditionalArray(array(conditional))
 | 
					    | ConditionalArray(array(conditional))
 | 
				
			||||||
    | FloatCdf(string);
 | 
					    | FloatCdf(string);
 | 
				
			||||||
| 
						 | 
					@ -59,23 +59,34 @@ module Value = {
 | 
				
			||||||
      let timeLimited = r(CdfLibrary.Distribution.fromString(_, 1000));
 | 
					      let timeLimited = r(CdfLibrary.Distribution.fromString(_, 1000));
 | 
				
			||||||
      let cdf = timeLimited.limitedDomainCdf.distribution;
 | 
					      let cdf = timeLimited.limitedDomainCdf.distribution;
 | 
				
			||||||
      <>
 | 
					      <>
 | 
				
			||||||
        <Chart height=100 data={cdf |> Types.toJs} />
 | 
					        <Chart height=100 data={cdf |> Types.ContinuousDistribution.toJs} />
 | 
				
			||||||
        <Chart
 | 
					        <Chart
 | 
				
			||||||
          height=100
 | 
					          height=100
 | 
				
			||||||
          data={cdf |> CdfLibrary.Distribution.toPdf |> Types.toJs}
 | 
					          data={
 | 
				
			||||||
 | 
					            cdf
 | 
				
			||||||
 | 
					            |> CdfLibrary.Distribution.toPdf
 | 
				
			||||||
 | 
					            |> Types.ContinuousDistribution.toJs
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
        {FloatCdf.logNormal(50., 20.) |> ReasonReact.string}
 | 
					        {FloatCdf.logNormal(50., 20.) |> ReasonReact.string}
 | 
				
			||||||
      </>;
 | 
					      </>;
 | 
				
			||||||
    | TimeLimitedDomainCdf(r) =>
 | 
					    | TimeLimitedDomainCdf(r) =>
 | 
				
			||||||
      let cdf: Types.distribution = r.limitedDomainCdf.distribution;
 | 
					      let cdf: Types.ContinuousDistribution.t =
 | 
				
			||||||
      <> <Chart height=100 data={cdf |> Types.toJs} /> </>;
 | 
					        r.limitedDomainCdf.distribution;
 | 
				
			||||||
 | 
					      <>
 | 
				
			||||||
 | 
					        <Chart height=100 data={cdf |> Types.ContinuousDistribution.toJs} />
 | 
				
			||||||
 | 
					      </>;
 | 
				
			||||||
    | FloatCdf(r) =>
 | 
					    | FloatCdf(r) =>
 | 
				
			||||||
      let cdf: Types.distribution =
 | 
					      let cdf: Types.ContinuousDistribution.t =
 | 
				
			||||||
        CdfLibrary.Distribution.fromString(r, 2000);
 | 
					        CdfLibrary.Distribution.fromString(r, 2000);
 | 
				
			||||||
      <>
 | 
					      <>
 | 
				
			||||||
        <Chart
 | 
					        <Chart
 | 
				
			||||||
          height=100
 | 
					          height=100
 | 
				
			||||||
          data={cdf |> CdfLibrary.Distribution.toPdf |> Types.toJs}
 | 
					          data={
 | 
				
			||||||
 | 
					            cdf
 | 
				
			||||||
 | 
					            |> CdfLibrary.Distribution.toPdf
 | 
				
			||||||
 | 
					            |> Types.ContinuousDistribution.toJs
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
        {r |> ReasonReact.string}
 | 
					        {r |> ReasonReact.string}
 | 
				
			||||||
      </>;
 | 
					      </>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,54 +1,66 @@
 | 
				
			||||||
type distribution = {
 | 
					module ContinuousDistribution = {
 | 
				
			||||||
  xs: array(float),
 | 
					 | 
				
			||||||
  ys: array(float),
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let toJs = (t: distribution) => {
 | 
					 | 
				
			||||||
  {"xs": t.xs, "ys": t.ys};
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let toComponentsDist = (d: distribution): ForetoldComponents.Types.Dist.t => {
 | 
					 | 
				
			||||||
  xs: d.xs,
 | 
					 | 
				
			||||||
  ys: d.ys,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type pdf = distribution;
 | 
					 | 
				
			||||||
type cdf = distribution;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let foo = (b: pdf) => 3.9;
 | 
					 | 
				
			||||||
let bar: cdf = {xs: [||], ys: [||]};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let cc = foo(bar);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module LimitedDomainCdf = {
 | 
					 | 
				
			||||||
  type t = {
 | 
					  type t = {
 | 
				
			||||||
    distribution,
 | 
					    xs: array(float),
 | 
				
			||||||
    domainMaxX: float,
 | 
					    ys: array(float),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let fromCdf = (cdf: cdf, domainMaxX: float, probabilityAtMaxX: float) => {
 | 
					  let toJs = (t: t) => {
 | 
				
			||||||
    let distribution: distribution = {
 | 
					    {"xs": t.xs, "ys": t.ys};
 | 
				
			||||||
      xs: cdf.xs,
 | 
					 | 
				
			||||||
      ys: cdf.ys |> E.A.fmap(r => r *. probabilityAtMaxX),
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    {distribution, domainMaxX};
 | 
					 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let toComponentsDist = (d: t): ForetoldComponents.Types.Dist.t => {
 | 
				
			||||||
 | 
					    xs: d.xs,
 | 
				
			||||||
 | 
					    ys: d.ys,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  type pdf = t;
 | 
				
			||||||
 | 
					  type cdf = t;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module DiscreteDistribution = {
 | 
				
			||||||
 | 
					  type t = {
 | 
				
			||||||
 | 
					    xs: array(float),
 | 
				
			||||||
 | 
					    ys: array(float),
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let fromArray = (xs, ys) => {xs, ys};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let _lastElement = (a: array('a)) =>
 | 
					  let _lastElement = (a: array('a)) =>
 | 
				
			||||||
    switch (Belt.Array.size(a)) {
 | 
					    switch (Belt.Array.size(a)) {
 | 
				
			||||||
    | 0 => None
 | 
					    | 0 => None
 | 
				
			||||||
    | n => Belt.Array.get(a, n)
 | 
					    | n => Belt.Array.get(a, n)
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let probabilityBeforeDomainMax = (t: t) => _lastElement(t.distribution.ys);
 | 
					  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;
 | 
				
			||||||
 | 
					    fromArray(xs, ys);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let chanceByX = (t: t) => t.distribution;
 | 
					  let integral = (p: t) => {
 | 
				
			||||||
 | 
					    let (xs, ys) =
 | 
				
			||||||
  let domainMaxX = (t: t) => t.domainMaxX;
 | 
					      Belt.Array.zip(p.xs, p.ys)
 | 
				
			||||||
  // let probabilityDistribution = (t: t) =>
 | 
					      ->Belt.Array.reduce([||], (items, (x, y)) =>
 | 
				
			||||||
  //   t.distribution |> CdfLibrary.Distribution.toPdf;
 | 
					          switch (_lastElement(items)) {
 | 
				
			||||||
  // let probability = (t: t, xPoint: float) =>
 | 
					          | Some((_, yLast)) => [|(x, y +. yLast)|]
 | 
				
			||||||
  //   CdfLibrary.Distribution.findY(xPoint, probabilityDistribution(t));
 | 
					          | None => [|(x, y)|]
 | 
				
			||||||
  // let cumulativeProbability = (t: t, xPoint: float) =>
 | 
					          }
 | 
				
			||||||
  //   CdfLibrary.Distribution.findY(xPoint, t.distribution);
 | 
					        )
 | 
				
			||||||
 | 
					      |> Belt.Array.unzip;
 | 
				
			||||||
 | 
					    fromArray(xs, ys);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module MixedDistribution = {
 | 
				
			||||||
 | 
					  type distribution = {
 | 
				
			||||||
 | 
					    discrete: DiscreteDistribution.t,
 | 
				
			||||||
 | 
					    continuous: ContinuousDistribution.t,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -5,14 +5,16 @@ module JS = {
 | 
				
			||||||
    ys: array(float),
 | 
					    ys: array(float),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let distToJs = (d: Types.distribution) => distJs(~xs=d.xs, ~ys=d.ys);
 | 
					  let distToJs = (d: Types.ContinuousDistribution.t) =>
 | 
				
			||||||
 | 
					    distJs(~xs=d.xs, ~ys=d.ys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let jsToDist = (d: distJs): Types.distribution => {
 | 
					  let jsToDist = (d: distJs): Types.ContinuousDistribution.t => {
 | 
				
			||||||
    xs: xsGet(d),
 | 
					    xs: xsGet(d),
 | 
				
			||||||
    ys: ysGet(d),
 | 
					    ys: ysGet(d),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let doAsDist = (f, d: Types.distribution) => d |> distToJs |> f |> jsToDist;
 | 
					  let doAsDist = (f, d: Types.ContinuousDistribution.t) =>
 | 
				
			||||||
 | 
					    d |> distToJs |> f |> jsToDist;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  [@bs.module "./CdfLibrary.js"]
 | 
					  [@bs.module "./CdfLibrary.js"]
 | 
				
			||||||
  external cdfToPdf: distJs => distJs = "cdfToPdf";
 | 
					  external cdfToPdf: distJs => distJs = "cdfToPdf";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user