93
93
# (3) broadcast[!] entry points
94
94
broadcast (f:: Tf , A:: SparseVector ) where {Tf} = _noshapecheck_map (f, A)
95
95
broadcast (f:: Tf , A:: SparseMatrixCSC ) where {Tf} = _noshapecheck_map (f, A)
96
- function broadcast! (f:: Tf , C:: SparseVecOrMat ) where Tf
96
+
97
+ @inline function broadcast! (f:: Tf , C:: SparseVecOrMat , :: Nothing ) where Tf
97
98
isempty (C) && return _finishempty! (C)
98
99
fofnoargs = f ()
99
100
if _iszero (fofnoargs) # f() is zero, so empty C
@@ -106,14 +107,7 @@ function broadcast!(f::Tf, C::SparseVecOrMat) where Tf
106
107
end
107
108
return C
108
109
end
109
- function broadcast! (f:: Tf , C:: SparseVecOrMat , A:: SparseVecOrMat , Bs:: Vararg{SparseVecOrMat,N} ) where {Tf,N}
110
- _aresameshape (C, A, Bs... ) && return _noshapecheck_map! (f, C, A, Bs... )
111
- Base. Broadcast. check_broadcast_indices (axes (C), A, Bs... )
112
- fofzeros = f (_zeros_eltypes (A, Bs... )... )
113
- fpreszeros = _iszero (fofzeros)
114
- return fpreszeros ? _broadcast_zeropres! (f, C, A, Bs... ) :
115
- _broadcast_notzeropres! (f, fofzeros, C, A, Bs... )
116
- end
110
+
117
111
# the following three similar defs are necessary for type stability in the mixed vector/matrix case
118
112
broadcast (f:: Tf , A:: SparseVector , Bs:: Vararg{SparseVector,N} ) where {Tf,N} =
119
113
_aresameshape (A, Bs... ) ? _noshapecheck_map (f, A, Bs... ) : _diffshape_broadcast (f, A, Bs... )
@@ -1006,28 +1000,30 @@ Broadcast.BroadcastStyle(::SparseMatStyle, ::Broadcast.DefaultArrayStyle{N}) whe
1006
1000
broadcast (f, :: PromoteToSparse , :: Nothing , :: Nothing , As:: Vararg{Any,N} ) where {N} =
1007
1001
broadcast (f, map (_sparsifystructured, As)... )
1008
1002
1009
- # ambiguity resolution
1010
- broadcast! (:: typeof (identity), dest:: SparseVecOrMat , x:: Number ) =
1011
- fill! (dest, x)
1012
- broadcast! (f, dest:: SparseVecOrMat , x:: Number... ) =
1013
- spbroadcast_args! (f, dest, SPVM, x... )
1014
-
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
- broadcast! (f, dest:: SparseVecOrMat , mixedsrcargs:: Vararg{Any,N} ) where N =
1019
- spbroadcast_args! (f, dest, Broadcast. combine_styles (mixedsrcargs... ), mixedsrcargs... )
1020
- function spbroadcast_args! (f, dest, :: Type{SPVM} , mixedsrcargs:: Vararg{Any,N} ) where N
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... )
1012
+ fofzeros = f (_zeros_eltypes (A, Bs... )... )
1013
+ fpreszeros = _iszero (fofzeros)
1014
+ fpreszeros ? _broadcast_zeropres! (f, dest, A, Bs... ) :
1015
+ _broadcast_notzeropres! (f, fofzeros, dest, A, Bs... )
1016
+ return dest
1017
+ end
1018
+ function broadcast! (f:: Tf , dest:: SparseVecOrMat , :: SPVM , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1021
1019
# mixedsrcargs contains nothing but SparseVecOrMat and scalars
1022
1020
parevalf, passedsrcargstup = capturescalars (f, mixedsrcargs)
1023
- return broadcast! (parevalf, dest, passedsrcargstup... )
1024
- end
1025
- function spbroadcast_args! (f, dest, :: PromoteToSparse , mixedsrcargs:: Vararg{Any,N} ) where N
1026
- broadcast! (f, dest, map (_sparsifystructured, mixedsrcargs)... )
1021
+ broadcast! (parevalf, dest, nothing , passedsrcargstup... )
1022
+ return dest
1027
1023
end
1028
- function spbroadcast_args ! (f, dest, :: Any , mixedsrcargs:: Vararg{Any,N} ) where N
1029
- # Fallback. From a performance perspective would it be best to densify?
1030
- 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
1031
1027
end
1032
1028
1033
1029
_sparsifystructured (M:: AbstractMatrix ) = SparseMatrixCSC (M)
0 commit comments