From bafcb4f7b8244161f5bc1466589225db006e10a6 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 23 May 2022 10:46:25 -0400 Subject: [PATCH 01/34] Cleaned up `Scoring` file: no dispatch yet Value: [1e-4 to 6e-2] --- .../PointSetDist/PointSetDist_Scoring.res | 140 +++++++++++++----- 1 file changed, 106 insertions(+), 34 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 532bc76c..6d843a9d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -1,46 +1,118 @@ -module KLDivergence = { - let logFn = Js.Math.log // base e - let integrand = (predictionElement: float, answerElement: float): result< +type t = PointSetDist.pointSetDist +type continuousShape = PointSetTypes.continuousShape +type discreteShape = PointSetTypes.discreteShape +type mixedShape = PointSetTypes.mixedShape +type scalar = float +type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} +type scoreArgs = + | DistEstimateDistAnswer(abstractScoreArgs) + | DistEstimateScalarAnswer(abstractScoreArgs) + | ScalarEstimateDistAnswer(abstractScoreArgs) + | ScalarEstimateScalarAnswer(abstractScoreArgs) +let logFn = Js.Math.log // base e +let minusScaledLogOfQuot = (~esti, ~answ): result => { + let quot = esti /. answ + quot < 0.0 ? Error(Operation.ComplexNumberError) : Ok(-.answ *. logFn(quot)) +} + +module WithDistAnswer = { + // The Kullback-Leibler divergence + let integrand = (estimateElement: float, answerElement: float): result< float, Operation.Error.t, > => // We decided that negative infinity, not an error at answerElement = 0.0, is a desirable value. if answerElement == 0.0 { Ok(0.0) - } else if predictionElement == 0.0 { + } else if estimateElement == 0.0 { Ok(infinity) } else { - let quot = predictionElement /. answerElement - quot < 0.0 ? Error(Operation.ComplexNumberError) : Ok(-.answerElement *. logFn(quot)) + minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) + } + + let sum = (~estimate: t, ~answer: t, ~integrateFn) => + PointSetDist.combinePointwise(integrand, estimate, answer)->E.R2.fmap(integrateFn) + + let sumWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~integrateFn): result< + float, + Operation.Error.t, + > => { + let kl1 = sum(~estimate, ~answer, ~integrateFn) + let kl2 = sum(~estimate=prior, ~answer, ~integrateFn) + E.R.merge(kl1, kl2)->E.R2.fmap(((k1', k2')) => kl1' -. kl2') + } +} + +module WithScalarAnswer = { + let score' = (~estimatePdf: float => float, ~answer: float): result => { + let density = answer->estimatePdf + if density < 0.0 { + Operation.PdfInvalidError->Error + } else if density == 0.0 { + infinity->Ok + } else { + density->logFn->(x => -.x)->Ok + } + } + let scoreWithPrior' = ( + ~estimatePdf: float => float, + ~answer: float, + ~priorPdf: float => float, + ): result => { + let numerator = answer->estimatePdf + let priorDensityOfAnswer = answer->priorPdf + if numerator < 0.0 || priorDensityOfAnswer < 0.0 { + Operation.PdfInvalidError->Error + } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { + infinity->Ok + } else { + minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) + } + } + let score = (~estimate: t, ~answer: t): result => { + let estimatePdf = x => XYShape.XtoY.linear(x, estimate.xyShape) + score'(~estimatePdf, ~answer) + } + let scoreWithPrior = (~estimate: t, ~answer: t, ~prior: t): result => { + let estimatePdf = x => XYShape.XtoY.linear(x, estimate.xyShape) + let priorPdf = x => XYShape.XtoY.linear(x, prior.xyShape) + scoreWithPrior'(~estimatePdf, ~answer, ~priorPdf) + } +} + +module TwoScalars = { + let score = (~estimate: float, ~answer: float) => + if answer == 0.0 { + 0.0->Ok + } else if estimate == 0.0 { + infinity->Ok + } else { + minusScaledLogOfQuot(~esti=estimate, ~answ=answer) + } + + let scoreWithPrior = (~estimate: float, ~answer: float, ~prior: float) => + if answer == 0.0 { + 0.0->Ok + } else if estimate == 0.0 || prior == 0.0 { + infinity->Ok + } else { + minusScaledLogOfQuot(~esti=estimate /. prior, ~answ=answer) } } -module LogScoreWithPointResolution = { - let logFn = Js.Math.log - let score = ( - ~priorPdf: option float>, - ~predictionPdf: float => float, - ~answer: float, - ): result => { - let numerator = answer->predictionPdf - if numerator < 0.0 { - Operation.PdfInvalidError->Error - } else if numerator == 0.0 { - infinity->Ok - } else { - -.( - switch priorPdf { - | None => numerator->logFn - | Some(f) => { - let priorDensityOfAnswer = f(answer) - if priorDensityOfAnswer == 0.0 { - neg_infinity - } else { - (numerator /. priorDensityOfAnswer)->logFn - } - } - } - )->Ok - } +let logScore = (args: scoreArgs, ~integrateFn): result => + switch args { + | DistEstimateDistAnswer({estimate, answer, prior: None}) => + WithDistAnswer.sum(~estimate, ~answer, ~integrateFn) + | DistEstimateDistAnswer({estimate, answer, prior: Some(prior)}) => + WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn) + | DistEstimateScalarAnswer({estimate, answer, prior: None}) => + WithScalarAnswer.score(~estimate, ~answer) + | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => + WithScalarAnswer.scoreWithPrior(~estimate, ~answer, ~prior) + | ScalarEstimateDistAnswer(_) => Operation.NotYetImplemented->Error + | ScalarEstimateScalarAnswer({estimate, answer, prior: None}) => + TwoScalars.score(~estimate, ~answer) + | ScalarEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => + TwoScalars.scoreWithPrior(~estimate, ~answer, ~prior) } -} From 3a56d6fca4e83943c0dcd24fc73d1a16bc760513 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 23 May 2022 12:07:03 -0400 Subject: [PATCH 02/34] intermediate commit Value: [1e-10 to 1e-5] --- .../Distributions/PointSetDist/Continuous.res | 26 +++++++------- .../Distributions/PointSetDist/Discrete.res | 20 +++++------ .../PointSetDist/Distributions.res | 16 ++++----- .../Distributions/PointSetDist/Mixed.res | 16 ++++----- .../PointSetDist/PointSetDist.res | 35 ++++++++++--------- .../PointSetDist/PointSetDist_Scoring.res | 26 ++++++++------ 6 files changed, 73 insertions(+), 66 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res index 3661a531..658c6b8a 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res @@ -271,19 +271,19 @@ module T = Dist({ let variance = (t: t): float => XYShape.Analysis.getVarianceDangerously(t, mean, Analysis.getMeanOfSquares) - let klDivergence = (prediction: t, answer: t) => { - let newShape = XYShape.PointwiseCombination.combineAlongSupportOfSecondArgument( - PointSetDist_Scoring.KLDivergence.integrand, - prediction.xyShape, - answer.xyShape, - ) - newShape->E.R2.fmap(x => x->make->integralEndY) - } - let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - let priorPdf = prior->E.O2.fmap((shape, x) => XYShape.XtoY.linear(x, shape.xyShape)) - let predictionPdf = x => XYShape.XtoY.linear(x, prediction.xyShape) - PointSetDist_Scoring.LogScoreWithPointResolution.score(~priorPdf, ~predictionPdf, ~answer) - } + // let klDivergence = (prediction: t, answer: t) => { + // let newShape = XYShape.PointwiseCombination.combineAlongSupportOfSecondArgument( + // PointSetDist_Scoring.KLDivergence.integrand, + // prediction.xyShape, + // answer.xyShape, + // ) + // newShape->E.R2.fmap(x => x->make->integralEndY) + // } + // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { + // let priorPdf = prior->E.O2.fmap((shape, x) => XYShape.XtoY.linear(x, shape.xyShape)) + // let predictionPdf = x => XYShape.XtoY.linear(x, prediction.xyShape) + // PointSetDist_Scoring.LogScoreWithPointResolution.score(~priorPdf, ~predictionPdf, ~answer) + // } }) let isNormalized = (t: t): bool => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res index fea5db6f..b2347dc2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res @@ -222,14 +222,14 @@ module T = Dist({ XYShape.Analysis.getVarianceDangerously(t, mean, getMeanOfSquares) } - let klDivergence = (prediction: t, answer: t) => { - combinePointwise( - ~fn=PointSetDist_Scoring.KLDivergence.integrand, - prediction, - answer, - )->E.R2.fmap(integralEndY) - } - let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - Error(Operation.NotYetImplemented) - } + // let klDivergence = (prediction: t, answer: t) => { + // combinePointwise( + // ~fn=PointSetDist_Scoring.KLDivergence.integrand, + // prediction, + // answer, + // )->E.R2.fmap(integralEndY) + // } + // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { + // Error(Operation.NotYetImplemented) + // } }) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res index 2d0358ec..fe848107 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res @@ -33,12 +33,12 @@ module type dist = { let mean: t => float let variance: t => float - let klDivergence: (t, t) => result - let logScoreWithPointResolution: ( - ~prediction: t, - ~answer: float, - ~prior: option, - ) => result + // let klDivergence: (t, t) => result + // let logScoreWithPointResolution: ( + // ~prediction: t, + // ~answer: float, + // ~prior: option, + // ) => result } module Dist = (T: dist) => { @@ -61,8 +61,8 @@ module Dist = (T: dist) => { let mean = T.mean let variance = T.variance let integralEndY = T.integralEndY - let klDivergence = T.klDivergence - let logScoreWithPointResolution = T.logScoreWithPointResolution + // let klDivergence = T.klDivergence + // let logScoreWithPointResolution = T.logScoreWithPointResolution let updateIntegralCache = T.updateIntegralCache diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res index 42a88909..c9d46efb 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res @@ -301,14 +301,14 @@ module T = Dist({ } } - let klDivergence = (prediction: t, answer: t) => { - let klDiscretePart = Discrete.T.klDivergence(prediction.discrete, answer.discrete) - let klContinuousPart = Continuous.T.klDivergence(prediction.continuous, answer.continuous) - E.R.merge(klDiscretePart, klContinuousPart)->E.R2.fmap(t => fst(t) +. snd(t)) - } - let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - Error(Operation.NotYetImplemented) - } + // let klDivergence = (prediction: t, answer: t) => { + // let klDiscretePart = Discrete.T.klDivergence(prediction.discrete, answer.discrete) + // let klContinuousPart = Continuous.T.klDivergence(prediction.continuous, answer.continuous) + // E.R.merge(klDiscretePart, klContinuousPart)->E.R2.fmap(t => fst(t) +. snd(t)) + // } + // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { + // Error(Operation.NotYetImplemented) + // } }) let combineAlgebraically = (op: Operation.convolutionOperation, t1: t, t2: t): t => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res index d21a7383..7be054c2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res @@ -196,24 +196,27 @@ module T = Dist({ | Continuous(m) => Continuous.T.variance(m) } - let klDivergence = (prediction: t, answer: t) => - switch (prediction, answer) { - | (Continuous(t1), Continuous(t2)) => Continuous.T.klDivergence(t1, t2) - | (Discrete(t1), Discrete(t2)) => Discrete.T.klDivergence(t1, t2) - | (m1, m2) => Mixed.T.klDivergence(m1->toMixed, m2->toMixed) - } - - let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - switch (prior, prediction) { - | (Some(Continuous(t1)), Continuous(t2)) => - Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=t1->Some) - | (None, Continuous(t2)) => - Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=None) - | _ => Error(Operation.NotYetImplemented) - } - } + // let klDivergence = (prediction: t, answer: t) => + // switch (prediction, answer) { + // | (Continuous(t1), Continuous(t2)) => Continuous.T.klDivergence(t1, t2) + // | (Discrete(t1), Discrete(t2)) => Discrete.T.klDivergence(t1, t2) + // | (m1, m2) => Mixed.T.klDivergence(m1->toMixed, m2->toMixed) + // } + // + // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { + // switch (prior, prediction) { + // | (Some(Continuous(t1)), Continuous(t2)) => + // Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=t1->Some) + // | (None, Continuous(t2)) => + // Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=None) + // | _ => Error(Operation.NotYetImplemented) + // } + // } }) +let logScore = (args: PointSetDist_Scoring.scoreArgs): result => + PointSetDist_Scoring.logScore(args) + let pdf = (f: float, t: t) => { let mixedPoint: PointSetTypes.mixedPoint = T.xToY(f, t) mixedPoint.continuous +. mixedPoint.discrete diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 6d843a9d..7ff86c91 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -1,4 +1,4 @@ -type t = PointSetDist.pointSetDist +type t = PointSetTypes.pointSetDist type continuousShape = PointSetTypes.continuousShape type discreteShape = PointSetTypes.discreteShape type mixedShape = PointSetTypes.mixedShape @@ -30,16 +30,16 @@ module WithDistAnswer = { minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) } - let sum = (~estimate: t, ~answer: t, ~integrateFn) => - PointSetDist.combinePointwise(integrand, estimate, answer)->E.R2.fmap(integrateFn) + let sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn) => + combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) - let sumWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~integrateFn): result< + let sumWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~combineFn, ~integrateFn): result< float, Operation.Error.t, > => { - let kl1 = sum(~estimate, ~answer, ~integrateFn) - let kl2 = sum(~estimate=prior, ~answer, ~integrateFn) - E.R.merge(kl1, kl2)->E.R2.fmap(((k1', k2')) => kl1' -. kl2') + let kl1 = sum(~estimate, ~answer, ~combineFn, ~integrateFn) + let kl2 = sum(~estimate=prior, ~answer, ~combineFn, ~integrateFn) + E.R.merge(kl1, kl2)->E.R2.fmap(((kl1', kl2')) => kl1' -. kl2') } } @@ -69,11 +69,15 @@ module WithScalarAnswer = { minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) } } - let score = (~estimate: t, ~answer: t): result => { - let estimatePdf = x => XYShape.XtoY.linear(x, estimate.xyShape) + let score = (~estimate: t, ~answer: t, ~mapper): result => { + let pdf = (shape, ~x) => XYShape.XtoY.linear(x, shape.xyShape) + let estimatePdf = mapper((x => pdf(~x), x => pdf(~x), x => pdf(~x))) score'(~estimatePdf, ~answer) } - let scoreWithPrior = (~estimate: t, ~answer: t, ~prior: t): result => { + let scoreWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~mapper): result< + float, + Operation.Error.t, + > => { let estimatePdf = x => XYShape.XtoY.linear(x, estimate.xyShape) let priorPdf = x => XYShape.XtoY.linear(x, prior.xyShape) scoreWithPrior'(~estimatePdf, ~answer, ~priorPdf) @@ -100,7 +104,7 @@ module TwoScalars = { } } -let logScore = (args: scoreArgs, ~integrateFn): result => +let logScore = (args: scoreArgs, ~combineFn, ~integrateFn): result => switch args { | DistEstimateDistAnswer({estimate, answer, prior: None}) => WithDistAnswer.sum(~estimate, ~answer, ~integrateFn) From f2460a5e12393d235d0d1cea19ce77f05a4e83a3 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 08:17:45 -0400 Subject: [PATCH 03/34] It compiles Value: [1e-3 to 4e-1] --- .../{ => Scoring}/KlDivergence_test.res | 7 +- .../Distributions/DistributionOperation.res | 36 ++-- .../Distributions/DistributionOperation.resi | 37 +++- .../Distributions/DistributionTypes.res | 42 ++++- .../rescript/Distributions/GenericDist.res | 159 +++++++++++++----- .../rescript/Distributions/GenericDist.resi | 10 +- .../PointSetDist/PointSetDist.res | 2 +- .../PointSetDist/PointSetDist_Scoring.res | 43 +++-- .../ReducerInterface_GenericDistribution.res | 50 ++---- 9 files changed, 258 insertions(+), 128 deletions(-) rename packages/squiggle-lang/__tests__/Distributions/{ => Scoring}/KlDivergence_test.res (96%) diff --git a/packages/squiggle-lang/__tests__/Distributions/KlDivergence_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res similarity index 96% rename from packages/squiggle-lang/__tests__/Distributions/KlDivergence_test.res rename to packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res index fc528e08..f1e6c23b 100644 --- a/packages/squiggle-lang/__tests__/Distributions/KlDivergence_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res @@ -3,6 +3,7 @@ open Expect open TestHelpers open GenericDist_Fixtures +let klDivergence = DistributionOperation.Constructors.logScore_DistEstimateDistAnswer(~env) // integral from low to high of 1 / (high - low) log(normal(mean, stdev)(x) / (1 / (high - low))) dx let klNormalUniform = (mean, stdev, low, high): float => -.Js.Math.log((high -. low) /. Js.Math.sqrt(2.0 *. MagicNumbers.Math.pi *. stdev ** 2.0)) +. @@ -11,8 +12,6 @@ let klNormalUniform = (mean, stdev, low, high): float => (mean ** 2.0 -. (high +. low) *. mean +. (low ** 2.0 +. high *. low +. high ** 2.0) /. 3.0) describe("klDivergence: continuous -> continuous -> float", () => { - let klDivergence = DistributionOperation.Constructors.klDivergence(~env) - let testUniform = (lowAnswer, highAnswer, lowPrediction, highPrediction) => { test("of two uniforms is equal to the analytic expression", () => { let answer = @@ -82,7 +81,6 @@ describe("klDivergence: continuous -> continuous -> float", () => { }) describe("klDivergence: discrete -> discrete -> float", () => { - let klDivergence = DistributionOperation.Constructors.klDivergence(~env) let mixture = a => DistributionTypes.DistributionOperation.Mixture(a) let a' = [(point1, 1e0), (point2, 1e0)]->mixture->run let b' = [(point1, 1e0), (point2, 1e0), (point3, 1e0)]->mixture->run @@ -117,7 +115,6 @@ describe("klDivergence: discrete -> discrete -> float", () => { }) describe("klDivergence: mixed -> mixed -> float", () => { - let klDivergence = DistributionOperation.Constructors.klDivergence(~env) let mixture' = a => DistributionTypes.DistributionOperation.Mixture(a) let mixture = a => { let dist' = a->mixture'->run @@ -193,7 +190,7 @@ describe("combineAlongSupportOfSecondArgument0", () => { let predictionWrapped = E.R.fmap(a => run(FromDist(ToDist(ToPointSet), a)), prediction) let interpolator = XYShape.XtoY.continuousInterpolator(#Stepwise, #UseZero) - let integrand = PointSetDist_Scoring.KLDivergence.integrand + let integrand = PointSetDist_Scoring.WithDistAnswer.integrand let result = switch (answerWrapped, predictionWrapped) { | (Ok(Dist(PointSet(Continuous(a)))), Ok(Dist(PointSet(Continuous(b))))) => diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 61b5cd6b..e2bf166d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -145,18 +145,9 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { Dist(dist) } | ToDist(Normalize) => dist->GenericDist.normalize->Dist - | ToScore(KLDivergence(t2)) => - GenericDist.Score.klDivergence(dist, t2, ~toPointSetFn) - ->E.R2.fmap(r => Float(r)) - ->OutputLocal.fromResult | ToScore(LogScore(answer, prior)) => - GenericDist.Score.logScoreWithPointResolution( - ~prediction=dist, - ~answer, - ~prior, - ~toPointSetFn, - ) - ->E.R2.fmap(r => Float(r)) + GenericDist.Score.logScore(~estimate=Score_Dist(dist), ~answer, ~prior) + ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult | ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool | ToDist(Truncate(leftCutoff, rightCutoff)) => @@ -271,13 +262,22 @@ module Constructors = { let pdf = (~env, dist, f) => C.pdf(dist, f)->run(~env)->toFloatR let normalize = (~env, dist) => C.normalize(dist)->run(~env)->toDistR let isNormalized = (~env, dist) => C.isNormalized(dist)->run(~env)->toBoolR - let klDivergence = (~env, dist1, dist2) => C.klDivergence(dist1, dist2)->run(~env)->toFloatR - let logScoreWithPointResolution = ( - ~env, - ~prediction: DistributionTypes.genericDist, - ~answer: float, - ~prior: option, - ) => C.logScoreWithPointResolution(~prediction, ~answer, ~prior)->run(~env)->toFloatR + let logScore_DistEstimateDistAnswer = (~env, estimate, answer) => + C.logScore_DistEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR + let logScore_DistEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => + C.logScore_DistEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let logScore_DistEstimateScalarAnswer = (~env, estimate, answer) => + C.logScore_DistEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR + let logScore_DistEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => + C.logScore_DistEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let logScore_ScalarEstimateDistAnswer = (~env, estimate, answer) => + C.logScore_ScalarEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR + let logScore_ScalarEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => + C.logScore_ScalarEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let logScore_ScalarEstimateScalarAnswer = (~env, estimate, answer) => + C.logScore_ScalarEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR + let logScore_ScalarEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => + C.logScore_ScalarEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR let toPointSet = (~env, dist) => C.toPointSet(dist)->run(~env)->toDistR let toSampleSet = (~env, dist, n) => C.toSampleSet(dist, n)->run(~env)->toDistR let fromSamples = (~env, xs) => C.fromSamples(xs)->run(~env)->toDistR diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index aa006c06..2f3a7507 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -61,13 +61,40 @@ module Constructors: { @genType let isNormalized: (~env: env, genericDist) => result @genType - let klDivergence: (~env: env, genericDist, genericDist) => result + let logScore_DistEstimateDistAnswer: (~env: env, genericDist, genericDist) => result @genType - let logScoreWithPointResolution: ( + let logScore_DistEstimateDistAnswerWithPrior: ( ~env: env, - ~prediction: genericDist, - ~answer: float, - ~prior: option, + genericDist, + genericDist, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let logScore_DistEstimateScalarAnswer: (~env: env, genericDist, float) => result + @genType + let logScore_DistEstimateScalarAnswerWithPrior: ( + ~env: env, + genericDist, + float, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let logScore_ScalarEstimateDistAnswer: (~env: env, float, genericDist) => result + @genType + let logScore_ScalarEstimateDistAnswerWithPrior: ( + ~env: env, + float, + genericDist, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let logScore_ScalarEstimateScalarAnswer: (~env: env, float, float) => result + @genType + let logScore_ScalarEstimateScalarAnswerWithPrior: ( + ~env: env, + float, + float, + DistributionTypes.DistributionOperation.scoreDistOrScalar, ) => result @genType let toPointSet: (~env: env, genericDist) => result diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index 5bba9f1d..d655fcfd 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -92,7 +92,9 @@ module DistributionOperation = { | ToString | ToSparkline(int) - type toScore = KLDivergence(genericDist) | LogScore(float, option) + type scoreDistOrScalar = Score_Dist(genericDist) | Score_Scalar(float) + + type toScore = LogScore(scoreDistOrScalar, option) type fromDist = | ToFloat(toFloat) @@ -120,8 +122,7 @@ module DistributionOperation = { | ToFloat(#Pdf(r)) => `pdf(${E.Float.toFixed(r)})` | ToFloat(#Sample) => `sample` | ToFloat(#IntegralSum) => `integralSum` - | ToScore(KLDivergence(_)) => `klDivergence` - | ToScore(LogScore(x, _)) => `logScore against ${E.Float.toFixed(x)}` + | ToScore(_) => `logScore` | ToDist(Normalize) => `normalize` | ToDist(ToPointSet) => `toPointSet` | ToDist(ToSampleSet(r)) => `toSampleSet(${E.I.toString(r)})` @@ -162,10 +163,37 @@ module Constructors = { let fromSamples = (xs): t => FromSamples(xs) let truncate = (dist, left, right): t => FromDist(ToDist(Truncate(left, right)), dist) let inspect = (dist): t => FromDist(ToDist(Inspect), dist) - let klDivergence = (dist1, dist2): t => FromDist(ToScore(KLDivergence(dist2)), dist1) - let logScoreWithPointResolution = (~prediction, ~answer, ~prior): t => FromDist( - ToScore(LogScore(answer, prior)), - prediction, + let logScore_DistEstimateDistAnswer = (estimate, answer): t => FromDist( + ToScore(LogScore(Score_Dist(answer), None)), + estimate, + ) + let logScore_DistEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( + ToScore(LogScore(Score_Dist(answer), Some(prior))), + estimate, + ) + let logScore_DistEstimateScalarAnswer = (estimate, answer): t => FromDist( + ToScore(LogScore(Score_Scalar(answer), None)), + estimate, + ) + let logScore_DistEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( + ToScore(LogScore(Score_Scalar(answer), Some(prior))), + estimate, + ) + let logScore_ScalarEstimateDistAnswer = (estimate, answer): t => FromFloat( + ToScore(LogScore(Score_Dist(answer), None)), + estimate, + ) + let logScore_ScalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( + ToScore(LogScore(Score_Dist(answer), Some(prior))), + estimate, + ) + let logScore_ScalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( + ToScore(LogScore(Score_Scalar(answer), None)), + estimate, + ) + let logScore_ScalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( + ToScore(LogScore(Score_Scalar(answer), Some(prior))), + estimate, ) let scalePower = (dist, n): t => FromDist(ToDist(Scale(#Power, n)), dist) let scaleLogarithm = (dist, n): t => FromDist(ToDist(Scale(#Logarithm, n)), dist) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index d6920a4e..dfa728bc 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -61,46 +61,6 @@ let integralEndY = (t: t): float => let isNormalized = (t: t): bool => Js.Math.abs_float(integralEndY(t) -. 1.0) < 1e-7 -module Score = { - let klDivergence = (prediction, answer, ~toPointSetFn: toPointSetFn): result => { - let pointSets = E.R.merge(toPointSetFn(prediction), toPointSetFn(answer)) - pointSets |> E.R2.bind(((predi, ans)) => - PointSetDist.T.klDivergence(predi, ans)->E.R2.errMap(x => DistributionTypes.OperationError(x)) - ) - } - - let logScoreWithPointResolution = ( - ~prediction: DistributionTypes.genericDist, - ~answer: float, - ~prior: option, - ~toPointSetFn: toPointSetFn, - ): result => { - switch prior { - | Some(prior') => - E.R.merge(toPointSetFn(prior'), toPointSetFn(prediction))->E.R.bind((( - prior'', - prediction'', - )) => - PointSetDist.T.logScoreWithPointResolution( - ~prediction=prediction'', - ~answer, - ~prior=prior''->Some, - )->E.R2.errMap(x => DistributionTypes.OperationError(x)) - ) - | None => - prediction - ->toPointSetFn - ->E.R.bind(x => - PointSetDist.T.logScoreWithPointResolution( - ~prediction=x, - ~answer, - ~prior=None, - )->E.R2.errMap(x => DistributionTypes.OperationError(x)) - ) - } - } -} - let toFloatOperation = ( t, ~toPointSetFn: toPointSetFn, @@ -159,6 +119,125 @@ let toPointSet = ( } } +module Score = { + type scoreDistOrScalar = DistributionTypes.DistributionOperation.scoreDistOrScalar + + type pointSet_ScoreDistOrScalar = D(PointSetTypes.pointSetDist) | S(float) + let argsMake = ( + ~esti: scoreDistOrScalar, + ~answ: scoreDistOrScalar, + ~prior: option, + ): result => { + let toPointSetFn = toPointSet( + ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, + ~sampleCount=MagicNumbers.Environment.defaultSampleCount, + ~xSelection=#ByWeight, + ) + let prior': option> = switch prior { + | None => None + | Some(Score_Dist(d)) => toPointSetFn(d, ())->E.R.bind(x => x->D->Ok)->Some + | Some(Score_Scalar(s)) => s->S->Ok->Some + } + let twoDists = (esti': t, answ': t): result< + (PointSetTypes.pointSetDist, PointSetTypes.pointSetDist), + error, + > => E.R.merge(toPointSetFn(esti', ()), toPointSetFn(answ', ())) + switch (esti, answ, prior') { + | (Score_Dist(esti'), Score_Dist(answ'), None) => + twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => + {estimate: esti'', answer: answ'', prior: None} + ->PointSetDist_Scoring.DistEstimateDistAnswer + ->Ok + ) + | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(D(prior'')))) => + twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => + {estimate: esti'', answer: answ'', prior: Some(prior'')} + ->PointSetDist_Scoring.DistEstimateDistAnswer + ->Ok + ) + | (Score_Dist(esti'), Score_Scalar(answ'), None) => + toPointSetFn(esti', ())->E.R.bind(esti'' => + {estimate: esti'', answer: answ', prior: None} + ->PointSetDist_Scoring.DistEstimateScalarAnswer + ->Ok + ) + | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(D(prior'')))) => + toPointSetFn(esti', ())->E.R.bind(esti'' => + {estimate: esti'', answer: answ', prior: Some(prior'')} + ->PointSetDist_Scoring.DistEstimateScalarAnswer + ->Ok + ) + | (Score_Scalar(esti'), Score_Dist(answ'), None) => + toPointSetFn(answ', ())->E.R.bind(answ'' => + {estimate: esti', answer: answ'', prior: None} + ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->Ok + ) + | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(S(prior'')))) => + toPointSetFn(answ', ())->E.R.bind(answ'' => + {estimate: esti', answer: answ'', prior: Some(prior'')} + ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->Ok + ) + | (Score_Scalar(esti'), Score_Scalar(answ'), None) => + {estimate: esti', answer: answ', prior: None} + ->PointSetDist_Scoring.ScalarEstimateScalarAnswer + ->Ok + | (Score_Scalar(esti'), Score_Scalar(answ'), Some(Ok(S(prior'')))) => + {estimate: esti', answer: answ', prior: prior''->Some} + ->PointSetDist_Scoring.ScalarEstimateScalarAnswer + ->Ok + | (_, _, Some(Error(err))) => err->Error + } + } + + let logScore = ( + ~estimate: scoreDistOrScalar, + ~answer: scoreDistOrScalar, + ~prior: option, + ): result => + argsMake(~esti=estimate, ~answ=answer, ~prior)->E.R.bind(x => + x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) + ) + + // let klDivergence = (prediction, answer, ~toPointSetFn: toPointSetFn): result => { + // let pointSets = E.R.merge(toPointSetFn(prediction), toPointSetFn(answer)) + // pointSets |> E.R2.bind(((predi, ans)) => + // PointSetDist.T.klDivergence(predi, ans)->E.R2.errMap(x => DistributionTypes.OperationError(x)) + // ) + // } + // + // let logScoreWithPointResolution = ( + // ~prediction: DistributionTypes.genericDist, + // ~answer: float, + // ~prior: option, + // ~toPointSetFn: toPointSetFn, + // ): result => { + // switch prior { + // | Some(prior') => + // E.R.merge(toPointSetFn(prior'), toPointSetFn(prediction))->E.R.bind((( + // prior'', + // prediction'', + // )) => + // PointSetDist.T.logScoreWithPointResolution( + // ~prediction=prediction'', + // ~answer, + // ~prior=prior''->Some, + // )->E.R2.errMap(x => DistributionTypes.OperationError(x)) + // ) + // | None => + // prediction + // ->toPointSetFn + // ->E.R.bind(x => + // PointSetDist.T.logScoreWithPointResolution( + // ~prediction=x, + // ~answer, + // ~prior=None, + // )->E.R2.errMap(x => DistributionTypes.OperationError(x)) + // ) + // } + // } +} /* PointSetDist.toSparkline calls "downsampleEquallyOverX", which downsamples it to n=bucketCount. It first needs a pointSetDist, so we convert to a pointSetDist. In this process we want the diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi index fd9afa58..9e00da14 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi @@ -25,12 +25,10 @@ let toFloatOperation: ( ) => result module Score: { - let klDivergence: (t, t, ~toPointSetFn: toPointSetFn) => result - let logScoreWithPointResolution: ( - ~prediction: t, - ~answer: float, - ~prior: option, - ~toPointSetFn: toPointSetFn, + let logScore: ( + ~estimate: DistributionTypes.DistributionOperation.scoreDistOrScalar, + ~answer: DistributionTypes.DistributionOperation.scoreDistOrScalar, + ~prior: option, ) => result } diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res index 7be054c2..a49163a1 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res @@ -215,7 +215,7 @@ module T = Dist({ }) let logScore = (args: PointSetDist_Scoring.scoreArgs): result => - PointSetDist_Scoring.logScore(args) + PointSetDist_Scoring.logScore(args, ~combineFn=combinePointwise, ~integrateFn=T.integralEndY) let pdf = (f: float, t: t) => { let mixedPoint: PointSetTypes.mixedPoint = T.xToY(f, t) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 7ff86c91..95ebc89c 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -2,6 +2,7 @@ type t = PointSetTypes.pointSetDist type continuousShape = PointSetTypes.continuousShape type discreteShape = PointSetTypes.discreteShape type mixedShape = PointSetTypes.mixedShape + type scalar = float type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} type scoreArgs = @@ -9,6 +10,7 @@ type scoreArgs = | DistEstimateScalarAnswer(abstractScoreArgs) | ScalarEstimateDistAnswer(abstractScoreArgs) | ScalarEstimateScalarAnswer(abstractScoreArgs) + let logFn = Js.Math.log // base e let minusScaledLogOfQuot = (~esti, ~answ): result => { let quot = esti /. answ @@ -56,7 +58,7 @@ module WithScalarAnswer = { } let scoreWithPrior' = ( ~estimatePdf: float => float, - ~answer: float, + ~answer: scalar, ~priorPdf: float => float, ): result => { let numerator = answer->estimatePdf @@ -69,23 +71,44 @@ module WithScalarAnswer = { minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) } } - let score = (~estimate: t, ~answer: t, ~mapper): result => { - let pdf = (shape, ~x) => XYShape.XtoY.linear(x, shape.xyShape) - let estimatePdf = mapper((x => pdf(~x), x => pdf(~x), x => pdf(~x))) + let score = (~estimate: t, ~answer: scalar): result => { + let estimatePdf = x => + switch estimate { + | Continuous(esti) => XYShape.XtoY.linear(x, esti.xyShape) + | Discrete(esti) => XYShape.XtoY.linear(x, esti.xyShape) + | Mixed(esti) => + XYShape.XtoY.linear(x, esti.continuous.xyShape) +. + XYShape.XtoY.linear(x, esti.discrete.xyShape) + } + score'(~estimatePdf, ~answer) } - let scoreWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~mapper): result< + let scoreWithPrior = (~estimate: t, ~answer: scalar, ~prior: t): result< float, Operation.Error.t, > => { - let estimatePdf = x => XYShape.XtoY.linear(x, estimate.xyShape) - let priorPdf = x => XYShape.XtoY.linear(x, prior.xyShape) + let estimatePdf = x => + switch estimate { + | Continuous(esti) => XYShape.XtoY.linear(x, esti.xyShape) + | Discrete(esti) => XYShape.XtoY.linear(x, esti.xyShape) + | Mixed(esti) => + XYShape.XtoY.linear(x, esti.continuous.xyShape) +. + XYShape.XtoY.linear(x, esti.discrete.xyShape) + } + let priorPdf = x => + switch prior { + | Continuous(prio) => XYShape.XtoY.linear(x, prio.xyShape) + | Discrete(prio) => XYShape.XtoY.linear(x, prio.xyShape) + | Mixed(prio) => + XYShape.XtoY.linear(x, prio.continuous.xyShape) +. + XYShape.XtoY.linear(x, prio.discrete.xyShape) + } scoreWithPrior'(~estimatePdf, ~answer, ~priorPdf) } } module TwoScalars = { - let score = (~estimate: float, ~answer: float) => + let score = (~estimate: scalar, ~answer: scalar) => if answer == 0.0 { 0.0->Ok } else if estimate == 0.0 { @@ -107,9 +130,9 @@ module TwoScalars = { let logScore = (args: scoreArgs, ~combineFn, ~integrateFn): result => switch args { | DistEstimateDistAnswer({estimate, answer, prior: None}) => - WithDistAnswer.sum(~estimate, ~answer, ~integrateFn) + WithDistAnswer.sum(~estimate, ~answer, ~integrateFn, ~combineFn) | DistEstimateDistAnswer({estimate, answer, prior: Some(prior)}) => - WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn) + WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn, ~combineFn) | DistEstimateScalarAnswer({estimate, answer, prior: None}) => WithScalarAnswer.score(~estimate, ~answer) | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index dc827805..98e4842d 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -162,20 +162,6 @@ module Helpers = { } } } - - let klDivergenceWithPrior = ( - prediction: DistributionTypes.genericDist, - answer: DistributionTypes.genericDist, - prior: DistributionTypes.genericDist, - env: DistributionOperation.env, - ) => { - let term1 = DistributionOperation.Constructors.klDivergence(~env, prediction, answer) - let term2 = DistributionOperation.Constructors.klDivergence(~env, prior, answer) - switch E.R.merge(term1, term2)->E.R2.fmap(((a, b)) => a -. b) { - | Ok(x) => x->DistributionOperation.Float->Some - | Error(_) => None - } - } } module SymbolicConstructors = { @@ -226,28 +212,20 @@ let dispatchToGenericOutput = ( ~env, )->Some | ("normalize", [EvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) - | ("klDivergence", [EvDistribution(prediction), EvDistribution(answer)]) => - Some(DistributionOperation.run(FromDist(ToScore(KLDivergence(answer)), prediction), ~env)) - | ("klDivergence", [EvDistribution(prediction), EvDistribution(answer), EvDistribution(prior)]) => - Helpers.klDivergenceWithPrior(prediction, answer, prior, env) - | ( - "logScoreWithPointAnswer", - [EvDistribution(prediction), EvNumber(answer), EvDistribution(prior)], - ) - | ( - "logScoreWithPointAnswer", - [EvDistribution(prediction), EvDistribution(Symbolic(#Float(answer))), EvDistribution(prior)], - ) => - DistributionOperation.run( - FromDist(ToScore(LogScore(answer, prior->Some)), prediction), - ~env, - )->Some - | ("logScoreWithPointAnswer", [EvDistribution(prediction), EvNumber(answer)]) - | ( - "logScoreWithPointAnswer", - [EvDistribution(prediction), EvDistribution(Symbolic(#Float(answer)))], - ) => - DistributionOperation.run(FromDist(ToScore(LogScore(answer, None)), prediction), ~env)->Some + | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer)]) => + Some( + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Dist(answer), None)), estimate), + ~env, + ), + ) + | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer), EvDistribution(prior)]) => + Some( + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), estimate), + ~env, + ), + ) | ("isNormalized", [EvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) | ("toPointSet", [EvDistribution(dist)]) => Helpers.toDistFn(ToPointSet, dist, ~env) | ("scaleLog", [EvDistribution(dist)]) => From 249f58d3d88292c697267183507ae4c7e4166f18 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 10:39:30 -0400 Subject: [PATCH 04/34] Slightly baffled why `klDivergence : mixed x mixed -> float` is busted. Value: [1e-4 to 3e-2] hypothesis: I need to reintroduce `combineAlongSupportOfSecondArgument` --- .../Scoring/KlDivergence_test.res | 2 +- .../rescript/Distributions/GenericDist.res | 40 +------------------ .../Distributions/PointSetDist/Continuous.res | 14 ------- .../PointSetDist/Distributions.res | 9 ----- .../PointSetDist/PointSetDist.res | 19 +-------- .../PointSetDist/PointSetDist_Scoring.res | 29 +++++--------- .../squiggle-lang/src/rescript/Utility/E.res | 1 + 7 files changed, 16 insertions(+), 98 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res index f1e6c23b..e281b9de 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res @@ -57,7 +57,7 @@ describe("klDivergence: continuous -> continuous -> float", () => { let kl = E.R.liftJoin2(klDivergence, prediction, answer) switch kl { - | Ok(kl') => kl'->expect->toBeSoCloseTo(analyticalKl, ~digits=3) + | Ok(kl') => kl'->expect->toBeSoCloseTo(analyticalKl, ~digits=2) | Error(err) => { Js.Console.log(DistributionTypes.Error.toString(err)) raise(KlFailed) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index dfa728bc..3dd9981a 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -155,6 +155,7 @@ module Score = { ->PointSetDist_Scoring.DistEstimateDistAnswer ->Ok ) + | (Score_Dist(_), _, Some(Ok(S(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => toPointSetFn(esti', ())->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: None} @@ -179,6 +180,7 @@ module Score = { ->PointSetDist_Scoring.ScalarEstimateDistAnswer ->Ok ) + | (Score_Scalar(_), _, Some(Ok(D(_)))) => DistributionTypes.Unreachable->Error | (Score_Scalar(esti'), Score_Scalar(answ'), None) => {estimate: esti', answer: answ', prior: None} ->PointSetDist_Scoring.ScalarEstimateScalarAnswer @@ -199,44 +201,6 @@ module Score = { argsMake(~esti=estimate, ~answ=answer, ~prior)->E.R.bind(x => x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) ) - - // let klDivergence = (prediction, answer, ~toPointSetFn: toPointSetFn): result => { - // let pointSets = E.R.merge(toPointSetFn(prediction), toPointSetFn(answer)) - // pointSets |> E.R2.bind(((predi, ans)) => - // PointSetDist.T.klDivergence(predi, ans)->E.R2.errMap(x => DistributionTypes.OperationError(x)) - // ) - // } - // - // let logScoreWithPointResolution = ( - // ~prediction: DistributionTypes.genericDist, - // ~answer: float, - // ~prior: option, - // ~toPointSetFn: toPointSetFn, - // ): result => { - // switch prior { - // | Some(prior') => - // E.R.merge(toPointSetFn(prior'), toPointSetFn(prediction))->E.R.bind((( - // prior'', - // prediction'', - // )) => - // PointSetDist.T.logScoreWithPointResolution( - // ~prediction=prediction'', - // ~answer, - // ~prior=prior''->Some, - // )->E.R2.errMap(x => DistributionTypes.OperationError(x)) - // ) - // | None => - // prediction - // ->toPointSetFn - // ->E.R.bind(x => - // PointSetDist.T.logScoreWithPointResolution( - // ~prediction=x, - // ~answer, - // ~prior=None, - // )->E.R2.errMap(x => DistributionTypes.OperationError(x)) - // ) - // } - // } } /* PointSetDist.toSparkline calls "downsampleEquallyOverX", which downsamples it to n=bucketCount. diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res index 658c6b8a..4abb389d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res @@ -270,20 +270,6 @@ module T = Dist({ } let variance = (t: t): float => XYShape.Analysis.getVarianceDangerously(t, mean, Analysis.getMeanOfSquares) - - // let klDivergence = (prediction: t, answer: t) => { - // let newShape = XYShape.PointwiseCombination.combineAlongSupportOfSecondArgument( - // PointSetDist_Scoring.KLDivergence.integrand, - // prediction.xyShape, - // answer.xyShape, - // ) - // newShape->E.R2.fmap(x => x->make->integralEndY) - // } - // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - // let priorPdf = prior->E.O2.fmap((shape, x) => XYShape.XtoY.linear(x, shape.xyShape)) - // let predictionPdf = x => XYShape.XtoY.linear(x, prediction.xyShape) - // PointSetDist_Scoring.LogScoreWithPointResolution.score(~priorPdf, ~predictionPdf, ~answer) - // } }) let isNormalized = (t: t): bool => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res index fe848107..3a35d57b 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Distributions.res @@ -33,12 +33,6 @@ module type dist = { let mean: t => float let variance: t => float - // let klDivergence: (t, t) => result - // let logScoreWithPointResolution: ( - // ~prediction: t, - // ~answer: float, - // ~prior: option, - // ) => result } module Dist = (T: dist) => { @@ -61,9 +55,6 @@ module Dist = (T: dist) => { let mean = T.mean let variance = T.variance let integralEndY = T.integralEndY - // let klDivergence = T.klDivergence - // let logScoreWithPointResolution = T.logScoreWithPointResolution - let updateIntegralCache = T.updateIntegralCache module Integral = { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res index a49163a1..b743c7bf 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res @@ -195,27 +195,10 @@ module T = Dist({ | Discrete(m) => Discrete.T.variance(m) | Continuous(m) => Continuous.T.variance(m) } - - // let klDivergence = (prediction: t, answer: t) => - // switch (prediction, answer) { - // | (Continuous(t1), Continuous(t2)) => Continuous.T.klDivergence(t1, t2) - // | (Discrete(t1), Discrete(t2)) => Discrete.T.klDivergence(t1, t2) - // | (m1, m2) => Mixed.T.klDivergence(m1->toMixed, m2->toMixed) - // } - // - // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - // switch (prior, prediction) { - // | (Some(Continuous(t1)), Continuous(t2)) => - // Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=t1->Some) - // | (None, Continuous(t2)) => - // Continuous.T.logScoreWithPointResolution(~prediction=t2, ~answer, ~prior=None) - // | _ => Error(Operation.NotYetImplemented) - // } - // } }) let logScore = (args: PointSetDist_Scoring.scoreArgs): result => - PointSetDist_Scoring.logScore(args, ~combineFn=combinePointwise, ~integrateFn=T.integralEndY) + PointSetDist_Scoring.logScore(args, ~combineFn=combinePointwise, ~integrateFn=T.Integral.sum) let pdf = (f: float, t: t) => { let mixedPoint: PointSetTypes.mixedPoint = T.xToY(f, t) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 95ebc89c..b302d83e 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -1,7 +1,4 @@ type t = PointSetTypes.pointSetDist -type continuousShape = PointSetTypes.continuousShape -type discreteShape = PointSetTypes.discreteShape -type mixedShape = PointSetTypes.mixedShape type scalar = float type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} @@ -71,14 +68,14 @@ module WithScalarAnswer = { minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) } } + + let sum = (mp: PointSetTypes.MixedPoint.t): float => mp.continuous +. mp.discrete let score = (~estimate: t, ~answer: scalar): result => { let estimatePdf = x => switch estimate { - | Continuous(esti) => XYShape.XtoY.linear(x, esti.xyShape) - | Discrete(esti) => XYShape.XtoY.linear(x, esti.xyShape) - | Mixed(esti) => - XYShape.XtoY.linear(x, esti.continuous.xyShape) +. - XYShape.XtoY.linear(x, esti.discrete.xyShape) + | Continuous(esti) => Continuous.T.xToY(x, esti)->sum + | Discrete(esti) => Discrete.T.xToY(x, esti)->sum + | Mixed(esti) => Mixed.T.xToY(x, esti)->sum } score'(~estimatePdf, ~answer) @@ -89,19 +86,15 @@ module WithScalarAnswer = { > => { let estimatePdf = x => switch estimate { - | Continuous(esti) => XYShape.XtoY.linear(x, esti.xyShape) - | Discrete(esti) => XYShape.XtoY.linear(x, esti.xyShape) - | Mixed(esti) => - XYShape.XtoY.linear(x, esti.continuous.xyShape) +. - XYShape.XtoY.linear(x, esti.discrete.xyShape) + | Continuous(esti) => Continuous.T.xToY(x, esti)->sum + | Discrete(esti) => Discrete.T.xToY(x, esti)->sum + | Mixed(esti) => Mixed.T.xToY(x, esti)->sum } let priorPdf = x => switch prior { - | Continuous(prio) => XYShape.XtoY.linear(x, prio.xyShape) - | Discrete(prio) => XYShape.XtoY.linear(x, prio.xyShape) - | Mixed(prio) => - XYShape.XtoY.linear(x, prio.continuous.xyShape) +. - XYShape.XtoY.linear(x, prio.discrete.xyShape) + | Continuous(prio) => Continuous.T.xToY(x, prio)->sum + | Discrete(prio) => Discrete.T.xToY(x, prio)->sum + | Mixed(prio) => Mixed.T.xToY(x, prio)->sum } scoreWithPrior'(~estimatePdf, ~answer, ~priorPdf) } diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 3357f4f4..a3bcb911 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -541,6 +541,7 @@ module A = { let init = Array.init let reduce = Belt.Array.reduce let reducei = Belt.Array.reduceWithIndex + let some = Belt.Array.some let isEmpty = r => length(r) < 1 let stableSortBy = Belt.SortArray.stableSortBy let toNoneIfEmpty = r => isEmpty(r) ? None : Some(r) From cbaf4c150d91776bdf3e4f05c60ff359ee4f50ea Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 13:10:31 -0400 Subject: [PATCH 05/34] one CR comment; chasing kldivergence on mixeds bug Value: [1e-10 to 1e-3] --- .../Scoring/KlDivergence_test.res | 4 +- .../Distributions/DistributionOperation.res | 34 +++++---- .../Distributions/DistributionOperation.resi | 74 ++++++++++--------- .../Distributions/DistributionTypes.res | 66 +++++++++-------- .../Distributions/PointSetDist/Continuous.res | 2 +- .../Distributions/PointSetDist/Discrete.res | 13 +--- .../PointSetDist/PointSetDist.res | 3 + .../src/rescript/Utility/XYShape.res | 24 +++--- 8 files changed, 107 insertions(+), 113 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res index e281b9de..089d247f 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res @@ -3,7 +3,7 @@ open Expect open TestHelpers open GenericDist_Fixtures -let klDivergence = DistributionOperation.Constructors.logScore_DistEstimateDistAnswer(~env) +let klDivergence = DistributionOperation.Constructors.LogScore.distEstimateDistAnswer(~env) // integral from low to high of 1 / (high - low) log(normal(mean, stdev)(x) / (1 / (high - low))) dx let klNormalUniform = (mean, stdev, low, high): float => -.Js.Math.log((high -. low) /. Js.Math.sqrt(2.0 *. MagicNumbers.Math.pi *. stdev ** 2.0)) +. @@ -194,7 +194,7 @@ describe("combineAlongSupportOfSecondArgument0", () => { let result = switch (answerWrapped, predictionWrapped) { | (Ok(Dist(PointSet(Continuous(a)))), Ok(Dist(PointSet(Continuous(b))))) => - Some(combineAlongSupportOfSecondArgument(integrand, interpolator, a.xyShape, b.xyShape)) + Some(combineAlongSupportOfSecondArgument(interpolator, integrand, a.xyShape, b.xyShape)) | _ => None } result diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index e2bf166d..b1d52319 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -262,22 +262,24 @@ module Constructors = { let pdf = (~env, dist, f) => C.pdf(dist, f)->run(~env)->toFloatR let normalize = (~env, dist) => C.normalize(dist)->run(~env)->toDistR let isNormalized = (~env, dist) => C.isNormalized(dist)->run(~env)->toBoolR - let logScore_DistEstimateDistAnswer = (~env, estimate, answer) => - C.logScore_DistEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR - let logScore_DistEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => - C.logScore_DistEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR - let logScore_DistEstimateScalarAnswer = (~env, estimate, answer) => - C.logScore_DistEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR - let logScore_DistEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => - C.logScore_DistEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR - let logScore_ScalarEstimateDistAnswer = (~env, estimate, answer) => - C.logScore_ScalarEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR - let logScore_ScalarEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => - C.logScore_ScalarEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR - let logScore_ScalarEstimateScalarAnswer = (~env, estimate, answer) => - C.logScore_ScalarEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR - let logScore_ScalarEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => - C.logScore_ScalarEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + module LogScore = { + let distEstimateDistAnswer = (~env, estimate, answer) => + C.LogScore.distEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR + let distEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => + C.LogScore.distEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let distEstimateScalarAnswer = (~env, estimate, answer) => + C.LogScore.distEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR + let distEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => + C.LogScore.distEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let scalarEstimateDistAnswer = (~env, estimate, answer) => + C.LogScore.scalarEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR + let scalarEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => + C.LogScore.scalarEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + let scalarEstimateScalarAnswer = (~env, estimate, answer) => + C.LogScore.scalarEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR + let scalarEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => + C.LogScore.scalarEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR + } let toPointSet = (~env, dist) => C.toPointSet(dist)->run(~env)->toDistR let toSampleSet = (~env, dist, n) => C.toSampleSet(dist, n)->run(~env)->toDistR let fromSamples = (~env, xs) => C.fromSamples(xs)->run(~env)->toDistR diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index 2f3a7507..eaad6bb8 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -60,42 +60,44 @@ module Constructors: { let normalize: (~env: env, genericDist) => result @genType let isNormalized: (~env: env, genericDist) => result - @genType - let logScore_DistEstimateDistAnswer: (~env: env, genericDist, genericDist) => result - @genType - let logScore_DistEstimateDistAnswerWithPrior: ( - ~env: env, - genericDist, - genericDist, - DistributionTypes.DistributionOperation.scoreDistOrScalar, - ) => result - @genType - let logScore_DistEstimateScalarAnswer: (~env: env, genericDist, float) => result - @genType - let logScore_DistEstimateScalarAnswerWithPrior: ( - ~env: env, - genericDist, - float, - DistributionTypes.DistributionOperation.scoreDistOrScalar, - ) => result - @genType - let logScore_ScalarEstimateDistAnswer: (~env: env, float, genericDist) => result - @genType - let logScore_ScalarEstimateDistAnswerWithPrior: ( - ~env: env, - float, - genericDist, - DistributionTypes.DistributionOperation.scoreDistOrScalar, - ) => result - @genType - let logScore_ScalarEstimateScalarAnswer: (~env: env, float, float) => result - @genType - let logScore_ScalarEstimateScalarAnswerWithPrior: ( - ~env: env, - float, - float, - DistributionTypes.DistributionOperation.scoreDistOrScalar, - ) => result + module LogScore: { + @genType + let distEstimateDistAnswer: (~env: env, genericDist, genericDist) => result + @genType + let distEstimateDistAnswerWithPrior: ( + ~env: env, + genericDist, + genericDist, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let distEstimateScalarAnswer: (~env: env, genericDist, float) => result + @genType + let distEstimateScalarAnswerWithPrior: ( + ~env: env, + genericDist, + float, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let scalarEstimateDistAnswer: (~env: env, float, genericDist) => result + @genType + let scalarEstimateDistAnswerWithPrior: ( + ~env: env, + float, + genericDist, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + @genType + let scalarEstimateScalarAnswer: (~env: env, float, float) => result + @genType + let scalarEstimateScalarAnswerWithPrior: ( + ~env: env, + float, + float, + DistributionTypes.DistributionOperation.scoreDistOrScalar, + ) => result + } @genType let toPointSet: (~env: env, genericDist) => result @genType diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index d655fcfd..71c3ed02 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -163,38 +163,40 @@ module Constructors = { let fromSamples = (xs): t => FromSamples(xs) let truncate = (dist, left, right): t => FromDist(ToDist(Truncate(left, right)), dist) let inspect = (dist): t => FromDist(ToDist(Inspect), dist) - let logScore_DistEstimateDistAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Dist(answer), None)), - estimate, - ) - let logScore_DistEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Dist(answer), Some(prior))), - estimate, - ) - let logScore_DistEstimateScalarAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), None)), - estimate, - ) - let logScore_DistEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), - estimate, - ) - let logScore_ScalarEstimateDistAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), None)), - estimate, - ) - let logScore_ScalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), Some(prior))), - estimate, - ) - let logScore_ScalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), None)), - estimate, - ) - let logScore_ScalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), - estimate, - ) + module LogScore = { + let distEstimateDistAnswer = (estimate, answer): t => FromDist( + ToScore(LogScore(Score_Dist(answer), None)), + estimate, + ) + let distEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( + ToScore(LogScore(Score_Dist(answer), Some(prior))), + estimate, + ) + let distEstimateScalarAnswer = (estimate, answer): t => FromDist( + ToScore(LogScore(Score_Scalar(answer), None)), + estimate, + ) + let distEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( + ToScore(LogScore(Score_Scalar(answer), Some(prior))), + estimate, + ) + let scalarEstimateDistAnswer = (estimate, answer): t => FromFloat( + ToScore(LogScore(Score_Dist(answer), None)), + estimate, + ) + let scalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( + ToScore(LogScore(Score_Dist(answer), Some(prior))), + estimate, + ) + let scalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( + ToScore(LogScore(Score_Scalar(answer), None)), + estimate, + ) + let scalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( + ToScore(LogScore(Score_Scalar(answer), Some(prior))), + estimate, + ) + } let scalePower = (dist, n): t => FromDist(ToDist(Scale(#Power, n)), dist) let scaleLogarithm = (dist, n): t => FromDist(ToDist(Scale(#Logarithm, n)), dist) let scaleLogarithmWithThreshold = (dist, n, eps): t => FromDist( diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res index 4abb389d..05d94ca9 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Continuous.res @@ -120,7 +120,7 @@ let combinePointwise = ( let interpolator = XYShape.XtoY.continuousInterpolator(t1.interpolation, extrapolation) - combiner(fn, interpolator, t1.xyShape, t2.xyShape)->E.R2.fmap(x => + combiner(interpolator, fn, t1.xyShape, t2.xyShape)->E.R2.fmap(x => make(~integralSumCache=combinedIntegralSum, x) ) } diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res index b2347dc2..c6b68b50 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Discrete.res @@ -48,7 +48,7 @@ let combinePointwise = ( // TODO: does it ever make sense to pointwise combine the integrals here? // It could be done for pointwise additions, but is that ever needed? - combiner(fn, XYShape.XtoY.discreteInterpolator, t1.xyShape, t2.xyShape)->E.R2.fmap(make) + combiner(XYShape.XtoY.discreteInterpolator, fn, t1.xyShape, t2.xyShape)->E.R2.fmap(make) } let reduce = ( @@ -221,15 +221,4 @@ module T = Dist({ let getMeanOfSquares = t => t |> shapeMap(XYShape.T.square) |> mean XYShape.Analysis.getVarianceDangerously(t, mean, getMeanOfSquares) } - - // let klDivergence = (prediction: t, answer: t) => { - // combinePointwise( - // ~fn=PointSetDist_Scoring.KLDivergence.integrand, - // prediction, - // answer, - // )->E.R2.fmap(integralEndY) - // } - // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - // Error(Operation.NotYetImplemented) - // } }) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res index b743c7bf..4401cb0d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res @@ -66,6 +66,7 @@ let combineAlgebraically = (op: Operation.convolutionOperation, t1: t, t2: t): t } let combinePointwise = ( + ~combiner=XYShape.PointwiseCombination.combine, ~integralSumCachesFn: (float, float) => option=(_, _) => None, ~integralCachesFn: ( PointSetTypes.continuousShape, @@ -78,6 +79,7 @@ let combinePointwise = ( switch (t1, t2) { | (Continuous(m1), Continuous(m2)) => Continuous.combinePointwise( + ~combiner, ~integralSumCachesFn, fn, m1, @@ -85,6 +87,7 @@ let combinePointwise = ( )->E.R2.fmap(x => PointSetTypes.Continuous(x)) | (Discrete(m1), Discrete(m2)) => Discrete.combinePointwise( + ~combiner, ~integralSumCachesFn, ~fn, m1, diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index b4758dfd..77fa2782 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -322,8 +322,8 @@ module Zipped = { module PointwiseCombination = { // t1Interpolator and t2Interpolator are functions from XYShape.XtoY, e.g. linearBetweenPointsExtrapolateFlat. let combine: ( - (float, float) => result, interpolator, + (float, float) => result, T.t, T.t, ) => result = %raw(` @@ -332,7 +332,7 @@ module PointwiseCombination = { // and interpolates the value on the other side, thus accumulating xs and ys. // This is written in raw JS because this can still be a bottleneck, and using refs for the i and j indices is quite painful. - function(fn, interpolator, t1, t2) { + function(interpolator, fn, t1, t2) { let t1n = t1.xs.length; let t2n = t2.xs.length; let outX = []; @@ -394,11 +394,11 @@ module PointwiseCombination = { This is from an approach to kl divergence that was ultimately rejected. Leaving it in for now because it may help us factor `combine` out of raw javascript soon. */ let combineAlongSupportOfSecondArgument0: ( - (float, float) => result, interpolator, + (float, float) => result, T.t, T.t, - ) => result = (fn, interpolator, t1, t2) => { + ) => result = (interpolator, fn, t1, t2) => { let newYs = [] let newXs = [] let (l1, l2) = (E.A.length(t1.xs), E.A.length(t2.xs)) @@ -493,27 +493,23 @@ module PointwiseCombination = { } // This function is used for klDivergence let combineAlongSupportOfSecondArgument: ( + interpolator, (float, float) => result, T.t, T.t, - ) => result = (fn, prediction, answer) => { + ) => result = (interpolator, fn, prediction, answer) => { let combineWithFn = (answerX: float, i: int) => { let answerY = answer.ys[i] - let predictionY = XtoY.linear(answerX, prediction) + // let predictionY = XtoY.linear(answerX, prediction) + let predictionY = interpolator(prediction, i, answerX) fn(predictionY, answerY) } let newYsWithError = Js.Array.mapi((x, i) => combineWithFn(x, i), answer.xs) - let newYsOrError = E.A.R.firstErrorOrOpen(newYsWithError) - let result = switch newYsOrError { - | Ok(a) => Ok({xs: answer.xs, ys: a}) - | Error(b) => Error(b) - } - - result + E.A.R.firstErrorOrOpen(newYsWithError)->E.R2.fmap(ys => {xs: answer.xs, ys: ys}) } let addCombine = (interpolator: interpolator, t1: T.t, t2: T.t): T.t => - combine((a, b) => Ok(a +. b), interpolator, t1, t2)->E.R.toExn( + combine(interpolator, (a, b) => Ok(a +. b), t1, t2)->E.R.toExn( "Add operation should never fail", _, ) From a266b8ed094bb8ee35f68a4bd3b1843045c36fba Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 13:38:55 -0400 Subject: [PATCH 06/34] Fixed tests (plausibly slightly naively) Value: [1e-4 to 1e-1] --- .../Distributions/PointSetDist/Mixed.res | 3 --- .../PointSetDist/PointSetDist_Scoring.res | 22 +++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res index c9d46efb..71310156 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res @@ -306,9 +306,6 @@ module T = Dist({ // let klContinuousPart = Continuous.T.klDivergence(prediction.continuous, answer.continuous) // E.R.merge(klDiscretePart, klContinuousPart)->E.R2.fmap(t => fst(t) +. snd(t)) // } - // let logScoreWithPointResolution = (~prediction: t, ~answer: float, ~prior: option) => { - // Error(Operation.NotYetImplemented) - // } }) let combineAlgebraically = (op: Operation.convolutionOperation, t1: t, t2: t): t => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index b302d83e..202397c5 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -29,8 +29,26 @@ module WithDistAnswer = { minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) } - let sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn) => - combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) + let rec sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn) => + switch (estimate, answer) { + | ((Continuous(_) | Discrete(_)) as esti, (Continuous(_) | Discrete(_)) as answ) => + combineFn(integrand, esti, answ)->E.R2.fmap(integrateFn) + | (Mixed(esti), Mixed(answ)) => + E.R.merge( + sum( + ~estimate=Discrete(esti.discrete), + ~answer=Discrete(answ.discrete), + ~combineFn, + ~integrateFn, + ), + sum( + ~estimate=Continuous(esti.continuous), + ~answer=Continuous(answ.continuous), + ~combineFn, + ~integrateFn, + ), + )->E.R2.fmap(((discretePart, continuousPart)) => discretePart +. continuousPart) + } let sumWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~combineFn, ~integrateFn): result< float, From 3aaad14f11db67123b5f3cb718dccc09a8f8dea8 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 13:51:01 -0400 Subject: [PATCH 07/34] slghtly more robust solution to mixed kldivergences (and removed a warning) Value: [1e-5 to 1e-2] --- .../PointSetDist/PointSetDist.res | 7 +- .../PointSetDist/PointSetDist_Scoring.res | 85 +++++++++++++------ 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res index 4401cb0d..725997f3 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist.res @@ -201,7 +201,12 @@ module T = Dist({ }) let logScore = (args: PointSetDist_Scoring.scoreArgs): result => - PointSetDist_Scoring.logScore(args, ~combineFn=combinePointwise, ~integrateFn=T.Integral.sum) + PointSetDist_Scoring.logScore( + args, + ~combineFn=combinePointwise, + ~integrateFn=T.Integral.sum, + ~toMixedFn=toMixed, + ) let pdf = (f: float, t: t) => { let mixedPoint: PointSetTypes.mixedPoint = T.xToY(f, t) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 202397c5..581fda7f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -29,33 +29,59 @@ module WithDistAnswer = { minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) } - let rec sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn) => - switch (estimate, answer) { - | ((Continuous(_) | Discrete(_)) as esti, (Continuous(_) | Discrete(_)) as answ) => - combineFn(integrand, esti, answ)->E.R2.fmap(integrateFn) - | (Mixed(esti), Mixed(answ)) => - E.R.merge( - sum( - ~estimate=Discrete(esti.discrete), - ~answer=Discrete(answ.discrete), - ~combineFn, - ~integrateFn, - ), - sum( - ~estimate=Continuous(esti.continuous), - ~answer=Continuous(answ.continuous), - ~combineFn, - ~integrateFn, - ), - )->E.R2.fmap(((discretePart, continuousPart)) => discretePart +. continuousPart) - } - - let sumWithPrior = (~estimate: t, ~answer: t, ~prior: t, ~combineFn, ~integrateFn): result< + let rec sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn, ~toMixedFn): result< float, Operation.Error.t, - > => { - let kl1 = sum(~estimate, ~answer, ~combineFn, ~integrateFn) - let kl2 = sum(~estimate=prior, ~answer, ~combineFn, ~integrateFn) + > => + switch (estimate, answer) { + | (Continuous(_), Continuous(_)) => + combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) + | (Discrete(_), Discrete(_)) => combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) + | (_, _) => + let esti = estimate->toMixedFn + let answ = answer->toMixedFn + switch ( + Mixed.T.toContinuous(esti), + Mixed.T.toDiscrete(esti), + Mixed.T.toContinuous(answ), + Mixed.T.toDiscrete(answ), + ) { + | ( + Some(estiContinuousPart), + Some(estiDiscretePart), + Some(answContinuousPart), + Some(answDiscretePart), + ) => + E.R.merge( + sum( + ~estimate=Discrete(estiDiscretePart), + ~answer=Discrete(answDiscretePart), + ~combineFn, + ~integrateFn, + ~toMixedFn, + ), + sum( + ~estimate=Continuous(estiContinuousPart), + ~answer=Continuous(answContinuousPart), + ~combineFn, + ~integrateFn, + ~toMixedFn, + ), + )->E.R2.fmap(((discretePart, continuousPart)) => discretePart +. continuousPart) + | (_, _, _, _) => `unreachable state`->Operation.Other->Error + } + } + + let sumWithPrior = ( + ~estimate: t, + ~answer: t, + ~prior: t, + ~combineFn, + ~integrateFn, + ~toMixedFn, + ): result => { + let kl1 = sum(~estimate, ~answer, ~combineFn, ~integrateFn, ~toMixedFn) + let kl2 = sum(~estimate=prior, ~answer, ~combineFn, ~integrateFn, ~toMixedFn) E.R.merge(kl1, kl2)->E.R2.fmap(((kl1', kl2')) => kl1' -. kl2') } } @@ -138,12 +164,15 @@ module TwoScalars = { } } -let logScore = (args: scoreArgs, ~combineFn, ~integrateFn): result => +let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< + float, + Operation.Error.t, +> => switch args { | DistEstimateDistAnswer({estimate, answer, prior: None}) => - WithDistAnswer.sum(~estimate, ~answer, ~integrateFn, ~combineFn) + WithDistAnswer.sum(~estimate, ~answer, ~integrateFn, ~combineFn, ~toMixedFn) | DistEstimateDistAnswer({estimate, answer, prior: Some(prior)}) => - WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn, ~combineFn) + WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn, ~combineFn, ~toMixedFn) | DistEstimateScalarAnswer({estimate, answer, prior: None}) => WithScalarAnswer.score(~estimate, ~answer) | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => From 6a9179d4b8e0aeb0917f23502be507a6d35d6f5f Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 25 May 2022 14:40:39 -0400 Subject: [PATCH 08/34] Last cleanup Value: [1e-5 to 1e-3] --- .../Distributions/PointSetDist/Mixed.res | 6 ------ .../PointSetDist/PointSetDist_Scoring.res | 4 ++-- .../src/rescript/Utility/XYShape.res | 16 ---------------- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res index 71310156..78f3c85b 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/Mixed.res @@ -300,12 +300,6 @@ module T = Dist({ | _ => XYShape.Analysis.getVarianceDangerously(t, mean, getMeanOfSquares) } } - - // let klDivergence = (prediction: t, answer: t) => { - // let klDiscretePart = Discrete.T.klDivergence(prediction.discrete, answer.discrete) - // let klContinuousPart = Continuous.T.klDivergence(prediction.continuous, answer.continuous) - // E.R.merge(klDiscretePart, klContinuousPart)->E.R2.fmap(t => fst(t) +. snd(t)) - // } }) let combineAlgebraically = (op: Operation.convolutionOperation, t1: t, t2: t): t => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 581fda7f..a228fcdc 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -34,9 +34,9 @@ module WithDistAnswer = { Operation.Error.t, > => switch (estimate, answer) { - | (Continuous(_), Continuous(_)) => + | (Continuous(_), Continuous(_)) + | (Discrete(_), Discrete(_)) => combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) - | (Discrete(_), Discrete(_)) => combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) | (_, _) => let esti = estimate->toMixedFn let answ = answer->toMixedFn diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index 77fa2782..b49540e9 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -491,22 +491,6 @@ module PointwiseCombination = { let newYs = E.A.fmap(x => XtoY.linear(x, t), newXs) {xs: newXs, ys: newYs} } - // This function is used for klDivergence - let combineAlongSupportOfSecondArgument: ( - interpolator, - (float, float) => result, - T.t, - T.t, - ) => result = (interpolator, fn, prediction, answer) => { - let combineWithFn = (answerX: float, i: int) => { - let answerY = answer.ys[i] - // let predictionY = XtoY.linear(answerX, prediction) - let predictionY = interpolator(prediction, i, answerX) - fn(predictionY, answerY) - } - let newYsWithError = Js.Array.mapi((x, i) => combineWithFn(x, i), answer.xs) - E.A.R.firstErrorOrOpen(newYsWithError)->E.R2.fmap(ys => {xs: answer.xs, ys: ys}) - } let addCombine = (interpolator: interpolator, t1: T.t, t2: T.t): T.t => combine(interpolator, (a, b) => Ok(a +. b), t1, t2)->E.R.toExn( From 239abbdcf89c094f560c3e7edb222acf5ea60712 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 25 May 2022 18:10:05 -0400 Subject: [PATCH 09/34] Minor refactors --- .../rescript/Distributions/GenericDist.res | 31 +++-- .../PointSetDist/PointSetDist_Scoring.res | 128 ++++++++++-------- 2 files changed, 84 insertions(+), 75 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 3dd9981a..2a806c9c 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -128,26 +128,27 @@ module Score = { ~answ: scoreDistOrScalar, ~prior: option, ): result => { - let toPointSetFn = toPointSet( - ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, - ~sampleCount=MagicNumbers.Environment.defaultSampleCount, - ~xSelection=#ByWeight, - ) + let toPointSetFn = t => + toPointSet( + t, + ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, + ~sampleCount=MagicNumbers.Environment.defaultSampleCount, + ~xSelection=#ByWeight, + (), + ) let prior': option> = switch prior { | None => None - | Some(Score_Dist(d)) => toPointSetFn(d, ())->E.R.bind(x => x->D->Ok)->Some + | Some(Score_Dist(d)) => toPointSetFn(d)->E.R.bind(x => x->D->Ok)->Some | Some(Score_Scalar(s)) => s->S->Ok->Some } let twoDists = (esti': t, answ': t): result< (PointSetTypes.pointSetDist, PointSetTypes.pointSetDist), error, - > => E.R.merge(toPointSetFn(esti', ()), toPointSetFn(answ', ())) + > => E.R.merge(toPointSetFn(esti'), toPointSetFn(answ')) switch (esti, answ, prior') { | (Score_Dist(esti'), Score_Dist(answ'), None) => - twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => - {estimate: esti'', answer: answ'', prior: None} - ->PointSetDist_Scoring.DistEstimateDistAnswer - ->Ok + twoDists(esti', answ')->E.R2.fmap(((esti'', answ'')) => + {estimate: esti'', answer: answ'', prior: None}->PointSetDist_Scoring.DistEstimateDistAnswer ) | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(D(prior'')))) => twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => @@ -157,25 +158,25 @@ module Score = { ) | (Score_Dist(_), _, Some(Ok(S(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => - toPointSetFn(esti', ())->E.R.bind(esti'' => + toPointSetFn(esti')->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: None} ->PointSetDist_Scoring.DistEstimateScalarAnswer ->Ok ) | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(D(prior'')))) => - toPointSetFn(esti', ())->E.R.bind(esti'' => + toPointSetFn(esti')->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: Some(prior'')} ->PointSetDist_Scoring.DistEstimateScalarAnswer ->Ok ) | (Score_Scalar(esti'), Score_Dist(answ'), None) => - toPointSetFn(answ', ())->E.R.bind(answ'' => + toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: None} ->PointSetDist_Scoring.ScalarEstimateDistAnswer ->Ok ) | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(S(prior'')))) => - toPointSetFn(answ', ())->E.R.bind(answ'' => + toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: Some(prior'')} ->PointSetDist_Scoring.ScalarEstimateDistAnswer ->Ok diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index a228fcdc..284914c2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -1,11 +1,11 @@ -type t = PointSetTypes.pointSetDist +type pointSetDist = PointSetTypes.pointSetDist type scalar = float type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} type scoreArgs = - | DistEstimateDistAnswer(abstractScoreArgs) - | DistEstimateScalarAnswer(abstractScoreArgs) - | ScalarEstimateDistAnswer(abstractScoreArgs) + | DistEstimateDistAnswer(abstractScoreArgs) + | DistEstimateScalarAnswer(abstractScoreArgs) + | ScalarEstimateDistAnswer(abstractScoreArgs) | ScalarEstimateScalarAnswer(abstractScoreArgs) let logFn = Js.Math.log // base e @@ -29,15 +29,17 @@ module WithDistAnswer = { minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) } - let rec sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn, ~toMixedFn): result< - float, - Operation.Error.t, - > => - switch (estimate, answer) { - | (Continuous(_), Continuous(_)) - | (Discrete(_), Discrete(_)) => + let sum = ( + ~estimate: pointSetDist, + ~answer: pointSetDist, + ~combineFn, + ~integrateFn, + ~toMixedFn, + ): result => { + let combineAndIntegrate = (estimate, answer) => combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) - | (_, _) => + + let getMixedSums = (estimate: pointSetDist, answer: pointSetDist) => { let esti = estimate->toMixedFn let answ = answer->toMixedFn switch ( @@ -53,29 +55,31 @@ module WithDistAnswer = { Some(answDiscretePart), ) => E.R.merge( - sum( - ~estimate=Discrete(estiDiscretePart), - ~answer=Discrete(answDiscretePart), - ~combineFn, - ~integrateFn, - ~toMixedFn, + combineAndIntegrate( + PointSetTypes.Discrete(estiDiscretePart), + PointSetTypes.Discrete(answDiscretePart), ), - sum( - ~estimate=Continuous(estiContinuousPart), - ~answer=Continuous(answContinuousPart), - ~combineFn, - ~integrateFn, - ~toMixedFn, - ), - )->E.R2.fmap(((discretePart, continuousPart)) => discretePart +. continuousPart) + combineAndIntegrate(Continuous(estiContinuousPart), Continuous(answContinuousPart)), + ) | (_, _, _, _) => `unreachable state`->Operation.Other->Error } } + switch (estimate, answer) { + | (Continuous(_), Continuous(_)) + | (Discrete(_), Discrete(_)) => + combineAndIntegrate(estimate, answer) + | (_, _) => + getMixedSums(estimate, answer)->E.R2.fmap(((discretePart, continuousPart)) => + discretePart +. continuousPart + ) + } + } + let sumWithPrior = ( - ~estimate: t, - ~answer: t, - ~prior: t, + ~estimate: pointSetDist, + ~answer: pointSetDist, + ~prior: pointSetDist, ~combineFn, ~integrateFn, ~toMixedFn, @@ -87,47 +91,51 @@ module WithDistAnswer = { } module WithScalarAnswer = { - let score' = (~estimatePdf: float => float, ~answer: float): result => { - let density = answer->estimatePdf - if density < 0.0 { - Operation.PdfInvalidError->Error - } else if density == 0.0 { - infinity->Ok - } else { - density->logFn->(x => -.x)->Ok - } - } - let scoreWithPrior' = ( - ~estimatePdf: float => float, - ~answer: scalar, - ~priorPdf: float => float, - ): result => { - let numerator = answer->estimatePdf - let priorDensityOfAnswer = answer->priorPdf - if numerator < 0.0 || priorDensityOfAnswer < 0.0 { - Operation.PdfInvalidError->Error - } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { - infinity->Ok - } else { - minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) - } - } - let sum = (mp: PointSetTypes.MixedPoint.t): float => mp.continuous +. mp.discrete - let score = (~estimate: t, ~answer: scalar): result => { + let score = (~estimate: pointSetDist, ~answer: scalar): result => { + let _score = (~estimatePdf: float => float, ~answer: float): result< + float, + Operation.Error.t, + > => { + let density = answer->estimatePdf + if density < 0.0 { + Operation.PdfInvalidError->Error + } else if density == 0.0 { + infinity->Ok + } else { + density->logFn->(x => -.x)->Ok + } + } + let estimatePdf = x => switch estimate { | Continuous(esti) => Continuous.T.xToY(x, esti)->sum | Discrete(esti) => Discrete.T.xToY(x, esti)->sum | Mixed(esti) => Mixed.T.xToY(x, esti)->sum } - - score'(~estimatePdf, ~answer) + _score(~estimatePdf, ~answer) } - let scoreWithPrior = (~estimate: t, ~answer: scalar, ~prior: t): result< + + let scoreWithPrior = (~estimate: pointSetDist, ~answer: scalar, ~prior: pointSetDist): result< float, Operation.Error.t, > => { + let _scoreWithPrior = ( + ~estimatePdf: float => float, + ~answer: scalar, + ~priorPdf: float => float, + ): result => { + let numerator = answer->estimatePdf + let priorDensityOfAnswer = answer->priorPdf + if numerator < 0.0 || priorDensityOfAnswer < 0.0 { + Operation.PdfInvalidError->Error + } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { + infinity->Ok + } else { + minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) + } + } + let estimatePdf = x => switch estimate { | Continuous(esti) => Continuous.T.xToY(x, esti)->sum @@ -140,7 +148,7 @@ module WithScalarAnswer = { | Discrete(prio) => Discrete.T.xToY(x, prio)->sum | Mixed(prio) => Mixed.T.xToY(x, prio)->sum } - scoreWithPrior'(~estimatePdf, ~answer, ~priorPdf) + _scoreWithPrior(~estimatePdf, ~answer, ~priorPdf) } } From 584c639d01fe843a5d5ae912e56f7f645bdb8c39 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 08:28:30 -0400 Subject: [PATCH 10/34] some of the comments --- .../Distributions/DistributionOperation.res | 2 +- .../Distributions/DistributionOperation.resi | 8 +-- .../Distributions/DistributionTypes.res | 20 +++--- .../rescript/Distributions/GenericDist.res | 62 ++++++++----------- .../rescript/Distributions/GenericDist.resi | 6 +- .../PointSetDist/PointSetDist_Scoring.res | 13 ++-- .../ReducerInterface_GenericDistribution.res | 7 +-- 7 files changed, 55 insertions(+), 63 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index b1d52319..8190a057 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -146,7 +146,7 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { } | ToDist(Normalize) => dist->GenericDist.normalize->Dist | ToScore(LogScore(answer, prior)) => - GenericDist.Score.logScore(~estimate=Score_Dist(dist), ~answer, ~prior) + GenericDist.Score.logScore(~estimate=GDist(dist), ~answer, ~prior) ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult | ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index eaad6bb8..e2d0290b 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -68,7 +68,7 @@ module Constructors: { ~env: env, genericDist, genericDist, - DistributionTypes.DistributionOperation.scoreDistOrScalar, + DistributionTypes.DistributionOperation.genericDistOrScalar, ) => result @genType let distEstimateScalarAnswer: (~env: env, genericDist, float) => result @@ -77,7 +77,7 @@ module Constructors: { ~env: env, genericDist, float, - DistributionTypes.DistributionOperation.scoreDistOrScalar, + DistributionTypes.DistributionOperation.genericDistOrScalar, ) => result @genType let scalarEstimateDistAnswer: (~env: env, float, genericDist) => result @@ -86,7 +86,7 @@ module Constructors: { ~env: env, float, genericDist, - DistributionTypes.DistributionOperation.scoreDistOrScalar, + DistributionTypes.DistributionOperation.genericDistOrScalar, ) => result @genType let scalarEstimateScalarAnswer: (~env: env, float, float) => result @@ -95,7 +95,7 @@ module Constructors: { ~env: env, float, float, - DistributionTypes.DistributionOperation.scoreDistOrScalar, + DistributionTypes.DistributionOperation.genericDistOrScalar, ) => result } @genType diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index 71c3ed02..20b29b38 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -92,9 +92,9 @@ module DistributionOperation = { | ToString | ToSparkline(int) - type scoreDistOrScalar = Score_Dist(genericDist) | Score_Scalar(float) + type genericDistOrScalar = GDist(genericDist) | GScalar(float) - type toScore = LogScore(scoreDistOrScalar, option) + type toScore = LogScore(genericDistOrScalar, option) type fromDist = | ToFloat(toFloat) @@ -165,35 +165,35 @@ module Constructors = { let inspect = (dist): t => FromDist(ToDist(Inspect), dist) module LogScore = { let distEstimateDistAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Dist(answer), None)), + ToScore(LogScore(GDist(answer), None)), estimate, ) let distEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Dist(answer), Some(prior))), + ToScore(LogScore(GDist(answer), Some(prior))), estimate, ) let distEstimateScalarAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), None)), + ToScore(LogScore(GScalar(answer), None)), estimate, ) let distEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), + ToScore(LogScore(GScalar(answer), Some(prior))), estimate, ) let scalarEstimateDistAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), None)), + ToScore(LogScore(GDist(answer), None)), estimate, ) let scalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), Some(prior))), + ToScore(LogScore(GDist(answer), Some(prior))), estimate, ) let scalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), None)), + ToScore(LogScore(GScalar(answer), None)), estimate, ) let scalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), + ToScore(LogScore(GScalar(answer), Some(prior))), estimate, ) } diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 3dd9981a..4d54c62f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -120,72 +120,64 @@ let toPointSet = ( } module Score = { - type scoreDistOrScalar = DistributionTypes.DistributionOperation.scoreDistOrScalar + type genericDistOrScalar = DistributionTypes.DistributionOperation.genericDistOrScalar + type psDistOrScalar = PSDist(PointSetTypes.pointSetDist) | PSScalar(float) - type pointSet_ScoreDistOrScalar = D(PointSetTypes.pointSetDist) | S(float) let argsMake = ( - ~esti: scoreDistOrScalar, - ~answ: scoreDistOrScalar, - ~prior: option, + ~esti: genericDistOrScalar, + ~answ: genericDistOrScalar, + ~prior: option, ): result => { let toPointSetFn = toPointSet( ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, ~sampleCount=MagicNumbers.Environment.defaultSampleCount, ~xSelection=#ByWeight, ) - let prior': option> = switch prior { + let twoDists = PointSetDist_Scoring.twoGenericDistsToTwoPointSetDists + let prior': option> = switch prior { | None => None - | Some(Score_Dist(d)) => toPointSetFn(d, ())->E.R.bind(x => x->D->Ok)->Some - | Some(Score_Scalar(s)) => s->S->Ok->Some + | Some(GDist(d)) => toPointSetFn(d, ())->E.R2.fmap(x => x->PSDist)->Some + | Some(GScalar(s)) => s->PSScalar->Ok->Some } - let twoDists = (esti': t, answ': t): result< - (PointSetTypes.pointSetDist, PointSetTypes.pointSetDist), - error, - > => E.R.merge(toPointSetFn(esti', ()), toPointSetFn(answ', ())) switch (esti, answ, prior') { - | (Score_Dist(esti'), Score_Dist(answ'), None) => - twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => + | (GDist(esti'), GDist(answ'), None) => + twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => {estimate: esti'', answer: answ'', prior: None} ->PointSetDist_Scoring.DistEstimateDistAnswer - ->Ok ) - | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(D(prior'')))) => - twoDists(esti', answ')->E.R.bind(((esti'', answ'')) => + | (GDist(esti'), GDist(answ'), Some(Ok(PSDist(prior'')))) => + twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => {estimate: esti'', answer: answ'', prior: Some(prior'')} ->PointSetDist_Scoring.DistEstimateDistAnswer - ->Ok ) - | (Score_Dist(_), _, Some(Ok(S(_)))) => DistributionTypes.Unreachable->Error - | (Score_Dist(esti'), Score_Scalar(answ'), None) => + | (GDist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error + | (GDist(esti'), GScalar(answ'), None) => toPointSetFn(esti', ())->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: None} ->PointSetDist_Scoring.DistEstimateScalarAnswer ->Ok ) - | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(D(prior'')))) => - toPointSetFn(esti', ())->E.R.bind(esti'' => + | (GDist(esti'), GScalar(answ'), Some(Ok(PSDist(prior'')))) => + toPointSetFn(esti', ())->E.R2.fmap(esti'' => {estimate: esti'', answer: answ', prior: Some(prior'')} ->PointSetDist_Scoring.DistEstimateScalarAnswer - ->Ok ) - | (Score_Scalar(esti'), Score_Dist(answ'), None) => - toPointSetFn(answ', ())->E.R.bind(answ'' => + | (GScalar(esti'), GDist(answ'), None) => + toPointSetFn(answ', ())->E.R2.fmap(answ'' => {estimate: esti', answer: answ'', prior: None} ->PointSetDist_Scoring.ScalarEstimateDistAnswer - ->Ok ) - | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(S(prior'')))) => - toPointSetFn(answ', ())->E.R.bind(answ'' => + | (GScalar(esti'), GDist(answ'), Some(Ok(PSScalar(prior'')))) => + toPointSetFn(answ', ())->E.R2.fmap(answ'' => {estimate: esti', answer: answ'', prior: Some(prior'')} ->PointSetDist_Scoring.ScalarEstimateDistAnswer - ->Ok ) - | (Score_Scalar(_), _, Some(Ok(D(_)))) => DistributionTypes.Unreachable->Error - | (Score_Scalar(esti'), Score_Scalar(answ'), None) => + | (GScalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error + | (GScalar(esti'), GScalar(answ'), None) => {estimate: esti', answer: answ', prior: None} ->PointSetDist_Scoring.ScalarEstimateScalarAnswer ->Ok - | (Score_Scalar(esti'), Score_Scalar(answ'), Some(Ok(S(prior'')))) => + | (GScalar(esti'), GScalar(answ'), Some(Ok(PSScalar(prior'')))) => {estimate: esti', answer: answ', prior: prior''->Some} ->PointSetDist_Scoring.ScalarEstimateScalarAnswer ->Ok @@ -194,9 +186,9 @@ module Score = { } let logScore = ( - ~estimate: scoreDistOrScalar, - ~answer: scoreDistOrScalar, - ~prior: option, + ~estimate: genericDistOrScalar, + ~answer: genericDistOrScalar, + ~prior: option, ): result => argsMake(~esti=estimate, ~answ=answer, ~prior)->E.R.bind(x => x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi index 9e00da14..432ae847 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi @@ -26,9 +26,9 @@ let toFloatOperation: ( module Score: { let logScore: ( - ~estimate: DistributionTypes.DistributionOperation.scoreDistOrScalar, - ~answer: DistributionTypes.DistributionOperation.scoreDistOrScalar, - ~prior: option, + ~estimate: DistributionTypes.DistributionOperation.genericDistOrScalar, + ~answer: DistributionTypes.DistributionOperation.genericDistOrScalar, + ~prior: option, ) => result } diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index a228fcdc..20bce7a7 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -9,7 +9,7 @@ type scoreArgs = | ScalarEstimateScalarAnswer(abstractScoreArgs) let logFn = Js.Math.log // base e -let minusScaledLogOfQuot = (~esti, ~answ): result => { +let minusScaledLogOfQuotient = (~esti, ~answ): result => { let quot = esti /. answ quot < 0.0 ? Error(Operation.ComplexNumberError) : Ok(-.answ *. logFn(quot)) } @@ -26,7 +26,7 @@ module WithDistAnswer = { } else if estimateElement == 0.0 { Ok(infinity) } else { - minusScaledLogOfQuot(~esti=estimateElement, ~answ=answerElement) + minusScaledLogOfQuotient(~esti=estimateElement, ~answ=answerElement) } let rec sum = (~estimate: t, ~answer: t, ~combineFn, ~integrateFn, ~toMixedFn): result< @@ -109,7 +109,7 @@ module WithScalarAnswer = { } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { infinity->Ok } else { - minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) + minusScaledLogOfQuotient(~esti=numerator, ~answ=priorDensityOfAnswer) } } @@ -151,7 +151,7 @@ module TwoScalars = { } else if estimate == 0.0 { infinity->Ok } else { - minusScaledLogOfQuot(~esti=estimate, ~answ=answer) + minusScaledLogOfQuotient(~esti=estimate, ~answ=answer) } let scoreWithPrior = (~estimate: float, ~answer: float, ~prior: float) => @@ -160,10 +160,13 @@ module TwoScalars = { } else if estimate == 0.0 || prior == 0.0 { infinity->Ok } else { - minusScaledLogOfQuot(~esti=estimate /. prior, ~answ=answer) + minusScaledLogOfQuotient(~esti=estimate /. prior, ~answ=answer) } } +let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result<(t, t), 'e> => + E.R.merge(toPointSetFn(estimate, ()), toPointSetFn(answer, ())) + let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< float, Operation.Error.t, diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 98e4842d..2959f924 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -214,15 +214,12 @@ let dispatchToGenericOutput = ( | ("normalize", [EvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer)]) => Some( - DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Dist(answer), None)), estimate), - ~env, - ), + DistributionOperation.run(FromDist(ToScore(LogScore(GDist(answer), None)), estimate), ~env), ) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer), EvDistribution(prior)]) => Some( DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), estimate), + FromDist(ToScore(LogScore(GDist(answer), Some(GDist(prior)))), estimate), ~env, ), ) From 18733f2d0925d0c62edc1653c6de84898f9dccd1 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 08:47:16 -0400 Subject: [PATCH 11/34] merged 592 --- .../Distributions/DistributionOperation.res | 2 +- .../Distributions/DistributionTypes.res | 18 +++---- .../rescript/Distributions/GenericDist.res | 51 +++++++------------ .../PointSetDist/PointSetDist_Scoring.res | 4 +- .../ReducerInterface_GenericDistribution.res | 4 +- 5 files changed, 31 insertions(+), 48 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 8190a057..b1d52319 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -146,7 +146,7 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { } | ToDist(Normalize) => dist->GenericDist.normalize->Dist | ToScore(LogScore(answer, prior)) => - GenericDist.Score.logScore(~estimate=GDist(dist), ~answer, ~prior) + GenericDist.Score.logScore(~estimate=Score_Dist(dist), ~answer, ~prior) ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult | ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index 20b29b38..ee319ed5 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -92,7 +92,7 @@ module DistributionOperation = { | ToString | ToSparkline(int) - type genericDistOrScalar = GDist(genericDist) | GScalar(float) + type genericDistOrScalar = Score_Dist(genericDist) | Score_Scalar(float) type toScore = LogScore(genericDistOrScalar, option) @@ -165,35 +165,35 @@ module Constructors = { let inspect = (dist): t => FromDist(ToDist(Inspect), dist) module LogScore = { let distEstimateDistAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(GDist(answer), None)), + ToScore(LogScore(Score_Dist(answer), None)), estimate, ) let distEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(GDist(answer), Some(prior))), + ToScore(LogScore(Score_Dist(answer), Some(prior))), estimate, ) let distEstimateScalarAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(GScalar(answer), None)), + ToScore(LogScore(Score_Scalar(answer), None)), estimate, ) let distEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(GScalar(answer), Some(prior))), + ToScore(LogScore(Score_Scalar(answer), Some(prior))), estimate, ) let scalarEstimateDistAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(GDist(answer), None)), + ToScore(LogScore(Score_Dist(answer), None)), estimate, ) let scalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(GDist(answer), Some(prior))), + ToScore(LogScore(Score_Dist(answer), Some(prior))), estimate, ) let scalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(GScalar(answer), None)), + ToScore(LogScore(Score_Scalar(answer), None)), estimate, ) let scalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(GScalar(answer), Some(prior))), + ToScore(LogScore(Score_Scalar(answer), Some(prior))), estimate, ) } diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 35b35b17..6f435748 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -121,31 +121,13 @@ let toPointSet = ( module Score = { type genericDistOrScalar = DistributionTypes.DistributionOperation.genericDistOrScalar - type psDistOrScalar = PSDist(PointSetTypes.pointSetDist) | PSScalar(float) + type pointSet_ScoreDistOrScalar = PSDist(PointSetTypes.pointSetDist) | PSScalar(float) let argsMake = ( ~esti: genericDistOrScalar, ~answ: genericDistOrScalar, ~prior: option, ): result => { -// <<<<<<< HEAD -// let toPointSetFn = toPointSet( -// ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, -// ~sampleCount=MagicNumbers.Environment.defaultSampleCount, -// ~xSelection=#ByWeight, -// ) -// let twoDists = PointSetDist_Scoring.twoGenericDistsToTwoPointSetDists -// let prior': option> = switch prior { -// | None => None -// | Some(GDist(d)) => toPointSetFn(d, ())->E.R2.fmap(x => x->PSDist)->Some -// | Some(GScalar(s)) => s->PSScalar->Ok->Some -// } -// switch (esti, answ, prior') { -// | (GDist(esti'), GDist(answ'), None) => -// twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => -// {estimate: esti'', answer: answ'', prior: None} -// ->PointSetDist_Scoring.DistEstimateDistAnswer -// ======= let toPointSetFn = t => toPointSet( t, @@ -156,52 +138,53 @@ module Score = { ) let prior': option> = switch prior { | None => None - | Some(Score_Dist(d)) => toPointSetFn(d)->E.R.bind(x => x->D->Ok)->Some - | Some(Score_Scalar(s)) => s->S->Ok->Some + | Some(Score_Dist(d)) => toPointSetFn(d)->E.R.bind(x => x->PSDist->Ok)->Some + | Some(Score_Scalar(s)) => s->PSScalar->Ok->Some } - let twoDists = (esti': t, answ': t): result< + let twoDists = (~toPointSetFn, esti': t, answ': t): result< (PointSetTypes.pointSetDist, PointSetTypes.pointSetDist), error, > => E.R.merge(toPointSetFn(esti'), toPointSetFn(answ')) switch (esti, answ, prior') { | (Score_Dist(esti'), Score_Dist(answ'), None) => - twoDists(esti', answ')->E.R2.fmap(((esti'', answ'')) => + twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => {estimate: esti'', answer: answ'', prior: None}->PointSetDist_Scoring.DistEstimateDistAnswer -// >>>>>>> origin/scoring-cleanup-refactor ) - | (GDist(esti'), GDist(answ'), Some(Ok(PSDist(prior'')))) => + | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(PSDist(prior'')))) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => {estimate: esti'', answer: answ'', prior: Some(prior'')} ->PointSetDist_Scoring.DistEstimateDistAnswer ) - | (Score_Dist(_), _, Some(Ok(S(_)))) => DistributionTypes.Unreachable->Error + | (Score_Dist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => toPointSetFn(esti')->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: None} ->PointSetDist_Scoring.DistEstimateScalarAnswer ->Ok ) - | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(D(prior'')))) => + | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(PSDist(prior'')))) => toPointSetFn(esti')->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: Some(prior'')} - ->PointSetDist_Scoring.DistEstimateScalarAnswer + ->PointSetDist_Scoring.DistEstimateScalarAnswer + -> Ok ) | (Score_Scalar(esti'), Score_Dist(answ'), None) => toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: None} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->PointSetDist_Scoring.ScalarEstimateDistAnswer + -> Ok ) - | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(S(prior'')))) => + | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(PSScalar(prior'')))) => toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: Some(prior'')} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->PointSetDist_Scoring.ScalarEstimateDistAnswer->Ok ) - | (GScalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error - | (GScalar(esti'), GScalar(answ'), None) => + | (Score_Scalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error + | (Score_Scalar(esti'), Score_Scalar(answ'), None) => {estimate: esti', answer: answ', prior: None} ->PointSetDist_Scoring.ScalarEstimateScalarAnswer ->Ok - | (GScalar(esti'), GScalar(answ'), Some(Ok(PSScalar(prior'')))) => + | (Score_Scalar(esti'), Score_Scalar(answ'), Some(Ok(PSScalar(prior'')))) => {estimate: esti', answer: answ', prior: prior''->Some} ->PointSetDist_Scoring.ScalarEstimateScalarAnswer ->Ok diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 86d463e9..5dd312af 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -132,7 +132,7 @@ module WithScalarAnswer = { } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { infinity->Ok } else { - minusScaledLogOfQuot(~esti=numerator, ~answ=priorDensityOfAnswer) + minusScaledLogOfQuotient(~esti=numerator, ~answ=priorDensityOfAnswer) } } @@ -172,7 +172,7 @@ module TwoScalars = { } } -let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result<(t, t), 'e> => +let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result<(pointSetDist, pointSetDist), 'e> => E.R.merge(toPointSetFn(estimate, ()), toPointSetFn(answer, ())) let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 2959f924..0d3c3333 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -214,12 +214,12 @@ let dispatchToGenericOutput = ( | ("normalize", [EvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer)]) => Some( - DistributionOperation.run(FromDist(ToScore(LogScore(GDist(answer), None)), estimate), ~env), + DistributionOperation.run(FromDist(ToScore(LogScore(Score_Dist(answer), None)), estimate), ~env), ) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer), EvDistribution(prior)]) => Some( DistributionOperation.run( - FromDist(ToScore(LogScore(GDist(answer), Some(GDist(prior)))), estimate), + FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), estimate), ~env, ), ) From d156b24fd13078a8981deece42d038e167c3d787 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 08:51:34 -0400 Subject: [PATCH 12/34] \`yarn format\` pass --- .../src/rescript/Distributions/GenericDist.res | 18 +++++++++++------- .../PointSetDist/PointSetDist_Scoring.res | 6 ++++-- .../ReducerInterface_GenericDistribution.res | 5 ++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 9631e3aa..e63490ea 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -164,8 +164,11 @@ module Score = { ) | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(PSDist(prior'')))) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => - {estimate: esti'', answer: answ'', prior: Some(prior'')} - ->PointSetDist_Scoring.DistEstimateDistAnswer + { + estimate: esti'', + answer: answ'', + prior: Some(prior''), + }->PointSetDist_Scoring.DistEstimateDistAnswer ) | (Score_Dist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => @@ -177,19 +180,20 @@ module Score = { | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(PSDist(prior'')))) => toPointSetFn(esti')->E.R.bind(esti'' => {estimate: esti'', answer: answ', prior: Some(prior'')} - ->PointSetDist_Scoring.DistEstimateScalarAnswer - -> Ok + ->PointSetDist_Scoring.DistEstimateScalarAnswer + ->Ok ) | (Score_Scalar(esti'), Score_Dist(answ'), None) => toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: None} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer - -> Ok + ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->Ok ) | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(PSScalar(prior'')))) => toPointSetFn(answ')->E.R.bind(answ'' => {estimate: esti', answer: answ'', prior: Some(prior'')} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer->Ok + ->PointSetDist_Scoring.ScalarEstimateDistAnswer + ->Ok ) | (Score_Scalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error | (Score_Scalar(esti'), Score_Scalar(answ'), None) => diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 5dd312af..a5468b26 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -172,8 +172,10 @@ module TwoScalars = { } } -let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result<(pointSetDist, pointSetDist), 'e> => - E.R.merge(toPointSetFn(estimate, ()), toPointSetFn(answer, ())) +let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result< + (pointSetDist, pointSetDist), + 'e, +> => E.R.merge(toPointSetFn(estimate, ()), toPointSetFn(answer, ())) let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< float, diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 9b22327f..47a067fc 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -223,7 +223,10 @@ let dispatchToGenericOutput = ( | ("normalize", [EvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer)]) => Some( - DistributionOperation.run(FromDist(ToScore(LogScore(Score_Dist(answer), None)), estimate), ~env), + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Dist(answer), None)), estimate), + ~env, + ), ) | ("klDivergence", [EvDistribution(estimate), EvDistribution(answer), EvDistribution(prior)]) => Some( From 1a6ced03733c8993206c3c816dbc25109648d8aa Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 09:34:56 -0400 Subject: [PATCH 13/34] a few comments more --- .../src/rescript/Distributions/GenericDist.res | 14 ++------------ .../PointSetDist/PointSetDist_Scoring.res | 15 +++++++-------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index e63490ea..02163092 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -183,18 +183,8 @@ module Score = { ->PointSetDist_Scoring.DistEstimateScalarAnswer ->Ok ) - | (Score_Scalar(esti'), Score_Dist(answ'), None) => - toPointSetFn(answ')->E.R.bind(answ'' => - {estimate: esti', answer: answ'', prior: None} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer - ->Ok - ) - | (Score_Scalar(esti'), Score_Dist(answ'), Some(Ok(PSScalar(prior'')))) => - toPointSetFn(answ')->E.R.bind(answ'' => - {estimate: esti', answer: answ'', prior: Some(prior'')} - ->PointSetDist_Scoring.ScalarEstimateDistAnswer - ->Ok - ) + | (Score_Scalar(_), Score_Dist(_), None) => NotYetImplemented->Error + | (Score_Scalar(_), Score_Dist(_), Some(Ok(PSScalar(_)))) => NotYetImplemented->Error | (Score_Scalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error | (Score_Scalar(esti'), Score_Scalar(answ'), None) => {estimate: esti', answer: answ', prior: None} diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index a5468b26..50f8faa9 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -1,11 +1,11 @@ type pointSetDist = PointSetTypes.pointSetDist type scalar = float +type score = float type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} type scoreArgs = | DistEstimateDistAnswer(abstractScoreArgs) | DistEstimateScalarAnswer(abstractScoreArgs) - | ScalarEstimateDistAnswer(abstractScoreArgs) | ScalarEstimateScalarAnswer(abstractScoreArgs) let logFn = Js.Math.log // base e @@ -35,7 +35,7 @@ module WithDistAnswer = { ~combineFn, ~integrateFn, ~toMixedFn, - ): result => { + ): result => { let combineAndIntegrate = (estimate, answer) => combineFn(integrand, estimate, answer)->E.R2.fmap(integrateFn) @@ -83,7 +83,7 @@ module WithDistAnswer = { ~combineFn, ~integrateFn, ~toMixedFn, - ): result => { + ): result => { let kl1 = sum(~estimate, ~answer, ~combineFn, ~integrateFn, ~toMixedFn) let kl2 = sum(~estimate=prior, ~answer, ~combineFn, ~integrateFn, ~toMixedFn) E.R.merge(kl1, kl2)->E.R2.fmap(((kl1', kl2')) => kl1' -. kl2') @@ -92,9 +92,9 @@ module WithDistAnswer = { module WithScalarAnswer = { let sum = (mp: PointSetTypes.MixedPoint.t): float => mp.continuous +. mp.discrete - let score = (~estimate: pointSetDist, ~answer: scalar): result => { + let score = (~estimate: pointSetDist, ~answer: scalar): result => { let _score = (~estimatePdf: float => float, ~answer: float): result< - float, + score, Operation.Error.t, > => { let density = answer->estimatePdf @@ -117,7 +117,7 @@ module WithScalarAnswer = { } let scoreWithPrior = (~estimate: pointSetDist, ~answer: scalar, ~prior: pointSetDist): result< - float, + score, Operation.Error.t, > => { let _scoreWithPrior = ( @@ -178,7 +178,7 @@ let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): resul > => E.R.merge(toPointSetFn(estimate, ()), toPointSetFn(answer, ())) let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< - float, + score, Operation.Error.t, > => switch args { @@ -190,7 +190,6 @@ let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< WithScalarAnswer.score(~estimate, ~answer) | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => WithScalarAnswer.scoreWithPrior(~estimate, ~answer, ~prior) - | ScalarEstimateDistAnswer(_) => Operation.NotYetImplemented->Error | ScalarEstimateScalarAnswer({estimate, answer, prior: None}) => TwoScalars.score(~estimate, ~answer) | ScalarEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => From 2c72972097f0c6fe3972ae1191b35879fb59597d Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 09:35:25 -0400 Subject: [PATCH 14/34] the lintness --- packages/cli/README.md | 8 +- packages/cli/package.json | 39 +- packages/components/src/styles/base.css | 453 +++++++++++--------- packages/components/src/styles/forms.css | 226 +++++----- packages/vscode-ext/.eslintrc.json | 38 +- packages/vscode-ext/.vscode/extensions.json | 8 +- packages/vscode-ext/.vscode/launch.json | 50 +-- packages/vscode-ext/.vscode/settings.json | 18 +- packages/vscode-ext/.vscode/tasks.json | 32 +- packages/vscode-ext/tsconfig.json | 28 +- 10 files changed, 469 insertions(+), 431 deletions(-) diff --git a/packages/cli/README.md b/packages/cli/README.md index d1ec4b8b..7b0d0038 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -2,19 +2,21 @@ This package can be used to incorporate a very simple `import` system into Squiggle. -To use, write special files with a ``.squiggleU`` file type. In these files, you can write lines like, +To use, write special files with a `.squiggleU` file type. In these files, you can write lines like, ``` @import(models/gdp_over_time.squiggle, gdpOverTime) gdpOverTime(2.5) ``` -The imports will be replaced with the contents of the file in `models/gdp_over_time.squiggle` upon compilation. The ``.squiggleU`` file will be converted into a ``.squiggle`` file with the ``import`` statement having this replacement. +The imports will be replaced with the contents of the file in `models/gdp_over_time.squiggle` upon compilation. The `.squiggleU` file will be converted into a `.squiggle` file with the `import` statement having this replacement. ## Running ### `npx squiggle-cli-experimental compile` + Runs compilation in the current directory and all of its subdirectories. ### `npx squiggle-cli-experimental watch` -Watches ``.squiggleU`` files in the current directory (and subdirectories) and rebuilds them when they are saved. Note that this will *not* rebuild files when their dependencies are changed, just when they are changed directly. \ No newline at end of file + +Watches `.squiggleU` files in the current directory (and subdirectories) and rebuilds them when they are saved. Note that this will _not_ rebuild files when their dependencies are changed, just when they are changed directly. diff --git a/packages/cli/package.json b/packages/cli/package.json index 1206f8d8..053d8096 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,22 +1,21 @@ { - "name": "squiggle-cli-experimental", - "version": "0.0.3", - "main": "index.js", - "homepage": "https://squiggle-language.com", - "author": "Quantified Uncertainty Research Institute", - "bin": "index.js", - "type": "module", - "scripts": { - "start": "node ." - }, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.1", - "chokidar": "^3.5.3", - "commander": "^9.3.0", - "fs": "^0.0.1-security", - "glob": "^8.0.3", - "indent-string": "^5.0.0" - } + "name": "squiggle-cli-experimental", + "version": "0.0.3", + "main": "index.js", + "homepage": "https://squiggle-language.com", + "author": "Quantified Uncertainty Research Institute", + "bin": "index.js", + "type": "module", + "scripts": { + "start": "node ." + }, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "commander": "^9.3.0", + "fs": "^0.0.1-security", + "glob": "^8.0.3", + "indent-string": "^5.0.0" } - \ No newline at end of file +} diff --git a/packages/components/src/styles/base.css b/packages/components/src/styles/base.css index e0a33a56..a5922d5e 100644 --- a/packages/components/src/styles/base.css +++ b/packages/components/src/styles/base.css @@ -1,5 +1,5 @@ .squiggle { -/* + /* This file contains: 1) Base Tailwind preflight styles 2) Base https://github.com/tailwindlabs/tailwindcss-forms styles @@ -7,365 +7,390 @@ This file contains: (Both are wrapped in .squiggle) */ -/* + /* 1. Use a consistent sensible line-height in all browsers. 2. Prevent adjustments of font size after orientation changes in iOS. 3. Use a more readable tab size. 4. Use the user's configured `sans` font-family by default. */ -/* html { */ + /* html { */ line-height: 1.5; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -moz-tab-size: 4; /* 3 */ tab-size: 4; /* 3 */ - font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */ -/* } */ + font-family: theme( + "fontFamily.sans", + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + "Helvetica Neue", + Arial, + "Noto Sans", + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji" + ); /* 4 */ + /* } */ -/* + /* 1. Remove the margin in all browsers. 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. */ -/* body { */ + /* body { */ margin: 0; /* 1 */ line-height: inherit; /* 2 */ -/* } */ + /* } */ - -/* + /* 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) */ -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: theme('borderColor.DEFAULT', currentColor); /* 2 */ -} + *, + ::before, + ::after { + box-sizing: border-box; /* 1 */ + border-width: 0; /* 2 */ + border-style: solid; /* 2 */ + border-color: theme("borderColor.DEFAULT", currentColor); /* 2 */ + } -::before, -::after { - --tw-content: ''; -} + ::before, + ::after { + --tw-content: ""; + } -/* + /* 1. Add the correct height in Firefox. 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 3. Ensure horizontal rules are visible by default. */ -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ - border-top-width: 1px; /* 3 */ -} + hr { + height: 0; /* 1 */ + color: inherit; /* 2 */ + border-top-width: 1px; /* 3 */ + } -/* + /* Add the correct text decoration in Chrome, Edge, and Safari. */ -abbr:where([title]) { - text-decoration: underline dotted; -} + abbr:where([title]) { + text-decoration: underline dotted; + } -/* + /* Remove the default font size and weight for headings. */ -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} + h1, + h2, + h3, + h4, + h5, + h6 { + font-size: inherit; + font-weight: inherit; + } -/* + /* Reset links to optimize for opt-in styling instead of opt-out. */ -a { - color: inherit; - text-decoration: inherit; -} + a { + color: inherit; + text-decoration: inherit; + } -/* + /* Add the correct font weight in Edge and Safari. */ -b, -strong { - font-weight: bolder; -} + b, + strong { + font-weight: bolder; + } -/* + /* 1. Use the user's configured `mono` font family by default. 2. Correct the odd `em` font sizing in all browsers. */ -code, -kbd, -samp, -pre { - font-family: theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); /* 1 */ - font-size: 1em; /* 2 */ -} + code, + kbd, + samp, + pre { + font-family: theme( + "fontFamily.mono", + ui-monospace, + SFMono-Regular, + Menlo, + Monaco, + Consolas, + "Liberation Mono", + "Courier New", + monospace + ); /* 1 */ + font-size: 1em; /* 2 */ + } -/* + /* Add the correct font size in all browsers. */ -small { - font-size: 80%; -} + small { + font-size: 80%; + } -/* + /* Prevent `sub` and `sup` elements from affecting the line height in all browsers. */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } -sub { - bottom: -0.25em; -} + sub { + bottom: -0.25em; + } -sup { - top: -0.5em; -} + sup { + top: -0.5em; + } -/* + /* 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 3. Remove gaps between table borders by default. */ -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ - border-collapse: collapse; /* 3 */ -} + table { + text-indent: 0; /* 1 */ + border-color: inherit; /* 2 */ + border-collapse: collapse; /* 3 */ + } -/* + /* 1. Change the font styles in all browsers. 2. Remove the margin in Firefox and Safari. 3. Remove default padding in all browsers. */ -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - font-weight: inherit; /* 1 */ - line-height: inherit; /* 1 */ - color: inherit; /* 1 */ - margin: 0; /* 2 */ - padding: 0; /* 3 */ -} + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + font-weight: inherit; /* 1 */ + line-height: inherit; /* 1 */ + color: inherit; /* 1 */ + margin: 0; /* 2 */ + padding: 0; /* 3 */ + } -/* + /* Remove the inheritance of text transform in Edge and Firefox. */ -button, -select { - text-transform: none; -} + button, + select { + text-transform: none; + } -/* + /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Remove default button styles. */ -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; /* 1 */ - background-color: transparent; /* 2 */ - background-image: none; /* 2 */ -} + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; /* 1 */ + background-color: transparent; /* 2 */ + background-image: none; /* 2 */ + } -/* + /* Use the modern Firefox focus style for all focusable elements. */ -:-moz-focusring { - outline: auto; -} + :-moz-focusring { + outline: auto; + } -/* + /* Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) */ -:-moz-ui-invalid { - box-shadow: none; -} + :-moz-ui-invalid { + box-shadow: none; + } -/* + /* Add the correct vertical alignment in Chrome and Firefox. */ -progress { - vertical-align: baseline; -} + progress { + vertical-align: baseline; + } -/* + /* Correct the cursor style of increment and decrement buttons in Safari. */ -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { + height: auto; + } -/* + /* 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */ -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } -/* + /* Remove the inner padding in Chrome and Safari on macOS. */ -::-webkit-search-decoration { - -webkit-appearance: none; -} + ::-webkit-search-decoration { + -webkit-appearance: none; + } -/* + /* 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */ -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } -/* + /* Add the correct display in Chrome and Safari. */ -summary { - display: list-item; -} + summary { + display: list-item; + } -/* + /* Removes the default spacing and border for appropriate elements. */ -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} + blockquote, + dl, + dd, + h1, + h2, + h3, + h4, + h5, + h6, + hr, + figure, + p, + pre { + margin: 0; + } -fieldset { - margin: 0; - padding: 0; -} + fieldset { + margin: 0; + padding: 0; + } -legend { - padding: 0; -} + legend { + padding: 0; + } -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} + ol, + ul, + menu { + list-style: none; + margin: 0; + padding: 0; + } -/* + /* Prevent resizing textareas horizontally by default. */ -textarea { - resize: vertical; -} + textarea { + resize: vertical; + } -/* + /* 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 2. Set the default placeholder color to the user's configured gray 400 color. */ -input::placeholder, -textarea::placeholder { - opacity: 1; /* 1 */ - color: theme('colors.gray.400', #9ca3af); /* 2 */ -} + input::placeholder, + textarea::placeholder { + opacity: 1; /* 1 */ + color: theme("colors.gray.400", #9ca3af); /* 2 */ + } -/* + /* Set the default cursor for buttons. */ -button, -[role="button"] { - cursor: pointer; -} + button, + [role="button"] { + cursor: pointer; + } -/* + /* Make sure disabled buttons don't get the pointer cursor. */ -:disabled { - cursor: default; -} + :disabled { + cursor: default; + } -/* + /* 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) This can trigger a poorly considered lint error in some tools but is included by design. */ -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; /* 1 */ - vertical-align: middle; /* 2 */ -} + img, + svg, + video, + canvas, + audio, + iframe, + embed, + object { + display: block; /* 1 */ + vertical-align: middle; /* 2 */ + } -/* + /* Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) */ -img, -video { - max-width: 100%; - height: auto; -} + img, + video { + max-width: 100%; + height: auto; + } } diff --git a/packages/components/src/styles/forms.css b/packages/components/src/styles/forms.css index 60b4075d..0a54ab22 100644 --- a/packages/components/src/styles/forms.css +++ b/packages/components/src/styles/forms.css @@ -1,102 +1,130 @@ /* Fork of https://github.com/tailwindlabs/tailwindcss-forms styles, see the comment in main.css for details. */ .squiggle { -.form-input,.form-textarea,.form-select,.form-multiselect { -appearance: none; -background-color: #fff; -border-color: #6b7280; -border-width: 1px; -border-radius: 0px; -padding-top: 0.5rem; -padding-right: 0.75rem; -padding-bottom: 0.5rem; -padding-left: 0.75rem; -font-size: 1rem; -line-height: 1.5rem; ---tw-shadow: 0 0 #0000; -} -.form-input:focus, .form-textarea:focus, .form-select:focus, .form-multiselect:focus { -outline: 2px solid transparent; -outline-offset: 2px; ---tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); ---tw-ring-offset-width: 0px; ---tw-ring-offset-color: #fff; ---tw-ring-color: #2563eb; ---tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); ---tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); -box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -border-color: #2563eb; -} -.form-input::placeholder,.form-textarea::placeholder { -color: #6b7280; -opacity: 1; -} -.form-input::-webkit-datetime-edit-fields-wrapper { -padding: 0; -} -.form-input::-webkit-date-and-time-value { -min-height: 1.5em; -} -.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-year-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-second-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-meridiem-field { -padding-top: 0; -padding-bottom: 0; -} -.form-checkbox,.form-radio { -appearance: none; -padding: 0; --webkit-print-color-adjust: exact; - print-color-adjust: exact; -display: inline-block; -vertical-align: middle; -background-origin: border-box; --webkit-user-select: none; - user-select: none; -flex-shrink: 0; -height: 1rem; -width: 1rem; -color: #2563eb; -background-color: #fff; -border-color: #6b7280; -border-width: 1px; ---tw-shadow: 0 0 #0000; -} -.form-checkbox { -border-radius: 0px; -} -.form-checkbox:focus,.form-radio:focus { -outline: 2px solid transparent; -outline-offset: 2px; ---tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); ---tw-ring-offset-width: 2px; ---tw-ring-offset-color: #fff; ---tw-ring-color: #2563eb; ---tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); ---tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); -box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} -.form-checkbox:checked,.form-radio:checked { -border-color: transparent; -background-color: currentColor; -background-size: 100% 100%; -background-position: center; -background-repeat: no-repeat; -} -.form-checkbox:checked { -background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); -} -.form-checkbox:checked:hover,.form-checkbox:checked:focus,.form-radio:checked:hover,.form-radio:checked:focus { -border-color: transparent; -background-color: currentColor; -} -.form-checkbox:indeterminate { -background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); -border-color: transparent; -background-color: currentColor; -background-size: 100% 100%; -background-position: center; -background-repeat: no-repeat; -} -.form-checkbox:indeterminate:hover,.form-checkbox:indeterminate:focus { -border-color: transparent; -background-color: currentColor; -} + .form-input, + .form-textarea, + .form-select, + .form-multiselect { + appearance: none; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; + } + .form-input:focus, + .form-textarea:focus, + .form-select:focus, + .form-multiselect:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow); + border-color: #2563eb; + } + .form-input::placeholder, + .form-textarea::placeholder { + color: #6b7280; + opacity: 1; + } + .form-input::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + .form-input::-webkit-date-and-time-value { + min-height: 1.5em; + } + .form-input::-webkit-datetime-edit, + .form-input::-webkit-datetime-edit-year-field, + .form-input::-webkit-datetime-edit-month-field, + .form-input::-webkit-datetime-edit-day-field, + .form-input::-webkit-datetime-edit-hour-field, + .form-input::-webkit-datetime-edit-minute-field, + .form-input::-webkit-datetime-edit-second-field, + .form-input::-webkit-datetime-edit-millisecond-field, + .form-input::-webkit-datetime-edit-meridiem-field { + padding-top: 0; + padding-bottom: 0; + } + .form-checkbox, + .form-radio { + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; + } + .form-checkbox { + border-radius: 0px; + } + .form-checkbox:focus, + .form-radio:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow); + } + .form-checkbox:checked, + .form-radio:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; + } + .form-checkbox:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); + } + .form-checkbox:checked:hover, + .form-checkbox:checked:focus, + .form-radio:checked:hover, + .form-radio:checked:focus { + border-color: transparent; + background-color: currentColor; + } + .form-checkbox:indeterminate { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; + } + .form-checkbox:indeterminate:hover, + .form-checkbox:indeterminate:focus { + border-color: transparent; + background-color: currentColor; + } } diff --git a/packages/vscode-ext/.eslintrc.json b/packages/vscode-ext/.eslintrc.json index f9b22b79..5dfecab7 100644 --- a/packages/vscode-ext/.eslintrc.json +++ b/packages/vscode-ext/.eslintrc.json @@ -1,24 +1,18 @@ { - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - }, - "ignorePatterns": [ - "out", - "dist", - "**/*.d.ts" - ] + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "rules": { + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/semi": "warn", + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "semi": "off" + }, + "ignorePatterns": ["out", "dist", "**/*.d.ts"] } diff --git a/packages/vscode-ext/.vscode/extensions.json b/packages/vscode-ext/.vscode/extensions.json index 3ac9aeb6..c0a2258b 100644 --- a/packages/vscode-ext/.vscode/extensions.json +++ b/packages/vscode-ext/.vscode/extensions.json @@ -1,7 +1,5 @@ { - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "dbaeumer.vscode-eslint" - ] + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": ["dbaeumer.vscode-eslint"] } diff --git a/packages/vscode-ext/.vscode/launch.json b/packages/vscode-ext/.vscode/launch.json index 670d6e66..1210201d 100644 --- a/packages/vscode-ext/.vscode/launch.json +++ b/packages/vscode-ext/.vscode/launch.json @@ -3,32 +3,26 @@ // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 { - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" - ], - "outFiles": [ - "${workspaceFolder}/out/test/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - } - ] + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "outFiles": ["${workspaceFolder}/out/**/*.js"], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": ["${workspaceFolder}/out/test/**/*.js"], + "preLaunchTask": "${defaultBuildTask}" + } + ] } diff --git a/packages/vscode-ext/.vscode/settings.json b/packages/vscode-ext/.vscode/settings.json index 30bf8c2d..ffeaf91c 100644 --- a/packages/vscode-ext/.vscode/settings.json +++ b/packages/vscode-ext/.vscode/settings.json @@ -1,11 +1,11 @@ // Place your settings in this file to overwrite default and user settings. { - "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files - }, - "search.exclude": { - "out": true // set this to false to include "out" folder in search results - }, - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts - "typescript.tsc.autoDetect": "off" -} \ No newline at end of file + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/packages/vscode-ext/.vscode/tasks.json b/packages/vscode-ext/.vscode/tasks.json index 3b17e53b..078ff7e0 100644 --- a/packages/vscode-ext/.vscode/tasks.json +++ b/packages/vscode-ext/.vscode/tasks.json @@ -1,20 +1,20 @@ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format { - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "group": { - "kind": "build", - "isDefault": true - } - } - ] + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] } diff --git a/packages/vscode-ext/tsconfig.json b/packages/vscode-ext/tsconfig.json index 29fc0a52..aed48ef9 100644 --- a/packages/vscode-ext/tsconfig.json +++ b/packages/vscode-ext/tsconfig.json @@ -1,17 +1,15 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "ES2020", - "outDir": "out", - "lib": [ - "ES2020", "dom" - ], - "sourceMap": true, - "rootDir": "src", - "strict": true, /* enable all strict type-checking options */ - /* Additional Checks */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - } + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "outDir": "out", + "lib": ["ES2020", "dom"], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } } From 633bab9c30a7a5d4ae2d25ce15e377f0d86f7490 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 20 Jun 2022 11:11:11 -0400 Subject: [PATCH 15/34] a fistful of comments --- .../Distributions/PointSetDist/PointSetDist_Scoring.res | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 50f8faa9..1335e990 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -124,7 +124,7 @@ module WithScalarAnswer = { ~estimatePdf: float => float, ~answer: scalar, ~priorPdf: float => float, - ): result => { + ): result => { let numerator = answer->estimatePdf let priorDensityOfAnswer = answer->priorPdf if numerator < 0.0 || priorDensityOfAnswer < 0.0 { @@ -162,7 +162,7 @@ module TwoScalars = { minusScaledLogOfQuotient(~esti=estimate, ~answ=answer) } - let scoreWithPrior = (~estimate: float, ~answer: float, ~prior: float) => + let scoreWithPrior = (~estimate: scalar, ~answer: scalar, ~prior: scalar) => if answer == 0.0 { 0.0->Ok } else if estimate == 0.0 || prior == 0.0 { From 4b1c226173e43e76453fd6f60a2df057b49048d3 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Mon, 20 Jun 2022 16:14:41 -0400 Subject: [PATCH 16/34] fix: PointSetDist_Scoring.WithScalarAnswer.scoreWithPrior Done in pair coding with Quinn. Value::[0.3 to 0.9] --- .../Scoring/WithScalarAnswer_test.res | 81 +++++++++++++++++++ .../PointSetDist/PointSetDist_Scoring.res | 11 ++- 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res new file mode 100644 index 00000000..362aed81 --- /dev/null +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res @@ -0,0 +1,81 @@ +// Bring up a discrete distribution +open Jest +open Expect +open TestHelpers +open GenericDist_Fixtures + +// WithDistAnswer -> in the KL divergence test file. + +// WithScalarAnswer +describe("WithScalarAnswer: discrete -> discrete -> float", () => { + let mixture = a => DistributionTypes.DistributionOperation.Mixture(a) + let pointA = mkDelta(3.0) + let pointB = mkDelta(2.0) + let pointC = mkDelta(1.0) + let pointD = mkDelta(0.0) + + test("score: agrees with analytical answer when finite", () => { + let prediction' = [(pointA, 0.25), (pointB, 0.25), (pointC, 0.25), (pointD, 0.25)]->mixture->run + let prediction = switch prediction' { + | Dist(PointSet(a'')) => a'' + | _ => raise(MixtureFailed) + } + + let answer = 2.0 // So this is: assigning 100% probability to 2.0 + let result = PointSetDist_Scoring.WithScalarAnswer.score(~estimate=prediction, ~answer) + switch result { + | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.25 /. 1.0)) + | _ => raise(MixtureFailed) + } + }) + + test("score: agrees with analytical answer when finite", () => { + let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run + let prediction = switch prediction' { + | Dist(PointSet(a'')) => a'' + | _ => raise(MixtureFailed) + } + let answer = 3.0 // So this is: assigning 100% probability to 2.0 + let result = PointSetDist_Scoring.WithScalarAnswer.score(~estimate=prediction, ~answer) + switch result { + | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.75 /. 1.0)) + | _ => raise(MixtureFailed) + } + }) + + test("scoreWithPrior: ", () => { + let prior' = [(pointA, 0.5), (pointB, 0.5)]->mixture->run + let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run + + let prediction = switch prediction' { + | Dist(PointSet(a'')) => a'' + | _ => raise(MixtureFailed) + } + + let prior = switch prior' { + | Dist(PointSet(a'')) => a'' + | _ => raise(MixtureFailed) + } + + let answer = 3.0 // So this is: assigning 100% probability to 2.0 + let result = PointSetDist_Scoring.WithScalarAnswer.scoreWithPrior( + ~estimate=prediction, + ~answer, + ~prior, + ) + switch result { + | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.75 /. 1.0) -. -.Js.Math.log(0.5 /. 1.0)) + | _ => raise(MixtureFailed) + } + }) +}) + +// WithDistAnswer +/* +describe("WithScalarAnswer: discrete -> discrete -> float", () => { +}) + +// TwoScalars +describe("WithScalarAnswer: discrete -> discrete -> float", () => { +}) +*/ diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 1335e990..fc1ad8f3 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -115,11 +115,20 @@ module WithScalarAnswer = { } _score(~estimatePdf, ~answer) } + /* + let score1 = (~estimate: pointSetDist, ~answer: scalar): result => { + let probabilityAssignedToAnswer = Ok(1.0) + } + */ let scoreWithPrior = (~estimate: pointSetDist, ~answer: scalar, ~prior: pointSetDist): result< score, Operation.Error.t, > => { + E.R.merge(score(~estimate, ~answer), score(~estimate=prior, ~answer))->E.R2.fmap(((s1, s2)) => + s1 -. s2 + ) + /* let _scoreWithPrior = ( ~estimatePdf: float => float, ~answer: scalar, @@ -132,7 +141,6 @@ module WithScalarAnswer = { } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { infinity->Ok } else { - minusScaledLogOfQuotient(~esti=numerator, ~answ=priorDensityOfAnswer) } } @@ -149,6 +157,7 @@ module WithScalarAnswer = { | Mixed(prio) => Mixed.T.xToY(x, prio)->sum } _scoreWithPrior(~estimatePdf, ~answer, ~priorPdf) + */ } } From 93f5b4ba2ac13e18cbcae5841a230ebe196ed8fc Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Mon, 20 Jun 2022 16:39:48 -0400 Subject: [PATCH 17/34] feat: Fix remaining scoring errors with Quinn Value::0.3 to 0.9 --- .../Scoring/WithScalarAnswer_test.res | 92 ++++++++++++++++++- .../PointSetDist/PointSetDist_Scoring.res | 25 ++++- 2 files changed, 111 insertions(+), 6 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res index 362aed81..2732d384 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res @@ -14,7 +14,7 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { let pointC = mkDelta(1.0) let pointD = mkDelta(0.0) - test("score: agrees with analytical answer when finite", () => { + test("WithScalarAnswer.score: agrees with analytical answer when finite", () => { let prediction' = [(pointA, 0.25), (pointB, 0.25), (pointC, 0.25), (pointD, 0.25)]->mixture->run let prediction = switch prediction' { | Dist(PointSet(a'')) => a'' @@ -29,7 +29,7 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { } }) - test("score: agrees with analytical answer when finite", () => { + test("WithScalarAnswer.score: agrees with analytical answer when finite", () => { let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run let prediction = switch prediction' { | Dist(PointSet(a'')) => a'' @@ -43,7 +43,7 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { } }) - test("scoreWithPrior: ", () => { + test("WithScalarAnswer.scoreWithPrior: ", () => { let prior' = [(pointA, 0.5), (pointB, 0.5)]->mixture->run let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run @@ -70,7 +70,91 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { }) }) -// WithDistAnswer +describe("TwoScalars: float -> float -> float", () => { + test("TwoScalars.score: ", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 2.0 // 100% of probability mass to 2.0 + let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) + switch score { + | Ok(x) => x->expect->toEqual(infinity) + | _ => raise(MixtureFailed) + } + }) + + test("TwoScalars.score: ", () => { + let scalar1 = 1.5 // 100% of probability mass 1.0 + let scalar2 = 1.5 // 100% of probability mass to 2.0 + let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(MixtureFailed) + } + }) + + test("TwoScalars.scoreWithPrior: ", () => { + let scalar1 = 1.5 // 100% of probability mass 1.0 + let scalar2 = 1.5 // 100% of probability mass to 2.0 + let scalar3 = 1.0 // 100% of probability mass to 2.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(-.infinity) + | _ => raise(MixtureFailed) + } + }) + + test("TwoScalars.scoreWithPrior: ", () => { + let scalar1 = 1.5 // 100% of probability mass 1.0 + let scalar2 = 1.5 // 100% of probability mass to 2.0 + let scalar3 = 1.5 // 100% of probability mass to 2.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(MixtureFailed) + } + }) + + test("TwoScalars.scoreWithPrior: ", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 1.5 // 100% of probability mass to 2.0 + let scalar3 = 1.0 // 100% of probability mass to 2.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual("Error: Really dumb forecasters") // unclear what this case should give; could be smth else, or undefined + | _ => raise(MixtureFailed) + } + }) + + test("TwoScalars.scoreWithPrior: ", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 1.0 // 100% of probability mass to 2.0 + let scalar3 = 1.0 // 100% of probability mass to 2.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(MixtureFailed) + } + }) +}) /* describe("WithScalarAnswer: discrete -> discrete -> float", () => { }) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index fc1ad8f3..7db90ee0 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -129,7 +129,7 @@ module WithScalarAnswer = { s1 -. s2 ) /* - let _scoreWithPrior = ( + let _scoreWithPrior = ( ~estimatePdf: float => float, ~answer: scalar, ~priorPdf: float => float, @@ -141,6 +141,7 @@ module WithScalarAnswer = { } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { infinity->Ok } else { + // } } @@ -157,11 +158,30 @@ module WithScalarAnswer = { | Mixed(prio) => Mixed.T.xToY(x, prio)->sum } _scoreWithPrior(~estimatePdf, ~answer, ~priorPdf) - */ +*/ } } +// For mixed discrete answer +// (prediction, answer) => sum(answer.map(a => a.probability * WithScalarAnswer.score(prediction, a.value))) + module TwoScalars = { + // You will almost never want to use this. + let score = (~estimate: scalar, ~answer: scalar) => { + if estimate == answer { + 0.0->Ok + } else { + infinity->Ok // - log(0) + } + } + + let scoreWithPrior = (~estimate: scalar, ~answer: scalar, ~prior: scalar) => { + E.R.merge(score(~estimate, ~answer), score(~estimate=prior, ~answer))->E.R2.fmap(((s1, s2)) => + s1 -. s2 + ) + // unclear what this should give if both are wrong: infinity-infinity. Maybe some warning?? + } + /* let score = (~estimate: scalar, ~answer: scalar) => if answer == 0.0 { 0.0->Ok @@ -179,6 +199,7 @@ module TwoScalars = { } else { minusScaledLogOfQuotient(~esti=estimate /. prior, ~answ=answer) } + */ } let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result< From 95adc677010230bae4dc988bde7a3c5bc9484711 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Tue, 21 Jun 2022 11:55:00 -0400 Subject: [PATCH 18/34] some adjustments I guess --- .../rescript/Distributions/GenericDist.res | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 02163092..b8aa680f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -172,16 +172,20 @@ module Score = { ) | (Score_Dist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => - toPointSetFn(esti')->E.R.bind(esti'' => - {estimate: esti'', answer: answ', prior: None} - ->PointSetDist_Scoring.DistEstimateScalarAnswer - ->Ok + toPointSetFn(esti')->E.R2.fmap(esti'' => + { + estimate: esti'', + answer: answ', + prior: None, + }->PointSetDist_Scoring.DistEstimateScalarAnswer ) | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(PSDist(prior'')))) => - toPointSetFn(esti')->E.R.bind(esti'' => - {estimate: esti'', answer: answ', prior: Some(prior'')} - ->PointSetDist_Scoring.DistEstimateScalarAnswer - ->Ok + toPointSetFn(esti')->E.R2.fmap(esti'' => + { + estimate: esti'', + answer: answ', + prior: Some(prior''), + }->PointSetDist_Scoring.DistEstimateScalarAnswer ) | (Score_Scalar(_), Score_Dist(_), None) => NotYetImplemented->Error | (Score_Scalar(_), Score_Dist(_), Some(Ok(PSScalar(_)))) => NotYetImplemented->Error From d80ea676c5ca745d28362789f05465fbb7611b1c Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Tue, 21 Jun 2022 12:23:58 -0400 Subject: [PATCH 19/34] fixed tests after pair; error'd out mixed case --- .../Distributions/GenericDist_Fixtures.res | 7 +- .../Distributions/Scoring/TwoScalars_test.res | 90 +++++++++++++ .../Scoring/WithScalarAnswer_test.res | 121 ++---------------- .../PointSetDist/PointSetDist_Scoring.res | 87 +++---------- 4 files changed, 121 insertions(+), 184 deletions(-) create mode 100644 packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res diff --git a/packages/squiggle-lang/__tests__/Distributions/GenericDist_Fixtures.res b/packages/squiggle-lang/__tests__/Distributions/GenericDist_Fixtures.res index d184b61b..440d7681 100644 --- a/packages/squiggle-lang/__tests__/Distributions/GenericDist_Fixtures.res +++ b/packages/squiggle-lang/__tests__/Distributions/GenericDist_Fixtures.res @@ -19,7 +19,6 @@ exception MixtureFailed let float1 = 1.0 let float2 = 2.0 let float3 = 3.0 -let {mkDelta} = module(TestHelpers) -let point1 = mkDelta(float1) -let point2 = mkDelta(float2) -let point3 = mkDelta(float3) +let point1 = TestHelpers.mkDelta(float1) +let point2 = TestHelpers.mkDelta(float2) +let point3 = TestHelpers.mkDelta(float3) diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res new file mode 100644 index 00000000..a200212d --- /dev/null +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res @@ -0,0 +1,90 @@ +open Jest +open Expect +open GenericDist_Fixtures +exception ScoreFailed + +describe("TwoScalars: scalar -> scalar -> score", () => { + test("score: infinity", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 2.0 // 100% of probability mass to 2.0 + let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) + switch score { + | Ok(x) => x->expect->toEqual(infinity) + | _ => raise(MixtureFailed) + } + }) + + test("score: 0.0", () => { + let scalar1 = 1.5 // 100% of probability mass 1.5 + let scalar2 = 1.5 // 100% of probability mass to 1.5 + let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(MixtureFailed) + } + }) + + test("scoreWithPrior: minus infinity", () => { + let scalar1 = 1.5 // 100% of probability mass 1.5 + let scalar2 = 1.5 // 100% of probability mass to 1.5 + let scalar3 = 1.0 // 100% of probability mass to 1.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(-.infinity) + | _ => raise(MixtureFailed) + } + }) + + test("scoreWithPrior: 0.0", () => { + let scalar1 = 1.5 // 100% of probability mass 1.5 + let scalar2 = 1.5 // 100% of probability mass to 1.5 + let scalar3 = 1.5 // 100% of probability mass to 1.5 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(ScoreFailed) + } + }) + + test("scoreWithPrior: really dumb forecasters", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 1.5 // 100% of probability mass to 1.5 + let scalar3 = 1.0 // 100% of probability mass to 1.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(infinity -. infinity) // "Error: Really dumb forecasters" + | _ => raise(ScoreFailed) + } + }) + + test("scoreWithPrior: 0.0", () => { + let scalar1 = 1.0 // 100% of probability mass 1.0 + let scalar2 = 1.0 // 100% of probability mass to 1.0 + let scalar3 = 1.0 // 100% of probability mass to 1.0 + + let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( + ~estimate=scalar1, + ~answer=scalar2, + ~prior=scalar3, + ) + switch score { + | Ok(x) => x->expect->toEqual(0.0) + | _ => raise(ScoreFailed) + } + }) +}) diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res index 2732d384..f899f30d 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/WithScalarAnswer_test.res @@ -1,23 +1,20 @@ -// Bring up a discrete distribution open Jest open Expect open TestHelpers open GenericDist_Fixtures +exception ScoreFailed -// WithDistAnswer -> in the KL divergence test file. - -// WithScalarAnswer -describe("WithScalarAnswer: discrete -> discrete -> float", () => { +describe("WithScalarAnswer: discrete -> scalar -> score", () => { let mixture = a => DistributionTypes.DistributionOperation.Mixture(a) let pointA = mkDelta(3.0) let pointB = mkDelta(2.0) let pointC = mkDelta(1.0) let pointD = mkDelta(0.0) - test("WithScalarAnswer.score: agrees with analytical answer when finite", () => { + test("score: agrees with analytical answer when finite", () => { let prediction' = [(pointA, 0.25), (pointB, 0.25), (pointC, 0.25), (pointD, 0.25)]->mixture->run let prediction = switch prediction' { - | Dist(PointSet(a'')) => a'' + | Dist(PointSet(p)) => p | _ => raise(MixtureFailed) } @@ -25,35 +22,35 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { let result = PointSetDist_Scoring.WithScalarAnswer.score(~estimate=prediction, ~answer) switch result { | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.25 /. 1.0)) - | _ => raise(MixtureFailed) + | _ => raise(ScoreFailed) } }) - test("WithScalarAnswer.score: agrees with analytical answer when finite", () => { + test("score: agrees with analytical answer when finite", () => { let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run let prediction = switch prediction' { - | Dist(PointSet(a'')) => a'' + | Dist(PointSet(p)) => p | _ => raise(MixtureFailed) } let answer = 3.0 // So this is: assigning 100% probability to 2.0 let result = PointSetDist_Scoring.WithScalarAnswer.score(~estimate=prediction, ~answer) switch result { | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.75 /. 1.0)) - | _ => raise(MixtureFailed) + | _ => raise(ScoreFailed) } }) - test("WithScalarAnswer.scoreWithPrior: ", () => { + test("scoreWithPrior: agrees with analytical answer when finite", () => { let prior' = [(pointA, 0.5), (pointB, 0.5)]->mixture->run let prediction' = [(pointA, 0.75), (pointB, 0.25)]->mixture->run let prediction = switch prediction' { - | Dist(PointSet(a'')) => a'' + | Dist(PointSet(p)) => p | _ => raise(MixtureFailed) } let prior = switch prior' { - | Dist(PointSet(a'')) => a'' + | Dist(PointSet(p)) => p | _ => raise(MixtureFailed) } @@ -65,101 +62,7 @@ describe("WithScalarAnswer: discrete -> discrete -> float", () => { ) switch result { | Ok(x) => x->expect->toEqual(-.Js.Math.log(0.75 /. 1.0) -. -.Js.Math.log(0.5 /. 1.0)) - | _ => raise(MixtureFailed) + | _ => raise(ScoreFailed) } }) }) - -describe("TwoScalars: float -> float -> float", () => { - test("TwoScalars.score: ", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 2.0 // 100% of probability mass to 2.0 - let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) - switch score { - | Ok(x) => x->expect->toEqual(infinity) - | _ => raise(MixtureFailed) - } - }) - - test("TwoScalars.score: ", () => { - let scalar1 = 1.5 // 100% of probability mass 1.0 - let scalar2 = 1.5 // 100% of probability mass to 2.0 - let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(MixtureFailed) - } - }) - - test("TwoScalars.scoreWithPrior: ", () => { - let scalar1 = 1.5 // 100% of probability mass 1.0 - let scalar2 = 1.5 // 100% of probability mass to 2.0 - let scalar3 = 1.0 // 100% of probability mass to 2.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(-.infinity) - | _ => raise(MixtureFailed) - } - }) - - test("TwoScalars.scoreWithPrior: ", () => { - let scalar1 = 1.5 // 100% of probability mass 1.0 - let scalar2 = 1.5 // 100% of probability mass to 2.0 - let scalar3 = 1.5 // 100% of probability mass to 2.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(MixtureFailed) - } - }) - - test("TwoScalars.scoreWithPrior: ", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 1.5 // 100% of probability mass to 2.0 - let scalar3 = 1.0 // 100% of probability mass to 2.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual("Error: Really dumb forecasters") // unclear what this case should give; could be smth else, or undefined - | _ => raise(MixtureFailed) - } - }) - - test("TwoScalars.scoreWithPrior: ", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 1.0 // 100% of probability mass to 2.0 - let scalar3 = 1.0 // 100% of probability mass to 2.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(MixtureFailed) - } - }) -}) -/* -describe("WithScalarAnswer: discrete -> discrete -> float", () => { -}) - -// TwoScalars -describe("WithScalarAnswer: discrete -> discrete -> float", () => { -}) -*/ diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 7db90ee0..56f67d17 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -93,33 +93,32 @@ module WithDistAnswer = { module WithScalarAnswer = { let sum = (mp: PointSetTypes.MixedPoint.t): float => mp.continuous +. mp.discrete let score = (~estimate: pointSetDist, ~answer: scalar): result => { - let _score = (~estimatePdf: float => float, ~answer: float): result< + let _score = (~estimatePdf: float => option, ~answer: float): result< score, Operation.Error.t, > => { let density = answer->estimatePdf - if density < 0.0 { - Operation.PdfInvalidError->Error - } else if density == 0.0 { - infinity->Ok - } else { - density->logFn->(x => -.x)->Ok + switch density { + | None => Operation.PdfInvalidError->Error + | Some(density') => + if density' < 0.0 { + Operation.PdfInvalidError->Error + } else if density' == 0.0 { + infinity->Ok + } else { + density'->logFn->(x => -.x)->Ok + } } } let estimatePdf = x => switch estimate { - | Continuous(esti) => Continuous.T.xToY(x, esti)->sum - | Discrete(esti) => Discrete.T.xToY(x, esti)->sum - | Mixed(esti) => Mixed.T.xToY(x, esti)->sum + | Continuous(esti) => Continuous.T.xToY(x, esti)->sum->Some + | Discrete(esti) => Discrete.T.xToY(x, esti)->sum->Some + | Mixed(_) => None } _score(~estimatePdf, ~answer) } - /* - let score1 = (~estimate: pointSetDist, ~answer: scalar): result => { - let probabilityAssignedToAnswer = Ok(1.0) - } - */ let scoreWithPrior = (~estimate: pointSetDist, ~answer: scalar, ~prior: pointSetDist): result< score, @@ -128,47 +127,13 @@ module WithScalarAnswer = { E.R.merge(score(~estimate, ~answer), score(~estimate=prior, ~answer))->E.R2.fmap(((s1, s2)) => s1 -. s2 ) - /* - let _scoreWithPrior = ( - ~estimatePdf: float => float, - ~answer: scalar, - ~priorPdf: float => float, - ): result => { - let numerator = answer->estimatePdf - let priorDensityOfAnswer = answer->priorPdf - if numerator < 0.0 || priorDensityOfAnswer < 0.0 { - Operation.PdfInvalidError->Error - } else if numerator == 0.0 || priorDensityOfAnswer == 0.0 { - infinity->Ok - } else { - // - } - } - - let estimatePdf = x => - switch estimate { - | Continuous(esti) => Continuous.T.xToY(x, esti)->sum - | Discrete(esti) => Discrete.T.xToY(x, esti)->sum - | Mixed(esti) => Mixed.T.xToY(x, esti)->sum - } - let priorPdf = x => - switch prior { - | Continuous(prio) => Continuous.T.xToY(x, prio)->sum - | Discrete(prio) => Discrete.T.xToY(x, prio)->sum - | Mixed(prio) => Mixed.T.xToY(x, prio)->sum - } - _scoreWithPrior(~estimatePdf, ~answer, ~priorPdf) -*/ } } -// For mixed discrete answer -// (prediction, answer) => sum(answer.map(a => a.probability * WithScalarAnswer.score(prediction, a.value))) - module TwoScalars = { // You will almost never want to use this. let score = (~estimate: scalar, ~answer: scalar) => { - if estimate == answer { + if Js.Math.abs_float(estimate -. answer) < MagicNumbers.Epsilon.ten { 0.0->Ok } else { infinity->Ok // - log(0) @@ -178,28 +143,8 @@ module TwoScalars = { let scoreWithPrior = (~estimate: scalar, ~answer: scalar, ~prior: scalar) => { E.R.merge(score(~estimate, ~answer), score(~estimate=prior, ~answer))->E.R2.fmap(((s1, s2)) => s1 -. s2 - ) - // unclear what this should give if both are wrong: infinity-infinity. Maybe some warning?? + ) // This will presently NaN if both are wrong: infinity-infinity. } - /* - let score = (~estimate: scalar, ~answer: scalar) => - if answer == 0.0 { - 0.0->Ok - } else if estimate == 0.0 { - infinity->Ok - } else { - minusScaledLogOfQuotient(~esti=estimate, ~answ=answer) - } - - let scoreWithPrior = (~estimate: scalar, ~answer: scalar, ~prior: scalar) => - if answer == 0.0 { - 0.0->Ok - } else if estimate == 0.0 || prior == 0.0 { - infinity->Ok - } else { - minusScaledLogOfQuotient(~esti=estimate /. prior, ~answ=answer) - } - */ } let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result< From 9dbd4f076c8356ce6ad3f4731b6b5d03706f43d0 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Fri, 24 Jun 2022 08:56:16 -0400 Subject: [PATCH 20/34] fixed paren balancing and so on --- .../ReducerInterface_GenericDistribution.res | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 69858d71..8b5c0634 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -226,16 +226,22 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio )->Some | ("normalize", [IEvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) | ("klDivergence", [IEvDistribution(prediction), IEvDistribution(answer)]) => - Some(DistributionOperation.run(FromDist(ToScore(LogScore(Score_Dist(answer), None), prediction), ~env)) + Some( + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Dist(answer), None)), prediction), + ~env, + ), + ) | ( "klDivergence", [IEvDistribution(prediction), IEvDistribution(answer), IEvDistribution(prior)], ) => - Some( - DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), estimate), ~env - ) - ) + Some( + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), prediction), + ~env, + ), + ) | ( "logScoreWithPointAnswer", [IEvDistribution(prediction), IEvNumber(answer), IEvDistribution(prior)], @@ -249,7 +255,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ], ) => DistributionOperation.run( - FromDist(ToScore(LogScore(answer, prior->Some)), prediction), + FromDist(ToScore(LogScore(Score_Scalar(answer), Score_Dist(prior)->Some)), prediction), ~env, )->Some | ("logScoreWithPointAnswer", [IEvDistribution(prediction), IEvNumber(answer)]) @@ -257,7 +263,10 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio "logScoreWithPointAnswer", [IEvDistribution(prediction), IEvDistribution(Symbolic(#Float(answer)))], ) => - DistributionOperation.run(FromDist(ToScore(LogScore(answer, None)), prediction), ~env)->Some + DistributionOperation.run( + FromDist(ToScore(LogScore(Score_Scalar(answer), None)), prediction), + ~env, + )->Some | ("isNormalized", [IEvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) | ("toPointSet", [IEvDistribution(dist)]) => Helpers.toDistFn(ToPointSet, dist, ~env) | ("scaleLog", [IEvDistribution(dist)]) => From e0e2f12e27ffef1a50965acd1b387bbd548ddf9d Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Fri, 24 Jun 2022 09:07:15 -0400 Subject: [PATCH 21/34] added path to constructors --- .../ReducerInterface_GenericDistribution.res | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 8b5c0634..22234333 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -228,7 +228,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio | ("klDivergence", [IEvDistribution(prediction), IEvDistribution(answer)]) => Some( DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Dist(answer), None)), prediction), + FromDist(ToScore(LogScore(DistributionTypes.Score_Dist(answer), None)), prediction), ~env, ), ) @@ -238,7 +238,15 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ) => Some( DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Dist(answer), Some(Score_Dist(prior)))), prediction), + FromDist( + ToScore( + LogScore( + DistributionTypes.Score_Dist(answer), + Some(DistributionTypes.Score_Dist(prior)), + ), + ), + prediction, + ), ~env, ), ) @@ -255,7 +263,15 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ], ) => DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Scalar(answer), Score_Dist(prior)->Some)), prediction), + FromDist( + ToScore( + LogScore( + DistributionTypes.Score_Scalar(answer), + DistributionTypes.Score_Dist(prior)->Some, + ), + ), + prediction, + ), ~env, )->Some | ("logScoreWithPointAnswer", [IEvDistribution(prediction), IEvNumber(answer)]) @@ -264,7 +280,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio [IEvDistribution(prediction), IEvDistribution(Symbolic(#Float(answer)))], ) => DistributionOperation.run( - FromDist(ToScore(LogScore(Score_Scalar(answer), None)), prediction), + FromDist(ToScore(LogScore(DistributionTypes.Score_Scalar(answer), None)), prediction), ~env, )->Some | ("isNormalized", [IEvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) From 29cf1cebb23e7a33bf4ddcd447c1ce722a4d9dff Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Fri, 24 Jun 2022 09:19:15 -0400 Subject: [PATCH 22/34] fixed paths to constructors --- .../ReducerInterface_GenericDistribution.res | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index 22234333..fee4df4d 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -228,7 +228,10 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio | ("klDivergence", [IEvDistribution(prediction), IEvDistribution(answer)]) => Some( DistributionOperation.run( - FromDist(ToScore(LogScore(DistributionTypes.Score_Dist(answer), None)), prediction), + FromDist( + ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), None)), + prediction, + ), ~env, ), ) @@ -241,8 +244,8 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio FromDist( ToScore( LogScore( - DistributionTypes.Score_Dist(answer), - Some(DistributionTypes.Score_Dist(prior)), + DistributionTypes.DistributionOperation.Score_Dist(answer), + Some(DistributionTypes.DistributionOperation.Score_Dist(prior)), ), ), prediction, @@ -266,8 +269,8 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio FromDist( ToScore( LogScore( - DistributionTypes.Score_Scalar(answer), - DistributionTypes.Score_Dist(prior)->Some, + DistributionTypes.DistributionOperation.Score_Scalar(answer), + DistributionTypes.DistributionOperation.Score_Dist(prior)->Some, ), ), prediction, @@ -280,7 +283,10 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio [IEvDistribution(prediction), IEvDistribution(Symbolic(#Float(answer)))], ) => DistributionOperation.run( - FromDist(ToScore(LogScore(DistributionTypes.Score_Scalar(answer), None)), prediction), + FromDist( + ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), None)), + prediction, + ), ~env, )->Some | ("isNormalized", [IEvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) From acb0d3b9eeb0f61c1f912f75fdff214ad73be01d Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Sun, 26 Jun 2022 12:28:04 -0400 Subject: [PATCH 23/34] removed \`TwoScalars\` material --- .../Distributions/Scoring/TwoScalars_test.res | 90 ------------------- .../rescript/Distributions/GenericDist.res | 9 +- .../PointSetDist/PointSetDist_Scoring.res | 22 ----- 3 files changed, 1 insertion(+), 120 deletions(-) delete mode 100644 packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res deleted file mode 100644 index a200212d..00000000 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/TwoScalars_test.res +++ /dev/null @@ -1,90 +0,0 @@ -open Jest -open Expect -open GenericDist_Fixtures -exception ScoreFailed - -describe("TwoScalars: scalar -> scalar -> score", () => { - test("score: infinity", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 2.0 // 100% of probability mass to 2.0 - let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) - switch score { - | Ok(x) => x->expect->toEqual(infinity) - | _ => raise(MixtureFailed) - } - }) - - test("score: 0.0", () => { - let scalar1 = 1.5 // 100% of probability mass 1.5 - let scalar2 = 1.5 // 100% of probability mass to 1.5 - let score = PointSetDist_Scoring.TwoScalars.score(~estimate=scalar1, ~answer=scalar2) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(MixtureFailed) - } - }) - - test("scoreWithPrior: minus infinity", () => { - let scalar1 = 1.5 // 100% of probability mass 1.5 - let scalar2 = 1.5 // 100% of probability mass to 1.5 - let scalar3 = 1.0 // 100% of probability mass to 1.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(-.infinity) - | _ => raise(MixtureFailed) - } - }) - - test("scoreWithPrior: 0.0", () => { - let scalar1 = 1.5 // 100% of probability mass 1.5 - let scalar2 = 1.5 // 100% of probability mass to 1.5 - let scalar3 = 1.5 // 100% of probability mass to 1.5 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(ScoreFailed) - } - }) - - test("scoreWithPrior: really dumb forecasters", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 1.5 // 100% of probability mass to 1.5 - let scalar3 = 1.0 // 100% of probability mass to 1.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(infinity -. infinity) // "Error: Really dumb forecasters" - | _ => raise(ScoreFailed) - } - }) - - test("scoreWithPrior: 0.0", () => { - let scalar1 = 1.0 // 100% of probability mass 1.0 - let scalar2 = 1.0 // 100% of probability mass to 1.0 - let scalar3 = 1.0 // 100% of probability mass to 1.0 - - let score = PointSetDist_Scoring.TwoScalars.scoreWithPrior( - ~estimate=scalar1, - ~answer=scalar2, - ~prior=scalar3, - ) - switch score { - | Ok(x) => x->expect->toEqual(0.0) - | _ => raise(ScoreFailed) - } - }) -}) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index b8aa680f..2c2108dd 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -190,14 +190,7 @@ module Score = { | (Score_Scalar(_), Score_Dist(_), None) => NotYetImplemented->Error | (Score_Scalar(_), Score_Dist(_), Some(Ok(PSScalar(_)))) => NotYetImplemented->Error | (Score_Scalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error - | (Score_Scalar(esti'), Score_Scalar(answ'), None) => - {estimate: esti', answer: answ', prior: None} - ->PointSetDist_Scoring.ScalarEstimateScalarAnswer - ->Ok - | (Score_Scalar(esti'), Score_Scalar(answ'), Some(Ok(PSScalar(prior'')))) => - {estimate: esti', answer: answ', prior: prior''->Some} - ->PointSetDist_Scoring.ScalarEstimateScalarAnswer - ->Ok + | (Score_Scalar(_), Score_Scalar(_), _) => NotYetImplemented->Error | (_, _, Some(Error(err))) => err->Error } } diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 56f67d17..b7806bfa 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -6,7 +6,6 @@ type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} type scoreArgs = | DistEstimateDistAnswer(abstractScoreArgs) | DistEstimateScalarAnswer(abstractScoreArgs) - | ScalarEstimateScalarAnswer(abstractScoreArgs) let logFn = Js.Math.log // base e let minusScaledLogOfQuotient = (~esti, ~answ): result => { @@ -130,23 +129,6 @@ module WithScalarAnswer = { } } -module TwoScalars = { - // You will almost never want to use this. - let score = (~estimate: scalar, ~answer: scalar) => { - if Js.Math.abs_float(estimate -. answer) < MagicNumbers.Epsilon.ten { - 0.0->Ok - } else { - infinity->Ok // - log(0) - } - } - - let scoreWithPrior = (~estimate: scalar, ~answer: scalar, ~prior: scalar) => { - E.R.merge(score(~estimate, ~answer), score(~estimate=prior, ~answer))->E.R2.fmap(((s1, s2)) => - s1 -. s2 - ) // This will presently NaN if both are wrong: infinity-infinity. - } -} - let twoGenericDistsToTwoPointSetDists = (~toPointSetFn, estimate, answer): result< (pointSetDist, pointSetDist), 'e, @@ -165,8 +147,4 @@ let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< WithScalarAnswer.score(~estimate, ~answer) | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => WithScalarAnswer.scoreWithPrior(~estimate, ~answer, ~prior) - | ScalarEstimateScalarAnswer({estimate, answer, prior: None}) => - TwoScalars.score(~estimate, ~answer) - | ScalarEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => - TwoScalars.scoreWithPrior(~estimate, ~answer, ~prior) } From 4858aa9fe535394a3abe4affb69b1fc6520f809d Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 4 Jul 2022 10:22:06 -0400 Subject: [PATCH 24/34] **most** comments, might do something with polymorphic variants so that types are more truthful next, but might not --- .../Distributions/DistributionOperation.res | 8 -------- .../Distributions/DistributionOperation.resi | 18 ------------------ .../Distributions/DistributionTypes.res | 16 ---------------- .../src/rescript/Distributions/GenericDist.res | 8 ++++---- .../PointSetDist/PointSetDist_Scoring.res | 13 ++++++------- 5 files changed, 10 insertions(+), 53 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index c4606c05..3cb16af2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -278,14 +278,6 @@ module Constructors = { C.LogScore.distEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR let distEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => C.LogScore.distEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR - let scalarEstimateDistAnswer = (~env, estimate, answer) => - C.LogScore.scalarEstimateDistAnswer(estimate, answer)->run(~env)->toFloatR - let scalarEstimateDistAnswerWithPrior = (~env, estimate, answer, prior) => - C.LogScore.scalarEstimateDistAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR - let scalarEstimateScalarAnswer = (~env, estimate, answer) => - C.LogScore.scalarEstimateScalarAnswer(estimate, answer)->run(~env)->toFloatR - let scalarEstimateScalarAnswerWithPrior = (~env, estimate, answer, prior) => - C.LogScore.scalarEstimateScalarAnswerWithPrior(estimate, answer, prior)->run(~env)->toFloatR } let toPointSet = (~env, dist) => C.toPointSet(dist)->run(~env)->toDistR let toSampleSet = (~env, dist, n) => C.toSampleSet(dist, n)->run(~env)->toDistR diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index 7254f67a..509b34ca 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -83,24 +83,6 @@ module Constructors: { float, DistributionTypes.DistributionOperation.genericDistOrScalar, ) => result - @genType - let scalarEstimateDistAnswer: (~env: env, float, genericDist) => result - @genType - let scalarEstimateDistAnswerWithPrior: ( - ~env: env, - float, - genericDist, - DistributionTypes.DistributionOperation.genericDistOrScalar, - ) => result - @genType - let scalarEstimateScalarAnswer: (~env: env, float, float) => result - @genType - let scalarEstimateScalarAnswerWithPrior: ( - ~env: env, - float, - float, - DistributionTypes.DistributionOperation.genericDistOrScalar, - ) => result } @genType let toPointSet: (~env: env, genericDist) => result diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index f6b7fe90..ffe31b6d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -194,22 +194,6 @@ module Constructors = { ToScore(LogScore(Score_Scalar(answer), Some(prior))), estimate, ) - let scalarEstimateDistAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), None)), - estimate, - ) - let scalarEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Dist(answer), Some(prior))), - estimate, - ) - let scalarEstimateScalarAnswer = (estimate, answer): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), None)), - estimate, - ) - let scalarEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromFloat( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), - estimate, - ) } let scaleMultiply = (dist, n): t => FromDist(ToDist(Scale(#Multiply, n)), dist) let scalePower = (dist, n): t => FromDist(ToDist(Scale(#Power, n)), dist) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 2c2108dd..17adf244 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -160,7 +160,7 @@ module Score = { switch (esti, answ, prior') { | (Score_Dist(esti'), Score_Dist(answ'), None) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => - {estimate: esti'', answer: answ'', prior: None}->PointSetDist_Scoring.DistEstimateDistAnswer + {estimate: esti'', answer: answ'', prior: None}->PointSetDist_Scoring.DistAnswer ) | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(PSDist(prior'')))) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => @@ -168,7 +168,7 @@ module Score = { estimate: esti'', answer: answ'', prior: Some(prior''), - }->PointSetDist_Scoring.DistEstimateDistAnswer + }->PointSetDist_Scoring.DistAnswer ) | (Score_Dist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error | (Score_Dist(esti'), Score_Scalar(answ'), None) => @@ -177,7 +177,7 @@ module Score = { estimate: esti'', answer: answ', prior: None, - }->PointSetDist_Scoring.DistEstimateScalarAnswer + }->PointSetDist_Scoring.ScalarAnswer ) | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(PSDist(prior'')))) => toPointSetFn(esti')->E.R2.fmap(esti'' => @@ -185,7 +185,7 @@ module Score = { estimate: esti'', answer: answ', prior: Some(prior''), - }->PointSetDist_Scoring.DistEstimateScalarAnswer + }->PointSetDist_Scoring.ScalarAnswer ) | (Score_Scalar(_), Score_Dist(_), None) => NotYetImplemented->Error | (Score_Scalar(_), Score_Dist(_), Some(Ok(PSScalar(_)))) => NotYetImplemented->Error diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index b7806bfa..5e8eb489 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -4,8 +4,8 @@ type scalar = float type score = float type abstractScoreArgs<'a, 'b> = {estimate: 'a, answer: 'b, prior: option<'a>} type scoreArgs = - | DistEstimateDistAnswer(abstractScoreArgs) - | DistEstimateScalarAnswer(abstractScoreArgs) + | DistAnswer(abstractScoreArgs) + | ScalarAnswer(abstractScoreArgs) let logFn = Js.Math.log // base e let minusScaledLogOfQuotient = (~esti, ~answ): result => { @@ -139,12 +139,11 @@ let logScore = (args: scoreArgs, ~combineFn, ~integrateFn, ~toMixedFn): result< Operation.Error.t, > => switch args { - | DistEstimateDistAnswer({estimate, answer, prior: None}) => + | DistAnswer({estimate, answer, prior: None}) => WithDistAnswer.sum(~estimate, ~answer, ~integrateFn, ~combineFn, ~toMixedFn) - | DistEstimateDistAnswer({estimate, answer, prior: Some(prior)}) => + | DistAnswer({estimate, answer, prior: Some(prior)}) => WithDistAnswer.sumWithPrior(~estimate, ~answer, ~prior, ~integrateFn, ~combineFn, ~toMixedFn) - | DistEstimateScalarAnswer({estimate, answer, prior: None}) => - WithScalarAnswer.score(~estimate, ~answer) - | DistEstimateScalarAnswer({estimate, answer, prior: Some(prior)}) => + | ScalarAnswer({estimate, answer, prior: None}) => WithScalarAnswer.score(~estimate, ~answer) + | ScalarAnswer({estimate, answer, prior: Some(prior)}) => WithScalarAnswer.scoreWithPrior(~estimate, ~answer, ~prior) } From 78893320527eac715286a5a209352490d0c1397f Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 4 Jul 2022 11:24:30 -0400 Subject: [PATCH 25/34] polymorphic variants to neatly constrain types --- .../DistributionOperation_test.res | 14 +- .../__tests__/Distributions/Mixture_test.res | 6 +- .../Scoring/KlDivergence_test.res | 4 +- .../__tests__/Distributions/Symbolic_test.res | 24 +-- .../Distributions/DistributionOperation.res | 47 +++-- .../Distributions/DistributionOperation.resi | 2 +- .../Distributions/DistributionTypes.res | 170 ++++++++++-------- .../ReducerInterface_GenericDistribution.res | 30 +--- 8 files changed, 154 insertions(+), 143 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res b/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res index 60e74d74..54ce40a8 100644 --- a/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res @@ -34,7 +34,7 @@ describe("sparkline", () => { expected: DistributionOperation.outputType, ) => { test(name, () => { - let result = DistributionOperation.run(~env, FromDist(ToString(ToSparkline(20)), dist)) + let result = DistributionOperation.run(~env, FromDist(#ToString(ToSparkline(20)), dist)) expect(result)->toEqual(expected) }) } @@ -81,8 +81,8 @@ describe("sparkline", () => { describe("toPointSet", () => { test("on symbolic normal distribution", () => { let result = - run(FromDist(ToDist(ToPointSet), normalDist5)) - ->outputMap(FromDist(ToFloat(#Mean))) + run(FromDist(#ToDist(ToPointSet), normalDist5)) + ->outputMap(FromDist(#ToFloat(#Mean))) ->toFloat ->toExt expect(result)->toBeSoCloseTo(5.0, ~digits=0) @@ -90,10 +90,10 @@ describe("toPointSet", () => { test("on sample set", () => { let result = - run(FromDist(ToDist(ToPointSet), normalDist5)) - ->outputMap(FromDist(ToDist(ToSampleSet(1000)))) - ->outputMap(FromDist(ToDist(ToPointSet))) - ->outputMap(FromDist(ToFloat(#Mean))) + run(FromDist(#ToDist(ToPointSet), normalDist5)) + ->outputMap(FromDist(#ToDist(ToSampleSet(1000)))) + ->outputMap(FromDist(#ToDist(ToPointSet))) + ->outputMap(FromDist(#ToFloat(#Mean))) ->toFloat ->toExt expect(result)->toBeSoCloseTo(5.0, ~digits=-1) diff --git a/packages/squiggle-lang/__tests__/Distributions/Mixture_test.res b/packages/squiggle-lang/__tests__/Distributions/Mixture_test.res index ee048853..7dc1f5df 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Mixture_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Mixture_test.res @@ -11,7 +11,7 @@ describe("mixture", () => { let (mean1, mean2) = tup let meanValue = { run(Mixture([(mkNormal(mean1, 9e-1), 0.5), (mkNormal(mean2, 9e-1), 0.5)]))->outputMap( - FromDist(ToFloat(#Mean)), + FromDist(#ToFloat(#Mean)), ) } meanValue->unpackFloat->expect->toBeSoCloseTo((mean1 +. mean2) /. 2.0, ~digits=-1) @@ -28,7 +28,7 @@ describe("mixture", () => { let meanValue = { run( Mixture([(mkBeta(alpha, beta), betaWeight), (mkExponential(rate), exponentialWeight)]), - )->outputMap(FromDist(ToFloat(#Mean))) + )->outputMap(FromDist(#ToFloat(#Mean))) } let betaMean = 1.0 /. (1.0 +. beta /. alpha) let exponentialMean = 1.0 /. rate @@ -52,7 +52,7 @@ describe("mixture", () => { (mkUniform(low, high), uniformWeight), (mkLognormal(mu, sigma), lognormalWeight), ]), - )->outputMap(FromDist(ToFloat(#Mean))) + )->outputMap(FromDist(#ToFloat(#Mean))) } let uniformMean = (low +. high) /. 2.0 let lognormalMean = mu +. sigma ** 2.0 /. 2.0 diff --git a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res index 089d247f..f8793dc9 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Scoring/KlDivergence_test.res @@ -186,8 +186,8 @@ describe("combineAlongSupportOfSecondArgument0", () => { uniformMakeR(lowPrediction, highPrediction)->E.R2.errMap(s => DistributionTypes.ArgumentError( s, )) - let answerWrapped = E.R.fmap(a => run(FromDist(ToDist(ToPointSet), a)), answer) - let predictionWrapped = E.R.fmap(a => run(FromDist(ToDist(ToPointSet), a)), prediction) + let answerWrapped = E.R.fmap(a => run(FromDist(#ToDist(ToPointSet), a)), answer) + let predictionWrapped = E.R.fmap(a => run(FromDist(#ToDist(ToPointSet), a)), prediction) let interpolator = XYShape.XtoY.continuousInterpolator(#Stepwise, #UseZero) let integrand = PointSetDist_Scoring.WithDistAnswer.integrand diff --git a/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res b/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res index 6ee9ffc8..4e5cd216 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res @@ -8,34 +8,34 @@ let mkNormal = (mean, stdev) => DistributionTypes.Symbolic(#Normal({mean: mean, describe("(Symbolic) normalize", () => { testAll("has no impact on normal distributions", list{-1e8, -1e-2, 0.0, 1e-4, 1e16}, mean => { let normalValue = mkNormal(mean, 2.0) - let normalizedValue = run(FromDist(ToDist(Normalize), normalValue)) + let normalizedValue = run(FromDist(#ToDist(Normalize), normalValue)) normalizedValue->unpackDist->expect->toEqual(normalValue) }) }) describe("(Symbolic) mean", () => { testAll("of normal distributions", list{-1e8, -16.0, -1e-2, 0.0, 1e-4, 32.0, 1e16}, mean => { - run(FromDist(ToFloat(#Mean), mkNormal(mean, 4.0)))->unpackFloat->expect->toBeCloseTo(mean) + run(FromDist(#ToFloat(#Mean), mkNormal(mean, 4.0)))->unpackFloat->expect->toBeCloseTo(mean) }) Skip.test("of normal(0, -1) (it NaNs out)", () => { - run(FromDist(ToFloat(#Mean), mkNormal(1e1, -1e0)))->unpackFloat->expect->ExpectJs.toBeFalsy + run(FromDist(#ToFloat(#Mean), mkNormal(1e1, -1e0)))->unpackFloat->expect->ExpectJs.toBeFalsy }) test("of normal(0, 1e-8) (it doesn't freak out at tiny stdev)", () => { - run(FromDist(ToFloat(#Mean), mkNormal(0.0, 1e-8)))->unpackFloat->expect->toBeCloseTo(0.0) + run(FromDist(#ToFloat(#Mean), mkNormal(0.0, 1e-8)))->unpackFloat->expect->toBeCloseTo(0.0) }) testAll("of exponential distributions", list{1e-7, 2.0, 10.0, 100.0}, rate => { let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Exponential({rate: rate}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Exponential({rate: rate}))), ) meanValue->unpackFloat->expect->toBeCloseTo(1.0 /. rate) // https://en.wikipedia.org/wiki/Exponential_distribution#Mean,_variance,_moments,_and_median }) test("of a cauchy distribution", () => { let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Cauchy({local: 1.0, scale: 1.0}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Cauchy({local: 1.0, scale: 1.0}))), ) meanValue->unpackFloat->expect->toBeSoCloseTo(1.0098094001641797, ~digits=5) //-> toBe(GenDistError(Other("Cauchy distributions may have no mean value."))) @@ -48,7 +48,7 @@ describe("(Symbolic) mean", () => { let (low, medium, high) = tup let meanValue = run( FromDist( - ToFloat(#Mean), + #ToFloat(#Mean), DistributionTypes.Symbolic(#Triangular({low: low, medium: medium, high: high})), ), ) @@ -63,7 +63,7 @@ describe("(Symbolic) mean", () => { tup => { let (alpha, beta) = tup let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Beta({alpha: alpha, beta: beta}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Beta({alpha: alpha, beta: beta}))), ) meanValue->unpackFloat->expect->toBeCloseTo(1.0 /. (1.0 +. beta /. alpha)) // https://en.wikipedia.org/wiki/Beta_distribution#Mean }, @@ -72,7 +72,7 @@ describe("(Symbolic) mean", () => { // TODO: When we have our theory of validators we won't want this to be NaN but to be an error. test("of beta(0, 0)", () => { let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Beta({alpha: 0.0, beta: 0.0}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Beta({alpha: 0.0, beta: 0.0}))), ) meanValue->unpackFloat->expect->ExpectJs.toBeFalsy }) @@ -83,7 +83,7 @@ describe("(Symbolic) mean", () => { tup => { let (mu, sigma) = tup let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Lognormal({mu: mu, sigma: sigma}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Lognormal({mu: mu, sigma: sigma}))), ) meanValue->unpackFloat->expect->toBeCloseTo(Js.Math.exp(mu +. sigma ** 2.0 /. 2.0)) // https://brilliant.org/wiki/log-normal-distribution/ }, @@ -95,14 +95,14 @@ describe("(Symbolic) mean", () => { tup => { let (low, high) = tup let meanValue = run( - FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Uniform({low: low, high: high}))), + FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Uniform({low: low, high: high}))), ) meanValue->unpackFloat->expect->toBeCloseTo((low +. high) /. 2.0) // https://en.wikipedia.org/wiki/Continuous_uniform_distribution#Moments }, ) test("of a float", () => { - let meanValue = run(FromDist(ToFloat(#Mean), DistributionTypes.Symbolic(#Float(7.7)))) + let meanValue = run(FromDist(#ToFloat(#Mean), DistributionTypes.Symbolic(#Float(7.7)))) meanValue->unpackFloat->expect->toBeCloseTo(7.7) }) }) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 3cb16af2..1b2fb0e9 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -101,14 +101,14 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { } let toPointSetFn = r => { - switch reCall(~functionCallInfo=FromDist(ToDist(ToPointSet), r), ()) { + switch reCall(~functionCallInfo=FromDist(#ToDist(ToPointSet), r), ()) { | Dist(PointSet(p)) => Ok(p) | e => Error(OutputLocal.toErrorOrUnreachable(e)) } } let toSampleSetFn = r => { - switch reCall(~functionCallInfo=FromDist(ToDist(ToSampleSet(sampleCount)), r), ()) { + switch reCall(~functionCallInfo=FromDist(#ToDist(ToSampleSet(sampleCount)), r), ()) { | Dist(SampleSet(p)) => Ok(p) | e => Error(OutputLocal.toErrorOrUnreachable(e)) } @@ -116,13 +116,13 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { let scaleMultiply = (r, weight) => reCall( - ~functionCallInfo=FromDist(ToDistCombination(Pointwise, #Multiply, #Float(weight)), r), + ~functionCallInfo=FromDist(#ToDistCombination(Pointwise, #Multiply, #Float(weight)), r), (), )->OutputLocal.toDistR let pointwiseAdd = (r1, r2) => reCall( - ~functionCallInfo=FromDist(ToDistCombination(Pointwise, #Add, #Dist(r2)), r1), + ~functionCallInfo=FromDist(#ToDistCombination(Pointwise, #Add, #Dist(r2)), r1), (), )->OutputLocal.toDistR @@ -131,40 +131,40 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { dist: genericDist, ): outputType => { let response = switch subFnName { - | ToFloat(distToFloatOperation) => + | #ToFloat(distToFloatOperation) => GenericDist.toFloatOperation(dist, ~toPointSetFn, ~distToFloatOperation) ->E.R2.fmap(r => Float(r)) ->OutputLocal.fromResult - | ToString(ToString) => dist->GenericDist.toString->String - | ToString(ToSparkline(bucketCount)) => + | #ToString(ToString) => dist->GenericDist.toString->String + | #ToString(ToSparkline(bucketCount)) => GenericDist.toSparkline(dist, ~sampleCount, ~bucketCount, ()) ->E.R2.fmap(r => String(r)) ->OutputLocal.fromResult - | ToDist(Inspect) => { + | #ToDist(Inspect) => { Js.log2("Console log requested: ", dist) Dist(dist) } - | ToDist(Normalize) => dist->GenericDist.normalize->Dist - | ToScore(LogScore(answer, prior)) => + | #ToDist(Normalize) => dist->GenericDist.normalize->Dist + | #ToScore(LogScore(answer, prior)) => GenericDist.Score.logScore(~estimate=Score_Dist(dist), ~answer, ~prior) ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult - | ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool - | ToDist(Truncate(leftCutoff, rightCutoff)) => + | #ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool + | #ToDist(Truncate(leftCutoff, rightCutoff)) => GenericDist.truncate(~toPointSetFn, ~leftCutoff, ~rightCutoff, dist, ()) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDist(ToSampleSet(n)) => + | #ToDist(ToSampleSet(n)) => dist ->GenericDist.toSampleSetDist(n) ->E.R2.fmap(r => Dist(SampleSet(r))) ->OutputLocal.fromResult - | ToDist(ToPointSet) => + | #ToDist(ToPointSet) => dist ->GenericDist.toPointSet(~xyPointLength, ~sampleCount, ()) ->E.R2.fmap(r => Dist(PointSet(r))) ->OutputLocal.fromResult - | ToDist(Scale(#LogarithmWithThreshold(eps), f)) => + | #ToDist(Scale(#LogarithmWithThreshold(eps), f)) => dist ->GenericDist.pointwiseCombinationFloat( ~toPointSetFn, @@ -173,23 +173,23 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { ) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDist(Scale(#Multiply, f)) => + | #ToDist(Scale(#Multiply, f)) => dist ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination=#Multiply, ~f) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDist(Scale(#Logarithm, f)) => + | #ToDist(Scale(#Logarithm, f)) => dist ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination=#Logarithm, ~f) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDist(Scale(#Power, f)) => + | #ToDist(Scale(#Power, f)) => dist ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination=#Power, ~f) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDistCombination(Algebraic(_), _, #Float(_)) => GenDistError(NotYetImplemented) - | ToDistCombination(Algebraic(strategy), arithmeticOperation, #Dist(t2)) => + | #ToDistCombination(Algebraic(_), _, #Float(_)) => GenDistError(NotYetImplemented) + | #ToDistCombination(Algebraic(strategy), arithmeticOperation, #Dist(t2)) => dist ->GenericDist.algebraicCombination( ~strategy, @@ -200,12 +200,12 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { ) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDistCombination(Pointwise, algebraicCombination, #Dist(t2)) => + | #ToDistCombination(Pointwise, algebraicCombination, #Dist(t2)) => dist ->GenericDist.pointwiseCombination(~toPointSetFn, ~algebraicCombination, ~t2) ->E.R2.fmap(r => Dist(r)) ->OutputLocal.fromResult - | ToDistCombination(Pointwise, algebraicCombination, #Float(f)) => + | #ToDistCombination(Pointwise, algebraicCombination, #Float(f)) => dist ->GenericDist.pointwiseCombinationFloat(~toPointSetFn, ~algebraicCombination, ~f) ->E.R2.fmap(r => Dist(r)) @@ -216,8 +216,7 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { switch functionCallInfo { | FromDist(subFnName, dist) => fromDistFn(subFnName, dist) - | FromFloat(subFnName, float) => - reCall(~functionCallInfo=FromDist(subFnName, GenericDist.fromFloat(float)), ()) + | FromFloat(subFnName, x) => reCall(~functionCallInfo=FromFloat(subFnName, x), ()) | Mixture(dists) => dists ->GenericDist.mixture(~scaleMultiplyFn=scaleMultiply, ~pointwiseAddFn=pointwiseAdd) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index 509b34ca..c39dab7f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -27,7 +27,7 @@ let runFromDist: ( ) => outputType let runFromFloat: ( ~env: env, - ~functionCallInfo: DistributionTypes.DistributionOperation.fromDist, + ~functionCallInfo: DistributionTypes.DistributionOperation.fromFloat, float, ) => outputType diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index ffe31b6d..b607b8e4 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -102,58 +102,82 @@ module DistributionOperation = { type toScore = LogScore(genericDistOrScalar, option) - type fromDist = - | ToFloat(toFloat) - | ToDist(toDist) - | ToScore(toScore) - | ToDistCombination(direction, Operation.Algebraic.t, [#Dist(genericDist) | #Float(float)]) - | ToString(toString) - | ToBool(toBool) + type fromFloat = [ + | #ToFloat(toFloat) + | #ToDist(toDist) + | #ToDistCombination(direction, Operation.Algebraic.t, [#Dist(genericDist) | #Float(float)]) + | #ToString(toString) + | #ToBool(toBool) + ] + + type fromDist = [ + | fromFloat + | #ToScore(toScore) + ] type singleParamaterFunction = | FromDist(fromDist) - | FromFloat(fromDist) + | FromFloat(fromFloat) type genericFunctionCallInfo = | FromDist(fromDist, genericDist) - | FromFloat(fromDist, float) + | FromFloat(fromFloat, float) | FromSamples(array) | Mixture(array<(genericDist, float)>) - let distCallToString = (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(#Min) => `min` - | ToFloat(#Max) => `max` - | ToFloat(#Stdev) => `stdev` - | ToFloat(#Variance) => `variance` - | ToFloat(#Mode) => `mode` - | ToFloat(#Pdf(r)) => `pdf(${E.Float.toFixed(r)})` - | ToFloat(#Sample) => `sample` - | ToFloat(#IntegralSum) => `integralSum` - | ToScore(_) => `logScore` - | ToDist(Normalize) => `normalize` - | ToDist(ToPointSet) => `toPointSet` - | ToDist(ToSampleSet(r)) => `toSampleSet(${E.I.toString(r)})` - | ToDist(Truncate(_, _)) => `truncate` - | ToDist(Inspect) => `inspect` - | ToDist(Scale(#Power, r)) => `scalePower(${E.Float.toFixed(r)})` - | ToDist(Scale(#Multiply, r)) => `scaleMultiply(${E.Float.toFixed(r)})` - | ToDist(Scale(#Logarithm, r)) => `scaleLog(${E.Float.toFixed(r)})` - | ToDist(Scale(#LogarithmWithThreshold(eps), r)) => + let floatCallToString = (floatFunction: fromFloat): string => + switch floatFunction { + | #ToFloat(#Cdf(r)) => `cdf(${E.Float.toFixed(r)})` + | #ToFloat(#Inv(r)) => `inv(${E.Float.toFixed(r)})` + | #ToFloat(#Mean) => `mean` + | #ToFloat(#Min) => `min` + | #ToFloat(#Max) => `max` + | #ToFloat(#Stdev) => `stdev` + | #ToFloat(#Variance) => `variance` + | #ToFloat(#Mode) => `mode` + | #ToFloat(#Pdf(r)) => `pdf(${E.Float.toFixed(r)})` + | #ToFloat(#Sample) => `sample` + | #ToFloat(#IntegralSum) => `integralSum` + | #ToDist(Normalize) => `normalize` + | #ToDist(ToPointSet) => `toPointSet` + | #ToDist(ToSampleSet(r)) => `toSampleSet(${E.I.toString(r)})` + | #ToDist(Truncate(_, _)) => `truncate` + | #ToDist(Inspect) => `inspect` + | #ToDist(Scale(#Power, r)) => `scalePower(${E.Float.toFixed(r)})` + | #ToDist(Scale(#Multiply, r)) => `scaleMultiply(${E.Float.toFixed(r)})` + | #ToDist(Scale(#Logarithm, r)) => `scaleLog(${E.Float.toFixed(r)})` + | #ToDist(Scale(#LogarithmWithThreshold(eps), r)) => `scaleLogWithThreshold(${E.Float.toFixed(r)}, epsilon=${E.Float.toFixed(eps)})` - | ToString(ToString) => `toString` - | ToString(ToSparkline(n)) => `sparkline(${E.I.toString(n)})` - | ToBool(IsNormalized) => `isNormalized` - | ToDistCombination(Algebraic(_), _, _) => `algebraic` - | ToDistCombination(Pointwise, _, _) => `pointwise` + | #ToString(ToString) => `toString` + | #ToString(ToSparkline(n)) => `sparkline(${E.I.toString(n)})` + | #ToBool(IsNormalized) => `isNormalized` + | #ToDistCombination(Algebraic(_), _, _) => `algebraic` + | #ToDistCombination(Pointwise, _, _) => `pointwise` + } + + let distCallToString = ( + distFunction: [ + | #ToFloat(toFloat) + | #ToDist(toDist) + | #ToDistCombination(direction, Operation.Algebraic.t, [#Dist(genericDist) | #Float(float)]) + | #ToString(toString) + | #ToBool(toBool) + | #ToScore(toScore) + ], + ): string => + switch distFunction { + | #ToScore(_) => `logScore` + | #ToFloat(x) => floatCallToString(#ToFloat(x)) + | #ToDist(x) => floatCallToString(#ToDist(x)) + | #ToString(x) => floatCallToString(#ToString(x)) + | #ToBool(x) => floatCallToString(#ToBool(x)) + | #ToDistCombination(x, y, z) => floatCallToString(#ToDistCombination(x, y, z)) } let toString = (d: genericFunctionCallInfo): string => switch d { - | FromDist(f, _) | FromFloat(f, _) => distCallToString(f) + | FromDist(f, _) => distCallToString(f) + | FromFloat(f, _) => floatCallToString(f) | Mixture(_) => `mixture` | FromSamples(_) => `fromSamples` } @@ -163,93 +187,93 @@ module Constructors = { module UsingDists = { @genType - let mean = (dist): t => FromDist(ToFloat(#Mean), dist) - let stdev = (dist): t => FromDist(ToFloat(#Stdev), dist) - let variance = (dist): t => FromDist(ToFloat(#Variance), dist) - let sample = (dist): t => FromDist(ToFloat(#Sample), dist) - let cdf = (dist, x): t => FromDist(ToFloat(#Cdf(x)), dist) - let inv = (dist, x): t => FromDist(ToFloat(#Inv(x)), dist) - let pdf = (dist, x): t => FromDist(ToFloat(#Pdf(x)), dist) - let normalize = (dist): t => FromDist(ToDist(Normalize), dist) - let isNormalized = (dist): t => FromDist(ToBool(IsNormalized), dist) - let toPointSet = (dist): t => FromDist(ToDist(ToPointSet), dist) - let toSampleSet = (dist, r): t => FromDist(ToDist(ToSampleSet(r)), dist) + let mean = (dist): t => FromDist(#ToFloat(#Mean), dist) + let stdev = (dist): t => FromDist(#ToFloat(#Stdev), dist) + let variance = (dist): t => FromDist(#ToFloat(#Variance), dist) + let sample = (dist): t => FromDist(#ToFloat(#Sample), dist) + let cdf = (dist, x): t => FromDist(#ToFloat(#Cdf(x)), dist) + let inv = (dist, x): t => FromDist(#ToFloat(#Inv(x)), dist) + let pdf = (dist, x): t => FromDist(#ToFloat(#Pdf(x)), dist) + let normalize = (dist): t => FromDist(#ToDist(Normalize), dist) + let isNormalized = (dist): t => FromDist(#ToBool(IsNormalized), dist) + let toPointSet = (dist): t => FromDist(#ToDist(ToPointSet), dist) + let toSampleSet = (dist, r): t => FromDist(#ToDist(ToSampleSet(r)), dist) let fromSamples = (xs): t => FromSamples(xs) - let truncate = (dist, left, right): t => FromDist(ToDist(Truncate(left, right)), dist) - let inspect = (dist): t => FromDist(ToDist(Inspect), dist) + let truncate = (dist, left, right): t => FromDist(#ToDist(Truncate(left, right)), dist) + let inspect = (dist): t => FromDist(#ToDist(Inspect), dist) module LogScore = { let distEstimateDistAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Dist(answer), None)), + #ToScore(LogScore(Score_Dist(answer), None)), estimate, ) let distEstimateDistAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Dist(answer), Some(prior))), + #ToScore(LogScore(Score_Dist(answer), Some(prior))), estimate, ) let distEstimateScalarAnswer = (estimate, answer): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), None)), + #ToScore(LogScore(Score_Scalar(answer), None)), estimate, ) let distEstimateScalarAnswerWithPrior = (estimate, answer, prior): t => FromDist( - ToScore(LogScore(Score_Scalar(answer), Some(prior))), + #ToScore(LogScore(Score_Scalar(answer), Some(prior))), estimate, ) } - let scaleMultiply = (dist, n): t => FromDist(ToDist(Scale(#Multiply, n)), dist) - let scalePower = (dist, n): t => FromDist(ToDist(Scale(#Power, n)), dist) - let scaleLogarithm = (dist, n): t => FromDist(ToDist(Scale(#Logarithm, n)), dist) + let scaleMultiply = (dist, n): t => FromDist(#ToDist(Scale(#Multiply, n)), dist) + let scalePower = (dist, n): t => FromDist(#ToDist(Scale(#Power, n)), dist) + let scaleLogarithm = (dist, n): t => FromDist(#ToDist(Scale(#Logarithm, n)), dist) let scaleLogarithmWithThreshold = (dist, n, eps): t => FromDist( - ToDist(Scale(#LogarithmWithThreshold(eps), n)), + #ToDist(Scale(#LogarithmWithThreshold(eps), n)), dist, ) - let toString = (dist): t => FromDist(ToString(ToString), dist) - let toSparkline = (dist, n): t => FromDist(ToString(ToSparkline(n)), dist) + let toString = (dist): t => FromDist(#ToString(ToString), dist) + let toSparkline = (dist, n): t => FromDist(#ToString(ToSparkline(n)), dist) let algebraicAdd = (dist1, dist2: genericDist): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Add, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Add, #Dist(dist2)), dist1, ) let algebraicMultiply = (dist1, dist2): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Multiply, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Multiply, #Dist(dist2)), dist1, ) let algebraicDivide = (dist1, dist2): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Divide, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Divide, #Dist(dist2)), dist1, ) let algebraicSubtract = (dist1, dist2): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Subtract, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Subtract, #Dist(dist2)), dist1, ) let algebraicLogarithm = (dist1, dist2): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Logarithm, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Logarithm, #Dist(dist2)), dist1, ) let algebraicPower = (dist1, dist2): t => FromDist( - ToDistCombination(Algebraic(AsDefault), #Power, #Dist(dist2)), + #ToDistCombination(Algebraic(AsDefault), #Power, #Dist(dist2)), dist1, ) let pointwiseAdd = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Add, #Dist(dist2)), + #ToDistCombination(Pointwise, #Add, #Dist(dist2)), dist1, ) let pointwiseMultiply = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Multiply, #Dist(dist2)), + #ToDistCombination(Pointwise, #Multiply, #Dist(dist2)), dist1, ) let pointwiseDivide = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Divide, #Dist(dist2)), + #ToDistCombination(Pointwise, #Divide, #Dist(dist2)), dist1, ) let pointwiseSubtract = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Subtract, #Dist(dist2)), + #ToDistCombination(Pointwise, #Subtract, #Dist(dist2)), dist1, ) let pointwiseLogarithm = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Logarithm, #Dist(dist2)), + #ToDistCombination(Pointwise, #Logarithm, #Dist(dist2)), dist1, ) let pointwisePower = (dist1, dist2): t => FromDist( - ToDistCombination(Pointwise, #Power, #Dist(dist2)), + #ToDistCombination(Pointwise, #Power, #Dist(dist2)), dist1, ) } diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index fee4df4d..b73f84e0 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -34,9 +34,7 @@ module Helpers = { dist: DistributionTypes.genericDist, ~env: DistributionOperation.env, ) => { - FromDist(DistributionTypes.DistributionOperation.ToFloat(fnCall), dist) - ->DistributionOperation.run(~env) - ->Some + FromDist(#ToFloat(fnCall), dist)->DistributionOperation.run(~env)->Some } let toStringFn = ( @@ -44,9 +42,7 @@ module Helpers = { dist: DistributionTypes.genericDist, ~env: DistributionOperation.env, ) => { - FromDist(DistributionTypes.DistributionOperation.ToString(fnCall), dist) - ->DistributionOperation.run(~env) - ->Some + FromDist(#ToString(fnCall), dist)->DistributionOperation.run(~env)->Some } let toBoolFn = ( @@ -54,9 +50,7 @@ module Helpers = { dist: DistributionTypes.genericDist, ~env: DistributionOperation.env, ) => { - FromDist(DistributionTypes.DistributionOperation.ToBool(fnCall), dist) - ->DistributionOperation.run(~env) - ->Some + FromDist(#ToBool(fnCall), dist)->DistributionOperation.run(~env)->Some } let toDistFn = ( @@ -64,18 +58,12 @@ module Helpers = { dist, ~env: DistributionOperation.env, ) => { - FromDist(DistributionTypes.DistributionOperation.ToDist(fnCall), dist) - ->DistributionOperation.run(~env) - ->Some + FromDist(#ToDist(fnCall), dist)->DistributionOperation.run(~env)->Some } let twoDiststoDistFn = (direction, arithmetic, dist1, dist2, ~env: DistributionOperation.env) => { FromDist( - DistributionTypes.DistributionOperation.ToDistCombination( - direction, - arithmeticMap(arithmetic), - #Dist(dist2), - ), + #ToDistCombination(direction, arithmeticMap(arithmetic), #Dist(dist2)), dist1, )->DistributionOperation.run(~env) } @@ -229,7 +217,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio Some( DistributionOperation.run( FromDist( - ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), None)), + #ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), None)), prediction, ), ~env, @@ -242,7 +230,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio Some( DistributionOperation.run( FromDist( - ToScore( + #ToScore( LogScore( DistributionTypes.DistributionOperation.Score_Dist(answer), Some(DistributionTypes.DistributionOperation.Score_Dist(prior)), @@ -267,7 +255,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ) => DistributionOperation.run( FromDist( - ToScore( + #ToScore( LogScore( DistributionTypes.DistributionOperation.Score_Scalar(answer), DistributionTypes.DistributionOperation.Score_Dist(prior)->Some, @@ -284,7 +272,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ) => DistributionOperation.run( FromDist( - ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), None)), + #ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), None)), prediction, ), ~env, From 20114d9a845e658935613bd69414ce138c703106 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 11 Jul 2022 14:23:58 -0400 Subject: [PATCH 26/34] Made new test call polymorphic constructor #ToFloat --- .../squiggle-lang/__tests__/Distributions/Symbolic_test.res | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res b/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res index ae4faec2..976ee09f 100644 --- a/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/Symbolic_test.res @@ -85,7 +85,7 @@ describe("(Symbolic) mean", () => { let betaDistribution = SymbolicDist.Beta.fromMeanAndStdev(mean, stdev) let meanValue = betaDistribution->E.R2.fmap(d => - run(FromDist(ToFloat(#Mean), d->DistributionTypes.Symbolic)) + run(FromDist(#ToFloat(#Mean), d->DistributionTypes.Symbolic)) ) switch meanValue { | Ok(value) => value->unpackFloat->expect->toBeCloseTo(mean) From 652394f53529dbf09d7a461656bb28c5b20f8263 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Tue, 12 Jul 2022 09:45:41 -0700 Subject: [PATCH 27/34] Prior can't be a point --- .../Distributions/DistributionOperation.res | 2 +- .../Distributions/DistributionOperation.resi | 4 +- .../Distributions/DistributionTypes.res | 2 +- .../rescript/Distributions/GenericDist.res | 37 +++++++------------ .../rescript/Distributions/GenericDist.resi | 4 +- .../PointSetDist/PointSetDist_Scoring.res | 2 +- .../ReducerInterface_GenericDistribution.res | 10 +---- 7 files changed, 23 insertions(+), 38 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 1b2fb0e9..9f8c7549 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -146,7 +146,7 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { } | #ToDist(Normalize) => dist->GenericDist.normalize->Dist | #ToScore(LogScore(answer, prior)) => - GenericDist.Score.logScore(~estimate=Score_Dist(dist), ~answer, ~prior) + GenericDist.Score.logScore(~estimate=dist, ~answer, ~prior) ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult | #ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index c39dab7f..d5ca7326 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -72,7 +72,7 @@ module Constructors: { ~env: env, genericDist, genericDist, - DistributionTypes.DistributionOperation.genericDistOrScalar, + genericDist, ) => result @genType let distEstimateScalarAnswer: (~env: env, genericDist, float) => result @@ -81,7 +81,7 @@ module Constructors: { ~env: env, genericDist, float, - DistributionTypes.DistributionOperation.genericDistOrScalar, + genericDist, ) => result } @genType diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index b607b8e4..0c119ea4 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -100,7 +100,7 @@ module DistributionOperation = { type genericDistOrScalar = Score_Dist(genericDist) | Score_Scalar(float) - type toScore = LogScore(genericDistOrScalar, option) + type toScore = LogScore(genericDistOrScalar, option) type fromFloat = [ | #ToFloat(toFloat) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 17adf244..db2a559a 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -133,13 +133,11 @@ let toPointSet = ( module Score = { type genericDistOrScalar = DistributionTypes.DistributionOperation.genericDistOrScalar - type pointSet_ScoreDistOrScalar = PSDist(PointSetTypes.pointSetDist) | PSScalar(float) - let argsMake = ( - ~esti: genericDistOrScalar, - ~answ: genericDistOrScalar, - ~prior: option, - ): result => { + let argsMake = (~esti: t, ~answ: genericDistOrScalar, ~prior: option): result< + PointSetDist_Scoring.scoreArgs, + error, + > => { let toPointSetFn = t => toPointSet( t, @@ -148,21 +146,20 @@ module Score = { ~xSelection=#ByWeight, (), ) - let prior': option> = switch prior { + let prior': option> = switch prior { | None => None - | Some(Score_Dist(d)) => toPointSetFn(d)->E.R.bind(x => x->PSDist->Ok)->Some - | Some(Score_Scalar(s)) => s->PSScalar->Ok->Some + | Some(d) => toPointSetFn(d)->Some } let twoDists = (~toPointSetFn, esti': t, answ': t): result< (PointSetTypes.pointSetDist, PointSetTypes.pointSetDist), error, > => E.R.merge(toPointSetFn(esti'), toPointSetFn(answ')) switch (esti, answ, prior') { - | (Score_Dist(esti'), Score_Dist(answ'), None) => + | (esti', Score_Dist(answ'), None) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => {estimate: esti'', answer: answ'', prior: None}->PointSetDist_Scoring.DistAnswer ) - | (Score_Dist(esti'), Score_Dist(answ'), Some(Ok(PSDist(prior'')))) => + | (esti', Score_Dist(answ'), Some(Ok(prior''))) => twoDists(~toPointSetFn, esti', answ')->E.R2.fmap(((esti'', answ'')) => { estimate: esti'', @@ -170,8 +167,7 @@ module Score = { prior: Some(prior''), }->PointSetDist_Scoring.DistAnswer ) - | (Score_Dist(_), _, Some(Ok(PSScalar(_)))) => DistributionTypes.Unreachable->Error - | (Score_Dist(esti'), Score_Scalar(answ'), None) => + | (esti', Score_Scalar(answ'), None) => toPointSetFn(esti')->E.R2.fmap(esti'' => { estimate: esti'', @@ -179,7 +175,7 @@ module Score = { prior: None, }->PointSetDist_Scoring.ScalarAnswer ) - | (Score_Dist(esti'), Score_Scalar(answ'), Some(Ok(PSDist(prior'')))) => + | (esti', Score_Scalar(answ'), Some(Ok(prior''))) => toPointSetFn(esti')->E.R2.fmap(esti'' => { estimate: esti'', @@ -187,19 +183,14 @@ module Score = { prior: Some(prior''), }->PointSetDist_Scoring.ScalarAnswer ) - | (Score_Scalar(_), Score_Dist(_), None) => NotYetImplemented->Error - | (Score_Scalar(_), Score_Dist(_), Some(Ok(PSScalar(_)))) => NotYetImplemented->Error - | (Score_Scalar(_), _, Some(Ok(PSDist(_)))) => DistributionTypes.Unreachable->Error - | (Score_Scalar(_), Score_Scalar(_), _) => NotYetImplemented->Error | (_, _, Some(Error(err))) => err->Error } } - let logScore = ( - ~estimate: genericDistOrScalar, - ~answer: genericDistOrScalar, - ~prior: option, - ): result => + let logScore = (~estimate: t, ~answer: genericDistOrScalar, ~prior: option): result< + float, + error, + > => argsMake(~esti=estimate, ~answ=answer, ~prior)->E.R.bind(x => x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) ) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi index 432ae847..d4f8933d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi @@ -26,9 +26,9 @@ let toFloatOperation: ( module Score: { let logScore: ( - ~estimate: DistributionTypes.DistributionOperation.genericDistOrScalar, + ~estimate: t, ~answer: DistributionTypes.DistributionOperation.genericDistOrScalar, - ~prior: option, + ~prior: option, ) => result } diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res index 5e8eb489..8e5d71a4 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/PointSetDist_Scoring.res @@ -19,7 +19,7 @@ module WithDistAnswer = { float, Operation.Error.t, > => - // We decided that negative infinity, not an error at answerElement = 0.0, is a desirable value. + // We decided that 0.0, not an error at answerElement = 0.0, is a desirable value. if answerElement == 0.0 { Ok(0.0) } else if estimateElement == 0.0 { diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index b73f84e0..e66fba9b 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -231,10 +231,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio DistributionOperation.run( FromDist( #ToScore( - LogScore( - DistributionTypes.DistributionOperation.Score_Dist(answer), - Some(DistributionTypes.DistributionOperation.Score_Dist(prior)), - ), + LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), Some(prior)), ), prediction, ), @@ -256,10 +253,7 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio DistributionOperation.run( FromDist( #ToScore( - LogScore( - DistributionTypes.DistributionOperation.Score_Scalar(answer), - DistributionTypes.DistributionOperation.Score_Dist(prior)->Some, - ), + LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), prior->Some), ), prediction, ), From 3d71d7bf4e5ad8cb174d604d8371cd2c3a2e856a Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 13 Jul 2022 08:56:22 -0700 Subject: [PATCH 28/34] Replaced some scoring functions with functionRegistry functions --- .../FunctionRegistry_Core.res | 3 + .../FunctionRegistry_Helpers.res | 16 ++++++ .../FunctionRegistry_Library.res | 57 ++++++++++++++++++- .../ReducerInterface_GenericDistribution.res | 48 ---------------- 4 files changed, 75 insertions(+), 49 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res index bbca7bc7..4eff7945 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res @@ -8,6 +8,7 @@ type rec frType = | FRTypeNumber | FRTypeNumeric | FRTypeDistOrNumber + | FRTypeDist | FRTypeLambda | FRTypeRecord(frTypeRecord) | FRTypeDict(frType) @@ -60,6 +61,7 @@ module FRType = { switch t { | FRTypeNumber => "number" | FRTypeNumeric => "numeric" + | FRTypeDist => "distribution" | FRTypeDistOrNumber => "distribution|number" | FRTypeRecord(r) => { let input = ((name, frType): frTypeRecordParam) => `${name}: ${toString(frType)}` @@ -98,6 +100,7 @@ module FRType = { | (FRTypeDistOrNumber, IEvDistribution(Symbolic(#Float(f)))) => Some(FRValueDistOrNumber(FRValueNumber(f))) | (FRTypeDistOrNumber, IEvDistribution(f)) => Some(FRValueDistOrNumber(FRValueDist(f))) + | (FRTypeDist, IEvDistribution(f)) => Some(FRValueDist(f)) | (FRTypeNumeric, IEvNumber(f)) => Some(FRValueNumber(f)) | (FRTypeNumeric, IEvDistribution(Symbolic(#Float(f)))) => Some(FRValueNumber(f)) | (FRTypeLambda, IEvLambda(f)) => Some(FRValueLambda(f)) diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res index 46ae18f9..a1d530b1 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res @@ -27,6 +27,12 @@ module Prepare = { | _ => Error(impossibleError) } + let threeArgs = (inputs: ts): result => + switch inputs { + | [FRValueRecord([(_, n1), (_, n2), (_, n3)])] => Ok([n1, n2, n3]) + | _ => Error(impossibleError) + } + let toArgs = (inputs: ts): result => switch inputs { | [FRValueRecord(args)] => args->E.A2.fmap(((_, b)) => b)->Ok @@ -57,6 +63,13 @@ module Prepare = { } } + let twoDist = (values: ts): result<(DistributionTypes.genericDist, DistributionTypes.genericDist), err> => { + switch values { + | [FRValueDist(a1), FRValueDist(a2)] => Ok(a1, a2) + | _ => Error(impossibleError) + } + } + let twoNumbers = (values: ts): result<(float, float), err> => { switch values { | [FRValueNumber(a1), FRValueNumber(a2)] => Ok(a1, a2) @@ -81,6 +94,9 @@ module Prepare = { module Record = { let twoDistOrNumber = (values: ts): result<(frValueDistOrNumber, frValueDistOrNumber), err> => values->ToValueArray.Record.twoArgs->E.R.bind(twoDistOrNumber) + + let twoDist = (values: ts): result<(DistributionTypes.genericDist, DistributionTypes.genericDist), err> => + values->ToValueArray.Record.twoArgs->E.R.bind(twoDist) } } diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res index a37b8dc4..9e8a2681 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res @@ -49,7 +49,7 @@ let inputsTodist = (inputs: array, makeDist) => { expressionValue } -let registry = [ +let registryStart = [ Function.make( ~name="toContinuousPointSet", ~definitions=[ @@ -510,3 +510,58 @@ to(5,10) (), ), ] + +let runScoring = (estimate, answer, prior) => { + GenericDist.Score.logScore(~estimate, ~answer, ~prior) + ->E.R2.fmap(FunctionRegistry_Helpers.Wrappers.evNumber) + ->E.R2.errMap(DistributionTypes.Error.toString) +} + +let scoreFunctions = [ + Function.make( + ~name="Score", + ~definitions=[ + FnDefinition.make( + ~name="logScore", + ~inputs=[ + FRTypeRecord([ + ("estimate", FRTypeDist), + ("answer", FRTypeDistOrNumber), + ("prior", FRTypeDist), + ]), + ], + ~run=(inputs, _) => { + switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.threeArgs(inputs) { + | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d)), FRValueDist(prior)]) => + runScoring(estimate, Score_Dist(d), Some(prior)) + | Ok([ + FRValueDist(estimate), + FRValueDistOrNumber(FRValueNumber(d)), + FRValueDist(prior), + ]) => + runScoring(estimate, Score_Scalar(d), Some(prior)) + | Error(e) => Error(e) + | _ => Error(FunctionRegistry_Helpers.impossibleError) + } + }, + ), + FnDefinition.make( + ~name="logScore", + ~inputs=[FRTypeRecord([("estimate", FRTypeDist), ("answer", FRTypeDistOrNumber)])], + ~run=(inputs, _) => { + switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs(inputs) { + | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d))]) => + runScoring(estimate, Score_Dist(d), None) + | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueNumber(d))]) => + runScoring(estimate, Score_Scalar(d), None) + | Error(e) => Error(e) + | _ => Error(FunctionRegistry_Helpers.impossibleError) + } + }, + ), + ], + (), + ), +] + +let registry = E.A.append(registryStart, scoreFunctions) diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index e66fba9b..d17d5061 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -223,54 +223,6 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ~env, ), ) - | ( - "klDivergence", - [IEvDistribution(prediction), IEvDistribution(answer), IEvDistribution(prior)], - ) => - Some( - DistributionOperation.run( - FromDist( - #ToScore( - LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), Some(prior)), - ), - prediction, - ), - ~env, - ), - ) - | ( - "logScoreWithPointAnswer", - [IEvDistribution(prediction), IEvNumber(answer), IEvDistribution(prior)], - ) - | ( - "logScoreWithPointAnswer", - [ - IEvDistribution(prediction), - IEvDistribution(Symbolic(#Float(answer))), - IEvDistribution(prior), - ], - ) => - DistributionOperation.run( - FromDist( - #ToScore( - LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), prior->Some), - ), - prediction, - ), - ~env, - )->Some - | ("logScoreWithPointAnswer", [IEvDistribution(prediction), IEvNumber(answer)]) - | ( - "logScoreWithPointAnswer", - [IEvDistribution(prediction), IEvDistribution(Symbolic(#Float(answer)))], - ) => - DistributionOperation.run( - FromDist( - #ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Scalar(answer), None)), - prediction, - ), - ~env, - )->Some | ("isNormalized", [IEvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) | ("toPointSet", [IEvDistribution(dist)]) => Helpers.toDistFn(ToPointSet, dist, ~env) | ("scaleLog", [IEvDistribution(dist)]) => From 78e9e48626d466ff26c3a97183425fef5278ce45 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 13 Jul 2022 09:37:39 -0700 Subject: [PATCH 29/34] Moved env to GenericDist, and used it --- .../DistributionOperation_test.res | 2 +- .../squiggle-lang/__tests__/TestHelpers.res | 2 +- .../Distributions/DistributionOperation.res | 11 +- .../Distributions/DistributionOperation.resi | 146 ++++++++++++------ .../rescript/Distributions/GenericDist.res | 23 ++- .../rescript/Distributions/GenericDist.resi | 4 + .../FunctionRegistry_Core.res | 6 +- .../FunctionRegistry_Helpers.res | 6 +- .../FunctionRegistry_Library.res | 25 ++- .../ReducerInterface_Date.res | 2 +- .../ReducerInterface_Duration.res | 2 +- ...ducerInterface_ExternalExpressionValue.res | 2 +- .../ReducerInterface_GenericDistribution.res | 28 ++-- .../ReducerInterface_Number.res | 2 +- .../src/rescript/TypescriptInterface.res | 2 +- 15 files changed, 162 insertions(+), 101 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res b/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res index 54ce40a8..5af6f8e0 100644 --- a/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/DistributionOperation_test.res @@ -1,7 +1,7 @@ open Jest open Expect -let env: DistributionOperation.env = { +let env: GenericDist.env = { sampleCount: 100, xyPointLength: 100, } diff --git a/packages/squiggle-lang/__tests__/TestHelpers.res b/packages/squiggle-lang/__tests__/TestHelpers.res index 71805c70..898bb3a9 100644 --- a/packages/squiggle-lang/__tests__/TestHelpers.res +++ b/packages/squiggle-lang/__tests__/TestHelpers.res @@ -29,7 +29,7 @@ let {toFloat, toDist, toString, toError, fmap} = module(DistributionOperation.Ou let fnImage = (theFn, inps) => Js.Array.map(theFn, inps) -let env: DistributionOperation.env = { +let env: GenericDist.env = { sampleCount: MagicNumbers.Environment.defaultSampleCount, xyPointLength: MagicNumbers.Environment.defaultXYPointLength, } diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 9f8c7549..6df75749 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -4,12 +4,9 @@ type error = DistributionTypes.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 env = { - sampleCount: int, - xyPointLength: int, -} +type env = GenericDist.env -let defaultEnv = { +let defaultEnv:env = { sampleCount: MagicNumbers.Environment.defaultSampleCount, xyPointLength: MagicNumbers.Environment.defaultXYPointLength, } @@ -93,7 +90,7 @@ module OutputLocal = { } } -let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { +let rec run = (~env:env, functionCallInfo: functionCallInfo): outputType => { let {sampleCount, xyPointLength} = env let reCall = (~env=env, ~functionCallInfo=functionCallInfo, ()) => { @@ -146,7 +143,7 @@ let rec run = (~env, functionCallInfo: functionCallInfo): outputType => { } | #ToDist(Normalize) => dist->GenericDist.normalize->Dist | #ToScore(LogScore(answer, prior)) => - GenericDist.Score.logScore(~estimate=dist, ~answer, ~prior) + GenericDist.Score.logScore(~estimate=dist, ~answer, ~prior, ~env) ->E.R2.fmap(s => Float(s)) ->OutputLocal.fromResult | #ToBool(IsNormalized) => dist->GenericDist.isNormalized->Bool diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi index d5ca7326..68da9534 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.resi @@ -1,11 +1,5 @@ @genType -type env = { - sampleCount: int, - xyPointLength: int, -} - -@genType -let defaultEnv: env +let defaultEnv: GenericDist.env open DistributionTypes @@ -19,14 +13,17 @@ type outputType = | GenDistError(error) @genType -let run: (~env: env, DistributionTypes.DistributionOperation.genericFunctionCallInfo) => outputType +let run: ( + ~env: GenericDist.env, + DistributionTypes.DistributionOperation.genericFunctionCallInfo, +) => outputType let runFromDist: ( - ~env: env, + ~env: GenericDist.env, ~functionCallInfo: DistributionTypes.DistributionOperation.fromDist, genericDist, ) => outputType let runFromFloat: ( - ~env: env, + ~env: GenericDist.env, ~functionCallInfo: DistributionTypes.DistributionOperation.fromFloat, float, ) => outputType @@ -42,90 +39,147 @@ module Output: { let toBool: t => option let toBoolR: t => result let toError: t => option - let fmap: (~env: env, t, DistributionTypes.DistributionOperation.singleParamaterFunction) => t + let fmap: ( + ~env: GenericDist.env, + t, + DistributionTypes.DistributionOperation.singleParamaterFunction, + ) => t } module Constructors: { @genType - let mean: (~env: env, genericDist) => result + let mean: (~env: GenericDist.env, genericDist) => result @genType - let stdev: (~env: env, genericDist) => result + let stdev: (~env: GenericDist.env, genericDist) => result @genType - let variance: (~env: env, genericDist) => result + let variance: (~env: GenericDist.env, genericDist) => result @genType - let sample: (~env: env, genericDist) => result + let sample: (~env: GenericDist.env, genericDist) => result @genType - let cdf: (~env: env, genericDist, float) => result + let cdf: (~env: GenericDist.env, genericDist, float) => result @genType - let inv: (~env: env, genericDist, float) => result + let inv: (~env: GenericDist.env, genericDist, float) => result @genType - let pdf: (~env: env, genericDist, float) => result + let pdf: (~env: GenericDist.env, genericDist, float) => result @genType - let normalize: (~env: env, genericDist) => result + let normalize: (~env: GenericDist.env, genericDist) => result @genType - let isNormalized: (~env: env, genericDist) => result + let isNormalized: (~env: GenericDist.env, genericDist) => result module LogScore: { @genType - let distEstimateDistAnswer: (~env: env, genericDist, genericDist) => result + let distEstimateDistAnswer: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType let distEstimateDistAnswerWithPrior: ( - ~env: env, + ~env: GenericDist.env, genericDist, genericDist, genericDist, ) => result @genType - let distEstimateScalarAnswer: (~env: env, genericDist, float) => result + let distEstimateScalarAnswer: ( + ~env: GenericDist.env, + genericDist, + float, + ) => result @genType let distEstimateScalarAnswerWithPrior: ( - ~env: env, + ~env: GenericDist.env, genericDist, float, genericDist, ) => result } @genType - let toPointSet: (~env: env, genericDist) => result + let toPointSet: (~env: GenericDist.env, genericDist) => result @genType - let toSampleSet: (~env: env, genericDist, int) => result + let toSampleSet: (~env: GenericDist.env, genericDist, int) => result @genType - let fromSamples: (~env: env, SampleSetDist.t) => result + let fromSamples: (~env: GenericDist.env, SampleSetDist.t) => result @genType - let truncate: (~env: env, genericDist, option, option) => result + let truncate: ( + ~env: GenericDist.env, + genericDist, + option, + option, + ) => result @genType - let inspect: (~env: env, genericDist) => result + let inspect: (~env: GenericDist.env, genericDist) => result @genType - let toString: (~env: env, genericDist) => result + let toString: (~env: GenericDist.env, genericDist) => result @genType - let toSparkline: (~env: env, genericDist, int) => result + let toSparkline: (~env: GenericDist.env, genericDist, int) => result @genType - let algebraicAdd: (~env: env, genericDist, genericDist) => result + let algebraicAdd: (~env: GenericDist.env, genericDist, genericDist) => result @genType - let algebraicMultiply: (~env: env, genericDist, genericDist) => result + let algebraicMultiply: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let algebraicDivide: (~env: env, genericDist, genericDist) => result + let algebraicDivide: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let algebraicSubtract: (~env: env, genericDist, genericDist) => result + let algebraicSubtract: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let algebraicLogarithm: (~env: env, genericDist, genericDist) => result + let algebraicLogarithm: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let algebraicPower: (~env: env, genericDist, genericDist) => result + let algebraicPower: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let scaleLogarithm: (~env: env, genericDist, float) => result + let scaleLogarithm: (~env: GenericDist.env, genericDist, float) => result @genType - let scaleMultiply: (~env: env, genericDist, float) => result + let scaleMultiply: (~env: GenericDist.env, genericDist, float) => result @genType - let scalePower: (~env: env, genericDist, float) => result + let scalePower: (~env: GenericDist.env, genericDist, float) => result @genType - let pointwiseAdd: (~env: env, genericDist, genericDist) => result + let pointwiseAdd: (~env: GenericDist.env, genericDist, genericDist) => result @genType - let pointwiseMultiply: (~env: env, genericDist, genericDist) => result + let pointwiseMultiply: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let pointwiseDivide: (~env: env, genericDist, genericDist) => result + let pointwiseDivide: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let pointwiseSubtract: (~env: env, genericDist, genericDist) => result + let pointwiseSubtract: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let pointwiseLogarithm: (~env: env, genericDist, genericDist) => result + let pointwiseLogarithm: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result @genType - let pointwisePower: (~env: env, genericDist, genericDist) => result + let pointwisePower: ( + ~env: GenericDist.env, + genericDist, + genericDist, + ) => result } diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index db2a559a..2d59831a 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -6,6 +6,11 @@ type toSampleSetFn = t => result type scaleMultiplyFn = (t, float) => result type pointwiseAddFn = (t, t) => result +type env = { + sampleCount: int, + xyPointLength: int, +} + let isPointSet = (t: t) => switch t { | PointSet(_) => true @@ -134,15 +139,15 @@ let toPointSet = ( module Score = { type genericDistOrScalar = DistributionTypes.DistributionOperation.genericDistOrScalar - let argsMake = (~esti: t, ~answ: genericDistOrScalar, ~prior: option): result< + let argsMake = (~esti: t, ~answ: genericDistOrScalar, ~prior: option, ~env: env): result< PointSetDist_Scoring.scoreArgs, error, > => { let toPointSetFn = t => toPointSet( t, - ~xyPointLength=MagicNumbers.Environment.defaultXYPointLength, - ~sampleCount=MagicNumbers.Environment.defaultSampleCount, + ~xyPointLength=env.xyPointLength, + ~sampleCount=env.sampleCount, ~xSelection=#ByWeight, (), ) @@ -187,11 +192,13 @@ module Score = { } } - let logScore = (~estimate: t, ~answer: genericDistOrScalar, ~prior: option): result< - float, - error, - > => - argsMake(~esti=estimate, ~answ=answer, ~prior)->E.R.bind(x => + let logScore = ( + ~estimate: t, + ~answer: genericDistOrScalar, + ~prior: option, + ~env: env, + ): result => + argsMake(~esti=estimate, ~answ=answer, ~prior, ~env)->E.R.bind(x => x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) ) } diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi index d4f8933d..24faabe0 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi @@ -5,6 +5,9 @@ type toSampleSetFn = t => result type scaleMultiplyFn = (t, float) => result type pointwiseAddFn = (t, t) => result +@genType +type env = {sampleCount: int, xyPointLength: int} + let sampleN: (t, int) => array let sample: t => float @@ -29,6 +32,7 @@ module Score: { ~estimate: t, ~answer: DistributionTypes.DistributionOperation.genericDistOrScalar, ~prior: option, + ~env: env ) => result } diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res index 4eff7945..c69075d9 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Core.res @@ -42,7 +42,7 @@ and frValueDistOrNumber = FRValueNumber(float) | FRValueDist(DistributionTypes.g type fnDefinition = { name: string, inputs: array, - run: (array, DistributionOperation.env) => result, + run: (array, GenericDist.env) => result, } type function = { @@ -322,7 +322,7 @@ module FnDefinition = { t.name ++ `(${inputs})` } - let run = (t: t, args: array, env: DistributionOperation.env) => { + let run = (t: t, args: array, env: GenericDist.env) => { let argValues = FRType.matchWithExpressionValueArray(t.inputs, args) switch argValues { | Some(values) => t.run(values, env) @@ -377,7 +377,7 @@ module Registry = { ~registry: registry, ~fnName: string, ~args: array, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ) => { let matchToDef = m => Matcher.Registry.matchToDef(registry, m) //Js.log(toSimple(registry)) diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res index a1d530b1..357725e1 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res @@ -144,7 +144,7 @@ module Prepare = { module Process = { module DistOrNumberToDist = { module Helpers = { - let toSampleSet = (r, env: DistributionOperation.env) => + let toSampleSet = (r, env: GenericDist.env) => GenericDist.toSampleSetDist(r, env.sampleCount) let mapFnResult = r => @@ -182,7 +182,7 @@ module Process = { let oneValue = ( ~fn: float => result, ~value: frValueDistOrNumber, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ): result => { switch value { | FRValueNumber(a1) => fn(a1) @@ -195,7 +195,7 @@ module Process = { let twoValues = ( ~fn: ((float, float)) => result, ~values: (frValueDistOrNumber, frValueDistOrNumber), - ~env: DistributionOperation.env, + ~env: GenericDist.env, ): result => { switch values { | (FRValueNumber(a1), FRValueNumber(a2)) => fn((a1, a2)) diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res index 9e8a2681..add5cfa3 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Library.res @@ -511,8 +511,8 @@ to(5,10) ), ] -let runScoring = (estimate, answer, prior) => { - GenericDist.Score.logScore(~estimate, ~answer, ~prior) +let runScoring = (estimate, answer, prior, env) => { + GenericDist.Score.logScore(~estimate, ~answer, ~prior, ~env) ->E.R2.fmap(FunctionRegistry_Helpers.Wrappers.evNumber) ->E.R2.errMap(DistributionTypes.Error.toString) } @@ -530,16 +530,16 @@ let scoreFunctions = [ ("prior", FRTypeDist), ]), ], - ~run=(inputs, _) => { + ~run=(inputs, env) => { switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.threeArgs(inputs) { | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d)), FRValueDist(prior)]) => - runScoring(estimate, Score_Dist(d), Some(prior)) + runScoring(estimate, Score_Dist(d), Some(prior), env) | Ok([ FRValueDist(estimate), FRValueDistOrNumber(FRValueNumber(d)), FRValueDist(prior), ]) => - runScoring(estimate, Score_Scalar(d), Some(prior)) + runScoring(estimate, Score_Scalar(d), Some(prior), env) | Error(e) => Error(e) | _ => Error(FunctionRegistry_Helpers.impossibleError) } @@ -548,17 +548,26 @@ let scoreFunctions = [ FnDefinition.make( ~name="logScore", ~inputs=[FRTypeRecord([("estimate", FRTypeDist), ("answer", FRTypeDistOrNumber)])], - ~run=(inputs, _) => { + ~run=(inputs, env) => { switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs(inputs) { | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d))]) => - runScoring(estimate, Score_Dist(d), None) + runScoring(estimate, Score_Dist(d), None, env) | Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueNumber(d))]) => - runScoring(estimate, Score_Scalar(d), None) + runScoring(estimate, Score_Scalar(d), None, env) | Error(e) => Error(e) | _ => Error(FunctionRegistry_Helpers.impossibleError) } }, ), + FnDefinition.make(~name="klDivergence", ~inputs=[FRTypeDist, FRTypeDist], ~run=( + inputs, + env, + ) => { + switch inputs { + | [FRValueDist(estimate), FRValueDist(d)] => runScoring(estimate, Score_Dist(d), None, env) + | _ => Error(FunctionRegistry_Helpers.impossibleError) + } + }), ], (), ), diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Date.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Date.res index e84c26f4..3396d0f3 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Date.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Date.res @@ -1,7 +1,7 @@ module IEV = ReducerInterface_InternalExpressionValue type internalExpressionValue = IEV.t -let dispatch = (call: IEV.functionCall, _: DistributionOperation.env): option< +let dispatch = (call: IEV.functionCall, _: GenericDist.env): option< result, > => { switch call { diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Duration.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Duration.res index 838e4375..f9e06de4 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Duration.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Duration.res @@ -1,7 +1,7 @@ module IEV = ReducerInterface_InternalExpressionValue type internalExpressionValue = IEV.t -let dispatch = (call: IEV.functionCall, _: DistributionOperation.env): option< +let dispatch = (call: IEV.functionCall, _: GenericDist.env): option< result, > => { switch call { diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_ExternalExpressionValue.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_ExternalExpressionValue.res index 9bd356d4..b21ba3c6 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_ExternalExpressionValue.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_ExternalExpressionValue.res @@ -86,7 +86,7 @@ let toStringResult = x => } @genType -type environment = DistributionOperation.env +type environment = GenericDist.env @genType let defaultEnvironment: environment = DistributionOperation.defaultEnv diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res index d17d5061..a65edf2f 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_GenericDistribution.res @@ -32,7 +32,7 @@ module Helpers = { let toFloatFn = ( fnCall: DistributionTypes.DistributionOperation.toFloat, dist: DistributionTypes.genericDist, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ) => { FromDist(#ToFloat(fnCall), dist)->DistributionOperation.run(~env)->Some } @@ -40,7 +40,7 @@ module Helpers = { let toStringFn = ( fnCall: DistributionTypes.DistributionOperation.toString, dist: DistributionTypes.genericDist, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ) => { FromDist(#ToString(fnCall), dist)->DistributionOperation.run(~env)->Some } @@ -48,7 +48,7 @@ module Helpers = { let toBoolFn = ( fnCall: DistributionTypes.DistributionOperation.toBool, dist: DistributionTypes.genericDist, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ) => { FromDist(#ToBool(fnCall), dist)->DistributionOperation.run(~env)->Some } @@ -56,12 +56,12 @@ module Helpers = { let toDistFn = ( fnCall: DistributionTypes.DistributionOperation.toDist, dist, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ) => { FromDist(#ToDist(fnCall), dist)->DistributionOperation.run(~env)->Some } - let twoDiststoDistFn = (direction, arithmetic, dist1, dist2, ~env: DistributionOperation.env) => { + let twoDiststoDistFn = (direction, arithmetic, dist1, dist2, ~env: GenericDist.env) => { FromDist( #ToDistCombination(direction, arithmeticMap(arithmetic), #Dist(dist2)), dist1, @@ -97,7 +97,7 @@ module Helpers = { let mixtureWithGivenWeights = ( distributions: array, weights: array, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ): DistributionOperation.outputType => E.A.length(distributions) == E.A.length(weights) ? Mixture(Belt.Array.zip(distributions, weights))->DistributionOperation.run(~env) @@ -107,7 +107,7 @@ module Helpers = { let mixtureWithDefaultWeights = ( distributions: array, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ): DistributionOperation.outputType => { let length = E.A.length(distributions) let weights = Belt.Array.make(length, 1.0 /. Belt.Int.toFloat(length)) @@ -116,7 +116,7 @@ module Helpers = { let mixture = ( args: array, - ~env: DistributionOperation.env, + ~env: GenericDist.env, ): DistributionOperation.outputType => { let error = (err: string): DistributionOperation.outputType => err->DistributionTypes.ArgumentError->GenDistError @@ -173,7 +173,7 @@ module SymbolicConstructors = { } } -let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperation.env): option< +let dispatchToGenericOutput = (call: IEV.functionCall, env: GenericDist.env): option< DistributionOperation.outputType, > => { let (fnName, args) = call @@ -213,16 +213,6 @@ let dispatchToGenericOutput = (call: IEV.functionCall, env: DistributionOperatio ~env, )->Some | ("normalize", [IEvDistribution(dist)]) => Helpers.toDistFn(Normalize, dist, ~env) - | ("klDivergence", [IEvDistribution(prediction), IEvDistribution(answer)]) => - Some( - DistributionOperation.run( - FromDist( - #ToScore(LogScore(DistributionTypes.DistributionOperation.Score_Dist(answer), None)), - prediction, - ), - ~env, - ), - ) | ("isNormalized", [IEvDistribution(dist)]) => Helpers.toBoolFn(IsNormalized, dist, ~env) | ("toPointSet", [IEvDistribution(dist)]) => Helpers.toDistFn(ToPointSet, dist, ~env) | ("scaleLog", [IEvDistribution(dist)]) => diff --git a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Number.res b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Number.res index 900e6a2f..f22df39b 100644 --- a/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Number.res +++ b/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_Number.res @@ -24,7 +24,7 @@ module ScientificUnit = { } } -let dispatch = (call: IEV.functionCall, _: DistributionOperation.env): option< +let dispatch = (call: IEV.functionCall, _: GenericDist.env): option< result, > => { switch call { diff --git a/packages/squiggle-lang/src/rescript/TypescriptInterface.res b/packages/squiggle-lang/src/rescript/TypescriptInterface.res index 3d2ce160..a1f5afe6 100644 --- a/packages/squiggle-lang/src/rescript/TypescriptInterface.res +++ b/packages/squiggle-lang/src/rescript/TypescriptInterface.res @@ -8,7 +8,7 @@ The below few seem to work fine. In the future there's definitely more work to d */ @genType -type samplingParams = DistributionOperation.env +type samplingParams = GenericDist.env @genType type genericDist = DistributionTypes.genericDist From d8b1e0d5ff07c54cc174192e1bf808384fc17a0d Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 13 Jul 2022 10:11:59 -0700 Subject: [PATCH 30/34] Formatted code --- .../Distributions/DistributionOperation.res | 4 ++-- .../src/rescript/Distributions/GenericDist.res | 10 ++++------ .../src/rescript/Distributions/GenericDist.resi | 2 +- .../FunctionRegistry/FunctionRegistry_Helpers.res | 14 +++++++++----- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res index 6df75749..319535c1 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionOperation.res @@ -6,7 +6,7 @@ type error = DistributionTypes.error type env = GenericDist.env -let defaultEnv:env = { +let defaultEnv: env = { sampleCount: MagicNumbers.Environment.defaultSampleCount, xyPointLength: MagicNumbers.Environment.defaultXYPointLength, } @@ -90,7 +90,7 @@ module OutputLocal = { } } -let rec run = (~env:env, functionCallInfo: functionCallInfo): outputType => { +let rec run = (~env: env, functionCallInfo: functionCallInfo): outputType => { let {sampleCount, xyPointLength} = env let reCall = (~env=env, ~functionCallInfo=functionCallInfo, ()) => { diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res index 2d59831a..f536d54d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.res @@ -192,12 +192,10 @@ module Score = { } } - let logScore = ( - ~estimate: t, - ~answer: genericDistOrScalar, - ~prior: option, - ~env: env, - ): result => + let logScore = (~estimate: t, ~answer: genericDistOrScalar, ~prior: option, ~env: env): result< + float, + error, + > => argsMake(~esti=estimate, ~answ=answer, ~prior, ~env)->E.R.bind(x => x->PointSetDist.logScore->E.R2.errMap(y => DistributionTypes.OperationError(y)) ) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi index 24faabe0..fd04212a 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist.resi @@ -32,7 +32,7 @@ module Score: { ~estimate: t, ~answer: DistributionTypes.DistributionOperation.genericDistOrScalar, ~prior: option, - ~env: env + ~env: env, ) => result } diff --git a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res index 357725e1..f42b7705 100644 --- a/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res +++ b/packages/squiggle-lang/src/rescript/FunctionRegistry/FunctionRegistry_Helpers.res @@ -63,7 +63,10 @@ module Prepare = { } } - let twoDist = (values: ts): result<(DistributionTypes.genericDist, DistributionTypes.genericDist), err> => { + let twoDist = (values: ts): result< + (DistributionTypes.genericDist, DistributionTypes.genericDist), + err, + > => { switch values { | [FRValueDist(a1), FRValueDist(a2)] => Ok(a1, a2) | _ => Error(impossibleError) @@ -95,8 +98,10 @@ module Prepare = { let twoDistOrNumber = (values: ts): result<(frValueDistOrNumber, frValueDistOrNumber), err> => values->ToValueArray.Record.twoArgs->E.R.bind(twoDistOrNumber) - let twoDist = (values: ts): result<(DistributionTypes.genericDist, DistributionTypes.genericDist), err> => - values->ToValueArray.Record.twoArgs->E.R.bind(twoDist) + let twoDist = (values: ts): result< + (DistributionTypes.genericDist, DistributionTypes.genericDist), + err, + > => values->ToValueArray.Record.twoArgs->E.R.bind(twoDist) } } @@ -144,8 +149,7 @@ module Prepare = { module Process = { module DistOrNumberToDist = { module Helpers = { - let toSampleSet = (r, env: GenericDist.env) => - GenericDist.toSampleSetDist(r, env.sampleCount) + let toSampleSet = (r, env: GenericDist.env) => GenericDist.toSampleSetDist(r, env.sampleCount) let mapFnResult = r => switch r { From a9d9ed9ae61640db1ac129199274144690b4d492 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Wed, 13 Jul 2022 13:29:32 -0400 Subject: [PATCH 31/34] tweak: Better documentation So that even newbies can understand. --- packages/vscode-ext/README.md | 21 +++++++++++++----- .../vscode-ext/images/vs-code-install.png | Bin 0 -> 191534 bytes .../vscode-ext/images/vs-code-settings.png | Bin 0 -> 78441 bytes 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 packages/vscode-ext/images/vs-code-install.png create mode 100644 packages/vscode-ext/images/vs-code-settings.png diff --git a/packages/vscode-ext/README.md b/packages/vscode-ext/README.md index 9d23c1e2..61861e5f 100644 --- a/packages/vscode-ext/README.md +++ b/packages/vscode-ext/README.md @@ -1,21 +1,32 @@ # Squiggle For VS Code -_[marketplace](https://marketplace.visualstudio.com/items?itemName=QURI.vscode-squiggle)_ +## About -This extension provides support for [Squiggle](https://www.squiggle-language.com/) in VS Code. +This extension provides support for [Squiggle](https://www.squiggle-language.com/) in VS Code. It can be found in the VS code _[marketplace](https://marketplace.visualstudio.com/items?itemName=QURI.vscode-squiggle)_ Features: - Preview `.squiggle` files in a preview pane - Syntax highlighting for `.squiggle` and `.squiggleU` files -# Configuration +## Installation -Some preview settings, e.g. whether to show the summary table or types of outputs, can be configurable on in the VS Code settings and persist between different preview sessions. +You can install this extension by going to the "extensions" tab, searching for "Squiggle", and then installing it. + +![](./images/vs-code-install.png) + +### Configuration + +Some preview settings, e.g. whether to show the summary table or types of outputs, can be configurable on in the VS Code settings and persist between different preview sessions. The VS Code settings can be accessed with the shortcut `Ctrl+,` with `Ctrl+Shift+P` + searching "Open Settings", or by accessing a file like `$HOME/.config/Code/User/settings.json` in Linux (see [here](https://stackoverflow.com/questions/65908987/how-can-i-open-visual-studio-codes-settings-json-file)) for other operating systems. + +![](./images/vs-code-settings.png) Check out the full list of Squiggle settings in the main VS Code settings. -# Build locally +## Usage + + +## Build locally We assume you ran `yarn` at the monorepo level for all dependencies. diff --git a/packages/vscode-ext/images/vs-code-install.png b/packages/vscode-ext/images/vs-code-install.png new file mode 100644 index 0000000000000000000000000000000000000000..e36b220ae46c0fd40599cafad2b1983fa6aa6cd8 GIT binary patch literal 191534 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

h8^07w$ccXS4cMeSW*Q zR^|fTVX1%5&~-_qgr=KCI!}3eY4v98oWq+ojCXX*%fU>g{L@y(0OBZ5{rKLygU2M> zR&gcVQoD-}muHDH`y@5OR74}OVGcW!XZrCo*legoD5iP(;TMA^mhOj3~k-rf3OLl&s4EyL2)tE&W;%3S{ss-(cmi_ZIk!;YvqkNMZRQc zfVk|BU{#i8bW8%?0j=lznkN$Np`mnna?wh>XF4XBvie%Lm&TVxgL!Te?*_+W2B9Wr z+DNtU+AWCnmp^+D`(2Pzulwfe-ruc8=#Cm>nDEPH5KcJt!h^OVbWc` zmvG~BRM7z8iJXjE*mR>|OxVu!yS+J1u~F|~#+hoK!w$1pYtSo}5Seuo+%THS?qfGg zE9s8x%^I+?`xxjzt!KE%U#IZF#dC)!{#%mU>Br|Oem^L*!)U|0)&r;ix~$35XT~16 zC$vg;YBsrW@$xeM)cf&PR&x=l+UV0}OLqm5^4LD;>@7-3_{|Z#bXI)ndNyBRh;DJ@wm{c(O7%O!Dj#Gg z&Al*jEz(FE_7=s(P9A5mQfkH!I2J;Ahn5^vkaD#frZ^+9f2Y|>Zna=P21sAI8GV4BQopgY_-X46vcC1PS}-!yY_IhnTh zMl|Jbh~S)Tu>e2tkp*$J8ZVV$L5H* z(YL4lf^!zy+Uv4b{ZV^om+WkJvQAwDMI&3vb|P~>w6TanT1m&OFgpuhE#g+beNBwK zS)QK~Cb~7uX_Y{ZE%Mr$N6EnWYOQvb{}(~#RjaexS^e}w?I-v2tjxqW`)Un@KGi+i;SdXHQ+(Equ+&w{(L{0!kz7{0G?GxLI|7z$fu7Ba#LiLt(@rnt-R8xVU0{8!lxQX1M`94c*SS55Ah5&BKpnU_NLy-@zF07?CPugbvQ z#k0#7DW4vy(i)SfPPvcIJ#Hp(eUiqes84Ei@+J8s$N6crK|6^>a^^3)XXc6!;?l%xBhG4hkLVaDGrtx45%oY zt7+0V*EgwcavYeySTAWku#q2`h3A@5?i{1X%t- zqC`svaXo$9P2`TckqT1nsNDE09q$NBk_w>f_0=?up2MXRTDv>fUraJ|pm1D!fwT|E zL+vb7DFV@wWwt5P`p`&anbBt$k5L1kCiO&7xcyxiY_jba$C@NJX>@B zVM@#^`Ni$GrJ9bR5WO5}P17zfIQ4{xT-N*15i%chBn^z%qhDpS%#R9G1&Hrt4secr znr@Ycw$SC6lLTDK-khU(jq2T3n)*^Z&Xz0ka+X0|ag}Qr)T1L>BbAZP)L5pEIW3b^I-CT+z`dhTPYG-GXWkpOs`%G(Mv#j3eED+b@W#~gKN!wapm-r;%G_}_$%1&gLZB{pKQ->U z5w)Om_8Il=;&DpDX^X<*NXyOwG>7;8^5$5ZY{&Rg`tk7K;2=2hu(12qGoDv+0-6U0 z^9@s*?Vg^VgX6kZbX$2DcspcBxxMrzhsk9Tj(#MVnA&_TTRK9~#i~}Owpf_5cUc)Z zjWzx1EWF0o{&)+ykyONU(4v%cd>E20pJ53x=bcjf!b2oY?6;;iE0Ec2WHi-ZgVi_z zsM?viek$*x&DCEg%7yMZ2K3U)T3omWu(&=K{!YK z{#?-TLnAfK4UA~3Q570f?DFK*75tAE$-52CTiH?v6KJ*-o{q466KGm-u=_lS@ z-(4U$WoR5V9+WVcc%0CsIH94vrddFRB&tr)yj`U?`=R*7&u@=t$xz}kO?tQ=^E0GJ z6tM4EpI6Lq{5=E`Gm9;=Mp9)T%Y3g%w-L)utmOSxa$THUPQ%3X-1UB;NjAJbRh@w) zOVT(z-0#BOT`POd|EDj}3CbtiIx~ta4QX@65$Y^_nQUqb3avX@sPfTc zislcSc%|%C0TP!*Zr2HBhZYeG20NWrBYFCyN&)SRE&o6k9$z-cN@Z=dk?vn!p)c+= zVmMHQLvdBCyG>3U&#@g!rn04)nmS!h*D#!d$;^&-Rzmd6q`(RD`tc=bEbSe#JxqW) z?ZdmJaJ)w!waDSR#`U=R@(LOdnISN|OSRlF<}v-tD@4FYM+*4Fm-*4Dym1%?(|iU3u)<>za@_v zQpn}8)* ziC~X~(6`qY9Z$u=gEl*mtGE;yus+mPS`b0oxYd^EZJu{r#$J)kRK?X*w;`yn(wC=+Z`3;QOshGl*SDx~k9{W|yRV$(@9w7!wQF4I5QKQy>+iae=binE+|f$&emqf3F;{o#zD7XZ%D$m|tku@wab@1iOSvOa zB8Ph0t$MIu+g5M`daS;vM4ca5exGT8BTFC4CeXTeyFQx`G3OU8`GwNSYb1yM{)M)# zqBC-gvp=fNsnHy4FzYy0QK^(S|O9Hqsyu%prb-3Dn7cv z0Z9>g5oG|e{7#M)8(zpny%F&B0Yx6vmo24>Qm&V1j^ne6kp#iW4DzKbsciP{rMWIj z$Cr9XHKOkc;gWPkNpW3NaxeC0YPIvhh|49-7x&SY5RI-O2gt}X%y_<}Na}7Z;hOi7 zZ~ry{BUt+Ct$H{SSz-T;^?4^55gDW81?!79Lwydeh?Uh7!l0{=k<@2mf6di+YNc`T zeQVI}KtOh?*RQuYiJQZ@Z}#rfR9k6DJc>7e_HlnW=9SOlF~D*{F91mYg!fK^^d$+R#4 z(7a}bGXWU-kt?VEB=q1A`}GH5NlnkeH5>o!66s`GW*T%R<>+V3dl&ccpuG93B+0st zHob;)nLV8m4NL0_5gI*8-Ds-*yF5unY&yb43|6{(T&aHV$#gMo*XZnA@Z4@O}MU(3Mqi4yz_z1P*N; zm-gn?UO(N{T8te9D|X4nELIww^?`5KsJ~xrhO(LJlG3x|Ur=-HZxHvLcLuZk+^6Tm zvBf4+BX0;c2D4-|uxcGumhotdEWQ}j^`{8*U&-#u(2@*%!6BH!Vw)iq&J^W6k;UJL zKy8l5Ww*aypN}~`KYqfG`=3VVK*zbvsI*&*N@^eRgR99}$V+Q9cRK{2 ztR?!1%VDb*@)uM$mGeO8nm_jTJEeu~;^&3aAD$jtrv_oSwEVPhVo}rhB3cRA4b*3f zY>SefyL!9Cq(Vqor<&XUO_Xg-9K?*bX)#`kPJ>%}4Z6SUtDg#jEt zS2qpGEoaTaqUaZ5y*U>QeE2=VLwd&@%_|y(etrX!1|1Ky(->(@93%>|euaN|&(`HF zMEZ=X$B+5w^wfr>XtAP5IzUWLl7NeuJ)DFxtm2YFTbp@y12t8QF-o*A$MLZbX{6<1 zy?_=eHfa)@#lm(sx2#;aq?j3#_DhBRb8XVB<4*nR=PbM3$+UAj*U?;?b>x8y+$leR zt)Y>=LHPTOW0;cM(*ix@IM!(p6@4`^yf^Wtqe(GOyOaG#&&A7ih2Gexg^I45A5al+ zMr6k1Nlhogd%D6uR8u#joPY9+)+08-@rDI0kiC~rbvw^5H}*uFV)WS>j&Wk|w#Oqa zd4M3|hJEDS~Sod9oFxu~lv*&?&g)i56Cw8D|{o`T2Fi}CFYOP~jr>4VB z`)Tr#e6O@)jn$kfgo9#Kk(CS`n{~z`_06u}P^J8pa|`}KbR>-6ge_T+a{a^d{6%qb z_)^}!Rk{o?7(AwBX8tCT^-GMEL-tl{^#Wo3Rpk&$WVin#lQ;z?j7vsBL-Dl$;;k(= zb%%psWh|tQw*dSVFD?}XP1n1kco!a>s;|BeNR%}9HO@PepW4O}I+9d<^IC?KY|OEy zR1OQr9`b3Ol61<^5m6emaPfYk zxXtz%A2+h$Mj8cWKQqvp>`h9-zIkgbWA^yb;2z~^$W7r05mazo96T%Uwd|$%OhF@0 z7ZJsKNOiiGwI)mC^*D|E^Kx9^S1=}jNiB=MC_Y$vf17#@3bgnf8>vow&+Lt96nVje zcKP+o4|U+T!=EMPT^kq`FAh?=WLsI1s4Zl!R50*3LS*$eLECNBc76At9nJLbWVDI! z)Y9?*EwNLN6|e@RgmR>lOvb;o_4W1j^lSmn;MP`=fLe(d?bFW0*S3ByIXRW`c0a;o zvg9l^nNy`0Qlzv?bV)QXWfQ;nu|a3kq7wb=$&x2+NljNOIQ7m2j6GW-IdnC*O-m7A3$Z8N99{1 zuI41b=6ntHVnqATjt@sE5TaU}A-MQoaXNcZl~OF9knFBaT#$r(4^RkoF}nEzN66E& z;4p!(SdXXbqx#O8*JjG+2YH0S)wSc5BoU|Bta+_Ma#R?W^~p)yGk(__WchSTc{}_V zm&?A=E4=u*TINXEgYWJhYi5?PS1Ess1Z5PncePA zPm|*WGae(_JqT?3#9`K)I+CkE=jDN=LQIbfxCJ=Sd1wGc-3qQzZ}`jK{4yw%= zb8|oOZUtN!=+a4ecsL+JH7WlWMOpLrfu+0q9Uxf(e%>dux&0nRx(Q3zt&*Z*)_MM) z0l~qg27<#r>U6*v>FVeJOab=m{nR&JW@cvPe_e!4S#o)RJBBKY_3!W4z4CfAEOY|6 zL(vQQxw+5N!J~jWg>Pj4?=zcF$0y|f-u~Ylg7aKsyam*{?d@%75@2oc)V=)oeHw3g z@CB8Xl@}YGY==|d01^biuz;X&cY95u{$EG%&R;_gJewU3NHI|f*>js{=%RYH-7nu4 zDLFVA!@+qf+$}|4e9rk{ulb?V?JfXVc_;@cpSqrP7G?E?Xd)}!@-eWtw$?|&Cn>+O?N`*hS)oOizKH$(T4jxN}k zyaKQx!08%H*2k;ly|`}sFgvq;eZ4Vd{;;MQI`DJWvdI0usbR+%hx{Kpk7o?V1EZu^ zsl;zhHd(D>5q|w_Y?oaj(>FJ48Tq{!rl;H-!ouDwU46LBOe8FxeuZ-KNzFG{4QUPd z|5AG#kpM(~M-{4k(Sj&rI7C6wm%v35Lb?|fIle;1X!PW1CpKA1Vn<*K8ljL-wZQFa zr3b7hf@WTGvf#hyLXBTB1Z(=cbGct`iXG0F*xHUY^5rl$m)5xwjMx(42ep>zR!kN% z)>N>`!BL!N??x|-oS{woCAf;W0(DTABCRH# z7cbi9<}{cqki1&~nHNx$xAd!(Sm^19LrAb6Keo19P8TlOaOnEc@rJ;T)&& z9US192@qC#;wRqkOv)-M9yHxM?|uKwnZo{?iUL@Dv(wXY2?;UL(Gb@Qme;Q@0j6}O z%>jIQP=pYp*k7tL)epoI0Eg^ZDXzxr5B4`)u zv-E!HWXl=DOsb|Q3e1y#?(Fay4kiMc-fWE}_!PkRH8eD=(kRrqWJRG(QryR4iL16SAx=^ujFp@|@zW>@!1%cwpxP7ldFeqn*EX#d)Kz#t(Z0S^~d>lYdvm?4lmKmrD&ZHlm5 z_wNA7;4!M{>FZO4iDF@4fho<+&ueOEsKr}>RRO%tqTF1+(9ogYUP3@O1)3Zc2BofE zQ<8?%?<*x99PVe5)ka}+LqizB;eCRqQu_|fzGWtcPgf`@>Ce5h*q5q6?mKMY#%=$ zQo6ml0W@Z3Mc=zAl8@0zd(HMcMMDsY#m4EIeNAa7)X<>7pd!wss@cS)W1@8W>73-B zr5~WCF?9&+I(r>)#M@$w^7M80NBaFcNYxEiNvyGY_4vgrdsop?B&j*>X?d z;-b38DJQ5asK>$_htp?T)5F{H$|?)1OLNOgQ+vgIr?e0DxBrIya7&@KHS^egI(|QQb!o;>dFJLnwnaEjNJ9f z);l2}MPNiNt*SD26QtxL4fRth(VE|^&C1e8lo$_g`?c~|J|{W||JQ0TmowFiO=m){ zG-5vP#YLD^>sLB9HVW2e*J)2hXbqw63Z3n-I9g6XTOKP{$?a7KGa*_o3r7(c_qvte z^j$L#2S*SvI9**I$X(Vy?w-0(Kq`n=r20;X^Zto`WR$%DX_Z=1WMpJ?^ck3d>8$nY z`Z_Cq(BwJ9^xFP6sk{7jg18aS8;%jVNH8zk%1!_~MBu9cKyMbgg%%i9D(|~YU6miJsK3B{L zReghOUDr7)!C-38^ zmqA49PvI=GI$G^jI_Gw9M6`2hP#vpH}N zU9ui-vNAJMu->o5gd|xQ8lJZxl0C!41?jZ3u&^Io0|NuCt;;~+1hi>1=|BYa6le*6 zBuZLZx~{H{lamwh!BGus?RS(wtqF*{K(%yy__GZhCJ8?zq+?0w>jVNu{ZL8 zheuRK1``_q*hTg=ENm|1;*%l{DDx{TK8Pdp|D=8`Rj{#|#)~n2LALRh@FUdTZ!t+o z_^p-%!8p-;fmQ+Nw3xLT9WRgc&DYh{)arq7Z)+?E$lpXnx`4%k?fKN^!_S;rezXXf z`XHUn&(8y?5gk1}4)S|7H8r>Fx$fx-!xTQJWq>A3#&dIIQUGvJQ&pWfKhG^Lh5#f3 z(ri;>BarOK|E>V{HJO=9uHcQ0jjgS%fjA6Abtwr6%Jko=F9U-R{8u_a7CA#dTIMFQ z5x2gE83w#HzQg&blj!l?T?eJeWTj!CwRiAo*mXbHR*5pi&@2C3R&rgCda z+k+n{8Y>?D))xVZ3(zTvz6c*=&e4tnOsb8+SL}ot<>lf`HM$XYQVxNnD zfW!na!$+F*Yre>8{;q1Mw6x-O0(0LVE{kw++V}mKSuKK(l<6qG&bQ-$l~~Bth|UKM*A22d&VfmAPh@VkByFo z4;T;;5adm4gPu&4+I-YwcAdoQ+SZP&(a($e@ODZ{lR&}3>v{#07gN0r$ll9<<4cm< z7#IaU4pTiLd1^d%5oQVS`K>=Ts5^${<|P^%pSAhWBBB=?l&QsK_Rb})9u?E#!@&tM zJHEp!(%@O}x+laD_?GzEb!oLIe4irU`+tnKtw0ClfW{E-qxG!#*V(y?bltYcRy9uC{vLXnyai7 z?jlfBjIOazU8rBP+Ew95C?aOhZJ$;DxpzB0pA^rRUfMg?7}yI8Z5T1SE5Mvw{$d8N zKZex)+Fs zBErIe{>&U?;Bvle-I1&F%AS}N@!jzy- zx7X+nMMN@DMCKQ_`;rnD&iI34_gliuq4{6{=Mxf$h|YsLt$}r9N&~;fyI;foJ+UP! zy&te%bYkw|`T3-lj|xgkfRx*(SH8TwdL2LC=BWAGy+}DCG}ZJWL_~b?nQkYrYHaG$KK=|<>(aU z=)$Jedo~FN_feE#VVJ9zjq^VxL|FA!S;laT*o~TH>A6RPfj8<1Q)lrwc4$S5b%x;WpH0;>d)-Hdl7GZyk z>7PhMn(t_J06)4B9Ty*e)_$Ve2h>sh{e@3G+J2)ZPvwNP_)Vaq(@uaa0_X_Iv&c)&Ti;~hw~)OSWG;}Lmj=GuE?qx zq=~^VPYfBI5h!mA#GI~VbyF*5kA7B#=ab%l~l3EA)MOFe#yCHPx_%z!JA zry%|UYkmmy0BS*{19YuGZ5T3}4i2w@)7zH%G;_4o{aV-v_|g!ba8AlkM@z-ZRa3P;HDvycXmRdq zu7b^7Zy(WawBD^VHHyIF%!J~b7VdYOTc>}u1?`gW9vV?cY;A6WKM;~v*+hN>q>_nA zNm5c$0FUeQ2qYIDGsuV(%xf`g-C67_BVGo^;0w6V=}W+P#;dDqAh(sHtzSHDxDQ&r z_n8pk;GCb;gprmsIcBP0RXcTMQP0zJ-wI2{zMA2A^QF1>FFS@~et3&G%ttx|AZTOb zjrFze96&FLiNv6c0$C5L4<`kX_Kl%_3Pi?mp#O6J{)$o4AUt^?s^I=-9>UXF0z$Qx zmFdoQZXm~ZhynB9f10BW6TY0Eux>Cv3XU$fezzCurRIo*CQ1e}(G zWc!dlrVq3LT+a844(ey*6!mM2Bf{il%N?zy+dX!bi#Qvcff^k2EQ^ab&@;_04(Ccs zO_-*xHf0M!1$qwh*XiKk4t+oAj9!S@F_@a#rlVCmt#dd1npC$8!F>&zT*gL~2-HX4 zp9gdO5r;6udZOZD)b-UztoFrj5lIZ8aN#Yk8|fJ}tmQLemy#Lx^mEz+E<>3gIvaQh zk1V+_bL+4Q`EM4SZ99!HVI6~0I34APs;V`EWW4TK(})D+j_-0BPuGLOyv)>7mhUSZ z?mtN-Z7pmbL>1zQzI`kDJk|fL(1Wipg&9@eFiy4x&6qHfbTuzS-kmEZ77f~&@m5`% z&2NNP(Ve80mQ zy`7C9SM7Yu<&@%f9^uw+2}k}F}1p+=PRJqzIrf9%~eT zyFVAuBXe8D3fzHQA4H?xw=Oro(rvS;VsKMi4{>Yn%EO?N0IC8%^ucS@&pmvl=?9|h@9 zx;v!1OQgHIyE_iev%T;8`};rV1#kF#&e?m`%&b}0TyrhO*MeFIKV`X|*5XwH1f`pf zvC63A8+D!@$2zD7Y}>0QxXc(|VtK!>IGz$JmPKyXalG7x*1-6gGVP0O=J)c2DKF;?us{qsK-B=}_Bqi%a{T^19_LyOpPg z_%qFnd^yW6&n*h65ew7!ja#H^dlMTiZ^3Vjq?=c=gH0_QsUWxQj!4;D-?+W)L8DI! znAsDFs&?-o?%Tkj!%BbaGH`v>n30L(Azomx*vj$FqkMCY0KTfy)kazc6Mqv9K+aBI zsf=B&HEmlnf^J|_xBS5Ms@om$9WF5jLiTT;&-TZ28>4ydMB1`V`muZ;b~@?`lL!Gw zwAy9*^N$}HTj@M}UwE8motP=$m+!Wp-A_UnfR(t#$C+o%D(AgwHg}=hQ;dK7;>{)Z zUn9s*I0yy2MhM9Qes4MQq$(INSyTAuD=2zDAv}FYORaLLJ8!eoYD>GiATI0T57G2} zjsr)~)t_ckc}d%HO!hCB4e!FRMJ?o#P|vTXzXpCU>{LsxbUMFoZgRJkN$C`O<6s{` zu(Hg)HepU@e6%e$vRBoy=J17A&@iNaa7cfA$7q;^Au2~cIY1$O=}Vy+@l0XhjaPtp z^KOYi`f-1lkAwfD+0m0T6p<9gtAr^ETx{=HKKt4jT)jG!ESH~R3iA&tZlH(Bd3*CI z#TfqT>aQMCSyPw(=$0tzB>jg8at+HGwUH=XsP{$&7oLn)~_grrKCv5$i!nBpL6e>Cdr=VUMVoLA9~R z4P|TjwX=<`tvpU*i106&fk8Qv6@Trhs0Q6B``D5#gPmg`Wn%~XU23Vhq$X)DspBHe zw8ZffdG5hGu?BYp4`>=hwKsIZi8V_gjo)UnxF#{!+v$AzybMZ4N5fS!7NeV*(CBex ztX38&+i=t6FUA+z-ME*T+uZ!xIBzdcSk3K{xFDG-qv&de5IK!Vu6=3WV^z_e?#+$s z&nMRoy#z)yoQ`r{-ljh1d17u8qv6uHyqX!ZZ?V*B zsC;7fJ!|vQx~miTbJEuHY98)ed0tL+@yLD(2O7{R83Et+ELdj=>lN|Wv{>@gt|k|? z%}2Ss;8DfDzf;YgBCmuuwTV9e_hj9Q-&<4n=gWC7kDjmE~jtJT&%R);G1f`K;u%yv6iXjb$S-j#G)R&9MiG>6t1*THmyGC z2ia2IBDS>OwMXob9rn^pQXRmHe^SUuzS_Fllg-BYv+4>5{H}(#W$}LewS2rB)TwTt zpI_Xo{k)iCwI4~gQUinh4FTvt&*&?sOr$rqiNE$@GkJ$0XaH~~V^r^Hl~JLTj{DyH zF@uvK&j45;5`XO{`ipC&Zq>rd%8{D{S6n`kb=^R8^X!XE?n{7(h{&t8eC$nflIZiz zb&SDtl7aF#kM(qFia=fKlVs2NR=toBR@}hRm#14DgXfLmv^JOFq%LM!P{3j))84-Q zZ{Gf4KNj$CD6ey!QffuⓈiYLQ+se+2|FH=ib>>w`r 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Ž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 literal 0 HcmV?d00001 diff --git a/packages/vscode-ext/images/vs-code-settings.png b/packages/vscode-ext/images/vs-code-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..68568bd57852854563ed9ad1e1f1bbaa995fc67d GIT binary patch literal 78441 zcmcG#1yq#Z_bxtuR8SER5l|42K|o3A2BjP62Bo`08U;xK0Rd^GYZ&PcrKGz{x*GmTsSauCHQ@ZW7)2@MAb1gH7W-)qryI3y6r6Nse9E9G~Io73*vLq->9G*L%w zz~GbSSC|S4ckWVrWENG!Pv`qm9al+SqBA~(Q(c9WJU2#a(4kDLmb};|SASQ}F{JC6 zmksVb5pkO@tvEbk8XLa$kwp-(aTdN9D zc`K@lF67qd^`t*vT`L{1kdW~Uw?7J6 z{&1L7Mcww`YOvA5&hHu_#t6RB?J~dV(YS>BnFV`#XW0H<1xsqmP@S;!b%n{boO9IYhSseiEGE*r&gvpr;` zwsvq#%suwYm(qSI&e-o7DV}^xFAUn7vpGn3s$;^kRBId^Z~t9wrR3>d)InODLSAC? z=**N|n!p`ZY_IJtjruq}VwAw+C1=yYJQcmA3O3)cuT^edz0*we(^Fh{D%i+_$r2AG zUG?fUk#rgzF@Xl^nV8+hSr#ok50@|Hg4bZANAnZ0`fSSsiqa(qZ1wf#cnX-IdPS$7iR^Pco9D?bhOPaLZtT(j<>ZN z+?=Gm4#>j-Z?wW>Jp_=yi{Cm#l60wv3!?W(>>?iv+AaOSh#G$X_PvhwnXfNDyqx~; z`g}sPeFOOU=!GUlo#sB5D91|o2A+trcIrv|Dl~gBXgrm)d)gltVl0>3@N27EB>{Ij zLza0$EdjGn>Q~OUYfvPEx7Qi0)_D1&V8y9#?koKw^`Z6DJ*N8nXAZg-X?+tTOQj#& zX9K)BnJdSipBg>yzS);d8RLC6v$Ny)TrehSFZ7!b-}yhjl;WYmGU{>mM_a=`ez+jr zm-WhxZEbPUojBZDii9$!@b2W(N0=mnReLwX^msZQ4vIrD6M7c;(^I?!>{mMcJ_S1$ zV*OoHMXfdE3R7^nEgdJZbUqWAOF0^zkRX+@JaFoi8MjlbU&0W7w0kC+$EhdXLE&2; zA6D=8;uv;wwyl;+oahBIv&=lM9GOxyc&(F1cPyuE!AsE4BUQ%Le8FhtCx3dZ*V)V`FM{{HoF*Al$=xb{ zC-?iAj+k5$@!QGsWvq?j4Vzqt&_Hx&im#P;g9qzdmq8k6X9;>w^8W><;8nWGxha~J{6=)pL=g4Eh*_M zSn1Ut-mqu49*+DebbdkJAf?SCpzhgzpD}&5gRXRtrgd0wgA=uJkp3}Ox=BRj9}~}! zH&W_TBta>e+ZT2X_20jLe+@@7AMI!IH?=Z(?&MFSjy`_;=yrZFotr{cm_+9KHf%Of z!$Oc3ZHo@iC1)a?%ULGF92GnonjByMNOZ?Y`DT zl-QvP>Ga-G%b`Z~-2`@v3^=pVutmaQELG=3zzY1`(J%qLzFNP3@eOA}<P_Kw|vEFxd^smX>XsZOQVCP2(p+rbg zaz0bMBAU{cwS>sy7rvkE`hextnvMdsWAD} z>FWWX9=fgdz9^7F{xOTw`{2ds{Dq&ok6BL7hgJ{2EQW53W+%#rii!+H9K>8)$VpGk z2d!wy=lGgD9h@A?Ui)vDi638dsasd)Sn$u#AvA?T-Ns`0+#Wjb=T;1dBo1d)U!+g;Ut=TtP zi0!QXhO<(qQ!{ML4-0zX52qN7W)^vPeCpp5cwfwhd(7k!&|{9uyRQCTI56fHpmqDX zNr9h5L@ptzUT*0r78J@u_S^208{2~J7)f6%O;6iWx)qPH3dXA6 zbR;fz7HZx2yMPG^C*%3*`ViyL#H00J8cT8cgauI%CB_1^Ytbq-vTEL^S#zwLy$9Kd z=)`7~+i^r%I>$+T-XjvT1Jk$j1*+doY4KY2q=2`D$?Hy+$qY!WX5%56w_Po_5_a2(cXTFpG+4b<_C0jy?o{JN8(L~d7TE>qjh$4k4Q9(H@9OItjwJ?R zDboM=;RR((SF<9YUd5J|7mVNt^V~|xJ|9YkLf3!46vS)#QKz<^uN_frzr^`gTAT@a z*49?yl4Yr#@;Omq07vHqy*vIgeTbY6fkXCV)Nbz0jNZSiwJiwVY;M7F#tmMd9PCy% z$JbME>c?=2(0cCU9P*Gb(+U3(9}AS3bxUaEF`uQnEfMD$i>2YLEOPTeN5msdOw4Rr z1pIrl%^XwSeZhc}8m${%zqjm>WE0|2u1N=SbA{q^MY`5E<^*zKzYR_>pX zJ1?T2K-0`!$6Ockdd4Hnh7e^-o4>64#*lqsUxYoyPh+-c>{j)0EtHnSx_;DqF7<_N za!93QE?p~a%Q-y=Kn8nto>dGm21O7|ldGL6xX1>i+SsZDxOkyj=8Urw`LvyMq=_S= za2d(B$R9q;DPJU^72zAEdeq*oX6pAgA}cIvQe5lcn$}%^{fNfjzm2s#)$cwci8Zp+ ze#CbXdOY)W7qwzyCC5FhFu}Z8f#a`Ysq?}}E_k*;%;o+iJ~X|pWc+i!tJT-(RIgBb z*Jz=CV0wpsdb)M8;_ODLCId7YS#WsRA>A4+If6_t=Pb)RPiZJ?P@%iwFRHmuGR6DM zi&E@nP2fW*Df$@ScHVH=mQv3ep%a_0#7y+m4 z1iYr&p++`RVtb3XDUG{>Wi+Zr>&qt&?#!}Cdv&yaioETDJOziUi&))TWTNFg=ENP$ zy7h&!_2&*8k*_WhEGHEsMJ@E$oh+WOR2-jytAJ)u5XG0hX}*&$&YyB}apS1yIwmf$ z6#btptZt|r&Zw9e^Btt&P3*L{d_AGwd z|N3&O_+p$6`{OaaW)Q(oX+y=KkJYoI;7OrrvWCDj5a3NrZJ! zV?ve-KJ18Mp+1QrQ%Uci^^t*MR5L)W#oo$gh& zz3#JfM!vtZfYlSh}x+jfw`ryhD-kBhd}w^fo4(-)HWYB-*GTNzi4G#}|%=|VmWGIHbbGByG zelFFneVGdDL#!Y<5x<+gvX!gd#Y|GNIbP>Xv^)bsTfjp3(65~ljD|y<&o5ed{KD~~ zH9Je0ufcKTr^VpcEO(eJX_#>j=#lxX=vE~*>yNHQ>{iYe&5H-fh%~YJe zw}bdh8NCSyOs(&dz+7q;SwI{^WV7DR+TUP?zg`v#8b2-r3v^Y36YHDSs2AzeYhX;(Q}9GHTIRr6-+gOp^eCB z`qTE#`KZ_=bcfBEdoHv7n1!H8VoI%{)PAHfmJKha(tQpLH*4K-L-AjbnP0q5f4rC?x_08rB8t)5>er$o7_cnfCUG>rlu3$8Cyiw%|=E7*P zY$q!AGxC!&-6cP=%`s1qo${begO-Jo<$S0KtTdxcOCuJv!`g-pwvQTW4Q39!vagSaOErW->?6zeo9VdsmbQOo`T7F&Sk!ylFmp{3gFOk^=1O= zdus4}bOwEhyxI2H4|@xgkiE!K$(JH0E2wkhv1B#&s#>sh!s5)!FRa(NzO*6wA42EMe#*qQsX^7++Lp1^xT+^~6?+daC-pmP@iRnIM8;KPO;&KP??OQ&qxcyUKmX{fnk$0K z^Eme2)#(2hWLJcaiQ@29@GV?Uy-~V&NT!qf)x*{p4A`l3N;9Z8XC&UAzE&fAb4StT znX3uMk@i}Z>{l}~{tYOmCbBSKd%Vo%j9JJb39b=b?|QmM^}IF4da@ug@_sU3Wi;Jc0 z^O~@c>FMe2ZkX()Y~#bROwN8$Bx#T?bY9n@Y5YredKclpIT$Oibc*X`xoptXbiKyy z*+@qeh9_dg>GoteXNCO^%0%|gFb(_HB{Bi8<%c_;{IKJWxPv-$GM~}zl%J96s3Lb; zB(c(?rCSR$^2yy@YZiK`@|DRthD~%9NeNl$)d!2~x=w2babk4#*51QXjK65hM{aHs zov-?Rjv4+3?;q2#(1*5-OF2-OQ74i4)g_wgyJ_RvTpm6NVm!muOwfJw$SZJ}cAb>XJ#a6;mI zH{9?#xW#Y`hVb^cS00I_jZNx;6Az^S#j1?-$iV7HlFAY&&~+7 z9i3@CG;(xcKoRvOTQ2FrQneS`a3X-Z0 z;zDfmqrAYe)tCJ=jM|l%W7nuk#UEI*ZcbEFq5SVAk?@?2cc4!TU_>z1tU6So74p+< zC3J?p>v4KlzF0?(S9PvDx-ex`(9=bjx{X$=AnCekOOtT=$g|);b(nEU?!ZJnD*d^6 z*~Ij8U1@2lfG1%@iAnFsh^{59P%(GA0e$i7mxP|49v*W-w^+K}@%A((F4=>K=So>3 z;^ItN<(osfN{CZ~)=!UEjk~mL>W((x4Z*)kdIcuI+E$X?3%!1%rlw+&dwd5=4Ne;x z8A;}I-S7J*{QUXzBYX^;$6OvKwlLMnT&3)ejt+bpxs2>=^x>eq>;++BVxm7b35VnA zYeB(=`1tq~?~BtAruv+m9MjJ5ze?N`BP~o7FQU_4Gg^vDA7;+ew|^&v&3)N#_oYpX zd7q8Eb_wHwz7*-h3S*1JK#3)n&V^YnDD*yZ(H|xs9GH0Kwzugw&kTpVE6$`;y{J-e z_C6`7ic0(EysnP_K~W58&rJ397DE+Lv8@Vl_MT56IM|1(1<^)EEdi`iBL$s&40+p4 zCOydYc$QQ8Dnb5lf5D{!{L=f>y>;yL~T3JMNC>l8jjWDks_zTsv~w+rKFN z*q$vaqO9OBTK6FOe4vYcoI~X#qh+t?{q#Bb;ucL;#Rj^yEvL!wNn+*GvE9BxGDT;u z?6JBa`I75HkB$qxE3795!v&CsY%AWDV+OVM7+VGB-KCH4g_as=cD%l{?5&KLra(0J z)(GxDc#t}*?VL7Z&Ou1$h*;ilz6Hz0`wWoTKCuIJUatSOw8%CGCbF4nKYR+U?WwB4*;((t)K_(GM{WzDoSLtJ zY7VYS&)liHGk0;>uiR6p#X_eV;#or@-pG7-tvshydskjXlryQ>i8=wxL1rxV2}%8A z%vY^pldg>0SbD{b$u$%^9_yMhUZ- zw$UIrl~$4ak2{@_ELzJkx~8E4{gHl5Q`KX_*{l1tR!<=;7lVooaZ%aQIjzN9+&N@Hga!1 z5UFN^S=gjJhp3$f^jdaGPa?OHAO#0Uxf)zoLqh}PRVODWC~%qw_XmD%Z!j`4DrLzO zjayob6fhHqA^>+qjmY1^!3hfrVt#nnrs3S#$*C;Rv~0p3pSWtHum%H{?5qh_@F^8l z60eJ#2$|dJH-&UD?1wK>jR^jQQ9hHA>lZDO2aZsEc8_y6{pF=oi@kC`_Bx_oQr@?7 z@yvtviWSsW<1t#6_;~QS@X$4b?sw;zoX$yv5uaG#6)P=ap%NXuvs-B$pX)qP5m=ok zA%V(ktmQUv+@NWat*5F@h0P3;R?uPs4I!c)3y~aXs5H_Y z&1ZCu&_iRk;aI-KT~&G{o`97qD$?O4g{*;XujLw;blHyYhFb+Nb*JjMeTri?$cQqU)M5OnT&Vh95 zeZHYb{_gktU%!6w?$nl~r9r8vjCzy#5qxUdgTuqap2)Rq#9>u502tajIxd@I3Mm4d zX@hGbiy&c_XZNZZrJz&LXW7!RjED$5?{lZ290gD0p_ymdzY+So{B7sV?!dkd@L1qN zIw#fp$XfQ;k9{q1w-1u1cup>E8?@q(qZWh5#^8G1&nZf1*=Ut>ySjhnD&{If6*GGo z2zB1rc(>OtGd@%+q*b%|JXYv=W`v5EQTR4vZ+I|58T+xTyop=9puebOh4_9{xd~ar zz}!+tV)yMy#;0>5#Z5+O>-=0(lX>z|b+64-yHlYnEdUM|bU2n=8SFi8~;FaJ3c9UVM~nk1UqAi4c(?8+b=luszX-_(h@x`2&k zHB3QKG4jioLl8q^VqyZjjo0n$?5&Dg$C~K)rqqFz{kAK zn^O2^=jRD2eSs+{DS=(d{5AcRVuL@)zx)dTd?p9iD97W(pE|gkI}cCN=`U={cgR@J zm;cCHh-<$c*G?it&EWOiYjZPheB5GcnqV(5x#DeSEyls!nb;%?YrOnnbAsp`<+Odo zex#JJozkQ3y~QQEFXMyM{8fwfCs7)cBQWVMJ}*~@C0$SVm{U8IAFYjxOOa}{j`pCc zsy0<{O-<}CC%;!5`Q6mPIU>!SItm$ic?Ik`DU*v24G+u@B4<5EISg8VnXz_^6iCwH z;Wf;5eHG|}(;GC^5K)?y#-#sa8m`OZjs9{#rKpfaNK5vv~iyzhB1I zBFWTSdO~S2u~u-Tq_}T$yYq$tccr1pUPcd0qMRJJr%pA?ZSC#vNBDC-<`@9TV3~%k z>URLSm%5VDpzV|;M?gS;-U9Sr$Al1#9lH5CS*8eF&_1u%57vyXpt5t{B*90D9L6Nl z<|{8htuGRteR8veaFlcUvow=f2?w(?J1t&BULLK2@{ClJ8ZxP8rWop;?>+R@jCFyA zUfWcM%cd!!(?ln$AW!Oni;YXf0ro59nTu_GhC&_&sA|4S##|F!je7rDu~hyIH~0LE zpj&4XTs4*2ROJQvFc`jxm3LCUz<~!Yb}U)-Mc(ze064qS{apU?t-%7X10>2!L`tN& zWmZ_l;rE8&&-U`guaJp!H4(q?K=n`!HR%+loGxj3HL<(52TX+=DMUs3Nb{?!HQ}Qu zBoc{2k=*qMJmvJ{;HVJB68= zQSCzji~)Eh9Dt+K>G7}Ke2lBaMQ+e4TAF(Jt7R&VTN1TR)zwXjb`+>^cy8luc)ovc zZz#QO6yTqqS1`Y{1dl}4KT=VNR=s`q(429`I&v#;<~28mAwy(`!GSU;1pcA;F_kj)c{qbu5|v z5mmkb@8<5{U?mRD?Nm=8VNa1}&CgCcTWm5_8aD-)UlGenI60T?6IxpHuCL7C^sGO(EGs#n@_xOA&UCS}EAl=aloy=7pVc39 z)eGRhQ-{lc`1;kWA7v>Ce@RNtsOQLQ2R`Dymo{WP#i6?*-_m37#$ zXsxnt9bvNmXYpGn2*G z+wc3EC`IlQQe1-6pGM6I=btY}b`emm(KQ=$FNG)i+K`0;Ga7vh?Cn^U8);#(a8+SEGf|0M90 zc#4WXO7Z%VZC<{vB)*Zsa*&RFjWr89fum`OM$6Q(m*+g2BvLZPhAr$?Y8i#5sE7== zYu1KG2@7ZM!_-0AiB#R-qR*;*TNwaUVi7UYGcfSG9h%C@hUVv6NJs>NT%ZdV^f>t* zc!ruq*8|Ey=CS*SbAX(pr#Jig^Jjm$$6U6*7u%zJF|gMs$~OAb#d{OE2Tg^9jf{+P zb92+hLNzOG=K!z)AnEb_`}6DTnySthn*DX|$2gBzGHhn+d-;#Gb#;@)(yIWe7H#&T zObZ+<*{`guWU4>WM_-&*RaK3Tk1HrBgb*?Hbat{Pbd!;hxlGx$O_W)X9tQo*?pm@c z(Zhmg7dh&<0O0RSY%ebbNydfB?@Zi{dnB$;nYJCii+Byl1;+WP4UN^9v$jZ{Jw74) zS@P-F*B|(fMZsnJ85EPY0x$WK04wQp-D{$0-Y78gxAcwuwFk4I@$U%>2@7fH)pUNR zR#>BL0AVPfa$;hr=nf_)BY{Ur`PNs;h~yPOgMs^;U976(iWWrEglE*BdnwM8iPg7N zz|^6vCUV4l6auOpI3_k;p40xD2Q*by;~T04s>XsGTpWy=MVfS-!AIQ4d}o)!jzToo zya7RxYBJm6;wro@-EpbNS5Rkg>rJ$4N*yYqbL!-MzhXMtup3!WY%z0vt3@(4O{MuuROC$L4Wy>#%c-6)fxY4HLng%7)z#HF0I6=*>}-#~ z62R4M%;rP7H#s>OSMbbMUHz*jj3Z8_Eu0(#=o=vN0Ni`-cN?GjaBFfD zs2qibg|)R)rfe4*dT5q78R-6INiSk;aHVP`Ie(UohsUis5YNlY%eaJFP!OH$zWtn* zR^xU0lbF?5Mp^lbSbC8S5dp!`R>iE>UJDU)esPh_dWtJaE;c#&qMLIzPy(F! z{&yd-nD#w^snS6~mbrQJCJCptHsCt7uGlr`zhY8g;5&DB7suOHsmG-iqcSgQ$r|)W zowSMGUC$K^AJb>_Z0-8Wp{Qk2I9U1h*h(|yaL}nRhg8s87oEOyv6IyV9WaI<*I?&S6g2Q6H;qIL~#K2zZx5>Ru=Aw1IH((XSp@#onW8Sb~b4;AaW8X0YyN#vg zq+{vINp?2&0pobl1^MjAYF6*p7f14ij62r9 z=)YmLg=TDBHx*3}3>=;sz#uj*(I_Pr-Ma@$AS$wPEG_Nrxy8l%U>>@*3FD)$%hzVf~f7xcLK~)VVhL|XBSY6+B!^sVj z`>ZxqXBr)caWxxk-R$o6sqfxUhEh{yo zAWvw}$9(_(0v8t-kK1W|s3(cH;T$oE^m_6a&A=QHo8xjxJWh@Tqg#%~KYw=lg%ze* zCGxu?q{2IJvaERDVM~88w5mQ~LI8S5a)vtJm?P%1H{bopWUg6yqp$#2&E2#>bqE^G zp!t%!;qKZ2b^*wS>~+zCr;Aa>$uY69=mm1L>E8U`Z&XuJQ_FrPC9YaL{8?C~4O42Nbp<lZP*h40`viM-&gv82Vrq-2I=U>hWDjz8OA%+xHhg=O2kq1^H zUAJ_YQjFv6-kCN9G_RHt<1rIunBWOs791L3jpG#gw3skNjQ9z_sRB&7t$Ue_h{EQ?%K1c2SgPvmWh0k%&9yKGBgm2xsTEro(NDt8Y~U0`TSi|I{D(e<+Xq zrv&u>qxJIt>(G7o0jBamjGORQ|LJ!H*KdC@2zIH6wzl?cz32b*YG~_r^+uu7#)xbZ zPg(!F*RT7koi;8`+60|N6x4|B-TNFDS7kk2Z4s9UnkY?r$wU<%>k#}M)RvdhrFUkDwWZd@6=4ItJp?{xf-1-P1t_TBC#4tF( z-H*4AD5tBP+~+Asu0X=Ag4{2}0pL3u0QUHDCfJ&`%Dba<)z4s~_ z&bKloquh?SLHauf3Ro@r0wo?!RwlTAaFD=kAlBe@es*@oMl5S)1_p4z0%z~`#{B$# z5AV+5_Ov_D;ZVmrF820FI2s8TCv$!JNZ2#|ISCQ0d=<0|fS(@u{QMYIf?C9#HY{AWuP^W+__jlURD7-^Y*G zkGWnjF)`85h>Ij9O>W}O0V!B?5g0$#QMFBB0GQC3#=N3rWo z;vKb}8Xi6>Y9pfqn6pU#Bmeo?UK{yJZ;GJX;VQ1cNvhX`Ns1@p4^6d_M2G;~yHoDH zwy{BihX)kz)s+=az=lG_3^)=*|1cH8kd~Pblq@X!E)6IhYwPVqZimfl$nS5PRAHJ& zKe3nqb4~YJ0vs0!)V`G^ULJ1l^Ir5>?`I0(7$&`oX_wh?Oapy=aHgAd$E&2^aQ*=# zKwOyc-rCx#bKaT&qzBZAz!DWi5Fl7wc63on(Nafq0pww1{BAA51R$>L92~T2-`QDN zZ5^%+ZiGiof@5iKq0RerDfV9*PVRNF_VNM0DJm)go2Ei1pzt^7Q&m>4g%Z*-F#$UL z=npd8bKkCN1NH&p4>;OkORJF}w*SDT<7pRw_B2Gq!XB@I0;fS+ z*w$nPFE4NSLuMh7A@e^Uc3SPDNa&`90{Idz;&{d#esS_=0j#X7O-)VihpTqOq<<<* zMFws4r^^ZL?d?atR8&;f*4DUuyNxP(Knz3yf~l(~#!o{-!^8v!(9Hz!M`hYS)v?oV z8?QlNCfNiIcBvFm!^72n=>E~D9twqW*#abRv=Hz^=s<%vI)CKvQXyP8G^uu;>%F`- zqkg1 zSHcGm9`iU#WGbpCEAt)p3F~?6wSZ0B+T7Ik?x+N*!rn~K6tBIrlZ5Y`Ey&p5k@#^s z;2$&YJJS_5v*P5QL$-Vr6clW1htX=faUiFH_^k&?9_fg(|5NG-1leiw!pPKg73`VA zPTg^yavrFMkB5Jz3x-00MvNCh9UcmDhmy#Q+XhT*0UNG+)#*rnjg7cO69%21pC2#< zey$?2i5Vce2)H;1H&VWLyT2kRvq4$|u0EWv21J@EGB$4zf}v>x)F_40D&S_!930M# zKG#6N0Gux^A@O~*7L=A|FAx>rIKaZiC5k90phumJG|vNiQmzTRj&WDL()O(I;xcgVSW< z+04K-~siSgR8ZIGZ>JbQLbvwJgDuL@c{nxk+assh?;Z@&+`=wd&%;cQLbJ6_P+D=K7+H)cUhlWMn?6=39+ci;6VAdGUadaNV&Q zcphj!7-?Gqey#)*G4OTZz)ML=vf3epLJ@w*cAAvZlpVqd3Ss}dWPB$ek#--?elJm{ z2MA?oslza$6>#C2qA+TfFfz>=^$z6^_v2a!)Ri% z0@^r0L347YD}l4uk^}rMB$3yp5M)?T5evW}y&nNGkG#O?B1qPH)sAN1EHyLBO?&1t zZwZ-qa+6RPMHINmFD*&rK^+xZYt;W93F?pYM?f@PM4(vjWlB|M)t~W2ZxVc3| zMFFQ|=hK}AGWj1138GKK+YO1?Okbx6cn%B>ZUw{-4i0v9bQt#}j@P)@`2Mg3bPLqb zkwoCdiyicZO@EqbP*BjLM~`Ua5_b^@MkXfoB#1ANMKUuoK7sCq!7N$9vt3_M^F<&= z%*%TD4rJ&ABrY>{83+PDFe^r_a?7boySceJo}?cAqSYhhAJz*dcjN#PGyx$Y2T(?U zfWs0eaDF&wQ-9ie0dUF|NCluT1?To{AjPWtMfv)RC3`zC1>JNJL0L6lqpAtUVlgW$`vbQbc5L&vc9MYAFe?!AFV$ z0|V{HEA73y+{W=Q-)Xc;9p+D!r7pQ~8YusosYQM4i6!FJoq@o>vH@+^Q)#k^-N4Tf z@=&0}uqOoH+26k-D>8hw7_5KSUrj)3!S;%uEor(MX+ck|RCV+zaDLFD@%M|A9_aE} z!IapK;@C3LyAG|5#qF}9uz01BAa<-8z$ z9Gc$$Xo{H2d=xbnO}EPz9I<34IdCZPVqpu5;updQaC0KeXZCcDDH<>@(}YDYwF*V0 zZOvt>qH?-jTSut+60dqOfe&mjQIzJhEobe>NOA(|ulYHqm^DB5na1s11(9a$R8Ach z>khgXL4hYXPD&N{uMCbeqI&JHOkopkQpVPk1yjvGuNo*kx|-nQEYIt!QXwiLA`AIe zhmB2b!XnL<%oP?_k3$0NtY^1AiDum*Cl@728;mdhq>4(N$1lVx){{~1>)^d*M=&!p z^Isau#xpv)jn(_srdy9+YGFC-f6y0VBL-gS*Kb&?K156o3l{^E{hT0vvH1p^jpE|5 zeM01(hYI4cww>`jPUhmVf2U?!0`;-h<;CoSM!WJ38U-?f+M;P$Jo2r>D^<6`+_>XD zYCyVptNjRx0qVJW3i2CS>JDLmX4M{k`3J@*maQVv)%xK>+6N&@lgpnWL4J=6;9V;X ze0Srf83E9A7LDz8ue1hhQ5>990$f~Cn5rJjJpR208N*`>D_br6!9qLmk;9zB+hu~s zFV?2J+SrU-bz20v%Q>#hOvz2{qe>@m4R3D6U^$CGc|w5uSY0;5CVfvTr4Rg>PsRMQ zK9D*kBCC-sOnaq!aH+2VnpLjV&G4i$Aj`p|qVUJ73u31g>J@d^@_a^cJulxjT&aq^ zWaLqFLN4lcetxeL=|>=S*Vjj0xoX(lXZ$_@(^Qq-3&0yq^GZ3~kQ+W4OFEd^3yN9W z!o6HIH+Q5>7w%s@fHTt0+^HF=VYXKFF*dvR=A3se;&6Q1arD~FxjiejzX~b@0y<7K zAh46eJEI>hwq#R4Cs|n#qStump3*S|gZk8vXU;fphSSYU4hfl1NjUUT_4pakB67Gp zki%54zC1|zOu~TMjNazm4IZ1mGuCc|r?o$LXrq5iElCXbN=vGIRr(6|j}#{S0R$F1 z3D$maSDNWRAB2D$Ov0>eBHPX~k)4Dff8%sib#_!(cdiz`PoA#gE~)c=?@(GRj5;Q{ z#v^{X`?wShfzNxwn6BD}`*1X8KM0c$r{TGet|V!=f;K1hud!vU3~f)L!5mMU7tZ(& zNM#XywkgN9$ItnBQ(nZg((>LsI`lM&)PvJ)I)1#AHh_|tri$4&0f7YuR=u>b9J5L< zev#cs4<)v0JT>kcCVMYir*|~4d?r4!JacY6^BFf75mfoE22uC3Xp^qsD%dLV%6NQK zH&5*|tBU)5rJ_L8d3t?NM*4A7`7DXFG{`05+1JD<~-dxnQD;*yGkB3NZTsO__>g*V}J8VV(gwCKoU5_`661~;$Sifmye#?bS zoJM>Tcm>U->uqgD1Od_1^P;=IIjiSYjS8`*9>e8=QawvwK^PRxx}+pG2*~gr{7wh? z&zvLf(@k#IR{v>Ew(R|2_ZD45VIJIt25)bFV?Qv(v)O*$J-c~;I!wqyZmCSP>~bt0 z#GgLy39FJsl&ZRprzWCM(IEK5dQT-AoZ_XHo>w-UG(V#98>M`<;)~--1euVs{r3`A z`)em#2h&lArc%s`17F=uCL~dodB9t;tJu=SxaxwY-4JXbl{ODN-^E@G}NiidA10dXBsAA^EWy5L>`Zc_K`T4C+N>QfX6!Hab*56S} z3$7b0XIq$)D!MrFCuf6AhHVyfN>Yy%r!voctLcK>-`Kc}t4-rfvM;jR4!yMDMh>fC znuEFnlcD-you_XZSs`svoIH8A{OsP&bt)$)wAI_YjOlRiS~}TgRIEp3QvPLLjei9R z#nETznRd^}n+s%spO^!!`<<)Pv9nG1CQ$cr&JLnS5tT$MWt09#$h+hSbcxHcot2JB z{i^p`YA6E*C4Ghk1@@i1ee){;U>rERBK|d`Z-&l-4+*yydmEk5^nVlbshuf)+gVM>~1`K z``NPmYceX}UBx?gub=}D^z8v%cUYNT#?xM}!-A&@v)L&g9Je46ZuICP_NMxBRhx%t zM$dE2kVoyE1_*TcuVuM}tzzr*c({PE1zROt+%{%@b$^3-ipuyBep*?j%LEo8}+GXL|7dmmoG^AT^N>qtH? zSZE=yP<7E6D}rA7yTAg(RF7lLti z{q55?Keep3J2|w_{RD*xWYWz-9_~P@n0QGg@$6n6VWBRkl!!GQ2L=N=V^LepY>~z&@6Rv=qVlsFORkC z^!KNXall%7ysO<6(V4SiSM_#_(-(R)F=RP(11RU9rT z#t;s)1#!ag_3vVGAL?7LyXW(>%4uX&e0liv!^Z0+)5fZiKP!DR{&ndg`AQF_X0gYq zq90r*A-*XyOW$$V1|SFx!Z}`EW^u)f@YH>R)iqUJvf2N8uVR_d6XRj#k3`-G4gMK}Mz8M^R8PN3 zxkQWK7Mzu{VUy@vDR+N39{6N-8#Ddw_$u#>_$}QhuSg%2Fx`VZEzn>}uzL{kqrl*| zO`a8Tf^4I%!%r-K_JrmTuGd0872ljJTLpDhFpdlG?JJyXsI9z|nJ9tRMyAJCI;Gk` z0`VB)iY)&7ZcudiP#@seBbaQaV=zfm{%k|~`vsdV0ltb=R>-&0(b=T8ct1a%rw-S; zQzk%mf`nyD=&wIhDl~+&);d+Vb`aiX)j@k+yY^Y)=}XA8IE-eD;pTGjv{*x@bqQ%% zReEU72<@X=GpakyoHcc7zOU)n>8^PdVF<}|eTna-#Nc&xq1heJ4o%@d=$Kt4@ARG@ zoJ}HOXkxw#NqgA8RfG3mlePB->7+~RU)w&K(cE*1c<6YXZWIkdBW!2J^F)wP^O*b2 zBa^-tkW>!B@8bEVkJJSGAdRyg-&-kUyaa#84Ze9>@7#M#a1m{lsHRjG_pw9<54G40zW@^fh5w3DzbRqm55DvwClhOR z1n3h%Bc{!F3!xpb@S6hKi>s`L8ktm&CoB+Jt`t9Nb455~MoGjT-jnUI#5uYC&y!bu z+|ed6Q)@wOLtCXPTjz7fE~C32{7N2d*ho_$%2798n8V!W6Yd;I-Tr;7t+V^GqT=B$ zE`(V+w&&18!tWsjKfSvXKL%1^jnm}{{qK`9df-EiHSFNFQ+S?&2;e8*F61lD={Nah zFU>$dVSzisZH1z2NtG5``0@Vbz0bMBQ9qlujVmBQ-zp^>+6)5t%f)mdluA<8lZ&Q{ zH=j9#6t_xog&eiqG{5Cxa8N7XIQFu_rh3@L69P3V)<1(iU+a?|qdB~N3zMhL;3H4W zQ~Frw=1wh^>*Rl%6#d=k-%ngpS2iy?O0cFi5^Bt%>;`z}eA2T<9z_~O6Bg}`C{I>j z^V=L&Jtz#NmJXWMSi-2qsc3i-OP4#Aws8IPv*;i42xZ=+5pzr}^JmYzLl$(@uD=a@ zdYjH@M%cX|nOo*#nevw$`2Nhx*KeLmjWjav9w_9o1|$s+hXpG(wd&N!gdqeZN-^Zx zZ=HP;mURdb6eoQqRnyZ+`j$Uim(rJsC1kO-xIx#UbM&;q+V6d4r&458Mw;z$wo^)& zEDJTa>`liCCz0o*vRB92J)vLcAWz$;ypZb2NZd~rG|YFh2np86g73YaUe)w|pCv5b zpsHZ`j4{t))NQVajO!WWbC&Patduv-$#|PzK6@kh8t+%xVgmO_s`0~Dw=il8m$^rT z3C}K4XWke-!no%rU~>?ZURE|^%5WWVo#2Ou^xMK8Z}ce+T@&OJb6`$AWqsm9@6*^9 zr(u5%5na1=WlqRc<YreHSnf%`_}1) zK#g)1c6M&pk7F*&8K~A+7o1~-u401reAV_Q*vcudz&m5t4s#AF$&=cP4>rup2&zVU zy>7cr^UyQoIPSV&!)(db`QEZ80TkTx)h{ELXA_ zq^8>*UFLZr*R8D?#TyY5gYg^Gw2s}O$FnRt?G~Bxg|{k5PrG@^D;Qdnh|Rt$U04jiCypDkeZ`H=l-8~u=R`@)sei|9xBH8$I8aEln#n4rc`7KK9 z@8-C2DPXWs;AU7)(!j#&8$B70mFm69r+!dXdzAb$T`vC&DMPIpiCpBYPqvcKDx*(+ z>-X9l{y(VutDrcyt_>7zBm{y6g1ZEQTX1)W;O_43?!kk*B)CJcAlS2GU9{0tfPX5q?#n%gz4e)u&C#PMCT z9VU9cjblH==*=%rd-weXpAR&q_BaS;ecH@QVNCutJMMd=-K*e0P1F3@&B7wDsoVAU zacwv8jQ>l(6IQSypW?NWqZ@aB*=9j)tq9D#&(j_@o)v!y-=22Je$`=Vs@{-{!X#5} z`}5K=_9q?Lzw>NT5s>li?KG3V`;*flSfU-g-~RGar_I_RJ2omOvc71%x2uH^;)6>! z?f)pD9UWm@jqBJ(L$6yXY`sPHCePkg?-2c$3EXq4b~T-N_?@6^n-4D-Dd2rS6(!`a zT5f!-)PGNoR$xmaMi%|9=l1n()JX1l|7bzO5^a9a~PWI!A<&$yAlQYQwtyctj!8=>Kjc1F3J`*(jRZ?ep!=Ht7k zpf3xz!TsfS?7`4raav%dl@z(75Ov7k5e!%JbR^)#I<;xA$YV}s+*2`8t^XQr7-Lm1 zj1L46ttYdx&6>CL72R%g%qe_Aa>{QnK9W8v6`0|yR&f8!JbZJc@6$I>DgA+bW_os) z^C8@y-(CFo6-1HJar5uCalgP~fTd5iW)IC7XkzI4ba)ul|EQ85OtqYc^1Os#ox}l%rjL z6h@_3@s*V1>oi3u;)Q}Vgb(K zP4n1X+bifM2-P5`>}hNKYNumjQFk2VW`p+C`!qYw&8+Ws?s?<2jFTQf%}5A-E~f*$ zthTS+3-uQWDM#x2GobqtS$N)gFY`OZ6`HUPt2zeHo8uD#&{FL@p9_81#R?PprHqZ4 zKRZ-*yMlw=*DGIrE}5mT{9mdc00Dtv#JsI1^)))`*Oy^7v8Kx6(*D#w8TM z@N^XDM#+&ql`Pe0V`&dtp7`a&-dq+}KgZ7VCV5j<{$t$r%x~_-yME$drJHa6mA2c6 z!O##>;c@~O^!^=`k>Cj5RS@V%#C+ZsYB4QY|FyFbd%7pT8drRzBw?I8b&n=bA7;4!900Se}SSiuLQcIeP zeZ}7LIXr!xR+@{^T$L;A@utuzF6JIS{$0ZdcRIS9|S5ZCr zllUV0hWJW7&=hQ*Gb)|)OS9nvhr{v#0hf~aMvSaE%k)A_eZfqS8kR~Ol^J@ff;Tz%NTruNc>Vr^(2bQRa`lb#s+IXc;z<=rqV3#_WZfX}2Mye?t7 zR41To0!$M5;pNNe;}`kV=b3`gTeYfnUi8_Mc9*iXHC%M(aZp+gr$}y{^s~4nMGEer z4Y$+EDPrkQ8IFQD3B6j;c0*$d@QVM#i~zCwwb3kVA!8M$!n~nLPGP*~?Js_C$-z4{ zQ@%&K)By?s+d;0IzCkIW4#Su2(lIK1Su+*SOm7;Oe+V%a0lx`+>TNyRI)=8jqdac+BSr!56si;zndc5xDW zqiL+S;Q9;KIro%rddy!%o(q5XG%PCMt0HYq=XyHzKE$;K>~JxfP_Y6+h~@_qZ;2{4 ze&))n$Atd&W_S##@PLDNZII(*>k7@t_gNdZp)+C&(mll_n5JjjLLqoF&E=T5@uyya{ZDoS3 zKk=|)Nf8uxg~raN>ri~F)XD}Cy@1<(uY8_mH^cYcw95%| zx7G^V#_h%b$yWQ#+ znEvW-yc3@Q5Umz9*AN8Wvk#Z%;2-_S0>H@4%DGeWTH|2wbvfr?JH-cN8b^!na|?hU z7_C|Wbb%LR&=aL`_++ZZjKquTu9w^aFKna+ya2+wIUI!EFrD!ADt>=N!3CV0W@YyN zG$g?DZTF*9R(FSIe+;H~Q$bX^s+Zm1;B;bljV={x?%-ldBD|{n0oIX5c_L>daI-n+u37$Y+G6_K={#z&f^euKGs&l&hr$38gNatdIKDC z4h9@n1I_8jzltf{Iv?2Ub7B{UcMh!8Mkl?8$igdx;-h@x_y0|q8jw>vl_11bW%uiM zm8W^XyZ_Ve+nd|r=XeserzLX^|Hsmujs#3vGDY#+;Waj8Drf9ESt4p;pDk(g>qFR0 z(_yl~F}~EQ5oRxL_HmD`lxGOO=>-B2ZuggI!2zV*_bhksbU($%F(3fGr745Sc;+Q4 zNOOf`MZtP#1hF04ltaf+n{;%qV-~q?4JphN{*^T|T0Ujc1RwM7oi=hLE zBrpV!2Gr=HdNO=d8OIwa;Q=JfY|Jc@#pSNsCaW#mksrLxx683^3-Zd#1*U{Xl$ZlB zX~mV=eJiI`z+=l-B}*7tQHZs zOH5(85JfDvwsJg%!M9t~4&W zf7Z_Rko|(M=%tY`6r=KO-*J(rn3&9^`9P(d(S_V4zZe2OtfbY_H}*YbxAo?uMZd%p zettHboRXRxG;{~9rY08)^QI7`1^5*0Ky#NN^M&h7=h(=1lznZF7z48Z!(~q zsrcXt_pH`=)F0O_ujl7NB}E#E$*2~m8^{3;^e_-}Iz)F78(7TGf>7D?e)HIidG`S$FSLPc1p@O8fzOZg8bE~Wp)-n-Tdq8 zIn`NKy6pilZN|P0jhg#}$MyXD`VD8mOCvZVWB)CiD+;r99kBvzKu%H9>-QmFL<1Q& z`{DGoV4nuiZ>8I?2H7?cXC_p@SW(zOq%X(PlGnEs_!1{+8LwDQFEN^6tGP7tfSkr0 zw1i$kCve8c;_-Fp8WTe7QbPJ`y#pw;!#Ew%TAhz!-txof@^iDZs1(p6G%!uuJ~L%g z%)^@9OZP7_v7e+SAQ`D6H%G>pxz(+BIzapd3P7|9cepXZ@%at3lVGoD(Z&@DKo*Qq zPHqhi=H`ZtmdIoC?4_aZXquUKucff|+r+o)R;`=eT9|o5)TVymD@|xwOEWF5_=bE072ED!}DVqG;#N3 zf+Z$i0;!XfYR$~0bxh$O9#(zlH+_j?=5u&kxM5HvI^3>i^)*t<7pROl9L4=2Sy@+8 zDOt@5-4G$DFdiA6w*2d4xqPhNa5j-EUS{Ep*YyG`Acs~R98Z8+z;|_mzOW2CTZTLD z+%}5rJzcn2-+;6kQ@HGK7+o$SnLX2cS*-VXAY+Y7vdw+I&WPDw|Ay*?puWg z+5+bR%(zms38}4^x3~D5zplTl%J5S74To&htiI+W0YQy_k@hn*L5LCv6s7sJf zC|S~NG*6sAxavbRBUTZbm~8=x7y+2BW>kKQ!L@kOH{0nuv;K5;ju${+fJ&9-Xi=VF zX5nQQfq1Um+cW$iO03!y8J_mwI)3rO_hUe9Z^Mk;`J*`9do}T*50_np?Xc?e?=vrS z6va(G_J%DvLkFw{N*3_4KPN|~hVhqht!6g+?kPj^wA!lO0YD%*^^EMXPL9z(Q7VW# z4`!3$P2QFY^%PXDy@QZ|=o;MDot>G7_yqB8{eNmcd6i48nL2ETS$pg_G`}Iw?+Z2@0oAp`tCR}6Z^AG;qD(#1}Z6;w6 z3atE@>{tz_$Fdc_i&LsWle?E6oqsE<5;xK_JrUTVq#jrKUr$bGg@p6%>KlVMWKi!>!k&j}m)hQy=zxbOAB&c4bm4Xof1`E#$Zxsqb8Tm#% zgMH?S5~w=+wZz;6QffqQ^Yi+CPraYvF07r|D@M~_zprun)^I#4Zt^8TmKYr6oguvtnUk!(cbt zEo9vr8#TPvL}H)$d~LQn{5~`3`7+i9aNaXFt9S2{aXTM(;>q&}JXw^gb*ehwsg2wH zR%|xj8ZS)-3Pa36u7FIRj3@QT@!6~+Uosw6{hV}x+DuZ=%P|tB{C}=1A!iQgiL&S? zButnJ{PX(yUp~QgXF~9#Chu<+Q2o(zjdc<;+KkfEAVI-rj+UzWoYL1l<EmVgU;oqq(50>d? z5qQ3bxI1&`BLH@5@GXJd6jb|DLZn0-qk&>xa%xwamv|$Y%;Ie%BeKeMFm&Hb2o#OAim&w=% z1AimyjYn?RT>knvz67d$vFu*Lj4%oTw=NMB$3FdbS=OkGE+=k(j+)?zy85M}`V`{X zz_q7i@CZ(K_nW$!0h>Gjnt|K_C;Z8!uDyTH+VvqUuo1jf#nxN#YyM_ZQYzjNxVPs2 z=wPqMT`Uzp{Ku2>dE#hG7rBAh=gaGZ4lzHfp2ykQ%k7oA-s-nh5Vut1cfH*5orSk& zg!~+&fa7ujuivT+tXT77Y(5NtU;KE1AT@oA!k4T2+U&KfCVc!zJ(@9vJtY+HDobpwM<9JIq^$mP_weI0%18=JdcnPMrL$rD&e}SldVK+?`qVNLI~coyb6I z!Yb$Rb>F)MiwLyN=hH@FR3Nyr?fQeKeYiPVt&dDpxUs5K{Dc0{1|xy*tL~8tsoh^y z%oB|-AwHhjyZk|FkWPoAF|BptsM+IUP3${_0`6>5GUOX$VSW8)Kq{j?XdOe-MkWVr z|EQ;hxN-U0);=q`(Q3IOMd0B?i2=f6wTOuqtC?aoGOUS@O5$R;-grkQ)k>TDG8R<| zOkMKf5boZ@TuJ2WGhq(MQMNxVDRb!{{4W<^7yH8CG~2YLIQsH8THWEG`Q=<6%riF1 z)3f&;Rg!Y7VN??@{#mQbqPsE9CZ^8q^Z^Z=;GTrQnkp+>Xy#w}2=95n0>qo>5D!+v+-Q%pM8_Zz)7%?dn1gpoM>O+8nv3Nbe;o4e1w zbomjB8bu#t6vWp%;lDLxsy^M1foS>P>yx53w5kUgcQ}`IvcU%^*5V#%aKQk&0`@j_ z=@I2Vat`oOO_^Zs{q)mL9Ba%X3Ajk z#&e>Snxm+z%S%?(x(4mU%+%JGUV`4P@c)lE;5Jc<_eV}j{Oe{spPZ!VXjd9)a&y*8 zRZvt_6rl=MhA5SpGbB$TOPtd1pU~4u8?dUcFC6Q;y;P7=7Zdspp=dO=s;t#oowX>; zSlpp6Af<%p*{X=2Uh{pE3WV;=J@e?8s#shp$G%yhY(ACmaiK2G7u>2)nt}Y+Mufbf z=f-L<(!OIbAw9CIxo0jwuuLm8JvTcZ-JOw25QNhMmc!h^!k|U;T7l%$+pQsfwEj$| zwr1ba2%-8r&3>B|HM33_>3v*oof5{lY?BQ@OMKEe%^&;`I5wx2T3*K^UQ2lu`l>a; zfNRNnzetsf{54^ux%AGl@Bg|tWMmRJ6hK6NeM#>+ud>qOipNE+S~)zZaH-Sg!7(hH z$cUHz;HeA^&hQ7;4G|J~t5XPjgk|r3Tp9JoDzD}#9GIbsuxsIWl~AL=-+iq=!^R<6 z#Y+S~VIiiLDMbBVjpy(+AJ_H%Y#)=ux7LR$ahCAEp$+-=wucWD0uzSwt*YaXqai03 z`S{PeDbNEIh871Azygw_aY;M~Po<#t&I{BNWnADp1Ll|Q1n@NBzNF~awrc!dcwN09 zFn>;YHq~i$?I+R(1lUb$Ys+|W}=7U(9La#X=h`u;Pvq}K>H>a z4Mf#*a^Kr2bSh=$70W~T-#`uopX8)$q}fc&PknK}{b3IPKqk{w9jnrIJtt|WYPC9` z8|#Cm=p_C?bSCXEJ!K3<2Tw+3CLszx-Lw;Buv5lu-Q)*Vl_X4@8Pc`Mm4$r=k1iH^ za~#Hp?*sJf4GjwgVe^o~3&$HUki#q`#rX2s?Z6*&shHk`Zrb_XjE19y%fod)QnF%Y zq@)G!wXFA&?u=7<20siQV~pE-$i4^7-B)9Xj0Ue+!=QbvmeN|7{2S=`v#&diujC@_ zGYi{G$OJ2lnVHl$i9;r0>6C|-RtZUes`h}IF>4C81)^J9AXDh5kHFE{}` zSk$6=v9)-N^-@i(Yc1v&I$Rk$8LK2c0#m@Gd1w{uX5UTI&hq^*Ea6*P)CF>DsIE_o z`a^Q_xpYkhU!ra^_`DCvq{i7|M_Y%HLPIl(tj1^hq*bAr7Uns2Y(pQ~K?&&qz;CGe zc+~L+O4}RVtMK?nIzt3*d-{!l|LcDEX7y8JxNDs6ss9NHh)(2m$;yREFMn^kTe@0j zT-`8<`OVQxMsr8oJ}DJP0;Y?sdtL+1S8i@{|B7%bEk+u?YRSs|+6j*(SaG<+yNeso zHz%~qVvZ%K{}g^moJlWLLNF*LCIJTMVu|EXXKygHygJr`8s}s3IOA%oF$DZ_%MmBH zcC#x7n1VgXq7?nBFhN$@fUk2dYhFJxSO=M3L0Y`8CI06`Exm-cPu-aWkrL^e+URmw zFCLKV?m;-Q*`-wt*z|J_=0^GrOy}yMWFvOE||Mq_im+*=R{vq;UK49RiCjn1IJR=hr2$&my9ZJZS93`%a_fiYY7*XA z0HU-1Cs`?4-qMD!?O)v|Y%6iW1e6J307&ENs)j7@lFokCH1}#!-Lli)!Xx335M+H1 zg@>2N&dCYu$mP73dfdM2T3b#fB>>@~#DydjYbu;$y=oo-iWTJL!ZL|{oe_)zw0~z_ zWq$bI5`kp>EUm%|x@YmRrTr9VU0>ZKI~WH9KoO7MG2FHdV5{XdFB%(a_DX-;04~v! z2$iaKED{1;nQ&ldettseSA0Z)g9=qc7CmD?g9oq_3M27DZ2AySwlS(@tqUKsUPFQOo;mwcmma7+Ny)T$Ny=lQTaRah zS+o2uH4eFGFX*+?cNwxRdr>oEOYt8}<1K_=fb+jkX$MRZBQ?F*h#}DJ01|*C&U-Yt zmJ)9|~)_P;6V}Tq^A*Ml7-;Bk6vC!>mjf6r=zBp$=sOhc@z-GSKB4tu(b?Ie|n!PcE zh-BKjX5oIdW}rclK;2-dy#w`l63QFK!|?W7g|tksc|0`!F?fEC%GF)3)sGcva_W_w zOS4wx1IVl{20I{(jLnqVu7yE4!i6OflUA*#r^jc9_Dau^9la7OLR6`=zP$X1K{n=p z^If0JKOTbiksussKCXVj_B_^?JyxcZkxoE;t}cIOEoNqQn!BHk{@i@e2r%r};`P2= zuSQuj+;#r+xtIlETgZ*p!+LP4@N&D}#8!Gpx-c5S`ynO2ec65cDjsm!VfxtqkUE%{ zxX7ke>9pvt*Sh^2DGjQhcYLb28wWTXMQ*Kwx66{XMl(LxI{j1{Tsged0oV8XHABuO zg+Wgbo$pLH%D_N;wAM}fn1kw8i}md@Wf&8_gRhvX(9)1OqiyRmT9N9!9*<_0LhK(a=d6B7#Z{rp0A#B-UWzd$4MsM_+#@`B604u z{XFvhIJcwyjy2Web@cK4rN0-(DVnT-|MB2edCt4}NKaP8w!STGJS;oa>@|BvM7Uti z-25fEVt(4y`u49*L)ZAmRItC4g+=3>o*uLijTG~tBcQr)=ZF0l01j6xL$E6Ir7NzD zJq#-QmDFrUZ(Y?O8ynO+1&vKuGKnd z4p^=p)yp5(cpHVY;yqp46hDN{6cZ(0>_G>d)oromj!y7~`3k27fa>;^cBi-=env(` zwI=R6_o#y|lOf>lR=uwxnXQvX?{aFESE6v-5*$PEqh?Y3E1z#01lr+0Kj23-yB$SP zzA%Kp?peIwBWLxYpD(a*lfAlm%G0zQV9NyHAEVmmISKWb4A579QsP8WQ{%!u2rmDO zt?l%2G=A@wd#0rE7+Wo`J~A&3ac!%@pP$3R^IX=MD<=6zqL|duQvfQp>f}F~e!DO+ zJNuRe1*<>2m@)~dn;34&5^_VKO@??ORF#@Pe5=EYizALq+N>W`RV=BOZA zWek9G-jGEY!LOiWvutqdki{E5eAJ%a@6UcNVG{wd+pEc&3Y27SC@m5Q{e{>anefz-?) zEQ08rH=YUB-ANQfA<-(OVfWY1D_JpTd zwwj%t;}z{kGW$mb(6QS>AI|lVg)6_51zzMO@weA6^uQ()ncry0S4vi<09O4X1>axx zVxFI?3x~GFDwe4A9c226D`O7|i z%3e%`a2Lt`9-)MFIn}(I8OMv)Yu`Zb)AviDTzm!qNn7WlPdrq#>rZxjtX6p@F9ssk zz_nP)AG4uD@Z6iAF~e$k-|c;-c7pwk)oi>zKkT!dV!0Ai*w5!ja{qU+&+B{}1V?wC z`SS4{B>Q*2ASv?fei<}xSajnH7fO^Vm>>y8u2-&a?-u)FWwRfjbwl5!hXhW{pVVkp zx+b=~xBMv`iO3nF1pU2w`Q%AChAqLYirUjST$6>LSkQQ}fgGEP#(gfVm#Z1n?9Rmm;Ik{!r2-6UG6lTO z1rxEqnAkGVLd+tBZg}C`d0QT@61%X-?JFLoP*91-wjEj!R29!&A^wc&A3VaoFU4^6f^J3HJ#Lua@C!?o zuZwJGZBN2*S@O^Lbvv=gr4MxvDL*EmT2}SG0*0Rc6_9tsK`;~K5Sf@h7ighfV4XuS z_>IVZ#j&w!3*{{Z#QP)ouE86emt4w57EL!fh{qMNaR--dl`Rz}lQ31gQTOR6Tb10^Vdi1E3EO(IpXYe3M$(umO{R%fjOUI$re6!J!``Y6 z2*{gfB{D*f2ysg#2Mnm;aZdL+eN=AlXGb4PFtuH5h!@ds?LI|{n&A!}R01j07qg(_ zE8#iGWwHE)Hc(jHN$?nTp4D)XX$PIebEc6swRLr|1g-B_ps*lRjG0iIvpwcB%of!q z*^jEiEfcyG3(zGDCPg!qmIcB3rRMV?iH{!0_G;HB0C}wW$is`4>#ggkp?ptH&Du#c z2XUQ-T{1F&-iN&BoF1JvMqF59k^{08v!9@Z%HMb6r@tAt!nyZUpK-|Aux)H6qvGgL z;5|LqBR7(vX-rE#ZzX6vt%+vCaT?aRc!}hq|58l7q^OrCJ~7OrBP2d}FoHj)?b zoWw+B6T{qjVK}-ulmGF0q=Wa7p@OTtU=$00fdmk z@>Sg$d_t-fH)r}_uO@w~GAE8~Gj=8^VSc(tIO+?@lg1S$9r1Yp0N!Os%*GPd*nI4l zZ-xr^)C7!X%S6s^4HZL=FXrJbX6211b3ek0!tx96-bEEGQjrOA{;D-**@YqY0Et7B zzkjnDTW%*<%2u;G^)8}jt7E@8yIZ|;!3T*_p7vfBMFK6rl2!4ALob@-d# zHE7qZ1U{c&YlGMvcBh=;Yx0M1-FQ4YJ1mi{&hw{DxR7B4h@}9j2OR22xD>*~XKwew zXi{oUaC0P=L@}^=v*L9T7&i^Ag#T#Qp-+B*Z@7?4@%~(DaViotXF#(sREm1CHvhTF zd_+1sa60m-t@}5s2u1U=wQ|L}ilUh`TF{>%1Pn^YsW!XaTXtb-6P= zv6O2LjbCM( zp#7W%`FjiGayV!Vm|nrWi;cC(0OHnz7^g(i`7bAp;ZT}(Qs1#o*t~B=g}X}}ZPs+n zKGDs5R`nKlKXaRzSp(r^ZZw|a%8^uz(yyBuUbPq1YVrYk`p^;k?`^$lE8}sp20)hc zYRZNnke!cVeO~#k;Ot1$g=eO6NB zSH!zWGiucPy3&^%VaVutchxj(MaS2+pt7o9CW+~y;;T!hn=Kor-H5x&oa+^e9+RV1 zHna~1;C;C=jKOERC`u}T#as;%*u(u=L%jxAdV3o^pT3(<&A?3io4ek5UGmeph1~-~ z)Pd)fqWP-L#b;MV%Rs!Bz6*zvJ|)E*>opV0C&LEwdZ_7nULx(p9U6#GROHFLO^Uq6 zmqAAO1Hw5W1qnjb&{{Hiqq~&V!mP=P(wIi!-L_bl>xouf)~s;cD2kB;*;&D{z_ zgIN7HiQzRdqg3c^yVBCpRlc_+3S#$5zFQo?(Vx~5Rh>2^ZcE(^Jd6%mVK}&1 z`1$n!WWYiQ2+G5HXKm74yG5>j$tq*Ty+hB}U=s#8eoe{fn`|4tbxbC$G;&IeX6z)f z!w4i%uCgrK<86$uZ4iB98anJ*1TfiH0dSqUM#CyMkNK}6=Dw`H+b%i^<0SQ7;h9B zl@LI}n$du?bY#^(ZP;qd20=(5QLfrnK0ZM~Az3rgn4NHL+qfYbs98yjR|o~=ZCR`? zNFlXWN_Yk;W{z5sjPUS6f6!7x0vI4`6^%n&qbX53&~Jt*Nd|b#P^!j#`SI%X5IR@) z`}W0zy}dc|3>xaH%uAT@lhN++jy%5389yhA2nLa+654N+Rl1Fn5^z)ybO53>QQAV+?jbKih4S0WRz@iN`>bT!dN{OMn% z?&nvmZ%}+2%?neA;$v0QlI9jzko=#ZGovVTG!dAj7fAX(YBSo|g-H3tPcoPA8}VS# z4g3?*5d2Kwo8B-wUA8kU>sbUek2OADM&CdZ5{w8a!BRBUj$WU-ZGQe&iNgD3_JP~?;G>!wHR-^)0`?mZWQzIr2lZ~qz z4~7=uGF+Y_$<72KfAyIAsYy5qSapIH<`nbHeSS6C|#KlxM3RyUJ&`-q!AfYq0|K+M^qPmRY-XtEL9?H zeVzzdWYoVF!RWIO@Jzo!Qm{O$D0Q=tMoNinx`b@LnI|Eutb0i-V(I6<`27K2BFPX? z{|u+CEw+=K)rs_HG0$r%Jf#VX*51DWRbB&#u*ZV)1qm4lmQ6|)Mt_bK zvQK(djY{li2EbLhUf-@=&_O)0K2RQnC!IQpVWx)I=}6HVb}k`MF3Xv~-d?zT&=9g3 zj7zJTtU0p$;-_;e6u&9{2Vl*ed@!wW>&ZsM95v95k(bt^V!fH;X6e><{rfP@0Q~?9 zW@`GoWhxb@*rhX_L?sv$i6*h(3>OEt%mvua9fuZ-wwfC5H&0sGVeePmvHWv5a|dP* zoi!>)eG@Z7c&|J}nULX-&~ls)mMrBGmUks9pei#K)SWUNj z7u3Oz@4@}TSiOZ2aIuVr&;*-_2$fPdJa4VbO_*?DYl`4bn@hPBG84v`Ko`Z-uv)bCb8sz=|NEB))0i`Ke_ zSX{th=z?gS{D`9s`*P??t^9as2sETckdzb>uX}&C@g^~lZ9j&E5X0qj+zcPeXTL6N zyU%Gcu_VKJ_9hQiT<33Fpc+1HICAHoqKA}*^2e5-4G?ePMG6dP9Xz!ASysoMYXA9zmeYy1O_Gf|^e ziLhiwrr+f4xfek2bzeSF5##N;JeaZOF8j@~637i0SMwQECm(Pmr)G?#2rrNATeC38 z){l=>m_5>@B?~tvK((!vH`${fA<+f99i77Df6NyN+eCn}@Q9sjz^4!MG0t8tFbqO@ zl)SNO7XVOvYIw)F7r%F6dxzLOMD3n03{--y_pX8#{KvEG`7&ZGyFd&N{jS075Ge7F zZ9L#x7k~#Tx-Om^|J?{6I28NBM#=Ee85{!{Mj|b{w~Qo0=F}$X{1Vd(WX7c4d|fGjySG(w!LC1hd>E(9lH;Uo?6R;>VN*SkBqm zV@2zsQM_9_aB|iyRNkGMaRdb9FCsR08bb}k8!NyS?O(lxicn&07p7=iU40uyTfe`H z-hu)h5Q1xYXz2p(tm*ANUI1nM*h5AF6U3j>*}K2#+|OaetB$2ZA3YGDrOcW7mcK|Y zXvr|tauO-=3 z+Fp||_3w(JYk~OsSj(d0;p<2O3=1GxDK^As&2v1Tm>g+F@nU#?${FB@mkkYUkFozM zL4g27c%Ql$!X-8qLSXN08xd~k#1Bg-nc&%%_j1dzA*4?v04Y%+6~(jLyE;?sEeXXTY`g1OPjb@_#Lt@6a?A7(la-$Q z?DB0FniP6HS%3B2s3$Y?S|=hLgZq(N?J(j%68c@IZ=;>IYo%dpuS%nL;jkmy07VTq zd*FdJzeNoCx$1VRJsa#Y-%CJ;qzPVdpwPtc4A)b@MkA4xnT%ZT@;cKm&p$SmqgBKP zpJR!gk7}J6zP`#(DQ+h-i$@c%8Td=1T)f8fX|ThDG#m(&ET>=5t8#lJRjLx*I;DB6 z;7V$nU8Lrq)a6y3dYwl~@7&GPyL_sUC+WD%Rgp`|pntiQB~T)34SCYGIX zFTNSa8EP1*B26d+mdbT<%3rsr(jv3D(F!9J7;j0%0K2~f3`%EBvO&$Rx^A7*f5a&JjM$v5cGBZ~I4qb&2L}^$gdXIVI%6_7Z`H4bSKE znn(QbT*tbsSLchlBCo4+5!N~C{bt}F9P1j!T>LtA$nzS1%~DroX4jk*{uyK?(rIhd z>K>in2SelR%&30s9?NI1{w|mec#S~Nw^?#UFpQ}`sfj7$F0bUFI#XeL$HNi?`5Uuw-h%Elct$<$SUr1)lNr&7+k2C zkQE6DJ@qZ$4{qDYn-b}@b;!J)Ujmi_Yd1Dds8+zT0ww+iI>q{C+-;3251Wn(5sSxExhx@u=u zus#I(vAGw+9ULJvac0>_)UafyeSi!=+eeh<6iEsEL-Vj|xBMMK#yl=JpxNNesIR2c zaUiP&-)R?q@+HPq2{+(d{v@dbC1-|&aXwTl5cs7WdEuzY7aFaGkh6r2p502;Obrd( zhBDF;O#%qXR^_?-6&3aFx?-${1ue*T^`vqChHzyrxG`jt4!M75V*5>pw)>eSBLfZ7 zA(9m&HovanJhQZo+lmGC2$KFjaQTM`L`ZS%?&WoTv(i8nyEhH#*&6-w&D5qnkE;3DM&S`=`piLVaBIu)nL~)g ziLngHgsmgDZpM$VhOkRF%HcG__{G;aU5+u%XDgG0{O|0h3tN}B*vvs<%+R*r()^vB zhVEP`dQ5NH1a*4lY?P}ttAncNRR+`9$U=DuzcA%4^+1LBObI;`P`>{(qWZG$>})>& z0wfn?SpYG2$cMRQ$#vCy(&l?dkD|T%^Jz?AVPS8mym>5*cxv_O{^Zcm`%$qLYj^uZ z)xzPd+bjar9wun0+^SaJ#M7{i4VG3n;9jR73>w-BCcY>L<605w($IM%Qj`U~PuO7l*Y94eXsI@A2Gbpp1)2eUrk2 z;}O8Y9Kx)O5kH*DD6lU~nE>Go)K%66dbzd~K^Fy6AI(-;XWQ=BuQzM6=cs5N@#~bc zrB<)AucgAcGkP9`#eAebU4J$?3t2~BRD&=i(t%FpyCE$Kpc+Zia=^*XVKo;AwQU}> zZQ^>Dy!yoWOD97?PG+|l={id1(W1SBl*4g$3M*Qo({+_li03E2+^kdk!1yhITFjZt zmh>*X=>Gk3}aG$q&fCf2e|(JQeu%p#gyD5hhAM=(*<{2*d*N;jM+wgW7Psf-v9; zs9gPXD1ZtJ(hgobNC_hlgwWbMYr7nhS$%Yrnd0@&`3{UINJRi5jzB>Oqw|Iy%RYqV z)5^er1Pxx+SoNPPHV{7CR- z`ukW9CpoqN`I&c4C$$)H2ew?wTL)R2e=8>d0CA1f4I62)U^=qe+ZAXwGn)S>>j1o$ zMK#b`ifrB$k`RmrtJfK9_i?k#jK+<&+H-}+ymw|xvaH!{cSa1`s4*}V#-Dw(AjpXt?`xg9H)ZpBr^%cTQ zcOITGta0u9j{^*~Fg)*#L`8;n-beXg(s+MwJs(I1zuVV) z7L8fscv(-r4k}!aOdh)mAG@bYqZHR}=^?UK$Kb<2`EO`>jfjFUA?D3LpMd`N|G!&f zqB9@Xriov27Z!TbzUSIw6XMg7kxAPa$)5enr{HGydWQ)B5Q!+V?wObs6&7YZ7sq+q z^Fp|D1r=G9r+3HXkaT&A*RRHC>!$X~59(rMRFPi}O8!{}=aL!109zfd>T$gvlv>z3 zT4%i6YNNV8)-1(e*I&n8x!wdw49WJFaSUMd2<&_--cbj(xlT*c^?m^d%(x%~cx_S{9#0HnumFs%iFFf5IXfG5Z2niInGX?Hn~+HA^I8FDg;0N~+r zY%OGZx%ix6>}t9GkUJq2oz2l}P0s+O zdSr*T`=D;p@po2hDU}He)u?U_Noi>xpDpf@dG5=lt%BB6$DUkeoQ@rS+m{W?Yu9JG!Lh+IDZLwu`1^k*MB9!X>6XuIcH@Nn2$>vL4&l^Av6 zy_>q^rKe{etH2RIj~YX1f7RM5evIQlmOON42VOa4eD!dvUiGvSG}(22ZS>vYecxPT z|7N=(px1J_UKK7Kr70j5nuzqK5_(e+kP@O)0U`8I0#Q*2{nDjI zK|s1lF9DS%y%So9fDl3;p@k4ak~!Yrf7Y5W^JUhoS+mwmK7^G+a&|fIe)qHA_E7Rr zXhD%0x2@rcB`;8sEBbKR4}X&QGfi2IAr1g$07q?sTpVYY#a#{MYv(9yKA=G9qv{sX-BK04%cJXU^HeB@et=5q zNEMJmqaf~|jymZGq59J{hKK{U>hO;1Va&}Z1oD2^@Z;m1q}2-%oU5}k2qtA5l+0Af zK_OOrPzHnN)RSKHCy+D_CJ-~h7$ly7IK+now|$$}tGucgR|l^v+mAFBBj`ezKhKz&HcCoL_UIWS z$oTy1NVX9@{)*r$*0tC4sMH8j=`59*XarRmvl5b0f_E60HriIk)QpXd<7USn_GN)K1)s~47ZR0nF7=~CzJ zSeiEWbm{3+0hl1j+@5w_8PbOKC-4#~X|z4)TbOk5I##>G;vcE;kaY;_*?>(3?DtL( zddvB3qVzY410@Pb_#JJul(;lE`;5c@OY(Q@0C>2ZU}OfiCDo6 z)HN+NN6kfafh&(5vrL>_r+4vt<9f{5Bh%(9jl#pCC<_DasP1NGk2kB6yXnwzT^Y95 z(dK(-)M;o=9)JBL#tid#)hF`9^I4BNq(oWV`0B5#F=JmkIfDTRWUU9SA%{Xb4C)MC z9Q0#iZJD;Brhgw_m|4OAY`pxu)sV*;NBmHh(nG6`hXj63U74G*PXhd3 zuYkj;SYC0O-+yS2`tOwF9atkIN>4rna@tmxNa1>#Kj8)&ko%jq2xE zbrx;0STs|seE8B%`bsW8MA#%SOg8s$0^qt~PLBE}2@b(arE^{WtezHGKm!yYkry-z z{~Y{b+pLzWMYY$efnpMcTbTh@f};)bZBO{BYCHX%aU?7~F<1=*G7PH<=&P`cVqfny zw^s!5c#dVKZ#cI*BxK7=?Ge)D)H(^D$9%nVb#D1oGP`2L*{EBy06}EC_yyr8fTWI+ z%XbyRL^t&P!x=MSpY>2o%zgNbuh`OY$X!?22p1QXaMHHWY^`T+BG}Tpx3mYhT>{Wp z2p?NaC9mWQauu~}z*UGz0LQ{drpE)I^~H^J8wJT4e{r`ez@Zw>mNZH4Om~%o+?ga=bO~=;?G{K|??ia}I6pBdDZI^1@+% z?Vgi2E)-!rq(9#X)ec_Ui{MP2)s=#L2Fe642YXon{bL;uexu@8>;INmfF$IpLl>kf z#$oL}+!4{mHoDFcRebDUD)(yLV$QFQ?S^#D+U>f@4?h-S+5^D9KAkM2;^)j7zECvs zF^S6f4hq%eU0RNIAogm_wKEE{Gl1r17E%iK$Dr#Pdt(P%Wa~FDU67h4uc#LS@%(ky z>vY{nes5IChEKOX8H#NQ*<0J<#jERr3Z@Fu=RV!0Q=EQZW-yX&vWs}Hr?vyK!dQxY zoCZ`~F5q>(7K;qXufFmhf!g-Jj%R?AX2hTSr#conrR^BG86T0?ecfkutDX7L0ZTvf zan`|5;I4~8&++MEkJZb9x#{}sDneQdPtkgWxHc6zD&=TTptHaS4{4%Oa=*jU-D)FygN z6by$#gNwe3NO1{!j>tsFG#>IYMjKGj@=LSMoueF#n&XdGqO0v#$7c5`K=bu9qh{QL zx)ir9F)>EIcKc3GyOfyU=X?DKI}JNWeqMeXDQaHn&OTl?He>&Vj4P_fpf>tiycNGp z>f1W3wIAD% z6xpdoqO)m&GULS3W2cbFhlEBE8fE+mXL<3>+kP;0LH5i{NOEn#TY6+bzV_ig8gJ=F z9t+>duWMXqSuf>>{U_NteZJuWnz(&YoG}8Gi_Msw4$#$;=+iTv`qrPS41rXu!W)zu zFDn7gEKT)}%V7;j1AJCz0PZ*P-2N=~^3RvO;}@Xa!;RX8fzq-+2K-%y;w(VRd|IrH zB(;d0oYZfVlRo|H)XB!hXZeP)*;xYKKoyR;sTyvry}_&{Sw3O@D%0DVc|dLRTu*Ft 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åIYfh0(*n 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 literal 0 HcmV?d00001 From abedb59a17bee17adaac461d5abf49dcb3536374 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Wed, 13 Jul 2022 13:37:17 -0400 Subject: [PATCH 32/34] tweak: Show what to click in the extension --- packages/vscode-ext/README.md | 3 +++ .../vscode-ext/images/extension-screenshot.png | Bin 0 -> 238188 bytes 2 files changed, 3 insertions(+) create mode 100644 packages/vscode-ext/images/extension-screenshot.png diff --git a/packages/vscode-ext/README.md b/packages/vscode-ext/README.md index 61861e5f..68b7d7bc 100644 --- a/packages/vscode-ext/README.md +++ b/packages/vscode-ext/README.md @@ -25,6 +25,9 @@ Check out the full list of Squiggle settings in the main VS Code settings. ## Usage +After loading a `.squiggle` file, an "Open Preview" button will appear. If you click it, the squiggle model will be shown, and updated as you edit and save you file. + +![](./images/extension-screenshot.png) ## Build locally diff --git a/packages/vscode-ext/images/extension-screenshot.png b/packages/vscode-ext/images/extension-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cc33518aeb99e7d38313968656055c0881c796 GIT binary patch literal 238188 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%0A?@hY90x>T095L*H%rEt; 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%0AbbO1vam9r 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%0A1|-5jqPN5-1}5YH3_U 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 Date: Wed, 13 Jul 2022 13:39:07 -0400 Subject: [PATCH 33/34] tweak: Indicate that the configuration step is optional --- packages/vscode-ext/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/vscode-ext/README.md b/packages/vscode-ext/README.md index 68b7d7bc..1c529ddd 100644 --- a/packages/vscode-ext/README.md +++ b/packages/vscode-ext/README.md @@ -15,7 +15,13 @@ You can install this extension by going to the "extensions" tab, searching for " ![](./images/vs-code-install.png) -### Configuration +## Usage + +After loading a `.squiggle` file, an "Open Preview" button will appear. If you click it, the squiggle model will be shown, and updated as you edit and save you file. + +![](./images/extension-screenshot.png) + +### Configuration (optional) Some preview settings, e.g. whether to show the summary table or types of outputs, can be configurable on in the VS Code settings and persist between different preview sessions. The VS Code settings can be accessed with the shortcut `Ctrl+,` with `Ctrl+Shift+P` + searching "Open Settings", or by accessing a file like `$HOME/.config/Code/User/settings.json` in Linux (see [here](https://stackoverflow.com/questions/65908987/how-can-i-open-visual-studio-codes-settings-json-file)) for other operating systems. @@ -23,12 +29,6 @@ Some preview settings, e.g. whether to show the summary table or types of output Check out the full list of Squiggle settings in the main VS Code settings. -## Usage - -After loading a `.squiggle` file, an "Open Preview" button will appear. If you click it, the squiggle model will be shown, and updated as you edit and save you file. - -![](./images/extension-screenshot.png) - ## Build locally We assume you ran `yarn` at the monorepo level for all dependencies. From c1a351a7043309950d8dc53d7a8c2febbe05da8a Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 13 Jul 2022 13:55:35 -0700 Subject: [PATCH 34/34] Minor UI refactors --- .../components/src/components/SquigglePlayground.tsx | 12 ++++++------ packages/components/src/components/ui/Toggle.tsx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/components/src/components/SquigglePlayground.tsx b/packages/components/src/components/SquigglePlayground.tsx index 534be721..a8f5852a 100644 --- a/packages/components/src/components/SquigglePlayground.tsx +++ b/packages/components/src/components/SquigglePlayground.tsx @@ -215,31 +215,31 @@ const ViewSettings: React.FC<{ register: UseFormRegister }> = ({ name="minX" type="number" register={register} - label="The minimum of the charted distribution domain" + label="Min X Value" /> @@ -521,7 +521,7 @@ export const SquigglePlayground: FC = ({ ); const withEditor = ( -
+
{tabs}
{squiggleChart}
diff --git a/packages/components/src/components/ui/Toggle.tsx b/packages/components/src/components/ui/Toggle.tsx index 510b86cb..90e73e08 100644 --- a/packages/components/src/components/ui/Toggle.tsx +++ b/packages/components/src/components/ui/Toggle.tsx @@ -23,8 +23,8 @@ export const Toggle: React.FC = ({ layout transition={{ duration: 0.2 }} className={clsx( - "rounded-full py-1 bg-indigo-500 text-white text-xs font-semibold flex items-center space-x-1", - status ? "bg-indigo-500" : "bg-gray-400", + "rounded-md py-0.5 bg-slate-500 text-white text-xs font-semibold flex items-center space-x-1", + status ? "bg-slate-500" : "bg-gray-400", status ? "pl-1 pr-3" : "pl-3 pr-1", !status && "flex-row-reverse space-x-reverse" )}