@@ -293,45 +293,107 @@ end
293
293
end
294
294
295
295
@testset " muladd" begin
296
- A23 = reshape (1 : 6 , 2 ,3 )
296
+ A23 = reshape (1 : 6 , 2 ,3 ) .+ 0
297
297
B34 = reshape (1 : 12 , 3 ,4 ) .+ im
298
298
u2 = [10 ,20 ]
299
299
v3 = [3 ,5 ,7 ] .+ im
300
300
w4 = [11 ,13 ,17 ,19im ]
301
301
302
- @test muladd (A23, B34, 100 ) == A23 * B34 .+ 100
303
- @test muladd (A23, B34, u2) == A23 * B34 .+ u2
304
- @test muladd (A23, B34, w4' ) == A23 * B34 .+ w4'
305
- @test_throws DimensionMismatch muladd (B34, A23, 1 )
306
- @test_throws DimensionMismatch muladd (A23, B34, ones (2 ,4 ,1 ))
307
-
308
- @test muladd (A23, v3, 100 ) == A23 * v3 .+ 100
309
- @test muladd (A23, v3, u2) == A23 * v3 .+ u2
310
- @test muladd (A23, v3, im) isa Vector{Complex{Int}}
311
- @test_throws DimensionMismatch muladd (A23, v3, ones (2 ,2 ))
312
-
313
- @test muladd (v3' , B34, 0 ) isa Adjoint
314
- @test muladd (v3' , B34, 2im ) == v3' * B34 .+ 2im
315
- @test muladd (v3' , B34, w4' ) == v3' * B34 .+ w4'
316
- @test_throws DimensionMismatch muladd (v3' , B34, ones (1 ,4 ))
317
-
318
- @test muladd (u2, v3' , 0 ) isa Matrix
319
- @test muladd (u2, v3' , 99 ) == u2 * v3' .+ 99
320
- @test muladd (u2, v3' , A23) == u2 * v3' .+ A23
321
- @test_throws DimensionMismatch muladd (u2, v3' , ones (2 ,3 ,4 ))
322
-
323
- @test muladd (u2' , u2, 0 ) isa Number
324
- @test muladd (v3' , v3, im) == dot (v3,v3) + im
325
- @test_throws DimensionMismatch muladd (v3' , v3, [1 ])
326
-
327
- vofm = [rand (1 : 9 ,2 ,2 ) for _ in 1 : 3 ]
328
- Mofm = [rand (1 : 9 ,2 ,2 ) for _ in 1 : 3 , _ in 1 : 3 ]
329
-
330
- @test muladd (vofm' , vofm, vofm[1 ]) == vofm' * vofm .+ vofm[1 ] # inner
331
- @test muladd (vofm, vofm' , Mofm) == vofm * vofm' .+ Mofm # outer
332
- @test muladd (vofm' , Mofm, vofm' ) == vofm' * Mofm .+ vofm' # bra-mat
333
- @test muladd (Mofm, Mofm, vofm) == Mofm * Mofm .+ vofm # mat-mat
334
- @test_broken muladd (Mofm, vofm, vofm) == Mofm * vofm .+ vofm # mat-vec
302
+ @testset " matrix-matrix" begin
303
+ @test muladd (A23, B34, 0 ) == A23 * B34
304
+ @test muladd (A23, B34, 100 ) == A23 * B34 .+ 100
305
+ @test muladd (A23, B34, u2) == A23 * B34 .+ u2
306
+ @test muladd (A23, B34, w4' ) == A23 * B34 .+ w4'
307
+ @test_throws DimensionMismatch muladd (B34, A23, 1 )
308
+ @test muladd (ones (1 ,3 ), ones (3 ,4 ), ones (1 ,4 )) == fill (4.0 ,1 ,4 )
309
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ,4 ), ones (9 ,4 ))
310
+
311
+ # broadcasting fallback method allows trailing dims
312
+ @test muladd (A23, B34, ones (2 ,4 ,1 )) == A23 * B34 + ones (2 ,4 ,1 )
313
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ,4 ), ones (9 ,4 ,1 ))
314
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ,4 ), ones (1 ,4 ,9 ))
315
+ # and catches z::Array{T,0}
316
+ @test muladd (A23, B34, fill (0 )) == A23 * B34
317
+ end
318
+ @testset " matrix-vector" begin
319
+ @test muladd (A23, v3, 0 ) == A23 * v3
320
+ @test muladd (A23, v3, 100 ) == A23 * v3 .+ 100
321
+ @test muladd (A23, v3, u2) == A23 * v3 .+ u2
322
+ @test muladd (A23, v3, im) isa Vector{Complex{Int}}
323
+ @test muladd (ones (1 ,3 ), ones (3 ), ones (1 )) == [4 ]
324
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ), ones (7 ))
325
+
326
+ # fallback
327
+ @test muladd (A23, v3, ones (2 ,1 ,1 )) == A23 * v3 + ones (2 ,1 ,1 )
328
+ @test_throws DimensionMismatch muladd (A23, v3, ones (2 ,2 ))
329
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ), ones (7 ,1 ))
330
+ @test_throws DimensionMismatch muladd (ones (1 ,3 ), ones (3 ), ones (1 ,7 ))
331
+ @test muladd (A23, v3, fill (0 )) == A23 * v3
332
+ end
333
+ @testset " adjoint-matrix" begin
334
+ @test muladd (v3' , B34, 0 ) isa Adjoint
335
+ @test muladd (v3' , B34, 2im ) == v3' * B34 .+ 2im
336
+ @test muladd (v3' , B34, w4' ) == v3' * B34 .+ w4'
337
+
338
+ # via fallback
339
+ @test muladd (v3' , B34, ones (1 ,4 )) == (B34' * v3 + ones (4 ,1 ))'
340
+ @test_throws DimensionMismatch muladd (v3' , B34, ones (7 ,4 ))
341
+ @test_throws DimensionMismatch muladd (v3' , B34, ones (1 ,4 ,7 ))
342
+ @test muladd (v3' , B34, fill (0 )) == v3' * B34 # does not make an Adjoint
343
+ end
344
+ @testset " vector-adjoint" begin
345
+ @test muladd (u2, v3' , 0 ) isa Matrix
346
+ @test muladd (u2, v3' , 99 ) == u2 * v3' .+ 99
347
+ @test muladd (u2, v3' , A23) == u2 * v3' .+ A23
348
+
349
+ @test muladd (u2, v3' , ones (2 ,3 ,1 )) == u2 * v3' + ones (2 ,3 ,1 )
350
+ @test_throws DimensionMismatch muladd (u2, v3' , ones (2 ,3 ,4 ))
351
+ @test_throws DimensionMismatch muladd ([1 ], v3' , ones (7 ,3 ))
352
+ @test muladd (u2, v3' , fill (0 )) == u2 * v3'
353
+ end
354
+ @testset " dot" begin # all use muladd(::Any, ::Any, ::Any)
355
+ @test muladd (u2' , u2, 0 ) isa Number
356
+ @test muladd (v3' , v3, im) == dot (v3,v3) + im
357
+ @test muladd (u2' , u2, [1 ]) == [dot (u2,u2) + 1 ]
358
+ @test_throws DimensionMismatch muladd (u2' , u2, [1 ,1 ]) == [dot (u2,u2) + 1 ]
359
+ @test muladd (u2' , u2, fill (0 )) == dot (u2,u2)
360
+ end
361
+ @testset " arrays of arrays" begin
362
+ vofm = [rand (1 : 9 ,2 ,2 ) for _ in 1 : 3 ]
363
+ Mofm = [rand (1 : 9 ,2 ,2 ) for _ in 1 : 3 , _ in 1 : 3 ]
364
+
365
+ @test muladd (vofm' , vofm, vofm[1 ]) == vofm' * vofm .+ vofm[1 ] # inner
366
+ @test muladd (vofm, vofm' , Mofm) == vofm * vofm' .+ Mofm # outer
367
+ @test muladd (vofm' , Mofm, vofm' ) == vofm' * Mofm .+ vofm' # bra-mat
368
+ @test muladd (Mofm, Mofm, vofm) == Mofm * Mofm .+ vofm # mat-mat
369
+ @test muladd (Mofm, vofm, vofm) == Mofm * vofm .+ vofm # mat-vec
370
+ end
371
+ end
372
+
373
+ @testset " muladd & structured matrices" begin
374
+ A33 = reshape (1 : 9 , 3 ,3 ) .+ im
375
+ v3 = [3 ,5 ,7im ]
376
+
377
+ # no special treatment
378
+ @test muladd (Symmetric (A33), Symmetric (A33), 1 ) == Symmetric (A33) * Symmetric (A33) .+ 1
379
+ @test muladd (Hermitian (A33), Hermitian (A33), v3) == Hermitian (A33) * Hermitian (A33) .+ v3
380
+ @test muladd (adjoint (A33), transpose (A33), A33) == A33' * transpose (A33) .+ A33
381
+
382
+ u1 = muladd (UpperTriangular (A33), UpperTriangular (A33), Diagonal (v3))
383
+ @test u1 isa UpperTriangular
384
+ @test u1 == UpperTriangular (A33) * UpperTriangular (A33) + Diagonal (v3)
385
+
386
+ # diagonal
387
+ @test muladd (Diagonal (v3), Diagonal (A33), Diagonal (v3)). diag == ([1 ,5 ,9 ] .+ im .+ 1 ) .* v3
388
+
389
+ # uniformscaling
390
+ @test muladd (Diagonal (v3), I, I). diag == v3 .+ 1
391
+ @test muladd (2 * I, 3 * I, I). λ == 7
392
+ @test muladd (A33, A33' , I) == A33 * A33' + I
393
+
394
+ # https://github.com/JuliaLang/julia/issues/38426
395
+ @test @evalpoly (A33, 1.0 * I, 1.0 * I) == I + A33
396
+ @test @evalpoly (A33, 1.0 * I, 1.0 * I, 1.0 * I) == I + A33 + A33^ 2
335
397
end
336
398
337
399
# issue #6450
0 commit comments