@@ -17,6 +17,8 @@ For `(y, ladj) = with_logabsdet_jacobian(f, x)`, the following must hold true:
1717# Examples
1818
1919```jldoctest a
20+ using ChangesOfVariables
21+
2022foo(x) = inv(exp(-x) + 1)
2123
2224function ChangesOfVariables.with_logabsdet_jacobian(::typeof(foo), x)
2830x = 4.2
2931y, ladj_y = with_logabsdet_jacobian(foo, x)
3032
33+ using LinearAlgebra, ForwardDiff
34+ y == foo(x) && ladj_y ≈ log(abs(ForwardDiff.derivative(foo, x)))
35+
3136# output
3237
33- (0.9852259683067269, -4.229768509343836)
38+ true
3439```
3540
3641```jldoctest a
37- X = [3, 7, 5]
42+ X = rand(10)
3843broadcasted_foo = Base.Fix1(broadcast, foo)
3944Y, ladj_Y = with_logabsdet_jacobian(broadcasted_foo, X)
45+ Y == broadcasted_foo(X) && ladj_Y ≈ logabsdet(ForwardDiff.jacobian(broadcasted_foo, X))[1]
4046
4147# output
4248
43- ([0.9525741268224334, 0.9990889488055994, 0.9933071490757153], -15.112428333033268)
49+ true
4450```
4551
4652```jldoctest a
47- # Requires Julia >= v1.6:
48- z, ladj_z = with_logabsdet_jacobian(log ∘ foo, x)
49- z == log(foo(x)) && ladj_z == ladj_y + with_logabsdet_jacobian(log, y)[2]
53+ VERSION < v"1.6" || begin # Support for ∘ requires Julia >= v1.6
54+ z, ladj_z = with_logabsdet_jacobian(log ∘ foo, x)
55+ z == log(foo(x)) && ladj_z == ladj_y + with_logabsdet_jacobian(log, y)[2]
56+ end
5057
5158# output
5259
0 commit comments