Further basic cleanup
This commit is contained in:
parent
905ecf0ad3
commit
9520175795
|
@ -329,7 +329,7 @@ let shape: DistTypes.xyShape = {xs: [|1., 4., 8.|], ys: [|8., 9., 2.|]};
|
||||||
// let distPlus =
|
// let distPlus =
|
||||||
// DistPlus.make(
|
// DistPlus.make(
|
||||||
// ~shape=Mixed(mixed),
|
// ~shape=Mixed(mixed),
|
||||||
// ~guesstimatorString=None,
|
// ~squiggleString=None,
|
||||||
// (),
|
// (),
|
||||||
// );
|
// );
|
||||||
// makeTest("minX", T.minX(distPlus), 1.0);
|
// makeTest("minX", T.minX(distPlus), 1.0);
|
||||||
|
|
|
@ -3,8 +3,7 @@ open Antd.Grid;
|
||||||
|
|
||||||
module FormConfig = [%lenses
|
module FormConfig = [%lenses
|
||||||
type state = {
|
type state = {
|
||||||
guesstimatorString: string,
|
squiggleString: string,
|
||||||
//
|
|
||||||
sampleCount: string,
|
sampleCount: string,
|
||||||
outputXYPoints: string,
|
outputXYPoints: string,
|
||||||
downsampleTo: string,
|
downsampleTo: string,
|
||||||
|
@ -122,18 +121,13 @@ module Styles = {
|
||||||
|
|
||||||
module DemoDist = {
|
module DemoDist = {
|
||||||
[@react.component]
|
[@react.component]
|
||||||
let make = (~guesstimatorString:string, ~options) => {
|
let make = (~squiggleString:string, ~options) => {
|
||||||
<Antd.Card title={"Distribution" |> R.ste}>
|
<Antd.Card title={"Distribution" |> R.ste}>
|
||||||
<div>
|
<div>
|
||||||
{switch (options) {
|
{switch (options) {
|
||||||
| Some(options) =>
|
| Some(options) =>
|
||||||
let distPlusIngredients =
|
|
||||||
DistPlusRenderer.Inputs.Ingredients.make(
|
|
||||||
~guesstimatorString,
|
|
||||||
(),
|
|
||||||
);
|
|
||||||
let inputs1 =
|
let inputs1 =
|
||||||
DistPlusRenderer.Inputs.make(
|
ProgramEvaluator.Inputs.make(
|
||||||
~samplingInputs={
|
~samplingInputs={
|
||||||
sampleCount: Some(options.sampleCount),
|
sampleCount: Some(options.sampleCount),
|
||||||
outputXYPoints: Some(options.outputXYPoints),
|
outputXYPoints: Some(options.outputXYPoints),
|
||||||
|
@ -141,7 +135,7 @@ module DemoDist = {
|
||||||
shapeLength:
|
shapeLength:
|
||||||
Some(options.downsampleTo |> E.O.default(1000)),
|
Some(options.downsampleTo |> E.O.default(1000)),
|
||||||
},
|
},
|
||||||
~distPlusIngredients,
|
~squiggleString,
|
||||||
~environment=
|
~environment=
|
||||||
[|
|
[|
|
||||||
("K", `SymbolicDist(`Float(1000.0))),
|
("K", `SymbolicDist(`Float(1000.0))),
|
||||||
|
@ -153,7 +147,7 @@ module DemoDist = {
|
||||||
(),
|
(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let response1 = DistPlusRenderer.run2(inputs1);
|
let response1 = ProgramEvaluator.evaluateProgram(inputs1);
|
||||||
switch (response1) {
|
switch (response1) {
|
||||||
| Ok(`DistPlus(distPlus1)) =>
|
| Ok(`DistPlus(distPlus1)) =>
|
||||||
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} />
|
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} />
|
||||||
|
@ -161,15 +155,15 @@ module DemoDist = {
|
||||||
<ForetoldComponents.NumberShower number=f precision=3 />
|
<ForetoldComponents.NumberShower number=f precision=3 />
|
||||||
| Ok(`Function((f, a), env)) =>
|
| Ok(`Function((f, a), env)) =>
|
||||||
// Problem: When it gets the function, it doesn't save state about previous commands
|
// Problem: When it gets the function, it doesn't save state about previous commands
|
||||||
let foo: DistPlusRenderer.Inputs.inputs = {
|
let foo: ProgramEvaluator.Inputs.inputs = {
|
||||||
distPlusIngredients: inputs1.distPlusIngredients,
|
squiggleString,
|
||||||
samplingInputs: inputs1.samplingInputs,
|
samplingInputs: inputs1.samplingInputs,
|
||||||
environment: env,
|
environment: env,
|
||||||
};
|
};
|
||||||
let results =
|
let results =
|
||||||
E.A.Floats.range(options.diagramStart, options.diagramStop, options.diagramCount)
|
E.A.Floats.range(options.diagramStart, options.diagramStop, options.diagramCount)
|
||||||
|> E.A.fmap(r =>
|
|> E.A.fmap(r =>
|
||||||
DistPlusRenderer.runFunction(
|
ProgramEvaluator.evaluateFunction(
|
||||||
foo,
|
foo,
|
||||||
(f, a),
|
(f, a),
|
||||||
[|`SymbolicDist(`Float(r))|],
|
[|`SymbolicDist(`Float(r))|],
|
||||||
|
@ -199,18 +193,6 @@ module DemoDist = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// guesstimatorString: "
|
|
||||||
// us_economy_2018 = (10.5 to 10.6)T
|
|
||||||
// growth_rate = 1.08 to 1.2
|
|
||||||
// us_economy(t) = us_economy_2018 * (growth_rate^t)
|
|
||||||
|
|
||||||
// us_population_2019 = 320M to 330M
|
|
||||||
// us_population_growth_rate = 1.01 to 1.02
|
|
||||||
// us_population(t) = us_population_2019 * (us_population_growth_rate^t)
|
|
||||||
|
|
||||||
// gdp_per_person(t) = us_economy(t)/us_population(t)
|
|
||||||
// gdp_per_person
|
|
||||||
// ",
|
|
||||||
[@react.component]
|
[@react.component]
|
||||||
let make = () => {
|
let make = () => {
|
||||||
let (reloader, setReloader) = React.useState(() => 1);
|
let (reloader, setReloader) = React.useState(() => 1);
|
||||||
|
@ -220,8 +202,8 @@ let make = () => {
|
||||||
~schema,
|
~schema,
|
||||||
~onSubmit=({state}) => {None},
|
~onSubmit=({state}) => {None},
|
||||||
~initialState={
|
~initialState={
|
||||||
//guesstimatorString: "mm(normal(-10, 2), uniform(18, 25), lognormal({mean: 10, stdev: 8}), triangular(31,40,50))",
|
//squiggleString: "mm(normal(-10, 2), uniform(18, 25), lognormal({mean: 10, stdev: 8}), triangular(31,40,50))",
|
||||||
guesstimatorString: "mm(normal(5,2), normal(10,2))",
|
squiggleString: "mm(normal(5,2), normal(10,2))",
|
||||||
sampleCount: "1000",
|
sampleCount: "1000",
|
||||||
outputXYPoints: "1000",
|
outputXYPoints: "1000",
|
||||||
downsampleTo: "",
|
downsampleTo: "",
|
||||||
|
@ -238,7 +220,7 @@ let make = () => {
|
||||||
reform.submit();
|
reform.submit();
|
||||||
};
|
};
|
||||||
|
|
||||||
let guesstimatorString = reform.state.values.guesstimatorString;
|
let squiggleString = reform.state.values.squiggleString;
|
||||||
let sampleCount = reform.state.values.sampleCount |> Js.Float.fromString;
|
let sampleCount = reform.state.values.sampleCount |> Js.Float.fromString;
|
||||||
let outputXYPoints =
|
let outputXYPoints =
|
||||||
reform.state.values.outputXYPoints |> Js.Float.fromString;
|
reform.state.values.outputXYPoints |> Js.Float.fromString;
|
||||||
|
@ -273,9 +255,9 @@ let make = () => {
|
||||||
|
|
||||||
let demoDist =
|
let demoDist =
|
||||||
React.useMemo1(
|
React.useMemo1(
|
||||||
() => <DemoDist guesstimatorString options />,
|
() => <DemoDist squiggleString options />,
|
||||||
[|
|
[|
|
||||||
reform.state.values.guesstimatorString,
|
reform.state.values.squiggleString,
|
||||||
reform.state.values.sampleCount,
|
reform.state.values.sampleCount,
|
||||||
reform.state.values.outputXYPoints,
|
reform.state.values.outputXYPoints,
|
||||||
reform.state.values.downsampleTo,
|
reform.state.values.downsampleTo,
|
||||||
|
@ -307,7 +289,7 @@ let make = () => {
|
||||||
<Row _type=`flex className=Styles.rows>
|
<Row _type=`flex className=Styles.rows>
|
||||||
<Col span=24>
|
<Col span=24>
|
||||||
<FieldText
|
<FieldText
|
||||||
field=FormConfig.GuesstimatorString
|
field=FormConfig.SquiggleString
|
||||||
label="Program"
|
label="Program"
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
|
|
|
@ -3,7 +3,7 @@ let plotBlue = `hex("1860ad");
|
||||||
|
|
||||||
let showAsForm = (distPlus: DistTypes.distPlus) => {
|
let showAsForm = (distPlus: DistTypes.distPlus) => {
|
||||||
<div>
|
<div>
|
||||||
<Antd.Input value={distPlus.guesstimatorString |> E.O.default("")} />
|
<Antd.Input value={distPlus.squiggleString |> E.O.default("")} />
|
||||||
</div>;
|
</div>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,17 +11,8 @@ module Inputs = {
|
||||||
let defaultRecommendedLength = 100;
|
let defaultRecommendedLength = 100;
|
||||||
let defaultShouldDownsample = true;
|
let defaultShouldDownsample = true;
|
||||||
|
|
||||||
type ingredients = {guesstimatorString: string};
|
|
||||||
|
|
||||||
module Ingredients = {
|
|
||||||
type t = ingredients;
|
|
||||||
let make = (~guesstimatorString: string, ()): t => {
|
|
||||||
guesstimatorString: guesstimatorString,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
type inputs = {
|
type inputs = {
|
||||||
distPlusIngredients: ingredients,
|
squiggleString: string,
|
||||||
samplingInputs: SamplingInputs.t,
|
samplingInputs: SamplingInputs.t,
|
||||||
environment: ExpressionTypes.ExpressionTree.environment,
|
environment: ExpressionTypes.ExpressionTree.environment,
|
||||||
};
|
};
|
||||||
|
@ -36,50 +27,41 @@ module Inputs = {
|
||||||
let make =
|
let make =
|
||||||
(
|
(
|
||||||
~samplingInputs=empty,
|
~samplingInputs=empty,
|
||||||
~distPlusIngredients,
|
~squiggleString,
|
||||||
~environment=ExpressionTypes.ExpressionTree.Environment.empty,
|
~environment=ExpressionTypes.ExpressionTree.Environment.empty,
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
: inputs => {
|
: inputs => {
|
||||||
distPlusIngredients,
|
|
||||||
samplingInputs,
|
samplingInputs,
|
||||||
|
squiggleString,
|
||||||
environment,
|
environment,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
module Internals = {
|
module Internals = {
|
||||||
type inputs = {
|
|
||||||
samplingInputs: Inputs.SamplingInputs.t,
|
|
||||||
guesstimatorString: string,
|
|
||||||
environment: ExpressionTypes.ExpressionTree.environment,
|
|
||||||
};
|
|
||||||
|
|
||||||
let addVariable =
|
let addVariable =
|
||||||
({samplingInputs, guesstimatorString, environment}: inputs, str, node)
|
(
|
||||||
: inputs => {
|
{samplingInputs, squiggleString, environment}: Inputs.inputs,
|
||||||
|
str,
|
||||||
|
node,
|
||||||
|
)
|
||||||
|
: Inputs.inputs => {
|
||||||
samplingInputs,
|
samplingInputs,
|
||||||
guesstimatorString,
|
squiggleString,
|
||||||
environment:
|
environment:
|
||||||
ExpressionTypes.ExpressionTree.Environment.update(environment, str, _ =>
|
ExpressionTypes.ExpressionTree.Environment.update(environment, str, _ =>
|
||||||
Some(node)
|
Some(node)
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let distPlusRenderInputsToInputs = (inputs: Inputs.inputs): inputs => {
|
|
||||||
{
|
|
||||||
samplingInputs: inputs.samplingInputs,
|
|
||||||
guesstimatorString: inputs.distPlusIngredients.guesstimatorString,
|
|
||||||
environment: inputs.environment,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
type outputs = {
|
type outputs = {
|
||||||
graph: ExpressionTypes.ExpressionTree.node,
|
graph: ExpressionTypes.ExpressionTree.node,
|
||||||
shape: DistTypes.shape,
|
shape: DistTypes.shape,
|
||||||
};
|
};
|
||||||
let makeOutputs = (graph, shape): outputs => {graph, shape};
|
let makeOutputs = (graph, shape): outputs => {graph, shape};
|
||||||
|
|
||||||
let makeInputs = (inputs): ExpressionTypes.ExpressionTree.samplingInputs => {
|
let makeInputs =
|
||||||
|
(inputs: Inputs.inputs): ExpressionTypes.ExpressionTree.samplingInputs => {
|
||||||
sampleCount: inputs.samplingInputs.sampleCount |> E.O.default(10000),
|
sampleCount: inputs.samplingInputs.sampleCount |> E.O.default(10000),
|
||||||
outputXYPoints:
|
outputXYPoints:
|
||||||
inputs.samplingInputs.outputXYPoints |> E.O.default(10000),
|
inputs.samplingInputs.outputXYPoints |> E.O.default(10000),
|
||||||
|
@ -91,7 +73,7 @@ module Internals = {
|
||||||
ExpressionTree.toLeaf(makeInputs(inputs), inputs.environment, node);
|
ExpressionTree.toLeaf(makeInputs(inputs), inputs.environment, node);
|
||||||
};
|
};
|
||||||
|
|
||||||
let runProgram = (inputs: inputs, p: ExpressionTypes.Program.program) => {
|
let runProgram = (inputs: Inputs.inputs, p: ExpressionTypes.Program.program) => {
|
||||||
let ins = ref(inputs);
|
let ins = ref(inputs);
|
||||||
p
|
p
|
||||||
|> E.A.fmap(
|
|> E.A.fmap(
|
||||||
|
@ -109,23 +91,19 @@ module Internals = {
|
||||||
|> E.A.R.firstErrorOrOpen;
|
|> E.A.R.firstErrorOrOpen;
|
||||||
};
|
};
|
||||||
|
|
||||||
let inputsToLeaf = (inputs: inputs) => {
|
let inputsToLeaf = (inputs: Inputs.inputs) => {
|
||||||
MathJsParser.fromString(inputs.guesstimatorString)
|
MathJsParser.fromString(inputs.squiggleString)
|
||||||
|> E.R.bind(_, g => runProgram(inputs, g))
|
|> E.R.bind(_, g => runProgram(inputs, g))
|
||||||
|> E.R.bind(_, r => E.A.last(r) |> E.O.toResult("No rendered lines"));
|
|> E.R.bind(_, r => E.A.last(r) |> E.O.toResult("No rendered lines"));
|
||||||
};
|
};
|
||||||
|
|
||||||
let outputToDistPlus = (inputs: Inputs.inputs, shape: DistTypes.shape) => {
|
let outputToDistPlus = (inputs: Inputs.inputs, shape: DistTypes.shape) => {
|
||||||
DistPlus.make(
|
DistPlus.make(~shape, ~squiggleString=Some(inputs.squiggleString), ());
|
||||||
~shape,
|
|
||||||
~guesstimatorString=Some(inputs.distPlusIngredients.guesstimatorString),
|
|
||||||
(),
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
let renderIfNeeded =
|
let renderIfNeeded =
|
||||||
(inputs, node: ExpressionTypes.ExpressionTree.node)
|
(inputs: Inputs.inputs, node: ExpressionTypes.ExpressionTree.node)
|
||||||
: result(ExpressionTypes.ExpressionTree.node, string) =>
|
: result(ExpressionTypes.ExpressionTree.node, string) =>
|
||||||
node
|
node
|
||||||
|> (
|
|> (
|
||||||
|
@ -133,7 +111,7 @@ let renderIfNeeded =
|
||||||
| `Normalize(_) as n
|
| `Normalize(_) as n
|
||||||
| `SymbolicDist(_) as n => {
|
| `SymbolicDist(_) as n => {
|
||||||
`Render(n)
|
`Render(n)
|
||||||
|> Internals.runNode(Internals.distPlusRenderInputsToInputs(inputs))
|
|> Internals.runNode(inputs)
|
||||||
|> (
|
|> (
|
||||||
fun
|
fun
|
||||||
| Ok(`RenderedDist(_)) as r => r
|
| Ok(`RenderedDist(_)) as r => r
|
||||||
|
@ -144,28 +122,7 @@ let renderIfNeeded =
|
||||||
| n => Ok(n)
|
| n => Ok(n)
|
||||||
);
|
);
|
||||||
|
|
||||||
let run = (inputs: Inputs.inputs) => {
|
let coersionToExportedTypes =
|
||||||
inputs
|
|
||||||
|> Internals.distPlusRenderInputsToInputs
|
|
||||||
|> Internals.inputsToLeaf
|
|
||||||
|> E.R.bind(_, ((lastIns, r)) =>
|
|
||||||
r
|
|
||||||
|> renderIfNeeded(inputs)
|
|
||||||
|> (
|
|
||||||
fun
|
|
||||||
| Ok(`RenderedDist(n)) => Ok(n)
|
|
||||||
| Ok(n) =>
|
|
||||||
Error(
|
|
||||||
"Didn't output a rendered distribution. Format:"
|
|
||||||
++ ExpressionTree.toString(n),
|
|
||||||
)
|
|
||||||
| Error(r) => Error(r)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|> E.R.fmap(Internals.outputToDistPlus(inputs));
|
|
||||||
};
|
|
||||||
|
|
||||||
let exportDistPlus =
|
|
||||||
(
|
(
|
||||||
inputs,
|
inputs,
|
||||||
env: ProbExample.ExpressionTypes.ExpressionTree.environment,
|
env: ProbExample.ExpressionTypes.ExpressionTree.environment,
|
||||||
|
@ -189,42 +146,18 @@ let exportDistPlus =
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// This isn't ok with floats, which can't be done in a function easily
|
let evaluateProgram = (inputs: Inputs.inputs) => {
|
||||||
let exportDistPlus2 =
|
|
||||||
(
|
|
||||||
inputs,
|
|
||||||
env: ProbExample.ExpressionTypes.ExpressionTree.environment,
|
|
||||||
node: ExpressionTypes.ExpressionTree.node,
|
|
||||||
) =>
|
|
||||||
node
|
|
||||||
|> renderIfNeeded(inputs)
|
|
||||||
|> E.R.bind(
|
|
||||||
_,
|
|
||||||
fun
|
|
||||||
| `RenderedDist(n) =>
|
|
||||||
Ok(`DistPlus(Internals.outputToDistPlus(inputs, n)))
|
|
||||||
| `Function(n) => Ok(`Function((n, env)))
|
|
||||||
| n =>
|
|
||||||
Error(
|
|
||||||
"Didn't output a rendered distribution. Format:"
|
|
||||||
++ ExpressionTree.toString(n),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
let run2 = (inputs: Inputs.inputs) => {
|
|
||||||
inputs
|
inputs
|
||||||
|> Internals.distPlusRenderInputsToInputs
|
|
||||||
|> Internals.inputsToLeaf
|
|> Internals.inputsToLeaf
|
||||||
|> E.R.bind(_, ((a, b)) => exportDistPlus(inputs, a, b));
|
|> E.R.bind(_, ((a, b)) => coersionToExportedTypes(inputs, a, b));
|
||||||
};
|
};
|
||||||
|
|
||||||
let runFunction =
|
let evaluateFunction =
|
||||||
(
|
(
|
||||||
ins: Inputs.inputs,
|
inputs: Inputs.inputs,
|
||||||
fn: (array(string), ExpressionTypes.ExpressionTree.node),
|
fn: (array(string), ExpressionTypes.ExpressionTree.node),
|
||||||
fnInputs,
|
fnInputs,
|
||||||
) => {
|
) => {
|
||||||
let inputs = ins |> Internals.distPlusRenderInputsToInputs;
|
|
||||||
let output =
|
let output =
|
||||||
ExpressionTree.runFunction(
|
ExpressionTree.runFunction(
|
||||||
Internals.makeInputs(inputs),
|
Internals.makeInputs(inputs),
|
||||||
|
@ -232,5 +165,5 @@ let runFunction =
|
||||||
fnInputs,
|
fnInputs,
|
||||||
fn,
|
fn,
|
||||||
);
|
);
|
||||||
output |> E.R.bind(_, exportDistPlus2(ins, inputs.environment));
|
output |> E.R.bind(_, coersionToExportedTypes(inputs, inputs.environment));
|
||||||
};
|
};
|
|
@ -6,14 +6,14 @@ let shapeIntegral = shape => Shape.T.Integral.get(shape);
|
||||||
let make =
|
let make =
|
||||||
(
|
(
|
||||||
~shape,
|
~shape,
|
||||||
~guesstimatorString,
|
~squiggleString,
|
||||||
~domain=Complete,
|
~domain=Complete,
|
||||||
~unit=UnspecifiedDistribution,
|
~unit=UnspecifiedDistribution,
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
: t => {
|
: t => {
|
||||||
let integral = shapeIntegral(shape);
|
let integral = shapeIntegral(shape);
|
||||||
{shape, domain, integralCache: integral, unit, guesstimatorString};
|
{shape, domain, integralCache: integral, unit, squiggleString};
|
||||||
};
|
};
|
||||||
|
|
||||||
let update =
|
let update =
|
||||||
|
@ -22,14 +22,14 @@ let update =
|
||||||
~integralCache=?,
|
~integralCache=?,
|
||||||
~domain=?,
|
~domain=?,
|
||||||
~unit=?,
|
~unit=?,
|
||||||
~guesstimatorString=?,
|
~squiggleString=?,
|
||||||
t: t,
|
t: t,
|
||||||
) => {
|
) => {
|
||||||
shape: E.O.default(t.shape, shape),
|
shape: E.O.default(t.shape, shape),
|
||||||
integralCache: E.O.default(t.integralCache, integralCache),
|
integralCache: E.O.default(t.integralCache, integralCache),
|
||||||
domain: E.O.default(t.domain, domain),
|
domain: E.O.default(t.domain, domain),
|
||||||
unit: E.O.default(t.unit, unit),
|
unit: E.O.default(t.unit, unit),
|
||||||
guesstimatorString: E.O.default(t.guesstimatorString, guesstimatorString),
|
squiggleString: E.O.default(t.squiggleString, squiggleString),
|
||||||
};
|
};
|
||||||
|
|
||||||
let updateShape = (shape, t) => {
|
let updateShape = (shape, t) => {
|
||||||
|
|
|
@ -68,7 +68,7 @@ module ShapeMonad = {
|
||||||
};
|
};
|
||||||
|
|
||||||
type generationSource =
|
type generationSource =
|
||||||
| GuesstimatorString(string)
|
| SquiggleString(string)
|
||||||
| Shape(shape);
|
| Shape(shape);
|
||||||
|
|
||||||
type distributionUnit =
|
type distributionUnit =
|
||||||
|
@ -80,7 +80,7 @@ type distPlus = {
|
||||||
domain,
|
domain,
|
||||||
integralCache: continuousShape,
|
integralCache: continuousShape,
|
||||||
unit: distributionUnit,
|
unit: distributionUnit,
|
||||||
guesstimatorString: option(string),
|
squiggleString: option(string),
|
||||||
};
|
};
|
||||||
|
|
||||||
module DistributionUnit = {
|
module DistributionUnit = {
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
// Not yet used
|
|
||||||
type inputs = {
|
|
||||||
samplingInputs: ExpressionTypes.ExpressionTree.SamplingInputs.t,
|
|
||||||
program: string,
|
|
||||||
environment: ExpressionTypes.ExpressionTree.environment,
|
|
||||||
};
|
|
||||||
|
|
||||||
let addVariable =
|
|
||||||
({program, samplingInputs, environment}: inputs, str, node): inputs => {
|
|
||||||
samplingInputs,
|
|
||||||
program,
|
|
||||||
environment:
|
|
||||||
ExpressionTypes.ExpressionTree.Environment.update(environment, str, _ =>
|
|
||||||
Some(node)
|
|
||||||
),
|
|
||||||
};
|
|
||||||
|
|
||||||
let runNode = (inputs: inputs, node) => {
|
|
||||||
ExpressionTree.toLeaf(
|
|
||||||
ExpressionTypes.ExpressionTree.SamplingInputs.withDefaults(
|
|
||||||
inputs.samplingInputs,
|
|
||||||
),
|
|
||||||
inputs.environment,
|
|
||||||
node,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
let runProgram = (inputs: inputs, p: ExpressionTypes.Program.program) => {
|
|
||||||
let ins = ref(inputs);
|
|
||||||
p
|
|
||||||
|> E.A.fmap(
|
|
||||||
fun
|
|
||||||
| `Assignment(name, node) => {
|
|
||||||
ins := addVariable(ins^, name, node);
|
|
||||||
None;
|
|
||||||
}
|
|
||||||
| `Expression(node) =>
|
|
||||||
Some(runNode(ins^, node) |> E.R.fmap(r => (ins, r))),
|
|
||||||
)
|
|
||||||
|> E.A.O.concatSomes
|
|
||||||
|> E.A.R.firstErrorOrOpen;
|
|
||||||
};
|
|
||||||
|
|
||||||
let inputsToLeaf = (inputs: inputs) => {
|
|
||||||
MathJsParser.fromString(inputs.program)
|
|
||||||
|> E.R.bind(_, g => runProgram(inputs, g))
|
|
||||||
|> E.R.bind(_, r => E.A.last(r) |> E.O.toResult("No rendered lines"));
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user