squiggle/src/Model2.re
2020-02-09 15:25:04 +00:00

64 lines
1.7 KiB
ReasonML

type model = {
name: string,
author: string,
assumptions: list(Input.parameter),
inputs: list(Input.parameter),
outputs: list(Output.parameter),
outputConfig: Output.outputConfig,
};
let gatherInputs = (m: model, a: list(InputTypes.withName)) => {
let getItem = (p: Input.parameter) => InputTypes.getName(a, p.id);
[
m.assumptions |> List.map(getItem),
m.inputs |> List.map(getItem),
[InputTypes.getName(a, "output")],
]
|> List.flatten;
};
module MS = Belt.Map.String;
type modelMaps = {
assumptions: MS.t((Input.parameter, option(InputTypes.t))),
inputs: MS.t((Input.parameter, option(InputTypes.t))),
output: (Output.parameter, option(InputTypes.t)),
};
let toMaps = (m: model): modelMaps => {
assumptions:
MS.fromArray(
m.assumptions
|> List.map((r: Input.parameter) =>
(r.id, (r, Input.toInput(r.parameterType)))
)
|> Array.of_list,
),
inputs:
MS.fromArray(
m.inputs
|> List.map((r: Input.parameter) =>
(r.id, (r, Input.toInput(r.parameterType)))
)
|> Array.of_list,
),
output: (Output.make(~name="Payouts", ~parameterType=FloatCdf, ()), None),
};
type modelParams = {
assumptions: list(option(InputTypes.t)),
inputs: list(option(InputTypes.t)),
output: option(InputTypes.t),
};
let response = (m: model, a: list(InputTypes.withName)) => {
let getItem = (p: Input.parameter) =>
InputTypes.getName(a, p.id)->Belt.Option.map(InputTypes.withoutName);
{
assumptions: m.assumptions |> List.map(getItem),
inputs: m.inputs |> List.map(getItem),
output:
InputTypes.getName(a, "output")
->Belt.Option.map(InputTypes.withoutName),
};
};