scoring.js (3189B)
1 import { BaseDist } from "../dist/BaseDist.js"; 2 import * as distOperations from "../dist/distOperations/index.js"; 3 import { REArgumentError, REDistributionError } from "../errors/messages.js"; 4 import { makeDefinition } from "../library/registry/fnDefinition.js"; 5 import { frDist, frDistOrNumber, frDict } from "../library/registry/frTypes.js"; 6 import { FnFactory } from "../library/registry/helpers.js"; 7 import { vNumber } from "../value/index.js"; 8 const maker = new FnFactory({ 9 nameSpace: "Dist", 10 requiresNamespace: true, 11 }); 12 const runScoringScalarAnswer = (estimate, answer, prior, env) => { 13 const result = distOperations.logScoreScalarAnswer({ 14 estimate, 15 answer, 16 prior, 17 env, 18 }); 19 if (!result.ok) { 20 throw new REDistributionError(result.value); 21 } 22 return vNumber(result.value); 23 }; 24 const runScoringDistAnswer = (estimate, answer, prior, env) => { 25 const result = distOperations.logScoreDistAnswer({ 26 estimate, 27 answer, 28 prior, 29 env, 30 }); 31 if (!result.ok) { 32 throw new REDistributionError(result.value); 33 } 34 return vNumber(result.value); 35 }; 36 export const library = [ 37 maker.make({ 38 name: "logScore", 39 output: "Number", 40 examples: [ 41 "Dist.logScore({estimate: Sym.normal(5,2), answer: Sym.normal(5.2,1), prior: Sym.normal(5.5,3)})", 42 "Dist.logScore({estimate: Sym.normal(5,2), answer: Sym.normal(5.2,1)})", 43 "Dist.logScore({estimate: Sym.normal(5,2), answer: 4.5})", 44 ], 45 definitions: [ 46 makeDefinition([ 47 frDict(["estimate", frDist], ["answer", frDistOrNumber], ["prior", frDist]), 48 ], ([{ estimate, answer, prior }], context) => { 49 if (answer instanceof BaseDist) { 50 return runScoringDistAnswer(estimate, answer, prior, context.environment); 51 } 52 else if (typeof answer === "number") { 53 return runScoringScalarAnswer(estimate, answer, prior, context.environment); 54 } 55 else { 56 throw new REArgumentError("Impossible type"); 57 } 58 }), 59 makeDefinition([frDict(["estimate", frDist], ["answer", frDistOrNumber])], ([{ estimate, answer }], context) => { 60 if (answer instanceof BaseDist) { 61 return runScoringDistAnswer(estimate, answer, undefined, context.environment); 62 } 63 else if (typeof answer === "number") { 64 return runScoringScalarAnswer(estimate, answer, undefined, context.environment); 65 } 66 else { 67 throw new REArgumentError("Impossible type"); 68 } 69 }), 70 ], 71 }), 72 maker.make({ 73 name: "klDivergence", 74 output: "Number", 75 examples: ["Dist.klDivergence(Sym.normal(5,2), Sym.normal(5,1.5))"], 76 definitions: [ 77 makeDefinition([frDist, frDist], ([estimate, d], context) => runScoringDistAnswer(estimate, d, undefined, context.environment)), 78 ], 79 }), 80 ]; 81 //# sourceMappingURL=scoring.js.map