|
2 | 2 |
|
3 | 3 | ## 0.38.0
|
4 | 4 |
|
5 |
| -The `varname_leaves` and `varname_and_value_leaves` functions have been moved to AbstractPPL.jl. |
6 |
| -Their behaviour is otherwise identical. |
| 5 | +**Breaking changes** |
| 6 | + |
| 7 | +### Introduction of `InitContext` |
| 8 | + |
| 9 | +DynamicPPL 0.38 introduces a new evaluation context, `InitContext`. |
| 10 | +It is used to generate fresh values for random variables in a model. |
| 11 | + |
| 12 | +Evaluation contexts are stored inside a `DynamicPPL.Model` object, and control what happens with tilde-statements when a model is run. |
| 13 | +The two major leaf (basic) contexts are `DefaultContext` and, now, `InitContext`. |
| 14 | +`DefaultContext` is the default context, and it simply uses the values that are already stored in the `VarInfo` object passed to the model evaluation function. |
| 15 | +On the other hand, `InitContext` ignores values in the VarInfo object and inserts new values obtained from a specified source. |
| 16 | +(It follows also that the VarInfo being used may be empty, which means that `InitContext` is now also the way to obtain a fresh VarInfo for a model.) |
| 17 | + |
| 18 | +DynamicPPL 0.38 provides three flavours of _initialisation strategies_, which are specified as the second argument to `InitContext`: |
| 19 | + |
| 20 | + - `InitContext(rng, InitFromPrior())`: New values are sampled from the prior distribution (on the right-hand side of the tilde). |
| 21 | + - `InitContext(rng, InitFromUniform(a, b))`: New values are sampled uniformly from the interval `[a, b]`, and then invlinked to the support of the distribution on the right-hand side of the tilde. |
| 22 | + - `InitContext(rng, InitFromParams(p, fallback))`: New values are obtained by indexing into the `p` object, which can be a `NamedTuple` or `Dict{<:VarName}`. If a variable is not found in `p`, then the `fallback` strategy is used, which is simply another of these strategies. In particular, `InitFromParams` enables the case where different variables are to be initialised from different sources. |
| 23 | + |
| 24 | +(It is possible to define your own initialisation strategy; users who wish to do so are referred to the DynamicPPL API documentation and source code.) |
| 25 | + |
| 26 | +**The main impact on the upcoming Turing.jl release** is that, instead of providing initial values for sampling, the user will be expected to provide an initialisation strategy instead. |
| 27 | +This is a more flexible approach, and not only solves a number of pre-existing issues with initialisation of Turing models, but also improves the clarity of user code. |
| 28 | +In particular: |
| 29 | + |
| 30 | + - When providing a set of fixed parameters (i.e. `InitFromParams(p)`), `p` must now either be a NamedTuple or a Dict. Previously Vectors were allowed, which is error-prone because the ordering of variables in a VarInfo is not obvious. |
| 31 | + - The parameters in `p` must now always be provided in unlinked space (i.e., in the space of the distribution on the right-hand side of the tilde). Previously, whether a parameter was expected to be in linked or unlinked space depended on whether the VarInfo was linked or not, which was confusing. |
| 32 | + |
| 33 | +### Removal of `SamplingContext` |
| 34 | + |
| 35 | +For developers working on DynamicPPL, `InitContext` now completely replaces what used to be `SamplingContext`, `SampleFromPrior`, and `SampleFromUniform`. |
| 36 | +Evaluating a model with `SamplingContext(SampleFromPrior())` (e.g. with `DynamicPPL.evaluate_and_sample!!(model, VarInfo(), SampleFromPrior())` has a direct one-to-one replacement in `DynamicPPL.init!!(model, VarInfo(), InitFromPrior())`. |
| 37 | +Please see the docstring of `init!!` for more details. |
| 38 | +Likewise `SampleFromUniform()` can be replaced with `InitFromUniform()`. |
| 39 | +`InitFromParams()` provides new functionality which was previously implemented in the roundabout way of manipulating the VarInfo (e.g. using `unflatten`, or even more hackily by directly modifying values in the VarInfo), and then evaluating using `DefaultContext`. |
| 40 | + |
| 41 | +The main change that this is likely to create is for those who are implementing samplers or inference algorithms. |
| 42 | +The exact way in which this happens will be detailed in the Turing.jl changelog when a new release is made. |
| 43 | +Broadly speaking, though, `SamplingContext(MySampler())` will be removed so if your sampler needs custom behaviour with the tilde-pipeline you will likely have to define your own context. |
| 44 | + |
| 45 | +### Simplification of the tilde-pipeline |
| 46 | + |
| 47 | +There are now only two functions in the tilde-pipeline that need to be overloaded to change the behaviour of tilde-statements, namely, `tilde_assume!!` and `tilde_observe!!`. |
| 48 | +Other functions such as `tilde_assume` and `assume` (and their `observe` counterparts) have been removed. |
| 49 | + |
| 50 | +Note that this was effectively already the case in DynamicPPL 0.37 (where they were just wrappers around each other). |
| 51 | +The separation of these functions was primarily implemented to avoid performing extra work where unneeded (e.g. to not calculate the log-likelihood when `PriorContext` was being used). This functionality has since been replaced with accumulators (see the 0.37 changelog for more details). |
| 52 | + |
| 53 | +**Other changes** |
| 54 | + |
| 55 | +### Reimplementation of functions using `InitContext` |
| 56 | + |
| 57 | +A number of functions have been reimplemented and unified with the help of `InitContext`. |
| 58 | +In particular, this release brings substantial performance improvements for `returned` and `predict`. |
| 59 | +Their APIs are the same. |
| 60 | + |
| 61 | +### Upstreaming of VarName functionality |
| 62 | + |
| 63 | +The implementation of the `varname_leaves` and `varname_and_value_leaves` functions have been moved to AbstractPPL.jl. |
| 64 | +Their behaviour is otherwise identical, and they are still accessible from the DynamicPPL module (though still not exported). |
7 | 65 |
|
8 | 66 | ## 0.37.3
|
9 | 67 |
|
|
0 commit comments