Fixing lint and tests
This commit is contained in:
parent
faf4718f4d
commit
003b320acb
|
@ -133,8 +133,6 @@ module Matcher = {
|
||||||
}
|
}
|
||||||
|
|
||||||
module FnDefinition = {
|
module FnDefinition = {
|
||||||
type definitionMatch = MatchSimple.t
|
|
||||||
|
|
||||||
let matchAssumingSameName = (f: fnDefinition, args: array<expressionValue>) => {
|
let matchAssumingSameName = (f: fnDefinition, args: array<expressionValue>) => {
|
||||||
switch FRType.matchWithExpressionValueArray(f.inputs, args) {
|
switch FRType.matchWithExpressionValueArray(f.inputs, args) {
|
||||||
| Some(_) => MatchSimple.FullMatch
|
| Some(_) => MatchSimple.FullMatch
|
||||||
|
@ -185,7 +183,6 @@ module Matcher = {
|
||||||
fnName: string,
|
fnName: string,
|
||||||
inputIndex: int,
|
inputIndex: int,
|
||||||
}
|
}
|
||||||
type t = Match.t<array<match>, match>
|
|
||||||
let makeMatch = (fnName: string, inputIndex: int) => {fnName: fnName, inputIndex: inputIndex}
|
let makeMatch = (fnName: string, inputIndex: int) => {fnName: fnName, inputIndex: inputIndex}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ type function = {
|
||||||
|
|
||||||
type registry = array<function>
|
type registry = array<function>
|
||||||
|
|
||||||
|
|
||||||
// Note: The function "name" is just used for documentation purposes
|
// Note: The function "name" is just used for documentation purposes
|
||||||
module Function: {
|
module Function: {
|
||||||
type t = function
|
type t = function
|
||||||
|
|
|
@ -5,7 +5,7 @@ let impossibleError = "Wrong inputs / Logically impossible"
|
||||||
module Wrappers = {
|
module Wrappers = {
|
||||||
let symbolic = r => DistributionTypes.Symbolic(r)
|
let symbolic = r => DistributionTypes.Symbolic(r)
|
||||||
let evDistribution = r => ReducerInterface_ExpressionValue.EvDistribution(r)
|
let evDistribution = r => ReducerInterface_ExpressionValue.EvDistribution(r)
|
||||||
let symbolicEvDistribution = r => r->Symbolic->evDistribution
|
let symbolicEvDistribution = r => r->DistributionTypes.Symbolic->evDistribution
|
||||||
}
|
}
|
||||||
|
|
||||||
module Prepare = {
|
module Prepare = {
|
||||||
|
@ -30,6 +30,13 @@ module Prepare = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let oneDistOrNumber = (values: ts): result<frValueDistOrNumber, err> => {
|
||||||
|
switch values {
|
||||||
|
| [FRValueDistOrNumber(a1)] => Ok(a1)
|
||||||
|
| _ => Error(impossibleError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module Record = {
|
module Record = {
|
||||||
let twoDistOrNumber = (values: ts): result<(frValueDistOrNumber, frValueDistOrNumber), err> =>
|
let twoDistOrNumber = (values: ts): result<(frValueDistOrNumber, frValueDistOrNumber), err> =>
|
||||||
values->ToValueArray.Record.twoArgs->E.R.bind(twoDistOrNumber)
|
values->ToValueArray.Record.twoArgs->E.R.bind(twoDistOrNumber)
|
||||||
|
@ -38,62 +45,78 @@ module Prepare = {
|
||||||
}
|
}
|
||||||
|
|
||||||
module Process = {
|
module Process = {
|
||||||
let twoDistsOrNumbersToDist = (
|
module DistOrNumberToDist = {
|
||||||
~fn: ((float, float)) => result<DistributionTypes.genericDist, string>,
|
module Helpers = {
|
||||||
~values: (frValueDistOrNumber, frValueDistOrNumber),
|
let toSampleSet = (r, env: DistributionOperation.env) =>
|
||||||
~env: DistributionOperation.env,
|
GenericDist.toSampleSetDist(r, env.sampleCount)
|
||||||
): result<DistributionTypes.genericDist, string> => {
|
|
||||||
let toSampleSet = r => GenericDist.toSampleSetDist(r, env.sampleCount)
|
|
||||||
let mapFnResult = r =>
|
|
||||||
switch r {
|
|
||||||
| Ok(r) => Ok(GenericDist.sample(r))
|
|
||||||
| Error(r) => Error(Operation.Other(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
let singleVarSample = (dist, fn) => {
|
let mapFnResult = r =>
|
||||||
switch toSampleSet(dist) {
|
switch r {
|
||||||
| Ok(dist) =>
|
| Ok(r) => Ok(GenericDist.sample(r))
|
||||||
switch SampleSetDist.samplesMap(~fn=f => fn(f)->mapFnResult, dist) {
|
| Error(r) => Error(Operation.Other(r))
|
||||||
| Ok(r) => Ok(DistributionTypes.SampleSet(r))
|
|
||||||
| Error(r) => Error(DistributionTypes.Error.toString(DistributionTypes.SampleSetError(r)))
|
|
||||||
}
|
}
|
||||||
| Error(r) => Error(DistributionTypes.Error.toString(r))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let twoVarSample = (dist1, dist2, fn) => {
|
let wrapSymbolic = (fn, r) => r->fn->E.R2.fmap(Wrappers.symbolic)
|
||||||
let altFn = (a, b) => fn((a, b))->mapFnResult
|
|
||||||
switch E.R.merge(toSampleSet(dist1), toSampleSet(dist2)) {
|
let singleVarSample = (dist, fn, env) => {
|
||||||
| Ok((t1, t2)) =>
|
switch toSampleSet(dist, env) {
|
||||||
switch SampleSetDist.map2(~fn=altFn, ~t1, ~t2) {
|
| Ok(dist) =>
|
||||||
| Ok(r) => Ok(DistributionTypes.SampleSet(r))
|
switch SampleSetDist.samplesMap(~fn=f => fn(f)->mapFnResult, dist) {
|
||||||
| Error(r) => Error(Operation.Error.toString(r))
|
| Ok(r) => Ok(DistributionTypes.SampleSet(r))
|
||||||
|
| Error(r) => Error(DistributionTypes.Error.toString(DistributionTypes.SampleSetError(r)))
|
||||||
|
}
|
||||||
|
| Error(r) => Error(DistributionTypes.Error.toString(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let twoVarSample = (dist1, dist2, fn, env) => {
|
||||||
|
let altFn = (a, b) => fn((a, b))->mapFnResult
|
||||||
|
switch E.R.merge(toSampleSet(dist1, env), toSampleSet(dist2, env)) {
|
||||||
|
| Ok((t1, t2)) =>
|
||||||
|
switch SampleSetDist.map2(~fn=altFn, ~t1, ~t2) {
|
||||||
|
| Ok(r) => Ok(DistributionTypes.SampleSet(r))
|
||||||
|
| Error(r) => Error(Operation.Error.toString(r))
|
||||||
|
}
|
||||||
|
| Error(r) => Error(DistributionTypes.Error.toString(r))
|
||||||
}
|
}
|
||||||
| Error(r) => Error(DistributionTypes.Error.toString(r))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch values {
|
let oneValue = (
|
||||||
| (FRValueNumber(a1), FRValueNumber(a2)) => fn((a1, a2))
|
~fn: float => result<DistributionTypes.genericDist, string>,
|
||||||
| (FRValueDist(a1), FRValueNumber(a2)) => singleVarSample(a1, r => fn((r, a2)))
|
~value: frValueDistOrNumber,
|
||||||
| (FRValueNumber(a1), FRValueDist(a2)) => singleVarSample(a2, r => fn((a1, r)))
|
~env: DistributionOperation.env,
|
||||||
| (FRValueDist(a1), FRValueDist(a2)) => twoVarSample(a1, a2, fn)
|
): result<DistributionTypes.genericDist, string> => {
|
||||||
|
switch value {
|
||||||
|
| FRValueNumber(a1) => fn(a1)
|
||||||
|
| FRValueDist(a1) => Helpers.singleVarSample(a1, r => fn(r), env)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
let twoDistsOrNumbersToDistUsingSymbolicDist = (
|
let oneValueUsingSymbolicDist = (~fn, ~value) => oneValue(~fn=Helpers.wrapSymbolic(fn), ~value)
|
||||||
~fn: ((float, float)) => result<SymbolicDistTypes.symbolicDist, string>,
|
|
||||||
~values,
|
let twoValues = (
|
||||||
) => {
|
~fn: ((float, float)) => result<DistributionTypes.genericDist, string>,
|
||||||
let newFn = r => fn(r)->E.R2.fmap(Wrappers.symbolic)
|
~values: (frValueDistOrNumber, frValueDistOrNumber),
|
||||||
twoDistsOrNumbersToDist(~fn=newFn, ~values)
|
~env: DistributionOperation.env,
|
||||||
|
): result<DistributionTypes.genericDist, string> => {
|
||||||
|
switch values {
|
||||||
|
| (FRValueNumber(a1), FRValueNumber(a2)) => fn((a1, a2))
|
||||||
|
| (FRValueDist(a1), FRValueNumber(a2)) => Helpers.singleVarSample(a1, r => fn((r, a2)), env)
|
||||||
|
| (FRValueNumber(a1), FRValueDist(a2)) => Helpers.singleVarSample(a2, r => fn((a1, r)), env)
|
||||||
|
| (FRValueDist(a1), FRValueDist(a2)) => Helpers.twoVarSample(a1, a2, fn, env)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let twoValuesUsingSymbolicDist = (~fn, ~values) =>
|
||||||
|
twoValues(~fn=Helpers.wrapSymbolic(fn), ~values)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module TwoArgDist = {
|
module TwoArgDist = {
|
||||||
let process = (~fn, ~env, r) =>
|
let process = (~fn, ~env, r) =>
|
||||||
r
|
r
|
||||||
->E.R.bind(Process.twoDistsOrNumbersToDistUsingSymbolicDist(~fn, ~values=_, ~env))
|
->E.R.bind(Process.DistOrNumberToDist.twoValuesUsingSymbolicDist(~fn, ~values=_, ~env))
|
||||||
->E.R2.fmap(Wrappers.evDistribution)
|
->E.R2.fmap(Wrappers.evDistribution)
|
||||||
|
|
||||||
let make = (name, fn) => {
|
let make = (name, fn) => {
|
||||||
|
@ -117,5 +140,17 @@ module TwoArgDist = {
|
||||||
~run=(inputs, env) => inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
~run=(inputs, env) => inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module OneArgDist = {
|
||||||
|
let process = (~fn, ~env, r) =>
|
||||||
|
r
|
||||||
|
->E.R.bind(Process.DistOrNumberToDist.oneValueUsingSymbolicDist(~fn, ~value=_, ~env))
|
||||||
|
->E.R2.fmap(Wrappers.evDistribution)
|
||||||
|
|
||||||
|
let make = (name, fn) => {
|
||||||
|
FnDefinition.make(~name, ~inputs=[FRTypeDistOrNumber], ~run=(inputs, env) =>
|
||||||
|
inputs->Prepare.ToValueTuple.oneDistOrNumber->process(~fn, ~env)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,9 @@ let registry = [
|
||||||
~name="Normal",
|
~name="Normal",
|
||||||
~definitions=[
|
~definitions=[
|
||||||
TwoArgDist.make("normal", twoArgs(SymbolicDist.Normal.make)),
|
TwoArgDist.make("normal", twoArgs(SymbolicDist.Normal.make)),
|
||||||
TwoArgDist.makeRecordP5P95("normal", r => twoArgs(SymbolicDist.Normal.from90PercentCI, r)->Ok),
|
TwoArgDist.makeRecordP5P95("normal", r =>
|
||||||
|
twoArgs(SymbolicDist.Normal.from90PercentCI, r)->Ok
|
||||||
|
),
|
||||||
TwoArgDist.makeRecordMeanStdev("normal", twoArgs(SymbolicDist.Normal.make)),
|
TwoArgDist.makeRecordMeanStdev("normal", twoArgs(SymbolicDist.Normal.make)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -44,9 +46,20 @@ let registry = [
|
||||||
),
|
),
|
||||||
Function.make(
|
Function.make(
|
||||||
~name="To",
|
~name="To",
|
||||||
~definitions=[TwoArgDist.make("to", twoArgs(SymbolicDist.From90thPercentile.make)),
|
~definitions=[
|
||||||
TwoArgDist.make("credibleIntervalToDistribution", twoArgs(SymbolicDist.From90thPercentile.make))
|
TwoArgDist.make("to", twoArgs(SymbolicDist.From90thPercentile.make)),
|
||||||
|
TwoArgDist.make(
|
||||||
|
"credibleIntervalToDistribution",
|
||||||
|
twoArgs(SymbolicDist.From90thPercentile.make),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
Function.make(
|
||||||
|
~name="Exponential",
|
||||||
|
~definitions=[OneArgDist.make("exponential", SymbolicDist.Exponential.make)],
|
||||||
|
),
|
||||||
|
Function.make(
|
||||||
|
~name="Bernoulli",
|
||||||
|
~definitions=[OneArgDist.make("bernoulli", SymbolicDist.Bernoulli.make)],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -37,10 +37,10 @@ The Function name is just there for future documentation. The function defintion
|
||||||
## Key Files
|
## Key Files
|
||||||
|
|
||||||
**FunctionRegistry_Core**
|
**FunctionRegistry_Core**
|
||||||
Key types, internal functionality, and a ``Registry`` module with a ``matchAndRun`` function to call function definitions.
|
Key types, internal functionality, and a `Registry` module with a `matchAndRun` function to call function definitions.
|
||||||
|
|
||||||
**FunctionRegistry_Library**
|
**FunctionRegistry_Library**
|
||||||
A list of all the Functions defined in the Function Registry.
|
A list of all the Functions defined in the Function Registry.
|
||||||
|
|
||||||
**FunctionRegistry_Helpers**
|
**FunctionRegistry_Helpers**
|
||||||
A list of helper functions for the FunctionRegistry_Library.
|
A list of helper functions for the FunctionRegistry_Library.
|
||||||
|
|
|
@ -179,13 +179,6 @@ module Helpers = {
|
||||||
}
|
}
|
||||||
|
|
||||||
module SymbolicConstructors = {
|
module SymbolicConstructors = {
|
||||||
let oneFloat = name =>
|
|
||||||
switch name {
|
|
||||||
| "exponential" => Ok(SymbolicDist.Exponential.make)
|
|
||||||
| "bernoulli" => Ok(SymbolicDist.Bernoulli.make)
|
|
||||||
| _ => Error("Unreachable state")
|
|
||||||
}
|
|
||||||
|
|
||||||
let threeFloat = name =>
|
let threeFloat = name =>
|
||||||
switch name {
|
switch name {
|
||||||
| "triangular" => Ok(SymbolicDist.Triangular.make)
|
| "triangular" => Ok(SymbolicDist.Triangular.make)
|
||||||
|
@ -207,10 +200,6 @@ let dispatchToGenericOutput = (
|
||||||
): option<DistributionOperation.outputType> => {
|
): option<DistributionOperation.outputType> => {
|
||||||
let (fnName, args) = call
|
let (fnName, args) = call
|
||||||
switch (fnName, args) {
|
switch (fnName, args) {
|
||||||
| (("exponential" | "bernoulli") as fnName, [EvNumber(f)]) =>
|
|
||||||
SymbolicConstructors.oneFloat(fnName)
|
|
||||||
->E.R.bind(r => r(f))
|
|
||||||
->SymbolicConstructors.symbolicResultToOutput
|
|
||||||
| ("delta", [EvNumber(f)]) =>
|
| ("delta", [EvNumber(f)]) =>
|
||||||
SymbolicDist.Float.makeSafe(f)->SymbolicConstructors.symbolicResultToOutput
|
SymbolicDist.Float.makeSafe(f)->SymbolicConstructors.symbolicResultToOutput
|
||||||
| ("triangular" as fnName, [EvNumber(f1), EvNumber(f2), EvNumber(f3)]) =>
|
| ("triangular" as fnName, [EvNumber(f1), EvNumber(f2), EvNumber(f3)]) =>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user