Avoid panics in Binomial BTPE sampler by using u64 values #43
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
CHANGELOG.mdentrySummary
This fixes a panic that can occur when the parameter
nfor theBinomialsampler is larger thani64::MAX.Motivation
This should resolve #21 .
Details
The key variable which previously used
i64inbinomial::btpewasy, the random coordinate in 0..=n on which the BTPE algorithm performed rejection sampling. Sincenis in0..u64::MAX,yshould also be inu64::MAX.This is a value-breaking change, because e.g. the code now does the float->int cast on the value
x_l + v.ln() / lambda_lafter checking whether the value is <= 0, instead of before. I don't think this sort of change in boundary rounding should cause any issues (and it may make the sampled distribution closer to the actual target.)I am looking into writing a test to confirm this is OK, but it may be a few weeks before it is ready.(Tested, the new version actually fixes a boundary issue, see test for it in #47.)