Skip to content

Commit 77a8710

Browse files
committed
Add changelog
1 parent aaece0b commit 77a8710

File tree

1 file changed

+60
-2
lines changed

1 file changed

+60
-2
lines changed

HISTORY.md

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,66 @@
22

33
## 0.38.0
44

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 previously used to be 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).
765

866
## 0.37.3
967

0 commit comments

Comments
 (0)