-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathLowRankPertOperator.jl
More file actions
78 lines (54 loc) · 2.66 KB
/
LowRankPertOperator.jl
File metadata and controls
78 lines (54 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
struct LowRankPertOperator{OO,LR,T} <: Operator{T}
op::OO
pert::LR
function LowRankPertOperator{OO,LR,T}(a::OO,b::LR) where {OO,LR,T}
@assert domainspace(a)==domainspace(b)
@assert rangespace(a)==rangespace(b)
new{OO,LR,T}(a,b)
end
end
function LowRankPertOperator(Bin::Operator,Lin::LowRankOperator)
B,L2=promotedomainspace([Bin,Lin])
rsp=rangespace(B) # use rangespace of B because LowRankOperator only
# needs convert, and its unlikely that the rangespaces
# will be inferred from L
L=promoterangespace(L2,rsp)
LowRankPertOperator{typeof(B),typeof(L),promote_type(eltype(L),eltype(B))}(B,L)
end
function LowRankPertOperator{OO,LR,T}(L::LowRankPertOperator) where {OO,LR,T}
LowRankPertOperator{OO,LR,T}(strictconvert(OO, L.op), strictconvert(LR, L.pert))
end
function Operator{T}(L::LowRankPertOperator) where {T}
LowRankPertOperator(Operator{T}(L.op),Operator{T}(L.pert))
end
convert(::Type{Operator},V::AbstractVector{OT}) where {OT<:Operator}=LowRankPertOperator(V)
Base.getindex(L::LowRankPertOperator,k::Integer,j::Integer)=L.op[k,j]+L.pert[k,j]
domainspace(L::LowRankPertOperator)=domainspace(L.op)
rangespace(L::LowRankPertOperator)=rangespace(L.op)
datasize(L::LowRankPertOperator,k...)=datasize(L.pert,k...)
israggedbelow(P::LowRankPertOperator) = israggedbelow(P.op) && israggedbelow(P.pert)
bandwidths(P::LowRankPertOperator) = bandwidth(P.op,1)+bandwidth(P.pert,1) , bandwidth(P.op,2)+bandwidth(P.pert,2)
colstop(L::LowRankPertOperator,k::Integer) = max(colstop(L.op,k),colstop(L.pert,k))
for OP in (:promotedomainspace,:promoterangespace)
@eval $OP(L::LowRankPertOperator,sp::Space)=LowRankPertOperator($OP(L.op,sp),$OP(L.pert,sp))
end
## algebra
for OP in (:+,:-)
@eval $OP(A::LowRankPertOperator,B::LowRankPertOperator) =
LowRankPertOperator($OP(A.op,B.op),$OP(A.pert,B.pert))
end
*(L::LowRankPertOperator,f::Fun)=L.op*f+L.pert*f
*(L::LowRankPertOperator,B::LowRankOperator)=L.op*B+L.pert*B
*(B::LowRankOperator,L::LowRankPertOperator)=B*L.op+B*L.pert
*(A::LowRankPertOperator,B::LowRankPertOperator)=A.op*B + A.pert*B
# ambiguity
for TYP in (:TimesOperator,:ZeroOperator,:PlusOperator,:Conversion,:Operator)
@eval begin
+(L::LowRankOperator,B::$TYP) = LowRankPertOperator(B,L)
+(B::$TYP,L::LowRankOperator) = LowRankPertOperator(B,L)
-(L::LowRankOperator,B::$TYP)=LowRankPertOperator(-B,L)
-(B::$TYP,L::LowRankOperator)=LowRankPertOperator(B,-L)
*(L::LowRankPertOperator,B::$TYP)=LowRankPertOperator(L.op*B,L.pert*B)
*(B::$TYP,L::LowRankPertOperator)=LowRankPertOperator(B*L.op,B*L.pert)
end
end