Minor cleanup to danger files
This commit is contained in:
		
							parent
							
								
									cae8f8cb65
								
							
						
					
					
						commit
						c5928129d7
					
				| 
						 | 
				
			
			@ -53,12 +53,11 @@ module Internals = {
 | 
			
		|||
  let pow = (base, exp) => Js.Math.pow_float(~base, ~exp)
 | 
			
		||||
  let binomial = ((n, k, p)) => choose((n, k)) *. pow(p, k) *. pow(1.0 -. p, n -. k)
 | 
			
		||||
 | 
			
		||||
  // Integral helper functions
 | 
			
		||||
  let castArrayOfFloatsToInternalArrayOfInternals = xs =>
 | 
			
		||||
    xs
 | 
			
		||||
    ->Belt.Array.map(FunctionRegistry_Helpers.Wrappers.evNumber)
 | 
			
		||||
    ->FunctionRegistry_Helpers.Wrappers.evArray
 | 
			
		||||
 | 
			
		||||
  let castFloatToInternalNumber = x => ReducerInterface_InternalExpressionValue.IEvNumber(x)
 | 
			
		||||
  let castArrayOfFloatsToInternalArrayOfInternals = xs => ReducerInterface_InternalExpressionValue.IEvArray(
 | 
			
		||||
    Belt.Array.map(xs, x => castFloatToInternalNumber(x)),
 | 
			
		||||
  )
 | 
			
		||||
  /* Helper functions. May be useful in 3 months when coming back to this code.
 | 
			
		||||
  @dead let applyFunctionAtPoint = (
 | 
			
		||||
    aLambda,
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +88,7 @@ module Internals = {
 | 
			
		|||
  ) => {
 | 
			
		||||
    let applyFunctionAtFloatToFloatOption = (point: float) => {
 | 
			
		||||
      // Defined here so that it has access to environment, reducer
 | 
			
		||||
      let pointAsInternalExpression = castFloatToInternalNumber(point)
 | 
			
		||||
      let pointAsInternalExpression = FunctionRegistry_Helpers.Wrappers.evNumber(point)
 | 
			
		||||
      let resultAsInternalExpression = Reducer_Expression_Lambda.doLambdaCall(
 | 
			
		||||
        aLambda,
 | 
			
		||||
        list{pointAsInternalExpression},
 | 
			
		||||
| 
						 | 
				
			
			@ -148,8 +147,8 @@ module Internals = {
 | 
			
		|||
      Js.Console.log2("okYs", okYs)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let result = switch E.A.length(ysOptions) == E.A.length(okYs) {
 | 
			
		||||
    | true => {
 | 
			
		||||
    //This is pretty hacky. It should use a result type instead of checking that length matches.
 | 
			
		||||
    let result = if E.A.length(ysOptions) == E.A.length(okYs) {
 | 
			
		||||
      let innerPointsSum = okYs->E.A.reduce(0.0, (a, b) => a +. b)
 | 
			
		||||
      let resultWithOuterPoints = switch (
 | 
			
		||||
        applyFunctionAtFloatToFloatOption(min),
 | 
			
		||||
| 
						 | 
				
			
			@ -165,8 +164,7 @@ module Internals = {
 | 
			
		|||
      | (_, Error(b)) => Error(b)
 | 
			
		||||
      }
 | 
			
		||||
      resultWithOuterPoints
 | 
			
		||||
      }
 | 
			
		||||
    | false =>
 | 
			
		||||
    } else {
 | 
			
		||||
      Error(
 | 
			
		||||
        "Integration error 3 in Danger.integrate. It's possible that your function doesn't return a number, try definining auxiliaryFunction(x) = mean(yourFunction(x)) and integrate auxiliaryFunction instead",
 | 
			
		||||
      )
 | 
			
		||||
| 
						 | 
				
			
			@ -180,6 +178,8 @@ module Internals = {
 | 
			
		|||
    optimalAllocations: array<float>,
 | 
			
		||||
    currentMarginalReturns: result<array<float>, string>,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //Also can be done by Js.Math.max_int
 | 
			
		||||
  let findBiggestElementIndex = xs =>
 | 
			
		||||
    E.A.reducei(xs, 0, (acc, newElement, index) => {
 | 
			
		||||
      switch newElement > xs[acc] {
 | 
			
		||||
| 
						 | 
				
			
			@ -285,6 +285,7 @@ module Internals = {
 | 
			
		|||
    }
 | 
			
		||||
    optimalAllocationResult
 | 
			
		||||
  }*/
 | 
			
		||||
  //TODO: This is so complicated, it probably should be its own file. It might also make sense to have it work in Rescript directly, taking in a function rather than a reducer; then something else can wrap that function in the reducer/lambdas/environment.
 | 
			
		||||
  let diminishingMarginalReturnsForManyFunctions = (
 | 
			
		||||
    lambdas,
 | 
			
		||||
    funds,
 | 
			
		||||
| 
						 | 
				
			
			@ -297,16 +298,16 @@ module Internals = {
 | 
			
		|||
    1. O(n): Iterate through value on next n dollars. At each step, only compute the new marginal return of the function which is spent
 | 
			
		||||
    2. O(n*m): Iterate through all possible spending combinations. Fun is, it doesn't assume that the returns of marginal spending are diminishing.
 | 
			
		||||
 */
 | 
			
		||||
    let applyFunctionAtFloatToFloatOption = (lambda, point: float) => {
 | 
			
		||||
    let applyFunctionAtPoint = (lambda, point: float) => {
 | 
			
		||||
      // Defined here so that it has access to environment, reducer
 | 
			
		||||
      let pointAsInternalExpression = castFloatToInternalNumber(point)
 | 
			
		||||
      let pointAsInternalExpression = FunctionRegistry_Helpers.Wrappers.evNumber(point)
 | 
			
		||||
      let resultAsInternalExpression = Reducer_Expression_Lambda.doLambdaCall(
 | 
			
		||||
        lambda,
 | 
			
		||||
        list{pointAsInternalExpression},
 | 
			
		||||
        environment,
 | 
			
		||||
        reducer,
 | 
			
		||||
      )
 | 
			
		||||
      let result = switch resultAsInternalExpression {
 | 
			
		||||
      switch resultAsInternalExpression {
 | 
			
		||||
      | Ok(IEvNumber(x)) => Ok(x)
 | 
			
		||||
      | Error(_) =>
 | 
			
		||||
        Error(
 | 
			
		||||
| 
						 | 
				
			
			@ -314,19 +315,16 @@ module Internals = {
 | 
			
		|||
        )
 | 
			
		||||
      | _ => Error("Error 2 in Danger.diminishingMarginalReturnsForManyFunctions")
 | 
			
		||||
      }
 | 
			
		||||
      result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let numDivisions = Js.Math.round(funds /. approximateIncrement)
 | 
			
		||||
    let numDivisionsInt = Belt.Float.toInt(numDivisions)
 | 
			
		||||
    let increment = funds /. numDivisions
 | 
			
		||||
    let arrayOfIncrements = Belt.Array.makeBy(numDivisionsInt, _ => increment)
 | 
			
		||||
    let numLambdas = E.A.length(lambdas)
 | 
			
		||||
    let arrayOfIncrements = Belt.Array.make(Belt.Float.toInt(numDivisions), increment)
 | 
			
		||||
 | 
			
		||||
    let initAccumulator: diminishingReturnsAccumulator = Ok({
 | 
			
		||||
      optimalAllocations: Belt.Array.makeBy(numLambdas, _ => 0.0),
 | 
			
		||||
      optimalAllocations: Belt.Array.make(E.A.length(lambdas), 0.0),
 | 
			
		||||
      currentMarginalReturns: E.A.fmap(
 | 
			
		||||
        lambda => applyFunctionAtFloatToFloatOption(lambda, 0.0),
 | 
			
		||||
        lambda => applyFunctionAtPoint(lambda, 0.0),
 | 
			
		||||
        lambdas,
 | 
			
		||||
      )->E.A.R.firstErrorOrOpen,
 | 
			
		||||
    })
 | 
			
		||||
| 
						 | 
				
			
			@ -345,10 +343,7 @@ module Internals = {
 | 
			
		|||
              let newOptimalAllocationsi = newOptimalAllocations[indexOfBiggestDMR] +. newIncrement
 | 
			
		||||
              newOptimalAllocations[indexOfBiggestDMR] = newOptimalAllocationsi
 | 
			
		||||
              let lambdai = lambdas[indexOfBiggestDMR]
 | 
			
		||||
              let newMarginalResultsLambdai = applyFunctionAtFloatToFloatOption(
 | 
			
		||||
                lambdai,
 | 
			
		||||
                newOptimalAllocationsi,
 | 
			
		||||
              )
 | 
			
		||||
              let newMarginalResultsLambdai = applyFunctionAtPoint(lambdai, newOptimalAllocationsi)
 | 
			
		||||
              let newCurrentMarginalReturns = switch newMarginalResultsLambdai {
 | 
			
		||||
              | Ok(value) => {
 | 
			
		||||
                  let result = Belt.Array.copy(oldMarginalReturns)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user