Skip to content

Commit 825c816

Browse files
committed
Simplify implementation
1 parent 835c523 commit 825c816

File tree

3 files changed

+30
-73
lines changed

3 files changed

+30
-73
lines changed

src/factorizations/orthnull.jl

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,68 @@
11
using MatrixAlgebraKit:
22
MatrixAlgebraKit,
3-
left_orth_polar!,
4-
left_orth_qr!,
5-
left_orth_svd!,
3+
left_orth!,
64
left_polar!,
75
lq_compact!,
86
qr_compact!,
9-
right_orth_lq!,
10-
right_orth_polar!,
11-
right_orth_svd!,
7+
right_orth!,
128
right_polar!,
139
select_algorithm,
1410
svd_compact!
1511

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=(;),
12+
function MatrixAlgebraKit.initialize_output(
13+
::typeof(left_orth!), A::AbstractBlockSparseMatrix
2314
)
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
15+
return nothing
3616
end
37-
function MatrixAlgebraKit.left_orth_qr!(A::AbstractBlockSparseMatrix, alg)
17+
function MatrixAlgebraKit.check_input(
18+
::typeof(left_orth!), A::AbstractBlockSparseMatrix, F::Nothing
19+
)
20+
return nothing
21+
end
22+
23+
function MatrixAlgebraKit.left_orth_qr!(A::AbstractBlockSparseMatrix, F, alg)
3824
alg′ = select_algorithm(qr_compact!, A, alg)
3925
return qr_compact!(A, alg′)
4026
end
41-
function MatrixAlgebraKit.left_orth_polar!(A::AbstractBlockSparseMatrix, alg)
27+
function MatrixAlgebraKit.left_orth_polar!(A::AbstractBlockSparseMatrix, F, alg)
4228
alg′ = select_algorithm(left_polar!, A, alg)
4329
return left_polar!(A, alg′)
4430
end
4531
function MatrixAlgebraKit.left_orth_svd!(
46-
A::AbstractBlockSparseMatrix, alg, trunc::Nothing=nothing
32+
A::AbstractBlockSparseMatrix, F, alg, trunc::Nothing=nothing
4733
)
4834
alg′ = select_algorithm(svd_compact!, A, alg)
4935
U, S, Vᴴ = svd_compact!(A, alg′)
5036
return U, S * Vᴴ
5137
end
5238

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=(;),
39+
function MatrixAlgebraKit.initialize_output(
40+
::typeof(right_orth!), A::AbstractBlockSparseMatrix
6041
)
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
42+
return nothing
7543
end
76-
function MatrixAlgebraKit.right_orth_lq!(A::AbstractBlockSparseMatrix, alg)
77-
alg′ = select_algorithm(lq_compact, A, alg)
44+
function MatrixAlgebraKit.check_input(
45+
::typeof(right_orth!), A::AbstractBlockSparseMatrix, F::Nothing
46+
)
47+
return nothing
48+
end
49+
50+
function MatrixAlgebraKit.right_orth_lq!(A::AbstractBlockSparseMatrix, F, alg)
51+
alg′ = select_algorithm(lq_compact!, A, alg)
7852
return lq_compact!(A, alg′)
7953
end
80-
function MatrixAlgebraKit.right_orth_polar!(A::AbstractBlockSparseMatrix, alg)
54+
function MatrixAlgebraKit.right_orth_polar!(A::AbstractBlockSparseMatrix, F, alg)
8155
alg′ = select_algorithm(right_polar!, A, alg)
8256
return right_polar!(A, alg′)
8357
end
8458
function MatrixAlgebraKit.right_orth_svd!(
85-
A::AbstractBlockSparseMatrix, alg, trunc::Nothing=nothing
59+
A::AbstractBlockSparseMatrix, F, alg, trunc::Nothing=nothing
8660
)
8761
alg′ = select_algorithm(svd_compact!, A, alg)
8862
U, S, Vᴴ = svd_compact!(A, alg′)
8963
return U * S, Vᴴ
9064
end
91-
function MatrixAlgebraKit.right_orth_svd!(A::AbstractBlockSparseMatrix, alg, trunc)
65+
function MatrixAlgebraKit.right_orth_svd!(A::AbstractBlockSparseMatrix, F, alg, trunc)
9266
alg′ = select_algorithm(svd_compact!, A, alg)
9367
alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
9468
U, S, Vᴴ = svd_trunc!(A, alg_trunc)

src/factorizations/qr.jl

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,6 @@ 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-
3922
function similar_output(
4023
::typeof(qr_compact!), A, R_axis, alg::MatrixAlgebraKit.AbstractAlgorithm
4124
)

test/test_factorizations.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ end
250250
A[Block(1, 1)] = randn(T, 3, 2)
251251
A[Block(2, 2)] = randn(T, 4, 3)
252252

253-
for kind in (:qr, :polar, :svd)
253+
for kind in (:polar, :qr, :svd)
254254
U, C = left_orth(A; kind)
255255
@test U * C A
256256
@test Matrix(U'U) LinearAlgebra.I
@@ -262,7 +262,7 @@ end
262262
A[Block(1, 1)] = randn(T, 2, 3)
263263
A[Block(2, 2)] = randn(T, 3, 4)
264264

265-
for kind in (:qr, :polar, :svd)
265+
for kind in (:lq, :polar, :svd)
266266
C, U = right_orth(A; kind)
267267
@test C * U A
268268
@test Matrix(U * U') LinearAlgebra.I

0 commit comments

Comments
 (0)