refactored to a higher level of abstraction
This commit is contained in:
parent
e9e6cab099
commit
165427f137
|
@ -251,7 +251,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=4)
|
| Some(x) => x->expect->toBeSoCloseTo(0.0013961779932477507, ~digits=3)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
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)", () => {
|
||||||
|
@ -343,7 +343,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=1)
|
| Some(x) => x->expect->toBeSoCloseTo(10.927078217530806, ~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)", () => {
|
||||||
|
|
|
@ -45,29 +45,28 @@ describe("Mean", () => {
|
||||||
let zipDistsDists = E.L.zip(distributions, distributions)
|
let zipDistsDists = E.L.zip(distributions, distributions)
|
||||||
let digits = -4
|
let digits = -4
|
||||||
|
|
||||||
describe("addition", () => {
|
let testOperationMean = (distOp, description, floatOp, dist1', dist2') => {
|
||||||
let testAdditionMean = (dist1'', dist2'') => {
|
let dist1 = dist1'->E.R2.fmap(x=>DistributionTypes.Symbolic(x))->E.R2.fmap2(s=>DistributionTypes.Other(s))
|
||||||
let dist1' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist1'')
|
let dist2 = dist2'->E.R2.fmap(x=>DistributionTypes.Symbolic(x))->E.R2.fmap2(s=>DistributionTypes.Other(s))
|
||||||
let dist2' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist2'')
|
|
||||||
let dist1 = E.R.fmap2(s => DistributionTypes.Other(s), dist1')
|
|
||||||
let dist2 = E.R.fmap2(s => DistributionTypes.Other(s), dist2')
|
|
||||||
|
|
||||||
let received =
|
let received =
|
||||||
E.R.liftJoin2(algebraicAdd, dist1, dist2)
|
E.R.liftJoin2(distOp, dist1, dist2)
|
||||||
->E.R2.fmap(mean)
|
->E.R2.fmap(mean)
|
||||||
->E.R2.fmap(run)
|
->E.R2.fmap(run)
|
||||||
->E.R2.fmap(toFloat)
|
->E.R2.fmap(toFloat)
|
||||||
let expected = runMean(dist1) +. runMean(dist2)
|
let expected = floatOp(runMean(dist1), runMean(dist2))
|
||||||
switch received {
|
switch received {
|
||||||
| Error(err) => impossiblePath("algebraicAdd")
|
| Error(err) => impossiblePath(description)
|
||||||
| Ok(x) =>
|
| Ok(x) =>
|
||||||
switch x {
|
switch x {
|
||||||
| None => impossiblePath("algebraicAdd")
|
| None => impossiblePath(description)
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(expected, ~digits)
|
| Some(x) => x->expect->toBeSoCloseTo(expected, ~digits)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe("addition", () => {
|
||||||
|
let testAdditionMean = testOperationMean(algebraicAdd, "algebraicAdd", (x,y)=>x+.y)
|
||||||
|
|
||||||
testAll("homogeneous addition", zipDistsDists, dists => {
|
testAll("homogeneous addition", zipDistsDists, dists => {
|
||||||
let (dist1, dist2) = dists
|
let (dist1, dist2) = dists
|
||||||
testAdditionMean(dist1, dist2)
|
testAdditionMean(dist1, dist2)
|
||||||
|
@ -85,27 +84,7 @@ describe("Mean", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("subtraction", () => {
|
describe("subtraction", () => {
|
||||||
let testSubtractionMean = (dist1'', dist2'') => {
|
let testSubtractionMean = testOperationMean(algebraicSubtract, "algebraicSubtract", (x,y)=>x-.y)
|
||||||
let dist1' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist1'')
|
|
||||||
let dist2' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist2'')
|
|
||||||
let dist1 = E.R.fmap2(s => DistributionTypes.Other(s), dist1')
|
|
||||||
let dist2 = E.R.fmap2(s => DistributionTypes.Other(s), dist2')
|
|
||||||
|
|
||||||
let received =
|
|
||||||
E.R.liftJoin2(algebraicSubtract, dist1, dist2)
|
|
||||||
->E.R2.fmap(mean)
|
|
||||||
->E.R2.fmap(run)
|
|
||||||
->E.R2.fmap(toFloat)
|
|
||||||
let expected = runMean(dist1) -. runMean(dist2)
|
|
||||||
switch received {
|
|
||||||
| Error(err) => impossiblePath("algebraicSubtract")
|
|
||||||
| Ok(x) =>
|
|
||||||
switch x {
|
|
||||||
| None => impossiblePath("algebraicSubtract")
|
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(expected, ~digits)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
testAll("homogeneous subtraction", zipDistsDists, dists => {
|
testAll("homogeneous subtraction", zipDistsDists, dists => {
|
||||||
let (dist1, dist2) = dists
|
let (dist1, dist2) = dists
|
||||||
|
@ -124,27 +103,7 @@ describe("Mean", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("multiplication", () => {
|
describe("multiplication", () => {
|
||||||
let testMultiplicationMean = (dist1'', dist2'') => {
|
let testMultiplicationMean = testOperationMean(algebraicMultiply, "algebraicMultiply", (x,y)=>x*.y)
|
||||||
let dist1' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist1'')
|
|
||||||
let dist2' = E.R.fmap(x => DistributionTypes.Symbolic(x), dist2'')
|
|
||||||
let dist1 = E.R.fmap2(s => DistributionTypes.Other(s), dist1')
|
|
||||||
let dist2 = E.R.fmap2(s => DistributionTypes.Other(s), dist2')
|
|
||||||
|
|
||||||
let received =
|
|
||||||
E.R.liftJoin2(algebraicMultiply, dist1, dist2)
|
|
||||||
->E.R2.fmap(mean)
|
|
||||||
->E.R2.fmap(run)
|
|
||||||
->E.R2.fmap(toFloat)
|
|
||||||
let expected = runMean(dist1) *. runMean(dist2)
|
|
||||||
switch received {
|
|
||||||
| Error(err) => impossiblePath("algebraicMultiply")
|
|
||||||
| Ok(x) =>
|
|
||||||
switch x {
|
|
||||||
| None => impossiblePath("algebraicMultiply")
|
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(expected, ~digits)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
testAll("homogeneous subtraction", zipDistsDists, dists => {
|
testAll("homogeneous subtraction", zipDistsDists, dists => {
|
||||||
let (dist1, dist2) = dists
|
let (dist1, dist2) = dists
|
||||||
|
|
|
@ -215,6 +215,12 @@ module R2 = {
|
||||||
| Ok(r) => Ok(r)
|
| Ok(r) => Ok(r)
|
||||||
| Error(e) => map(e)
|
| Error(e) => map(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let fmap2 = (xR, f) =>
|
||||||
|
switch xR {
|
||||||
|
| Ok(x) => x->Ok
|
||||||
|
| Error(x) => x->f->Error
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let safe_fn_of_string = (fn, s: string): option<'a> =>
|
let safe_fn_of_string = (fn, s: string): option<'a> =>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user