1- using MatrixAlgebraKit:
2- MatrixAlgebraKit,
3- default_svd_algorithm,
4- left_null!,
5- left_null_svd!,
6- left_orth!,
7- left_polar!,
8- lq_compact!,
9- null_truncation_strategy,
10- qr_compact!,
11- right_null!,
12- right_null_svd!,
13- right_orth!,
14- right_polar!,
15- select_algorithm,
16- svd_compact!
1+ using MatrixAlgebraKit: MatrixAlgebraKit, AbstractAlgorithm, default_svd_algorithm,
2+ left_null!, left_orth!, left_polar!, lq_compact!, null_truncation_strategy, qr_compact!,
3+ right_null!, right_orth!, right_polar!, select_algorithm, svd_compact!
174
18- function MatrixAlgebraKit. initialize_output (
19- :: typeof (left_orth!), A:: AbstractBlockSparseMatrix
20- )
21- return nothing
5+ using MatrixAlgebraKit: LeftOrthAlgorithm
6+ for kind in (" polar" , " qr" , " svd" )
7+ @eval begin
8+ function MatrixAlgebraKit. initialize_output (
9+ :: typeof (left_orth!), A:: AbstractBlockSparseMatrix ,
10+ alg:: LeftOrthAlgorithm{Symbol($kind)} ,
11+ )
12+ return nothing
13+ end
14+ end
2215end
23- function MatrixAlgebraKit. check_input (:: typeof (left_orth!), A:: AbstractBlockSparseMatrix , F)
16+ function MatrixAlgebraKit. check_input (
17+ :: typeof (left_orth!), A:: AbstractBlockSparseMatrix , F, alg:: AbstractAlgorithm
18+ )
2419 ! isnothing (F) && throw (
2520 ArgumentError (
2621 " `left_orth!` on block sparse matrices does not support specifying the output"
@@ -29,55 +24,60 @@ function MatrixAlgebraKit.check_input(::typeof(left_orth!), A::AbstractBlockSpar
2924 return nothing
3025end
3126
32- function MatrixAlgebraKit. left_orth_qr! (A:: AbstractBlockSparseMatrix , F, alg)
27+ using MatrixAlgebraKit: LeftOrthViaQR
28+ function MatrixAlgebraKit. left_orth! (A:: AbstractBlockSparseMatrix , F, alg:: LeftOrthViaQR )
3329 ! isnothing (F) && throw (
3430 ArgumentError (
3531 " `left_orth!` on block sparse matrices does not support specifying the output"
3632 ),
3733 )
38- alg′ = select_algorithm (qr_compact!, A, alg)
34+ alg′ = select_algorithm (qr_compact!, A, alg. alg )
3935 return qr_compact! (A, alg′)
4036end
41- function MatrixAlgebraKit. left_orth_polar! (A:: AbstractBlockSparseMatrix , F, alg)
37+ using MatrixAlgebraKit: LeftOrthViaPolar
38+ function MatrixAlgebraKit. left_orth! (A:: AbstractBlockSparseMatrix , F, alg:: LeftOrthViaPolar )
4239 ! isnothing (F) && throw (
4340 ArgumentError (
4441 " `left_orth!` on block sparse matrices does not support specifying the output"
4542 ),
4643 )
47- alg′ = select_algorithm (left_polar!, A, alg)
44+ alg′ = select_algorithm (left_polar!, A, alg. alg )
4845 return left_polar! (A, alg′)
4946end
50- function MatrixAlgebraKit. left_orth_svd! (
51- A:: AbstractBlockSparseMatrix , F, alg, trunc:: Nothing = nothing
47+ using MatrixAlgebraKit: LeftOrthViaSVD, does_truncate
48+ function MatrixAlgebraKit. left_orth! (
49+ A:: AbstractBlockSparseMatrix , F, alg:: LeftOrthViaSVD
5250 )
5351 ! isnothing (F) && throw (
5452 ArgumentError (
5553 " `left_orth!` on block sparse matrices does not support specifying the output"
5654 ),
5755 )
58- alg′ = select_algorithm (svd_compact!, A, alg)
59- U, S, Vᴴ = svd_compact! (A, alg′)
60- return U, S * Vᴴ
61- end
62- function MatrixAlgebraKit. left_orth_svd! (A:: AbstractBlockSparseMatrix , F, alg, trunc)
63- ! isnothing (F) && throw (
64- ArgumentError (
65- " `left_orth!` on block sparse matrices does not support specifying the output"
66- ),
67- )
68- alg′ = select_algorithm (svd_compact!, A, alg)
69- alg_trunc = select_algorithm (svd_trunc!, A, alg′; trunc)
70- U, S, Vᴴ = svd_trunc! (A, alg_trunc)
56+ U, S, Vᴴ = if ! does_truncate (alg. alg)
57+ alg′ = select_algorithm (svd_compact!, A, alg. alg)
58+ svd_compact! (A, alg′)
59+ else
60+ alg′ = select_algorithm (svd_compact!, A, alg. alg)
61+ alg_trunc = select_algorithm (svd_trunc!, A, alg′)
62+ svd_trunc! (A, alg_trunc)
63+ end
7164 return U, S * Vᴴ
7265end
7366
74- function MatrixAlgebraKit. initialize_output (
75- :: typeof (right_orth!), A:: AbstractBlockSparseMatrix
76- )
77- return nothing
67+ using MatrixAlgebraKit: RightOrthAlgorithm
68+ for kind in (" lq" , " polar" , " svd" )
69+ @eval begin
70+ function MatrixAlgebraKit. initialize_output (
71+ :: typeof (right_orth!), A:: AbstractBlockSparseMatrix ,
72+ alg:: RightOrthAlgorithm{Symbol($kind)} ,
73+ )
74+ return nothing
75+ end
76+ end
7877end
7978function MatrixAlgebraKit. check_input (
80- :: typeof (right_orth!), A:: AbstractBlockSparseMatrix , F:: Nothing
79+ :: typeof (right_orth!), A:: AbstractBlockSparseMatrix , F:: Nothing ,
80+ alg:: AbstractAlgorithm ,
8181 )
8282 ! isnothing (F) && throw (
8383 ArgumentError (
@@ -87,65 +87,63 @@ function MatrixAlgebraKit.check_input(
8787 return nothing
8888end
8989
90- function MatrixAlgebraKit. right_orth_lq! (A:: AbstractBlockSparseMatrix , F, alg)
90+ using MatrixAlgebraKit: RightOrthViaLQ
91+ function MatrixAlgebraKit. right_orth! (A:: AbstractBlockSparseMatrix , F, alg:: RightOrthViaLQ )
9192 ! isnothing (F) && throw (
9293 ArgumentError (
9394 " `right_orth!` on block sparse matrices does not support specifying the output"
9495 ),
9596 )
96- alg′ = select_algorithm (lq_compact!, A, alg)
97+ alg′ = select_algorithm (lq_compact!, A, alg. alg )
9798 return lq_compact! (A, alg′)
9899end
99- function MatrixAlgebraKit. right_orth_polar! (A:: AbstractBlockSparseMatrix , F, alg)
100+ using MatrixAlgebraKit: RightOrthViaPolar
101+ function MatrixAlgebraKit. right_orth! (
102+ A:: AbstractBlockSparseMatrix , F, alg:: RightOrthViaPolar
103+ )
100104 ! isnothing (F) && throw (
101105 ArgumentError (
102106 " `right_orth!` on block sparse matrices does not support specifying the output"
103107 ),
104108 )
105- alg′ = select_algorithm (right_polar!, A, alg)
109+ alg′ = select_algorithm (right_polar!, A, alg. alg )
106110 return right_polar! (A, alg′)
107111end
108- function MatrixAlgebraKit. right_orth_svd! (
109- A:: AbstractBlockSparseMatrix , F, alg, trunc:: Nothing = nothing
112+ using MatrixAlgebraKit: RightOrthViaSVD
113+ function MatrixAlgebraKit. right_orth! (
114+ A:: AbstractBlockSparseMatrix , F, alg:: RightOrthViaSVD
110115 )
111116 ! isnothing (F) && throw (
112117 ArgumentError (
113118 " `right_orth!` on block sparse matrices does not support specifying the output"
114119 ),
115120 )
116- alg′ = select_algorithm (svd_compact!, A, alg)
117- U, S, Vᴴ = svd_compact! (A, alg′)
118- return U * S, Vᴴ
119- end
120- function MatrixAlgebraKit. right_orth_svd! (A:: AbstractBlockSparseMatrix , F, alg, trunc)
121- ! isnothing (F) && throw (
122- ArgumentError (
123- " `right_orth!` on block sparse matrices does not support specifying the output"
124- ),
125- )
126- alg′ = select_algorithm (svd_compact!, A, alg)
127- alg_trunc = select_algorithm (svd_trunc!, A, alg′; trunc)
128- U, S, Vᴴ = svd_trunc! (A, alg_trunc)
121+ U, S, Vᴴ = if ! does_truncate (alg. alg)
122+ alg′ = select_algorithm (svd_compact!, A, alg. alg)
123+ svd_compact! (A, alg′)
124+ else
125+ alg′ = select_algorithm (svd_compact!, A, alg. alg)
126+ alg_trunc = select_algorithm (svd_trunc!, A, alg′)
127+ svd_trunc! (A, alg_trunc)
128+ end
129129 return U * S, Vᴴ
130130end
131131
132132function MatrixAlgebraKit. initialize_output (
133- :: typeof (left_null!), A:: AbstractBlockSparseMatrix
133+ :: typeof (left_null!), A:: AbstractBlockSparseMatrix , alg :: AbstractAlgorithm
134134 )
135135 return nothing
136136end
137137function MatrixAlgebraKit. check_input (
138- :: typeof (left_null!), A:: AbstractBlockSparseMatrix , N:: Nothing
138+ :: typeof (left_null!), A:: AbstractBlockSparseMatrix , N:: Nothing ,
139+ alg:: AbstractAlgorithm ,
139140 )
140141 return nothing
141142end
142- function MatrixAlgebraKit. left_null_qr! (A:: AbstractBlockSparseMatrix , N, alg)
143- return left_null_svd! (A, N, default_svd_algorithm (A))
144- end
145- function MatrixAlgebraKit. left_null_svd! (
146- A:: AbstractBlockSparseMatrix , N, alg, trunc:: Nothing
143+ function MatrixAlgebraKit. left_null! (
144+ A:: AbstractBlockSparseMatrix , N, alg:: AbstractAlgorithm
147145 )
148- return left_null_svd! (A, N, alg, null_truncation_strategy (; atol = 0 , rtol = 0 ) )
146+ return error ( " Not implemented. " )
149147end
150148function MatrixAlgebraKit. truncate (
151149 :: typeof (left_null!),
@@ -156,16 +154,19 @@ function MatrixAlgebraKit.truncate(
156154end
157155
158156function MatrixAlgebraKit. initialize_output (
159- :: typeof (right_null!), A:: AbstractBlockSparseMatrix
157+ :: typeof (right_null!), A:: AbstractBlockSparseMatrix , alg :: AbstractAlgorithm
160158 )
161159 return nothing
162160end
163161function MatrixAlgebraKit. check_input (
164- :: typeof (right_null!), A:: AbstractBlockSparseMatrix , N:: Nothing
162+ :: typeof (right_null!), A:: AbstractBlockSparseMatrix , N:: Nothing ,
163+ alg:: AbstractAlgorithm ,
165164 )
166165 return nothing
167166end
168- function MatrixAlgebraKit. right_null_lq! (A:: AbstractBlockSparseMatrix , N, alg)
167+ function MatrixAlgebraKit. right_null! (
168+ A:: AbstractBlockSparseMatrix , N, alg:: AbstractAlgorithm
169+ )
169170 return error (" Not implement." )
170171end
171172function MatrixAlgebraKit. truncate (
0 commit comments