Skip to content

Commit

Permalink
Merge pull request #389 from vpuri3/deo
Browse files Browse the repository at this point in the history
Fix method ambiguities in diffeqoperators
  • Loading branch information
ChrisRackauckas authored Feb 11, 2023
2 parents 1f80699 + e7a5ce8 commit d57a62b
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/operators/diffeq_operator.jl
Original file line number Diff line number Diff line change
Expand Up @@ -107,34 +107,63 @@ function Base.convert(::Type{AbstractMatrix}, L::DiffEqScaledOperator)
L.coeff * convert(AbstractMatrix, L.op)
end

Base.size(L::DiffEqScaledOperator, i::Integer) = size(L.op, i)
Base.size(L::DiffEqScaledOperator, args...) = size(L.op, args...)
LinearAlgebra.opnorm(L::DiffEqScaledOperator, p::Real = 2) = abs(L.coeff) * opnorm(L.op, p)
Base.getindex(L::DiffEqScaledOperator, i::Int) = L.coeff * L.op[i]
Base.getindex(L::DiffEqScaledOperator, I::Vararg{Int, N}) where {N} = L.coeff * L.op[I...]

Base.:*(L::DiffEqScaledOperator, x::AbstractVecOrMat) = L.coeff * (L.op * x)
Base.:*(L::DiffEqScaledOperator, x::AbstractArray) = L.coeff * (L.op * x)

Base.:*(x::AbstractVecOrMat, L::DiffEqScaledOperator) = (x * L.op) * L.coeff
Base.:*(x::AbstractArray, L::DiffEqScaledOperator) = (x * L.op) * L.coeff

function LinearAlgebra.mul!(r::AbstractVecOrMat, L::DiffEqScaledOperator, x::AbstractVecOrMat)
mul!(r, L.op, x)
r .= r * L.coeff
end
function LinearAlgebra.mul!(r::AbstractArray, L::DiffEqScaledOperator, x::AbstractArray)
mul!(r, L.op, x)
r .= r * L.coeff
end

function LinearAlgebra.mul!(r::AbstractVecOrMat, x::AbstractVecOrMat, L::DiffEqScaledOperator)
mul!(r, x, L.op)
r .= r * L.coeff
end
function LinearAlgebra.mul!(r::AbstractArray, x::AbstractArray, L::DiffEqScaledOperator)
mul!(r, x, L.op)
r .= r * L.coeff
end

Base.:/(L::DiffEqScaledOperator, x::AbstractVecOrMat) = L.coeff * (L.op / x)
Base.:/(L::DiffEqScaledOperator, x::AbstractArray) = L.coeff * (L.op / x)

Base.:/(x::AbstractVecOrMat, L::DiffEqScaledOperator) = 1 / L.coeff * (x / L.op)
Base.:/(x::AbstractArray, L::DiffEqScaledOperator) = 1 / L.coeff * (x / L.op)

Base.:\(L::DiffEqScaledOperator, x::AbstractVecOrMat) = 1 / L.coeff * (L.op \ x)
Base.:\(L::DiffEqScaledOperator, x::AbstractArray) = 1 / L.coeff * (L.op \ x)

Base.:\(x::AbstractVecOrMat, L::DiffEqScaledOperator) = L.coeff * (x \ L)
Base.:\(x::AbstractArray, L::DiffEqScaledOperator) = L.coeff * (x \ L)

for N in (2, 3)
@eval begin function LinearAlgebra.mul!(Y::AbstractArray{T, $N},
L::DiffEqScaledOperator{T},
B::AbstractArray{T, $N}) where {T}
LinearAlgebra.lmul!(Y, L.coeff, mul!(Y, L.op, B))
end end
end

function LinearAlgebra.ldiv!(Y::AbstractVecOrMat, L::DiffEqScaledOperator, B::AbstractVecOrMat)
lmul!(1 / L.coeff, ldiv!(Y, L.op, B))
end
function LinearAlgebra.ldiv!(Y::AbstractArray, L::DiffEqScaledOperator, B::AbstractArray)
lmul!(1 / L.coeff, ldiv!(Y, L.op, B))
end

LinearAlgebra.factorize(L::DiffEqScaledOperator) = L.coeff * factorize(L.op)
for fact in (:lu, :lu!, :qr, :qr!, :cholesky, :cholesky!, :ldlt, :ldlt!,
:bunchkaufman, :bunchkaufman!, :lq, :lq!, :svd, :svd!)
Expand Down

0 comments on commit d57a62b

Please sign in to comment.