Starting to add Program file

This commit is contained in:
Ozzie Gooen 2020-07-30 16:59:12 +01:00
parent 0d5de854e3
commit d17299a5b1
5 changed files with 49 additions and 48 deletions

View File

@ -1,13 +1,18 @@
open ExpressionTypes.ExpressionTree; open ExpressionTypes.ExpressionTree;
let toLeaf = (intendedShapeLength: int, samplingInputs, node: node) => {
node
|> ExpressionTreeEvaluator.toLeaf({
samplingInputs,
intendedShapeLength,
evaluateNode: ExpressionTreeEvaluator.toLeaf,
});
};
let toShape = (intendedShapeLength: int, samplingInputs, node: node) => { let toShape = (intendedShapeLength: int, samplingInputs, node: node) => {
let renderResult = let renderResult =
`Render(`Normalize(node)) `Render(`Normalize(node))
|> ExpressionTreeEvaluator.toLeaf({ |> toLeaf(intendedShapeLength, samplingInputs);
samplingInputs,
intendedShapeLength,
evaluateNode: ExpressionTreeEvaluator.toLeaf,
});
switch (renderResult) { switch (renderResult) {
| Ok(`RenderedDist(shape)) => Ok(shape) | Ok(`RenderedDist(shape)) => Ok(shape)

View File

@ -74,12 +74,18 @@ module ExpressionTree = {
| _ => None | _ => None
}; };
let _toFloat = (t:DistTypes.shape) => switch(t){ let _toFloat = (t: DistTypes.shape) =>
| Discrete({xyShape: {xs: [|x|], ys: [|1.0|]}}) => Some(`SymbolicDist(`Float(x))) switch (t) {
| _ => None | Discrete({xyShape: {xs: [|x|], ys: [|1.0|]}}) =>
} Some(`SymbolicDist(`Float(x)))
| _ => None
};
let toFloat = (item:node):result(node, string) => item |> getShape |> E.O.bind(_,_toFloat) |> E.O.toResult("Not valid shape") let toFloat = (item: node): result(node, string) =>
item
|> getShape
|> E.O.bind(_, _toFloat)
|> E.O.toResult("Not valid shape");
}; };
}; };
@ -88,3 +94,8 @@ type simplificationResult = [
| `Error(string) | `Error(string)
| `NoSolution | `NoSolution
]; ];
module Program = {
type statement = [ | `Assignment(string, ExpressionTree.node) | `Expression(ExpressionTree.node)];
type program = array(statement);
}

View File

@ -0,0 +1,4 @@
type t = ExpressionTypes.Program.program;
// let run = (p:program) => p |> E.A.last |> E.O.fmap(r =>
// )

View File

@ -1,3 +1,21 @@
let inputsToShape = (inputs: RenderTypes.ShapeRenderer.Combined.inputs) => {
MathJsParser.fromString(inputs.guesstimatorString, inputs.inputVariables)
|> E.R.bind(_, g =>
ExpressionTree.toShape(
inputs.symbolicInputs.length,
{
sampleCount:
inputs.samplingInputs.sampleCount |> E.O.default(10000),
outputXYPoints:
inputs.samplingInputs.outputXYPoints |> E.O.default(10000),
kernelWidth: inputs.samplingInputs.kernelWidth,
},
g,
)
|> E.R.fmap(RenderTypes.ShapeRenderer.Symbolic.make(g))
);
};
let run = (inputs: RenderTypes.DistPlusRenderer.inputs) => { let run = (inputs: RenderTypes.DistPlusRenderer.inputs) => {
let toDist = shape => let toDist = shape =>
DistPlus.make( DistPlus.make(
@ -8,10 +26,8 @@ let run = (inputs: RenderTypes.DistPlusRenderer.inputs) => {
(), (),
) )
|> DistPlus.T.normalize; |> DistPlus.T.normalize;
// let symbolicDist: ExpressionTypes.ExpressionTree.node = `SymbolicDist(`Float(30.0));
// inputVariables: [|("p", symbolicDist)|] -> Belt.Map.String.fromArray,
let output = let output =
ShapeRenderer.run({ inputsToShape({
samplingInputs: inputs.samplingInputs, samplingInputs: inputs.samplingInputs,
guesstimatorString: inputs.distPlusIngredients.guesstimatorString, guesstimatorString: inputs.distPlusIngredients.guesstimatorString,
inputVariables: inputs.inputVariables, inputVariables: inputs.inputVariables,

View File

@ -1,35 +0,0 @@
// This transforms an array intersperced with spaces or newlines with a normally formatted one.
// "3 4 5 3 2 1 " -> "[3,4,5,3,2,1]""
let formatMessyArray = str => {
let split = Js.String.splitByRe([%re "/\\n|\\r|\\s/"], str);
if (E.A.length(split) > 20) {
let inner = split |> Js.Array.joinWith(",");
{j|[$inner]|j};
} else {
str;
};
};
let formatString = str => {
str |> formatMessyArray;
};
let run = (inputs: RenderTypes.ShapeRenderer.Combined.inputs) => {
let str = formatString(inputs.guesstimatorString);
let graph = MathJsParser.fromString(str, inputs.inputVariables);
graph
|> E.R.bind(_, g =>
ExpressionTree.toShape(
inputs.symbolicInputs.length,
{
sampleCount:
inputs.samplingInputs.sampleCount |> E.O.default(10000),
outputXYPoints:
inputs.samplingInputs.outputXYPoints |> E.O.default(10000),
kernelWidth: inputs.samplingInputs.kernelWidth,
},
g,
)
|> E.R.fmap(RenderTypes.ShapeRenderer.Symbolic.make(g))
);
};