Tried to fix tests of math issues

This commit is contained in:
Ozzie Gooen 2022-04-23 19:07:32 -04:00
parent 260d159500
commit 217361b843
3 changed files with 16 additions and 20 deletions

View File

@ -51,6 +51,7 @@ describe("(Algebraic) addition of distributions", () => {
->toBe(Some(2.5e1)) ->toBe(Some(2.5e1))
}) })
test("uniform(low=9, high=10) + beta(alpha=2, beta=5)", () => { test("uniform(low=9, high=10) + beta(alpha=2, beta=5)", () => {
// let uniformMean = (9.0 +. 10.0) /. 2.0 // let uniformMean = (9.0 +. 10.0) /. 2.0
// let betaMean = 1.0 /. (1.0 +. 5.0 /. 2.0) // let betaMean = 1.0 /. (1.0 +. 5.0 /. 2.0)
@ -65,7 +66,8 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=2. // sometimes it works with ~digits=2.
| Some(x) => x->expect->toBeSoCloseTo(0.01927225696028752, ~digits=1) // (uniformMean +. betaMean) // Answer found from WolframAlpha: ``mean(uniform(9,10)) + mean(betaDistribution(2,5))``
| Some(x) => x->expect->toBeSoCloseTo(9.786, ~digits=1) // (uniformMean +. betaMean)
} }
}) })
test("beta(alpha=2, beta=5) + uniform(low=9, high=10)", () => { test("beta(alpha=2, beta=5) + uniform(low=9, high=10)", () => {
@ -82,7 +84,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=2. // sometimes it works with ~digits=2.
| Some(x) => x->expect->toBeSoCloseTo(0.019275414920485248, ~digits=1) // (uniformMean +. betaMean) | Some(x) => x->expect->toBeSoCloseTo(9.786, ~digits=1) // (uniformMean +. betaMean)
} }
}) })
}) })
@ -163,7 +165,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=4. // sometimes it works with ~digits=4.
| Some(x) => x->expect->toBeSoCloseTo(0.001978994877226945, ~digits=3) | Some(x) => x->expect->toBeSoCloseTo(1.025, ~digits=1)
} }
}) })
test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).pdf(10)", () => { test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).pdf(10)", () => {
@ -178,7 +180,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=4. // sometimes it works with ~digits=4.
| Some(x) => x->expect->toBeSoCloseTo(0.001978994877226945, ~digits=3) | Some(x) => x->expect->toBeSoCloseTo(0.98, ~digits=1)
} }
}) })
}) })
@ -254,7 +256,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=4. // sometimes it works with ~digits=4.
| Some(x) => x->expect->toBeSoCloseTo(0.0013961779932477507, ~digits=3) | Some(x) => x->expect->toBeSoCloseTo(0.70, ~digits=1)
} }
}) })
test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).cdf(10)", () => { test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).cdf(10)", () => {
@ -269,7 +271,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=4. // sometimes it works with ~digits=4.
| Some(x) => x->expect->toBeSoCloseTo(0.001388898111625753, ~digits=3) | Some(x) => x->expect->toBeSoCloseTo(0.71, ~digits=1)
} }
}) })
}) })
@ -346,7 +348,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=2. // sometimes it works with ~digits=2.
| Some(x) => x->expect->toBeSoCloseTo(10.927078217530806, ~digits=0) | Some(x) => x->expect->toBeSoCloseTo(9.174960348568693, ~digits=0)
} }
}) })
test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).inv(2e-2)", () => { test("(beta(alpha=2, beta=5) + uniform(low=9, high=10)).inv(2e-2)", () => {
@ -361,7 +363,7 @@ describe("(Algebraic) addition of distributions", () => {
| None => "algebraicAdd has"->expect->toBe("failed") | None => "algebraicAdd has"->expect->toBe("failed")
// This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad. // This is nondeterministic, we could be in a situation where ci fails but you click rerun and it passes, which is bad.
// sometimes it works with ~digits=2. // sometimes it works with ~digits=2.
| Some(x) => x->expect->toBeSoCloseTo(10.915396627014363, ~digits=0) | Some(x) => x->expect->toBeSoCloseTo(9.168291999681523, ~digits=0)
} }
}) })
}) })

View File

@ -56,16 +56,16 @@ describe("Distribution", () => {
); );
test("mean", () => { test("mean", () => {
expect(dist.mean().value).toBeCloseTo(3.737); expect(dist.mean().value).toBeCloseTo(5.3913);
}); });
test("pdf", () => { test("pdf", () => {
expect(dist.pdf(5.0).value).toBeCloseTo(0.0431); expect(dist.pdf(5.0).value).toBeCloseTo(0.0431);
}); });
test("cdf", () => { test("cdf", () => {
expect(dist.cdf(5.0).value).toBeCloseTo(0.155); expect(dist.cdf(5.0).value).toBeCloseTo(0.224);
}); });
test("inv", () => { test("inv", () => {
expect(dist.inv(0.5).value).toBeCloseTo(9.458); expect(dist.inv(0.5).value).toBeCloseTo(6.0);
}); });
test("toPointSet", () => { test("toPointSet", () => {
expect( expect(
@ -87,6 +87,6 @@ describe("Distribution", () => {
resultMap(dist.pointwiseAdd(dist2), (r: Distribution) => resultMap(dist.pointwiseAdd(dist2), (r: Distribution) =>
r.toSparkline(20) r.toSparkline(20)
).value ).value
).toEqual(Ok("▁▂▅██▅▅▅▆▇█▆▅▃▃▂▂▁▁▁")); ).toEqual(Ok("▁▂▅█▇▅▅▆▇██▇▅▄▃▃▃▂▁▁"));
}); });
}); });

View File

@ -46,7 +46,7 @@ describe("cumulative density function", () => {
); );
}); });
test("at the highest number in the sample is close to 1", () => { test("at the highest number in the sample to be approximately 1", () => {
fc.assert( fc.assert(
fc.property(arrayGen(), (xs_) => { fc.property(arrayGen(), (xs_) => {
let xs = Array.from(xs_); let xs = Array.from(xs_);
@ -57,13 +57,7 @@ describe("cumulative density function", () => {
{ sampleCount: n, xyPointLength: 100 } { sampleCount: n, xyPointLength: 100 }
); );
let cdfValue = dist.cdf(max).value; let cdfValue = dist.cdf(max).value;
let min = Math.min(...xs); expect(cdfValue).toBeCloseTo(1.0, 2)
let epsilon = 5e-3;
if (max - min < epsilon) {
expect(cdfValue).toBeLessThan(1 - epsilon);
} else {
expect(dist.cdf(max).value).toBeGreaterThan(1 - epsilon);
}
}) })
); );
}); });