23
23
const LU_ROW_MAXIMUM = VERSION >= v " 1.7.0-DEV.1188" ? RowMaximum () : Val (true )
24
24
const LU_NO_PIVOT = VERSION >= v " 1.7.0-DEV.1188" ? NoPivot () : Val (false )
25
25
26
+ const CHOLESKY_NO_PIVOT = VERSION >= v " 1.8.0-rc1" ? NoPivot () : Val (false )
27
+
26
28
# well-conditioned random n×n matrix with elements of type `T` for testing `eigen`
27
29
function rand_eigen (T:: Type , n:: Int )
28
30
# uniform distribution over `(-1, 1)` / `(-1, 1)^2`
394
396
395
397
@testset " Diagonal" begin
396
398
@testset " Diagonal{<:Real}" begin
397
- test_rrule (cholesky, Diagonal ([0.3 , 0.2 , 0.5 , 0.6 , 0.9 ]), Val ( false ) )
399
+ test_rrule (cholesky, Diagonal ([0.3 , 0.2 , 0.5 , 0.6 , 0.9 ]), CHOLESKY_NO_PIVOT )
398
400
end
399
401
@testset " Diagonal{<:Complex}" begin
400
402
# finite differences in general will produce matrices with non-real
@@ -403,26 +405,26 @@ end
403
405
D = Diagonal ([0.3 + 0im , 0.2 , 0.5 , 0.6 , 0.9 ])
404
406
C = cholesky (D)
405
407
test_rrule (
406
- cholesky, D, Val ( false ) ;
408
+ cholesky, D, CHOLESKY_NO_PIVOT ;
407
409
output_tangent= Tangent {typeof(C)} (factors= complex (randn (5 , 5 ))),
408
410
fkwargs= (; check= false ),
409
411
)
410
412
end
411
413
@testset " check has correct default and passed to primal" begin
412
- @test_throws Exception rrule (cholesky, Diagonal (- rand (5 )), Val ( false ) )
413
- rrule (cholesky, Diagonal (- rand (5 )), Val ( false ) ; check= false )
414
+ @test_throws Exception rrule (cholesky, Diagonal (- rand (5 )), CHOLESKY_NO_PIVOT )
415
+ rrule (cholesky, Diagonal (- rand (5 )), CHOLESKY_NO_PIVOT ; check= false )
414
416
end
415
417
@testset " failed factorization" begin
416
418
A = Diagonal (vcat (rand (4 ), - rand (4 ), rand (4 )))
417
- test_rrule (cholesky, A, Val ( false ) ; fkwargs= (; check= false ))
419
+ test_rrule (cholesky, A, CHOLESKY_NO_PIVOT ; fkwargs= (; check= false ))
418
420
end
419
421
end
420
422
421
423
@testset " StridedMatrix" begin
422
424
@testset " Matrix{$T }" for T in (Float64, ComplexF64)
423
425
X = generate_well_conditioned_matrix (T, 10 )
424
426
V = generate_well_conditioned_matrix (T, 10 )
425
- F, dX_pullback = rrule (cholesky, X, Val ( false ) )
427
+ F, dX_pullback = rrule (cholesky, X, CHOLESKY_NO_PIVOT )
426
428
@testset " uplo=$p , cotangent eltype=$T " for p in [:U , :L ], S in unique ([T, complex (T)])
427
429
Y, dF_pullback = rrule (getproperty, F, p)
428
430
Ȳ = randn (S, size (Y))
@@ -447,22 +449,22 @@ end
447
449
@testset " check has correct default and passed to primal" begin
448
450
# this will almost certainly be a non-PD matrix
449
451
X = Matrix (Symmetric (randn (10 , 10 )))
450
- @test_throws Exception rrule (cholesky, X, Val ( false ) )
451
- rrule (cholesky, X, Val ( false ) ; check= false ) # just check it doesn't throw
452
+ @test_throws Exception rrule (cholesky, X, CHOLESKY_NO_PIVOT )
453
+ rrule (cholesky, X, CHOLESKY_NO_PIVOT ; check= false ) # just check it doesn't throw
452
454
end
453
455
end
454
456
455
457
# Ensure that cotangents of cholesky(::StridedMatrix) and
456
458
# (cholesky ∘ Symmetric)(::StridedMatrix) are equal.
457
459
@testset " Symmetric" begin
458
460
X = generate_well_conditioned_matrix (10 )
459
- F, dX_pullback = rrule (cholesky, X, Val ( false ) )
461
+ F, dX_pullback = rrule (cholesky, X, CHOLESKY_NO_PIVOT )
460
462
ΔU = randn (size (X))
461
463
ΔF = Tangent {typeof(F)} (; factors= ΔU)
462
464
463
465
@testset for uplo in (:L , :U )
464
466
X_symmetric, sym_back = rrule (Symmetric, X, uplo)
465
- C, chol_back_sym = rrule (cholesky, X_symmetric, Val ( false ) )
467
+ C, chol_back_sym = rrule (cholesky, X_symmetric, CHOLESKY_NO_PIVOT )
466
468
467
469
ΔC = Tangent {typeof(C)} (; factors= (uplo === :U ? ΔU : ΔU' ))
468
470
ΔX_symmetric = chol_back_sym (ΔC)[2 ]
@@ -479,13 +481,13 @@ end
479
481
@testset " Hermitian" begin
480
482
@testset " Hermitian{$T }" for T in (Float64, ComplexF64)
481
483
X = generate_well_conditioned_matrix (T, 10 )
482
- F, dX_pullback = rrule (cholesky, X, Val ( false ) )
484
+ F, dX_pullback = rrule (cholesky, X, CHOLESKY_NO_PIVOT )
483
485
ΔU = randn (T, size (X))
484
486
ΔF = Tangent {typeof(F)} (; factors= ΔU)
485
487
486
488
@testset for uplo in (:L , :U )
487
489
X_hermitian, herm_back = rrule (Hermitian, X, uplo)
488
- C, chol_back_herm = rrule (cholesky, X_hermitian, Val ( false ) )
490
+ C, chol_back_herm = rrule (cholesky, X_hermitian, CHOLESKY_NO_PIVOT )
489
491
490
492
ΔC = Tangent {typeof(C)} (; factors= (uplo === :U ? ΔU : ΔU' ))
491
493
ΔX_hermitian = chol_back_herm (ΔC)[2 ]
499
501
@testset " check has correct default and passed to primal" begin
500
502
# this will almost certainly be a non-PD matrix
501
503
X = Hermitian (randn (10 , 10 ))
502
- @test_throws Exception rrule (cholesky, X, Val ( false ) )
503
- rrule (cholesky, X, Val ( false ) ; check= false )
504
+ @test_throws Exception rrule (cholesky, X, CHOLESKY_NO_PIVOT )
505
+ rrule (cholesky, X, CHOLESKY_NO_PIVOT ; check= false )
504
506
end
505
507
end
506
508
0 commit comments