Skip to content

Commit e620933

Browse files
authored
Merge 835c523 into 13d0332
2 parents 13d0332 + 835c523 commit e620933

File tree

5 files changed

+149
-4
lines changed

5 files changed

+149
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "BlockSparseArrays"
22
uuid = "2c9a651f-6452-4ace-a6ac-809f4280fbb4"
33
authors = ["ITensor developers <support@itensor.org> and contributors"]
4-
version = "0.6.4"
4+
version = "0.6.5"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"

src/BlockSparseArrays.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,6 @@ include("factorizations/truncation.jl")
4949
include("factorizations/qr.jl")
5050
include("factorizations/lq.jl")
5151
include("factorizations/polar.jl")
52+
include("factorizations/orthnull.jl")
5253

5354
end

src/factorizations/orthnull.jl

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using MatrixAlgebraKit:
2+
MatrixAlgebraKit,
3+
left_orth_polar!,
4+
left_orth_qr!,
5+
left_orth_svd!,
6+
left_polar!,
7+
lq_compact!,
8+
qr_compact!,
9+
right_orth_lq!,
10+
right_orth_polar!,
11+
right_orth_svd!,
12+
right_polar!,
13+
select_algorithm,
14+
svd_compact!
15+
16+
function MatrixAlgebraKit.left_orth!(
17+
A::AbstractBlockSparseMatrix;
18+
trunc=nothing,
19+
kind=isnothing(trunc) ? :qr : :svd,
20+
alg_qr=(; positive=true),
21+
alg_polar=(;),
22+
alg_svd=(;),
23+
)
24+
if !isnothing(trunc) && kind != :svd
25+
throw(ArgumentError("truncation not supported for `left_orth` with `kind=$kind`"))
26+
end
27+
if kind == :qr
28+
return left_orth_qr!(A, alg_qr)
29+
elseif kind == :polar
30+
return left_orth_polar!(A, alg_polar)
31+
elseif kind == :svd
32+
return left_orth_svd!(A, alg_svd, trunc)
33+
else
34+
throw(ArgumentError("`left_orth` received unknown value `kind = $kind`"))
35+
end
36+
end
37+
function MatrixAlgebraKit.left_orth_qr!(A::AbstractBlockSparseMatrix, alg)
38+
alg′ = select_algorithm(qr_compact!, A, alg)
39+
return qr_compact!(A, alg′)
40+
end
41+
function MatrixAlgebraKit.left_orth_polar!(A::AbstractBlockSparseMatrix, alg)
42+
alg′ = select_algorithm(left_polar!, A, alg)
43+
return left_polar!(A, alg′)
44+
end
45+
function MatrixAlgebraKit.left_orth_svd!(
46+
A::AbstractBlockSparseMatrix, alg, trunc::Nothing=nothing
47+
)
48+
alg′ = select_algorithm(svd_compact!, A, alg)
49+
U, S, Vᴴ = svd_compact!(A, alg′)
50+
return U, S * Vᴴ
51+
end
52+
53+
function MatrixAlgebraKit.right_orth!(
54+
A::AbstractBlockSparseMatrix;
55+
trunc=nothing,
56+
kind=isnothing(trunc) ? :lq : :svd,
57+
alg_lq=(; positive=true),
58+
alg_polar=(;),
59+
alg_svd=(;),
60+
)
61+
if !isnothing(trunc) && kind != :svd
62+
throw(ArgumentError("truncation not supported for `right_orth` with `kind=$kind`"))
63+
end
64+
if kind == :qr
65+
# TODO: Implement this.
66+
# return right_orth_lq!(A, alg_lq)
67+
return right_orth_svd!(A, alg_svd)
68+
elseif kind == :polar
69+
return right_orth_polar!(A, alg_polar)
70+
elseif kind == :svd
71+
return right_orth_svd!(A, alg_svd, trunc)
72+
else
73+
throw(ArgumentError("`right_orth` received unknown value `kind = $kind`"))
74+
end
75+
end
76+
function MatrixAlgebraKit.right_orth_lq!(A::AbstractBlockSparseMatrix, alg)
77+
alg′ = select_algorithm(lq_compact, A, alg)
78+
return lq_compact!(A, alg′)
79+
end
80+
function MatrixAlgebraKit.right_orth_polar!(A::AbstractBlockSparseMatrix, alg)
81+
alg′ = select_algorithm(right_polar!, A, alg)
82+
return right_polar!(A, alg′)
83+
end
84+
function MatrixAlgebraKit.right_orth_svd!(
85+
A::AbstractBlockSparseMatrix, alg, trunc::Nothing=nothing
86+
)
87+
alg′ = select_algorithm(svd_compact!, A, alg)
88+
U, S, Vᴴ = svd_compact!(A, alg′)
89+
return U * S, Vᴴ
90+
end
91+
function MatrixAlgebraKit.right_orth_svd!(A::AbstractBlockSparseMatrix, alg, trunc)
92+
alg′ = select_algorithm(svd_compact!, A, alg)
93+
alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
94+
U, S, Vᴴ = svd_trunc!(A, alg_trunc)
95+
return U * S, Vᴴ
96+
end

src/factorizations/qr.jl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using MatrixAlgebraKit: MatrixAlgebraKit, qr_compact!, qr_full!
1+
using MatrixAlgebraKit: MatrixAlgebraKit, lq_compact!, lq_full!, qr_compact!, qr_full!
22

33
# TODO: this is a hardcoded for now to get around this function not being defined in the
44
# type domain
@@ -19,6 +19,23 @@ function MatrixAlgebraKit.default_algorithm(
1919
return default_blocksparse_qr_algorithm(A; kwargs...)
2020
end
2121

22+
function default_blocksparse_lq_algorithm(A::AbstractMatrix; kwargs...)
23+
blocktype(A) <: StridedMatrix{<:LinearAlgebra.BLAS.BlasFloat} ||
24+
error("unsupported type: $(blocktype(A))")
25+
alg = MatrixAlgebraKit.LAPACK_HouseholderLQ(; kwargs...)
26+
return BlockPermutedDiagonalAlgorithm(alg)
27+
end
28+
function MatrixAlgebraKit.default_algorithm(
29+
::typeof(lq_compact!), A::AbstractBlockSparseMatrix; kwargs...
30+
)
31+
return default_blocksparse_lq_algorithm(A; kwargs...)
32+
end
33+
function MatrixAlgebraKit.default_algorithm(
34+
::typeof(lq_full!), A::AbstractBlockSparseMatrix; kwargs...
35+
)
36+
return default_blocksparse_lq_algorithm(A; kwargs...)
37+
end
38+
2239
function similar_output(
2340
::typeof(qr_compact!), A, R_axis, alg::MatrixAlgebraKit.AbstractAlgorithm
2441
)

test/test_factorizations.jl

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
using BlockArrays: Block, BlockedMatrix, BlockedVector, blocks, mortar
22
using BlockSparseArrays: BlockSparseArray, BlockDiagonal, eachblockstoredindex
33
using MatrixAlgebraKit:
4+
left_orth,
5+
left_polar,
6+
qr_compact,
7+
qr_full,
8+
right_orth,
9+
left_orth,
410
left_polar,
511
lq_compact,
612
lq_full,
713
qr_compact,
814
qr_full,
15+
right_orth,
916
right_polar,
1017
svd_compact,
1118
svd_full,
@@ -166,7 +173,7 @@ end
166173
end
167174
end
168175

169-
@testset "qr_compact" for T in (Float32, Float64, ComplexF32, ComplexF64)
176+
@testset "qr_compact (T=$T)" for T in (Float32, Float64, ComplexF32, ComplexF64)
170177
for i in [2, 3], j in [2, 3], k in [2, 3], l in [2, 3]
171178
A = BlockSparseArray{T}(undef, ([i, j], [k, l]))
172179
A[Block(1, 1)] = randn(T, i, k)
@@ -177,7 +184,7 @@ end
177184
end
178185
end
179186

180-
@testset "qr_full" for T in (Float32, Float64, ComplexF32, ComplexF64)
187+
@testset "qr_full (T=$T)" for T in (Float32, Float64, ComplexF32, ComplexF64)
181188
for i in [2, 3], j in [2, 3], k in [2, 3], l in [2, 3]
182189
A = BlockSparseArray{T}(undef, ([i, j], [k, l]))
183190
A[Block(1, 1)] = randn(T, i, k)
@@ -237,3 +244,27 @@ end
237244
@test C * U A
238245
@test Matrix(U * U') LinearAlgebra.I
239246
end
247+
248+
@testset "left_orth (T=$T)" for T in (Float32, Float64, ComplexF32, ComplexF64)
249+
A = BlockSparseArray{T}(undef, ([3, 4], [2, 3]))
250+
A[Block(1, 1)] = randn(T, 3, 2)
251+
A[Block(2, 2)] = randn(T, 4, 3)
252+
253+
for kind in (:qr, :polar, :svd)
254+
U, C = left_orth(A; kind)
255+
@test U * C A
256+
@test Matrix(U'U) LinearAlgebra.I
257+
end
258+
end
259+
260+
@testset "right_orth (T=$T)" for T in (Float32, Float64, ComplexF32, ComplexF64)
261+
A = BlockSparseArray{T}(undef, ([2, 3], [3, 4]))
262+
A[Block(1, 1)] = randn(T, 2, 3)
263+
A[Block(2, 2)] = randn(T, 3, 4)
264+
265+
for kind in (:qr, :polar, :svd)
266+
C, U = right_orth(A; kind)
267+
@test C * U A
268+
@test Matrix(U * U') LinearAlgebra.I
269+
end
270+
end

0 commit comments

Comments
 (0)