Skip to content

Commit

Permalink
Prepare for AdjointFactorization
Browse files Browse the repository at this point in the history
  • Loading branch information
dkarrasch committed Jan 11, 2023
1 parent 70ebf7b commit c57be79
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "KLU"
uuid = "ef3ab10e-7fda-4108-b977-705223b18434"
authors = ["Wimmerer <[email protected]> and contributors"]
version = "0.4.0"
version = "0.4.1"

[deps]
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Expand Down
17 changes: 11 additions & 6 deletions src/KLU.jl
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ using .LibKLU:

using LinearAlgebra

const AdjointFact = isdefined(LinearAlgebra, :AdjointFactorization) ? LinearAlgebra.AdjointFactorization : Adjoint
const TransposeFact = isdefined(LinearAlgebra, :TransposeFactorization) ? LinearAlgebra.TransposeFactorization : Transpose

const KLUTypes = Union{Float64, ComplexF64}
const KLUValueTypes = (:Float64, :ComplexF64)

Expand Down Expand Up @@ -243,8 +246,10 @@ end

nnz(K::AbstractKLUFactorization) = K.lnz + K.unz + K.nzoff

Base.adjoint(K::AbstractKLUFactorization) = Adjoint(K)
Base.transpose(K::AbstractKLUFactorization) = Transpose(K)
if !isdefined(LinearAlgebra, :AdjointFactorization)
Base.adjoint(K::AbstractKLUFactorization) = Adjoint(K)
Base.transpose(K::AbstractKLUFactorization) = Transpose(K)
end

function setproperty!(klu::AbstractKLUFactorization, ::Val{:(_symbolic)}, x)
_free_symbolic(klu)
Expand Down Expand Up @@ -665,7 +670,7 @@ for Tv ∈ KLUValueTypes, Ti ∈ KLUIndexTypes
call = :($tsolve(klu._symbolic, klu._numeric, size(B, 1), size(B, 2), B, Ref(klu.common)))
end
@eval begin
function solve!(klu::Adjoint{$Tv, K}, B::StridedVecOrMat{$Tv}) where {K<:AbstractKLUFactorization{$Tv, $Ti}}
function solve!(klu::AdjointFact{$Tv, K}, B::StridedVecOrMat{$Tv}) where {K<:AbstractKLUFactorization{$Tv, $Ti}}
conj = 1
klu = parent(klu)
stride(B, 1) == 1 || throw(ArgumentError("B must have unit strides"))
Expand All @@ -675,7 +680,7 @@ for Tv ∈ KLUValueTypes, Ti ∈ KLUIndexTypes
isok == 0 && kluerror(klu.common)
return B
end
function solve!(klu::Transpose{$Tv, K}, B::StridedVecOrMat{$Tv}) where {K<: AbstractKLUFactorization{$Tv, $Ti}}
function solve!(klu::TransposeFact{$Tv, K}, B::StridedVecOrMat{$Tv}) where {K<: AbstractKLUFactorization{$Tv, $Ti}}
conj = 0
klu = parent(klu)
stride(B, 1) == 1 || throw(ArgumentError("B must have unit strides"))
Expand All @@ -694,15 +699,15 @@ function solve(klu, B)
end
LinearAlgebra.ldiv!(klu::AbstractKLUFactorization{Tv}, B::StridedVecOrMat{Tv}) where {Tv<:KLUTypes} =
solve!(klu, B)
LinearAlgebra.ldiv!(klu::LinearAlgebra.AdjOrTrans{Tv, K}, B::StridedVecOrMat{Tv}) where {Tv, Ti, K<:AbstractKLUFactorization{Tv, Ti}} =
LinearAlgebra.ldiv!(klu::Union{AdjointFact{Tv, K},TransposeFact{Tv, K}}, B::StridedVecOrMat{Tv}) where {Tv, Ti, K<:AbstractKLUFactorization{Tv, Ti}} =
solve!(klu, B)
function LinearAlgebra.ldiv!(klu::AbstractKLUFactorization{<:AbstractFloat}, B::StridedVecOrMat{<:Complex})
imagX = solve(klu, imag(B))
realX = solve(klu, real(B))
map!(complex, B, realX, imagX)
end

function LinearAlgebra.ldiv!(klu::LinearAlgebra.AdjOrTrans{Tv, K}, B::StridedVecOrMat{<:Complex}) where {Tv<:AbstractFloat, Ti, K<:AbstractKLUFactorization{Tv, Ti}}
function LinearAlgebra.ldiv!(klu::Union{AdjointFact{Tv, K},TransposeFact{Tv, K}}, B::StridedVecOrMat{<:Complex}) where {Tv<:AbstractFloat, Ti, K<:AbstractKLUFactorization{Tv, Ti}}
imagX = solve(klu, imag(B))
realX = solve(klu, real(B))
map!(complex, B, realX, imagX)
Expand Down

0 comments on commit c57be79

Please sign in to comment.