Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make HMCState stores rng in AbstractMCMC interface. #314

Closed
yebai opened this issue Jan 16, 2023 · 5 comments · Fixed by #325
Closed

Make HMCState stores rng in AbstractMCMC interface. #314

yebai opened this issue Jan 16, 2023 · 5 comments · Fixed by #325

Comments

@yebai
Copy link
Member

yebai commented Jan 16, 2023

state = HMCState(0, t, h.metric, κ, adaptor)

We should add rng to the HMC state for continuing HMC sampling from a previous stopping point.

@yebai
Copy link
Member Author

yebai commented Jun 29, 2023

@JaimeRZP can we fix this along with the efforts in #325?

In general, we want to capture the entire sampling state after an AHMC.step call and pass it to the next step call, so it is resumable and fully reproducible.

@JaimeRZP
Copy link
Member

Done!

@torfjelde
Copy link
Member

torfjelde commented Jul 5, 2023

But rng is an argument to AbstractMCMC.step @yebai ; why do we want to also include it in the state? This is contrary to all other implementations of the AbstractMCMC-interface.

If you want it for reproducibility, then a) I'm a bit uncertain what scenario you have in mind, and b) you'd have to deepcopy the rng at every step.

@yebai
Copy link
Member Author

yebai commented Jul 14, 2023

My original thought is to use non-mutating rng, so we need to return the new rng state after each step call and pass it to the next step call. The current design assumes mutating the rng state shared by all step calls, which is not ideal.

See, e.g., https://juliarandom.github.io/RandomNumbers.jl/stable/man/random123/

EDIT: we can use counter-based rngs -- saving the state is equivalent to saving the counter value, which is cheap.

@torfjelde
Copy link
Member

I'm fully with you that keeping track of the rng is potentially an idea to explore, but my argument is that this is not the current way we're doing things in AbstractMCMC, and so we should not start doing this here.

If we decide to add rng to the state, then we should do this everywhere; not just in one of the packages.

Moreover, the rng is also passed to the callback and so the callback function is free to do whatever it wants with the rng, e.g. saving it. So even for resuing chains, I don't see why the rng needs to be added to the state itself; it's already available.

EDIT: we can use counter-based rngs -- saving the state is equivalent to saving the counter value, which is cheap.

Am fully aware this is an option, but then you're suggesting always forcing usage of Random123? This is clearly not ideal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants