Skip to content

Commit 16cc26b

Browse files
committed
Test sparse broadcast (non-!) over combinations of broadcast scalars and sparse vectors/matrices.
1 parent a067ebe commit 16cc26b

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

test/sparse/higherorderfns.jl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,57 @@ end
193193
end
194194
end
195195

196+
@testset "broadcast over combinations of scalars and sparse vectors/matrices" begin
197+
N, M, p = 10, 12, 0.3
198+
elT = Float64
199+
s = elT(2.0)
200+
V = sprand(elT, N, p)
201+
A = sprand(elT, N, M, p)
202+
fV, fA = Array(V), Array(A)
203+
# test combinations involving one to three scalars and one to five sparse vectors/matrices
204+
spargseq, dargseq = Iterators.cycle((A, V)), Iterators.cycle((fA, fV))
205+
for nargs in 1:5 # number of tensor arguments
206+
nargsl = cld(nargs, 2) # number in "left half" of tensor arguments
207+
nargsr = fld(nargs, 2) # number in "right half" of tensor arguments
208+
spargsl = tuple(Iterators.take(spargseq, nargsl)...) # "left half" of tensor args
209+
spargsr = tuple(Iterators.take(spargseq, nargsr)...) # "right half" of tensor args
210+
dargsl = tuple(Iterators.take(dargseq, nargsl)...) # "left half" of tensor args, densified
211+
dargsr = tuple(Iterators.take(dargseq, nargsr)...) # "right half" of tensor args, densified
212+
for (sparseargs, denseargs) in ( # argument combinations including scalars
213+
# a few combinations involving one scalar
214+
((s, spargsl..., spargsr...), (s, dargsl..., dargsr...)),
215+
((spargsl..., s, spargsr...), (dargsl..., s, dargsr...)),
216+
((spargsl..., spargsr..., s), (dargsl..., dargsr..., s)),
217+
# a few combinations involving two scalars
218+
((s, spargsl..., s, spargsr...), (s, dargsl..., s, dargsr...)),
219+
((s, spargsl..., spargsr..., s), (s, dargsl..., dargsr..., s)),
220+
((spargsl..., s, spargsr..., s), (dargsl..., s, dargsr..., s)),
221+
((s, s, spargsl..., spargsr...), (s, s, dargsl..., dargsr...)),
222+
((spargsl..., s, s, spargsr...), (dargsl..., s, s, dargsr...)),
223+
((spargsl..., spargsr..., s, s), (dargsl..., dargsr..., s, s)),
224+
# a few combinations involving three scalars
225+
((s, spargsl..., s, spargsr..., s), (s, dargsl..., s, dargsr..., s)),
226+
((s, spargsl..., s, s, spargsr...), (s, dargsl..., s, s, dargsr...)),
227+
((spargsl..., s, s, spargsr..., s), (dargsl..., s, s, dargsr..., s)),
228+
((spargsl..., s, s, s, spargsr...), (dargsl..., s, s, s, dargsr...)), )
229+
@test broadcast(*, sparseargs...) == sparse(broadcast(*, denseargs...))
230+
@test isa(@inferred(broadcast(*, sparseargs...)), SparseMatrixCSC{elT})
231+
end
232+
end
233+
# test combinations at the limit of inference (eight arguments net)
234+
for (sparseargs, denseargs) in (
235+
((s, s, s, A, s, s, s, s), (s, s, s, fA, s, s, s, s)), # seven scalars, one sparse matrix
236+
((s, s, V, s, s, A, s, s), (s, s, fV, s, s, fA, s, s)), # six scalars, two sparse vectors/matrices
237+
((s, s, V, s, A, s, V, s), (s, s, fV, s, fA, s, fV, s)), # five scalars, three sparse vectors/matrices
238+
((s, V, s, A, s, V, s, A), (s, fV, s, fA, s, fV, s, fA)), # four scalars, four sparse vectors/matrices
239+
((s, V, A, s, V, A, s, A), (s, fV, fA, s, fV, fA, s, fA)), # three scalars, five sparse vectors/matrices
240+
((V, A, V, s, A, V, A, s), (fV, fA, fV, s, fA, fV, fA, s)), # two scalars, six sparse vectors/matrices
241+
((V, A, V, A, s, V, A, V), (fV, fA, fV, fA, s, fV, fA, fV)) ) # one scalar, seven sparse vectors/matrices
242+
@test broadcast(*, sparseargs...) == sparse(broadcast(*, denseargs...))
243+
@test isa(@inferred(broadcast(*, sparseargs...)), SparseMatrixCSC{elT})
244+
end
245+
end
246+
196247
# Older tests of sparse broadcast, now largely covered by the tests above
197248
@testset "assorted tests of sparse broadcast over two input arguments" begin
198249
N, p = 10, 0.3

0 commit comments

Comments
 (0)