safe constructors
This commit is contained in:
parent
67bcd7052b
commit
a99f52d781
|
@ -31,7 +31,85 @@ type triangular = {
|
||||||
high: float,
|
high: float,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type symbolicValidationError =
|
||||||
|
| InvalidNormal(string)
|
||||||
|
| InvalidLognormal(string)
|
||||||
|
| InvalidUniform(string)
|
||||||
|
| InvalidBeta(string)
|
||||||
|
| InvalidExponential(string)
|
||||||
|
| InvalidCauchy(string)
|
||||||
|
| InvalidTriangular(string)
|
||||||
|
|
||||||
|
type validated<'a> = result<'a, symbolicValidationError>
|
||||||
|
|
||||||
|
let valiNormal: normal => validated<normal> = t => {
|
||||||
|
if t.stdev <= 0.0 {
|
||||||
|
Error(InvalidNormal("Stdev must be strictly greater than 0"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiExponential: exponential => validated<exponential> = t => {
|
||||||
|
if t.rate <= 0.0 {
|
||||||
|
Error(InvalidExponential("Exponential distribtion rate must be larger than 0"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiCauchy: cauchy => validated<cauchy> = t => {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiTriangular: triangular => validated<triangular> = t => {
|
||||||
|
if t.low >= t.medium || t.medium >= t.high {
|
||||||
|
Error(InvalidTriangular("Triangular values must be in increasing order"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiBeta: beta => validated<beta> = t => {
|
||||||
|
if t.alpha <= 0.0 || t.beta <= 0.0 {
|
||||||
|
Error(InvalidBeta("Beta distribution parameters must be strictly positive"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiLognormal: lognormal => validated<lognormal> = t => {
|
||||||
|
if t.sigma <= 0.0 {
|
||||||
|
Error(InvalidLognormal("Lognormal standard deviation must be strictly positive"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiUniform: uniform => validated<uniform> = t => {
|
||||||
|
if t.low >= t.high {
|
||||||
|
Error(InvalidUniform("High must be strictly greater than low"))
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let valiFloat: float => validated<float> = t => {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
|
||||||
@genType
|
@genType
|
||||||
|
type symbolicDistR = [
|
||||||
|
| #NormalR(validated<normal>)
|
||||||
|
| #BetaR(validated<beta>)
|
||||||
|
| #LognormalR(validated<lognormal>)
|
||||||
|
| #UniformR(validated<uniform>)
|
||||||
|
| #ExponentialR(validated<exponential>)
|
||||||
|
| #CauchyR(validated<cauchy>)
|
||||||
|
| #TriangularR(validated<triangular>)
|
||||||
|
| #FloatR(validated<float>)
|
||||||
|
]
|
||||||
|
|
||||||
type symbolicDist = [
|
type symbolicDist = [
|
||||||
| #Normal(normal)
|
| #Normal(normal)
|
||||||
| #Beta(beta)
|
| #Beta(beta)
|
||||||
|
@ -48,3 +126,50 @@ type analyticalSimplificationResult = [
|
||||||
| #Error(string)
|
| #Error(string)
|
||||||
| #NoSolution
|
| #NoSolution
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// I feel like this should be something in `E.R.`...
|
||||||
|
let f: symbolicDistR => validated<symbolicDist> = x => {
|
||||||
|
switch x {
|
||||||
|
| #NormalR(vNormal) => switch vNormal {
|
||||||
|
| Ok(t) => Ok(#Normal(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #BetaR(vBeta) => switch vBeta {
|
||||||
|
| Ok(t) => Ok(#Beta(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #LognormalR(vLognormal) => switch vLognormal {
|
||||||
|
| Ok(t) => Ok(#Lognormal(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #UniformR(vUniform) => switch vUniform {
|
||||||
|
| Ok(t) => Ok(#Uniform(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #ExponentialR(vExponential) => switch vExponential {
|
||||||
|
| Ok(t) => Ok(#Exponential(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #CauchyR(vExponential) => switch vExponential {
|
||||||
|
| Ok(t) => Ok(#Cauchy(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #TriangularR(vExponential) => switch vExponential {
|
||||||
|
| Ok(t) => Ok(#Triangular(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
| #FloatR(vExponential) => switch vExponential {
|
||||||
|
| Ok(t) => Ok(#Float(t))
|
||||||
|
| Error(t) => Error(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let normalConstr: normal => validated<symbolicDist> = t => t -> valiNormal -> #NormalR -> f
|
||||||
|
let exponentialConstr: exponential => validated<symbolicDist> = t => t -> valiExponential -> #ExponentialR -> f
|
||||||
|
let cauchyConstr: cauchy => validated<symbolicDist> = t => t -> valiCauchy -> #CauchyR -> f
|
||||||
|
let triangularConstr: triangular => validated<symbolicDist> = t => t -> valiTriangular -> #TriangularR -> f
|
||||||
|
let betaConstr: beta => validated<symbolicDist> = t => t -> valiBeta -> #BetaR -> f
|
||||||
|
let lognormalConstr: lognormal => validated<symbolicDist> = t => t -> valiLognormal -> #LognormalR -> f
|
||||||
|
let uniformConstr: uniform => validated<symbolicDist> = t => t -> valiUniform -> #UniformR -> f
|
||||||
|
let floatConstr: float => validated<symbolicDist> = t => t -> valiFloat -> #FloatR -> f
|
||||||
|
|
Loading…
Reference in New Issue
Block a user