Merge pull request #498 from quantified-uncertainty/mx-polymorph

`mx`/`mixture` polymorphism
This commit is contained in:
Ozzie Gooen 2022-05-09 15:55:56 -04:00 committed by GitHub
commit 7e4ee94b7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -119,26 +119,43 @@ module Helpers = {
mixtureWithGivenWeights(distributions, weights) mixtureWithGivenWeights(distributions, weights)
} }
let mixture = (args: array<expressionValue>): DistributionOperation.outputType => let mixture = (args: array<expressionValue>): DistributionOperation.outputType => {
switch E.A.last(args) { let error = (err: string): DistributionOperation.outputType => err->ArgumentError->GenDistError
| Some(EvArray(b)) => { switch args {
let weights = parseNumberArray(b) | [EvArray(distributions)] =>
let distributions = parseDistributionArray( switch parseDistributionArray(distributions) {
Belt.Array.slice(args, ~offset=0, ~len=E.A.length(args) - 1), | Ok(distrs) => mixtureWithDefaultWeights(distrs)
) | Error(err) => error(err)
switch E.R.merge(distributions, weights) { }
| Ok(d, w) => mixtureWithGivenWeights(d, w) | [EvArray(distributions), EvArray(weights)] =>
| Error(err) => GenDistError(ArgumentError(err)) switch (parseDistributionArray(distributions), parseNumberArray(weights)) {
| (Ok(distrs), Ok(wghts)) => mixtureWithGivenWeights(distrs, wghts)
| (Error(err), Ok(_)) => error(err)
| (Ok(_), Error(err)) => error(err)
| (Error(err1), Error(err2)) => error(`${err1}|${err2}`)
}
| _ =>
switch E.A.last(args) {
| Some(EvArray(b)) => {
let weights = parseNumberArray(b)
let distributions = parseDistributionArray(
Belt.Array.slice(args, ~offset=0, ~len=E.A.length(args) - 1),
)
switch E.R.merge(distributions, weights) {
| Ok(d, w) => mixtureWithGivenWeights(d, w)
| Error(err) => error(err)
}
} }
| Some(EvNumber(_))
| Some(EvDistribution(_)) =>
switch parseDistributionArray(args) {
| Ok(distributions) => mixtureWithDefaultWeights(distributions)
| Error(err) => error(err)
}
| _ => error("Last argument of mx must be array or distribution")
} }
| Some(EvNumber(_))
| Some(EvDistribution(_)) =>
switch parseDistributionArray(args) {
| Ok(distributions) => mixtureWithDefaultWeights(distributions)
| Error(err) => GenDistError(ArgumentError(err))
}
| _ => GenDistError(ArgumentError("Last argument of mx must be array or distribution"))
} }
}
} }
module SymbolicConstructors = { module SymbolicConstructors = {