@@ -25,6 +25,7 @@ using NDTensors.BlockSparseArrays:
2525 block_reshape,
2626 block_stored_indices,
2727 view!
28+ using NDTensors. GPUArraysCoreExtensions: cpu
2829using NDTensors. SparseArrayInterface: nstored
2930using NDTensors. TensorAlgebra: contract
3031using Test: @test , @test_broken , @test_throws , @testset
@@ -72,8 +73,10 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
7273 @test_broken [ah[Block (Tuple (it))] for it in eachindex (block_stored_indices (ah))] isa Vector
7374 end
7475 @testset " Basics" begin
75- a = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
76- @test a == BlockSparseArray {elt} (blockedrange ([2 , 3 ]), blockedrange ([2 , 3 ]))
76+ a = dev (BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]))
77+ @allowscalar @test a == dev (
78+ BlockSparseArray {elt} (blockedrange ([2 , 3 ]), blockedrange ([2 , 3 ]))
79+ )
7780 @test eltype (a) === elt
7881 @test axes (a) == (1 : 5 , 1 : 5 )
7982 @test all (aᵢ -> aᵢ isa BlockedOneTo, axes (a))
@@ -82,7 +85,7 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
8285 @test size (a) == (5 , 5 )
8386 @test block_nstored (a) == 0
8487 @test iszero (a)
85- @test all (I -> iszero (a[I]), eachindex (a))
88+ @allowscalar @ test all (I -> iszero (a[I]), eachindex (a))
8689 @test_throws DimensionMismatch a[Block (1 , 1 )] = randn (elt, 2 , 3 )
8790
8891 a = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
@@ -108,14 +111,21 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
108111 @test isnan (norm (a))
109112 end
110113 @testset " Tensor algebra" begin
111- a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
114+ a = dev ( BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]) ))
112115 @views for b in [Block (1 , 2 ), Block (2 , 1 )]
113- a[b] = randn (elt, size (a[b]))
116+ a[b] = dev ( randn (elt, size (a[b]) ))
114117 end
115118 @test eltype (a) == elt
116119 @test block_nstored (a) == 2
117120 @test nstored (a) == 2 * 4 + 3 * 3
118121
122+ # TODO : Broken on GPU.
123+ if dev ≠ cpu
124+ a = dev (BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ]))
125+ @test_broken a[Block (1 , 2 )] .= 2
126+ end
127+
128+ # TODO : Broken on GPU.
119129 a = BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ])
120130 a[Block (1 , 2 )] .= 2
121131 @test eltype (a) == elt
@@ -126,6 +136,13 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
126136 @test block_nstored (a) == 1
127137 @test nstored (a) == 2 * 4
128138
139+ # TODO : Broken on GPU.
140+ if dev ≠ cpu
141+ a = dev (BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ]))
142+ @test_broken a[Block (1 , 2 )] .= 0
143+ end
144+
145+ # TODO : Broken on GPU.
129146 a = BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ])
130147 a[Block (1 , 2 )] .= 0
131148 @test eltype (a) == elt
@@ -136,9 +153,9 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
136153 @test block_nstored (a) == 1
137154 @test nstored (a) == 2 * 4
138155
139- a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
156+ a = dev ( BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]) ))
140157 @views for b in [Block (1 , 2 ), Block (2 , 1 )]
141- a[b] = randn (elt, size (a[b]))
158+ a[b] = dev ( randn (elt, size (a[b]) ))
142159 end
143160 b = similar (a, complex (elt))
144161 @test eltype (b) == complex (eltype (a))
@@ -148,21 +165,23 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
148165 @test size (b) == size (a)
149166 @test blocksize (b) == blocksize (a)
150167
151- a = BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ])
168+ a = dev ( BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ]) )
152169 b = @view a[[Block (2 ), Block (1 )], [Block (2 ), Block (1 )]]
153170 c = @view b[Block (1 , 1 )]
154171 @test iszero (a)
155172 @test iszero (nstored (a))
156173 @test iszero (b)
157174 @test iszero (nstored (b))
158- @test iszero (c)
175+ # TODO : Broken on GPU.
176+ @test iszero (c) broken = dev ≠ cpu
159177 @test iszero (nstored (c))
160- a[5 , 7 ] = 1
178+ @allowscalar a[5 , 7 ] = 1
161179 @test ! iszero (a)
162180 @test nstored (a) == 3 * 4
163181 @test ! iszero (b)
164182 @test nstored (b) == 3 * 4
165- @test ! iszero (c)
183+ # TODO : Broken on GPU.
184+ @test ! iszero (c) broken = dev ≠ cpu
166185 @test nstored (c) == 3 * 4
167186 d = @view a[1 : 4 , 1 : 6 ]
168187 @test iszero (d)
@@ -193,12 +212,12 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
193212 b ./= 2
194213 @test b ≈ a / 2
195214
196- a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
215+ a = dev ( BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]) ))
197216 @views for b in [Block (1 , 2 ), Block (2 , 1 )]
198- a[b] = randn (elt, size (a[b]))
217+ a[b] = dev ( randn (elt, size (a[b]) ))
199218 end
200219 b = 2 * a
201- @test Array (b) ≈ 2 * Array (a)
220+ @allowscalar @ test Array (b) ≈ 2 * Array (a)
202221 @test eltype (b) == elt
203222 @test block_nstored (b) == 2
204223 @test nstored (b) == 2 * 4 + 3 * 3
@@ -213,12 +232,12 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
213232 @test block_nstored (b) == 2
214233 @test nstored (b) == 2 * 4 + 3 * 3
215234
216- a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
235+ a = dev ( BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]) ))
217236 @views for b in [Block (1 , 2 ), Block (2 , 1 )]
218- a[b] = randn (elt, size (a[b]))
237+ a[b] = dev ( randn (elt, size (a[b]) ))
219238 end
220239 b = a + a
221- @test Array (b) ≈ 2 * Array (a)
240+ @allowscalar @ test Array (b) ≈ 2 * Array (a)
222241 @test eltype (b) == elt
223242 @test block_nstored (b) == 2
224243 @test nstored (b) == 2 * 4 + 3 * 3
@@ -297,25 +316,28 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
297316 @test nstored (b) == nstored (a[Block (1 , 2 )])
298317 @test block_nstored (b) == 1
299318
300- a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
319+ a = dev ( BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]) ))
301320 @views for b in [Block (1 , 2 ), Block (2 , 1 )]
302- a[b] = randn (elt, size (a[b]))
321+ a[b] = dev ( randn (elt, size (a[b]) ))
303322 end
304323 for b in (a[2 : 4 , 2 : 4 ], @view (a[2 : 4 , 2 : 4 ]))
305- @test b == Array (a)[2 : 4 , 2 : 4 ]
324+ @allowscalar @ test b == Array (a)[2 : 4 , 2 : 4 ]
306325 @test size (b) == (3 , 3 )
307326 @test blocksize (b) == (2 , 2 )
308327 @test nstored (b) == 1 * 1 + 2 * 2
309328 @test block_nstored (b) == 2
310329 for f in (getindex, view)
311- @test size (f (b, Block (1 , 1 ))) == (1 , 2 )
312- @test size (f (b, Block (2 , 1 ))) == (2 , 2 )
313- @test size (f (b, Block (1 , 2 ))) == (1 , 1 )
314- @test size (f (b, Block (2 , 2 ))) == (2 , 1 )
315- @test f (b, Block (1 , 1 )) == a[Block (1 , 1 )[2 : 2 , 2 : 3 ]]
316- @test f (b, Block (2 , 1 )) == a[Block (2 , 1 )[1 : 2 , 2 : 3 ]]
317- @test f (b, Block (1 , 2 )) == a[Block (1 , 2 )[2 : 2 , 1 : 1 ]]
318- @test f (b, Block (2 , 2 )) == a[Block (2 , 2 )[1 : 2 , 1 : 1 ]]
330+ # TODO : Broken on GPU.
331+ @allowscalar begin
332+ @test size (f (b, Block (1 , 1 ))) == (1 , 2 )
333+ @test size (f (b, Block (2 , 1 ))) == (2 , 2 )
334+ @test size (f (b, Block (1 , 2 ))) == (1 , 1 )
335+ @test size (f (b, Block (2 , 2 ))) == (2 , 1 )
336+ @test f (b, Block (1 , 1 )) == a[Block (1 , 1 )[2 : 2 , 2 : 3 ]]
337+ @test f (b, Block (2 , 1 )) == a[Block (2 , 1 )[1 : 2 , 2 : 3 ]]
338+ @test f (b, Block (1 , 2 )) == a[Block (1 , 2 )[2 : 2 , 1 : 1 ]]
339+ @test f (b, Block (2 , 2 )) == a[Block (2 , 2 )[1 : 2 , 1 : 1 ]]
340+ end
319341 end
320342 end
321343
@@ -448,21 +470,23 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
448470 end
449471 end
450472
451- a = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
473+ a = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
452474 @views for b in [Block (1 , 1 ), Block (2 , 2 )]
453475 # TODO : Use `blocksizes(a)[Int.(Tuple(b))...]` once available.
454- a[b] = randn (elt, size (a[b]))
476+ a[b] = dev ( randn (elt, size (a[b]) ))
455477 end
456478 for I in ([Block (2 ), Block (1 )],)
457479 b = @view a[I, I]
458480 @test b[Block (1 , 1 )] == a[Block (2 , 2 )]
459481 @test b[Block (2 , 1 )] == a[Block (1 , 2 )]
460482 @test b[Block (1 , 2 )] == a[Block (2 , 1 )]
461483 @test b[Block (2 , 2 )] == a[Block (1 , 1 )]
462- @test b[1 , 1 ] == a[3 , 3 ]
463- @test b[4 , 4 ] == a[1 , 1 ]
464- b[4 , 4 ] = 44
465- @test b[4 , 4 ] == 44
484+ @allowscalar begin
485+ @test b[1 , 1 ] == a[3 , 3 ]
486+ @test b[4 , 4 ] == a[1 , 1 ]
487+ b[4 , 4 ] = 44
488+ @test b[4 , 4 ] == 44
489+ end
466490 end
467491
468492 a = BlockSparseArray {elt} (undef, ([2 , 3 ], [3 , 4 ]))
@@ -490,10 +514,10 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
490514 end
491515 end
492516
493- a = BlockSparseArray {elt} (undef, ([3 , 3 ], [3 , 3 ]))
517+ a = dev ( BlockSparseArray {elt} (undef, ([3 , 3 ], [3 , 3 ]) ))
494518 # TODO : Define `block_diagindices`.
495519 @views for b in [Block (1 , 1 ), Block (2 , 2 )]
496- a[b] = randn (elt, size (a[b]))
520+ a[b] = dev ( randn (elt, size (a[b]) ))
497521 end
498522 I = mortar ([Block (1 )[1 : 2 ], Block (2 )[1 : 2 ]])
499523 b = a[:, I]
@@ -557,6 +581,7 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
557581 @test iszero (a)
558582 @test iszero (block_nstored (a))
559583
584+ # TODO : Broken on GPU.
560585 a = BlockSparseArray {elt} ([2 , 3 ], [3 , 4 ])
561586 for I in (Block .(1 : 2 ), [Block (1 ), Block (2 )])
562587 b = @view a[I, I]
@@ -780,43 +805,45 @@ using .NDTensorsTestUtils: devices_list, is_supported_eltype
780805 end
781806 end
782807 @testset " LinearAlgebra" begin
783- a1 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
784- a1[Block (1 , 1 )] = randn (elt, size (@view (a1[Block (1 , 1 )])))
785- a2 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
786- a2[Block (1 , 1 )] = randn (elt, size (@view (a1[Block (1 , 1 )])))
808+ a1 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
809+ a1[Block (1 , 1 )] = dev ( randn (elt, size (@view (a1[Block (1 , 1 )]) )))
810+ a2 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
811+ a2[Block (1 , 1 )] = dev ( randn (elt, size (@view (a1[Block (1 , 1 )]) )))
787812 a_dest = a1 * a2
788- @test Array (a_dest) ≈ Array (a1) * Array (a2)
813+ @allowscalar @ test Array (a_dest) ≈ Array (a1) * Array (a2)
789814 @test a_dest isa BlockSparseArray{elt}
790815 @test block_nstored (a_dest) == 1
791816 end
792817 @testset " Matrix multiplication" begin
793- a1 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
794- a1[Block (1 , 2 )] = randn (elt, size (@view (a1[Block (1 , 2 )])))
795- a1[Block (2 , 1 )] = randn (elt, size (@view (a1[Block (2 , 1 )])))
796- a2 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
797- a2[Block (1 , 2 )] = randn (elt, size (@view (a2[Block (1 , 2 )])))
798- a2[Block (2 , 1 )] = randn (elt, size (@view (a2[Block (2 , 1 )])))
799- @test Array (a1 * a2) ≈ Array (a1) * Array (a2 )
800- @test Array (a1 ' * a2) ≈ Array (a1 ' ) * Array (a2)
801- @ test Array (a1 * a2 ' ) ≈ Array (a1) * Array (a2' )
802- @test Array (a1 ' * a2 ' ) ≈ Array (a1 ' ) * Array (a2 ' )
818+ a1 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
819+ a1[Block (1 , 2 )] = dev ( randn (elt, size (@view (a1[Block (1 , 2 )]) )))
820+ a1[Block (2 , 1 )] = dev ( randn (elt, size (@view (a1[Block (2 , 1 )]) )))
821+ a2 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
822+ a2[Block (1 , 2 )] = dev ( randn (elt, size (@view (a2[Block (1 , 2 )]) )))
823+ a2[Block (2 , 1 )] = dev ( randn (elt, size (@view (a2[Block (2 , 1 )]) )))
824+ for (a1′, a2′) in ((a1, a2), (a1 ' , a2), (a1, a2 ' ), (a1 ' , a2 ' ) )
825+ a_dest = a1′ * a2′
826+ @allowscalar @ test Array (a_dest ) ≈ Array (a1′ ) * Array (a2′ )
827+ end
803828 end
804829 @testset " TensorAlgebra" begin
805- a1 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
806- a1[Block (1 , 1 )] = randn (elt, size (@view (a1[Block (1 , 1 )])))
807- a2 = BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ])
808- a2[Block (1 , 1 )] = randn (elt, size (@view (a1[Block (1 , 1 )])))
830+ a1 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
831+ a1[Block (1 , 1 )] = dev ( randn (elt, size (@view (a1[Block (1 , 1 )]) )))
832+ a2 = dev ( BlockSparseArray {elt} ([2 , 3 ], [2 , 3 ]) )
833+ a2[Block (1 , 1 )] = dev ( randn (elt, size (@view (a1[Block (1 , 1 )]) )))
809834 # TODO : Make this work, requires customization of `TensorAlgebra.fusedims` and
810835 # `TensorAlgebra.splitdims` in terms of `BlockSparseArrays.block_reshape`,
811836 # and customization of `TensorAlgebra.:⊗` in terms of `GradedAxes.tensor_product`.
812837 a_dest, dimnames_dest = contract (a1, (1 , - 1 ), a2, (- 1 , 2 ))
813- a_dest_dense, dimnames_dest_dense = contract (Array (a1), (1 , - 1 ), Array (a2), (- 1 , 2 ))
814- @test a_dest ≈ a_dest_dense
838+ @allowscalar begin
839+ a_dest_dense, dimnames_dest_dense = contract (Array (a1), (1 , - 1 ), Array (a2), (- 1 , 2 ))
840+ @test a_dest ≈ a_dest_dense
841+ end
815842 end
816843 @testset " block_reshape" begin
817- a = BlockSparseArray {elt} (undef, ([3 , 4 ], [2 , 3 ]))
818- a[Block (1 , 2 )] = randn (elt, size (@view (a[Block (1 , 2 )])))
819- a[Block (2 , 1 )] = randn (elt, size (@view (a[Block (2 , 1 )])))
844+ a = dev ( BlockSparseArray {elt} (undef, ([3 , 4 ], [2 , 3 ]) ))
845+ a[Block (1 , 2 )] = dev ( randn (elt, size (@view (a[Block (1 , 2 )]) )))
846+ a[Block (2 , 1 )] = dev ( randn (elt, size (@view (a[Block (2 , 1 )]) )))
820847 b = block_reshape (a, [6 , 8 , 9 , 12 ])
821848 @test reshape (a[Block (1 , 2 )], 9 ) == b[Block (3 )]
822849 @test reshape (a[Block (2 , 1 )], 8 ) == b[Block (2 )]
0 commit comments