More simple cleanup
This commit is contained in:
parent
b064001a51
commit
e55a981be7
|
@ -164,64 +164,24 @@ module DemoDist = {
|
||||||
| Ok(`DistPlus(distPlus1)) =>
|
| Ok(`DistPlus(distPlus1)) =>
|
||||||
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} />
|
<DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} />
|
||||||
| Ok(`Function(f, a)) =>
|
| Ok(`Function(f, a)) =>
|
||||||
let result1 =
|
let results = E.A.Floats.range(0.0, 10.0, 100)
|
||||||
|
|> E.A.fmap(r =>
|
||||||
DistPlusRenderer.runFunction(
|
DistPlusRenderer.runFunction(
|
||||||
inputs1,
|
inputs1,
|
||||||
(f, a),
|
(f, a),
|
||||||
[|`SymbolicDist(`Float(0.0))|],
|
[|`SymbolicDist(`Float(r))|],
|
||||||
);
|
)
|
||||||
let result2 =
|
|> E.R.bind(_, a =>
|
||||||
DistPlusRenderer.runFunction(
|
switch (a) {
|
||||||
inputs1,
|
| `DistPlus(d) => Ok((r, d))
|
||||||
(f, a),
|
| _ => Error("")
|
||||||
[|`SymbolicDist(`Float(2.0))|],
|
}
|
||||||
);
|
)
|
||||||
let result3 =
|
)
|
||||||
DistPlusRenderer.runFunction(
|
|> E.A.R.firstErrorOrOpen;
|
||||||
inputs1,
|
switch (results) {
|
||||||
(f, a),
|
| Ok(dists) => <> <PercentilesChart dists /> </>
|
||||||
[|`SymbolicDist(`Float(4.0))|],
|
| Error(r) => r |> R.ste
|
||||||
);
|
|
||||||
let result4 =
|
|
||||||
DistPlusRenderer.runFunction(
|
|
||||||
inputs1,
|
|
||||||
(f, a),
|
|
||||||
[|`SymbolicDist(`Float(6.0))|],
|
|
||||||
);
|
|
||||||
let result5 =
|
|
||||||
DistPlusRenderer.runFunction(
|
|
||||||
inputs1,
|
|
||||||
(f, a),
|
|
||||||
[|`SymbolicDist(`Float(8.0))|],
|
|
||||||
);
|
|
||||||
let result6 =
|
|
||||||
DistPlusRenderer.runFunction(
|
|
||||||
inputs1,
|
|
||||||
(f, a),
|
|
||||||
[|`SymbolicDist(`Float(10.0))|],
|
|
||||||
);
|
|
||||||
switch (result1, result2, result3, result4, result5, result6) {
|
|
||||||
| (
|
|
||||||
Ok(`DistPlus(distPlus1)),
|
|
||||||
Ok(`DistPlus(distPlus2)),
|
|
||||||
Ok(`DistPlus(distPlus3)),
|
|
||||||
Ok(`DistPlus(distPlus4)),
|
|
||||||
Ok(`DistPlus(distPlus5)),
|
|
||||||
Ok(`DistPlus(distPlus6)),
|
|
||||||
) =>
|
|
||||||
<>
|
|
||||||
<PercentilesChart
|
|
||||||
dists=[|
|
|
||||||
(0.0, distPlus1),
|
|
||||||
(2.0, distPlus2),
|
|
||||||
(4.0, distPlus3),
|
|
||||||
(6.0, distPlus4),
|
|
||||||
(8.0, distPlus5),
|
|
||||||
(10.0, distPlus6),
|
|
||||||
|]
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
| _ => "Failure " |> R.ste
|
|
||||||
};
|
};
|
||||||
| Error(r) => r |> R.ste
|
| Error(r) => r |> R.ste
|
||||||
};
|
};
|
||||||
|
@ -236,7 +196,7 @@ module DemoDist = {
|
||||||
|
|
||||||
[@react.component]
|
[@react.component]
|
||||||
let make = () => {
|
let make = () => {
|
||||||
let (reloader, setRealoader) = React.useState(() => 1);
|
let (reloader, setReloader) = React.useState(() => 1);
|
||||||
let reform =
|
let reform =
|
||||||
Form.use(
|
Form.use(
|
||||||
~validationStrategy=OnDemand,
|
~validationStrategy=OnDemand,
|
||||||
|
@ -366,8 +326,8 @@ let make = () => {
|
||||||
|],
|
|],
|
||||||
);
|
);
|
||||||
|
|
||||||
let onRealod = _ => {
|
let onReload = _ => {
|
||||||
setRealoader(_ => reloader + 1);
|
setReloader(_ => reloader + 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
<div className=Styles.parent>
|
<div className=Styles.parent>
|
||||||
|
@ -380,7 +340,7 @@ let make = () => {
|
||||||
<Antd.Button
|
<Antd.Button
|
||||||
icon=Antd.IconName.reload
|
icon=Antd.IconName.reload
|
||||||
shape=`circle
|
shape=`circle
|
||||||
onClick=onRealod
|
onClick=onReload
|
||||||
/>
|
/>
|
||||||
}>
|
}>
|
||||||
<Form.Provider value=reform>
|
<Form.Provider value=reform>
|
||||||
|
@ -411,7 +371,7 @@ let make = () => {
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
<Antd.Button
|
<Antd.Button
|
||||||
_type=`primary icon=Antd.IconName.reload onClick=onRealod>
|
_type=`primary icon=Antd.IconName.reload onClick=onReload>
|
||||||
{"Update Distribution" |> R.ste}
|
{"Update Distribution" |> R.ste}
|
||||||
</Antd.Button>
|
</Antd.Button>
|
||||||
</Antd.Form>
|
</Antd.Form>
|
||||||
|
|
|
@ -151,7 +151,8 @@ module PointwiseCombination = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
let pointwiseCombine = (fn, evaluationParams: evaluationParams, t1: t, t2: t) => {
|
let pointwiseCombine =
|
||||||
|
(fn, evaluationParams: evaluationParams, t1: t, t2: t) => {
|
||||||
// TODO: construct a function that we can easily sample from, to construct
|
// TODO: construct a function that we can easily sample from, to construct
|
||||||
// a RenderedDist. Use the xMin and xMax of the rendered shapes to tell the sampling function where to look.
|
// a RenderedDist. Use the xMin and xMax of the rendered shapes to tell the sampling function where to look.
|
||||||
// TODO: This should work for symbolic distributions too!
|
// TODO: This should work for symbolic distributions too!
|
||||||
|
@ -176,8 +177,8 @@ module PointwiseCombination = {
|
||||||
) => {
|
) => {
|
||||||
switch (pointwiseOp) {
|
switch (pointwiseOp) {
|
||||||
| `Add => pointwiseAdd(evaluationParams, t1, t2)
|
| `Add => pointwiseAdd(evaluationParams, t1, t2)
|
||||||
| `Multiply => pointwiseCombine(( *. ),evaluationParams, t1, t2)
|
| `Multiply => pointwiseCombine(( *. ), evaluationParams, t1, t2)
|
||||||
| `Exponentiate => pointwiseCombine(( ** ),evaluationParams, t1, t2)
|
| `Exponentiate => pointwiseCombine(( ** ), evaluationParams, t1, t2)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -262,14 +263,12 @@ module FloatFromDist = {
|
||||||
|
|
||||||
// TODO: This forces things to be floats
|
// TODO: This forces things to be floats
|
||||||
let callableFunction = (evaluationParams, name, args) => {
|
let callableFunction = (evaluationParams, name, args) => {
|
||||||
let b =
|
|
||||||
args
|
args
|
||||||
|> E.A.fmap(a =>
|
|> E.A.fmap(a =>
|
||||||
Render.render(evaluationParams, a)
|
Render.render(evaluationParams, a) |> E.R.bind(_, Render.toFloat)
|
||||||
|> E.R.bind(_, Render.toFloat)
|
|
||||||
)
|
)
|
||||||
|> E.A.R.firstErrorOrOpen;
|
|> E.A.R.firstErrorOrOpen
|
||||||
b |> E.R.bind(_, Functions.fnn(evaluationParams, name));
|
|> E.R.bind(_, Functions.fnn(evaluationParams, name));
|
||||||
};
|
};
|
||||||
|
|
||||||
module Render = {
|
module Render = {
|
||||||
|
@ -280,7 +279,10 @@ module Render = {
|
||||||
| `SymbolicDist(d) =>
|
| `SymbolicDist(d) =>
|
||||||
Ok(
|
Ok(
|
||||||
`RenderedDist(
|
`RenderedDist(
|
||||||
SymbolicDist.T.toShape(evaluationParams.samplingInputs.shapeLength, d),
|
SymbolicDist.T.toShape(
|
||||||
|
evaluationParams.samplingInputs.shapeLength,
|
||||||
|
d,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
| `RenderedDist(_) as t => Ok(t) // already a rendered shape, we're done here
|
| `RenderedDist(_) as t => Ok(t) // already a rendered shape, we're done here
|
||||||
|
@ -329,7 +331,12 @@ let toLeaf =
|
||||||
FloatFromDist.operationToLeaf(evaluationParams, distToFloatOp, t)
|
FloatFromDist.operationToLeaf(evaluationParams, distToFloatOp, t)
|
||||||
| `Normalize(t) => Normalize.operationToLeaf(evaluationParams, t)
|
| `Normalize(t) => Normalize.operationToLeaf(evaluationParams, t)
|
||||||
| `Render(t) => Render.operationToLeaf(evaluationParams, t)
|
| `Render(t) => Render.operationToLeaf(evaluationParams, t)
|
||||||
| `Symbol(r) => ExpressionTypes.ExpressionTree.Environment.get(evaluationParams.environment, r) |> E.O.toResult("Undeclared variable " ++ r)
|
| `Symbol(r) =>
|
||||||
|
ExpressionTypes.ExpressionTree.Environment.get(
|
||||||
|
evaluationParams.environment,
|
||||||
|
r,
|
||||||
|
)
|
||||||
|
|> E.O.toResult("Undeclared variable " ++ r)
|
||||||
| `FunctionCall(name, args) =>
|
| `FunctionCall(name, args) =>
|
||||||
callableFunction(evaluationParams, name, args)
|
callableFunction(evaluationParams, name, args)
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,19 +35,18 @@ let apply3 = (fn, args: array(node)): result(node, string) =>
|
||||||
| _ => Error("Needs 3 args")
|
| _ => Error("Needs 3 args")
|
||||||
};
|
};
|
||||||
|
|
||||||
let to_: array(node) => result(node, string) =
|
let to_: (float, float) => result(node, string) = (low, high) => switch(low,high){
|
||||||
fun
|
| (low,high)
|
||||||
| [|`SymbolicDist(`Float(low)), `SymbolicDist(`Float(high))|]
|
|
||||||
when low <= 0.0 && low < high => {
|
when low <= 0.0 && low < high => {
|
||||||
Ok(`SymbolicDist(SymbolicDist.Normal.from90PercentCI(low, high)));
|
Ok(`SymbolicDist(SymbolicDist.Normal.from90PercentCI(low, high)));
|
||||||
}
|
}
|
||||||
| [|`SymbolicDist(`Float(low)), `SymbolicDist(`Float(high))|]
|
| (low,high)
|
||||||
when low < high => {
|
when low < high => {
|
||||||
Ok(`SymbolicDist(SymbolicDist.Lognormal.from90PercentCI(low, high)));
|
Ok(`SymbolicDist(SymbolicDist.Lognormal.from90PercentCI(low, high)));
|
||||||
}
|
}
|
||||||
| [|`SymbolicDist(`Float(_)), `SymbolicDist(_)|] =>
|
| (low,high) =>
|
||||||
Error("Low value must be less than high value.")
|
Error("Low value must be less than high value.")
|
||||||
| _ => Error("Requires 2 variables");
|
}
|
||||||
|
|
||||||
// Possible setup:
|
// Possible setup:
|
||||||
// let normal = {"inputs": [`float, `float], "outputs": [`float]};
|
// let normal = {"inputs": [`float, `float], "outputs": [`float]};
|
||||||
|
@ -97,6 +96,6 @@ let fnn =
|
||||||
|> E.R.fmap(r => `SymbolicDist(r))
|
|> E.R.fmap(r => `SymbolicDist(r))
|
||||||
| _ => Error("Needs 3 valid arguments")
|
| _ => Error("Needs 3 valid arguments")
|
||||||
}
|
}
|
||||||
| ("to", _) => to_(args)
|
| ("to", _) => apply2(twoFloats(to_), args)
|
||||||
| _ => Error("Function " ++ name ++ " not found")
|
| _ => Error("Function " ++ name ++ " not found")
|
||||||
};
|
};
|
||||||
|
|
|
@ -135,23 +135,6 @@ module Internals = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
let run = (inputs: Inputs.inputs) => {
|
|
||||||
inputs
|
|
||||||
|> Internals.distPlusRenderInputsToInputs
|
|
||||||
|> Internals.inputsToLeaf
|
|
||||||
|> E.R.bind(_, r =>
|
|
||||||
switch (r) {
|
|
||||||
| `RenderedDist(n) => Ok(n)
|
|
||||||
| n =>
|
|
||||||
Error(
|
|
||||||
"Didn't output a rendered distribution. Format:"
|
|
||||||
++ ExpressionTree.toString(n),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|> E.R.fmap(Internals.outputToDistPlus(inputs));
|
|
||||||
};
|
|
||||||
|
|
||||||
let renderIfNeeded =
|
let renderIfNeeded =
|
||||||
(inputs, node: ExpressionTypes.ExpressionTree.node)
|
(inputs, node: ExpressionTypes.ExpressionTree.node)
|
||||||
: result(ExpressionTypes.ExpressionTree.node, string) =>
|
: result(ExpressionTypes.ExpressionTree.node, string) =>
|
||||||
|
@ -171,6 +154,27 @@ let renderIfNeeded =
|
||||||
| n => Ok(n)
|
| n => Ok(n)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let run = (inputs: Inputs.inputs) => {
|
||||||
|
inputs
|
||||||
|
|> Internals.distPlusRenderInputsToInputs
|
||||||
|
|> Internals.inputsToLeaf
|
||||||
|
|> E.R.bind(_, 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, node: ExpressionTypes.ExpressionTree.node) =>
|
let exportDistPlus = (inputs, node: ExpressionTypes.ExpressionTree.node) =>
|
||||||
node
|
node
|
||||||
|> renderIfNeeded(inputs)
|
|> renderIfNeeded(inputs)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user