Refactor GenericOperation to allow for operations other than toDist operations
This commit is contained in:
parent
c2ac9614d0
commit
b70e8e02e1
|
@ -1,4 +1,4 @@
|
|||
//TODO: multimodal, add interface, split up a little bit, test somehow, track performance, refactor sampleSet, refactor ASTEvaluator.res.
|
||||
//TODO: multimodal, add interface, test somehow, track performance, refactor sampleSet, refactor ASTEvaluator.res.
|
||||
type genericDist = GenericDist_Types.genericDist
|
||||
type error = GenericDist_Types.error
|
||||
type toPointSetFn = genericDist => result<PointSetTypes.pointSetDist, error>
|
||||
|
@ -26,6 +26,8 @@ let normalize = (t: t) =>
|
|||
| #SampleSet(_) => t
|
||||
}
|
||||
|
||||
// let isNormalized = (t:t) =>
|
||||
|
||||
|
||||
let operationToFloat = (toPointSet: toPointSetFn, fnName, t: genericDist): result<float, error> => {
|
||||
let symbolicSolution = switch t {
|
||||
|
@ -36,6 +38,7 @@ let operationToFloat = (toPointSet: toPointSetFn, fnName, t: genericDist): resul
|
|||
}
|
||||
| _ => None
|
||||
}
|
||||
|
||||
switch symbolicSolution {
|
||||
| Some(r) => Ok(r)
|
||||
| None => toPointSet(t) |> E.R.fmap(PointSetDist.operate(fnName))
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
type operation = GenericDist_Types.Operation.t
|
||||
type genericDist = GenericDist_Types.genericDist;
|
||||
type error = GenericDist_Types.error;
|
||||
type operation = GenericDist_Types.Operation.genericFunction
|
||||
type genericDist = GenericDist_Types.genericDist
|
||||
type error = GenericDist_Types.error
|
||||
|
||||
// TODO: It could be great to use a cache for some calculations (basically, do memoization). Also, better analytics/tracking could go a long way.
|
||||
|
||||
type params = {
|
||||
sampleCount: int,
|
||||
|
@ -27,52 +29,70 @@ let fromResult = (r: result<outputType, error>): outputType =>
|
|||
| Error(e) => #Error(e)
|
||||
}
|
||||
|
||||
let rec run = (wrapped: wrapped, fnName: operation): outputType => {
|
||||
let (value, {sampleCount, xyPointLength} as extra) = wrapped
|
||||
let reCall = (~value=value, ~extra=extra, ~fnName=fnName, ()) => {
|
||||
run((value, extra), fnName)
|
||||
let rec run = (extra, fnName: operation): outputType => {
|
||||
let {sampleCount, xyPointLength} = extra
|
||||
let reCall = (~extra=extra, ~fnName=fnName, ()) => {
|
||||
run(extra, fnName)
|
||||
}
|
||||
let toPointSet = r => {
|
||||
switch reCall(~value=r, ~fnName=#toDist(#toPointSet), ()) {
|
||||
switch reCall(~fnName=#fromDist(#toDist(#toPointSet), r), ()) {
|
||||
| #Dist(#PointSet(p)) => Ok(p)
|
||||
| #Error(r) => Error(r)
|
||||
| _ => Error(ImpossiblePath)
|
||||
}
|
||||
}
|
||||
let toSampleSet = r => {
|
||||
switch reCall(~value=r, ~fnName=#toDist(#toSampleSet(sampleCount)), ()) {
|
||||
switch reCall(~fnName=#fromDist(#toDist(#toSampleSet(sampleCount)), r), ()) {
|
||||
| #Dist(#SampleSet(p)) => Ok(p)
|
||||
| #Error(r) => Error(r)
|
||||
| _ => Error(ImpossiblePath)
|
||||
}
|
||||
}
|
||||
|
||||
let fromDistFn = (subFn: GenericDist_Types.Operation.fromDist, dist: genericDist) =>
|
||||
switch subFn {
|
||||
| #toFloat(fnName) =>
|
||||
GenericDist.operationToFloat(toPointSet, fnName, dist)
|
||||
|> E.R.fmap(r => #Float(r))
|
||||
|> fromResult
|
||||
| #toString => #Error(GenericDist_Types.NotYetImplemented)
|
||||
| #toDist(#normalize) => dist |> GenericDist.normalize |> (r => #Dist(r))
|
||||
| #toDist(#truncate(left, right)) =>
|
||||
dist
|
||||
|> GenericDist.Truncate.run(toPointSet, left, right)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #toDist(#toPointSet) =>
|
||||
dist
|
||||
|> GenericDist.toPointSet(xyPointLength)
|
||||
|> E.R.fmap(r => #Dist(#PointSet(r)))
|
||||
|> fromResult
|
||||
| #toDist(#toSampleSet(n)) =>
|
||||
dist |> GenericDist.sampleN(n) |> E.R.fmap(r => #Dist(#SampleSet(r))) |> fromResult
|
||||
| #toDistCombination(#Algebraic, _, #Float(_)) => #Error(NotYetImplemented)
|
||||
| #toDistCombination(#Algebraic, operation, #Dist(dist2)) =>
|
||||
dist
|
||||
|> GenericDist.AlgebraicCombination.run(toPointSet, toSampleSet, operation, dist2)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #toDistCombination(#Pointwise, operation, #Dist(dist2)) =>
|
||||
dist
|
||||
|> GenericDist.pointwiseCombination(toPointSet, operation, dist2)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #toDistCombination(#Pointwise, operation, #Float(f)) =>
|
||||
dist
|
||||
|> GenericDist.pointwiseCombinationFloat(toPointSet, operation, f)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
}
|
||||
|
||||
switch fnName {
|
||||
| #toFloat(fnName) =>
|
||||
GenericDist.operationToFloat(toPointSet, fnName, value) |> E.R.fmap(r => #Float(r)) |> fromResult
|
||||
| #toString =>
|
||||
#Error(GenericDist_Types.NotYetImplemented)
|
||||
| #toDist(#normalize) => value |> GenericDist.normalize |> (r => #Dist(r))
|
||||
| #toDist(#truncate(left, right)) =>
|
||||
value |> GenericDist.Truncate.run(toPointSet, left, right) |> E.R.fmap(r => #Dist(r)) |> fromResult
|
||||
| #toDist(#toPointSet) =>
|
||||
value |> GenericDist.toPointSet(xyPointLength) |> E.R.fmap(r => #Dist(#PointSet(r))) |> fromResult
|
||||
| #toDist(#toSampleSet(n)) =>
|
||||
value |> GenericDist.sampleN(n) |> E.R.fmap(r => #Dist(#SampleSet(r))) |> fromResult
|
||||
| #toDistCombination(#Algebraic, _, #Float(_)) => #Error(NotYetImplemented)
|
||||
| #toDistCombination(#Algebraic, operation, #Dist(value2)) =>
|
||||
value
|
||||
|> GenericDist.AlgebraicCombination.run(toPointSet, toSampleSet, operation, value2)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #toDistCombination(#Pointwise, operation, #Dist(value2)) =>
|
||||
value
|
||||
|> GenericDist.pointwiseCombination(toPointSet, operation, value2)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #toDistCombination(#Pointwise, operation, #Float(f)) =>
|
||||
value
|
||||
|> GenericDist.pointwiseCombinationFloat(toPointSet, operation, f)
|
||||
|> E.R.fmap(r => #Dist(r))
|
||||
|> fromResult
|
||||
| #fromDist(subFn, dist) => fromDistFn(subFn, dist)
|
||||
| #fromFloat(subFn, float) => reCall(
|
||||
~fnName=#fromDist(subFn, #Symbolic(SymbolicDist.Float.make(float))),
|
||||
(),
|
||||
)
|
||||
| _ => #Error(NotYetImplemented)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,10 +54,32 @@ module Operation = {
|
|||
| #Sample(int)
|
||||
]
|
||||
|
||||
type t = [
|
||||
type fromDist = [
|
||||
| #toFloat(toFloat)
|
||||
| #toDist(toDist)
|
||||
| #toDistCombination(direction, arithmeticOperation, [#Dist(genericDist) | #Float(float)])
|
||||
| #toString
|
||||
]
|
||||
}
|
||||
|
||||
type genericFunction = [
|
||||
| #fromDist(fromDist, genericDist)
|
||||
| #fromFloat(fromDist, float)
|
||||
| #mixture(array<(genericDist, float)>)
|
||||
]
|
||||
|
||||
let toString = (distFunction: fromDist): string =>
|
||||
switch distFunction {
|
||||
| #toFloat(#Cdf(r)) => `cdf(${E.Float.toFixed(r)})`
|
||||
| #toFloat(#Inv(r)) => `inv(${E.Float.toFixed(r)})`
|
||||
| #toFloat(#Mean) => `mean`
|
||||
| #toFloat(#Pdf(r)) => `pdf${E.Float.toFixed(r)}`
|
||||
| #toFloat(#Sample) => `sample`
|
||||
| #toDist(#normalize) => `normalize`
|
||||
| #toDist(#toPointSet) => `toPointSet`
|
||||
| #toDist(#toSampleSet(r)) => `toSampleSet${E.I.toString(r)}`
|
||||
| #toDist(#truncate(_, _)) => `truncate`
|
||||
| #toString => `toString`
|
||||
| #toDistCombination(#Algebraic, _, _) => `algebraic`
|
||||
| #toDistCombination(#Pointwise, _, _) => `pointwise`
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user