mixture.js (3241B)
1 import { argumentError } from "../dist/DistError.js"; 2 import * as distOperations from "../dist/distOperations/index.js"; 3 import { parseDistFromDistOrNumber, unpackDistResult, } from "../library/registry/helpers.js"; 4 import { REDistributionError } from "../errors/messages.js"; 5 import * as E_A from "../utility/E_A.js"; 6 import { vDist } from "../value/index.js"; 7 import { makeDefinition } from "../library/registry/fnDefinition.js"; 8 import { frArray, frDistOrNumber, frNumber, frTuple, } from "../library/registry/frTypes.js"; 9 function mixtureWithGivenWeights(distributions, weights, env) { 10 return vDist(unpackDistResult(distOperations.mixture(E_A.zip(distributions, weights), { env }))); 11 } 12 function mixtureWithDefaultWeights(distributions, env) { 13 const length = distributions.length; 14 const weights = new Array(length).fill(1 / length); 15 return mixtureWithGivenWeights(distributions, weights, env); 16 } 17 const singleArrayDef = makeDefinition([frArray(frDistOrNumber)], ([ar], { environment }) => mixtureWithDefaultWeights(ar.map(parseDistFromDistOrNumber), environment)); 18 const twoArraysDef = makeDefinition([frArray(frDistOrNumber), frArray(frNumber)], ([dists, weights], { environment }) => { 19 if (dists.length !== weights.length) { 20 throw new REDistributionError(argumentError("Error, mixture call has different number of distributions and weights")); 21 } 22 return mixtureWithGivenWeights(dists.map(parseDistFromDistOrNumber), weights, environment); 23 }); 24 const twoToFiveDistsWithWeightsDefs = [ 25 makeDefinition([frDistOrNumber, frDistOrNumber, frTuple(frNumber, frNumber)], ([dist1, dist2, weights], { environment }) => mixtureWithGivenWeights([dist1, dist2].map(parseDistFromDistOrNumber), weights, environment)), 26 makeDefinition([ 27 frDistOrNumber, 28 frDistOrNumber, 29 frDistOrNumber, 30 frTuple(frNumber, frNumber, frNumber), 31 ], ([dist1, dist2, dist3, weights], { environment }) => mixtureWithGivenWeights([dist1, dist2, dist3].map(parseDistFromDistOrNumber), weights, environment)), 32 makeDefinition([ 33 frDistOrNumber, 34 frDistOrNumber, 35 frDistOrNumber, 36 frDistOrNumber, 37 frTuple(frNumber, frNumber, frNumber, frNumber), 38 ], ([dist1, dist2, dist3, dist4, weights], { environment }) => mixtureWithGivenWeights([dist1, dist2, dist3, dist4].map(parseDistFromDistOrNumber), weights, environment)), 39 makeDefinition([ 40 frDistOrNumber, 41 frDistOrNumber, 42 frDistOrNumber, 43 frDistOrNumber, 44 frDistOrNumber, 45 frTuple(frNumber, frNumber, frNumber, frNumber, frNumber), 46 ], ([dist1, dist2, dist3, dist4, dist5, weights], { environment }) => mixtureWithGivenWeights([dist1, dist2, dist3, dist4, dist5].map(parseDistFromDistOrNumber), weights, environment)), 47 ]; 48 const oneToFiveDistsDefs = Array.from({ length: 5 }, (_, i) => { 49 const frArgs = new Array(i + 1).fill(frDistOrNumber); 50 return makeDefinition(frArgs, (args, { environment }) => mixtureWithDefaultWeights(args.map(parseDistFromDistOrNumber), environment)); 51 }); 52 export const mixtureDefinitions = [ 53 singleArrayDef, 54 twoArraysDef, 55 ...twoToFiveDistsWithWeightsDefs, 56 ...oneToFiveDistsDefs, 57 ]; 58 //# sourceMappingURL=mixture.js.map