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