@@ -17,6 +17,8 @@ For `(y, ladj) = with_logabsdet_jacobian(f, x)`, the following must hold true:
17
17
# Examples
18
18
19
19
```jldoctest a
20
+ using ChangesOfVariables
21
+
20
22
foo(x) = inv(exp(-x) + 1)
21
23
22
24
function ChangesOfVariables.with_logabsdet_jacobian(::typeof(foo), x)
28
30
x = 4.2
29
31
y, ladj_y = with_logabsdet_jacobian(foo, x)
30
32
33
+ using LinearAlgebra, ForwardDiff
34
+ y == foo(x) && ladj_y ≈ log(abs(ForwardDiff.derivative(foo, x)))
35
+
31
36
# output
32
37
33
- (0.9852259683067269, -4.229768509343836)
38
+ true
34
39
```
35
40
36
41
```jldoctest a
37
- X = [3, 7, 5]
42
+ X = rand(10)
38
43
broadcasted_foo = Base.Fix1(broadcast, foo)
39
44
Y, ladj_Y = with_logabsdet_jacobian(broadcasted_foo, X)
45
+ Y == broadcasted_foo(X) && ladj_Y ≈ logabsdet(ForwardDiff.jacobian(broadcasted_foo, X))[1]
40
46
41
47
# output
42
48
43
- ([0.9525741268224334, 0.9990889488055994, 0.9933071490757153], -15.112428333033268)
49
+ true
44
50
```
45
51
46
52
```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
50
57
51
58
# output
52
59
0 commit comments