@@ -128,3 +128,137 @@ end
128128 end
129129 end
130130end
131+
132+
133+
134+ @testset " Planar flow" begin
135+ Random. seed! (123 )
136+
137+ dim = 5
138+ nlayers = 10
139+ for T in [Float32, Float64]
140+ # Create a nsf
141+ q₀ = MvNormal (zeros (T, dim), I)
142+ @leaf MvNormal
143+
144+ flow = NormalizingFlows. planarflow (q₀, nlayers; paramtype= T)
145+
146+ @testset " Sampling and density estimation for type: $T " begin
147+ ys = rand (flow, 100 )
148+ ℓs = logpdf (flow, ys)
149+
150+ @test size (ys) == (dim, 100 )
151+ @test length (ℓs) == 100
152+
153+ @test eltype (ys) == T
154+ @test eltype (ℓs) == T
155+ end
156+
157+
158+ @testset " Inverse compatibility for type: $T " begin
159+ x = rand (q₀)
160+ y, lj_fwd = Bijectors. with_logabsdet_jacobian (flow. transform, x)
161+ x_reconstructed, lj_bwd = Bijectors. with_logabsdet_jacobian (inverse (flow. transform), y)
162+
163+ @test x ≈ x_reconstructed rtol= 1e-4
164+ @test lj_fwd ≈ - lj_bwd rtol= 1e-4
165+
166+ x_batch = rand (q₀, 10 )
167+ y_batch, ljs_fwd = Bijectors. with_logabsdet_jacobian (flow. transform, x_batch)
168+ x_batch_reconstructed, ljs_bwd = Bijectors. with_logabsdet_jacobian (inverse (flow. transform), y_batch)
169+
170+ @test x_batch ≈ x_batch_reconstructed rtol= 1e-4
171+ @test ljs_fwd ≈ - ljs_bwd rtol= 1e-4
172+ end
173+
174+
175+ @testset " ELBO test for type: $T " begin
176+ μ = randn (T, dim)
177+ Σ = Diagonal (rand (T, dim) .+ T (1e-3 ))
178+ target = MvNormal (μ, Σ)
179+ logp (z) = logpdf (target, z)
180+
181+ # Compute ELBO
182+ batchsize = 64
183+ elbo_value = elbo (Random. default_rng (), flow, logp, batchsize)
184+ elbo_batch_value = elbo_batch (Random. default_rng (), flow, logp, batchsize)
185+
186+ # test when batchsize == 1
187+ batchsize_single = 1
188+ elbo_value_single = elbo (Random. default_rng (), flow, logp, batchsize_single)
189+
190+ # test elbo_value is not NaN and not Inf
191+ @test isfinite (elbo_value)
192+ @test isfinite (elbo_batch_value)
193+ @test isfinite (elbo_value_single)
194+ end
195+ end
196+ end
197+
198+
199+
200+ @testset " Radial flow" begin
201+ Random. seed! (123 )
202+
203+ dim = 5
204+ nlayers = 10
205+ for T in [Float32, Float64]
206+ # Create a nsf
207+ q₀ = MvNormal (zeros (T, dim), I)
208+ @leaf MvNormal
209+
210+ flow = NormalizingFlows. radialflow (q₀, nlayers; paramtype= T)
211+
212+ @testset " Sampling and density estimation for type: $T " begin
213+ ys = rand (flow, 100 )
214+ ℓs = logpdf (flow, ys)
215+
216+ @test size (ys) == (dim, 100 )
217+ @test length (ℓs) == 100
218+
219+ @test eltype (ys) == T
220+ @test eltype (ℓs) == T
221+ end
222+
223+
224+ @testset " Inverse compatibility for type: $T " begin
225+ x = rand (q₀)
226+ y, lj_fwd = Bijectors. with_logabsdet_jacobian (flow. transform, x)
227+ x_reconstructed, lj_bwd = Bijectors. with_logabsdet_jacobian (inverse (flow. transform), y)
228+
229+ @test x ≈ x_reconstructed rtol= 1e-4
230+ @test lj_fwd ≈ - lj_bwd rtol= 1e-4
231+
232+ x_batch = rand (q₀, 10 )
233+ y_batch, ljs_fwd = Bijectors. with_logabsdet_jacobian (flow. transform, x_batch)
234+ x_batch_reconstructed, ljs_bwd = Bijectors. with_logabsdet_jacobian (inverse (flow. transform), y_batch)
235+
236+ @test x_batch ≈ x_batch_reconstructed rtol= 1e-4
237+ @test ljs_fwd ≈ - ljs_bwd rtol= 1e-4
238+ end
239+
240+
241+ @testset " ELBO test for type: $T " begin
242+ μ = randn (T, dim)
243+ Σ = Diagonal (rand (T, dim) .+ T (1e-3 ))
244+ target = MvNormal (μ, Σ)
245+ logp (z) = logpdf (target, z)
246+
247+ # Compute ELBO
248+ batchsize = 64
249+ elbo_value = elbo (Random. default_rng (), flow, logp, batchsize)
250+ elbo_batch_value = elbo_batch (Random. default_rng (), flow, logp, batchsize)
251+
252+ # test when batchsize == 1
253+ batchsize_single = 1
254+ elbo_value_single = elbo (Random. default_rng (), flow, logp, batchsize_single)
255+
256+ # test elbo_value is not NaN and not Inf
257+ @test isfinite (elbo_value)
258+ @test isfinite (elbo_batch_value)
259+ @test isfinite (elbo_value_single)
260+ end
261+ end
262+ end
263+
264+
0 commit comments