@@ -31,15 +31,16 @@ function test_triangular(elty1_types)
31
31
@test full! (copy (A1)) == A1
32
32
33
33
# similar
34
- @test isa (similar (A1), t1)
35
- @test eltype (similar (A1)) == elty1
36
- @test isa (similar (A1, Int), t1)
37
- @test eltype (similar (A1, Int)) == Int
34
+ simA1 = similar (A1)
35
+ @test isa (simA1, t1)
36
+ @test eltype (simA1) == elty1
37
+ simA1Int = similar (A1, Int)
38
+ @test isa (simA1Int, t1)
39
+ @test eltype (simA1Int) == Int
38
40
@test isa (similar (A1, (3 , 2 )), Matrix{elty1})
39
41
@test isa (similar (A1, Int, (3 , 2 )), Matrix{Int})
40
42
41
43
# copyto!
42
- simA1 = similar (A1)
43
44
copyto! (simA1, A1)
44
45
@test simA1 == A1
45
46
@@ -119,49 +120,60 @@ function test_triangular(elty1_types)
119
120
@test tril (A1, 0 ) == A1
120
121
@test tril (A1, - 1 ) == LowerTriangular (tril (M1, - 1 ))
121
122
@test tril (A1, 1 ) == t1 (tril (tril (M1, 1 )))
122
- @test tril (A1, - n - 2 ) == zeros (size (A1))
123
+ A1tril = tril (A1, - n - 2 )
124
+ @test iszero (A1tril) && size (A1tril) == size (A1)
123
125
@test tril (A1, n) == A1
124
- @test triu (A1, 0 ) == t1 (diagm ( 0 => diag (A1)))
126
+ @test triu (A1, 0 ) == t1 (Diagonal ( diagview (A1)))
125
127
@test triu (A1, - 1 ) == t1 (tril (triu (A1. data, - 1 )))
126
- @test triu (A1, 1 ) == zeros (size (A1)) # or just @test iszero(triu(A1,1))?
128
+ A1triu = triu (A1, 1 )
129
+ @test iszero (A1triu) && size (A1triu) == size (A1)
127
130
@test triu (A1, - n) == A1
128
- @test triu (A1, n + 2 ) == zeros (size (A1))
131
+ A1triu = triu (A1, n + 2 )
132
+ @test iszero (A1triu) && size (A1triu) == size (A1)
129
133
else
130
134
@test triu (A1, 0 ) == A1
131
135
@test triu (A1, 1 ) == UpperTriangular (triu (M1, 1 ))
132
136
@test triu (A1, - 1 ) == t1 (triu (triu (M1, - 1 )))
133
137
@test triu (A1, - n) == A1
134
- @test triu (A1, n + 2 ) == zeros (size (A1))
135
- @test tril (A1, 0 ) == t1 (diagm (0 => diag (A1)))
138
+ A1triu = triu (A1, n + 2 )
139
+ @test iszero (A1triu) && size (A1triu) == size (A1)
140
+ @test tril (A1, 0 ) == t1 (Diagonal (diagview (A1)))
136
141
@test tril (A1, 1 ) == t1 (triu (tril (A1. data, 1 )))
137
- @test tril (A1, - 1 ) == zeros (size (A1)) # or just @test iszero(tril(A1,-1))?
138
- @test tril (A1, - n - 2 ) == zeros (size (A1))
142
+ A1tril = tril (A1, - 1 )
143
+ @test iszero (A1tril) && size (A1tril) == size (A1)
144
+ @test iszero (A1tril) && size (A1tril) == size (A1)
139
145
@test tril (A1, n) == A1
140
146
end
141
147
142
148
# factorize
143
149
@test factorize (A1) == A1
144
150
145
151
# [c]transpose[!] (test views as well, see issue #14317)
152
+ # transpose
153
+ @test copy (transpose (A1)) == transpose (M1)
154
+ A1ctr = transpose! (copy (A1))
155
+ @test A1ctr == transpose (A1)
156
+ @test typeof (A1ctr). name == typeof (transpose (A1)). name
157
+ # adjoint
158
+ @test copy (A1' ) == M1'
159
+ A1cadj = adjoint! (copy (A1))
160
+ @test A1cadj == adjoint (A1)
161
+ @test typeof (A1cadj). name == typeof (adjoint (A1)). name
162
+
146
163
let vrange = 1 : n- 1 , viewA1 = t1 (view (A1. data, vrange, vrange))
164
+ MviewA1 = Matrix (viewA1)
147
165
# transpose
148
- @test copy (transpose (A1)) == transpose (M1)
149
- @test copy (transpose (viewA1)) == transpose (Matrix (viewA1))
166
+ @test copy (transpose (viewA1)) == transpose (MviewA1)
150
167
# adjoint
151
- @test copy (A1' ) == M1'
152
- @test copy (viewA1' ) == Matrix (viewA1)'
168
+ @test copy (viewA1' ) == MviewA1'
153
169
# transpose!
154
- @test transpose! (copy (A1)) == transpose (A1)
155
- @test typeof (transpose! (copy (A1))). name == typeof (transpose (A1)). name
156
170
@test transpose! (t1 (view (copy (A1). data, vrange, vrange))) == transpose (viewA1)
157
171
# adjoint!
158
- @test adjoint! (copy (A1)) == adjoint (A1)
159
- @test typeof (adjoint! (copy (A1))). name == typeof (adjoint (A1)). name
160
172
@test adjoint! (t1 (view (copy (A1). data, vrange, vrange))) == adjoint (viewA1)
161
173
end
162
174
163
175
# diag
164
- @test diag (A1) == diag (M1)
176
+ @test diag (A1) == diagview (M1)
165
177
166
178
# tr
167
179
@test tr (A1):: elty1 == tr (M1)
@@ -173,29 +185,32 @@ function test_triangular(elty1_types)
173
185
174
186
# zero
175
187
if A1 isa UpperTriangular || A1 isa LowerTriangular
176
- @test zero (A1) == zero (parent (A1))
188
+ Z = zero (A1)
189
+ @test iszero (Z) && size (Z) == size (A1)
177
190
end
178
191
179
192
# Unary operations
180
193
@test - A1 == - M1
181
194
182
195
# copy and copyto! (test views as well, see issue #14317)
196
+ @test copy (A1) == M1
197
+ A1trc = copy (transpose (A1))
198
+ B = similar (A1trc)
199
+ copyto! (B, A1trc)
200
+ @test B == A1trc
201
+ B = similar (A1)
202
+ copyto! (B, A1)
203
+ @test B == A1
183
204
let vrange = 1 : n- 1 , viewA1 = t1 (view (A1. data, vrange, vrange))
184
205
# copy
185
- @test copy (A1) == copy (M1)
186
- @test copy (viewA1) == copy (Matrix (viewA1))
206
+ @test copy (viewA1) == Matrix (viewA1)
187
207
# copyto!
188
- B = similar (A1)
189
- copyto! (B, A1)
190
- @test B == A1
191
- B = similar (copy (transpose (A1)))
192
- copyto! (B, copy (transpose (A1)))
193
- @test B == copy (transpose (A1))
194
208
B = similar (viewA1)
195
209
copyto! (B, viewA1)
196
210
@test B == viewA1
197
- B = similar (copy (transpose (viewA1)))
198
- copyto! (B, copy (transpose (viewA1)))
211
+ viewA1trc = copy (transpose (viewA1))
212
+ B = similar (viewA1trc)
213
+ copyto! (B, viewA1trc)
199
214
@test B == transpose (viewA1)
200
215
end
201
216
@@ -217,15 +232,12 @@ function test_triangular(elty1_types)
217
232
A1tmp = copy (A1)
218
233
rmul! (A1tmp, cr)
219
234
@test A1tmp == cr * A1
220
- A1tmp = copy (A1)
235
+ A1tmp . = A1
221
236
lmul! (cr, A1tmp)
222
237
@test A1tmp == cr * A1
223
- A1tmp = copy (A1)
224
238
A2tmp = unitt (A1)
225
239
mul! (A1tmp, A2tmp, cr)
226
240
@test A1tmp == cr * A2tmp
227
- A1tmp = copy (A1)
228
- A2tmp = unitt (A1)
229
241
mul! (A1tmp, cr, A2tmp)
230
242
@test A1tmp == cr * A2tmp
231
243
@@ -237,15 +249,12 @@ function test_triangular(elty1_types)
237
249
A1tmp = copy (A1)
238
250
rmul! (A1tmp, ci)
239
251
@test A1tmp == ci * A1
240
- A1tmp = copy (A1)
252
+ A1tmp . = A1
241
253
lmul! (ci, A1tmp)
242
254
@test A1tmp == ci * A1
243
- A1tmp = copy (A1)
244
255
A2tmp = unitt (A1)
245
256
mul! (A1tmp, ci, A2tmp)
246
257
@test A1tmp == ci * A2tmp
247
- A1tmp = copy (A1)
248
- A2tmp = unitt (A1)
249
258
mul! (A1tmp, A2tmp, ci)
250
259
@test A1tmp == A2tmp * ci
251
260
end
@@ -265,19 +274,22 @@ function test_triangular(elty1_types)
265
274
@test 0.5 \ A1 == 0.5 \ M1
266
275
267
276
# inversion
268
- @test inv (A1) ≈ inv (lu (M1))
269
- inv (M1) # issue #11298
270
- @test isa (inv (A1), t1)
277
+ invA1 = inv (A1)
278
+ M1lu = lu (M1)
279
+ @test invA1 ≈ inv (M1lu)
280
+ @test invA1 ≈ inv (M1) # issue #11298
281
+ @test isa (invA1, t1)
271
282
# make sure the call to LAPACK works right
272
283
if elty1 <: BlasFloat
273
- @test LinearAlgebra. inv! (copy (A1)) ≈ inv (lu (M1) )
284
+ @test LinearAlgebra. inv! (copy (A1)) ≈ inv (M1lu )
274
285
end
275
286
276
287
# Determinant
277
- @test det (A1) ≈ det (lu (M1)) atol = sqrt (eps (real (float (one (elty1))))) * n * n
278
- @test logdet (A1) ≈ logdet (lu (M1)) atol = sqrt (eps (real (float (one (elty1))))) * n * n
288
+ M1lu = lu (M1lu)
289
+ @test det (A1) ≈ det (M1lu) atol = sqrt (eps (real (float (one (elty1))))) * n * n
290
+ @test logdet (A1) ≈ logdet (M1lu) atol = sqrt (eps (real (float (one (elty1))))) * n * n
279
291
lada, ladb = logabsdet (A1)
280
- flada, fladb = logabsdet (lu (M1) )
292
+ flada, fladb = logabsdet (M1lu )
281
293
@test lada ≈ flada atol = sqrt (eps (real (float (one (elty1))))) * n * n
282
294
@test ladb ≈ fladb atol = sqrt (eps (real (float (one (elty1))))) * n * n
283
295
@@ -340,7 +352,10 @@ function test_triangular(elty1_types)
340
352
@test kron (A1, A2) == kron (M1, M2)
341
353
342
354
# Triangular-Triangular multiplication and division
343
- @test A1 * A2 ≈ M1 * M2
355
+ A1_mul_A2 = A1 * A2
356
+ A1_rdiv_A2 = A1 / A2
357
+ A1_ldiv_A2 = A1 \ A2
358
+ @test A1_mul_A2 ≈ M1 * M2
344
359
@test transpose (A1) * A2 ≈ transpose (M1) * M2
345
360
@test transpose (A1) * adjoint (A2) ≈ transpose (M1) * adjoint (M2)
346
361
@test adjoint (A1) * transpose (A2) ≈ adjoint (M1) * transpose (M2)
@@ -349,35 +364,35 @@ function test_triangular(elty1_types)
349
364
@test A1 * A2' ≈ M1 * M2'
350
365
@test transpose (A1) * transpose (A2) ≈ transpose (M1) * transpose (M2)
351
366
@test A1' A2' ≈ M1' M2'
352
- @test A1 / A2 ≈ M1 / M2
353
- @test A1 \ A2 ≈ M1 \ M2
367
+ @test A1_rdiv_A2 ≈ M1 / M2
368
+ @test A1_ldiv_A2 ≈ M1 \ M2
354
369
if uplo1 === :U && uplo2 === :U
355
370
if t1 === UnitUpperTriangular && t2 === UnitUpperTriangular
356
- @test A1 * A2 isa UnitUpperTriangular
357
- @test A1 / A2 isa UnitUpperTriangular
358
- elty1 == Int && elty2 == Int && @test eltype (A1 / A2 ) == Int
359
- @test A1 \ A2 isa UnitUpperTriangular
360
- elty1 == Int && elty2 == Int && @test eltype (A1 \ A2 ) == Int
371
+ @test A1_mul_A2 isa UnitUpperTriangular
372
+ @test A1_rdiv_A2 isa UnitUpperTriangular
373
+ elty1 == Int && elty2 == Int && @test eltype (A1_rdiv_A2 ) == Int
374
+ @test A1_ldiv_A2 isa UnitUpperTriangular
375
+ elty1 == Int && elty2 == Int && @test eltype (A1_ldiv_A2 ) == Int
361
376
else
362
- @test A1 * A2 isa UpperTriangular
363
- @test A1 / A2 isa UpperTriangular
364
- elty1 == Int && elty2 == Int && t2 === UnitUpperTriangular && @test eltype (A1 / A2 ) == Int
365
- @test A1 \ A2 isa UpperTriangular
366
- elty1 == Int && elty2 == Int && t1 === UnitUpperTriangular && @test eltype (A1 \ A2 ) == Int
377
+ @test A1_mul_A2 isa UpperTriangular
378
+ @test A1_rdiv_A2 isa UpperTriangular
379
+ elty1 == Int && elty2 == Int && t2 === UnitUpperTriangular && @test eltype (A1_rdiv_A2 ) == Int
380
+ @test A1_ldiv_A2 isa UpperTriangular
381
+ elty1 == Int && elty2 == Int && t1 === UnitUpperTriangular && @test eltype (A1_ldiv_A2 ) == Int
367
382
end
368
383
elseif uplo1 === :L && uplo2 === :L
369
384
if t1 === UnitLowerTriangular && t2 === UnitLowerTriangular
370
- @test A1 * A2 isa UnitLowerTriangular
371
- @test A1 / A2 isa UnitLowerTriangular
372
- elty1 == Int && elty2 == Int && @test eltype (A1 / A2 ) == Int
373
- @test A1 \ A2 isa UnitLowerTriangular
374
- elty1 == Int && elty2 == Int && @test eltype (A1 \ A2 ) == Int
385
+ @test A1_mul_A2 isa UnitLowerTriangular
386
+ @test A1_rdiv_A2 isa UnitLowerTriangular
387
+ elty1 == Int && elty2 == Int && @test eltype (A1_rdiv_A2 ) == Int
388
+ @test A1_ldiv_A2 isa UnitLowerTriangular
389
+ elty1 == Int && elty2 == Int && @test eltype (A1_ldiv_A2 ) == Int
375
390
else
376
- @test A1 * A2 isa LowerTriangular
377
- @test A1 / A2 isa LowerTriangular
378
- elty1 == Int && elty2 == Int && t2 === UnitLowerTriangular && @test eltype (A1 / A2 ) == Int
379
- @test A1 \ A2 isa LowerTriangular
380
- elty1 == Int && elty2 == Int && t1 === UnitLowerTriangular && @test eltype (A1 \ A2 ) == Int
391
+ @test A1_mul_A2 isa LowerTriangular
392
+ @test A1_rdiv_A2 isa LowerTriangular
393
+ elty1 == Int && elty2 == Int && t2 === UnitLowerTriangular && @test eltype (A1_rdiv_A2 ) == Int
394
+ @test A1_ldiv_A2 isa LowerTriangular
395
+ elty1 == Int && elty2 == Int && t1 === UnitLowerTriangular && @test eltype (A1_ldiv_A2 ) == Int
381
396
end
382
397
end
383
398
offsizeA = Matrix {Float64} (I, n + 1 , n + 1 )
@@ -426,46 +441,49 @@ function test_triangular(elty1_types)
426
441
mul! (C, A1, Tri)
427
442
@test C ≈ M1 * Tri
428
443
444
+ bcol1 = B[:, 1 ]
445
+
429
446
# Triangular-dense Matrix/vector multiplication
430
- @test A1 * B[:, 1 ] ≈ M1 * B[:, 1 ]
447
+ @test A1 * bcol1 ≈ M1 * bcol1
431
448
@test A1 * B ≈ M1 * B
432
- @test transpose (A1) * B[:, 1 ] ≈ transpose (M1) * B[:, 1 ]
433
- @test A1' B[:, 1 ] ≈ M1' B[:, 1 ]
449
+ @test transpose (A1) * bcol1 ≈ transpose (M1) * bcol1
450
+ @test A1' bcol1 ≈ M1' bcol1
434
451
@test transpose (A1) * B ≈ transpose (M1) * B
435
452
@test A1' B ≈ M1' B
436
453
@test A1 * transpose (B) ≈ M1 * transpose (B)
437
454
@test adjoint (A1) * transpose (B) ≈ M1' * transpose (B)
438
455
@test transpose (A1) * adjoint (B) ≈ transpose (M1) * adjoint (B)
439
456
@test A1 * B' ≈ M1 * B'
440
457
@test B * A1 ≈ B * M1
441
- @test transpose (B[:, 1 ] ) * A1 ≈ transpose (B[:, 1 ] ) * M1
442
- @test B[:, 1 ] ' A1 ≈ B[:, 1 ] ' M1
458
+ @test transpose (bcol1 ) * A1 ≈ transpose (bcol1 ) * M1
459
+ @test bcol1 ' A1 ≈ bcol1 ' M1
443
460
@test transpose (B) * A1 ≈ transpose (B) * M1
444
461
@test transpose (B) * adjoint (A1) ≈ transpose (B) * M1'
445
462
@test adjoint (B) * transpose (A1) ≈ adjoint (B) * transpose (M1)
446
463
@test B' A1 ≈ B' M1
447
464
@test B * transpose (A1) ≈ B * transpose (M1)
448
465
@test B * A1' ≈ B * M1'
449
- @test transpose (B[:, 1 ] ) * transpose (A1) ≈ transpose (B[:, 1 ] ) * transpose (M1)
450
- @test B[:, 1 ] ' A1' ≈ B[:, 1 ] ' M1'
466
+ @test transpose (bcol1 ) * transpose (A1) ≈ transpose (bcol1 ) * transpose (M1)
467
+ @test bcol1 ' A1' ≈ bcol1 ' M1'
451
468
@test transpose (B) * transpose (A1) ≈ transpose (B) * transpose (M1)
452
469
@test B' A1' ≈ B' M1'
453
470
454
471
if eltyB == elty1
455
- @test mul! (similar (B), A1, B) ≈ M1 * B
456
- @test mul! (similar (B), A1, adjoint (B)) ≈ M1 * B'
457
- @test mul! (similar (B), A1, transpose (B)) ≈ M1 * transpose (B)
458
- @test mul! (similar (B), adjoint (A1), adjoint (B)) ≈ M1' * B'
459
- @test mul! (similar (B), transpose (A1), transpose (B)) ≈ transpose (M1) * transpose (B)
460
- @test mul! (similar (B), transpose (A1), adjoint (B)) ≈ transpose (M1) * B'
461
- @test mul! (similar (B), adjoint (A1), transpose (B)) ≈ M1' * transpose (B)
462
- @test mul! (similar (B), adjoint (A1), B) ≈ M1' * B
463
- @test mul! (similar (B), transpose (A1), B) ≈ transpose (M1) * B
472
+ Bsim = similar (B)
473
+ @test mul! (Bsim, A1, B) ≈ M1 * B
474
+ @test mul! (Bsim, A1, adjoint (B)) ≈ M1 * B'
475
+ @test mul! (Bsim, A1, transpose (B)) ≈ M1 * transpose (B)
476
+ @test mul! (Bsim, adjoint (A1), adjoint (B)) ≈ M1' * B'
477
+ @test mul! (Bsim, transpose (A1), transpose (B)) ≈ transpose (M1) * transpose (B)
478
+ @test mul! (Bsim, transpose (A1), adjoint (B)) ≈ transpose (M1) * B'
479
+ @test mul! (Bsim, adjoint (A1), transpose (B)) ≈ M1' * transpose (B)
480
+ @test mul! (Bsim, adjoint (A1), B) ≈ M1' * B
481
+ @test mul! (Bsim, transpose (A1), B) ≈ transpose (M1) * B
464
482
# test also vector methods
465
- B1 = vec (B[ 1 , :] )
466
- @test mul! (similar (B1) , A1, B1 ) ≈ M1 * B1
467
- @test mul! (similar (B1) , adjoint (A1), B1 ) ≈ M1' * B1
468
- @test mul! (similar (B1) , transpose (A1), B1 ) ≈ transpose (M1) * B1
483
+ bcol1sim = similar (bcol1 )
484
+ @test mul! (bcol1sim , A1, bcol1 ) ≈ M1 * bcol1
485
+ @test mul! (bcol1sim , adjoint (A1), bcol1 ) ≈ M1' * bcol1
486
+ @test mul! (bcol1sim , transpose (A1), bcol1 ) ≈ transpose (M1) * bcol1
469
487
end
470
488
# error handling
471
489
Ann, Bmm, bm = A1, Matrix {eltyB} (undef, n + 1 , n + 1 ), Vector {eltyB} (undef, n + 1 )
@@ -477,10 +495,10 @@ function test_triangular(elty1_types)
477
495
@test_throws DimensionMismatch rmul! (Bmm, transpose (Ann))
478
496
479
497
# ... and division
480
- @test A1 \ B[:, 1 ] ≈ M1 \ B[:, 1 ]
498
+ @test A1 \ bcol1 ≈ M1 \ bcol1
481
499
@test A1 \ B ≈ M1 \ B
482
- @test transpose (A1) \ B[:, 1 ] ≈ transpose (M1) \ B[:, 1 ]
483
- @test A1' \ B[:, 1 ] ≈ M1' \ B[:, 1 ]
500
+ @test transpose (A1) \ bcol1 ≈ transpose (M1) \ bcol1
501
+ @test A1' \ bcol1 ≈ M1' \ bcol1
484
502
@test transpose (A1) \ B ≈ transpose (M1) \ B
485
503
@test A1' \ B ≈ M1' \ B
486
504
@test A1 \ transpose (B) ≈ M1 \ transpose (B)
0 commit comments