squiggle/src/utility/CdfLibrary.re
2020-02-23 13:27:52 +00:00

47 lines
1.4 KiB
ReasonML

module JS = {
[@bs.deriving abstract]
type distJs = {
xs: array(float),
ys: array(float),
};
let distToJs = (d: DistTypes.xyShape) => distJs(~xs=d.xs, ~ys=d.ys);
let jsToDist = (d: distJs): DistTypes.xyShape => {
xs: xsGet(d),
ys: ysGet(d),
};
let doAsDist = (f, d: DistTypes.xyShape) => d |> distToJs |> f |> jsToDist;
[@bs.module "./CdfLibrary.js"]
external cdfToPdf: distJs => distJs = "cdfToPdf";
[@bs.module "./CdfLibrary.js"]
external pdfToCdf: distJs => distJs = "pdfToCdf";
[@bs.module "./CdfLibrary.js"]
external findY: (float, distJs) => float = "findY";
[@bs.module "./CdfLibrary.js"]
external findX: (float, distJs) => float = "findX";
[@bs.module "./CdfLibrary.js"]
external integral: distJs => float = "integral";
[@bs.module "./CdfLibrary.js"]
external differentialEntropy: (int, distJs) => distJs =
"differentialEntropy";
};
module Distribution = {
let toPdf = dist => dist |> JS.doAsDist(JS.cdfToPdf);
let toCdf = dist => dist |> JS.doAsDist(JS.pdfToCdf);
let findX = (y, dist) => dist |> JS.distToJs |> JS.findX(y);
let findY = (x, dist) => dist |> JS.distToJs |> JS.findY(x);
let integral = dist => dist |> JS.distToJs |> JS.integral;
let differentialEntropy = (maxCalculationLength, dist) =>
dist
|> JS.doAsDist(JS.differentialEntropy(maxCalculationLength))
|> integral;
};