Skip to content

Commit 18df7c5

Browse files
committed
Test sparse broadcast (non-!) over combinations of broadcast scalars and sparse vectors/matrices.
1 parent 422410f commit 18df7c5

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
@@ -179,6 +179,57 @@ end
179179
end
180180
end
181181

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

0 commit comments

Comments
 (0)