Skip to content

Commit 0675cfa

Browse files
authored
Resolve Hessenberg ambiguity (#1354)
This cherry-picks 3c19c34 from #1349, which makes this easier to backport
1 parent 3393398 commit 0675cfa

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

src/hessenberg.jl

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,28 +177,35 @@ function \(U::UnitUpperTriangular, H::UpperHessenberg)
177177
UpperHessenberg(HH)
178178
end
179179

180-
function (\)(H::Union{UpperHessenberg,AdjOrTrans{<:Any,<:UpperHessenberg}}, B::AbstractVecOrMat)
180+
AdjUpperHessenberg{T,S<:UpperHessenberg{T}} = Adjoint{T, S}
181+
TransUpperHessenberg{T,S<:UpperHessenberg{T}} = Transpose{T, S}
182+
AdjOrTransUpperHessenberg{T,S<:UpperHessenberg{T}} = AdjOrTrans{T, S}
183+
184+
function (\)(H::Union{UpperHessenberg,AdjOrTransUpperHessenberg}, B::AbstractVecOrMat)
181185
TFB = typeof(oneunit(eltype(H)) \ oneunit(eltype(B)))
182186
return ldiv!(H, copy_similar(B, TFB))
183187
end
184188

185-
function (/)(B::AbstractMatrix, H::Union{UpperHessenberg,AdjOrTrans{<:Any,<:UpperHessenberg}})
189+
(/)(B::AbstractMatrix, H::UpperHessenberg) = _rdiv(B, H)
190+
(/)(B::AbstractMatrix, H::AdjUpperHessenberg) = _rdiv(B, H)
191+
(/)(B::AbstractMatrix, H::TransUpperHessenberg) = _rdiv(B, H)
192+
function _rdiv(B, H)
186193
TFB = typeof(oneunit(eltype(B)) / oneunit(eltype(H)))
187194
return rdiv!(copy_similar(B, TFB), H)
188195
end
189196

190-
ldiv!(H::AdjOrTrans{<:Any,<:UpperHessenberg}, B::AbstractVecOrMat) =
197+
ldiv!(H::AdjOrTransUpperHessenberg, B::AbstractVecOrMat) =
191198
(rdiv!(wrapperop(H)(B), parent(H)); B)
192-
rdiv!(B::AbstractVecOrMat, H::AdjOrTrans{<:Any,<:UpperHessenberg}) =
199+
rdiv!(B::AbstractVecOrMat, H::AdjOrTransUpperHessenberg) =
193200
(ldiv!(parent(H), wrapperop(H)(B)); B)
194201

195202
# fix method ambiguities for right division, from adjtrans.jl:
196203
/(u::AdjointAbsVec, A::UpperHessenberg) = adjoint(adjoint(A) \ u.parent)
197204
/(u::TransposeAbsVec, A::UpperHessenberg) = transpose(transpose(A) \ u.parent)
198-
/(u::AdjointAbsVec, A::Adjoint{<:Any,<:UpperHessenberg}) = adjoint(adjoint(A) \ u.parent)
199-
/(u::TransposeAbsVec, A::Transpose{<:Any,<:UpperHessenberg}) = transpose(transpose(A) \ u.parent)
200-
/(u::AdjointAbsVec, A::Transpose{<:Any,<:UpperHessenberg}) = adjoint(conj(A.parent) \ u.parent) # technically should be adjoint(copy(adjoint(copy(A))) \ u.parent)
201-
/(u::TransposeAbsVec, A::Adjoint{<:Any,<:UpperHessenberg}) = transpose(conj(A.parent) \ u.parent)
205+
/(u::AdjointAbsVec, A::AdjUpperHessenberg) = adjoint(adjoint(A) \ u.parent)
206+
/(u::TransposeAbsVec, A::TransUpperHessenberg) = transpose(transpose(A) \ u.parent)
207+
/(u::AdjointAbsVec, A::TransUpperHessenberg) = adjoint(conj(A.parent) \ u.parent) # technically should be adjoint(copy(adjoint(copy(A))) \ u.parent)
208+
/(u::TransposeAbsVec, A::AdjUpperHessenberg) = transpose(conj(A.parent) \ u.parent)
202209

203210
# Solving (H+µI)x = b: we can do this in O(m²) time and O(m) memory
204211
# (in-place in x) by the RQ algorithm from:

0 commit comments

Comments
 (0)