@@ -48,20 +48,20 @@ function ZeroPreserving(f, T::Type, Ts::Type...)
48
48
return NonPreserving (f)
49
49
end
50
50
end
51
+ ZeroPreserving (f:: ZeroPreserving , T:: Type , Ts:: Type... ) = f
51
52
52
- const _WEAK_FUNCTIONS = (:+ , :- )
53
- for f in _WEAK_FUNCTIONS
53
+ for F in (:(typeof (+ )), :(typeof (- )), :(typeof (identity)))
54
54
@eval begin
55
- ZeroPreserving (:: typeof ( $ f) , :: Type{<:Number} , :: Type{<:Number} ...) = WeakPreserving ($ f)
55
+ ZeroPreserving (f :: $F , :: Type , :: Type... ) = WeakPreserving (f)
56
56
end
57
57
end
58
58
59
- const _STRONG_FUNCTIONS = (: * ,)
60
- for f in _STRONG_FUNCTIONS
59
+ using MapBroadcast : MapFunction
60
+ for F in (:( typeof ( * )), :(MapFunction{ typeof ( * )}))
61
61
@eval begin
62
- ZeroPreserving (:: typeof ( $ f) , :: Type{<:Number} , :: Type{<:Number} ...) = StrongPreserving (
63
- $ f
64
- )
62
+ function ZeroPreserving (f :: $F , :: Type , :: Type... )
63
+ return StrongPreserving (f)
64
+ end
65
65
end
66
66
end
67
67
71
71
f, A:: AbstractArray , Bs:: AbstractArray...
72
72
)
73
73
f_pres = ZeroPreserving (f, A, Bs... )
74
- return @interface I map (f_pres, A, Bs... )
74
+ return map_sparsearray (f_pres, A, Bs... )
75
75
end
76
- @interface I :: AbstractSparseArrayInterface function Base . map (
77
- f :: ZeroPreserving , A :: AbstractArray , Bs :: AbstractArray...
78
- )
76
+
77
+ # This isn't an overload of `Base.map` since that leads to ambiguity errors.
78
+ function map_sparsearray (f :: ZeroPreserving , A :: AbstractArray , Bs :: AbstractArray... )
79
79
T = Base. Broadcast. combine_eltypes (f. f, (A, Bs... ))
80
- C = similar (I, T, size (A))
81
- return @interface I map! (f, C, A, Bs... )
80
+ C = similar (A, T)
81
+ # TODO : Instead use:
82
+ # U = map(f.f, map(unstored, (A, Bs...))...)
83
+ # C = similar(A, Unstored(U))
84
+ return map_sparsearray! (f, C, A, Bs... )
82
85
end
83
86
84
87
@interface I:: AbstractSparseArrayInterface function Base. map! (
85
88
f, C:: AbstractArray , A:: AbstractArray , Bs:: AbstractArray...
86
89
)
87
90
f_pres = ZeroPreserving (f, A, Bs... )
88
- return @interface I map ! (f_pres, C, A, Bs... )
91
+ return map_sparsearray ! (f_pres, C, A, Bs... )
89
92
end
90
93
91
- @interface :: AbstractSparseArrayInterface function Base. map! (
94
+ # This isn't an overload of `Base.map!` since that leads to ambiguity errors.
95
+ function map_sparsearray! (
92
96
f:: ZeroPreserving , C:: AbstractArray , A:: AbstractArray , Bs:: AbstractArray...
93
97
)
94
98
checkshape (C, A, Bs... )
95
99
unaliased = map (Base. Fix1 (Base. unalias, C), (A, Bs... ))
96
-
97
100
if f isa StrongPreserving
98
101
style = IndexStyle (C, unaliased... )
99
102
inds = intersect (eachstoredindex .(Ref (style), unaliased)... )
@@ -107,19 +110,20 @@ end
107
110
else
108
111
error (lazy " unknown zero-preserving type $(typeof(f))" )
109
112
end
110
-
111
113
@inbounds for I in inds
112
114
C[I] = f. f (ith_all (I, unaliased)... )
113
115
end
114
-
115
116
return C
116
117
end
117
118
118
119
# Derived functions
119
120
# -----------------
120
- @interface I:: AbstractSparseArrayInterface Base. copyto! (C :: AbstractArray , A :: AbstractArray ) = @interface I map ! (
121
- identity, C, A
121
+ @interface I:: AbstractSparseArrayInterface function Base. copyto! (
122
+ dest :: AbstractArray , src :: AbstractArray
122
123
)
124
+ @interface I map! (identity, dest, src)
125
+ return dest
126
+ end
123
127
124
128
# Only map the stored values of the inputs.
125
129
function map_stored! end
0 commit comments