11struct FillMap{T} <: LinearMaps.LinearMap{T}
2- value :: T
2+ λ :: T
33 size:: Dims{2}
44end
55
@@ -9,51 +9,39 @@ MulStyle(A::FillMap) = FiveArg()
99LinearAlgebra. issymmetric (A:: FillMap ) = A. size[1 ] == A. size[2 ]
1010LinearAlgebra. ishermitian (A:: FillMap ) = isreal (A) && A. size[1 ] == A. size[2 ]
1111LinearAlgebra. isposdef (A:: FillMap ) = false
12- Base.:(== )(A:: FillMap , B:: FillMap ) = A. value == B. value && A. size == B. size
12+ Base.:(== )(A:: FillMap , B:: FillMap ) = A. λ == B. λ && A. size == B. size
1313
14- LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (value ), revert (A. size))
15- LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (value ), revert (A. size))
14+ LinearAlgebra. adjoint (A:: FillMap ) = FillMap (adjoint (A . λ ), revert (A. size))
15+ LinearAlgebra. transpose (A:: FillMap ) = FillMap (transpose (A . λ ), revert (A. size))
1616
17- function LinearMaps. A_mul_B! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
18- checkbounds (y, A, x)
19- if iszero (A. value)
20- fill! (y, zero (eltype (y)))
21- else
22- temp = sum (x)
23- fill! (y, A. value* temp)
24- end
25- return y
17+ function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector )
18+ return fill! (y, iszero (A. λ) ? zero (eltype (y)) : A. λ* sum (x))
2619end
2720
28- Base. @propagate_inbounds function mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector , α:: Number , β:: Number )
29- @boundscheck checkbounds (y, A, x)
21+ function _unsafe_mul! (y:: AbstractVecOrMat , A:: FillMap , x:: AbstractVector , α:: Number , β:: Number )
3022 if iszero (α)
3123 ! isone (β) && rmul! (y, β)
3224 return y
3325 else
34- temp = sum (x)* α
26+ temp = A . λ * sum (x) * α
3527 if iszero (β)
36- y .+ = temp
28+ y .= temp
3729 elseif isone (β)
38- y .= y .+ temp
30+ y .+ = temp
3931 else
40- y .= y.* β .+ temp
32+ y .= y .* β .+ temp
4133 end
4234 return y
4335end
4436
45- Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. value + B. value, A. size) : throw (DimensionMismatch ())
46- Base.:(- )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. value - B. value, A. size) : throw (DimensionMismatch ())
47- Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ* A. value, size (A))
48- Base.:(* )(A:: FillMap , λ:: Number ) = FillMap (A. value* λ, size (A))
49- Base.:(* )(J:: UniformScaling , A:: FillMap ) = FillMap (J. λ* A. value, size (A))
50- Base.:(* )(A:: FillMap , J:: UniformScaling ) = FillMap (A. value* J. λ, size (A))
51- Base.:(* )(J:: LinearMaps.UniformScalingMap , A:: FillMap ) = FillMap (J. λ* A. value, size (A))
52- Base.:(* )(A:: FillMap , J:: LinearMaps.UniformScalingMap ) = FillMap (A. value* J. λ, size (A))
37+ Base.:(+ )(A:: FillMap , B:: FillMap ) = A. size == B. size ? FillMap (A. λ + B. λ, A. size) : throw (DimensionMismatch ())
38+ Base.:(- )(A:: FillMap ) = FillMap (- A. λ, A. size)
39+ Base.:(* )(λ:: Number , A:: FillMap ) = FillMap (λ * A. λ, size (A))
40+ Base.:(* )(A:: FillMap , λ:: Number ) = FillMap (A. λ * λ, size (A))
5341
5442function Base.:(* )(A:: FillMap , B:: FillMap )
5543 mA, nA = size (A)
5644 mB, nB = size (B)
5745 nA != mB && throw (DimensionMismatch ())
58- return FillMap (A. value * B. value * nA, (mA, nB))
46+ return FillMap (A. λ * B. λ * nA, (mA, nB))
5947end
0 commit comments