pointwiseSubtract test; logscale test
Value: [1e-5 to 5e-4]
This commit is contained in:
parent
d5c9705811
commit
0baeedfb46
|
@ -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
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,19 +1,30 @@
|
||||||
/*
|
|
||||||
This test case comes via Nuño https://github.com/quantified-uncertainty/squiggle/issues/433
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
open Jest
|
open Jest
|
||||||
open Expect
|
open Expect
|
||||||
open TestHelpers
|
open TestHelpers
|
||||||
|
|
||||||
describe("Scale logarithm", () => {
|
describe("Scale logarithm", () => {
|
||||||
test("mean of the base two scalar logarithm of an exponential(10)", () => {
|
// test("mean of the base e scalar logarithm of an exponential(10)", () => {
|
||||||
let scalelog = DistributionOperation.Constructors.scaleLogarithm(~env, mkExponential(10.0), 2.0)
|
// 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)
|
test("mean of the base 2 scalar logarithm of a uniform(10, 100)", () => {
|
||||||
->expect
|
//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`
|
||||||
->toEqual(Ok(-2.348336572091017))
|
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))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
||||||
|
})
|
|
@ -20,7 +20,8 @@
|
||||||
],
|
],
|
||||||
"suffix": ".bs.js",
|
"suffix": ".bs.js",
|
||||||
"namespace": true,
|
"namespace": true,
|
||||||
"bs-dependencies": ["@glennsl/rescript-jest", "bisect_ppx"],
|
"bs-dependencies": ["bisect_ppx"],
|
||||||
|
"bs-dev-dependencies": ["@glennsl/rescript-jest", "rescript-fast-check"],
|
||||||
"gentypeconfig": {
|
"gentypeconfig": {
|
||||||
"language": "typescript",
|
"language": "typescript",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user