pointwiseSubtract test; logscale test

Value: [1e-5 to 5e-4]
This commit is contained in:
Quinn Dougherty 2022-05-04 11:42:51 -04:00
parent d5c9705811
commit 0baeedfb46
4 changed files with 85 additions and 12 deletions

View File

@ -0,0 +1,50 @@
open Jest
open Expect
open TestHelpers
open FastCheck
open Arbitrary
open Property.Sync
describe("dotSubtract", () => {
test("mean of normal minus exponential (unit)", () => {
let mean = 0.0
let rate = 10.0
let dotDifference = DistributionOperation.Constructors.pointwiseSubtract(
~env,
mkNormal(mean, 1.0),
mkExponential(rate),
)
let meanResult = E.R2.bind(DistributionOperation.Constructors.mean(~env), dotDifference)
let meanAnalytical = mean -. 1.0 /. rate
switch meanResult {
| Ok(meanValue) => meanValue->expect->toBeCloseTo(meanAnalytical)
| Error(err) => err->expect->toBe(DistributionTypes.OperationError(DivisionByZeroError))
}
})
Skip.test("mean of normal minus exponential (property)", () => {
assert_(
property2(float_(), floatRange(1e-5, 1e5), (mean, rate) => {
// We limit ourselves to stdev=1 so that the integral is trivial
let dotDifference = DistributionOperation.Constructors.pointwiseSubtract(
~env,
mkNormal(mean, 1.0),
mkExponential(rate),
)
let meanResult = E.R2.bind(DistributionOperation.Constructors.mean(~env), dotDifference)
// according to algebra or random variables,
let meanAnalytical = mean -. 1.0 /. rate
Js.Console.log3(
mean,
rate,
E.R.fmap(x => abs_float(x -. meanAnalytical) /. abs_float(meanAnalytical), meanResult),
)
switch meanResult {
| Ok(meanValue) => abs_float(meanValue -. meanAnalytical) /. abs_float(meanValue) < 1e-2 // 1% relative error
| Error(err) => err === DistributionTypes.OperationError(DivisionByZeroError)
}
}),
)
pass
})
})

View File

@ -1,19 +1,30 @@
/*
This test case comes via Nuño https://github.com/quantified-uncertainty/squiggle/issues/433
*/
open Jest
open Expect
open TestHelpers
describe("Scale logarithm", () => {
test("mean of the base two scalar logarithm of an exponential(10)", () => {
let scalelog = DistributionOperation.Constructors.scaleLogarithm(~env, mkExponential(10.0), 2.0)
// test("mean of the base e scalar logarithm of an exponential(10)", () => {
// let rate = 10.0
// let scalelog = DistributionOperation.Constructors.scaleLogarithm(~env, mkExponential(rate), MagicNumbers.Math.e)
//
// let meanResult = E.R2.bind(DistributionOperation.Constructors.mean(~env), scalelog)
// let meanAnalytical = Js.Math.log(rate /. MagicNumbers.Math.e)
// switch meanResult {
// | Ok(meanValue) => meanValue -> expect -> toBeCloseTo(meanAnalytical)
// | Error(err) => err -> expect -> toBe(DistributionTypes.OperationError(DivisionByZeroError))
// }
// })
let low = 10.0
let high = 100.0
let scalelog = DistributionOperation.Constructors.scaleLogarithm(~env, mkUniform(low, high), 2.0)
E.R2.bind(DistributionOperation.Constructors.mean(~env), scalelog)
->expect
->toEqual(Ok(-2.348336572091017))
test("mean of the base 2 scalar logarithm of a uniform(10, 100)", () => {
//For uniform pdf `_ => 1 / (b - a)`, the expected value of log of uniform is `integral from a to b of x * log(1 / (b -a)) dx`
let meanResult = E.R2.bind(DistributionOperation.Constructors.mean(~env), scalelog)
let meanAnalytical = -.Js.Math.log2(high -. low) /. 2.0 *. (high ** 2.0 -. low ** 2.0) // -. Js.Math.log2(high -. low)
switch meanResult {
| Ok(meanValue) => meanValue->expect->toBeCloseTo(meanAnalytical)
| Error(err) => err->expect->toBe(DistributionTypes.OperationError(NegativeInfinityError))
}
})
})

View File

@ -0,0 +1,11 @@
/*
This test case comes via Nuño https://github.com/quantified-uncertainty/squiggle/issues/433
*/
open Jest
open Expect
describe("KL divergence", () => {
test("our's agrees with analytical", () => {
true->expect->toBe(true)
})
})

View File

@ -20,7 +20,8 @@
],
"suffix": ".bs.js",
"namespace": true,
"bs-dependencies": ["@glennsl/rescript-jest", "bisect_ppx"],
"bs-dependencies": ["bisect_ppx"],
"bs-dev-dependencies": ["@glennsl/rescript-jest", "rescript-fast-check"],
"gentypeconfig": {
"language": "typescript",
"module": "commonjs",