-
Notifications
You must be signed in to change notification settings - Fork 35
Release 0.35: Remove Selectors, reimplementing .~
, dropping LogDensityProblemsAD, and a few other changes
#779
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
Merged
Merged
Changes from 15 commits
Commits
Show all changes
21 commits
Select commit
Hold shift + click to select a range
a34fb04
Init release 0.35
mhauru af65bb0
Merge remote-tracking branch 'origin/master' into release-0.35
mhauru f5c5fda
Merge remote-tracking branch 'origin/master' into release-0.35
penelopeysm 161edf8
Reverse order of prefixing & add changelog (#792)
penelopeysm 7140f3d
Format HISTORY.md
penelopeysm c5f2f7a
Remove selector stuff from VarInfo tests and link/invlink (#780)
mhauru 1366440
Remove samplers from VarInfo - indexing (#793)
mhauru 7a1051c
Merge branch 'master' into release-0.35
mhauru 7613dbb
Merge branch 'master' into release-0.35
penelopeysm 3521644
Merge branch 'master' into release-0.35
penelopeysm 29f3760
Merge remote-tracking branch 'origin/master' into release-0.35
penelopeysm 4b9665a
Remove samplers from VarInfo - Selectors and GIDs (#808)
mhauru f5e84f4
Remove dot_tilde pipeline (#804)
mhauru 90c7b26
Remove LogDensityProblemsAD; wrap adtype in LogDensityFunction (#806)
penelopeysm 4bc0d1f
Merge branch 'master' into release-0.35
penelopeysm a765af3
Export `LogDensityFunction` (#820)
penelopeysm 1dec7a1
Export `predict` with 0.35 (#821)
sunxd3 ebece4b
Add note about exports to HISTORY.md
penelopeysm d2f6a8d
Remove release-0.35 from list of tested CI branches
penelopeysm e6a42dd
Restore ForwardDiff compat bound, update test/Project bounds
mhauru 6fe46ee
Update HISTORY.md
mhauru File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,222 @@ | ||
# DynamicPPL Changelog | ||
|
||
## 0.35.0 | ||
|
||
**Breaking changes** | ||
|
||
### `.~` right hand side must be a univariate distribution | ||
|
||
Previously we allowed statements like | ||
|
||
```julia | ||
x .~ [Normal(), Gamma()] | ||
``` | ||
|
||
where the right hand side of a `.~` was an array of distributions, and ones like | ||
|
||
```julia | ||
x .~ MvNormal(fill(0.0, 2), I) | ||
``` | ||
|
||
where the right hand side was a multivariate distribution. | ||
|
||
These are no longer allowed. The only things allowed on the right hand side of a `.~` statement are univariate distributions, such as | ||
|
||
```julia | ||
x = Array{Float64,3}(undef, 2, 3, 4) | ||
x .~ Normal() | ||
``` | ||
|
||
The reasons for this are internal code simplification and the fact that broadcasting where both sides are multidimensional but of different dimensions is typically confusing to read. | ||
|
||
If the right hand side and the left hand side have the same dimension, one can simply use `~`. Arrays of distributions can be replaced with `product_distribution`. So instead of | ||
|
||
```julia | ||
x .~ [Normal(), Gamma()] | ||
x .~ Normal.(y) | ||
x .~ MvNormal(fill(0.0, 2), I) | ||
``` | ||
|
||
do | ||
|
||
```julia | ||
x ~ product_distribution([Normal(), Gamma()]) | ||
x ~ product_distribution(Normal.(y)) | ||
x ~ MvNormal(fill(0.0, 2), I) | ||
``` | ||
|
||
This is often more performant as well. Note that using `~` rather than `.~` does change the internal storage format a bit: With `.~` `x[i]` are stored as separate variables, with `~` as a single multivariate variable `x`. In most cases this does not change anything for the user, but if it does cause issues, e.g. if you are dealing with `VarInfo` objects directly and need to keep the old behavior, you can always expand into a loop, such as | ||
|
||
```julia | ||
dists = Normal.(y) | ||
for i in 1:length(dists) | ||
x[i] ~ dists[i] | ||
end | ||
``` | ||
|
||
Cases where the right hand side is of a different dimension than the left hand side, and neither is a scalar, must be replaced with a loop. For example, | ||
|
||
```julia | ||
x = Array{Float64,3}(undef, 2, 3, 4) | ||
x .~ MvNormal(fill(0, 2), I) | ||
``` | ||
|
||
should be replaced with something like | ||
|
||
```julia | ||
x = Array{Float64,3}(2, 3, 4) | ||
for i in 1:3, j in 1:4 | ||
x[:, i, j] ~ MvNormal(fill(0, 2), I) | ||
end | ||
``` | ||
|
||
This release also completely rewrites the internal implementation of `.~`, where from now on all `.~` statements are turned into loops over `~` statements at macro time. However, the only breaking aspect of this change is the above change to what's allowed on the right hand side. | ||
|
||
### Remove indexing by samplers | ||
|
||
This release removes the feature of `VarInfo` where it kept track of which variable was associated with which sampler. This means removing all user-facing methods where `VarInfo`s where being indexed with samplers. In particular, | ||
|
||
- `link` and `invlink`, and their `!!` versions, no longer accept a sampler as an argument to specify which variables to (inv)link. The `link(varinfo, model)` methods remain in place, and as a new addition one can give a `Tuple` of `VarName`s to (inv)link only select variables, as in `link(varinfo, varname_tuple, model)`. | ||
- `set_retained_vns_del_by_spl!` has been replaced by `set_retained_vns_del!` which applies to all variables. | ||
- `getindex`, `setindex!`, and `setindex!!` no longer accept samplers as arguments | ||
- `unflatten` no longer accepts a sampler as an argument | ||
- `eltype(::VarInfo)` no longer accepts a sampler as an argument | ||
- `keys(::VarInfo)` no longer accepts a sampler as an argument | ||
- `VarInfo(::VarInfo, ::Sampler, ::AbstractVector)` no longer accepts the sampler argument. | ||
- `push!!` and `push!` no longer accept samplers or `Selector`s as arguments | ||
- `getgid`, `setgid!`, `updategid!`, `getspace`, and `inspace` no longer exist | ||
|
||
### Reverse prefixing order | ||
|
||
- For submodels constructed using `to_submodel`, the order in which nested prefixes are applied has been changed. | ||
Previously, the order was that outer prefixes were applied first, then inner ones. | ||
This version reverses that. | ||
To illustrate: | ||
|
||
```julia | ||
using DynamicPPL, Distributions | ||
|
||
@model function subsubmodel() | ||
return x ~ Normal() | ||
end | ||
|
||
@model function submodel() | ||
x ~ to_submodel(prefix(subsubmodel(), :c), false) | ||
return x | ||
end | ||
|
||
@model function parentmodel() | ||
x1 ~ to_submodel(prefix(submodel(), :a), false) | ||
return x2 ~ to_submodel(prefix(submodel(), :b), false) | ||
end | ||
|
||
keys(VarInfo(parentmodel())) | ||
``` | ||
|
||
Previously, the final line would return the variable names `c.a.x` and `c.b.x`. | ||
With this version, it will return `a.c.x` and `b.c.x`, which is more intuitive. | ||
(Note that this change brings `to_submodel`'s behaviour in line with the now-deprecated `@submodel` macro.) | ||
|
||
This change also affects sampling in Turing.jl. | ||
|
||
### `LogDensityFunction` argument order | ||
|
||
- The method `LogDensityFunction(varinfo, model, context)` has been removed. | ||
mhauru marked this conversation as resolved.
Show resolved
Hide resolved
|
||
The only accepted order is `LogDensityFunction(model, varinfo, context; adtype)`. | ||
(For an explanation of `adtype`, see below.) | ||
The varinfo and context arguments are both still optional. | ||
|
||
**Other changes** | ||
|
||
### `LogDensityProblems` interface | ||
|
||
LogDensityProblemsAD is now removed as a dependency. | ||
Instead of constructing a `LogDensityProblemAD.ADgradient` object, we now directly use `DifferentiationInterface` to calculate the gradient of the log density with respect to model parameters. | ||
|
||
Note that if you wish, you can still construct an `ADgradient` out of a `LogDensityFunction` object (there is nothing preventing this). | ||
|
||
However, in this version, `LogDensityFunction` now takes an extra AD type argument. | ||
If this argument is not provided, the behaviour is exactly the same as before, i.e. you can calculate `logdensity` but not its gradient. | ||
However, if you do pass an AD type, that will allow you to calculate the gradient as well. | ||
You may thus find that it is easier to instead do this: | ||
|
||
```julia | ||
@model f() = ... | ||
|
||
ldf = LogDensityFunction(f(); adtype=AutoForwardDiff()) | ||
``` | ||
|
||
This will return an object which satisfies the `LogDensityProblems` interface to first-order, i.e. you can now directly call both | ||
|
||
``` | ||
LogDensityProblems.logdensity(ldf, params) | ||
LogDensityProblems.logdensity_and_gradient(ldf, params) | ||
``` | ||
|
||
without having to construct a separate `ADgradient` object. | ||
|
||
If you prefer, you can also construct a new `LogDensityFunction` with a new AD type afterwards. | ||
The model, varinfo, and context will be taken from the original `LogDensityFunction`: | ||
|
||
```julia | ||
@model f() = ... | ||
|
||
ldf = LogDensityFunction(f()) # by default, no adtype set | ||
ldf_with_ad = LogDensityFunction(ldf, AutoForwardDiff()) | ||
``` | ||
|
||
## 0.34.2 | ||
|
||
- Fixed bugs in ValuesAsInModelContext as well as DebugContext where underlying PrefixContexts were not being applied. | ||
From a user-facing perspective, this means that for models which use manually prefixed submodels, e.g. | ||
|
||
```julia | ||
using DynamicPPL, Distributions | ||
|
||
@model inner() = x ~ Normal() | ||
|
||
@model function outer() | ||
x1 ~ to_submodel(prefix(inner(), :a), false) | ||
return x2 ~ to_submodel(prefix(inner(), :b), false) | ||
end | ||
``` | ||
|
||
will: (1) no longer error when sampling due to `check_model_and_trace`; and (2) contain both submodel's variables in the resulting chain (the behaviour before this patch was that the second `x` would override the first `x`). | ||
|
||
- More broadly, implemented a general `prefix(ctx::AbstractContext, ::VarName)` which traverses the context tree in `ctx` to apply all necessary prefixes. This was a necessary step in fixing the above issues, but it also means that `prefix` is now capable of handling context trees with e.g. multiple prefixes at different levels of nesting. | ||
|
||
## 0.34.1 | ||
|
||
- Fix an issue that prevented merging two VarInfos if they had different dimensions for a variable. | ||
|
||
- Upper bound the compat version of KernelAbstractions to work around an issue in determining the right VarInfo type to use. | ||
|
||
## 0.34.0 | ||
|
||
**Breaking** | ||
|
||
- `rng` argument removed from `values_as_in_model`, and `varinfo` made non-optional. This means that the only signatures allowed are | ||
|
||
``` | ||
values_as_in_model(::Model, ::Bool, ::AbstractVarInfo) | ||
values_as_in_model(::Model, ::Bool, ::AbstractVarInfo, ::AbstractContext) | ||
``` | ||
|
||
If you aren't using this function (it's probably only used in Turing.jl) then this won't affect you. | ||
|
||
## 0.33.1 | ||
|
||
Reworked internals of `condition` and `decondition`. | ||
There are no changes to the public-facing API, but internally you can no longer use `condition` and `decondition` on an `AbstractContext`, you can only use it on a `DynamicPPL.Model`. If you want to modify a context, use `ConditionContext` and `decondition_context`. | ||
|
||
## 0.33.0 | ||
|
||
**Breaking** | ||
|
||
- `values_as_in_model()` now requires an extra boolean parameter, specifying whether variables on the lhs of `:=` statements are to be included in the resulting `OrderedDict` of values. | ||
The type signature is now `values_as_in_model([rng,] model, include_colon_eq::Bool [, varinfo, context])` | ||
|
||
**Other** | ||
|
||
- Moved the implementation of `predict` from Turing.jl to DynamicPPL.jl; the user-facing behaviour is otherwise the same | ||
- Improved error message when a user tries to initialise a model with parameters that don't correspond strictly to the underlying VarInfo used |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -54,7 +54,7 @@ logjoint | |
|
||
### LogDensityProblems.jl interface | ||
|
||
The [LogDensityProblems.jl](https://github.com/tpapp/LogDensityProblems.jl) interface is also supported by simply wrapping a [`Model`](@ref) in a `DynamicPPL.LogDensityFunction`: | ||
The [LogDensityProblems.jl](https://github.com/tpapp/LogDensityProblems.jl) interface is also supported by wrapping a [`Model`](@ref) in a `DynamicPPL.LogDensityFunction`. | ||
|
||
```@docs | ||
DynamicPPL.LogDensityFunction | ||
|
@@ -289,13 +289,6 @@ unset_flag! | |
is_flagged | ||
``` | ||
|
||
For Gibbs sampling the following functions were added. | ||
|
||
```@docs | ||
setgid! | ||
updategid! | ||
``` | ||
|
||
The following functions were used for sequential Monte Carlo methods. | ||
|
||
```@docs | ||
|
@@ -304,7 +297,7 @@ set_num_produce! | |
increment_num_produce! | ||
reset_num_produce! | ||
setorder! | ||
set_retained_vns_del_by_spl! | ||
set_retained_vns_del! | ||
``` | ||
|
||
```@docs | ||
|
@@ -447,10 +440,8 @@ DynamicPPL.Experimental.is_suitable_varinfo | |
|
||
```@docs | ||
tilde_assume | ||
dot_tilde_assume | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's good to see these gone! |
||
``` | ||
|
||
```@docs | ||
tilde_observe | ||
dot_tilde_observe | ||
``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.