From 14302695abfe78b1a8c1e31ac65e8d2e6a499453 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Mon, 10 Aug 2020 08:05:03 +0100 Subject: [PATCH] Quick hacks to get function rendering to work for now --- src/components/DistBuilder.re | 21 +++++++++--- src/distPlus/expressionTree/MathJsParser.re | 36 ++++++++++----------- src/distPlus/renderers/DistPlusRenderer.re | 10 +++--- src/distPlus/renderers/ProgramRunner.re | 7 ++-- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/components/DistBuilder.re b/src/components/DistBuilder.re index 855e8918..1ae8a7be 100644 --- a/src/components/DistBuilder.re +++ b/src/components/DistBuilder.re @@ -155,7 +155,12 @@ module DemoDist = { }, ~distPlusIngredients, ~environment= - [||] + [| + ("K", `SymbolicDist(`Float(1000.0))), + ("M", `SymbolicDist(`Float(1000000.0))), + ("B", `SymbolicDist(`Float(1000000000.0))), + ("T", `SymbolicDist(`Float(1000000000000.0))), + |] ->Belt.Map.String.fromArray, (), ); @@ -164,12 +169,18 @@ module DemoDist = { switch (response1) { | Ok(`DistPlus(distPlus1)) => - | Ok(`Function(f, a)) => - // Problem: When it gets the function, it doesn't save state about previous commands - let results = E.A.Floats.range(0.0, 10.0, 2) + | Ok(`Function((f, a), env)) => + // Problem: When it gets the function, it doesn't save state about previous commands + let foo: DistPlusRenderer.Inputs.inputs = { + distPlusIngredients: inputs1.distPlusIngredients, + samplingInputs: inputs1.samplingInputs, + environment: env, + }; + let results = + E.A.Floats.range(0.0, 10.0, 10) |> E.A.fmap(r => DistPlusRenderer.runFunction( - inputs1, + foo, (f, a), [|`SymbolicDist(`Float(r))|], ) diff --git a/src/distPlus/expressionTree/MathJsParser.re b/src/distPlus/expressionTree/MathJsParser.re index 0a99c66d..309de5ec 100644 --- a/src/distPlus/expressionTree/MathJsParser.re +++ b/src/distPlus/expressionTree/MathJsParser.re @@ -84,14 +84,10 @@ module MathAdtToDistDst = { module MathAdtCleaner = { let transformWithSymbol = (f: float, s: string) => switch (s) { - | "K" - | "k" => Some(f *. 1000.) - | "M" - | "m" => Some(f *. 1000000.) - | "B" - | "b" => Some(f *. 1000000000.) - | "T" - | "t" => Some(f *. 1000000000000.) + | "K" => Some(f *. 1000.) + | "M" => Some(f *. 1000000.) + | "B" => Some(f *. 1000000000.) + | "T" => Some(f *. 1000000000000.) | _ => None }; let rec run = @@ -126,9 +122,7 @@ module MathAdtToDistDst = { |> E.R.bind(_, nodeParser); switch (g("mean"), g("stdev"), g("mu"), g("sigma")) { | (Ok(mean), Ok(stdev), _, _) => - Ok( - `FunctionCall(("lognormalFromMeanAndStdDev", [|mean, stdev|])), - ) + Ok(`FunctionCall(("lognormalFromMeanAndStdDev", [|mean, stdev|]))) | (_, _, Ok(mu), Ok(sigma)) => Ok(`FunctionCall(("lognormal", [|mu, sigma|]))) | _ => @@ -177,12 +171,13 @@ module MathAdtToDistDst = { }; }; - // Error("Dotwise exponentiation needs two operands") + // Error("Dotwise exponentiation needs two operands") let operationParser = ( name: string, args: result(array(ExpressionTypes.ExpressionTree.node), string), - ):result(ExpressionTypes.ExpressionTree.node,string) => { + ) + : result(ExpressionTypes.ExpressionTree.node, string) => { let toOkAlgebraic = r => Ok(`AlgebraicCombination(r)); let toOkPointwise = r => Ok(`PointwiseCombination(r)); let toOkTruncate = r => Ok(`Truncate(r)); @@ -192,12 +187,13 @@ module MathAdtToDistDst = { switch (name, args) { | ("add", [|l, r|]) => toOkAlgebraic((`Add, l, r)) | ("add", _) => Error("Addition needs two operands") - | ("unaryMinus", [|l|]) => toOkAlgebraic((`Multiply, `SymbolicDist(`Float(-1.0)), l)) + | ("unaryMinus", [|l|]) => + toOkAlgebraic((`Multiply, `SymbolicDist(`Float(-1.0)), l)) | ("subtract", [|l, r|]) => toOkAlgebraic((`Subtract, l, r)) | ("subtract", _) => Error("Subtraction needs two operands") | ("multiply", [|l, r|]) => toOkAlgebraic((`Multiply, l, r)) | ("multiply", _) => Error("Multiplication needs two operands") - | ("pow", [|l,r|]) => toOkAlgebraic((`Exponentiate, l, r)) + | ("pow", [|l, r|]) => toOkAlgebraic((`Exponentiate, l, r)) | ("pow", _) => Error("Exponentiation needs two operands") | ("dotMultiply", [|l, r|]) => toOkPointwise((`Multiply, l, r)) | ("dotMultiply", _) => @@ -232,11 +228,13 @@ module MathAdtToDistDst = { "truncate needs three arguments: the expression and both cutoffs", ) | ("scaleMultiply", [|d, `SymbolicDist(`Float(v))|]) => - Ok(`VerticalScaling(`Multiply, d, `SymbolicDist(`Float(v)))) + Ok(`VerticalScaling((`Multiply, d, `SymbolicDist(`Float(v))))) | ("scaleExp", [|d, `SymbolicDist(`Float(v))|]) => - Ok(`VerticalScaling(`Exponentiate, d, `SymbolicDist(`Float(v)))) + Ok( + `VerticalScaling((`Exponentiate, d, `SymbolicDist(`Float(v)))), + ) | ("scaleLog", [|d, `SymbolicDist(`Float(v))|]) => - Ok(`VerticalScaling(`Log, d, `SymbolicDist(`Float(v)))) + Ok(`VerticalScaling((`Log, d, `SymbolicDist(`Float(v))))) | ("pdf", [|d, `SymbolicDist(`Float(v))|]) => toOkFloatFromDist((`Pdf(v), d)) | ("cdf", [|d, `SymbolicDist(`Float(v))|]) => @@ -317,7 +315,7 @@ module MathAdtToDistDst = { | Symbol(sym) => Ok(`Symbol(sym)) | Fn({name, args}) => functionParser(nodeParser, name, args) | _ => { - Error("This type not currently supported") + Error("This type not currently supported"); }; // | FunctionAssignment({name, args, expression}) => { diff --git a/src/distPlus/renderers/DistPlusRenderer.re b/src/distPlus/renderers/DistPlusRenderer.re index bc9b6b0e..4218dc43 100644 --- a/src/distPlus/renderers/DistPlusRenderer.re +++ b/src/distPlus/renderers/DistPlusRenderer.re @@ -112,7 +112,7 @@ module Internals = { ins := addVariable(ins^, name, node); None; } - | `Expression(node) => Some(runNode(ins^, node) |> E.R.fmap(r => (ins, r))), + | `Expression(node) => Some(runNode(ins^, node) |> E.R.fmap(r => (ins^.environment, r))), ) |> E.A.O.concatSomes |> E.A.R.firstErrorOrOpen; @@ -175,7 +175,7 @@ let run = (inputs: Inputs.inputs) => { |> E.R.fmap(Internals.outputToDistPlus(inputs)); }; -let exportDistPlus = (inputs, node: ExpressionTypes.ExpressionTree.node) => +let exportDistPlus = (inputs, env:ProbExample.ExpressionTypes.ExpressionTree.environment, node: ExpressionTypes.ExpressionTree.node) => node |> renderIfNeeded(inputs) |> E.R.bind( @@ -183,7 +183,7 @@ let exportDistPlus = (inputs, node: ExpressionTypes.ExpressionTree.node) => fun | `RenderedDist(n) => Ok(`DistPlus(Internals.outputToDistPlus(inputs, n))) - | `Function(n) => Ok(`Function(n)) + | `Function(n) => Ok(`Function(n, env)) | n => Error( "Didn't output a rendered distribution. Format:" @@ -195,7 +195,7 @@ let run2 = (inputs: Inputs.inputs) => { inputs |> Internals.distPlusRenderInputsToInputs |> Internals.inputsToLeaf - |> E.R.bind(_,((a,b)) => exportDistPlus(inputs,b)) + |> E.R.bind(_,((a,b)) => exportDistPlus(inputs,a,b)) }; let runFunction = @@ -212,5 +212,5 @@ let runFunction = fnInputs, fn, ); - output |> E.R.bind(_, exportDistPlus(ins)); + output |> E.R.bind(_, exportDistPlus(ins, inputs.environment)); }; diff --git a/src/distPlus/renderers/ProgramRunner.re b/src/distPlus/renderers/ProgramRunner.re index b6e0735f..81c08ff0 100644 --- a/src/distPlus/renderers/ProgramRunner.re +++ b/src/distPlus/renderers/ProgramRunner.re @@ -1,5 +1,4 @@ // Not yet used - type inputs = { samplingInputs: ExpressionTypes.ExpressionTree.SamplingInputs.t, program: string, @@ -16,9 +15,11 @@ let addVariable = ), }; -let runNode = (inputs, node) => { +let runNode = (inputs: inputs, node) => { ExpressionTree.toLeaf( - ExpressionTypes.ExpressionTree.SamplingInputs.withDefaults(inputs.samplingInputs), + ExpressionTypes.ExpressionTree.SamplingInputs.withDefaults( + inputs.samplingInputs, + ), inputs.environment, node, );