Added scalePower and scaleLog
This commit is contained in:
		
							parent
							
								
									5f78399760
								
							
						
					
					
						commit
						282fa7726b
					
				|  | @ -154,6 +154,16 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { | |||
|       ->GenericDist.toPointSet(~xyPointLength, ~sampleCount, ()) | ||||
|       ->E.R2.fmap(r => Dist(PointSet(r))) | ||||
|       ->OutputLocal.fromResult | ||||
|     | ToDist(Scale(#Logarithm, f)) =>  | ||||
|       dist | ||||
|       ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination=#Logarithm, ~f) | ||||
|       ->E.R2.fmap(r => Dist(r)) | ||||
|       ->OutputLocal.fromResult | ||||
|     | ToDist(Scale(#Power, f)) =>  | ||||
|       dist | ||||
|       ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination=#Power, ~f) | ||||
|       ->E.R2.fmap(r => Dist(r)) | ||||
|       ->OutputLocal.fromResult | ||||
|     | ToDistCombination(Algebraic(_), _, #Float(_)) => GenDistError(NotYetImplemented) | ||||
|     | ToDistCombination(Algebraic(strategy), arithmeticOperation, #Dist(t2)) => | ||||
|       dist | ||||
|  |  | |||
|  | @ -70,10 +70,16 @@ module DistributionOperation = { | |||
|     | #Sample | ||||
|   ] | ||||
| 
 | ||||
|   type toScaleFn = [ | ||||
|     | #Power | ||||
|     | #Logarithm | ||||
|   ] | ||||
| 
 | ||||
|   type toDist = | ||||
|     | Normalize | ||||
|     | ToPointSet | ||||
|     | ToSampleSet(int) | ||||
|     | Scale(toScaleFn, float) | ||||
|     | Truncate(option<float>, option<float>) | ||||
|     | Inspect | ||||
| 
 | ||||
|  | @ -113,6 +119,8 @@ module DistributionOperation = { | |||
|     | ToDist(ToSampleSet(r)) => `toSampleSet(${E.I.toString(r)})` | ||||
|     | ToDist(Truncate(_, _)) => `truncate` | ||||
|     | ToDist(Inspect) => `inspect` | ||||
|     | ToDist(Scale(#Power, r)) => `scalePower(${E.Float.toFixed(r)})` | ||||
|     | ToDist(Scale(#Logarithm, r)) => `scaleLog(${E.Float.toFixed(r)})` | ||||
|     | ToString(ToString) => `toString` | ||||
|     | ToString(ToSparkline(n)) => `toSparkline(${E.I.toString(n)})` | ||||
|     | ToBool(IsNormalized) => `isNormalized` | ||||
|  | @ -142,6 +150,8 @@ module Constructors = { | |||
|     let toSampleSet = (dist, r): t => FromDist(ToDist(ToSampleSet(r)), dist) | ||||
|     let truncate = (dist, left, right): t => FromDist(ToDist(Truncate(left, right)), dist) | ||||
|     let inspect = (dist): t => FromDist(ToDist(Inspect), dist) | ||||
|     let scalePower = (dist, n): t => FromDist(ToDist(Scale(#Power, n)), dist) | ||||
|     let scaleLogarithm = (dist, n): t => FromDist(ToDist(Scale(#Logarithm, n)), dist) | ||||
|     let toString = (dist): t => FromDist(ToString(ToString), dist) | ||||
|     let toSparkline = (dist, n): t => FromDist(ToString(ToSparkline(n)), dist) | ||||
|     let algebraicAdd = (dist1, dist2: genericDist): t => FromDist( | ||||
|  |  | |||
|  | @ -366,6 +366,7 @@ let pointwiseCombination = ( | |||
|   ~algebraicCombination: Operation.algebraicOperation, | ||||
|   ~t2: t, | ||||
| ): result<t, error> => { | ||||
|   Js.log2("PointwiseCombination", algebraicCombination); | ||||
|   E.R.merge(toPointSetFn(t1), toPointSetFn(t2))->E.R.bind(((t1, t2)) => | ||||
|     PointSetDist.combinePointwise(Operation.Algebraic.toFn(algebraicCombination), t1, t2) | ||||
|     ->E.R2.fmap(r => DistributionTypes.PointSet(r)) | ||||
|  |  | |||
|  | @ -156,8 +156,10 @@ let reduce = ( | |||
|   ~integralSumCachesFn: (float, float) => option<float>=(_, _) => None, | ||||
|   fn: (float, float) => result<float, 'e>, | ||||
|   continuousShapes, | ||||
| ): result<t, 'e> => | ||||
|   continuousShapes |> E.A.R.foldM(combinePointwise(~integralSumCachesFn, fn), empty) | ||||
| ): result<t, 'e> => { | ||||
|   let merge = combinePointwise(~integralSumCachesFn, fn) | ||||
|   continuousShapes |> E.A.R.foldM(merge, empty) | ||||
| } | ||||
| 
 | ||||
| let mapYResult = ( | ||||
|   ~integralSumCacheFn=_ => None, | ||||
|  |  | |||
|  | @ -34,9 +34,10 @@ let lastY = (t: t) => t |> getShape |> XYShape.T.lastY | |||
| 
 | ||||
| let combinePointwise = ( | ||||
|   ~integralSumCachesFn=(_, _) => None, | ||||
|   fn, | ||||
|   t1: PointSetTypes.discreteShape, | ||||
|   t2: PointSetTypes.discreteShape, | ||||
| ): PointSetTypes.discreteShape => { | ||||
| ): result<PointSetTypes.discreteShape, 'e> => { | ||||
|   let combinedIntegralSum = Common.combineIntegralSums( | ||||
|     integralSumCachesFn, | ||||
|     t1.integralSumCache, | ||||
|  | @ -49,16 +50,22 @@ let combinePointwise = ( | |||
|   make( | ||||
|     ~integralSumCache=combinedIntegralSum, | ||||
|     XYShape.PointwiseCombination.combine( | ||||
|       (a, b) => Ok(a +. b), | ||||
|       fn, | ||||
|       XYShape.XtoY.discreteInterpolator, | ||||
|       t1.xyShape, | ||||
|       t2.xyShape, | ||||
|     )->E.R.toExn("Addition operation should never fail", _), | ||||
|   ) | ||||
|   )->Ok | ||||
| } | ||||
| 
 | ||||
| let reduce = (~integralSumCachesFn=(_, _) => None, discreteShapes): PointSetTypes.discreteShape => | ||||
|   discreteShapes |> E.A.fold_left(combinePointwise(~integralSumCachesFn), empty) | ||||
| let reduce = ( | ||||
|   ~integralSumCachesFn=(_, _) => None, | ||||
|   fn: (float, float) => result<float, 'e>, | ||||
|   discreteShapes: array<PointSetTypes.discreteShape>, | ||||
| ): result<t, 'e> => { | ||||
|   let merge = combinePointwise(~integralSumCachesFn, fn) | ||||
|   discreteShapes |> E.A.R.foldM(merge, empty) | ||||
| } | ||||
| 
 | ||||
| let updateIntegralSumCache = (integralSumCache, t: t): t => { | ||||
|   ...t, | ||||
|  |  | |||
|  | @ -316,7 +316,10 @@ let combinePointwise = ( | |||
|   t2: t, | ||||
| ): result<t, 'e> => { | ||||
|   let reducedDiscrete = | ||||
|     [t1, t2] |> E.A.fmap(toDiscrete) |> E.A.O.concatSomes |> Discrete.reduce(~integralSumCachesFn) | ||||
|     [t1, t2] | ||||
|     |> E.A.fmap(toDiscrete) | ||||
|     |> E.A.O.concatSomes | ||||
|     |> Discrete.reduce(~integralSumCachesFn, fn) | ||||
| 
 | ||||
|   let reducedContinuous = | ||||
|     [t1, t2] | ||||
|  | @ -335,11 +338,11 @@ let combinePointwise = ( | |||
|     t1.integralCache, | ||||
|     t2.integralCache, | ||||
|   ) | ||||
|   reducedContinuous->E.R2.fmap(continuous => | ||||
|   E.R.merge(reducedContinuous, reducedDiscrete)->E.R2.fmap(((continuous, discrete)) => | ||||
|     make( | ||||
|       ~integralSumCache=combinedIntegralSum, | ||||
|       ~integralCache=combinedIntegral, | ||||
|       ~discrete=reducedDiscrete, | ||||
|       ~discrete, | ||||
|       ~continuous, | ||||
|     ) | ||||
|   ) | ||||
|  |  | |||
|  | @ -84,7 +84,12 @@ let combinePointwise = ( | |||
|       m2, | ||||
|     )->E.R2.fmap(x => PointSetTypes.Continuous(x)) | ||||
|   | (Discrete(m1), Discrete(m2)) => | ||||
|     Ok(PointSetTypes.Discrete(Discrete.combinePointwise(~integralSumCachesFn, m1, m2))) | ||||
|     Discrete.combinePointwise( | ||||
|       ~integralSumCachesFn, | ||||
|       fn, | ||||
|       m1, | ||||
|       m2, | ||||
|     )->E.R2.fmap(x => PointSetTypes.Discrete(x)) | ||||
|   | (m1, m2) => | ||||
|     Mixed.combinePointwise( | ||||
|       ~integralSumCachesFn, | ||||
|  |  | |||
|  | @ -211,6 +211,15 @@ let dispatchToGenericOutput = (call: ExpressionValue.functionCall): option< | |||
|   | ("normalize", [EvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist) | ||||
|   | ("isNormalized", [EvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist) | ||||
|   | ("toPointSet", [EvDistribution(dist)]) => Helpers.toDistFn(ToPointSet, dist) | ||||
|   | ("scaleLog", [EvDistribution(dist)]) => | ||||
|     Helpers.toDistFn(Scale(#Logarithm, MagicNumbers.Math.e), dist) | ||||
|   | ("scaleLog10", [EvDistribution(dist)]) => Helpers.toDistFn(Scale(#Logarithm, 10.0), dist) | ||||
|   | ("scaleLog", [EvDistribution(dist), EvNumber(float)]) => | ||||
|     Helpers.toDistFn(Scale(#Logarithm, float), dist) | ||||
|   | ("scalePow", [EvDistribution(dist), EvNumber(float)]) => | ||||
|     Helpers.toDistFn(Scale(#Power, float), dist) | ||||
|   | ("scaleExp", [EvDistribution(dist)]) => | ||||
|     Helpers.toDistFn(Scale(#Power, MagicNumbers.Math.e), dist) | ||||
|   | ("cdf", [EvDistribution(dist), EvNumber(float)]) => Helpers.toFloatFn(#Cdf(float), dist) | ||||
|   | ("pdf", [EvDistribution(dist), EvNumber(float)]) => Helpers.toFloatFn(#Pdf(float), dist) | ||||
|   | ("inv", [EvDistribution(dist), EvNumber(float)]) => Helpers.toFloatFn(#Inv(float), dist) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user