Allow function to reach editor
This commit is contained in:
		
							parent
							
								
									3147e6d9c3
								
							
						
					
					
						commit
						04d606d9c6
					
				|  | @ -1 +1 @@ | |||
| let entries = EntryTypes.[Continuous2.entry,ExpressionTreeExamples.entry]; | ||||
| let entries = EntryTypes.[ExpressionTreeExamples.entry]; | ||||
|  | @ -5,84 +5,84 @@ | |||
| // floor(3 to 4) | ||||
| // uniform(0,1) > 0.3 ? lognormal(6.652, -0.41): 0 | ||||
| 
 | ||||
| let timeDist ={ | ||||
|   let ingredients = DistPlusRenderer.Inputs.Ingredients.make( | ||||
|     ~guesstimatorString="(floor(10 to 15))", | ||||
|     ~domain=RightLimited({xPoint: 50.0, excludingProbabilityMass: 0.3}), | ||||
|     ~unit= | ||||
|       DistTypes.TimeDistribution({zero: MomentRe.momentNow(), unit: `years}), | ||||
|     ()); | ||||
|   let inputs = DistPlusRenderer.Inputs.make(~distPlusIngredients=ingredients,()) | ||||
|   inputs |> DistPlusRenderer.run | ||||
| } | ||||
| // let timeDist ={ | ||||
| //   let ingredients = DistPlusRenderer.Inputs.Ingredients.make( | ||||
| //     ~guesstimatorString="(floor(10 to 15))", | ||||
| //     ~domain=RightLimited({xPoint: 50.0, excludingProbabilityMass: 0.3}), | ||||
| //     ~unit= | ||||
| //       DistTypes.TimeDistribution({zero: MomentRe.momentNow(), unit: `years}), | ||||
| //     ()); | ||||
| //   let inputs = DistPlusRenderer.Inputs.make(~distPlusIngredients=ingredients,()) | ||||
| //   inputs |> DistPlusRenderer.run | ||||
| // } | ||||
| 
 | ||||
| let setup = dist => | ||||
|   DistPlusRenderer.Inputs.make(~distPlusIngredients=dist,()) | ||||
|   |> DistPlusRenderer.run | ||||
|   |> E.R.fmap(distPlus => <DistPlusPlot distPlus />) | ||||
|   |> E.R.toOption | ||||
|   |> E.O.toExn("") | ||||
| // let setup = dist => | ||||
| //   DistPlusRenderer.Inputs.make(~distPlusIngredients=dist,()) | ||||
| //   |> DistPlusRenderer.run | ||||
| //   |> E.R.fmap(distPlus => <DistPlusPlot distPlus />) | ||||
| //   |> E.R.toOption | ||||
| //   |> E.O.toExn("") | ||||
| 
 | ||||
| let simpleExample = (name, guesstimatorString) => | ||||
|   <> | ||||
|     <h3 className="text-gray-600 text-lg font-bold"> | ||||
|       {name |> ReasonReact.string} | ||||
|     </h3> | ||||
|     {setup(DistPlusRenderer.Inputs.Ingredients.make(~guesstimatorString, ()))} | ||||
|   </>; | ||||
| // let simpleExample = (name, guesstimatorString) => | ||||
| //   <> | ||||
| //     <h3 className="text-gray-600 text-lg font-bold"> | ||||
| //       {name |> ReasonReact.string} | ||||
| //     </h3> | ||||
| //     {setup(DistPlusRenderer.Inputs.Ingredients.make(~guesstimatorString, ()))} | ||||
| //   </>; | ||||
| 
 | ||||
| let timeExample = (name, guesstimatorString) => | ||||
|   <> | ||||
|     <h3 className="text-gray-600 text-lg font-bold"> | ||||
|       {name |> ReasonReact.string} | ||||
|     </h3> | ||||
|     {setup( | ||||
|        DistPlusRenderer.Inputs.Ingredients.make( | ||||
|          ~guesstimatorString, | ||||
|          ~unit=TimeDistribution({zero: MomentRe.momentNow(), unit: `years}), | ||||
|          (), | ||||
|        ), | ||||
|      )} | ||||
|   </>; | ||||
| // let timeExample = (name, guesstimatorString) => | ||||
| //   <> | ||||
| //     <h3 className="text-gray-600 text-lg font-bold"> | ||||
| //       {name |> ReasonReact.string} | ||||
| //     </h3> | ||||
| //     {setup( | ||||
| //        DistPlusRenderer.Inputs.Ingredients.make( | ||||
| //          ~guesstimatorString, | ||||
| //          ~unit=TimeDistribution({zero: MomentRe.momentNow(), unit: `years}), | ||||
| //          (), | ||||
| //        ), | ||||
| //      )} | ||||
| //   </>; | ||||
| 
 | ||||
| let distributions = () => | ||||
|   <div> | ||||
|     <div> | ||||
|       <h2 className="text-gray-800 text-xl font-bold"> | ||||
|         {"Initial Section" |> ReasonReact.string} | ||||
|       </h2> | ||||
|         {simpleExample("Continuous", "5 to 20")} | ||||
|         {simpleExample("Continuous, wide range", "1 to 1000000")} | ||||
|         {simpleExample("Continuous, tiny values", "0.000000001 to 0.00000001")} | ||||
|         {simpleExample( | ||||
|            "Continuous large values", | ||||
|            "50000000000000 to 200000000000000000", | ||||
|          )} | ||||
|         {simpleExample("Discrete", "floor(10 to 20)")} | ||||
|         {simpleExample( | ||||
|            "Discrete and below 0, normal(10,30)", | ||||
|            "floor(normal(10,30))", | ||||
|          )} | ||||
|         {simpleExample("Discrete, wide range", "floor(10 to 200000)")} | ||||
|         {simpleExample("Mixed", "mm(5 to 20, floor(20 to 30), [.5,.5])")} | ||||
|         {simpleExample("Mixed, Early-Discrete Point", "mm(1, 5 to 20, [.5,.5])")} | ||||
|         {simpleExample( | ||||
|            "Mixed, Two-Discrete Points", | ||||
|            "mm(0,10, 5 to 20, [.5,.5,.5])", | ||||
|          )} | ||||
|         <h2 className="text-gray-800 text-xl font-bold"> | ||||
|           {"Over Time" |> ReasonReact.string} | ||||
|         </h2> | ||||
|         {timeExample("Continuous", "5 to 20")} | ||||
|         {timeExample("Continuous Over Long Period", "500 to 200000")} | ||||
|         {timeExample("Continuous Over Short Period", "0.0001 to 0.001")} | ||||
|         {timeExample( | ||||
|            "Continuous Over Very Long Period", | ||||
|            "500 to 20000000000000", | ||||
|          )} | ||||
|         {timeExample("Discrete", "floor(5 to 20)")} | ||||
|         {timeExample("Mixed", "mm(5 to 20, floor(5 to 20), [.5,.5])")} | ||||
|     </div> | ||||
|   </div>; | ||||
| // let distributions = () => | ||||
| //   <div> | ||||
| //     <div> | ||||
| //       <h2 className="text-gray-800 text-xl font-bold"> | ||||
| //         {"Initial Section" |> ReasonReact.string} | ||||
| //       </h2> | ||||
| //         {simpleExample("Continuous", "5 to 20")} | ||||
| //         {simpleExample("Continuous, wide range", "1 to 1000000")} | ||||
| //         {simpleExample("Continuous, tiny values", "0.000000001 to 0.00000001")} | ||||
| //         {simpleExample( | ||||
| //            "Continuous large values", | ||||
| //            "50000000000000 to 200000000000000000", | ||||
| //          )} | ||||
| //         {simpleExample("Discrete", "floor(10 to 20)")} | ||||
| //         {simpleExample( | ||||
| //            "Discrete and below 0, normal(10,30)", | ||||
| //            "floor(normal(10,30))", | ||||
| //          )} | ||||
| //         {simpleExample("Discrete, wide range", "floor(10 to 200000)")} | ||||
| //         {simpleExample("Mixed", "mm(5 to 20, floor(20 to 30), [.5,.5])")} | ||||
| //         {simpleExample("Mixed, Early-Discrete Point", "mm(1, 5 to 20, [.5,.5])")} | ||||
| //         {simpleExample( | ||||
| //            "Mixed, Two-Discrete Points", | ||||
| //            "mm(0,10, 5 to 20, [.5,.5,.5])", | ||||
| //          )} | ||||
| //         <h2 className="text-gray-800 text-xl font-bold"> | ||||
| //           {"Over Time" |> ReasonReact.string} | ||||
| //         </h2> | ||||
| //         {timeExample("Continuous", "5 to 20")} | ||||
| //         {timeExample("Continuous Over Long Period", "500 to 200000")} | ||||
| //         {timeExample("Continuous Over Short Period", "0.0001 to 0.001")} | ||||
| //         {timeExample( | ||||
| //            "Continuous Over Very Long Period", | ||||
| //            "500 to 20000000000000", | ||||
| //          )} | ||||
| //         {timeExample("Discrete", "floor(5 to 20)")} | ||||
| //         {timeExample("Mixed", "mm(5 to 20, floor(5 to 20), [.5,.5])")} | ||||
| //     </div> | ||||
| //   </div>; | ||||
| 
 | ||||
| let entry = EntryTypes.(entry(~title="Mixed Distributions", ~render=distributions)); | ||||
| // let entry = EntryTypes.(entry(~title="Mixed Distributions", ~render=distributions)); | ||||
|  | @ -1,18 +1,18 @@ | |||
| let setup = dist => | ||||
|   DistPlusRenderer.Inputs.make(~distPlusIngredients=dist, ()) | ||||
|   |> DistPlusRenderer.run | ||||
|   |> E.R.fmap(distPlus => <DistPlusPlot distPlus />) | ||||
|   |> E.R.toOption | ||||
|   |> E.O.toExn("") | ||||
| // let setup = dist => | ||||
| //   DistPlusRenderer.Inputs.make(~distPlusIngredients=dist, ()) | ||||
| //   |> DistPlusRenderer.run | ||||
| //   |> E.R.fmap(distPlus => <DistPlusPlot distPlus />) | ||||
| //   |> E.R.toOption | ||||
| //   |> E.O.toExn("") | ||||
| 
 | ||||
| let simpleExample = (guesstimatorString, ~problem="", ()) => | ||||
|   <> | ||||
|     <p> {guesstimatorString |> ReasonReact.string} </p> | ||||
|     <p> {problem |> (e => "problem: " ++ e) |> ReasonReact.string} </p> | ||||
|     {setup( | ||||
|        DistPlusRenderer.Inputs.Ingredients.make(~guesstimatorString, ()), | ||||
|      )} | ||||
|   </>; | ||||
| // let simpleExample = (guesstimatorString, ~problem="", ()) => | ||||
| //   <> | ||||
| //     <p> {guesstimatorString |> ReasonReact.string} </p> | ||||
| //     <p> {problem |> (e => "problem: " ++ e) |> ReasonReact.string} </p> | ||||
| //     {setup( | ||||
| //        DistPlusRenderer.Inputs.Ingredients.make(~guesstimatorString, ()), | ||||
| //      )} | ||||
| //   </>; | ||||
| 
 | ||||
| let distributions = () => | ||||
|   <div> | ||||
|  | @ -20,51 +20,51 @@ let distributions = () => | |||
|       <h2 className="text-gray-800 text-xl font-bold"> | ||||
|         {"Initial Section" |> ReasonReact.string} | ||||
|       </h2> | ||||
|       {simpleExample( | ||||
|          "normal(-1, 1) + normal(5, 2)", | ||||
|          ~problem="Tails look too flat", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|          "mm(normal(4,2), normal(10,1))", | ||||
|          ~problem="Tails look too flat", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|          "normal(-1, 1) * normal(5, 2)", | ||||
|          ~problem="This looks really weird", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|          "normal(1,2) * normal(2,2) * normal(3,1)", | ||||
|          ~problem="Seems like important parts are cut off", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|          "mm(uniform(0, 1) , normal(3,2))", | ||||
|          ~problem="Uniform distribution seems to break multimodal", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|         "truncate(mm(1 to 10, 10 to 30), 10, 20)", | ||||
|          ~problem="Truncate seems to have no effect", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|         "normal(5,2)*(10^3)", | ||||
|          ~problem="Multiplied items should be evaluated.", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|         "normal(5,10*3)", | ||||
|          ~problem="At least simple operations in the distributions should be evaluated.", | ||||
|          (), | ||||
|        )} | ||||
|       {simpleExample( | ||||
|         "normal(5,10)^3", | ||||
|          ~problem="Exponentiation not yet supported", | ||||
|          (), | ||||
|        )} | ||||
|       // {simpleExample( | ||||
|       //    "normal(-1, 1) + normal(5, 2)", | ||||
|       //    ~problem="Tails look too flat", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //    "mm(normal(4,2), normal(10,1))", | ||||
|       //    ~problem="Tails look too flat", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //    "normal(-1, 1) * normal(5, 2)", | ||||
|       //    ~problem="This looks really weird", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //    "normal(1,2) * normal(2,2) * normal(3,1)", | ||||
|       //    ~problem="Seems like important parts are cut off", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //    "mm(uniform(0, 1) , normal(3,2))", | ||||
|       //    ~problem="Uniform distribution seems to break multimodal", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //   "truncate(mm(1 to 10, 10 to 30), 10, 20)", | ||||
|       //    ~problem="Truncate seems to have no effect", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //   "normal(5,2)*(10^3)", | ||||
|       //    ~problem="Multiplied items should be evaluated.", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //   "normal(5,10*3)", | ||||
|       //    ~problem="At least simple operations in the distributions should be evaluated.", | ||||
|       //    (), | ||||
|       //  )} | ||||
|       // {simpleExample( | ||||
|       //   "normal(5,10)^3", | ||||
|       //    ~problem="Exponentiation not yet supported", | ||||
|       //    (), | ||||
|       //  )} | ||||
|     </div> | ||||
|   </div>; | ||||
| 
 | ||||
|  |  | |||
|  | @ -158,12 +158,13 @@ module DemoDist = { | |||
|                (), | ||||
|              ); | ||||
| 
 | ||||
|            let response1 = DistPlusRenderer.run(inputs1); | ||||
|            let response1 = DistPlusRenderer.run2(inputs1); | ||||
|            switch (response1) { | ||||
|            | (Ok(distPlus1)) => | ||||
|            | (Ok(`DistPlus(distPlus1))) => | ||||
|              <> | ||||
|                <DistPlusPlot distPlus={DistPlus.T.normalize(distPlus1)} /> | ||||
|              </> | ||||
|            | (Ok(`Function(f,a))) => "Function!!!" |> R.ste | ||||
|            | (Error(r)) => r |> R.ste | ||||
|            }; | ||||
|          | _ => | ||||
|  | @ -330,160 +331,10 @@ let make = () => { | |||
|             <Col span=24> | ||||
|               <FieldText | ||||
|                 field=FormConfig.GuesstimatorString | ||||
|                 label="Guesstimator String" | ||||
|                 label="Program" | ||||
|               /> | ||||
|             </Col> | ||||
|           </Row> | ||||
|           <Row _type=`flex className=Styles.rows> | ||||
|             <Col span=4> | ||||
|               <Form.Field | ||||
|                 field=FormConfig.DomainType | ||||
|                 render={({handleChange, value}) => | ||||
|                   <Antd.Form.Item label={"Domain Type" |> R.ste}> | ||||
|                     <Antd.Select value onChange={e => e |> handleChange}> | ||||
|                       <Antd.Select.Option value="Complete"> | ||||
|                         {"Complete" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                       <Antd.Select.Option value="LeftLimited"> | ||||
|                         {"Left Limited" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                       <Antd.Select.Option value="RightLimited"> | ||||
|                         {"Right Limited" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                       <Antd.Select.Option value="LeftAndRightLimited"> | ||||
|                         {"Left And Right Limited" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                     </Antd.Select> | ||||
|                   </Antd.Form.Item> | ||||
|                 } | ||||
|               /> | ||||
|             </Col> | ||||
|             {<> | ||||
|                <Col span=4> | ||||
|                  <FieldFloat | ||||
|                    field=FormConfig.XPoint | ||||
|                    label="Left X-point" | ||||
|                    className=Styles.groupA | ||||
|                  /> | ||||
|                </Col> | ||||
|                <Col span=4> | ||||
|                  <FieldFloat | ||||
|                    field=FormConfig.ExcludingProbabilityMass | ||||
|                    label="Left Excluding Probability Mass" | ||||
|                    className=Styles.groupA | ||||
|                  /> | ||||
|                </Col> | ||||
|              </> | ||||
|              |> R.showIf( | ||||
|                   E.L.contains( | ||||
|                     reform.state.values.domainType, | ||||
|                     ["LeftLimited", "LeftAndRightLimited"], | ||||
|                   ), | ||||
|                 )} | ||||
|             {<> | ||||
|                <Col span=4> | ||||
|                  <FieldFloat | ||||
|                    field=FormConfig.XPoint2 | ||||
|                    label="Right X-point" | ||||
|                    className=Styles.groupB | ||||
|                  /> | ||||
|                </Col> | ||||
|                <Col span=4> | ||||
|                  <FieldFloat | ||||
|                    field=FormConfig.ExcludingProbabilityMass2 | ||||
|                    label="Right Excluding Probability Mass" | ||||
|                    className=Styles.groupB | ||||
|                  /> | ||||
|                </Col> | ||||
|              </> | ||||
|              |> R.showIf( | ||||
|                   E.L.contains( | ||||
|                     reform.state.values.domainType, | ||||
|                     ["RightLimited", "LeftAndRightLimited"], | ||||
|                   ), | ||||
|                 )} | ||||
|           </Row> | ||||
|           <Row _type=`flex className=Styles.rows> | ||||
|             <Col span=4> | ||||
|               <Form.Field | ||||
|                 field=FormConfig.UnitType | ||||
|                 render={({handleChange, value}) => | ||||
|                   <Antd.Form.Item label={"Unit Type" |> R.ste}> | ||||
|                     <Antd.Select value onChange={e => e |> handleChange}> | ||||
|                       <Antd.Select.Option value="UnspecifiedDistribution"> | ||||
|                         {"Unspecified Distribution" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                       <Antd.Select.Option value="TimeDistribution"> | ||||
|                         {"Time Distribution" |> R.ste} | ||||
|                       </Antd.Select.Option> | ||||
|                     </Antd.Select> | ||||
|                   </Antd.Form.Item> | ||||
|                 } | ||||
|               /> | ||||
|             </Col> | ||||
|             {<> | ||||
|                <Col span=4> | ||||
|                  <Form.Field | ||||
|                    field=FormConfig.Zero | ||||
|                    render={({handleChange, value}) => | ||||
|                      <Antd.Form.Item label={"Zero Point" |> R.ste}> | ||||
|                        <Antd_DatePicker | ||||
|                          value | ||||
|                          onChange={e => { | ||||
|                            e |> handleChange; | ||||
|                            _ => (); | ||||
|                          }} | ||||
|                        /> | ||||
|                      </Antd.Form.Item> | ||||
|                    } | ||||
|                  /> | ||||
|                </Col> | ||||
|                <Col span=4> | ||||
|                  <Form.Field | ||||
|                    field=FormConfig.Unit | ||||
|                    render={({handleChange, value}) => | ||||
|                      <Antd.Form.Item label={"Unit" |> R.ste}> | ||||
|                        <Antd.Select value onChange={e => e |> handleChange}> | ||||
|                          <Antd.Select.Option value="days"> | ||||
|                            {"Days" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="hours"> | ||||
|                            {"Hours" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="milliseconds"> | ||||
|                            {"Milliseconds" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="minutes"> | ||||
|                            {"Minutes" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="months"> | ||||
|                            {"Months" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="quarters"> | ||||
|                            {"Quarters" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="seconds"> | ||||
|                            {"Seconds" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="weeks"> | ||||
|                            {"Weeks" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                          <Antd.Select.Option value="years"> | ||||
|                            {"Years" |> R.ste} | ||||
|                          </Antd.Select.Option> | ||||
|                        </Antd.Select> | ||||
|                      </Antd.Form.Item> | ||||
|                    } | ||||
|                  /> | ||||
|                </Col> | ||||
|              </> | ||||
|              |> R.showIf( | ||||
|                   E.L.contains( | ||||
|                     reform.state.values.unitType, | ||||
|                     ["TimeDistribution"], | ||||
|                   ), | ||||
|                 )} | ||||
|           </Row> | ||||
|           <Row _type=`flex className=Styles.rows> | ||||
|             <Col span=4> | ||||
|               <FieldFloat field=FormConfig.SampleCount label="Sample Count" /> | ||||
|  |  | |||
|  | @ -9,19 +9,48 @@ let toLeaf = (samplingInputs, environment, node: node) => { | |||
|      }); | ||||
| }; | ||||
| 
 | ||||
| let toShape = (samplingInputs, environment, node: node) => { | ||||
|   let renderResult = | ||||
|     `Render(`Normalize(node)) |> toLeaf(samplingInputs, environment); | ||||
| let rec toString: node => string = | ||||
|   fun | ||||
|   | `SymbolicDist(d) => SymbolicDist.T.toString(d) | ||||
|   | `RenderedDist(_) => "[shape]" | ||||
|   | `AlgebraicCombination(op, t1, t2) => | ||||
|     Operation.Algebraic.format(op, toString(t1), toString(t2)) | ||||
|   | `PointwiseCombination(op, t1, t2) => | ||||
|     Operation.Pointwise.format(op, toString(t1), toString(t2)) | ||||
|   | `VerticalScaling(scaleOp, t, scaleBy) => | ||||
|     Operation.Scale.format(scaleOp, toString(t), toString(scaleBy)) | ||||
|   | `Normalize(t) => "normalize(k" ++ toString(t) ++ ")" | ||||
|   | `FloatFromDist(floatFromDistOp, t) => | ||||
|     Operation.DistToFloat.format(floatFromDistOp, toString(t)) | ||||
|   | `Truncate(lc, rc, t) => | ||||
|     Operation.T.truncateToString(lc, rc, toString(t)) | ||||
|   | `Render(t) => toString(t) | ||||
|   | `Symbol(t) => "Symbol: " ++ t | ||||
|   | `FunctionCall(name, args) => | ||||
|     "[Fuction call: (" | ||||
|     ++ name | ||||
|     ++ (args |> E.A.fmap(toString) |> Js.String.concatMany(_, ",")) | ||||
|     ++ ")]" | ||||
|   | `Function(args, internal) => | ||||
|     "[Function: (" | ||||
|     ++ (args |> Js.String.concatMany(_, ",")) | ||||
|     ++ toString(internal) | ||||
|     ++ ")]"; | ||||
| 
 | ||||
|   switch (renderResult) { | ||||
| let toLeaf = (samplingInputs, environment, node: node) => { | ||||
|   switch(toLeaf(samplingInputs, environment, node)){ | ||||
|   | Ok(`SymbolicDist(n)) => `Render(`SymbolicDist(n)) |> toLeaf(samplingInputs, environment); | ||||
|   | Ok(`Function(n)) => Ok(`Function(n)) | ||||
|   | Ok(`RenderedDist(n)) => `Normalize(`RenderedDist(n))|> toLeaf(samplingInputs, environment) | ||||
|   | Error(e) => Error(e) | ||||
|   | _ => Error("Wrong type returned") | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| let toShape = (samplingInputs, environment, node: node) => { | ||||
|   switch (toLeaf(samplingInputs, environment, node)) { | ||||
|   | Ok(`RenderedDist(shape)) => Ok(shape) | ||||
|   | Ok(_) => Error("Rendering failed.") | ||||
|   | Error(e) => Error(e) | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| let rec toString = | ||||
|   fun | ||||
|   | `SymbolicDist(d) => SymbolicDist.T.toString(d) | ||||
|   | `RenderedDist(_) => "[shape]" | ||||
|   | op => Operation.T.toString(toString, op); | ||||
|  |  | |||
|  | @ -304,6 +304,7 @@ let toLeaf = | |||
|   switch (node) { | ||||
|   // Leaf nodes just stay leaf nodes | ||||
|   | `SymbolicDist(_) | ||||
|   | `Function(_) | ||||
|   | `RenderedDist(_) => Ok(node) | ||||
|   // Operations nevaluationParamsd to be turned into leaves | ||||
|   | `AlgebraicCombination(algebraicOp, t1, t2) => | ||||
|  | @ -328,8 +329,6 @@ let toLeaf = | |||
|     FloatFromDist.operationToLeaf(evaluationParams, distToFloatOp, t) | ||||
|   | `Normalize(t) => Normalize.operationToLeaf(evaluationParams, t) | ||||
|   | `Render(t) => Render.operationToLeaf(evaluationParams, t) | ||||
| 
 | ||||
|   | `Function(_) => Error("Function must be called with params") | ||||
|   | `Symbol(r) => ExpressionTypes.ExpressionTree.Environment.get(evaluationParams.environment, r) |> E.O.toResult("Undeclared variable " ++ r) | ||||
|   | `FunctionCall(name, args) => | ||||
|     callableFunction(evaluationParams, name, args) | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ module Pointwise = { | |||
|   let toString = | ||||
|     fun | ||||
|     | `Add => "+" | ||||
|     | `Exponentiate => "^" | ||||
|     | `Multiply => "*"; | ||||
| 
 | ||||
|   let format = (a, b, c) => b ++ " " ++ toString(a) ++ " " ++ c; | ||||
|  |  | |||
|  | @ -92,7 +92,7 @@ module Internals = { | |||
|   let makeOutputs = (graph, shape): outputs => {graph, shape}; | ||||
| 
 | ||||
|   let runNode = (inputs, node) => { | ||||
|     ExpressionTree.toShape( | ||||
|     ExpressionTree.toLeaf( | ||||
|       { | ||||
|         sampleCount: inputs.samplingInputs.sampleCount |> E.O.default(10000), | ||||
|         outputXYPoints: | ||||
|  | @ -120,13 +120,12 @@ module Internals = { | |||
|     |> E.A.R.firstErrorOrOpen; | ||||
|   }; | ||||
| 
 | ||||
|   let inputsToShape = (inputs: inputs) => { | ||||
|   let inputsToLeaf = (inputs: inputs) => { | ||||
|     MathJsParser.fromString(inputs.guesstimatorString) | ||||
|     |> E.R.bind(_, g => runProgram(inputs, g)) | ||||
|     |> E.R.bind(_, r => | ||||
|          E.A.last(r) | ||||
|          |> E.O.toResult("No rendered lines") | ||||
|          |> E.R.fmap(Shape.T.normalize) | ||||
|        ); | ||||
|   }; | ||||
| 
 | ||||
|  | @ -144,6 +143,22 @@ module Internals = { | |||
| let run = (inputs: Inputs.inputs) => { | ||||
|   inputs | ||||
|   |> Internals.distPlusRenderInputsToInputs | ||||
|   |> Internals.inputsToShape | ||||
|   |> Internals.inputsToLeaf | ||||
|   |> E.R.bind(_,r => switch(r){ | ||||
|     | `RenderedDist(n) => Ok(n) | ||||
|     | _ => Error("Didn't output renderedDist") | ||||
|   }) | ||||
|   |> E.R.fmap(Internals.outputToDistPlus(inputs)); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| let run2 = (inputs: Inputs.inputs) => { | ||||
|   inputs | ||||
|   |> Internals.distPlusRenderInputsToInputs | ||||
|   |> Internals.inputsToLeaf | ||||
|   |> E.R.bind(_,r => switch(r){ | ||||
|     | `RenderedDist(n) => Ok(`DistPlus(Internals.outputToDistPlus(inputs,n))) | ||||
|     | `Function(n) => Ok(`Function(n)) | ||||
|     | _ => Error("Didn't output renderedDist") | ||||
|   }) | ||||
| }; | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user