squiggle/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res

140 lines
4.4 KiB
Plaintext
Raw Normal View History

open FunctionRegistry_Core
open FunctionRegistry_Helpers
2022-05-21 15:41:12 +00:00
let twoArgs = E.Tuple2.toFnCall
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-05-24 21:02:27 +00:00
let fromExpressionValue = (e: frValue): result<expressionValue, string> => {
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-05-24 21:02:27 +00:00
->E.R2.fmap(args => ReducerInterface_ExpressionValue.EvDeclaration(
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) => {
let array = inputs->E.A.unsafe_get(0)->Prepare.ToValueArray.Array.openA
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))
->E.R2.fmap(r => ReducerInterface_ExpressionValue.EvDistribution(
PointSet(makeDist(r)),
))
expressionValue
}
2022-05-22 14:38:17 +00:00
let registry = [
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))),
),
],
),
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
),
],
),
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-05-24 21:02:27 +00:00
inputs->E.A.unsafe_get(0)->Declaration.fromExpressionValue
}),
2022-05-24 00:49:10 +00:00
],
),
2022-05-22 14:38:17 +00:00
Function.make(
~name="Normal",
~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-22 14:38:17 +00:00
),
Function.make(
~name="Lognormal",
~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-22 14:38:17 +00:00
),
2022-05-20 21:36:40 +00:00
Function.make(
~name="Uniform",
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("uniform", twoArgs(SymbolicDist.Uniform.make))],
2022-05-20 21:36:40 +00:00
),
Function.make(
~name="Beta",
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("beta", twoArgs(SymbolicDist.Beta.make))],
2022-05-20 21:36:40 +00:00
),
Function.make(
~name="Cauchy",
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("cauchy", twoArgs(SymbolicDist.Cauchy.make))],
2022-05-20 21:36:40 +00:00
),
Function.make(
~name="Gamma",
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("gamma", twoArgs(SymbolicDist.Gamma.make))],
2022-05-20 21:36:40 +00:00
),
Function.make(
~name="Logistic",
2022-05-22 14:38:17 +00:00
~definitions=[TwoArgDist.make("logistic", twoArgs(SymbolicDist.Logistic.make))],
2022-05-20 21:36:40 +00:00
),
Function.make(
~name="To",
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-05-23 18:28:32 +00:00
),
Function.make(
~name="Exponential",
~definitions=[OneArgDist.make("exponential", SymbolicDist.Exponential.make)],
),
Function.make(
~name="Bernoulli",
~definitions=[OneArgDist.make("bernoulli", SymbolicDist.Bernoulli.make)],
2022-05-21 02:54:15 +00:00
),
2022-05-20 21:36:40 +00:00
]