@@ -5,7 +5,7 @@ copy_input(::typeof(right_orth), A) = copy_input(lq_compact, A) # do we ever nee
55copy_input(:: typeof (left_null), A) = copy_input(qr_null, A) # do we ever need anything else
66copy_input(:: typeof (right_null), A) = copy_input(lq_null, A) # do we ever need anything else
77
8- function check_input(:: typeof (left_orth!), A:: AbstractMatrix , VC)
8+ function check_input(:: typeof (left_orth!), A:: AbstractMatrix , VC, :: AbstractAlgorithm )
99 m, n = size(A)
1010 minmn = min(m, n)
1111 V, C = VC
@@ -18,7 +18,7 @@ function check_input(::typeof(left_orth!), A::AbstractMatrix, VC)
1818 end
1919 return nothing
2020end
21- function check_input(:: typeof (right_orth!), A:: AbstractMatrix , CVᴴ)
21+ function check_input(:: typeof (right_orth!), A:: AbstractMatrix , CVᴴ, :: AbstractAlgorithm )
2222 m, n = size(A)
2323 minmn = min(m, n)
2424 C, Vᴴ = CVᴴ
@@ -32,15 +32,15 @@ function check_input(::typeof(right_orth!), A::AbstractMatrix, CVᴴ)
3232 return nothing
3333end
3434
35- function check_input(:: typeof (left_null!), A:: AbstractMatrix , N)
35+ function check_input(:: typeof (left_null!), A:: AbstractMatrix , N, :: AbstractAlgorithm )
3636 m, n = size(A)
3737 minmn = min(m, n)
3838 @assert N isa AbstractMatrix
3939 @check_size(N, (m, m - minmn))
4040 @check_scalar(N, A)
4141 return nothing
4242end
43- function check_input(:: typeof (right_null!), A:: AbstractMatrix , Nᴴ)
43+ function check_input(:: typeof (right_null!), A:: AbstractMatrix , Nᴴ, :: AbstractAlgorithm )
4444 m, n = size(A)
4545 minmn = min(m, n)
4646 @assert Nᴴ isa AbstractMatrix
8484function left_orth!(A, VC; trunc= nothing ,
8585 kind= isnothing(trunc) ? :qr : :svd, alg_qr= (; positive= true ),
8686 alg_polar= (;), alg_svd= (;))
87- check_input(left_orth!, A, VC)
8887 if ! isnothing(trunc) && kind != :svd
8988 throw(ArgumentError(" truncation not supported for left_orth with kind=$kind " ))
9089 end
@@ -100,34 +99,40 @@ function left_orth!(A, VC; trunc=nothing,
10099end
101100function left_orth_qr!(A, VC, alg)
102101 alg′ = select_algorithm(qr_compact!, A, alg)
102+ check_input(left_orth!, A, VC, alg′)
103103 return qr_compact!(A, VC, alg′)
104104end
105105function left_orth_polar!(A, VC, alg)
106106 alg′ = select_algorithm(left_polar!, A, alg)
107+ check_input(left_orth!, A, VC, alg′)
107108 return left_polar!(A, VC, alg′)
108109end
109110function left_orth_svd!(A, VC, alg, trunc:: Nothing = nothing )
110111 alg′ = select_algorithm(svd_compact!, A, alg)
112+ check_input(left_orth!, A, VC, alg′)
111113 U, S, Vᴴ = svd_compact!(A, alg′)
112114 V, C = VC
113115 return copy!(V, U), mul!(C, S, Vᴴ)
114116end
115117function left_orth_svd!(A:: AbstractMatrix , VC, alg, trunc:: Nothing = nothing )
116118 alg′ = select_algorithm(svd_compact!, A, alg)
119+ check_input(left_orth!, A, VC, alg′)
117120 V, C = VC
118121 S = Diagonal(initialize_output(svd_vals!, A, alg′))
119122 U, S, Vᴴ = svd_compact!(A, (V, S, C), alg′)
120123 return U, lmul!(S, Vᴴ)
121124end
122125function left_orth_svd!(A, VC, alg, trunc)
123126 alg′ = select_algorithm(svd_compact!, A, alg)
127+ check_input(left_orth!, A, VC, alg′)
124128 alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
125129 U, S, Vᴴ = svd_trunc!(A, alg_trunc)
126130 V, C = VC
127131 return copy!(V, U), mul!(C, S, Vᴴ)
128132end
129133function left_orth_svd!(A:: AbstractMatrix , VC, alg, trunc)
130134 alg′ = select_algorithm(svd_compact!, A, alg)
135+ check_input(left_orth!, A, VC, alg′)
131136 alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
132137 V, C = VC
133138 S = Diagonal(initialize_output(svd_vals!, A, alg_trunc. alg))
138143function right_orth!(A, CVᴴ; trunc= nothing ,
139144 kind= isnothing(trunc) ? :lq : :svd, alg_lq= (; positive= true ),
140145 alg_polar= (;), alg_svd= (;))
141- check_input(right_orth!, A, CVᴴ)
142146 if ! isnothing(trunc) && kind != :svd
143147 throw(ArgumentError(" truncation not supported for right_orth with kind=$kind " ))
144148 end
@@ -154,34 +158,40 @@ function right_orth!(A, CVᴴ; trunc=nothing,
154158end
155159function right_orth_lq!(A, CVᴴ, alg)
156160 alg′ = select_algorithm(lq_compact!, A, alg)
161+ check_input(right_orth!, A, CVᴴ, alg′)
157162 return lq_compact!(A, CVᴴ, alg′)
158163end
159164function right_orth_polar!(A, CVᴴ, alg)
160165 alg′ = select_algorithm(right_polar!, A, alg)
166+ check_input(right_orth!, A, CVᴴ, alg′)
161167 return right_polar!(A, CVᴴ, alg′)
162168end
163169function right_orth_svd!(A, CVᴴ, alg, trunc:: Nothing = nothing )
164170 alg′ = select_algorithm(svd_compact!, A, alg)
171+ check_input(right_orth!, A, CVᴴ, alg′)
165172 U, S, Vᴴ′ = svd_compact!(A, alg′)
166173 C, Vᴴ = CVᴴ
167174 return mul!(C, U, S), copy!(Vᴴ, Vᴴ′)
168175end
169176function right_orth_svd!(A:: AbstractMatrix , CVᴴ, alg, trunc:: Nothing = nothing )
170177 alg′ = select_algorithm(svd_compact!, A, alg)
178+ check_input(right_orth!, A, CVᴴ, alg′)
171179 C, Vᴴ = CVᴴ
172180 S = Diagonal(initialize_output(svd_vals!, A, alg′))
173181 U, S, Vᴴ = svd_compact!(A, (C, S, Vᴴ), alg′)
174182 return rmul!(U, S), Vᴴ
175183end
176184function right_orth_svd!(A, CVᴴ, alg, trunc)
177185 alg′ = select_algorithm(svd_compact!, A, alg)
186+ check_input(right_orth!, A, CVᴴ, alg′)
178187 alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
179188 U, S, Vᴴ′ = svd_trunc!(A, alg_trunc)
180189 C, Vᴴ = CVᴴ
181190 return mul!(C, U, S), copy!(Vᴴ, Vᴴ′)
182191end
183192function right_orth_svd!(A:: AbstractMatrix , CVᴴ, alg, trunc)
184193 alg′ = select_algorithm(svd_compact!, A, alg)
194+ check_input(right_orth!, A, CVᴴ, alg′)
185195 alg_trunc = select_algorithm(svd_trunc!, A, alg′; trunc)
186196 C, Vᴴ = CVᴴ
187197 S = Diagonal(initialize_output(svd_vals!, A, alg_trunc. alg))
204214function left_null!(A, N; trunc= nothing ,
205215 kind= isnothing(trunc) ? :qr : :svd, alg_qr= (; positive= true ),
206216 alg_svd= (;))
207- check_input(left_null!, A, N)
208217 if ! isnothing(trunc) && kind != :svd
209218 throw(ArgumentError(" truncation not supported for left_null with kind=$kind " ))
210219 end
@@ -218,10 +227,12 @@ function left_null!(A, N; trunc=nothing,
218227end
219228function left_null_qr!(A, N, alg)
220229 alg′ = select_algorithm(qr_null!, A, alg)
230+ check_input(left_null!, A, N, alg′)
221231 return qr_null!(A, N, alg′)
222232end
223233function left_null_svd!(A, N, alg, trunc:: Nothing = nothing )
224234 alg′ = select_algorithm(svd_full!, A, alg)
235+ check_input(left_null!, A, N, alg′)
225236 U, _, _ = svd_full!(A, alg′)
226237 (m, n) = size(A)
227238 return copy!(N, view(U, 1 : m, (n + 1 ): m))
238249function right_null!(A, Nᴴ; trunc= nothing ,
239250 kind= isnothing(trunc) ? :lq : :svd, alg_lq= (; positive= true ),
240251 alg_svd= (;))
241- check_input(right_null!, A, Nᴴ)
242252 if ! isnothing(trunc) && kind != :svd
243253 throw(ArgumentError(" truncation not supported for right_null with kind=$kind " ))
244254 end
@@ -252,16 +262,19 @@ function right_null!(A, Nᴴ; trunc=nothing,
252262end
253263function right_null_lq!(A, Nᴴ, alg)
254264 alg′ = select_algorithm(lq_null!, A, alg)
265+ check_input(right_null!, A, Nᴴ, alg′)
255266 return lq_null!(A, Nᴴ, alg′)
256267end
257268function right_null_svd!(A, Nᴴ, alg, trunc:: Nothing = nothing )
258269 alg′ = select_algorithm(svd_full!, A, alg)
270+ check_input(right_null!, A, Nᴴ, alg′)
259271 _, _, Vᴴ = svd_full!(A, alg′)
260272 (m, n) = size(A)
261273 return copy!(Nᴴ, view(Vᴴ, (m + 1 ): n, 1 : n))
262274end
263275function right_null_svd!(A, Nᴴ, alg, trunc)
264276 alg′ = select_algorithm(svd_full!, A, alg)
277+ check_input(right_null!, A, Nᴴ, alg′)
265278 _, S, Vᴴ = svd_full!(A, alg′)
266279 trunc′ = trunc isa TruncationStrategy ? trunc :
267280 trunc isa NamedTuple ? null_truncation_strategy(; trunc... ) :
0 commit comments