Merge remote-tracking branch 'origin/develop' into issue326
This commit is contained in:
commit
5469435dc5
|
@ -2,8 +2,8 @@
|
||||||
"name": "@quri/squiggle-components",
|
"name": "@quri/squiggle-components",
|
||||||
"version": "0.2.9",
|
"version": "0.2.9",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"antd": "^4.19.3",
|
"antd": "^4.20.1",
|
||||||
"react-ace": "10.0.0",
|
"react-ace": "10.1.0",
|
||||||
"react-dom": "^18.0.0",
|
"react-dom": "^18.0.0",
|
||||||
"@react-hook/size": "^2.1.2",
|
"@react-hook/size": "^2.1.2",
|
||||||
"styled-components": "^5.3.5"
|
"styled-components": "^5.3.5"
|
||||||
|
|
|
@ -65,7 +65,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.01927225696028752, ~digits=1) // (uniformMean +. betaMean)
|
| Some(x) => x->expect->toBeSoCloseTo(9.78655777150074, ~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 +82,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.786753454457116, ~digits=1) // (uniformMean +. betaMean)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -162,8 +162,8 @@ describe("(Algebraic) addition of distributions", () => {
|
||||||
switch received {
|
switch received {
|
||||||
| 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.
|
// This value was calculated by a python script
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(0.001978994877226945, ~digits=3)
|
| Some(x) => x->expect->toBeSoCloseTo(0.979023, ~digits=0)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
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)", () => {
|
||||||
|
@ -176,9 +176,8 @@ describe("(Algebraic) addition of distributions", () => {
|
||||||
->E.R.toExn("Expected float", _)
|
->E.R.toExn("Expected float", _)
|
||||||
switch received {
|
switch received {
|
||||||
| 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.
|
||||||
// sometimes it works with ~digits=4.
|
| Some(x) => x->expect->toBeSoCloseTo(0.979023, ~digits=0)
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(0.001978994877226945, ~digits=3)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -253,8 +252,8 @@ describe("(Algebraic) addition of distributions", () => {
|
||||||
switch received {
|
switch received {
|
||||||
| 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.
|
// The value was calculated externally using a python script
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(0.0013961779932477507, ~digits=3)
|
| Some(x) => x->expect->toBeSoCloseTo(0.71148, ~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)", () => {
|
||||||
|
@ -268,8 +267,8 @@ describe("(Algebraic) addition of distributions", () => {
|
||||||
switch received {
|
switch received {
|
||||||
| 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.
|
// The value was calculated externally using a python script
|
||||||
| Some(x) => x->expect->toBeSoCloseTo(0.001388898111625753, ~digits=3)
|
| Some(x) => x->expect->toBeSoCloseTo(0.71148, ~digits=1)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -346,7 +345,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.179319623146968, ~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 +360,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.174267267465632, ~digits=0)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
open Jest
|
||||||
|
open Expect
|
||||||
|
|
||||||
|
describe("Converting from a sample set distribution", () => {
|
||||||
|
test("Should be normalized", () => {
|
||||||
|
let outputXYShape = SampleSetDist_ToPointSet.Internals.KDE.normalSampling(
|
||||||
|
[1., 2., 3., 3., 4., 5., 5., 5., 6., 8., 9., 9.],
|
||||||
|
50,
|
||||||
|
2,
|
||||||
|
)
|
||||||
|
let c: PointSetTypes.continuousShape = {
|
||||||
|
xyShape: outputXYShape,
|
||||||
|
interpolation: #Linear,
|
||||||
|
integralSumCache: None,
|
||||||
|
integralCache: None,
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(Continuous.isNormalized(c))->toBe(true)
|
||||||
|
})
|
||||||
|
})
|
|
@ -46,6 +46,8 @@ describe("Distribution", () => {
|
||||||
//It's important that sampleCount is less than 9. If it's more, than that will create randomness
|
//It's important that sampleCount is less than 9. If it's more, than that will create randomness
|
||||||
//Also, note, the value should be created using makeSampleSetDist() later on.
|
//Also, note, the value should be created using makeSampleSetDist() later on.
|
||||||
let env = { sampleCount: 8, xyPointLength: 100 };
|
let env = { sampleCount: 8, xyPointLength: 100 };
|
||||||
|
let dist1Samples = [3, 4, 5, 6, 6, 7, 10, 15, 30];
|
||||||
|
let dist1SampleCount = dist1Samples.length;
|
||||||
let dist = new Distribution(
|
let dist = new Distribution(
|
||||||
{ tag: "SampleSet", value: [3, 4, 5, 6, 6, 7, 10, 15, 30] },
|
{ tag: "SampleSet", value: [3, 4, 5, 6, 6, 7, 10, 15, 30] },
|
||||||
env
|
env
|
||||||
|
@ -56,16 +58,18 @@ describe("Distribution", () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
test("mean", () => {
|
test("mean", () => {
|
||||||
expect(dist.mean().value).toBeCloseTo(3.737);
|
expect(dist.mean().value).toBeCloseTo(8.704375514292865);
|
||||||
});
|
});
|
||||||
test("pdf", () => {
|
test("pdf", () => {
|
||||||
expect(dist.pdf(5.0).value).toBeCloseTo(0.0431);
|
expect(dist.pdf(5.0).value).toBeCloseTo(0.052007455285386944, 1);
|
||||||
});
|
});
|
||||||
test("cdf", () => {
|
test("cdf", () => {
|
||||||
expect(dist.cdf(5.0).value).toBeCloseTo(0.155);
|
expect(dist.cdf(5.0).value).toBeCloseTo(
|
||||||
|
dist1Samples.filter((x) => x <= 5).length / dist1SampleCount
|
||||||
|
);
|
||||||
});
|
});
|
||||||
test("inv", () => {
|
test("inv", () => {
|
||||||
expect(dist.inv(0.5).value).toBeCloseTo(9.458);
|
expect(dist.inv(0.5).value).toBeCloseTo(6);
|
||||||
});
|
});
|
||||||
test("toPointSet", () => {
|
test("toPointSet", () => {
|
||||||
expect(
|
expect(
|
||||||
|
@ -87,6 +91,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("▁▂▅██▅▅▅▆▆▇▅▄▃▃▂▂▁▁▁"));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -46,7 +46,9 @@ describe("cumulative density function", () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("at the highest number in the sample is close to 1", () => {
|
// This may not be true due to KDE estimating there to be mass above the
|
||||||
|
// highest value. These tests fail
|
||||||
|
test.skip("at the highest number in the sample is close to 1", () => {
|
||||||
fc.assert(
|
fc.assert(
|
||||||
fc.property(arrayGen(), (xs_) => {
|
fc.property(arrayGen(), (xs_) => {
|
||||||
let xs = Array.from(xs_);
|
let xs = Array.from(xs_);
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
"@types/jest": "^27.4.0",
|
"@types/jest": "^27.4.0",
|
||||||
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
|
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
|
||||||
"codecov": "3.8.3",
|
"codecov": "3.8.3",
|
||||||
"fast-check": "2.24.0",
|
"fast-check": "2.25.0",
|
||||||
"gentype": "^4.3.0",
|
"gentype": "^4.3.0",
|
||||||
"jest": "^27.5.1",
|
"jest": "^27.5.1",
|
||||||
"moduleserve": "0.9.1",
|
"moduleserve": "0.9.1",
|
||||||
|
|
|
@ -269,6 +269,11 @@ module T = Dist({
|
||||||
XYShape.Analysis.getVarianceDangerously(t, mean, Analysis.getMeanOfSquares)
|
XYShape.Analysis.getVarianceDangerously(t, mean, Analysis.getMeanOfSquares)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
let isNormalized = (t: t): bool => {
|
||||||
|
let areaUnderIntegral = t |> updateIntegralCache(Some(T.integral(t))) |> T.integralEndY
|
||||||
|
areaUnderIntegral < 1. +. 1e-7 && areaUnderIntegral > 1. -. 1e-7
|
||||||
|
}
|
||||||
|
|
||||||
let downsampleEquallyOverX = (length, t): t =>
|
let downsampleEquallyOverX = (length, t): t =>
|
||||||
t |> shapeMap(XYShape.XsConversion.proportionEquallyOverX(length))
|
t |> shapeMap(XYShape.XsConversion.proportionEquallyOverX(length))
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,18 @@ const samplesToContinuousPdf = (
|
||||||
if (_.isFinite(max)) {
|
if (_.isFinite(max)) {
|
||||||
_samples = _.filter(_samples, (r) => r < max);
|
_samples = _.filter(_samples, (r) => r < max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The pdf that's created from this function is not a pdf but a pmf. y values
|
||||||
|
// being probability mass and not density.
|
||||||
|
// This is awkward, because our code assumes later that y is a density
|
||||||
let pdf = pdfast.create(_samples, { size, width });
|
let pdf = pdfast.create(_samples, { size, width });
|
||||||
return { xs: pdf.map((r) => r.x), ys: pdf.map((r) => r.y) };
|
|
||||||
|
// To convert this to a density, we need to find the step size. This is kept
|
||||||
|
// constant for all y values
|
||||||
|
let stepSize = pdf[1].x - pdf[0].x;
|
||||||
|
|
||||||
|
// We then adjust the y values to density
|
||||||
|
return { xs: pdf.map((r) => r.x), ys: pdf.map((r) => r.y / stepSize) };
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
|
@ -90,7 +90,7 @@ let dispatchMacroCall = (
|
||||||
Js.Dict.set(acc, key, value)
|
Js.Dict.set(acc, key, value)
|
||||||
acc
|
acc
|
||||||
})
|
})
|
||||||
externalBindings->EvRecord->ExpressionT.EValue->Ok
|
externalBindings->ExpressionValue.EvRecord->ExpressionT.EValue->Ok
|
||||||
}
|
}
|
||||||
|
|
||||||
let doBindExpression = (expression: expression, bindings: ExpressionT.bindings) =>
|
let doBindExpression = (expression: expression, bindings: ExpressionT.bindings) =>
|
||||||
|
|
30
yarn.lock
30
yarn.lock
|
@ -4089,9 +4089,9 @@
|
||||||
"@types/react" "*"
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/react@*", "@types/react@^16.9.19", "@types/react@^18.0.1", "@types/react@^18.0.3":
|
"@types/react@*", "@types/react@^16.9.19", "@types/react@^18.0.1", "@types/react@^18.0.3":
|
||||||
version "18.0.6"
|
version "18.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.6.tgz#30206c3830af6ce8639b91ace5868bc2d3d1d96c"
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.7.tgz#8437a226763adf854969954dfe582529a406cbad"
|
||||||
integrity sha512-bPqwzJRzKtfI0mVYr5R+1o9BOE8UEXefwc1LwcBtfnaAn6OoqMhLa/91VA8aeWfDPJt1kHvYKI8RHcQybZLHHA==
|
integrity sha512-CXSXHzTexlX9esf4ReIUJeaemKcmBEvYzxHDUk19c3BCcEGUvUjkeC3jkscPSfSaQ6SPDRNd/zMxi8oc/P1zxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/prop-types" "*"
|
"@types/prop-types" "*"
|
||||||
"@types/scheduler" "*"
|
"@types/scheduler" "*"
|
||||||
|
@ -4899,10 +4899,10 @@ ansi-to-html@^0.6.11:
|
||||||
dependencies:
|
dependencies:
|
||||||
entities "^2.0.0"
|
entities "^2.0.0"
|
||||||
|
|
||||||
antd@^4.19.3:
|
antd@^4.20.1:
|
||||||
version "4.20.0"
|
version "4.20.1"
|
||||||
resolved "https://registry.yarnpkg.com/antd/-/antd-4.20.0.tgz#5f5fa4fccb90dd3e091c8d6e9d503114d98d862f"
|
resolved "https://registry.yarnpkg.com/antd/-/antd-4.20.1.tgz#6cd5a406c7172d61a5d0693ea52ee908650cf674"
|
||||||
integrity sha512-Msowfvabsn/yJIo3qYU0vMqGb31OUylMeFRDilosBViG2AS8R2VB2IX53kbw4kFV3vr7fr2HXcuQkf/FMLU+Dg==
|
integrity sha512-asKxOV0a6AijqonbcXkO08/q+XvqS/HmGfaRIS6ZH1ALR3FS2q+kTW52rJZO9rfoOb/ldPhEBVSWiNrbiB+uCQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@ant-design/colors" "^6.0.0"
|
"@ant-design/colors" "^6.0.0"
|
||||||
"@ant-design/icons" "^4.7.0"
|
"@ant-design/icons" "^4.7.0"
|
||||||
|
@ -8472,10 +8472,10 @@ extglob@^2.0.4:
|
||||||
snapdragon "^0.8.1"
|
snapdragon "^0.8.1"
|
||||||
to-regex "^3.0.1"
|
to-regex "^3.0.1"
|
||||||
|
|
||||||
fast-check@2.24.0:
|
fast-check@2.25.0:
|
||||||
version "2.24.0"
|
version "2.25.0"
|
||||||
resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.24.0.tgz#39f85586862108a4de6394c5196ebcf8b76b6c8b"
|
resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-2.25.0.tgz#5146601851bf3be0953bd17eb2b7d547936c6561"
|
||||||
integrity sha512-iNXbN90lbabaCUfnW5jyXYPwMJLFYl09eJDkXA9ZoidFlBK63gNRvcKxv+8D1OJ1kIYjwBef4bO/K3qesUeWLQ==
|
integrity sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg==
|
||||||
dependencies:
|
dependencies:
|
||||||
pure-rand "^5.0.1"
|
pure-rand "^5.0.1"
|
||||||
|
|
||||||
|
@ -14235,10 +14235,10 @@ rc@^1.2.8:
|
||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
react-ace@10.0.0:
|
react-ace@10.1.0:
|
||||||
version "10.0.0"
|
version "10.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-10.0.0.tgz#1760e302604cff35ba40963db43eb027513b6572"
|
resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-10.1.0.tgz#d348eac2b16475231779070b6cd16768deed565f"
|
||||||
integrity sha512-AUoA2OsKOCv8fXLqcFM232dF/Z8w14bwPUZ9z5I2zjBfqfZOZLqxnhXN+qKL6VrQXs1DLUvalGOuM5TABAFOCA==
|
integrity sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==
|
||||||
dependencies:
|
dependencies:
|
||||||
ace-builds "^1.4.14"
|
ace-builds "^1.4.14"
|
||||||
diff-match-patch "^1.0.5"
|
diff-match-patch "^1.0.5"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user