Skip to content

Commit a05e85f

Browse files
committed
Rewrite A[ct]_(mul|ldiv|rdiv)_B[ct][!] calls in stdlib/SuiteSparse as *, /, \, mul!, ldiv!, or rdiv!.
1 parent a11cbe5 commit a05e85f

File tree

7 files changed

+60
-58
lines changed

7 files changed

+60
-58
lines changed

stdlib/SuiteSparse/src/SuiteSparse.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ __precompile__(true)
44

55
module SuiteSparse
66

7-
import Base: At_ldiv_B, Ac_ldiv_B, A_ldiv_B!
8-
import Base.LinAlg: At_ldiv_B!, Ac_ldiv_B!, A_rdiv_B!, A_rdiv_Bc!, ldiv!, rdiv!
7+
import Base: \
8+
import Base.LinAlg: ldiv!, rdiv!
99

1010
## Functions to switch to 0-based indexing to call external sparse solvers
1111

stdlib/SuiteSparse/src/cholmod.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module CHOLMOD
55
import Base: (*), convert, copy, eltype, getindex, show, size,
66
IndexStyle, IndexLinear, IndexCartesian, adjoint
77

8-
import Base.LinAlg: (\), A_mul_Bc, A_mul_Bt, Ac_ldiv_B, Ac_mul_B, At_ldiv_B, At_mul_B,
8+
import Base.LinAlg: (\),
99
cholfact, cholfact!, det, diag, ishermitian, isposdef,
1010
issuccess, issymmetric, ldltfact, ldltfact!, logdet,
1111
Adjoint, Transpose
@@ -1318,7 +1318,7 @@ function *(adjA::Adjoint{<:Any,<:Sparse}, B::Sparse)
13181318
A = adjA.parent
13191319
aa1 = transpose_(A, 2)
13201320
if A === B
1321-
return A_mul_Bc(aa1, aa1)
1321+
return *(aa1, Adjoint(aa1))
13221322
end
13231323
## result of ssmult will have stype==0, contain numerical values and be sorted
13241324
return ssmult(aa1, B, 0, true, true)
@@ -1327,7 +1327,7 @@ end
13271327
*(adjA::Adjoint{<:Any,<:Sparse}, B::Dense) =
13281328
(A = adjA.parent; sdmult!(A, true, 1., 0., B, zeros(size(A, 2), size(B, 2))))
13291329
*(adjA::Adjoint{<:Any,<:Sparse}, B::VecOrMat) =
1330-
(A = adjA.parent; Ac_mul_B(A, Dense(B)))
1330+
(A = adjA.parent; *(Adjoint(A), Dense(B)))
13311331

13321332

13331333
## Factorization methods
@@ -1694,7 +1694,7 @@ end
16941694
\(adjL::Adjoint{<:Any,<:Factor}, B::Dense) = (L = adjL.parent; solve(CHOLMOD_A, L, B))
16951695
\(adjL::Adjoint{<:Any,<:Factor}, B::VecOrMat) = (L = adjL.parent; convert(Matrix, solve(CHOLMOD_A, L, Dense(B))))
16961696
\(adjL::Adjoint{<:Any,<:Factor}, B::Sparse) = (L = adjL.parent; spsolve(CHOLMOD_A, L, B))
1697-
\(adjL::Adjoint{<:Any,<:Factor}, B::SparseVecOrMat) = (L = adjL.parent; Ac_ldiv_B(L, Sparse(B)))
1697+
\(adjL::Adjoint{<:Any,<:Factor}, B::SparseVecOrMat) = (L = adjL.parent; \(Adjoint(L), Sparse(B)))
16981698

16991699
const RealHermSymComplexHermF64SSL = Union{
17001700
Symmetric{Float64,SparseMatrixCSC{Float64,SuiteSparse_long}},
@@ -1717,13 +1717,13 @@ function \(adjA::Adjoint{<:Any,<:RealHermSymComplexHermF64SSL}, B::StridedVecOrM
17171717
A = adjA.parent
17181718
F = cholfact(A)
17191719
if issuccess(F)
1720-
return Ac_ldiv_B(F, B)
1720+
return \(Adjoint(F), B)
17211721
else
17221722
ldltfact!(F, A)
17231723
if issuccess(F)
1724-
return Ac_ldiv_B(F, B)
1724+
return \(Adjoint(F), B)
17251725
else
1726-
return Ac_ldiv_B(lufact(convert(SparseMatrixCSC{eltype(A), SuiteSparse_long}, A)), B)
1726+
return \(Adjoint(lufact(convert(SparseMatrixCSC{eltype(A), SuiteSparse_long}, A))), B)
17271727
end
17281728
end
17291729
end

stdlib/SuiteSparse/src/deprecated.jl

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,40 @@
33
# A[ct]_(mul|ldiv|rdiv)_B[ct][!] methods from src/cholmod.jl, to deprecate
44
@eval SuiteSparse.CHOLMOD begin
55
using Base.LinAlg: Adjoint, Transpose
6-
Ac_ldiv_B(A::RealHermSymComplexHermF64SSL, B::StridedVecOrMat) = \(Adjoint(A), B)
7-
Ac_ldiv_B(L::Factor, B::Dense) = \(Adjoint(L), B)
8-
Ac_ldiv_B(L::Factor, B::VecOrMat) = \(Adjoint(L), B)
9-
Ac_ldiv_B(L::Factor, B::Sparse) = \(Adjoint(L), B)
10-
Ac_ldiv_B(L::Factor, B::SparseVecOrMat) = \(Adjoint(L), B)
11-
Ac_ldiv_B(L::FactorComponent, B) = \(Adjoint(L), B)
12-
Ac_ldiv_B(L::FactorComponent, B::RowVector) = \(Adjoint(L), B)
13-
Ac_mul_B(A::Sparse, B::Dense) = *(Adjoint(A), B)
14-
Ac_mul_B(A::Sparse, B::VecOrMat) = *(Adjoint(A), B)
15-
Ac_mul_B(A::Sparse, B::Sparse) = *(Adjoint(A), B)
16-
A_mul_Bc(A::Sparse{Tv}, B::Sparse{Tv}) where {Tv<:VRealTypes} = *(A, Adjoint(B))
6+
Base.Ac_ldiv_B(A::RealHermSymComplexHermF64SSL, B::StridedVecOrMat) = \(Adjoint(A), B)
7+
Base.Ac_ldiv_B(L::Factor, B::Dense) = \(Adjoint(L), B)
8+
Base.Ac_ldiv_B(L::Factor, B::VecOrMat) = \(Adjoint(L), B)
9+
Base.Ac_ldiv_B(L::Factor, B::Sparse) = \(Adjoint(L), B)
10+
Base.Ac_ldiv_B(L::Factor, B::SparseVecOrMat) = \(Adjoint(L), B)
11+
Base.Ac_ldiv_B(L::FactorComponent, B) = \(Adjoint(L), B)
12+
Base.Ac_ldiv_B(L::FactorComponent, B::RowVector) = \(Adjoint(L), B)
13+
Base.Ac_mul_B(A::Sparse, B::Dense) = *(Adjoint(A), B)
14+
Base.Ac_mul_B(A::Sparse, B::VecOrMat) = *(Adjoint(A), B)
15+
Base.Ac_mul_B(A::Sparse, B::Sparse) = *(Adjoint(A), B)
16+
Base.A_mul_Bc(A::Sparse{Tv}, B::Sparse{Tv}) where {Tv<:VRealTypes} = *(A, Adjoint(B))
1717
end
1818

1919
# A[ct]_(mul|ldiv|rdiv)_B[ct][!] methods from src/umfpack.jl, to deprecate
2020
@eval SuiteSparse.UMFPACK begin
2121
using Base.LinAlg: Adjoint, Transpose
22-
A_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
22+
Base.A_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
2323
Base.LinAlg.ldiv!(X, lu, B)
24-
At_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
24+
Base.At_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
2525
Base.LinAlg.ldiv!(X, Transpose(lu), B)
26-
Ac_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
26+
Base.Ac_ldiv_B!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
2727
Base.LinAlg.ldiv!(X, Adjoint(lu), B)
28-
A_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
28+
Base.A_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
2929
Base.LinAlg.ldiv!(X, lu, B)
30-
At_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
30+
Base.At_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
3131
Base.LinAlg.ldiv!(X, Transpose(lu), B)
32-
Ac_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
32+
Base.Ac_ldiv_B!(X::StridedVecOrMat{Tb}, lu::UmfpackLU{Float64}, B::StridedVecOrMat{Tb}) where {Tb<:Complex} =
3333
Base.LinAlg.ldiv!(X, Adjoint(lu), B)
34-
A_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(lu, B)
35-
At_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(Transpose(lu), B)
36-
Ac_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(Adjoint(lu), B)
37-
A_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(lu, B)
38-
At_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(Transpose(lu), B)
39-
Ac_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(Adjoint(lu), B)
34+
Base.A_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(lu, B)
35+
Base.At_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(Transpose(lu), B)
36+
Base.Ac_ldiv_B!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} = Base.LinAlg.ldiv!(Adjoint(lu), B)
37+
Base.A_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(lu, B)
38+
Base.At_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(Transpose(lu), B)
39+
Base.Ac_ldiv_B!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) = Base.LinAlg.ldiv!(Adjoint(lu), B)
4040
end
4141

4242
# A[ct]_(mul|ldiv|rdiv)_B[ct][!] methods from src/spqr.jl, to deprecate

stdlib/SuiteSparse/src/spqr.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ function Base.LinAlg.mul!(A::StridedMatrix, Q::QRSparseQ)
221221
for l in 1:size(Q.factors, 2)
222222
τl = -Q.τ[l]
223223
h = view(Q.factors, :, l)
224-
A_mul_B!(tmp, A, h)
224+
Base.LinAlg.mul!(tmp, A, h)
225225
LinAlg.lowrankupdate!(A, tmp, h, τl)
226226
end
227227
return A
@@ -252,7 +252,7 @@ function Base.LinAlg.mul!(A::StridedMatrix, adjQ::Adjoint{<:Any,<:QRSparseQ})
252252
for l in size(Q.factors, 2):-1:1
253253
τl = -Q.τ[l]
254254
h = view(Q.factors, :, l)
255-
A_mul_B!(tmp, A, h)
255+
Base.LinAlg.mul!(tmp, A, h)
256256
LinAlg.lowrankupdate!(A, tmp, h, τl')
257257
end
258258
return A
@@ -333,7 +333,7 @@ end
333333
# the complex rhs as a real rhs with twice the number of columns
334334
#
335335
# This definition is similar to the definition in factorization.jl except that
336-
# here we have to use \ instead of A_ldiv_B! because of limitations in SPQR
336+
# here we have to use \ instead of ldiv! because of limitations in SPQR
337337

338338
## Two helper methods
339339
_ret_size(F::QRSparse, b::AbstractVector) = (size(F, 2),)
@@ -379,13 +379,13 @@ function _ldiv_basic(F::QRSparse, B::StridedVecOrMat)
379379
X0 = view(X, 1:size(B, 1), :)
380380

381381
# Apply Q' to B
382-
Ac_mul_B!(LinAlg.getq(F), X0)
382+
Base.LinAlg.mul!(Adjoint(LinAlg.getq(F)), X0)
383383

384384
# Zero out to get basic solution
385385
X[rnk + 1:end, :] = 0
386386

387387
# Solve R*X = B
388-
A_ldiv_B!(UpperTriangular(view(F.R, :, Base.OneTo(rnk))), view(X0, Base.OneTo(rnk), :))
388+
Base.LinAlg.ldiv!(UpperTriangular(view(F.R, :, Base.OneTo(rnk))), view(X0, Base.OneTo(rnk), :))
389389

390390
# Apply right permutation and extract solution from X
391391
return getindex(X, ntuple(i -> i == 1 ? invperm(F.cpiv) : :, Val(ndims(B)))...)

stdlib/SuiteSparse/src/umfpack.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ module UMFPACK
44

55
export UmfpackLU
66

7-
import Base: (\), Ac_ldiv_B, At_ldiv_B, findnz, getindex, show, size
8-
import Base.LinAlg: A_ldiv_B!, Ac_ldiv_B!, At_ldiv_B!, Factorization, det, lufact, ldiv!
7+
import Base: (\), findnz, getindex, show, size
8+
import Base.LinAlg: Factorization, det, lufact, ldiv!
99
using Base.LinAlg: Adjoint, Transpose
1010

1111
using ..SparseArrays
@@ -386,17 +386,17 @@ end
386386

387387
### Solve with Factorization
388388
ldiv!(lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
389-
A_ldiv_B!(B, lu, copy(B))
389+
ldiv!(B, lu, copy(B))
390390
ldiv!(translu::Transpose{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
391-
(lu = translu.parent; At_ldiv_B!(B, lu, copy(B)))
391+
(lu = translu.parent; ldiv!(B, Transpose(lu), copy(B)))
392392
ldiv!(adjlu::Adjoint{T,<:UmfpackLU{T}}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
393-
(lu = adjlu.parent; Ac_ldiv_B!(B, lu, copy(B)))
393+
(lu = adjlu.parent; ldiv!(B, Adjoint(lu), copy(B)))
394394
ldiv!(lu::UmfpackLU{Float64}, B::StridedVecOrMat{<:Complex}) =
395-
A_ldiv_B!(B, lu, copy(B))
395+
ldiv!(B, lu, copy(B))
396396
ldiv!(translu::Transpose{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
397-
(lu = translu.parent; At_ldiv_B!(B, lu, copy(B)))
397+
(lu = translu.parent; ldiv!(B, Transpose(lu), copy(B)))
398398
ldiv!(adjlu::Adjoint{Float64,<:UmfpackLU{Float64}}, B::StridedVecOrMat{<:Complex}) =
399-
(lu = adjlu.parent; Ac_ldiv_B!(B, lu, copy(B)))
399+
(lu = adjlu.parent; ldiv!(B, Adjoint(lu), copy(B)))
400400

401401
ldiv!(X::StridedVecOrMat{T}, lu::UmfpackLU{T}, B::StridedVecOrMat{T}) where {T<:UMFVTypes} =
402402
_Aq_ldiv_B!(X, lu, B, UMFPACK_A)

stdlib/SuiteSparse/test/spqr.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
using SuiteSparse.SPQR
44
using SuiteSparse.CHOLMOD
5+
using Base.LinAlg: mul!, Adjoint, Transpose
56

67
@testset "Sparse QR" begin
78
m, n = 100, 10
@@ -42,10 +43,10 @@ nn = 100
4243
@test norm(R0[n + 1:end, :], 1) < 1e-12
4344

4445
offsizeA = Matrix{Float64}(I, m+1, m+1)
45-
@test_throws DimensionMismatch A_mul_B!(Q, offsizeA)
46-
@test_throws DimensionMismatch Ac_mul_B!(Q, offsizeA)
47-
@test_throws DimensionMismatch A_mul_B!(offsizeA, Q)
48-
@test_throws DimensionMismatch A_mul_Bc!(offsizeA, Q)
46+
@test_throws DimensionMismatch mul!(Q, offsizeA)
47+
@test_throws DimensionMismatch mul!(Adjoint(Q), offsizeA)
48+
@test_throws DimensionMismatch mul!(offsizeA, Q)
49+
@test_throws DimensionMismatch mul!(offsizeA, Adjoint(Q))
4950
end
5051

5152
@testset "element type of B: $eltyB" for eltyB in (Int, Float64, Complex{Float64})

stdlib/SuiteSparse/test/umfpack.jl

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
# based on deps/Suitesparse-4.0.2/UMFPACK/Demo/umfpack_di_demo.c
99

1010
using SuiteSparse.increment!
11+
using Base.LinAlg: Adjoint, Transpose
1112

1213
A0 = sparse(increment!([0,4,1,1,2,2,0,1,2,3,4,4]),
1314
increment!([0,4,0,2,1,2,1,4,3,2,1,2]),
@@ -31,11 +32,11 @@
3132

3233
@test A*x b
3334
z = complex.(b)
34-
x = SuiteSparse.A_ldiv_B!(lua, z)
35+
x = SuiteSparse.ldiv!(lua, z)
3536
@test x float([1:5;])
3637
@test z === x
3738
y = similar(z)
38-
A_ldiv_B!(y, lua, complex.(b))
39+
Base.LinAlg.ldiv!(y, lua, complex.(b))
3940
@test y x
4041

4142
@test A*x b
@@ -46,22 +47,22 @@
4647

4748
@test A'*x b
4849
z = complex.(b)
49-
x = SuiteSparse.Ac_ldiv_B!(lua, z)
50+
x = SuiteSparse.ldiv!(Adjoint(lua), z)
5051
@test x float([1:5;])
5152
@test x === z
5253
y = similar(x)
53-
SuiteSparse.Ac_ldiv_B!(y, lua, complex.(b))
54+
SuiteSparse.ldiv!(y, Adjoint(lua), complex.(b))
5455
@test y x
5556

5657
@test A'*x b
5758
x = lua.'\b
5859
@test x float([1:5;])
5960

6061
@test A.'*x b
61-
x = SuiteSparse.At_ldiv_B!(lua,complex.(b))
62+
x = SuiteSparse.ldiv!(Transpose(lua), complex.(b))
6263
@test x float([1:5;])
6364
y = similar(x)
64-
SuiteSparse.At_ldiv_B!(y, lua,complex.(b))
65+
SuiteSparse.ldiv!(y, Transpose(lua), complex.(b))
6566
@test y x
6667

6768
@test A.'*x b
@@ -161,9 +162,9 @@
161162
X = zeros(Complex{Float64}, N, N)
162163
B = complex.(rand(N, N), rand(N, N))
163164
luA, lufA = lufact(A), lufact(Array(A))
164-
@test A_ldiv_B!(copy(X), luA, B) A_ldiv_B!(copy(X), lufA, B)
165-
@test At_ldiv_B!(copy(X), luA, B) At_ldiv_B!(copy(X), lufA, B)
166-
@test Ac_ldiv_B!(copy(X), luA, B) Ac_ldiv_B!(copy(X), lufA, B)
165+
@test Base.LinAlg.ldiv!(copy(X), luA, B) Base.LinAlg.ldiv!(copy(X), lufA, B)
166+
@test Base.LinAlg.ldiv!(copy(X), Adjoint(luA), B) Base.LinAlg.ldiv!(copy(X), Adjoint(lufA), B)
167+
@test Base.LinAlg.ldiv!(copy(X), Transpose(luA), B) Base.LinAlg.ldiv!(copy(X), Transpose(lufA), B)
167168
end
168169

169170
end

0 commit comments

Comments
 (0)