@@ -34,79 +34,85 @@ using StableRNGs: StableRNG
34
34
using Test: @inferred , @test , @test_broken , @test_throws , @testset
35
35
36
36
@testset " Matrix functions (T=$elt )" for elt in (Float32, Float64, ComplexF64)
37
- rng = StableRNG (123 )
38
- a = BlockSparseMatrix {elt} (undef, [2 , 3 ], [2 , 3 ])
39
- a[Block (1 , 1 )] = randn (rng, elt, 2 , 2 )
40
- a[Block (2 , 2 )] = randn (rng, elt, 3 , 3 )
41
- MATRIX_FUNCTIONS = BlockSparseArrays. MATRIX_FUNCTIONS
42
- MATRIX_FUNCTIONS = [MATRIX_FUNCTIONS; [:inv , :pinv ]]
43
- # Only works when real, also isn't defined in Julia 1.10.
44
- MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, [:cbrt ])
45
- MATRIX_FUNCTIONS_LOW_ACCURACY = [:acoth ]
46
- for f in setdiff (MATRIX_FUNCTIONS, MATRIX_FUNCTIONS_LOW_ACCURACY)
47
- @eval begin
48
- fa = $ f ($ a)
49
- @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ (eps (real ($ elt)))
50
- @test fa isa BlockSparseMatrix
51
- @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
37
+ for matrixt in (Matrix, AbstractMatrix)
38
+ a = BlockSparseMatrix {elt,matrixt{elt}} (undef, [2 , 3 ], [2 , 3 ])
39
+ rng = StableRNG (123 )
40
+ a[Block (1 , 1 )] = randn (rng, elt, 2 , 2 )
41
+ a[Block (2 , 2 )] = randn (rng, elt, 3 , 3 )
42
+ MATRIX_FUNCTIONS = BlockSparseArrays. MATRIX_FUNCTIONS
43
+ MATRIX_FUNCTIONS = [MATRIX_FUNCTIONS; [:inv , :pinv ]]
44
+ # Only works when real, also isn't defined in Julia 1.10.
45
+ MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, [:cbrt ])
46
+ MATRIX_FUNCTIONS_LOW_ACCURACY = [:acoth ]
47
+ for f in setdiff (MATRIX_FUNCTIONS, MATRIX_FUNCTIONS_LOW_ACCURACY)
48
+ @eval begin
49
+ fa = $ f ($ a)
50
+ @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ (eps (real ($ elt)))
51
+ @test fa isa BlockSparseMatrix
52
+ @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
53
+ end
52
54
end
53
- end
54
- for f in MATRIX_FUNCTIONS_LOW_ACCURACY
55
- @eval begin
56
- fa = $ f ($ a)
57
- if ! Sys. isapple () && ($ elt <: Real )
58
- # `acoth` appears to be broken on this matrix on Windows and Ubuntu
59
- # for real matrices.
60
- @test_broken Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ eps (real ($ elt))
61
- else
62
- @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ eps (real ($ elt))
55
+ for f in MATRIX_FUNCTIONS_LOW_ACCURACY
56
+ @eval begin
57
+ fa = $ f ($ a)
58
+ if ! Sys. isapple () && ($ elt <: Real )
59
+ # `acoth` appears to be broken on this matrix on Windows and Ubuntu
60
+ # for real matrices.
61
+ @test_broken Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ eps (real ($ elt))
62
+ else
63
+ @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ eps (real ($ elt))
64
+ end
65
+ @test fa isa BlockSparseMatrix
66
+ @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
63
67
end
64
- @test fa isa BlockSparseMatrix
65
- @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
66
68
end
67
69
end
68
70
69
71
# Catch case of off-diagonal blocks.
70
- rng = StableRNG (123 )
71
- a = BlockSparseMatrix {elt} (undef, [2 , 3 ], [2 , 3 ])
72
- a[Block (1 , 1 )] = randn (rng, elt, 2 , 2 )
73
- a[Block (1 , 2 )] = randn (rng, elt, 2 , 3 )
74
- for f in MATRIX_FUNCTIONS
75
- @eval begin
76
- @test_throws ArgumentError $ f ($ a)
72
+ for matrixt in (Matrix, AbstractMatrix)
73
+ a = BlockSparseMatrix {elt,matrixt{elt}} (undef, [2 , 3 ], [2 , 3 ])
74
+ rng = StableRNG (123 )
75
+ a[Block (1 , 1 )] = randn (rng, elt, 2 , 2 )
76
+ a[Block (1 , 2 )] = randn (rng, elt, 2 , 3 )
77
+ for f in BlockSparseArrays. MATRIX_FUNCTIONS
78
+ @eval begin
79
+ @test_throws ArgumentError $ f ($ a)
80
+ end
77
81
end
78
82
end
79
83
80
84
# Missing diagonal blocks.
81
- rng = StableRNG (123 )
82
- a = BlockSparseMatrix {elt} (undef, [2 , 3 ], [2 , 3 ])
83
- a[Block (2 , 2 )] = randn (rng, elt, 3 , 3 )
84
- MATRIX_FUNCTIONS = BlockSparseArrays. MATRIX_FUNCTIONS
85
- # These functions involve inverses so they break when there are zeros on the diagonal.
86
- MATRIX_FUNCTIONS_SINGULAR = [
87
- :log , :acsc , :asec , :acot , :acsch , :asech , :acoth , :csc , :cot , :csch , :coth
88
- ]
89
- MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, MATRIX_FUNCTIONS_SINGULAR)
90
- # Dense version is broken for some reason, investigate.
91
- MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, [:cbrt ])
92
- for f in MATRIX_FUNCTIONS
93
- @eval begin
94
- fa = $ f ($ a)
95
- @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ (eps (real ($ elt)))
96
- @test fa isa BlockSparseMatrix
97
- @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
85
+ for matrixt in (Matrix, AbstractMatrix)
86
+ a = BlockSparseMatrix {elt,matrixt{elt}} (undef, [2 , 3 ], [2 , 3 ])
87
+ rng = StableRNG (123 )
88
+ a[Block (2 , 2 )] = randn (rng, elt, 3 , 3 )
89
+ MATRIX_FUNCTIONS = BlockSparseArrays. MATRIX_FUNCTIONS
90
+ # These functions involve inverses so they break when there are zeros on the diagonal.
91
+ MATRIX_FUNCTIONS_SINGULAR = [
92
+ :log , :acsc , :asec , :acot , :acsch , :asech , :acoth , :csc , :cot , :csch , :coth
93
+ ]
94
+ MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, MATRIX_FUNCTIONS_SINGULAR)
95
+ # Dense version is broken for some reason, investigate.
96
+ MATRIX_FUNCTIONS = setdiff (MATRIX_FUNCTIONS, [:cbrt ])
97
+ for f in MATRIX_FUNCTIONS
98
+ @eval begin
99
+ fa = $ f ($ a)
100
+ @test Matrix (fa) ≈ $ f (Matrix ($ a)) rtol = √ (eps (real ($ elt)))
101
+ @test fa isa BlockSparseMatrix
102
+ @test issetequal (eachblockstoredindex (fa), [Block (1 , 1 ), Block (2 , 2 )])
103
+ end
98
104
end
99
- end
100
105
101
- SINGULAR_EXCEPTION = if VERSION < v " 1.11-"
102
- # A different exception is thrown in older versions of Julia.
103
- LinearAlgebra. LAPACKException
104
- else
105
- LinearAlgebra. SingularException
106
- end
107
- for f in setdiff (MATRIX_FUNCTIONS_SINGULAR, [:log ])
108
- @eval begin
109
- @test_throws $ SINGULAR_EXCEPTION $ f ($ a)
106
+ SINGULAR_EXCEPTION = if VERSION < v " 1.11-"
107
+ # A different exception is thrown in older versions of Julia.
108
+ LinearAlgebra. LAPACKException
109
+ else
110
+ LinearAlgebra. SingularException
111
+ end
112
+ for f in setdiff (MATRIX_FUNCTIONS_SINGULAR, [:log ])
113
+ @eval begin
114
+ @test_throws $ SINGULAR_EXCEPTION $ f ($ a)
115
+ end
110
116
end
111
117
end
112
118
end
0 commit comments