Gradually adding more functions to Functions.re
This commit is contained in:
		
							parent
							
								
									5d7ffdf2bc
								
							
						
					
					
						commit
						f3841a961c
					
				| 
						 | 
				
			
			@ -31,7 +31,7 @@ export class CodeEditor extends React.Component {
 | 
			
		|||
        }}
 | 
			
		||||
        setOptions={{
 | 
			
		||||
          enableBasicAutocompletion: false,
 | 
			
		||||
          enableLiveAutocompletion: false,
 | 
			
		||||
          enableLiveAutocompletion: true,
 | 
			
		||||
          enableSnippets: true,
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,26 +95,28 @@ module VerticalScaling = {
 | 
			
		|||
  let operationToLeaf =
 | 
			
		||||
      (evaluationParams: evaluationParams, scaleOp, t, scaleBy) => {
 | 
			
		||||
    // scaleBy has to be a single float, otherwise we'll return an error.
 | 
			
		||||
    let fn = (secondary,main) => Operation.Scale.toFn(scaleOp)(main, secondary);
 | 
			
		||||
    let fn = (secondary, main) =>
 | 
			
		||||
      Operation.Scale.toFn(scaleOp, main, secondary);
 | 
			
		||||
    let integralSumCacheFn = Operation.Scale.toIntegralSumCacheFn(scaleOp);
 | 
			
		||||
    let integralCacheFn = Operation.Scale.toIntegralCacheFn(scaleOp);
 | 
			
		||||
    let renderedShape = Render.render(evaluationParams, t);
 | 
			
		||||
 | 
			
		||||
    let s = switch (renderedShape, scaleBy) {
 | 
			
		||||
    | (Ok(`RenderedDist(rs)), `SymbolicDist(`Float(scaleBy))) =>
 | 
			
		||||
      Ok(
 | 
			
		||||
        `RenderedDist(
 | 
			
		||||
          Shape.T.mapY(
 | 
			
		||||
            ~integralSumCacheFn=integralSumCacheFn(scaleBy),
 | 
			
		||||
            ~integralCacheFn=integralCacheFn(scaleBy),
 | 
			
		||||
            ~fn=fn(scaleBy),
 | 
			
		||||
            rs,
 | 
			
		||||
    let s =
 | 
			
		||||
      switch (renderedShape, scaleBy) {
 | 
			
		||||
      | (Ok(`RenderedDist(rs)), `SymbolicDist(`Float(scaleBy))) =>
 | 
			
		||||
        Ok(
 | 
			
		||||
          `RenderedDist(
 | 
			
		||||
            Shape.T.mapY(
 | 
			
		||||
              ~integralSumCacheFn=integralSumCacheFn(scaleBy),
 | 
			
		||||
              ~integralCacheFn=integralCacheFn(scaleBy),
 | 
			
		||||
              ~fn=fn(scaleBy),
 | 
			
		||||
              rs,
 | 
			
		||||
            ),
 | 
			
		||||
          ),
 | 
			
		||||
        ),
 | 
			
		||||
      )
 | 
			
		||||
    | (Error(e1), _) => Error(e1)
 | 
			
		||||
    | (_, _) => Error("Can only scale by float values.")
 | 
			
		||||
    };
 | 
			
		||||
        )
 | 
			
		||||
      | (Error(e1), _) => Error(e1)
 | 
			
		||||
      | (_, _) => Error("Can only scale by float values.")
 | 
			
		||||
      };
 | 
			
		||||
    s;
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -265,9 +267,7 @@ module FloatFromDist = {
 | 
			
		|||
// TODO: This forces things to be floats
 | 
			
		||||
let callableFunction = (evaluationParams, name, args) => {
 | 
			
		||||
  args
 | 
			
		||||
  |> E.A.fmap(a =>
 | 
			
		||||
       Render.render(evaluationParams, a) |> E.R.bind(_, Render.toFloat)
 | 
			
		||||
     )
 | 
			
		||||
  |> E.A.fmap(a => evaluationParams.evaluateNode(evaluationParams, a))
 | 
			
		||||
  |> E.A.R.firstErrorOrOpen
 | 
			
		||||
  |> E.R.bind(_, Functions.fnn(evaluationParams, name));
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -299,11 +299,11 @@ module Render = {
 | 
			
		|||
   This function is used mainly to turn a parse tree into a single RenderedDist
 | 
			
		||||
   that can then be displayed to the user. */
 | 
			
		||||
let rec toLeaf =
 | 
			
		||||
    (
 | 
			
		||||
      evaluationParams: ExpressionTypes.ExpressionTree.evaluationParams,
 | 
			
		||||
      node: t,
 | 
			
		||||
    )
 | 
			
		||||
    : result(t, string) => {
 | 
			
		||||
        (
 | 
			
		||||
          evaluationParams: ExpressionTypes.ExpressionTree.evaluationParams,
 | 
			
		||||
          node: t,
 | 
			
		||||
        )
 | 
			
		||||
        : result(t, string) => {
 | 
			
		||||
  switch (node) {
 | 
			
		||||
  // Leaf nodes just stay leaf nodes
 | 
			
		||||
  | `SymbolicDist(_)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,6 +31,10 @@ module ExpressionTree = {
 | 
			
		|||
    | `FunctionCall(string, array(node))
 | 
			
		||||
  ];
 | 
			
		||||
  // Have nil as option
 | 
			
		||||
  let getFloat = (node:node) => node |> fun
 | 
			
		||||
  | `RenderedDist(Discrete({xyShape: {xs: [|x|], ys: [|1.0|]}})) => Some(x)
 | 
			
		||||
  | `SymbolicDist(`Float(x)) => Some(x)
 | 
			
		||||
  | _ => None
 | 
			
		||||
 | 
			
		||||
  type samplingInputs = {
 | 
			
		||||
    sampleCount: int,
 | 
			
		||||
| 
						 | 
				
			
			@ -87,6 +91,7 @@ module ExpressionTree = {
 | 
			
		|||
    |> evaluationParams.evaluateNode(evaluationParams)
 | 
			
		||||
    |> E.R.bind(_, fn(evaluationParams));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  module Render = {
 | 
			
		||||
    type t = node;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,21 +1,17 @@
 | 
			
		|||
type node = ExpressionTypes.ExpressionTree.node;
 | 
			
		||||
 | 
			
		||||
let toOkSym = r => Ok(`SymbolicDist(r));
 | 
			
		||||
let getFloat = ExpressionTypes.ExpressionTree.getFloat;
 | 
			
		||||
 | 
			
		||||
let twoFloats = (fn, n1: node, n2: node): result(node, string) =>
 | 
			
		||||
  switch (n1, n2) {
 | 
			
		||||
  | (`SymbolicDist(`Float(a)), `SymbolicDist(`Float(b))) => fn(a, b)
 | 
			
		||||
  | _ => Error("Variables have wrong type")
 | 
			
		||||
  switch (getFloat(n1), getFloat(n2)) {
 | 
			
		||||
  | (Some(a), Some(b)) => fn(a, b)
 | 
			
		||||
  | _ => Error("Function needed two floats, missing them.")
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
let threeFloats = (fn, n1: node, n2: node, n3: node): result(node, string) =>
 | 
			
		||||
  switch (n1, n2, n3) {
 | 
			
		||||
  | (
 | 
			
		||||
      `SymbolicDist(`Float(a)),
 | 
			
		||||
      `SymbolicDist(`Float(b)),
 | 
			
		||||
      `SymbolicDist(`Float(c)),
 | 
			
		||||
    ) =>
 | 
			
		||||
    fn(a, b, c)
 | 
			
		||||
  switch (getFloat(n1), getFloat(n2), getFloat(n3)) {
 | 
			
		||||
  | (Some(a), Some(b), Some(c)) => fn(a, b, c)
 | 
			
		||||
  | _ => Error("Variables have wrong type")
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,18 +31,15 @@ let apply3 = (fn, args: array(node)): result(node, string) =>
 | 
			
		|||
  | _ => Error("Needs 3 args")
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
let to_: (float, float) => result(node, string) = (low, high) => switch(low,high){
 | 
			
		||||
  | (low,high)
 | 
			
		||||
      when low <= 0.0 && low < high => {
 | 
			
		||||
      Ok(`SymbolicDist(SymbolicDist.Normal.from90PercentCI(low, high)));
 | 
			
		||||
    }
 | 
			
		||||
  | (low,high)
 | 
			
		||||
      when low < high => {
 | 
			
		||||
      Ok(`SymbolicDist(SymbolicDist.Lognormal.from90PercentCI(low, high)));
 | 
			
		||||
    }
 | 
			
		||||
  | (low,high) =>
 | 
			
		||||
    Error("Low value must be less than high value.")
 | 
			
		||||
}
 | 
			
		||||
let to_: (float, float) => result(node, string) =
 | 
			
		||||
  (low, high) =>
 | 
			
		||||
    switch (low, high) {
 | 
			
		||||
    | (low, high) when low <= 0.0 && low < high =>
 | 
			
		||||
      Ok(`SymbolicDist(SymbolicDist.Normal.from90PercentCI(low, high)))
 | 
			
		||||
    | (low, high) when low < high =>
 | 
			
		||||
      Ok(`SymbolicDist(SymbolicDist.Lognormal.from90PercentCI(low, high)))
 | 
			
		||||
    | (low, high) => Error("Low value must be less than high value.")
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
// Possible setup:
 | 
			
		||||
// let normal = {"inputs": [`float, `float], "outputs": [`float]};
 | 
			
		||||
| 
						 | 
				
			
			@ -86,16 +79,57 @@ let fnn =
 | 
			
		|||
    | _ => Error("Needs 3 valid arguments")
 | 
			
		||||
    }
 | 
			
		||||
  | ("triangular", _) =>
 | 
			
		||||
    switch (args) {
 | 
			
		||||
    | [|
 | 
			
		||||
        `SymbolicDist(`Float(a)),
 | 
			
		||||
        `SymbolicDist(`Float(b)),
 | 
			
		||||
        `SymbolicDist(`Float(c)),
 | 
			
		||||
      |] =>
 | 
			
		||||
    switch (args |> E.A.fmap(getFloat)) {
 | 
			
		||||
    | [|Some(a), Some(b), Some(c)|] =>
 | 
			
		||||
      SymbolicDist.Triangular.make(a, b, c)
 | 
			
		||||
      |> E.R.fmap(r => `SymbolicDist(r))
 | 
			
		||||
    | _ => Error("Needs 3 valid arguments")
 | 
			
		||||
    }
 | 
			
		||||
  | ("to", _) => apply2(twoFloats(to_), args)
 | 
			
		||||
  | ("pdf", _) => switch(args){
 | 
			
		||||
    | [|fst,snd|] => {
 | 
			
		||||
      switch(PTypes.SamplingDistribution.renderIfIsNotSamplingDistribution(evaluationParams,fst),getFloat(snd)){
 | 
			
		||||
        | (Ok(fst), Some(flt)) => Ok(`FloatFromDist(`Pdf(flt), fst))
 | 
			
		||||
        | _ => Error("Incorrect arguments")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    | _ => Error("Needs two args")
 | 
			
		||||
  }
 | 
			
		||||
  | ("inv", _) => switch(args){
 | 
			
		||||
    | [|fst,snd|] => {
 | 
			
		||||
      switch(PTypes.SamplingDistribution.renderIfIsNotSamplingDistribution(evaluationParams,fst),getFloat(snd)){
 | 
			
		||||
        | (Ok(fst), Some(flt)) => Ok(`FloatFromDist(`Inv(flt), fst))
 | 
			
		||||
        | _ => Error("Incorrect arguments")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    | _ => Error("Needs two args")
 | 
			
		||||
  }
 | 
			
		||||
  | ("cdf", _) => switch(args){
 | 
			
		||||
    | [|fst,snd|] => {
 | 
			
		||||
      switch(PTypes.SamplingDistribution.renderIfIsNotSamplingDistribution(evaluationParams,fst),getFloat(snd)){
 | 
			
		||||
        | (Ok(fst), Some(flt)) => Ok(`FloatFromDist(`Cdf(flt), fst))
 | 
			
		||||
        | _ => Error("Incorrect arguments")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    | _ => Error("Needs two args")
 | 
			
		||||
  }
 | 
			
		||||
  | ("mean", _) => switch(args){
 | 
			
		||||
    | [|fst|] => {
 | 
			
		||||
      switch(PTypes.SamplingDistribution.renderIfIsNotSamplingDistribution(evaluationParams,fst)){
 | 
			
		||||
        | (Ok(fst)) => Ok(`FloatFromDist(`Mean,fst))
 | 
			
		||||
        | _ => Error("Incorrect arguments")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    | _ => Error("Needs two args")
 | 
			
		||||
  }
 | 
			
		||||
  | ("sample", _) => switch(args){
 | 
			
		||||
    | [|fst|] => {
 | 
			
		||||
      switch(PTypes.SamplingDistribution.renderIfIsNotSamplingDistribution(evaluationParams,fst)){
 | 
			
		||||
        | (Ok(fst)) => Ok(`FloatFromDist(`Sample,fst))
 | 
			
		||||
        | _ => Error("Incorrect arguments")
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    | _ => Error("Needs two args")
 | 
			
		||||
  }
 | 
			
		||||
  | _ => Error("Function " ++ name ++ " not found")
 | 
			
		||||
  };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -236,14 +236,6 @@ module MathAdtToDistDst = {
 | 
			
		|||
           )
 | 
			
		||||
         | ("scaleLog", [|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))|]) =>
 | 
			
		||||
           toOkFloatFromDist((`Cdf(v), d))
 | 
			
		||||
         | ("inv", [|d, `SymbolicDist(`Float(v))|]) =>
 | 
			
		||||
           toOkFloatFromDist((`Inv(v), d))
 | 
			
		||||
         | ("mean", [|d|]) => toOkFloatFromDist((`Mean, d))
 | 
			
		||||
         | ("sample", [|d|]) => toOkFloatFromDist((`Sample, d))
 | 
			
		||||
         | _ => Error("This type not currently supported")
 | 
			
		||||
         }
 | 
			
		||||
       });
 | 
			
		||||
| 
						 | 
				
			
			@ -294,12 +286,7 @@ module MathAdtToDistDst = {
 | 
			
		|||
    | "scaleMultiply"
 | 
			
		||||
    | "scaleExp"
 | 
			
		||||
    | "scaleLog"
 | 
			
		||||
    | "truncate"
 | 
			
		||||
    | "mean"
 | 
			
		||||
    | "inv"
 | 
			
		||||
    | "sample"
 | 
			
		||||
    | "cdf"
 | 
			
		||||
    | "pdf" => operationParser(name, parseArgs())
 | 
			
		||||
    | "truncate" => operationParser(name, parseArgs())
 | 
			
		||||
    | name =>
 | 
			
		||||
      parseArgs()
 | 
			
		||||
      |> E.R.fmap((args: array(ExpressionTypes.ExpressionTree.node)) =>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user