First pass at file renaming

This commit is contained in:
Ozzie Gooen 2022-02-15 15:47:33 -05:00
parent 5a5a3e1ddc
commit 98779c127b
39 changed files with 117 additions and 121 deletions

View File

@ -6,12 +6,12 @@ let makeTest = (~only=false, str, item1, item2) =>
? Only.test(str, () => expect(item1) -> toEqual(item2)) ? Only.test(str, () => expect(item1) -> toEqual(item2))
: test(str, () => expect(item1) -> toEqual(item2)) : test(str, () => expect(item1) -> toEqual(item2))
describe("DistTypes", () => describe("PointSetTypes", () =>
describe("Domain", () => { describe("Domain", () => {
let makeComplete = (yPoint, expectation) => let makeComplete = (yPoint, expectation) =>
makeTest( makeTest(
"With input: " ++ Js.Float.toString(yPoint), "With input: " ++ Js.Float.toString(yPoint),
DistTypes.Domain.yPointToSubYPoint(Complete, yPoint), PointSetTypes.Domain.yPointToSubYPoint(Complete, yPoint),
expectation, expectation,
) )
let makeSingle = (direction: [#left | #right], excludingProbabilityMass, yPoint, expectation) => let makeSingle = (direction: [#left | #right], excludingProbabilityMass, yPoint, expectation) =>
@ -19,7 +19,7 @@ describe("DistTypes", () =>
"Excluding: " ++ "Excluding: " ++
(Js.Float.toString(excludingProbabilityMass) ++ (Js.Float.toString(excludingProbabilityMass) ++
(" and yPoint: " ++ Js.Float.toString(yPoint))), (" and yPoint: " ++ Js.Float.toString(yPoint))),
DistTypes.Domain.yPointToSubYPoint( PointSetTypes.Domain.yPointToSubYPoint(
direction == #left direction == #left
? LeftLimited({xPoint: 3.0, excludingProbabilityMass: excludingProbabilityMass}) ? LeftLimited({xPoint: 3.0, excludingProbabilityMass: excludingProbabilityMass})
: RightLimited({xPoint: 3.0, excludingProbabilityMass: excludingProbabilityMass}), : RightLimited({xPoint: 3.0, excludingProbabilityMass: excludingProbabilityMass}),
@ -28,7 +28,7 @@ describe("DistTypes", () =>
expectation, expectation,
) )
let makeDouble = (domain, yPoint, expectation) => let makeDouble = (domain, yPoint, expectation) =>
makeTest("Excluding: limits", DistTypes.Domain.yPointToSubYPoint(domain, yPoint), expectation) makeTest("Excluding: limits", PointSetTypes.Domain.yPointToSubYPoint(domain, yPoint), expectation)
describe("With Complete Domain", () => { describe("With Complete Domain", () => {
makeComplete(0.0, Some(0.0)) makeComplete(0.0, Some(0.0))

View File

@ -1,7 +1,7 @@
open Jest open Jest
open Expect open Expect
let shape: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]} let shape: PointSetTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]}
// let makeTest = (~only=false, str, item1, item2) => // let makeTest = (~only=false, str, item1, item2) =>
// only // only
@ -131,7 +131,7 @@ let shape: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]}
// describe("Discrete", () => { // describe("Discrete", () => {
// open Discrete; // open Discrete;
// let shape: DistTypes.xyShape = { // let shape: PointSetTypes.xyShape = {
// xs: [|1., 4., 8.|], // xs: [|1., 4., 8.|],
// ys: [|0.3, 0.5, 0.2|], // ys: [|0.3, 0.5, 0.2|],
// }; // };
@ -209,7 +209,7 @@ let shape: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]}
// describe("Mixed", () => { // describe("Mixed", () => {
// open Distributions.Mixed; // open Distributions.Mixed;
// let discreteShape: DistTypes.xyShape = { // let discreteShape: PointSetTypes.xyShape = {
// xs: [|1., 4., 8.|], // xs: [|1., 4., 8.|],
// ys: [|0.3, 0.5, 0.2|], // ys: [|0.3, 0.5, 0.2|],
// }; // };
@ -309,7 +309,7 @@ let shape: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]}
// describe("Distplus", () => { // describe("Distplus", () => {
// open DistPlus; // open DistPlus;
// let discreteShape: DistTypes.xyShape = { // let discreteShape: PointSetTypes.xyShape = {
// xs: [|1., 4., 8.|], // xs: [|1., 4., 8.|],
// ys: [|0.3, 0.5, 0.2|], // ys: [|0.3, 0.5, 0.2|],
// }; // };
@ -382,7 +382,7 @@ let shape: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [8., 9., 2.]}
// let variance = stdev ** 2.0; // let variance = stdev ** 2.0;
// let numSamples = 10000; // let numSamples = 10000;
// open Distributions.Shape; // open Distributions.Shape;
// let normal: SymbolicTypes.symbolicDist = `Normal({mean, stdev}); // let normal: SymbolicDistTypes.symbolicDist = `Normal({mean, stdev});
// let normalShape = ExpressionTree.toShape(numSamples, `SymbolicDist(normal)); // let normalShape = ExpressionTree.toShape(numSamples, `SymbolicDist(normal));
// let lognormal = SymbolicDist.Lognormal.fromMeanAndStdev(mean, stdev); // let lognormal = SymbolicDist.Lognormal.fromMeanAndStdev(mean, stdev);
// let lognormalShape = ExpressionTree.toShape(numSamples, `SymbolicDist(lognormal)); // let lognormalShape = ExpressionTree.toShape(numSamples, `SymbolicDist(lognormal));

View File

@ -28,7 +28,7 @@ let evalParams: ExpressionTypes.ExpressionTree.evaluationParams = {
evaluateNode: ExpressionTreeEvaluator.toLeaf, evaluateNode: ExpressionTreeEvaluator.toLeaf,
}; };
let shape1: DistTypes.xyShape = {xs: [|1., 4., 8.|], ys: [|0.2, 0.4, 0.8|]}; let shape1: PointSetTypes.xyShape = {xs: [|1., 4., 8.|], ys: [|0.2, 0.4, 0.8|]};
describe("XYShapes", () => { describe("XYShapes", () => {
describe("logScorePoint", () => { describe("logScorePoint", () => {

View File

@ -6,14 +6,14 @@ let makeTest = (~only=false, str, item1, item2) =>
? Only.test(str, () => expect(item1) -> toEqual(item2)) ? Only.test(str, () => expect(item1) -> toEqual(item2))
: test(str, () => expect(item1) -> toEqual(item2)) : test(str, () => expect(item1) -> toEqual(item2))
let shape1: DistTypes.xyShape = {xs: [1., 4., 8.], ys: [0.2, 0.4, 0.8]} let shape1: PointSetTypes.xyShape = {xs: [1., 4., 8.], ys: [0.2, 0.4, 0.8]}
let shape2: DistTypes.xyShape = { let shape2: PointSetTypes.xyShape = {
xs: [1., 5., 10.], xs: [1., 5., 10.],
ys: [0.2, 0.5, 0.8], ys: [0.2, 0.5, 0.8],
} }
let shape3: DistTypes.xyShape = { let shape3: PointSetTypes.xyShape = {
xs: [1., 20., 50.], xs: [1., 20., 50.],
ys: [0.2, 0.5, 0.8], ys: [0.2, 0.5, 0.8],
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +0,0 @@
type t = ExpressionTypes.Program.program
let last = (r: t) => E.A.last(r) |> E.O.toResult("No rendered lines")
// let run = (p:program) => p |> E.A.last |> E.O.fmap(r =>
// )

View File

@ -1,3 +1,3 @@
const ProgramEvaluator = require('../distPlus/ProgramEvaluator.gen.js'); const ProgramEvaluator = require('../rescript/ProgramEvaluator.gen.js');
exports.runMePlease = ProgramEvaluator.runAll exports.runMePlease = ProgramEvaluator.runAll

View File

@ -60,7 +60,7 @@ module Internals = {
type outputs = { type outputs = {
graph: ExpressionTypes.ExpressionTree.node, graph: ExpressionTypes.ExpressionTree.node,
shape: DistTypes.shape, shape: PointSetTypes.shape,
} }
let makeOutputs = (graph, shape): outputs => {graph: graph, shape: shape} let makeOutputs = (graph, shape): outputs => {graph: graph, shape: shape}
@ -93,7 +93,7 @@ module Internals = {
let inputsToLeaf = (inputs: Inputs.inputs) => let inputsToLeaf = (inputs: Inputs.inputs) =>
MathJsParser.fromString(inputs.squiggleString) |> E.R.bind(_, g => runProgram(inputs, g)) MathJsParser.fromString(inputs.squiggleString) |> E.R.bind(_, g => runProgram(inputs, g))
let outputToDistPlus = (inputs: Inputs.inputs, shape: DistTypes.shape) => let outputToDistPlus = (inputs: Inputs.inputs, shape: PointSetTypes.shape) =>
DistPlus.make(~shape, ~squiggleString=Some(inputs.squiggleString), ()) DistPlus.make(~shape, ~squiggleString=Some(inputs.squiggleString), ())
} }

View File

@ -1,4 +1,5 @@
open ExpressionTypes.ExpressionTree open ExpressionTypes.ExpressionTree
// This file exists to manage a dependency cycle. It would be good to refactor later.
let rec toString: node => string = x => let rec toString: node => string = x =>
switch x { switch x {

View File

@ -18,8 +18,8 @@ type distToFloatOperation = [
module ExpressionTree = { module ExpressionTree = {
type rec hash = array<(string, node)> type rec hash = array<(string, node)>
and node = [ and node = [
| #SymbolicDist(SymbolicTypes.symbolicDist) | #SymbolicDist(SymbolicDistTypes.symbolicDist)
| #RenderedDist(DistTypes.shape) | #RenderedDist(PointSetTypes.shape)
| #Symbol(string) | #Symbol(string)
| #Hash(hash) | #Hash(hash)
| #Array(array<node>) | #Array(array<node>)
@ -148,7 +148,7 @@ module ExpressionTree = {
| _ => None | _ => None
} }
let _toFloat = (t: DistTypes.shape) => let _toFloat = (t: PointSetTypes.shape) =>
switch t { switch t {
| Discrete({xyShape: {xs: [x], ys: [1.0]}}) => Some(#SymbolicDist(#Float(x))) | Discrete({xyShape: {xs: [x], ys: [1.0]}}) => Some(#SymbolicDist(#Float(x)))
| _ => None | _ => None

View File

@ -36,8 +36,8 @@ module Function = {
module Primative = { module Primative = {
type t = [ type t = [
| #SymbolicDist(SymbolicTypes.symbolicDist) | #SymbolicDist(SymbolicDistTypes.symbolicDist)
| #RenderedDist(DistTypes.shape) | #RenderedDist(PointSetTypes.shape)
| #Function(array<string>, node) | #Function(array<string>, node)
] ]
@ -61,8 +61,8 @@ module Primative = {
module SamplingDistribution = { module SamplingDistribution = {
type t = [ type t = [
| #SymbolicDist(SymbolicTypes.symbolicDist) | #SymbolicDist(SymbolicDistTypes.symbolicDist)
| #RenderedDist(DistTypes.shape) | #RenderedDist(PointSetTypes.shape)
] ]
let isSamplingDistribution: node => bool = x => let isSamplingDistribution: node => bool = x =>

View File

@ -2,8 +2,8 @@ type node = ExpressionTypes.ExpressionTree.node
let getFloat = ExpressionTypes.ExpressionTree.getFloat let getFloat = ExpressionTypes.ExpressionTree.getFloat
type samplingDist = [ type samplingDist = [
| #SymbolicDist(SymbolicTypes.symbolicDist) | #SymbolicDist(SymbolicDistTypes.symbolicDist)
| #RenderedDist(DistTypes.shape) | #RenderedDist(PointSetTypes.shape)
] ]
type rec hashType = array<(string, _type)> type rec hashType = array<(string, _type)>
@ -18,7 +18,7 @@ and _type = [
type rec hashTypedValue = array<(string, typedValue)> type rec hashTypedValue = array<(string, typedValue)>
and typedValue = [ and typedValue = [
| #Float(float) | #Float(float)
| #RenderedDist(DistTypes.shape) | #RenderedDist(PointSetTypes.shape)
| #SamplingDist(samplingDist) | #SamplingDist(samplingDist)
| #Array(array<typedValue>) | #Array(array<typedValue>)
| #Hash(hashTypedValue) | #Hash(hashTypedValue)

View File

@ -97,9 +97,9 @@ let toDiscretePointMassesFromTriangulars = (
let combineShapesContinuousContinuous = ( let combineShapesContinuousContinuous = (
op: ExpressionTypes.algebraicOperation, op: ExpressionTypes.algebraicOperation,
s1: DistTypes.xyShape, s1: PointSetTypes.xyShape,
s2: DistTypes.xyShape, s2: PointSetTypes.xyShape,
): DistTypes.xyShape => { ): PointSetTypes.xyShape => {
let t1n = s1 |> XYShape.T.length let t1n = s1 |> XYShape.T.length
let t2n = s2 |> XYShape.T.length let t2n = s2 |> XYShape.T.length
@ -188,7 +188,7 @@ let combineShapesContinuousContinuous = (
{xs: outputXs, ys: outputYs} {xs: outputXs, ys: outputYs}
} }
let toDiscretePointMassesFromDiscrete = (s: DistTypes.xyShape): pointMassesWithMoments => { let toDiscretePointMassesFromDiscrete = (s: PointSetTypes.xyShape): pointMassesWithMoments => {
let {xs, ys}: XYShape.T.t = s let {xs, ys}: XYShape.T.t = s
let n = E.A.length(xs) let n = E.A.length(xs)
@ -201,9 +201,9 @@ let toDiscretePointMassesFromDiscrete = (s: DistTypes.xyShape): pointMassesWithM
let combineShapesContinuousDiscrete = ( let combineShapesContinuousDiscrete = (
op: ExpressionTypes.algebraicOperation, op: ExpressionTypes.algebraicOperation,
continuousShape: DistTypes.xyShape, continuousShape: PointSetTypes.xyShape,
discreteShape: DistTypes.xyShape, discreteShape: PointSetTypes.xyShape,
): DistTypes.xyShape => { ): PointSetTypes.xyShape => {
let t1n = continuousShape |> XYShape.T.length let t1n = continuousShape |> XYShape.T.length
let t2n = discreteShape |> XYShape.T.length let t2n = discreteShape |> XYShape.T.length

View File

@ -1,6 +1,6 @@
open Distributions open Distributions
type t = DistTypes.continuousShape type t = PointSetTypes.continuousShape
let getShape = (t: t) => t.xyShape let getShape = (t: t) => t.xyShape
let interpolation = (t: t) => t.interpolation let interpolation = (t: t) => t.interpolation
let make = (~interpolation=#Linear, ~integralSumCache=None, ~integralCache=None, xyShape): t => { let make = (~interpolation=#Linear, ~integralSumCache=None, ~integralCache=None, xyShape): t => {
@ -17,10 +17,10 @@ let shapeMap = (fn, {xyShape, interpolation, integralSumCache, integralCache}: t
} }
let lastY = (t: t) => t |> getShape |> XYShape.T.lastY let lastY = (t: t) => t |> getShape |> XYShape.T.lastY
let oShapeMap = (fn, {xyShape, interpolation, integralSumCache, integralCache}: t): option< let oShapeMap = (fn, {xyShape, interpolation, integralSumCache, integralCache}: t): option<
DistTypes.continuousShape, PointSetTypes.continuousShape,
> => fn(xyShape) |> E.O.fmap(make(~interpolation, ~integralSumCache, ~integralCache)) > => fn(xyShape) |> E.O.fmap(make(~interpolation, ~integralSumCache, ~integralCache))
let emptyIntegral: DistTypes.continuousShape = { let emptyIntegral: PointSetTypes.continuousShape = {
xyShape: { xyShape: {
xs: [neg_infinity], xs: [neg_infinity],
ys: [0.0], ys: [0.0],
@ -29,7 +29,7 @@ let emptyIntegral: DistTypes.continuousShape = {
integralSumCache: Some(0.0), integralSumCache: Some(0.0),
integralCache: None, integralCache: None,
} }
let empty: DistTypes.continuousShape = { let empty: PointSetTypes.continuousShape = {
xyShape: XYShape.T.empty, xyShape: XYShape.T.empty,
interpolation: #Linear, interpolation: #Linear,
integralSumCache: Some(0.0), integralSumCache: Some(0.0),
@ -47,11 +47,11 @@ let stepwiseToLinear = (t: t): t =>
let combinePointwise = ( let combinePointwise = (
~integralSumCachesFn=(_, _) => None, ~integralSumCachesFn=(_, _) => None,
~integralCachesFn: (t, t) => option<t>=(_, _) => None, ~integralCachesFn: (t, t) => option<t>=(_, _) => None,
~distributionType: DistTypes.distributionType=#PDF, ~distributionType: PointSetTypes.distributionType=#PDF,
fn: (float, float) => float, fn: (float, float) => float,
t1: DistTypes.continuousShape, t1: PointSetTypes.continuousShape,
t2: DistTypes.continuousShape, t2: PointSetTypes.continuousShape,
): DistTypes.continuousShape => { ): PointSetTypes.continuousShape => {
// If we're adding the distributions, and we know the total of each, then we // If we're adding the distributions, and we know the total of each, then we
// can just sum them up. Otherwise, all bets are off. // can just sum them up. Otherwise, all bets are off.
let combinedIntegralSum = Common.combineIntegralSums( let combinedIntegralSum = Common.combineIntegralSums(
@ -130,19 +130,19 @@ let rec scaleBy = (~scale=1.0, t: t): t => {
} }
module T = Dist({ module T = Dist({
type t = DistTypes.continuousShape type t = PointSetTypes.continuousShape
type integral = DistTypes.continuousShape type integral = PointSetTypes.continuousShape
let minX = shapeFn(XYShape.T.minX) let minX = shapeFn(XYShape.T.minX)
let maxX = shapeFn(XYShape.T.maxX) let maxX = shapeFn(XYShape.T.maxX)
let mapY = mapY let mapY = mapY
let updateIntegralCache = updateIntegralCache let updateIntegralCache = updateIntegralCache
let toDiscreteProbabilityMassFraction = _ => 0.0 let toDiscreteProbabilityMassFraction = _ => 0.0
let toShape = (t: t): DistTypes.shape => Continuous(t) let toShape = (t: t): PointSetTypes.shape => Continuous(t)
let xToY = (f, {interpolation, xyShape}: t) => let xToY = (f, {interpolation, xyShape}: t) =>
switch interpolation { switch interpolation {
| #Stepwise => xyShape |> XYShape.XtoY.stepwiseIncremental(f) |> E.O.default(0.0) | #Stepwise => xyShape |> XYShape.XtoY.stepwiseIncremental(f) |> E.O.default(0.0)
| #Linear => xyShape |> XYShape.XtoY.linear(f) | #Linear => xyShape |> XYShape.XtoY.linear(f)
} |> DistTypes.MixedPoint.makeContinuous } |> PointSetTypes.MixedPoint.makeContinuous
let truncate = (leftCutoff: option<float>, rightCutoff: option<float>, t: t) => { let truncate = (leftCutoff: option<float>, rightCutoff: option<float>, t: t) => {
let lc = E.O.default(neg_infinity, leftCutoff) let lc = E.O.default(neg_infinity, leftCutoff)
@ -213,7 +213,7 @@ module T = Dist({
let combineAlgebraicallyWithDiscrete = ( let combineAlgebraicallyWithDiscrete = (
op: ExpressionTypes.algebraicOperation, op: ExpressionTypes.algebraicOperation,
t1: t, t1: t,
t2: DistTypes.discreteShape, t2: PointSetTypes.discreteShape,
) => { ) => {
let t1s = t1 |> getShape let t1s = t1 |> getShape
let t2s = t2.xyShape // TODO would like to use Discrete.getShape here, but current file structure doesn't allow for that let t2s = t2.xyShape // TODO would like to use Discrete.getShape here, but current file structure doesn't allow for that

View File

@ -1,6 +1,6 @@
open Distributions open Distributions
type t = DistTypes.discreteShape type t = PointSetTypes.discreteShape
let make = (~integralSumCache=None, ~integralCache=None, xyShape): t => { let make = (~integralSumCache=None, ~integralCache=None, xyShape): t => {
xyShape: xyShape, xyShape: xyShape,
@ -16,13 +16,13 @@ let getShape = (t: t) => t.xyShape
let oShapeMap = (fn, {xyShape, integralSumCache, integralCache}: t): option<t> => let oShapeMap = (fn, {xyShape, integralSumCache, integralCache}: t): option<t> =>
fn(xyShape) |> E.O.fmap(make(~integralSumCache, ~integralCache)) fn(xyShape) |> E.O.fmap(make(~integralSumCache, ~integralCache))
let emptyIntegral: DistTypes.continuousShape = { let emptyIntegral: PointSetTypes.continuousShape = {
xyShape: {xs: [neg_infinity], ys: [0.0]}, xyShape: {xs: [neg_infinity], ys: [0.0]},
interpolation: #Stepwise, interpolation: #Stepwise,
integralSumCache: Some(0.0), integralSumCache: Some(0.0),
integralCache: None, integralCache: None,
} }
let empty: DistTypes.discreteShape = { let empty: PointSetTypes.discreteShape = {
xyShape: XYShape.T.empty, xyShape: XYShape.T.empty,
integralSumCache: Some(0.0), integralSumCache: Some(0.0),
integralCache: Some(emptyIntegral), integralCache: Some(emptyIntegral),
@ -35,13 +35,13 @@ let lastY = (t: t) => t |> getShape |> XYShape.T.lastY
let combinePointwise = ( let combinePointwise = (
~integralSumCachesFn=(_, _) => None, ~integralSumCachesFn=(_, _) => None,
~integralCachesFn: ( ~integralCachesFn: (
DistTypes.continuousShape, PointSetTypes.continuousShape,
DistTypes.continuousShape, PointSetTypes.continuousShape,
) => option<DistTypes.continuousShape>=(_, _) => None, ) => option<PointSetTypes.continuousShape>=(_, _) => None,
fn, fn,
t1: DistTypes.discreteShape, t1: PointSetTypes.discreteShape,
t2: DistTypes.discreteShape, t2: PointSetTypes.discreteShape,
): DistTypes.discreteShape => { ): PointSetTypes.discreteShape => {
let combinedIntegralSum = Common.combineIntegralSums( let combinedIntegralSum = Common.combineIntegralSums(
integralSumCachesFn, integralSumCachesFn,
t1.integralSumCache, t1.integralSumCache,
@ -67,7 +67,7 @@ let reduce = (
~integralCachesFn=(_, _) => None, ~integralCachesFn=(_, _) => None,
fn, fn,
discreteShapes, discreteShapes,
): DistTypes.discreteShape => ): PointSetTypes.discreteShape =>
discreteShapes |> E.A.fold_left( discreteShapes |> E.A.fold_left(
combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn), combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn),
empty, empty,
@ -134,8 +134,8 @@ let scaleBy = (~scale=1.0, t: t): t => {
} }
module T = Dist({ module T = Dist({
type t = DistTypes.discreteShape type t = PointSetTypes.discreteShape
type integral = DistTypes.continuousShape type integral = PointSetTypes.continuousShape
let integral = t => let integral = t =>
switch (getShape(t) |> XYShape.T.isEmpty, t.integralCache) { switch (getShape(t) |> XYShape.T.isEmpty, t.integralCache) {
| (true, _) => emptyIntegral | (true, _) => emptyIntegral
@ -157,7 +157,7 @@ module T = Dist({
let toDiscreteProbabilityMassFraction = _ => 1.0 let toDiscreteProbabilityMassFraction = _ => 1.0
let mapY = mapY let mapY = mapY
let updateIntegralCache = updateIntegralCache let updateIntegralCache = updateIntegralCache
let toShape = (t: t): DistTypes.shape => Discrete(t) let toShape = (t: t): PointSetTypes.shape => Discrete(t)
let toContinuous = _ => None let toContinuous = _ => None
let toDiscrete = t => Some(t) let toDiscrete = t => Some(t)
@ -199,7 +199,7 @@ module T = Dist({
|> getShape |> getShape
|> XYShape.XtoY.stepwiseIfAtX(f) |> XYShape.XtoY.stepwiseIfAtX(f)
|> E.O.default(0.0) |> E.O.default(0.0)
|> DistTypes.MixedPoint.makeDiscrete |> PointSetTypes.MixedPoint.makeDiscrete
let integralXtoY = (f, t) => t |> integral |> Continuous.getShape |> XYShape.XtoY.linear(f) let integralXtoY = (f, t) => t |> integral |> Continuous.getShape |> XYShape.XtoY.linear(f)

View File

@ -1,6 +1,6 @@
open DistTypes; open PointSetTypes;
type t = DistTypes.distPlus; type t = PointSetTypes.distPlus;
let shapeIntegral = shape => Shape.T.Integral.get(shape); let shapeIntegral = shape => Shape.T.Integral.get(shape);
let make = let make =
@ -49,8 +49,8 @@ let shapeFn = (fn, {shape}: t) => fn(shape);
module T = module T =
Distributions.Dist({ Distributions.Dist({
type t = DistTypes.distPlus; type t = PointSetTypes.distPlus;
type integral = DistTypes.distPlus; type integral = PointSetTypes.distPlus;
let toShape = toShape; let toShape = toShape;
let toContinuous = shapeFn(Shape.T.toContinuous); let toContinuous = shapeFn(Shape.T.toContinuous);
let toDiscrete = shapeFn(Shape.T.toDiscrete); let toDiscrete = shapeFn(Shape.T.toDiscrete);
@ -84,7 +84,7 @@ module T =
let integral = (t: t) => let integral = (t: t) =>
updateShape(Continuous(t.integralCache), t); updateShape(Continuous(t.integralCache), t);
let updateIntegralCache = (integralCache: option<DistTypes.continuousShape>, t) => let updateIntegralCache = (integralCache: option<PointSetTypes.continuousShape>, t) =>
update(~integralCache=E.O.default(t.integralCache, integralCache), t); update(~integralCache=E.O.default(t.integralCache, integralCache), t);
let downsample = (i, t): t => let downsample = (i, t): t =>

View File

@ -5,20 +5,20 @@ module type dist = {
let maxX: t => float let maxX: t => float
let mapY: ( let mapY: (
~integralSumCacheFn: float => option<float>=?, ~integralSumCacheFn: float => option<float>=?,
~integralCacheFn: DistTypes.continuousShape => option<DistTypes.continuousShape>=?, ~integralCacheFn: PointSetTypes.continuousShape => option<PointSetTypes.continuousShape>=?,
~fn: float => float, ~fn: float => float,
t, t,
) => t ) => t
let xToY: (float, t) => DistTypes.mixedPoint let xToY: (float, t) => PointSetTypes.mixedPoint
let toShape: t => DistTypes.shape let toShape: t => PointSetTypes.shape
let toContinuous: t => option<DistTypes.continuousShape> let toContinuous: t => option<PointSetTypes.continuousShape>
let toDiscrete: t => option<DistTypes.discreteShape> let toDiscrete: t => option<PointSetTypes.discreteShape>
let normalize: t => t let normalize: t => t
let toDiscreteProbabilityMassFraction: t => float let toDiscreteProbabilityMassFraction: t => float
let downsample: (int, t) => t let downsample: (int, t) => t
let truncate: (option<float>, option<float>, t) => t let truncate: (option<float>, option<float>, t) => t
let updateIntegralCache: (option<DistTypes.continuousShape>, t) => t let updateIntegralCache: (option<PointSetTypes.continuousShape>, t) => t
let integral: t => integral let integral: t => integral
let integralEndY: t => float let integralEndY: t => float
@ -74,11 +74,11 @@ module Common = {
let combineIntegrals = ( let combineIntegrals = (
combineFn: ( combineFn: (
DistTypes.continuousShape, PointSetTypes.continuousShape,
DistTypes.continuousShape, PointSetTypes.continuousShape,
) => option<DistTypes.continuousShape>, ) => option<PointSetTypes.continuousShape>,
t1IntegralCache: option<DistTypes.continuousShape>, t1IntegralCache: option<PointSetTypes.continuousShape>,
t2IntegralCache: option<DistTypes.continuousShape>, t2IntegralCache: option<PointSetTypes.continuousShape>,
) => ) =>
switch (t1IntegralCache, t2IntegralCache) { switch (t1IntegralCache, t2IntegralCache) {
| (None, _) | (None, _)

View File

@ -1,6 +1,6 @@
open Distributions open Distributions
type t = DistTypes.mixedShape type t = PointSetTypes.mixedShape
let make = (~integralSumCache=None, ~integralCache=None, ~continuous, ~discrete): t => { let make = (~integralSumCache=None, ~integralCache=None, ~continuous, ~discrete): t => {
continuous: continuous, continuous: continuous,
discrete: discrete, discrete: discrete,
@ -37,13 +37,13 @@ let updateIntegralCache = (integralCache, t: t): t => {
} }
module T = Dist({ module T = Dist({
type t = DistTypes.mixedShape type t = PointSetTypes.mixedShape
type integral = DistTypes.continuousShape type integral = PointSetTypes.continuousShape
let minX = ({continuous, discrete}: t) => let minX = ({continuous, discrete}: t) =>
min(Continuous.T.minX(continuous), Discrete.T.minX(discrete)) min(Continuous.T.minX(continuous), Discrete.T.minX(discrete))
let maxX = ({continuous, discrete}: t) => let maxX = ({continuous, discrete}: t) =>
max(Continuous.T.maxX(continuous), Discrete.T.maxX(discrete)) max(Continuous.T.maxX(continuous), Discrete.T.maxX(discrete))
let toShape = (t: t): DistTypes.shape => Mixed(t) let toShape = (t: t): PointSetTypes.shape => Mixed(t)
let updateIntegralCache = updateIntegralCache let updateIntegralCache = updateIntegralCache
@ -103,7 +103,7 @@ module T = Dist({
let {continuous, discrete}: t = normalize(t) let {continuous, discrete}: t = normalize(t)
let c = Continuous.T.xToY(x, continuous) let c = Continuous.T.xToY(x, continuous)
let d = Discrete.T.xToY(x, discrete) let d = Discrete.T.xToY(x, discrete)
DistTypes.MixedPoint.add(c, d) // "add" here just combines the two values into a single MixedPoint. PointSetTypes.MixedPoint.add(c, d) // "add" here just combines the two values into a single MixedPoint.
} }
let toDiscreteProbabilityMassFraction = ({discrete, continuous}: t) => { let toDiscreteProbabilityMassFraction = ({discrete, continuous}: t) => {
@ -170,13 +170,13 @@ module T = Dist({
~fn, ~fn,
t: t, t: t,
): t => { ): t => {
let yMappedDiscrete: DistTypes.discreteShape = let yMappedDiscrete: PointSetTypes.discreteShape =
t.discrete t.discrete
|> Discrete.T.mapY(~fn) |> Discrete.T.mapY(~fn)
|> Discrete.updateIntegralSumCache(E.O.bind(t.discrete.integralSumCache, integralSumCacheFn)) |> Discrete.updateIntegralSumCache(E.O.bind(t.discrete.integralSumCache, integralSumCacheFn))
|> Discrete.updateIntegralCache(E.O.bind(t.discrete.integralCache, integralCacheFn)) |> Discrete.updateIntegralCache(E.O.bind(t.discrete.integralCache, integralCacheFn))
let yMappedContinuous: DistTypes.continuousShape = let yMappedContinuous: PointSetTypes.continuousShape =
t.continuous t.continuous
|> Continuous.T.mapY(~fn) |> Continuous.T.mapY(~fn)
|> Continuous.updateIntegralSumCache( |> Continuous.updateIntegralSumCache(

View File

@ -9,9 +9,9 @@ type assumptions = {
} }
let buildSimple = ( let buildSimple = (
~continuous: option<DistTypes.continuousShape>, ~continuous: option<PointSetTypes.continuousShape>,
~discrete: option<DistTypes.discreteShape>, ~discrete: option<PointSetTypes.discreteShape>,
): option<DistTypes.shape> => { ): option<PointSetTypes.shape> => {
let continuous = let continuous =
continuous |> E.O.default(Continuous.make(~integralSumCache=Some(0.0), {xs: [], ys: []})) continuous |> E.O.default(Continuous.make(~integralSumCache=Some(0.0), {xs: [], ys: []}))
let discrete = let discrete =

View File

@ -1,6 +1,6 @@
open Distributions open Distributions
type t = DistTypes.shape type t = PointSetTypes.shape
let mapToAll = ((fn1, fn2, fn3), t: t) => let mapToAll = ((fn1, fn2, fn3), t: t) =>
switch t { switch t {
| Mixed(m) => fn1(m) | Mixed(m) => fn1(m)
@ -47,31 +47,31 @@ let combineAlgebraically = (op: ExpressionTypes.algebraicOperation, t1: t, t2: t
let combinePointwise = ( let combinePointwise = (
~integralSumCachesFn: (float, float) => option<float>=(_, _) => None, ~integralSumCachesFn: (float, float) => option<float>=(_, _) => None,
~integralCachesFn: ( ~integralCachesFn: (
DistTypes.continuousShape, PointSetTypes.continuousShape,
DistTypes.continuousShape, PointSetTypes.continuousShape,
) => option<DistTypes.continuousShape>=(_, _) => None, ) => option<PointSetTypes.continuousShape>=(_, _) => None,
fn, fn,
t1: t, t1: t,
t2: t, t2: t,
) => ) =>
switch (t1, t2) { switch (t1, t2) {
| (Continuous(m1), Continuous(m2)) => | (Continuous(m1), Continuous(m2)) =>
DistTypes.Continuous( PointSetTypes.Continuous(
Continuous.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, m1, m2), Continuous.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, m1, m2),
) )
| (Discrete(m1), Discrete(m2)) => | (Discrete(m1), Discrete(m2)) =>
DistTypes.Discrete( PointSetTypes.Discrete(
Discrete.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, m1, m2), Discrete.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, m1, m2),
) )
| (m1, m2) => | (m1, m2) =>
DistTypes.Mixed( PointSetTypes.Mixed(
Mixed.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, toMixed(m1), toMixed(m2)), Mixed.combinePointwise(~integralSumCachesFn, ~integralCachesFn, fn, toMixed(m1), toMixed(m2)),
) )
} }
module T = Dist({ module T = Dist({
type t = DistTypes.shape type t = PointSetTypes.shape
type integral = DistTypes.continuousShape type integral = PointSetTypes.continuousShape
let xToY = (f: float) => mapToAll((Mixed.T.xToY(f), Discrete.T.xToY(f), Continuous.T.xToY(f))) let xToY = (f: float) => mapToAll((Mixed.T.xToY(f), Discrete.T.xToY(f), Continuous.T.xToY(f)))
@ -163,7 +163,7 @@ module T = Dist({
}) })
let pdf = (f: float, t: t) => { let pdf = (f: float, t: t) => {
let mixedPoint: DistTypes.mixedPoint = T.xToY(f, t) let mixedPoint: PointSetTypes.mixedPoint = T.xToY(f, t)
mixedPoint.continuous +. mixedPoint.discrete mixedPoint.continuous +. mixedPoint.discrete
} }

View File

@ -1,4 +1,4 @@
open DistTypes open PointSetTypes
let interpolate = (xMin: float, xMax: float, yMin: float, yMax: float, xIntended: float): float => { let interpolate = (xMin: float, xMax: float, yMin: float, yMax: float, xIntended: float): float => {
let minProportion = (xMax -. xIntended) /. (xMax -. xMin) let minProportion = (xMax -. xIntended) /. (xMax -. xMin)
@ -126,8 +126,8 @@ module XtoY = {
/* Returns a between-points-interpolating function that can be used with PointwiseCombination.combine. /* Returns a between-points-interpolating function that can be used with PointwiseCombination.combine.
Interpolation can either be stepwise (using the value on the left) or linear. Extrapolation can be `UseZero or `UseOutermostPoints. */ Interpolation can either be stepwise (using the value on the left) or linear. Extrapolation can be `UseZero or `UseOutermostPoints. */
let continuousInterpolator = ( let continuousInterpolator = (
interpolation: DistTypes.interpolationStrategy, interpolation: PointSetTypes.interpolationStrategy,
extrapolation: DistTypes.extrapolationStrategy, extrapolation: PointSetTypes.extrapolationStrategy,
): interpolator => ): interpolator =>
switch (interpolation, extrapolation) { switch (interpolation, extrapolation) {
| (#Linear, #UseZero) => | (#Linear, #UseZero) =>
@ -395,7 +395,7 @@ module Analysis = {
let integrateContinuousShape = ( let integrateContinuousShape = (
~indefiniteIntegralStepwise=(p, h1) => h1 *. p, ~indefiniteIntegralStepwise=(p, h1) => h1 *. p,
~indefiniteIntegralLinear=(p, a, b) => a *. p +. b *. p ** 2.0 /. 2.0, ~indefiniteIntegralLinear=(p, a, b) => a *. p +. b *. p ** 2.0 /. 2.0,
t: DistTypes.continuousShape, t: PointSetTypes.continuousShape,
): float => { ): float => {
let xs = t.xyShape.xs let xs = t.xyShape.xs
let ys = t.xyShape.ys let ys = t.xyShape.ys
@ -424,7 +424,7 @@ module Analysis = {
}) })
} }
let getMeanOfSquaresContinuousShape = (t: DistTypes.continuousShape) => { let getMeanOfSquaresContinuousShape = (t: PointSetTypes.continuousShape) => {
let indefiniteIntegralLinear = (p, a, b) => a *. p ** 3.0 /. 3.0 +. b *. p ** 4.0 /. 4.0 let indefiniteIntegralLinear = (p, a, b) => a *. p ** 3.0 /. 3.0 +. b *. p ** 4.0 /. 4.0
let indefiniteIntegralStepwise = (p, h1) => h1 *. p ** 3.0 /. 3.0 let indefiniteIntegralStepwise = (p, h1) => h1 *. p ** 3.0 /. 3.0
integrateContinuousShape(~indefiniteIntegralStepwise, ~indefiniteIntegralLinear, t) integrateContinuousShape(~indefiniteIntegralStepwise, ~indefiniteIntegralLinear, t)

View File

@ -11,7 +11,7 @@ module Internals = {
type outputs = { type outputs = {
continuousParseParams: option<samplingStats>, continuousParseParams: option<samplingStats>,
shape: option<DistTypes.shape>, shape: option<PointSetTypes.shape>,
} }
} }
@ -22,7 +22,7 @@ module Internals = {
ys: array<float>, ys: array<float>,
} }
let jsToDist = (d: distJs): DistTypes.xyShape => { let jsToDist = (d: distJs): PointSetTypes.xyShape => {
xs: xsGet(d), xs: xsGet(d),
ys: ysGet(d), ys: ysGet(d),
} }
@ -86,7 +86,7 @@ let toShape = (
Array.fast_sort(compare, samples) Array.fast_sort(compare, samples)
let (continuousPart, discretePart) = E.A.Sorted.Floats.split(samples) let (continuousPart, discretePart) = E.A.Sorted.Floats.split(samples)
let length = samples |> E.A.length |> float_of_int let length = samples |> E.A.length |> float_of_int
let discrete: DistTypes.discreteShape = let discrete: PointSetTypes.discreteShape =
discretePart discretePart
|> E.FloatFloatMap.fmap(r => r /. length) |> E.FloatFloatMap.fmap(r => r /. length)
|> E.FloatFloatMap.toArray |> E.FloatFloatMap.toArray

View File

@ -1,4 +1,4 @@
open SymbolicTypes open SymbolicDistTypes
module Normal = { module Normal = {
type t = normal type t = normal
@ -317,7 +317,7 @@ module T = {
| _ => #NoSolution | _ => #NoSolution
} }
let toShape = (sampleCount, d: symbolicDist): DistTypes.shape => let toShape = (sampleCount, d: symbolicDist): PointSetTypes.shape =>
switch d { switch d {
| #Float(v) => Discrete(Discrete.make(~integralSumCache=Some(1.0), {xs: [v], ys: [1.0]})) | #Float(v) => Discrete(Discrete.make(~integralSumCache=Some(1.0), {xs: [v], ys: [1.0]}))
| _ => | _ =>