@@ -11,160 +11,164 @@ isdefined(Main, :SizedArrays) || @eval Main include(joinpath($(BASE_TEST_PATH),
1111using  . Main. SizedArrays
1212
1313@testset  " broadcast[!] over combinations of scalars, structured matrices, and dense vectors/matrices" begin 
14-     N =  10 
15-     s =  rand ()
16-     fV =  rand (N)
17-     fA =  rand (N, N)
18-     Z =  copy (fA)
19-     D =  Diagonal (rand (N))
20-     B =  Bidiagonal (rand (N), rand (N -  1 ), :U )
21-     T =  Tridiagonal (rand (N -  1 ), rand (N), rand (N -  1 ))
22-     S =  SymTridiagonal (rand (N), rand (N -  1 ))
23-     U =  UpperTriangular (rand (N,N))
24-     L =  LowerTriangular (rand (N,N))
25-     M =  Matrix (rand (N,N))
26-     structuredarrays =  (D, B, T, U, L, M, S)
27-     fstructuredarrays =  map (Array, structuredarrays)
28-     for  (X, fX) in  zip (structuredarrays, fstructuredarrays)
29-         @test  (Q =  broadcast (sin, X); typeof (Q) ==  typeof (X) &&  Q ==  broadcast (sin, fX))
30-         @test  broadcast! (sin, Z, X) ==  broadcast (sin, fX)
31-         @test  (Q =  broadcast (cos, X); Q isa  Matrix &&  Q ==  broadcast (cos, fX))
32-         @test  broadcast! (cos, Z, X) ==  broadcast (cos, fX)
33-         @test  (Q =  broadcast (* , s, X); typeof (Q) ==  typeof (X) &&  Q ==  broadcast (* , s, fX))
34-         @test  broadcast! (* , Z, s, X) ==  broadcast (* , s, fX)
35-         @test  (Q =  broadcast (+ , fV, fA, X); Q isa  Matrix &&  Q ==  broadcast (+ , fV, fA, fX))
36-         @test  broadcast! (+ , Z, fV, fA, X) ==  broadcast (+ , fV, fA, fX)
37-         @test  (Q =  broadcast (* , s, fV, fA, X); Q isa  Matrix &&  Q ==  broadcast (* , s, fV, fA, fX))
38-         @test  broadcast! (* , Z, s, fV, fA, X) ==  broadcast (* , s, fV, fA, fX)
39- 
40-         @test  X .*  2.0  ==  X .*  (2.0 ,) ==  fX .*  2.0 
41-         @test  X .*  2.0  isa  typeof (X)
42-         @test  X .*  (2.0 ,) isa  typeof (X)
43-         @test  isequal (X .*  Inf , fX .*  Inf )
44- 
45-         two =  2 
46-         @test  X .^  2  ==   X .^  (2 ,) ==  fX .^  2  ==  X .^  two
47-         @test  X .^  2  isa  typeof (X)
48-         @test  X .^  (2 ,) isa  typeof (X)
49-         @test  X .^  two isa  typeof (X)
50-         @test  X .^  0  ==  fX .^  0 
51-         @test  X .^  - 1  ==  fX .^  - 1 
52- 
53-         for  (Y, fY) in  zip (structuredarrays, fstructuredarrays)
54-             @test  broadcast (+ , X, Y) ==  broadcast (+ , fX, fY)
55-             @test  broadcast! (+ , Z, X, Y) ==  broadcast (+ , fX, fY)
56-             @test  broadcast (* , X, Y) ==  broadcast (* , fX, fY)
57-             @test  broadcast! (* , Z, X, Y) ==  broadcast (* , fX, fY)
14+     @testset  for  N in  (0 ,1 ,2 ,10 ) #  some edge cases, and a structured case
15+         s =  rand ()
16+         fV =  rand (N)
17+         fA =  rand (N, N)
18+         Z =  copy (fA)
19+         D =  Diagonal (rand (N))
20+         B =  Bidiagonal (rand (N), rand (max (0 ,N- 1 )), :U )
21+         T =  Tridiagonal (rand (max (0 ,N- 1 )), rand (N), rand (max (0 ,N- 1 )))
22+         S =  SymTridiagonal (rand (N), rand (max (0 ,N- 1 )))
23+         U =  UpperTriangular (rand (N,N))
24+         L =  LowerTriangular (rand (N,N))
25+         M =  Matrix (rand (N,N))
26+         structuredarrays =  (D, B, T, U, L, M, S)
27+         fstructuredarrays =  map (Array, structuredarrays)
28+         @testset  " $(nameof (typeof (X))) " for  (X, fX) in  zip (structuredarrays, fstructuredarrays)
29+             @test  (Q =  broadcast (sin, X); typeof (Q) ==  typeof (X) &&  Q ==  broadcast (sin, fX))
30+             @test  broadcast! (sin, Z, X) ==  broadcast (sin, fX)
31+             @test  (Q =  broadcast (cos, X); Q isa  Matrix &&  Q ==  broadcast (cos, fX))
32+             @test  broadcast! (cos, Z, X) ==  broadcast (cos, fX)
33+             @test  (Q =  broadcast (* , s, X); typeof (Q) ==  typeof (X) &&  Q ==  broadcast (* , s, fX))
34+             @test  broadcast! (* , Z, s, X) ==  broadcast (* , s, fX)
35+             @test  (Q =  broadcast (+ , fV, fA, X); Q isa  Matrix &&  Q ==  broadcast (+ , fV, fA, fX))
36+             @test  broadcast! (+ , Z, fV, fA, X) ==  broadcast (+ , fV, fA, fX)
37+             @test  (Q =  broadcast (* , s, fV, fA, X); Q isa  Matrix &&  Q ==  broadcast (* , s, fV, fA, fX))
38+             @test  broadcast! (* , Z, s, fV, fA, X) ==  broadcast (* , s, fV, fA, fX)
39+ 
40+             @test  X .*  2.0  ==  X .*  (2.0 ,) ==  fX .*  2.0 
41+             @test  X .*  2.0  isa  typeof (X)
42+             @test  X .*  (2.0 ,) isa  typeof (X)
43+             @test  isequal (X .*  Inf , fX .*  Inf )
44+ 
45+             two =  2 
46+             @test  X .^  2  ==   X .^  (2 ,) ==  fX .^  2  ==  X .^  two
47+             @test  X .^  2  isa  typeof (X)
48+             @test  X .^  (2 ,) isa  typeof (X)
49+             @test  X .^  two isa  typeof (X)
50+             @test  X .^  0  ==  fX .^  0 
51+             @test  X .^  - 1  ==  fX .^  - 1 
52+ 
53+             for  (Y, fY) in  zip (structuredarrays, fstructuredarrays)
54+                 @test  broadcast (+ , X, Y) ==  broadcast (+ , fX, fY)
55+                 @test  broadcast! (+ , Z, X, Y) ==  broadcast (+ , fX, fY)
56+                 @test  broadcast (* , X, Y) ==  broadcast (* , fX, fY)
57+                 @test  broadcast! (* , Z, X, Y) ==  broadcast (* , fX, fY)
58+             end 
5859        end 
59-     end 
60-     diagonals  =  (D, B, T )
61-     fdiagonals  =   map (Array,  diagonals)
62-     for  (X, fX ) in  zip (diagonals, fdiagonals)
63-         for  (Y, fY)  in   zip (diagonals, fdiagonals )
64-             @test  broadcast (+ , X, Y):: Union{Diagonal,Bidiagonal,Tridiagonal}  ==  broadcast (+ , fX, fY)
65-             @test  broadcast!  ( + , Z,  X, Y) ==  broadcast (+ , fX, fY)
66-             @test  broadcast (* , X, Y):: Union{Diagonal,Bidiagonal,Tridiagonal}  ==  broadcast (* , fX, fY)
67-             @test   broadcast! ( * , Z, X, Y)  ==   broadcast ( * , fX, fY) 
60+         diagonals  =  (D, B, T) 
61+         fdiagonals  =   map (Array, diagonals )
62+          for  (X, fX)  in   zip ( diagonals, fdiagonals )
63+              for  (Y, fY ) in  zip (diagonals, fdiagonals)
64+                  @test   broadcast ( + , X, Y) :: Union{Diagonal,Bidiagonal,Tridiagonal}   ==   broadcast ( + , fX, fY )
65+                  @test  broadcast!  (+ , Z,  X, Y) ==  broadcast (+ , fX, fY)
66+                  @test  broadcast ( * ,  X, Y):: Union{Diagonal,Bidiagonal,Tridiagonal}  ==  broadcast (* , fX, fY)
67+                  @test  broadcast!  (* , Z,  X, Y) ==  broadcast (* , fX, fY)
68+             end 
6869        end 
69-     end 
70-     UU  =   UnitUpperTriangular (rand (N,N))
71-     UL  =   UnitLowerTriangular ( rand (N,N) )
72-     unittriangulars  =  (UU, UL )
73-     Ttris  =   typeof .(( UpperTriangular ( parent (UU)),  LowerTriangular ( parent (UU))) )
74-     funittriangulars  =   map (Array,  unittriangulars)
75-     for  (X, fX, Ttri)  in   zip (unittriangulars, funittriangulars, Ttris )
76-         @test  (Q  =   broadcast (sin, X);  typeof (Q)  ==  Ttri  &&  Q  ==   broadcast (sin, fX) )
77-         @test  broadcast!  (sin, Z, X)  ==  broadcast (sin , fX)
78-         @test  (Q  =   broadcast (cos, X); Q  isa  Matrix  &&  Q  ==  broadcast (cos, fX) )
79-         @test  broadcast!  (cos, Z , X)  ==  broadcast (cos, fX )
80-         @test  (Q  =   broadcast (* , s, X);  typeof (Q)  ==  Ttri  &&  Q  ==   broadcast (* , s, fX) )
81-         @test  broadcast!  ( * , Z, s , X)  ==  broadcast (* , s, fX )
82-         @test  (Q  =   broadcast (+ , fV, fA, X); Q  isa  Matrix  &&  Q  ==  broadcast (+ , fV, fA, fX) )
83-         @test  broadcast!  ( + , Z , fV, fA, X)  ==  broadcast (+ ,  fV, fA, fX)
84-         @test  (Q  =   broadcast (* , s, fV, fA, X); Q  isa  Matrix  &&  Q  ==  broadcast (* , s, fV, fA, fX) )
85-          @test   broadcast! ( * , Z, s, fV, fA, X)  ==   broadcast ( * , s, fV, fA, fX) 
86- 
87-         @test  X  .*   2.0   ==  X .*  ( 2.0 ,)  ==  fX  .*   2.0 
88-         @test  X .*  2.0  isa  Ttri
89-         @test  X .*  ( 2.0 ,)  isa  Ttri 
90-          @test   isequal (X  .*   Inf , fX  .*   Inf ) 
91- 
92-         two  =   2 
93-         @test  X .^  2  ==   X  .^  ( 2 ,)  ==  fX  .^   2   ==  X  .^  two 
94-         @test  X .^  2  isa  typeof (X)  #  special cased, as isstructurepreserving 
95-         @test  X .^  ( 2 ,)  isa  Ttri
96-         @test  X .^  two  isa  Ttri 
97-         @test  X .^  0  ==  fX .^  0 
98-          @test  X  .^   - 1   ==  fX  .^   - 1 
99- 
100-         for  (Y, fY)  in   zip (unittriangulars, funittriangulars )
101-             @test  broadcast ( + , X, Y) ==  broadcast (+ , fX, fY)
102-             @test  broadcast!  ( + , Z,  X, Y) ==  broadcast (+ , fX, fY)
103-             @test  broadcast ( * , X, Y) ==  broadcast (* , fX, fY)
104-             @test   broadcast! ( * , Z, X, Y)  ==   broadcast ( * , fX, fY) 
70+         UU  =   UnitUpperTriangular ( rand (N,N)) 
71+         UL  =   UnitLowerTriangular (rand (N,N))
72+         unittriangulars  =  (UU, UL )
73+         Ttris  =   typeof .(( UpperTriangular ( parent (UU)),  LowerTriangular ( parent (UU))) )
74+         funittriangulars  =   map (Array, unittriangulars )
75+          for  (X, fX, Ttri)  in   zip ( unittriangulars, funittriangulars, Ttris )
76+              @test  (Q  =   broadcast (sin, X);  typeof (Q)  ==  Ttri  &&  Q  ==   broadcast (sin, fX) )
77+              @test   broadcast!  (sin, Z, X)  ==  broadcast (sin, fX)
78+              @test  (Q  =   broadcast (cos, X); Q  isa  Matrix  &&  Q  ==  broadcast (cos , fX) )
79+              @test   broadcast!  (cos, Z, X)  ==  broadcast (cos, fX)
80+              @test  (Q  =   broadcast ( * , s , X);  typeof (Q)  ==  Ttri  &&  Q  ==   broadcast (* , s, fX) )
81+              @test   broadcast!  (* , Z,  s, X)  ==  broadcast (* , s, fX)
82+              @test  (Q  =   broadcast ( + , fV, fA , X); Q  isa  Matrix  &&  Q  ==  broadcast (+ , fV, fA, fX) )
83+              @test   broadcast!  (+ , Z,  fV, fA, X)  ==  broadcast (+ , fV, fA, fX)
84+              @test  (Q  =   broadcast ( * , s , fV, fA, X); Q  isa  Matrix  &&  Q  ==  broadcast (* , s,  fV, fA, fX) )
85+              @test   broadcast!  (* , Z,  s, fV, fA, X)  ==  broadcast (* , s, fV, fA, fX)
86+ 
87+              @test  X  .*   2.0   ==  X  .*  ( 2.0 ,)  ==  fX  .*   2.0 
88+              @test  X .*  2.0   isa  Ttri 
89+              @test  X .*  ( 2.0 ,)  isa  Ttri
90+              @test  isequal ( X .*  Inf , fX  .*   Inf ) 
91+ 
92+             two  =   2 
93+              @test  X  .^   2   ==   X  .^  ( 2 ,)  ==  fX  .^   2   ==  X  .^  two 
94+              @test  X .^  2  isa   typeof (X)  #  special cased, as isstructurepreserving 
95+              @test  X .^  ( 2 ,)  isa  Ttri 
96+              @test  X .^  two  isa  Ttri
97+              @test  X .^  0   ==  fX  .^   0 
98+              @test  X .^  - 1  ==  fX .^  - 1 
99+ 
100+              for  (Y, fY)  in   zip (unittriangulars, funittriangulars) 
101+                  @test   broadcast ( + , X, Y)  ==   broadcast ( + , fX, fY )
102+                  @test  broadcast!  ( + , Z , X, Y) ==  broadcast (+ , fX, fY)
103+                  @test  broadcast ( * ,  X, Y) ==  broadcast (* , fX, fY)
104+                  @test  broadcast!  ( * , Z , X, Y) ==  broadcast (* , fX, fY)
105+             end 
105106        end 
106-     end 
107107
108-     @testset  " type-stability in Bidiagonal" begin 
109-         B2 =  @inferred  (B ->  .-  B)(B)
110-         @test  B2 isa  Bidiagonal
111-         @test  B2 ==  - 1  *  B
112-         B2 =  @inferred  (B ->  B .*  2 )(B)
113-         @test  B2 isa  Bidiagonal
114-         @test  B2 ==  B +  B
115-         B2 =  @inferred  (B ->  2  .*  B)(B)
116-         @test  B2 isa  Bidiagonal
117-         @test  B2 ==  B +  B
118-         B2 =  @inferred  (B ->  B ./  1 )(B)
119-         @test  B2 isa  Bidiagonal
120-         @test  B2 ==  B
121-         B2 =  @inferred  (B ->  1  .\  B)(B)
122-         @test  B2 isa  Bidiagonal
123-         @test  B2 ==  B
108+         @testset  " type-stability in Bidiagonal" begin 
109+             B2 =  @inferred  (B ->  .-  B)(B)
110+             @test  B2 isa  Bidiagonal
111+             @test  B2 ==  - 1  *  B
112+             B2 =  @inferred  (B ->  B .*  2 )(B)
113+             @test  B2 isa  Bidiagonal
114+             @test  B2 ==  B +  B
115+             B2 =  @inferred  (B ->  2  .*  B)(B)
116+             @test  B2 isa  Bidiagonal
117+             @test  B2 ==  B +  B
118+             B2 =  @inferred  (B ->  B ./  1 )(B)
119+             @test  B2 isa  Bidiagonal
120+             @test  B2 ==  B
121+             B2 =  @inferred  (B ->  1  .\  B)(B)
122+             @test  B2 isa  Bidiagonal
123+             @test  B2 ==  B
124+         end 
124125    end 
125126end 
126127
127128@testset  " broadcast! where the destination is a structured matrix" begin 
128-     N =  5 
129-     A =  rand (N, N)
130-     sA =  A +  copy (A' )
131-     D =  Diagonal (rand (N))
132-     Bu =  Bidiagonal (rand (N), rand (N -  1 ), :U )
133-     Bl =  Bidiagonal (rand (N), rand (N -  1 ), :L )
134-     T =  Tridiagonal (rand (N -  1 ), rand (N), rand (N -  1 ))
135-     ◣ =  LowerTriangular (rand (N,N))
136-     ◥ =  UpperTriangular (rand (N,N))
137-     M =  Matrix (rand (N,N))
138- 
139-     @test  broadcast! (sin, copy (D), D) ==  Diagonal (sin .(D))
140-     @test  broadcast! (sin, copy (Bu), Bu) ==  Bidiagonal (sin .(Bu), :U )
141-     @test  broadcast! (sin, copy (Bl), Bl) ==  Bidiagonal (sin .(Bl), :L )
142-     @test  broadcast! (sin, copy (T), T) ==  Tridiagonal (sin .(T))
143-     @test  broadcast! (sin, copy (◣), ◣) ==  LowerTriangular (sin .(◣))
144-     @test  broadcast! (sin, copy (◥), ◥) ==  UpperTriangular (sin .(◥))
145-     @test  broadcast! (sin, copy (M), M) ==  Matrix (sin .(M))
146-     @test  broadcast! (* , copy (D), D, A) ==  Diagonal (broadcast (* , D, A))
147-     @test  broadcast! (* , copy (Bu), Bu, A) ==  Bidiagonal (broadcast (* , Bu, A), :U )
148-     @test  broadcast! (* , copy (Bl), Bl, A) ==  Bidiagonal (broadcast (* , Bl, A), :L )
149-     @test  broadcast! (* , copy (T), T, A) ==  Tridiagonal (broadcast (* , T, A))
150-     @test  broadcast! (* , copy (◣), ◣, A) ==  LowerTriangular (broadcast (* , ◣, A))
151-     @test  broadcast! (* , copy (◥), ◥, A) ==  UpperTriangular (broadcast (* , ◥, A))
152-     @test  broadcast! (* , copy (M), M, A) ==  Matrix (broadcast (* , M, A))
153- 
154-     @test_throws  ArgumentError broadcast! (cos, copy (D), D) ==  Diagonal (sin .(D))
155-     @test_throws  ArgumentError broadcast! (cos, copy (Bu), Bu) ==  Bidiagonal (sin .(Bu), :U )
156-     @test_throws  ArgumentError broadcast! (cos, copy (Bl), Bl) ==  Bidiagonal (sin .(Bl), :L )
157-     @test_throws  ArgumentError broadcast! (cos, copy (T), T) ==  Tridiagonal (sin .(T))
158-     @test_throws  ArgumentError broadcast! (cos, copy (◣), ◣) ==  LowerTriangular (sin .(◣))
159-     @test_throws  ArgumentError broadcast! (cos, copy (◥), ◥) ==  UpperTriangular (sin .(◥))
160-     @test_throws  ArgumentError broadcast! (+ , copy (D), D, A) ==  Diagonal (broadcast (* , D, A))
161-     @test_throws  ArgumentError broadcast! (+ , copy (Bu), Bu, A) ==  Bidiagonal (broadcast (* , Bu, A), :U )
162-     @test_throws  ArgumentError broadcast! (+ , copy (Bl), Bl, A) ==  Bidiagonal (broadcast (* , Bl, A), :L )
163-     @test_throws  ArgumentError broadcast! (+ , copy (T), T, A) ==  Tridiagonal (broadcast (* , T, A))
164-     @test_throws  ArgumentError broadcast! (+ , copy (◣), ◣, A) ==  LowerTriangular (broadcast (* , ◣, A))
165-     @test_throws  ArgumentError broadcast! (+ , copy (◥), ◥, A) ==  UpperTriangular (broadcast (* , ◥, A))
166-     @test_throws  ArgumentError broadcast! (* , copy (◥), ◣, 2 )
167-     @test_throws  ArgumentError broadcast! (* , copy (Bu), Bl, 2 )
129+     @testset  for  N in  (0 ,1 ,2 ,5 )
130+         A =  rand (N, N)
131+         sA =  A +  copy (A' )
132+         D =  Diagonal (rand (N))
133+         Bu =  Bidiagonal (rand (N), rand (max (0 ,N- 1 )), :U )
134+         Bl =  Bidiagonal (rand (N), rand (max (0 ,N- 1 )), :L )
135+         T =  Tridiagonal (rand (max (0 ,N- 1 )), rand (N), rand (max (0 ,N- 1 )))
136+         ◣ =  LowerTriangular (rand (N,N))
137+         ◥ =  UpperTriangular (rand (N,N))
138+         M =  Matrix (rand (N,N))
139+ 
140+         @test  broadcast! (sin, copy (D), D) ==  Diagonal (sin .(D))
141+         @test  broadcast! (sin, copy (Bu), Bu) ==  Bidiagonal (sin .(Bu), :U )
142+         @test  broadcast! (sin, copy (Bl), Bl) ==  Bidiagonal (sin .(Bl), :L )
143+         @test  broadcast! (sin, copy (T), T) ==  Tridiagonal (sin .(T))
144+         @test  broadcast! (sin, copy (◣), ◣) ==  LowerTriangular (sin .(◣))
145+         @test  broadcast! (sin, copy (◥), ◥) ==  UpperTriangular (sin .(◥))
146+         @test  broadcast! (sin, copy (M), M) ==  Matrix (sin .(M))
147+         @test  broadcast! (* , copy (D), D, A) ==  Diagonal (broadcast (* , D, A))
148+         @test  broadcast! (* , copy (Bu), Bu, A) ==  Bidiagonal (broadcast (* , Bu, A), :U )
149+         @test  broadcast! (* , copy (Bl), Bl, A) ==  Bidiagonal (broadcast (* , Bl, A), :L )
150+         @test  broadcast! (* , copy (T), T, A) ==  Tridiagonal (broadcast (* , T, A))
151+         @test  broadcast! (* , copy (◣), ◣, A) ==  LowerTriangular (broadcast (* , ◣, A))
152+         @test  broadcast! (* , copy (◥), ◥, A) ==  UpperTriangular (broadcast (* , ◥, A))
153+         @test  broadcast! (* , copy (M), M, A) ==  Matrix (broadcast (* , M, A))
154+ 
155+         if  N >  2 
156+             @test_throws  ArgumentError broadcast! (cos, copy (D), D)
157+             @test_throws  ArgumentError broadcast! (cos, copy (Bu), Bu)
158+             @test_throws  ArgumentError broadcast! (cos, copy (Bl), Bl)
159+             @test_throws  ArgumentError broadcast! (cos, copy (T), T)
160+             @test_throws  ArgumentError broadcast! (cos, copy (◣), ◣)
161+             @test_throws  ArgumentError broadcast! (cos, copy (◥), ◥)
162+             @test_throws  ArgumentError broadcast! (+ , copy (D), D, A)
163+             @test_throws  ArgumentError broadcast! (+ , copy (Bu), Bu, A)
164+             @test_throws  ArgumentError broadcast! (+ , copy (Bl), Bl, A)
165+             @test_throws  ArgumentError broadcast! (+ , copy (T), T, A)
166+             @test_throws  ArgumentError broadcast! (+ , copy (◣), ◣, A)
167+             @test_throws  ArgumentError broadcast! (+ , copy (◥), ◥, A)
168+             @test_throws  ArgumentError broadcast! (* , copy (◥), ◣, 2 )
169+             @test_throws  ArgumentError broadcast! (* , copy (Bu), Bl, 2 )
170+         end 
171+     end 
168172end 
169173
170174@testset  " map[!] over combinations of structured matrices" begin 
0 commit comments