Skip to content

Commit b9cc65b

Browse files
committed
Test sparse broadcast (non-!) over combinations of broadcast scalars and sparse vectors/matrices.
1 parent 9820ced commit b9cc65b

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
@@ -202,6 +202,57 @@ end
202202
@test broadcast(stringorfloatzero, speye(4)) == sparse(broadcast(stringorfloatzero, eye(4)))
203203
end
204204

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

0 commit comments

Comments
 (0)