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
+ function broadcast! (f:: Tf , C:: SparseVecOrMat , :: Void ) 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,13 @@ 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... )
110
+ function broadcast! (f, dest:: SparseVecOrMat , :: Void , A, Bs:: Vararg{Any,N} ) where N
111
+ if isa (f, typeof (identity)) && N == 0 && isa (A, Number)
112
+ return fill! (dest, A)
113
+ end
114
+ return spbroadcast_args! (f, dest, Broadcast. combine_styles (A, Bs... ), A, Bs... )
116
115
end
116
+
117
117
# the following three similar defs are necessary for type stability in the mixed vector/matrix case
118
118
broadcast (f:: Tf , A:: SparseVector , Bs:: Vararg{SparseVector,N} ) where {Tf,N} =
119
119
_aresameshape (A, Bs... ) ? _noshapecheck_map (f, A, Bs... ) : _diffshape_broadcast (f, A, Bs... )
@@ -1005,18 +1005,18 @@ Broadcast.BroadcastStyle(::SparseMatStyle, ::Broadcast.DefaultArrayStyle{N}) whe
1005
1005
broadcast (f, :: PromoteToSparse , :: Void , :: Void , As:: Vararg{Any,N} ) where {N} =
1006
1006
broadcast (f, map (_sparsifystructured, As)... )
1007
1007
1008
- # ambiguity resolution
1009
- broadcast! (:: typeof (identity), dest:: SparseVecOrMat , x:: Number ) =
1010
- fill! (dest, x)
1011
- broadcast! (f, dest:: SparseVecOrMat , x:: Number... ) =
1012
- spbroadcast_args! (f, dest, SPVM, x... )
1013
-
1014
1008
# For broadcast! with ::Any inputs, we need a layer of indirection to determine whether
1015
1009
# the inputs can be promoted to SparseVecOrMat. If it's just SparseVecOrMat and scalars,
1016
1010
# we can handle it here, otherwise see below for the promotion machinery.
1017
- broadcast! (f, dest:: SparseVecOrMat , mixedsrcargs:: Vararg{Any,N} ) where N =
1018
- spbroadcast_args! (f, dest, Broadcast. combine_styles (mixedsrcargs... ), mixedsrcargs... )
1019
- function spbroadcast_args! (f, dest, :: Type{SPVM} , mixedsrcargs:: Vararg{Any,N} ) where N
1011
+ function spbroadcast_args! (f:: Tf , C, :: SPVM , A:: SparseVecOrMat , Bs:: Vararg{SparseVecOrMat,N} ) where {Tf,N}
1012
+ _aresameshape (C, A, Bs... ) && return _noshapecheck_map! (f, C, A, Bs... )
1013
+ Base. Broadcast. check_broadcast_indices (axes (C), A, Bs... )
1014
+ fofzeros = f (_zeros_eltypes (A, Bs... )... )
1015
+ fpreszeros = _iszero (fofzeros)
1016
+ return fpreszeros ? _broadcast_zeropres! (f, C, A, Bs... ) :
1017
+ _broadcast_notzeropres! (f, fofzeros, C, A, Bs... )
1018
+ end
1019
+ function spbroadcast_args! (f, dest, :: SPVM , mixedsrcargs:: Vararg{Any,N} ) where N
1020
1020
# mixedsrcargs contains nothing but SparseVecOrMat and scalars
1021
1021
parevalf, passedsrcargstup = capturescalars (f, mixedsrcargs)
1022
1022
return broadcast! (parevalf, dest, passedsrcargstup... )
0 commit comments