Skip to content

Commit 4ad06cf

Browse files
committed
draft for fillmap
1 parent fafa4cc commit 4ad06cf

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/fillmap.jl

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
struct FillMap{T} <: LinearMaps.LinearMap{T}
2+
value::T
3+
size::Dims{2}
4+
end
5+
6+
# properties
7+
Base.size(A::FillMap) = A.size
8+
MulStyle(A::FillMap) = FiveArg()
9+
LinearAlgebra.issymmetric(A::FillMap) = A.size[1] == A.size[2]
10+
LinearAlgebra.ishermitian(A::FillMap) = isreal(A) && A.size[1] == A.size[2]
11+
LinearAlgebra.isposdef(A::FillMap) = false
12+
Base.:(==)(A::FillMap, B::FillMap) = A.value == B.value && A.size == B.size
13+
14+
LinearAlgebra.adjoint(A::FillMap) = FillMap(adjoint(value), revert(A.size))
15+
LinearAlgebra.transpose(A::FillMap) = FillMap(transpose(value), revert(A.size))
16+
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
26+
end
27+
28+
Base.@propagate_inbounds function mul!(y::AbstractVecOrMat, A::FillMap, x::AbstractVector, α::Number, β::Number)
29+
@boundscheck checkbounds(y, A, x)
30+
if iszero(α)
31+
!isone(β) && rmul!(y, β)
32+
return y
33+
else
34+
temp = sum(x)*α
35+
if iszero(β)
36+
y .+= temp
37+
elseif isone(β)
38+
y .= y .+ temp
39+
else
40+
y .= y.*β .+ temp
41+
end
42+
return y
43+
end
44+
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))
53+
54+
function Base.:(*)(A::FillMap, B::FillMap)
55+
mA, nA = size(A)
56+
mB, nB = size(B)
57+
nA != mB && throw(DimensionMismatch())
58+
return FillMap(A.value*B.value*nA, (mA, nB))
59+
end

0 commit comments

Comments
 (0)