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,19 @@ 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
+ @inline function broadcast! (f:: Tf , dest:: SparseVecOrMat , :: Nothing , 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
116
121
end
122
+
117
123
# the following three similar defs are necessary for type stability in the mixed vector/matrix case
118
124
broadcast (f:: Tf , A:: SparseVector , Bs:: Vararg{SparseVector,N} ) where {Tf,N} =
119
125
_aresameshape (A, Bs... ) ? _noshapecheck_map (f, A, Bs... ) : _diffshape_broadcast (f, A, Bs... )
@@ -1006,26 +1012,26 @@ Broadcast.BroadcastStyle(::SparseMatStyle, ::Broadcast.DefaultArrayStyle{N}) whe
1006
1012
broadcast (f, :: PromoteToSparse , :: Nothing , :: Nothing , As:: Vararg{Any,N} ) where {N} =
1007
1013
broadcast (f, map (_sparsifystructured, As)... )
1008
1014
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
1015
# For broadcast! with ::Any inputs, we need a layer of indirection to determine whether
1016
1016
# the inputs can be promoted to SparseVecOrMat. If it's just SparseVecOrMat and scalars,
1017
1017
# 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
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... )
1021
+ fofzeros = f (_zeros_eltypes (A, Bs... )... )
1022
+ fpreszeros = _iszero (fofzeros)
1023
+ return fpreszeros ? _broadcast_zeropres! (f, C, A, Bs... ) :
1024
+ _broadcast_notzeropres! (f, fofzeros, C, A, Bs... )
1025
+ end
1026
+ function spbroadcast_args! (f:: Tf , dest, :: SPVM , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1021
1027
# mixedsrcargs contains nothing but SparseVecOrMat and scalars
1022
1028
parevalf, passedsrcargstup = capturescalars (f, mixedsrcargs)
1023
1029
return broadcast! (parevalf, dest, passedsrcargstup... )
1024
1030
end
1025
- function spbroadcast_args! (f, dest, :: PromoteToSparse , mixedsrcargs:: Vararg{Any,N} ) where N
1031
+ function spbroadcast_args! (f:: Tf , dest, :: PromoteToSparse , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1026
1032
broadcast! (f, dest, map (_sparsifystructured, mixedsrcargs)... )
1027
1033
end
1028
- function spbroadcast_args! (f, dest, :: Any , mixedsrcargs:: Vararg{Any,N} ) where N
1034
+ function spbroadcast_args! (f:: Tf , dest, :: Any , mixedsrcargs:: Vararg{Any,N} ) where {Tf,N}
1029
1035
# Fallback. From a performance perspective would it be best to densify?
1030
1036
Broadcast. _broadcast! (f, dest, mixedsrcargs... )
1031
1037
end
0 commit comments