2022-05-19 22:24:56 +00:00
open FunctionRegistry_Core
open FunctionRegistry_Helpers
2022-05-21 15:41:12 +00:00
let twoArgs = E.Tuple2.toFnCall
2022-05-19 22:24:56 +00:00
2022-05-24 21:02:27 +00:00
module Declaration = {
2022-05-24 11:52:27 +00:00
let frType = FRTypeRecord([
("fn", FRTypeLambda),
("inputs", FRTypeArray(FRTypeRecord([("min", FRTypeNumber), ("max", FRTypeNumber)]))),
])
2022-06-24 10:15:38 +00:00
let fromExpressionValue = (e: frValue): result<internalExpressionValue, string> => {
2022-05-24 21:02:27 +00:00
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs([e]) {
| Ok([FRValueLambda(lambda), FRValueArray(inputs)]) => {
2022-05-24 11:52:27 +00:00
open FunctionRegistry_Helpers.Prepare
2022-05-24 21:02:27 +00:00
let getMinMax = arg =>
2022-05-24 11:52:27 +00:00
ToValueArray.Record.toArgs([arg])
->E.R.bind(ToValueTuple.twoNumbers)
2022-05-24 21:02:27 +00:00
->E.R2.fmap(((min, max)) => Declaration.ContinuousFloatArg.make(min, max))
2022-05-24 11:52:27 +00:00
inputs
->E.A2.fmap(getMinMax)
->E.A.R.firstErrorOrOpen
2022-06-23 18:38:07 +00:00
->E.R2.fmap(args => ReducerInterface_InternalExpressionValue.IEvDeclaration(
2022-05-25 23:27:15 +00:00
Declaration.make(lambda, args),
2022-05-24 21:02:27 +00:00
))
2022-05-24 11:52:27 +00:00
}
2022-05-27 11:29:39 +00:00
| Error(r) => Error(r)
| Ok(_) => Error(FunctionRegistry_Helpers.impossibleError)
2022-05-24 11:52:27 +00:00
}
}
}
2022-05-27 18:03:41 +00:00
let inputsTodist = (inputs: array<FunctionRegistry_Core.frValue>, makeDist) => {
2022-06-09 13:34:31 +00:00
let array = inputs->getOrError(0)->E.R.bind(Prepare.ToValueArray.Array.openA)
2022-05-27 18:03:41 +00:00
let xyCoords =
array->E.R.bind(xyCoords =>
xyCoords
->E.A2.fmap(xyCoord =>
[xyCoord]->Prepare.ToValueArray.Record.twoArgs->E.R.bind(Prepare.ToValueTuple.twoNumbers)
)
->E.A.R.firstErrorOrOpen
)
let expressionValue =
xyCoords
->E.R.bind(r => r->XYShape.T.makeFromZipped->E.R2.errMap(XYShape.Error.toString))
2022-06-23 18:38:07 +00:00
->E.R2.fmap(r => ReducerInterface_InternalExpressionValue.IEvDistribution(
2022-06-16 12:08:59 +00:00
PointSet(makeDist(r)),
))
2022-05-27 18:03:41 +00:00
expressionValue
}
2022-07-13 15:56:22 +00:00
let registryStart = [
2022-05-24 00:49:10 +00:00
Function.make(
2022-05-27 17:37:37 +00:00
~name="toContinuousPointSet",
~definitions=[
FnDefinition.make(
~name="toContinuousPointSet",
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
2022-05-27 18:03:41 +00:00
~run=(inputs, _) => inputsTodist(inputs, r => Continuous(Continuous.make(r))),
),
],
2022-06-10 18:53:04 +00:00
(),
2022-05-27 18:03:41 +00:00
),
Function.make(
~name="toDiscretePointSet",
~definitions=[
FnDefinition.make(
~name="toDiscretePointSet",
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
~run=(inputs, _) => inputsTodist(inputs, r => Discrete(Discrete.make(r))),
2022-05-27 17:37:37 +00:00
),
],
2022-06-10 18:53:04 +00:00
(),
2022-05-27 17:37:37 +00:00
),
Function.make(
~name="Declaration",
2022-05-24 00:49:10 +00:00
~definitions=[
2022-05-25 14:55:03 +00:00
FnDefinition.make(~name="declareFn", ~inputs=[Declaration.frType], ~run=(inputs, _) => {
2022-06-09 13:34:31 +00:00
inputs->getOrError(0)->E.R.bind(Declaration.fromExpressionValue)
2022-05-25 23:27:15 +00:00
}),
2022-05-24 00:49:10 +00:00
],
2022-06-10 18:53:04 +00:00
(),
2022-05-24 00:49:10 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Normal",
2022-06-04 00:59:02 +00:00
~examples=`normal(5,1)
normal({p5: 4, p95: 10})
normal({mean: 5, stdev: 2})`,
2022-05-19 22:24:56 +00:00
~definitions=[
2022-05-22 14:38:17 +00:00
TwoArgDist.make("normal", twoArgs(SymbolicDist.Normal.make)),
2022-05-23 18:28:32 +00:00
TwoArgDist.makeRecordP5P95("normal", r =>
twoArgs(SymbolicDist.Normal.from90PercentCI, r)->Ok
),
2022-05-22 14:38:17 +00:00
TwoArgDist.makeRecordMeanStdev("normal", twoArgs(SymbolicDist.Normal.make)),
2022-05-19 22:24:56 +00:00
],
2022-06-04 00:59:02 +00:00
(),
2022-05-22 14:38:17 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Lognormal",
2022-06-04 00:59:02 +00:00
~examples=`lognormal(0.5, 0.8)
lognormal({p5: 4, p95: 10})
lognormal({mean: 5, stdev: 2})`,
2022-05-19 22:24:56 +00:00
~definitions=[
2022-05-22 14:38:17 +00:00
TwoArgDist.make("lognormal", twoArgs(SymbolicDist.Lognormal.make)),
TwoArgDist.makeRecordP5P95("lognormal", r =>
twoArgs(SymbolicDist.Lognormal.from90PercentCI, r)->Ok
),
TwoArgDist.makeRecordMeanStdev("lognormal", twoArgs(SymbolicDist.Lognormal.fromMeanAndStdev)),
2022-05-19 22:24:56 +00:00
],
2022-06-04 00:59:02 +00:00
(),
2022-05-22 14:38:17 +00:00
),
2022-05-20 21:36:40 +00:00
Function.make(
2022-06-06 03:02:17 +00:00
~name="Uniform",
2022-06-04 00:59:02 +00:00
~examples=`uniform(10, 12)`,
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("uniform", twoArgs(SymbolicDist.Uniform.make))],
2022-06-04 00:59:02 +00:00
(),
2022-05-20 21:36:40 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Beta",
2022-06-27 18:31:35 +00:00
~examples=`beta(20, 25)
beta({mean: 0.39, stdev: 0.1})`,
~definitions=[
TwoArgDist.make("beta", twoArgs(SymbolicDist.Beta.make)),
TwoArgDist.makeRecordMeanStdev("beta", twoArgs(SymbolicDist.Beta.fromMeanAndStdev)),
],
2022-06-04 00:59:02 +00:00
(),
2022-05-20 21:36:40 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Cauchy",
2022-06-04 00:59:02 +00:00
~examples=`cauchy(5, 1)`,
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("cauchy", twoArgs(SymbolicDist.Cauchy.make))],
2022-06-04 00:59:02 +00:00
(),
2022-05-20 21:36:40 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Gamma",
2022-06-04 00:59:02 +00:00
~examples=`gamma(5, 1)`,
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("gamma", twoArgs(SymbolicDist.Gamma.make))],
2022-06-04 00:59:02 +00:00
(),
2022-05-20 21:36:40 +00:00
),
Function.make(
2022-06-06 03:02:17 +00:00
~name="Logistic",
2022-06-04 00:59:02 +00:00
~examples=`gamma(5, 1)`,
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("logistic", twoArgs(SymbolicDist.Logistic.make))],
2022-06-04 00:59:02 +00:00
(),
2022-05-20 21:36:40 +00:00
),
Function.make(
2022-06-04 00:59:02 +00:00
~name="To (Distribution)",
~examples=`5 to 10
to(5,10)
-5 to 5`,
2022-05-23 18:28:32 +00:00
~definitions=[
TwoArgDist.make("to", twoArgs(SymbolicDist.From90thPercentile.make)),
TwoArgDist.make(
"credibleIntervalToDistribution",
twoArgs(SymbolicDist.From90thPercentile.make),
),
2022-05-23 17:49:39 +00:00
],
2022-06-04 00:59:02 +00:00
(),
2022-05-23 18:28:32 +00:00
),
Function.make(
~name="Exponential",
2022-06-04 00:59:02 +00:00
~examples=`exponential(2)`,
2022-05-23 18:28:32 +00:00
~definitions=[OneArgDist.make("exponential", SymbolicDist.Exponential.make)],
2022-06-04 00:59:02 +00:00
(),
2022-05-23 18:28:32 +00:00
),
Function.make(
~name="Bernoulli",
2022-06-04 00:59:02 +00:00
~examples=`bernoulli(0.5)`,
2022-05-23 18:28:32 +00:00
~definitions=[OneArgDist.make("bernoulli", SymbolicDist.Bernoulli.make)],
2022-06-04 00:59:02 +00:00
(),
),
2022-06-04 16:26:52 +00:00
Function.make(
~name="PointMass",
~examples=`pointMass(0.5)`,
~definitions=[OneArgDist.make("pointMass", SymbolicDist.Float.makeSafe)],
(),
),
2022-06-04 00:59:02 +00:00
Function.make(
~name="toContinuousPointSet",
~description="Converts a set of points to a continuous distribution",
~examples=`toContinuousPointSet([
{x: 0, y: 0.1},
{x: 1, y: 0.2},
{x: 2, y: 0.15},
{x: 3, y: 0.1}
])`,
~definitions=[
FnDefinition.make(
~name="toContinuousPointSet",
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
~run=(inputs, _) => inputsTodist(inputs, r => Continuous(Continuous.make(r))),
),
],
(),
),
Function.make(
~name="toDiscretePointSet",
~description="Converts a set of points to a discrete distribution",
~examples=`toDiscretePointSet([
{x: 0, y: 0.1},
{x: 1, y: 0.2},
{x: 2, y: 0.15},
{x: 3, y: 0.1}
])`,
~definitions=[
FnDefinition.make(
~name="toDiscretePointSet",
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
~run=(inputs, _) => inputsTodist(inputs, r => Discrete(Discrete.make(r))),
),
],
(),
),
Function.make(
~name="Declaration (Continuous Function)",
~description="Adds metadata to a function of the input ranges. Works now for numeric and date inputs. This is useful when making predictions. It allows you to limit the domain that your prediction will be used and scored within.",
~examples=`declareFn({
fn: {|a,b| a },
inputs: [
{min: 0, max: 100},
{min: 30, max: 50}
]
})`,
~definitions=[
FnDefinition.make(~name="declareFn", ~inputs=[Declaration.frType], ~run=(inputs, _) => {
inputs->E.A.unsafe_get(0)->Declaration.fromExpressionValue
}),
],
~isExperimental=true,
(),
2022-05-21 02:54:15 +00:00
),
2022-06-10 18:53:04 +00:00
Function.make(
~name="Floor",
~definitions=[NumberToNumber.make("floor", Js.Math.floor_float)],
(),
),
Function.make(
~name="Ceiling",
~definitions=[NumberToNumber.make("ceil", Js.Math.ceil_float)],
(),
2022-05-21 02:54:15 +00:00
),
2022-06-07 16:40:24 +00:00
Function.make(
~name="Absolute Value",
2022-06-08 04:08:39 +00:00
~definitions=[NumberToNumber.make("abs", Js.Math.abs_float)],
2022-06-10 18:53:04 +00:00
(),
),
Function.make(~name="Exponent", ~definitions=[NumberToNumber.make("exp", Js.Math.exp)], ()),
Function.make(~name="Log", ~definitions=[NumberToNumber.make("log", Js.Math.log)], ()),
Function.make(
~name="Log Base 10",
~definitions=[NumberToNumber.make("log10", Js.Math.log10)],
(),
2022-06-07 16:40:24 +00:00
),
2022-06-10 18:53:04 +00:00
Function.make(~name="Log Base 2", ~definitions=[NumberToNumber.make("log2", Js.Math.log2)], ()),
Function.make(~name="Round", ~definitions=[NumberToNumber.make("round", Js.Math.round)], ()),
2022-06-07 16:40:24 +00:00
Function.make(
~name="Sum",
2022-06-08 15:00:06 +00:00
~definitions=[ArrayNumberDist.make("sum", r => r->E.A.Floats.sum->Wrappers.evNumber->Ok)],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Product",
2022-06-08 15:00:06 +00:00
~definitions=[
ArrayNumberDist.make("product", r => r->E.A.Floats.product->Wrappers.evNumber->Ok),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Min",
2022-06-08 15:00:06 +00:00
~definitions=[ArrayNumberDist.make("min", r => r->E.A.Floats.min->Wrappers.evNumber->Ok)],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Max",
2022-06-08 15:00:06 +00:00
~definitions=[ArrayNumberDist.make("max", r => r->E.A.Floats.max->Wrappers.evNumber->Ok)],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Mean",
2022-06-08 15:00:06 +00:00
~definitions=[ArrayNumberDist.make("mean", r => r->E.A.Floats.mean->Wrappers.evNumber->Ok)],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Geometric Mean",
2022-06-08 15:00:06 +00:00
~definitions=[
ArrayNumberDist.make("geomean", r => r->E.A.Floats.geomean->Wrappers.evNumber->Ok),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Standard Deviation",
2022-06-08 15:00:06 +00:00
~definitions=[ArrayNumberDist.make("stdev", r => r->E.A.Floats.stdev->Wrappers.evNumber->Ok)],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Variance",
2022-06-08 15:00:06 +00:00
~definitions=[
ArrayNumberDist.make("variance", r => r->E.A.Floats.stdev->Wrappers.evNumber->Ok),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 15:00:06 +00:00
),
Function.make(
~name="First",
~definitions=[
ArrayNumberDist.make2("first", r =>
r->E.A.first |> E.O.toResult(impossibleError) |> E.R.fmap(Wrappers.evNumber)
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 15:00:06 +00:00
),
Function.make(
~name="Last",
~definitions=[
ArrayNumberDist.make2("last", r =>
r->E.A.last |> E.O.toResult(impossibleError) |> E.R.fmap(Wrappers.evNumber)
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Sort",
~definitions=[
ArrayNumberDist.make("sort", r =>
2022-06-08 15:00:06 +00:00
r->E.A.Floats.sort->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
2022-06-07 16:40:24 +00:00
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
Function.make(
~name="Reverse",
~definitions=[
ArrayNumberDist.make("reverse", r =>
2022-06-08 15:00:06 +00:00
r->Belt_Array.reverse->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 15:00:06 +00:00
),
Function.make(
~name="Cumulative Sum",
~definitions=[
ArrayNumberDist.make("cumsum", r =>
r->E.A.Floats.cumsum->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 15:00:06 +00:00
),
2022-06-08 15:21:20 +00:00
Function.make(
~name="Cumulative Prod",
~definitions=[
ArrayNumberDist.make("cumprod", r =>
r->E.A.Floats.cumsum->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 15:21:20 +00:00
),
2022-06-08 15:00:06 +00:00
Function.make(
~name="Diff",
~definitions=[
ArrayNumberDist.make("diff", r =>
r->E.A.Floats.diff->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
2022-06-07 16:40:24 +00:00
),
2022-06-08 05:35:40 +00:00
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 05:35:40 +00:00
),
Function.make(
~name="Dict.merge",
~definitions=[
FnDefinition.make(
~name="merge",
~inputs=[FRTypeDict(FRTypeAny), FRTypeDict(FRTypeAny)],
~run=(inputs, _) => {
switch inputs {
| [FRValueDict(d1), FRValueDict(d2)] => {
let newDict =
E.Dict.concat(d1, d2) |> Js.Dict.map((. r) =>
FunctionRegistry_Core.FRType.matchReverse(r)
)
2022-06-16 12:08:59 +00:00
newDict->Js.Dict.entries->Belt.Map.String.fromArray->Wrappers.evRecord->Ok
2022-06-08 05:35:40 +00:00
}
| _ => Error(impossibleError)
}
},
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 05:35:40 +00:00
),
2022-06-08 14:24:06 +00:00
//TODO: Make sure that two functions can't have the same name. This causes chaos elsewhere.
2022-06-08 05:35:40 +00:00
Function.make(
~name="Dict.mergeMany",
~definitions=[
FnDefinition.make(~name="mergeMany", ~inputs=[FRTypeArray(FRTypeDict(FRTypeAny))], ~run=(
inputs,
_,
) =>
inputs
->Prepare.ToTypedArray.dicts
->E.R2.fmap(E.Dict.concatMany)
->E.R2.fmap(Js.Dict.map((. r) => FunctionRegistry_Core.FRType.matchReverse(r)))
2022-06-16 12:08:59 +00:00
->E.R2.fmap(r => r->Js.Dict.entries->Belt.Map.String.fromArray)
2022-06-08 05:35:40 +00:00
->E.R2.fmap(Wrappers.evRecord)
),
2022-06-07 16:40:24 +00:00
],
2022-06-10 18:53:04 +00:00
(),
2022-06-07 16:40:24 +00:00
),
2022-06-08 14:24:06 +00:00
Function.make(
~name="Dict.keys",
~definitions=[
FnDefinition.make(~name="keys", ~inputs=[FRTypeDict(FRTypeAny)], ~run=(inputs, _) =>
switch inputs {
| [FRValueDict(d1)] => Js.Dict.keys(d1)->E.A2.fmap(Wrappers.evString)->Wrappers.evArray->Ok
| _ => Error(impossibleError)
}
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 14:24:06 +00:00
),
Function.make(
~name="Dict.values",
~definitions=[
FnDefinition.make(~name="values", ~inputs=[FRTypeDict(FRTypeAny)], ~run=(inputs, _) =>
switch inputs {
| [FRValueDict(d1)] =>
Js.Dict.values(d1)
->E.A2.fmap(FunctionRegistry_Core.FRType.matchReverse)
->Wrappers.evArray
->Ok
| _ => Error(impossibleError)
}
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 14:24:06 +00:00
),
Function.make(
~name="Dict.toList",
~definitions=[
2022-06-10 18:17:47 +00:00
FnDefinition.make(~name="dictToList", ~inputs=[FRTypeDict(FRTypeAny)], ~run=(inputs, _) =>
2022-06-08 14:24:06 +00:00
switch inputs {
| [FRValueDict(dict)] =>
dict
->Js.Dict.entries
->E.A2.fmap(((key, value)) =>
Wrappers.evArray([
Wrappers.evString(key),
FunctionRegistry_Core.FRType.matchReverse(value),
])
)
->Wrappers.evArray
->Ok
| _ => Error(impossibleError)
}
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 14:24:06 +00:00
),
Function.make(
~name="Dict.fromList",
~definitions=[
2022-06-10 18:17:47 +00:00
FnDefinition.make(~name="dictFromList", ~inputs=[FRTypeArray(FRTypeArray(FRTypeAny))], ~run=(
2022-06-08 14:24:06 +00:00
inputs,
_,
) => {
let convertInternalItems = items =>
items
->E.A2.fmap(item => {
switch item {
| [FRValueString(string), value] =>
(string, FunctionRegistry_Core.FRType.matchReverse(value))->Ok
| _ => Error(impossibleError)
}
})
->E.A.R.firstErrorOrOpen
2022-06-16 12:08:59 +00:00
->E.R2.fmap(Belt.Map.String.fromArray)
2022-06-08 14:24:06 +00:00
->E.R2.fmap(Wrappers.evRecord)
2022-06-09 13:34:31 +00:00
inputs->getOrError(0)->E.R.bind(Prepare.ToValueArray.Array.arrayOfArrays)
2022-06-08 15:00:06 +00:00
|> E.R2.bind(convertInternalItems)
2022-06-08 14:24:06 +00:00
}),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 14:24:06 +00:00
),
2022-06-08 04:08:39 +00:00
Function.make(
~name="List.make",
~definitions=[
//Todo: If the second item is a function with no args, it could be nice to run this function and return the result.
FnDefinition.make(~name="listMake", ~inputs=[FRTypeNumber, FRTypeAny], ~run=(inputs, _) => {
switch inputs {
| [FRValueNumber(number), value] =>
Belt.Array.make(E.Float.toInt(number), value)
->E.A2.fmap(FunctionRegistry_Core.FRType.matchReverse)
->Wrappers.evArray
->Ok
| _ => Error(impossibleError)
}
}),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 04:08:39 +00:00
),
Function.make(
2022-06-09 13:34:31 +00:00
~name="upTo",
2022-06-08 04:08:39 +00:00
~definitions=[
FnDefinition.make(~name="upTo", ~inputs=[FRTypeNumber, FRTypeNumber], ~run=(inputs, _) =>
inputs
->Prepare.ToValueTuple.twoNumbers
->E.R2.fmap(((low, high)) =>
E.A.Floats.range(low, high, (high -. low +. 1.0)->E.Float.toInt)
->E.A2.fmap(Wrappers.evNumber)
->Wrappers.evArray
)
),
],
2022-06-10 18:53:04 +00:00
(),
2022-06-08 04:08:39 +00:00
),
2022-05-20 21:36:40 +00:00
]
2022-07-13 15:56:22 +00:00
let runScoring = (estimate, answer, prior) => {
GenericDist.Score.logScore(~estimate, ~answer, ~prior)
->E.R2.fmap(FunctionRegistry_Helpers.Wrappers.evNumber)
->E.R2.errMap(DistributionTypes.Error.toString)
}
let scoreFunctions = [
Function.make(
~name="Score",
~definitions=[
FnDefinition.make(
~name="logScore",
~inputs=[
FRTypeRecord([
("estimate", FRTypeDist),
("answer", FRTypeDistOrNumber),
("prior", FRTypeDist),
]),
],
~run=(inputs, _) => {
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.threeArgs(inputs) {
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d)), FRValueDist(prior)]) =>
runScoring(estimate, Score_Dist(d), Some(prior))
| Ok([
FRValueDist(estimate),
FRValueDistOrNumber(FRValueNumber(d)),
FRValueDist(prior),
]) =>
runScoring(estimate, Score_Scalar(d), Some(prior))
| Error(e) => Error(e)
| _ => Error(FunctionRegistry_Helpers.impossibleError)
}
},
),
FnDefinition.make(
~name="logScore",
~inputs=[FRTypeRecord([("estimate", FRTypeDist), ("answer", FRTypeDistOrNumber)])],
~run=(inputs, _) => {
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs(inputs) {
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d))]) =>
runScoring(estimate, Score_Dist(d), None)
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueNumber(d))]) =>
runScoring(estimate, Score_Scalar(d), None)
| Error(e) => Error(e)
| _ => Error(FunctionRegistry_Helpers.impossibleError)
}
},
),
],
(),
),
]
let registry = E.A.append(registryStart, scoreFunctions)