@@ -107,18 +107,6 @@ broadcast(f::Tf, A::SparseMatrixCSC) where {Tf} = _noshapecheck_map(f, A)
107
107
end
108
108
return C
109
109
end
110
- @inline function broadcast! (f:: Tf , dest:: SparseVecOrMat , :: Void , As:: Vararg{Any,N} ) where {Tf,N}
111
- if f isa typeof (identity) && N == 1
112
- A = As[1 ]
113
- if A isa Number
114
- return fill! (dest, A)
115
- elseif A isa AbstractArray && Base. axes (dest) == Base. axes (A)
116
- return copyto! (dest, A)
117
- end
118
- end
119
- spbroadcast_args! (f, dest, Broadcast. combine_styles (As... ), As... )
120
- return dest
121
- end
122
110
123
111
# the following three similar defs are necessary for type stability in the mixed vector/matrix case
124
112
broadcast (f:: Tf , A:: SparseVector , Bs:: Vararg{SparseVector,N} ) where {Tf,N} =
@@ -1015,25 +1003,27 @@ broadcast(f, ::PromoteToSparse, ::Void, ::Void, As::Vararg{Any,N}) where {N} =
1015
1003
# For broadcast! with ::Any inputs, we need a layer of indirection to determine whether
1016
1004
# the inputs can be promoted to SparseVecOrMat. If it's just SparseVecOrMat and scalars,
1017
1005
# we can handle it here, otherwise see below for the promotion machinery.
1018
- function spbroadcast_args! (f:: Tf , C, :: SPVM , A:: SparseVecOrMat , Bs:: Vararg{SparseVecOrMat,N} ) where {Tf,N}
1019
- _aresameshape (C, A, Bs... ) && return _noshapecheck_map! (f, C, A, Bs... )
1020
- Base. Broadcast. check_broadcast_indices (axes (C), A, Bs... )
1006
+ function broadcast! (f:: Tf , dest:: SparseVecOrMat , :: SPVM , A:: SparseVecOrMat , Bs:: Vararg{SparseVecOrMat,N} ) where {Tf,N}
1007
+ if f isa typeof (identity) && N == 0 && Base. axes (dest) == Base. axes (A)
1008
+ return copyto! (dest, A)
1009
+ end
1010
+ _aresameshape (dest, A, Bs... ) && return _noshapecheck_map! (f, dest, A, Bs... )
1011
+ Base. Broadcast. check_broadcast_indices (axes (dest), A, Bs... )
1021
1012
fofzeros = f (_zeros_eltypes (A, Bs... )... )
1022
1013
fpreszeros = _iszero (fofzeros)
1023
- return fpreszeros ? _broadcast_zeropres! (f, C, A, Bs... ) :
1024
- _broadcast_notzeropres! (f, fofzeros, C, A, Bs... )
1014
+ fpreszeros ? _broadcast_zeropres! (f, dest, A, Bs... ) :
1015
+ _broadcast_notzeropres! (f, fofzeros, dest, A, Bs... )
1016
+ return dest
1025
1017
end
1026
- function spbroadcast_args ! (f:: Tf , dest, :: SPVM , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1018
+ function broadcast ! (f:: Tf , dest:: SparseVecOrMat , :: SPVM , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1027
1019
# mixedsrcargs contains nothing but SparseVecOrMat and scalars
1028
1020
parevalf, passedsrcargstup = capturescalars (f, mixedsrcargs)
1029
- return broadcast! (parevalf, dest, passedsrcargstup... )
1030
- end
1031
- function spbroadcast_args! (f:: Tf , dest, :: PromoteToSparse , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1032
- broadcast! (f, dest, map (_sparsifystructured, mixedsrcargs)... )
1021
+ broadcast! (parevalf, dest, nothing , passedsrcargstup... )
1022
+ return dest
1033
1023
end
1034
- function spbroadcast_args ! (f:: Tf , dest, :: Any , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1035
- # Fallback. From a performance perspective would it be best to densify?
1036
- Broadcast . _broadcast! (f, dest, mixedsrcargs ... )
1024
+ function broadcast ! (f:: Tf , dest:: SparseVecOrMat , :: PromoteToSparse , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1025
+ broadcast! (f, dest, nothing , map (_sparsifystructured, mixedsrcargs) ... )
1026
+ return dest
1037
1027
end
1038
1028
1039
1029
_sparsifystructured (M:: AbstractMatrix ) = SparseMatrixCSC (M)
0 commit comments