Skip to content

Commit cb79e06

Browse files
authored
Clean up temporary fixes (#348)
1 parent 195c470 commit cb79e06

File tree

6 files changed

+43
-68
lines changed

6 files changed

+43
-68
lines changed

src/SparseArrays.jl

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ using Base: ReshapedArray, promote_op, setindex_shape_check, to_shape, tail,
99
require_one_based_indexing, promote_eltype
1010
using Base.Order: Forward
1111
using LinearAlgebra
12-
using LinearAlgebra: AdjOrTrans, matprod, AbstractQ, HessenbergQ, QRCompactWYQ, QRPackedQ,
13-
LQPackedQ, UpperOrLowerTriangular
12+
using LinearAlgebra: AdjOrTrans, AdjointFactorization, TransposeFactorization, matprod,
13+
AbstractQ, AdjointQ, HessenbergQ, QRCompactWYQ, QRPackedQ, LQPackedQ,
14+
UpperOrLowerTriangular
1415

1516

1617
import Base: +, -, *, \, /, &, |, xor, ==, zero, @propagate_inbounds
@@ -32,8 +33,6 @@ export AbstractSparseArray, AbstractSparseMatrix, AbstractSparseVector,
3233
sprand, sprandn, spzeros, nnz, permute, findnz, fkeep!, ftranspose!,
3334
sparse_hcat, sparse_vcat, sparse_hvcat
3435

35-
const AdjQType = isdefined(LinearAlgebra, :AdjointQ) ? LinearAlgebra.AdjointQ : Adjoint
36-
3736
const LinAlgLeftQs = Union{HessenbergQ,QRCompactWYQ,QRPackedQ}
3837

3938
# helper function needed in sparsematrix, sparsevector and higherorderfns
@@ -57,13 +56,6 @@ decrement(A::AbstractArray) = let y = Array(A)
5756
y .= y .- oneunit(eltype(A))
5857
end
5958

60-
AdjointFact = isdefined(LinearAlgebra, :AdjointFactorization) ?
61-
LinearAlgebra.AdjointFactorization :
62-
Adjoint
63-
TransposeFact = isdefined(LinearAlgebra, :TransposeFactorization) ?
64-
LinearAlgebra.TransposeFactorization :
65-
Transpose
66-
6759
include("readonly.jl")
6860
include("abstractsparse.jl")
6961
include("sparsematrix.jl")

src/solvers/cholmod.jl

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ using Base: require_one_based_indexing
1616

1717
using LinearAlgebra
1818
using LinearAlgebra: RealHermSymComplexHerm, AdjOrTrans
19-
import LinearAlgebra: (\),
19+
import LinearAlgebra: (\), AdjointFactorization,
2020
cholesky, cholesky!, det, diag, ishermitian, isposdef,
2121
issuccess, issymmetric, ldlt, ldlt!, logdet
2222

@@ -32,7 +32,7 @@ export
3232
import SparseArrays: AbstractSparseMatrix, SparseMatrixCSC, indtype, sparse, spzeros, nnz,
3333
sparsevec
3434

35-
import ..increment, ..increment!, ..AdjointFact, ..TransposeFact
35+
import ..increment, ..increment!
3636

3737
using ..LibSuiteSparse
3838
import ..LibSuiteSparse: SuiteSparse_long, TRUE, FALSE
@@ -336,11 +336,6 @@ mutable struct Factor{Tv<:VTypes} <: Factorization{Tv}
336336
end
337337
end
338338

339-
if !isdefined(LinearAlgebra, :AdjointFactorization)
340-
Base.adjoint(F::Factor) = Adjoint(F)
341-
Base.transpose(F::Factor) = Transpose(F)
342-
end
343-
344339
const SuiteSparseStruct = Union{cholmod_dense, cholmod_sparse, cholmod_factor}
345340

346341
# All pointer loads should be checked to make sure that SuiteSparse is not called with
@@ -1578,21 +1573,21 @@ end
15781573
(\)(L::Factor, B::SparseVector) = sparsevec(spsolve(CHOLMOD_A, L, Sparse(B)))
15791574

15801575
# the eltype restriction is necessary for disambiguation with the B::StridedMatrix below
1581-
\(adjL::AdjointFact{<:VTypes,<:Factor}, B::Dense) = (L = adjL.parent; solve(CHOLMOD_A, L, B))
1582-
\(adjL::AdjointFact{<:Any,<:Factor}, B::Sparse) = (L = adjL.parent; spsolve(CHOLMOD_A, L, B))
1583-
\(adjL::AdjointFact{<:Any,<:Factor}, B::SparseVecOrMat) = (L = adjL.parent; \(adjoint(L), Sparse(B)))
1576+
\(adjL::AdjointFactorization{<:VTypes,<:Factor}, B::Dense) = (L = adjL.parent; solve(CHOLMOD_A, L, B))
1577+
\(adjL::AdjointFactorization{<:Any,<:Factor}, B::Sparse) = (L = adjL.parent; spsolve(CHOLMOD_A, L, B))
1578+
\(adjL::AdjointFactorization{<:Any,<:Factor}, B::SparseVecOrMat) = (L = adjL.parent; \(adjoint(L), Sparse(B)))
15841579

15851580
# Explicit typevars are necessary to avoid ambiguities with defs in LinearAlgebra/factorizations.jl
15861581
# Likewise the two following explicit Vector and Matrix defs (rather than a single VecOrMat)
1587-
(\)(adjL::AdjointFact{T,<:Factor}, B::Vector{Complex{T}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1588-
(\)(adjL::AdjointFact{T,<:Factor}, B::Matrix{Complex{T}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1589-
(\)(adjL::AdjointFact{T,<:Factor}, B::Adjoint{<:Any,Matrix{Complex{T}}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1590-
(\)(adjL::AdjointFact{T,<:Factor}, B::Transpose{<:Any,Matrix{Complex{T}}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1591-
function \(adjL::AdjointFact{<:VTypes,<:Factor}, b::StridedVector)
1582+
(\)(adjL::AdjointFactorization{T,<:Factor}, B::Vector{Complex{T}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1583+
(\)(adjL::AdjointFactorization{T,<:Factor}, B::Matrix{Complex{T}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1584+
(\)(adjL::AdjointFactorization{T,<:Factor}, B::Adjoint{<:Any,Matrix{Complex{T}}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1585+
(\)(adjL::AdjointFactorization{T,<:Factor}, B::Transpose{<:Any,Matrix{Complex{T}}}) where {T<:Float64} = complex.(adjL\real(B), adjL\imag(B))
1586+
function \(adjL::AdjointFactorization{<:VTypes,<:Factor}, b::StridedVector)
15921587
L = adjL.parent
15931588
return Vector(solve(CHOLMOD_A, L, Dense(b)))
15941589
end
1595-
function \(adjL::AdjointFact{<:VTypes,<:Factor}, B::StridedMatrix)
1590+
function \(adjL::AdjointFactorization{<:VTypes,<:Factor}, B::StridedMatrix)
15961591
L = adjL.parent
15971592
return Matrix(solve(CHOLMOD_A, L, Dense(B)))
15981593
end

src/solvers/spqr.jl

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ module SPQR
55
import Base: \, *
66
using Base: require_one_based_indexing
77
using LinearAlgebra
8-
using LinearAlgebra: AbstractQ, copy_similar
8+
using LinearAlgebra: AbstractQ, AdjointQ, copy_similar
99
using ..LibSuiteSparse: SuiteSparseQR_C
1010

11-
const AbstractQType = isdefined(LinearAlgebra, :AdjointQ) ? AbstractQ : AbstractMatrix
12-
1311
# ordering options */
1412
const ORDERING_FIXED = Int32(0)
1513
const ORDERING_NATURAL = Int32(1)
@@ -31,7 +29,7 @@ const ORDERINGS = [ORDERING_FIXED, ORDERING_NATURAL, ORDERING_COLAMD, ORDERING_C
3129
# the best of AMD and METIS. METIS is not tried if it isn't installed.
3230

3331
using ..SparseArrays
34-
using ..SparseArrays: getcolptr, FixedSparseCSC, AbstractSparseMatrixCSC, _unsafe_unfix, AdjQType
32+
using ..SparseArrays: getcolptr, FixedSparseCSC, AbstractSparseMatrixCSC, _unsafe_unfix
3533
using ..CHOLMOD
3634
using ..CHOLMOD: change_stype!, free!
3735

@@ -256,7 +254,7 @@ function LinearAlgebra.rmul!(A::StridedMatrix, Q::QRSparseQ)
256254
return A
257255
end
258256

259-
function LinearAlgebra.lmul!(adjQ::AdjQType{<:Any,<:QRSparseQ}, A::StridedVecOrMat)
257+
function LinearAlgebra.lmul!(adjQ::AdjointQ{<:Any,<:QRSparseQ}, A::StridedVecOrMat)
260258
Q = parent(adjQ)
261259
if size(A, 1) != size(Q, 1)
262260
throw(DimensionMismatch("size(Q) = $(size(Q)) but size(A) = $(size(A))"))
@@ -272,7 +270,7 @@ function LinearAlgebra.lmul!(adjQ::AdjQType{<:Any,<:QRSparseQ}, A::StridedVecOrM
272270
return A
273271
end
274272

275-
function LinearAlgebra.rmul!(A::StridedMatrix, adjQ::AdjQType{<:Any,<:QRSparseQ})
273+
function LinearAlgebra.rmul!(A::StridedMatrix, adjQ::AdjointQ{<:Any,<:QRSparseQ})
276274
Q = parent(adjQ)
277275
if size(A, 2) != size(Q, 1)
278276
throw(DimensionMismatch("size(Q) = $(size(Q)) but size(A) = $(size(A))"))
@@ -287,9 +285,9 @@ function LinearAlgebra.rmul!(A::StridedMatrix, adjQ::AdjQType{<:Any,<:QRSparseQ}
287285
return A
288286
end
289287

290-
function (*)(Q::QRSparseQ, b::StridedVector) # TODO: relax to AbstractVector
288+
function (*)(Q::QRSparseQ, b::AbstractVector)
291289
TQb = promote_type(eltype(Q), eltype(b))
292-
QQ = convert(AbstractQType{TQb}, Q)
290+
QQ = convert(AbstractQ{TQb}, Q)
293291
if size(Q.factors, 1) == length(b)
294292
bnew = copy_similar(b, TQb)
295293
elseif size(Q.factors, 2) == length(b)
@@ -299,9 +297,9 @@ function (*)(Q::QRSparseQ, b::StridedVector) # TODO: relax to AbstractVector
299297
end
300298
lmul!(QQ, bnew)
301299
end
302-
function (*)(Q::QRSparseQ, B::StridedMatrix) # TODO: relax to AbstractMatrix
300+
function (*)(Q::QRSparseQ, B::AbstractMatrix)
303301
TQB = promote_type(eltype(Q), eltype(B))
304-
QQ = convert(AbstractQType{TQB}, Q)
302+
QQ = convert(AbstractQ{TQB}, Q)
305303
if size(Q.factors, 1) == size(B, 1)
306304
Bnew = copy_similar(B, TQB)
307305
elseif size(Q.factors, 2) == size(B, 1)
@@ -311,10 +309,10 @@ function (*)(Q::QRSparseQ, B::StridedMatrix) # TODO: relax to AbstractMatrix
311309
end
312310
lmul!(QQ, Bnew)
313311
end
314-
function (*)(A::StridedMatrix, adjQ::AdjQType{<:Any,<:QRSparseQ}) # TODO: relax to AbstractMatrix
312+
function (*)(A::AbstractMatrix, adjQ::AdjointQ{<:Any,<:QRSparseQ})
315313
Q = parent(adjQ)
316314
TAQ = promote_type(eltype(A), eltype(adjQ))
317-
adjQQ = convert(AbstractQType{TAQ}, adjQ)
315+
adjQQ = convert(AbstractQ{TAQ}, adjQ)
318316
if size(A,2) == size(Q.factors, 1)
319317
AA = copy_similar(A, TAQ)
320318
return rmul!(AA, adjQQ)
@@ -356,12 +354,6 @@ function Base.show(io::IO, mime::MIME{Symbol("text/plain")}, F::QRSparse)
356354
println(io, "\nColumn permutation:")
357355
show(io, mime, F.pcol)
358356
end
359-
# TODO: remove once the AdjointQ PR is merged
360-
if QRSparseQ <: AbstractMatrix
361-
function Base.show(io::IO, ::MIME{Symbol("text/plain")}, Q::QRSparseQ)
362-
summary(io, Q)
363-
end
364-
end
365357

366358
"""
367359
rank(::QRSparse{Tv,Ti}) -> Ti

src/solvers/umfpack.jl

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ export UmfpackLU
77
import Base: (\), getproperty, show, size
88
using LinearAlgebra
99
using LinearAlgebra: AdjOrTrans
10-
import LinearAlgebra: Factorization, checksquare, det, logabsdet, lu, lu!, ldiv!
10+
import LinearAlgebra: Factorization, AdjointFactorization, TransposeFactorization,
11+
checksquare, det, logabsdet, lu, lu!, ldiv!
1112

1213
using SparseArrays
1314
using SparseArrays: getcolptr, AbstractSparseMatrixCSC
@@ -16,7 +17,7 @@ import SparseArrays: nnz
1617
import Serialization: AbstractSerializer, deserialize, serialize
1718
using Serialization
1819

19-
import ..increment, ..increment!, ..decrement, ..decrement!, ..AdjointFact, ..TransposeFact
20+
import ..increment, ..increment!, ..decrement, ..decrement!
2021

2122
using ..LibSuiteSparse
2223
import ..LibSuiteSparse:
@@ -256,7 +257,7 @@ workspace_W_size(F::UmfpackLU) = workspace_W_size(F, has_refinement(F))
256257
workspace_W_size(S::Union{UmfpackLU{<:AbstractFloat}, AbstractSparseMatrixCSC{<:AbstractFloat}}, refinement::Bool) = refinement ? 5 * size(S, 2) : size(S, 2)
257258
workspace_W_size(S::Union{UmfpackLU{<:Complex}, AbstractSparseMatrixCSC{<:Complex}}, refinement::Bool) = refinement ? 10 * size(S, 2) : 4 * size(S, 2)
258259

259-
const ATLU = Union{TransposeFact{<:Any, <:UmfpackLU}, AdjointFact{<:Any, <:UmfpackLU}}
260+
const ATLU = Union{TransposeFactorization{<:Any, <:UmfpackLU}, AdjointFactorization{<:Any, <:UmfpackLU}}
260261
has_refinement(F::ATLU) = has_refinement(F.parent)
261262
has_refinement(F::UmfpackLU) = has_refinement(F.control)
262263
has_refinement(control::AbstractVector) = control[JL_UMFPACK_IRSTEP] > 0
@@ -294,10 +295,7 @@ Base.copy(F::UmfpackLU{Tv, Ti}, ws=UmfpackWS(F)) where {Tv, Ti} =
294295
Base.copy(F::T, ws=UmfpackWS(F)) where {T <: ATLU} =
295296
T(copy(parent(F), ws))
296297

297-
if !isdefined(LinearAlgebra, :AdjointFactorization)
298-
Base.adjoint(F::UmfpackLU) = Adjoint(F)
299-
end
300-
Base.transpose(F::UmfpackLU) = TransposeFact(F)
298+
Base.transpose(F::UmfpackLU) = TransposeFactorization(F)
301299

302300
function Base.lock(f::Function, F::UmfpackLU)
303301
lock(F)
@@ -935,32 +933,30 @@ LinearAlgebra.issuccess(lu::UmfpackLU) = lu.status == UMFPACK_OK
935933

936934
### Solve with Factorization
937935

938-
import LinearAlgebra.ldiv!
939-
940936
ldiv!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
941937
ldiv!(B, lu, copy(B))
942-
ldiv!(translu::TransposeFact{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
938+
ldiv!(translu::TransposeFactorization{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
943939
ldiv!(B, translu, copy(B))
944-
ldiv!(adjlu::AdjointFact{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
940+
ldiv!(adjlu::AdjointFactorization{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
945941
ldiv!(B, adjlu, copy(B))
946942
ldiv!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) =
947943
ldiv!(B, lu, copy(B))
948-
ldiv!(translu::TransposeFact{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
944+
ldiv!(translu::TransposeFactorization{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
949945
ldiv!(B, translu, copy(B))
950-
ldiv!(adjlu::AdjointFact{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
946+
ldiv!(adjlu::AdjointFactorization{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
951947
ldiv!(B, adjlu, copy(B))
952948

953949
ldiv!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
954950
_Aq_ldiv_B!(X, lu, B, UMFPACK_A)
955-
ldiv!(X::StridedVecOrMat{T}, translu::TransposeFact{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
951+
ldiv!(X::StridedVecOrMat{T}, translu::TransposeFactorization{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
956952
(lu = translu.parent; _Aq_ldiv_B!(X, lu, B, UMFPACK_Aat))
957-
ldiv!(X::StridedVecOrMat{T}, adjlu::AdjointFact{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
953+
ldiv!(X::StridedVecOrMat{T}, adjlu::AdjointFactorization{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
958954
(lu = adjlu.parent; _Aq_ldiv_B!(X, lu, B, UMFPACK_At))
959955
ldiv!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
960956
_Aq_ldiv_B!(X, lu, B, UMFPACK_A)
961-
ldiv!(X::StridedVecOrMat{Tb}, translu::TransposeFact{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
957+
ldiv!(X::StridedVecOrMat{Tb}, translu::TransposeFactorization{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
962958
(lu = translu.parent; _Aq_ldiv_B!(X, lu, B, UMFPACK_Aat))
963-
ldiv!(X::StridedVecOrMat{Tb}, adjlu::AdjointFact{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
959+
ldiv!(X::StridedVecOrMat{Tb}, adjlu::AdjointFactorization{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
964960
(lu = adjlu.parent; _Aq_ldiv_B!(X, lu, B, UMFPACK_At))
965961

966962
function _Aq_ldiv_B!(X::StridedVecOrMat, lu::UmfpackLU, B::StridedVecOrMat, transposeoptype)

src/sparsematrix.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,10 @@ for QT in (:LinAlgLeftQs, :LQPackedQ)
475475
@eval (*)(A::AbstractSparseMatrixCSC, Q::$QT) = Matrix(A) * Q
476476
@eval (*)(A::AdjOrTrans{<:Any,<:AbstractSparseMatrixCSC}, Q::$QT) = copy(A) * Q
477477

478-
@eval (*)(Q::AdjQType{<:Any,<:$QT}, B::AbstractSparseMatrixCSC) = Q * Matrix(B)
479-
@eval (*)(Q::AdjQType{<:Any,<:$QT}, B::AdjOrTrans{<:Any,<:AbstractSparseMatrixCSC}) = Q * copy(B)
480-
@eval (*)(A::AbstractSparseMatrixCSC, Q::AdjQType{<:Any,<:$QT}) = Matrix(A) * Q
481-
@eval (*)(A::AdjOrTrans{<:Any,<:AbstractSparseMatrixCSC}, Q::AdjQType{<:Any,<:$QT}) = copy(A) * Q
478+
@eval (*)(Q::AdjointQ{<:Any,<:$QT}, B::AbstractSparseMatrixCSC) = Q * Matrix(B)
479+
@eval (*)(Q::AdjointQ{<:Any,<:$QT}, B::AdjOrTrans{<:Any,<:AbstractSparseMatrixCSC}) = Q * copy(B)
480+
@eval (*)(A::AbstractSparseMatrixCSC, Q::AdjointQ{<:Any,<:$QT}) = Matrix(A) * Q
481+
@eval (*)(A::AdjOrTrans{<:Any,<:AbstractSparseMatrixCSC}, Q::AdjointQ{<:Any,<:$QT}) = copy(A) * Q
482482
end
483483

484484
## Reshape

src/sparsevector.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,10 +1302,10 @@ end
13021302

13031303
for QT in (:LinAlgLeftQs, :LQPackedQ)
13041304
@eval (*)(Q::$QT, B::AbstractSparseVector) = Q * Vector(B)
1305-
@eval (*)(Q::AdjQType{<:Any,<:$QT}, B::AbstractSparseVector) = Q * Vector(B)
1305+
@eval (*)(Q::AdjointQ{<:Any,<:$QT}, B::AbstractSparseVector) = Q * Vector(B)
13061306

13071307
@eval (*)(A::AbstractSparseVector, Q::$QT) = Vector(A) * Q
1308-
@eval (*)(A::AbstractSparseVector, Q::AdjQType{<:Any,<:$QT}) = Vector(A) * Q
1308+
@eval (*)(A::AbstractSparseVector, Q::AdjointQ{<:Any,<:$QT}) = Vector(A) * Q
13091309
end
13101310

13111311
# functions f, such that

0 commit comments

Comments
 (0)