Skip to content

Commit a54c7fc

Browse files
committed
add projection for Bijectors with MvLocationScale
1 parent 48607c5 commit a54c7fc

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

ext/AdvancedVIBijectorsExt.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@ module AdvancedVIBijectorsExt
44
if isdefined(Base, :get_extension)
55
using AdvancedVI
66
using Bijectors
7+
using LinearAlgebra
8+
using Optimisers
79
using Random
810
else
911
using ..AdvancedVI
1012
using ..Bijectors
13+
using ..LinearAlgebra
14+
using ..Optimisers
1115
using ..Random
1216
end
1317

18+
function AdvancedVI.update_variational_params!(
19+
::Type{<:Bijectors.TransformedDistribution{<:AdvancedVI.MvLocationScale}},
20+
opt_st,
21+
params,
22+
restructure,
23+
grad
24+
)
25+
opt_st, params = Optimisers.update!(opt_st, params, grad)
26+
q = restructure(params)
27+
ϵ = q.dist.scale_eps
28+
29+
# Project the scale matrix to the set of positive definite triangular matrices
30+
diag_idx = diagind(q.dist.scale)
31+
@. q.dist.scale[diag_idx] = max(q.dist.scale[diag_idx], ϵ)
32+
33+
params, _ = Optimisers.destructure(q)
34+
35+
opt_st, params
36+
end
37+
1438
function AdvancedVI.reparam_with_entropy(
1539
rng ::Random.AbstractRNG,
1640
q ::Bijectors.TransformedDistribution,

0 commit comments

Comments
 (0)