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

Update to tilde overloads in mh.jl #2360

Merged
merged 1 commit into from
Oct 7, 2024
Merged

Update to tilde overloads in mh.jl #2360

merged 1 commit into from
Oct 7, 2024

Conversation

torfjelde
Copy link
Member

@penelopeysm I was looking at your PR #2341 and found some bad bugs in the existing codebase for the MH, so I figured we should just get these fixed too.

Copy link

codecov bot commented Oct 4, 2024

Codecov Report

Attention: Patch coverage is 33.33333% with 6 lines in your changes missing coverage. Please review.

Project coverage is 84.36%. Comparing base (452d0d0) to head (679989a).
Report is 1 commits behind head on ch.

Files with missing lines Patch % Lines
src/mcmc/mh.jl 33.33% 6 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##               ch    #2360      +/-   ##
==========================================
+ Coverage   83.86%   84.36%   +0.50%     
==========================================
  Files          24       24              
  Lines        1580     1573       -7     
==========================================
+ Hits         1325     1327       +2     
+ Misses        255      246       -9     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@penelopeysm
Copy link
Member

penelopeysm commented Oct 4, 2024

It occurs to me that the value generated by DynamicPPL.assume(..., SampleFromPrior(), ...) is only used if a proposal isn't specified – if we have one then is this doing extra computation?

I don't know if there's an easy fix for this at all though.

@torfjelde
Copy link
Member Author

It occurs to me that the value generated by DynamicPPL.assume(..., SampleFromPrior(), ...) is only used if a proposal isn't specified – if we have one then is this doing extra computation?

SampleFromPrior just extracts the value from vi if it's "not to be sampled", so it shouldn't be doing anything extra here AFAIK. Can you maybe specify a bit what you mean here?

@penelopeysm
Copy link
Member

penelopeysm commented Oct 4, 2024

Oh, I see, I'm just confused. The values are stored in varinfo from the previous iteration when calculating the lp and so it just extracts those values. I had assumed it would call rand() on the prior, but now I observe that that's not the case ;)

edit; oh, I see it's this function that's doing it.

Turing.jl/src/mcmc/mh.jl

Lines 267 to 282 in 40a0d84

function LogDensityProblems.logdensity(f::MHLogDensityFunction, x::NamedTuple)
# TODO: Make this work with immutable `f.varinfo` too.
sampler = DynamicPPL.getsampler(f)
vi = f.varinfo
x_old, lj_old = vi[sampler], getlogp(vi)
set_namedtuple!(vi, x)
vi_new = last(DynamicPPL.evaluate!!(f.model, vi, DynamicPPL.getcontext(f)))
lj = getlogp(vi_new)
# Reset old `vi`.
setindex!!(vi, x_old, sampler)
setlogp!!(vi, lj_old)
return lj
end

@penelopeysm
Copy link
Member

Sorry, not trying to be annoying and get a final word in, but having spent a good amount of time figuring out the interplay between Turing and AdvancedMH I feel like this behaviour is a bit unexpected (and I actually now understand why it happens 😂):

@model function gdemo(x, y)
    s² ~ InverseGamma(2, 3)
    m ~ Normal(0, sqrt(s²))
    x ~ Normal(m, sqrt(s²))
    y ~ Normal(m, sqrt(s²))
end
chain = sample(
    gdemo(1.5, 2.0),
    MH(:m => AdvancedMH.RandomWalkProposal(Normal(0, 0.25))),
    10
)

Here is sampled once at the start of the chain and it's never touched again. I feel like people (perhaps just me 😄) would expect that it either defaults to a static proposal (the prior) or that it errors. If you agree I can open a separate issue :) this is obviously not part of this PR

@torfjelde
Copy link
Member Author

Very much agree with you that this is very confusing 😕 IMO we should be erroring if we some variables don't have a Gibbs sampler assigned to them

@mhauru
Copy link
Member

mhauru commented Oct 7, 2024

Maybe worth checking if there is a similar issue with the new Gibbs sampler? If not, #2328 might fix this by accident. EDIT: Never mind, I hadn't understood the problem, #2328 does not change this.

@penelopeysm penelopeysm merged commit b0bb31e into ch Oct 7, 2024
44 of 59 checks passed
@penelopeysm penelopeysm deleted the torfjelde/ch branch October 7, 2024 10:10
yebai pushed a commit that referenced this pull request Oct 23, 2024
* CompatHelper: bump compat for DynamicPPL to 0.29, (keep existing compat) (#2339)

Co-authored-by: CompatHelper Julia <[email protected]>

* CompatHelper: bump compat for DynamicPPL to 0.29 for package test, (keep existing compat) (#2340)

Co-authored-by: CompatHelper Julia <[email protected]>

* Replace vectorize(d, r) -> DynamicPPL.tovec(r)

vectorize was removed in DynamicPPL 0.29.0

* Require Julia >= 1.9

* Add Julia 1.9 tests back

* Fix essential/ad tests

* Fix reconstruct calls in MH

* Update src/mcmc/mh.jl

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Require Julia 1.10

* Change 1 -> I in MvNormal()

setting a real number as σ is deprecated

* Simplify tests as we no longer support Julia <1.8

* Simplify `set_namedtuple!`

* Remove conditional loading/exporting of Tapir

* Tapir -> Mooncake

* Update src/essential/Essential.jl

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Remove Requires from Project.toml

* Bump minor version instead

* Restrict ADTypes to 1.9.0 for AutoMooncake()

* Re-enable Mooncake tests in mcmc/abstractmcmc

* Update the currently buggy and incorrect tilde overloads in `mh.jl` (#2360)

* More autoformatting (#2359)

* Bring more files into autoformatting fold

* Run JuliaFormatter

* Remove trailing whitespace

* Update comment in .JuliaFormatter.toml

* Fix bad merge

* Restrict Mooncake to >= 0.4.9

* Add MH test for LKJCholesky

* Remove Tracker

* Format imports

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Add AD imports to Optimisation test

* Bump Mooncake compat in tests

* Bump Libtask version

* Get Optimization tests to pass CI

* Update API docs

* Write a changelog entry

* Update docs/src/api.md

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: CompatHelper Julia <[email protected]>
Co-authored-by: Tor Erlend Fjelde <[email protected]>
Co-authored-by: Markus Hauru <[email protected]>
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 this pull request may close these issues.

3 participants