@@ -23,6 +23,14 @@ for f in (
2323 axes_Y = tuplemortar (((axes (Y, 1 ),), axes_domain))
2424 return unmatricize (X, axes_X), unmatricize (Y, axes_Y)
2525 end
26+ end
27+ end
28+
29+ for f in (
30+ :qr , :lq , :left_polar , :right_polar , :polar , :left_orth , :right_orth , :orth , :factorize ,
31+ :eigen , :eigvals , :svd , :svdvals , :left_null , :right_null ,
32+ )
33+ @eval begin
2634 function $f (
2735 A:: AbstractArray ,
2836 codomain_perm:: Tuple{Vararg{Int}} , domain_perm:: Tuple{Vararg{Int}} ;
@@ -183,26 +191,18 @@ their labels or directly through a bi-permutation.
183191See also `MatrixAlgebraKit.eig_full!`, `MatrixAlgebraKit.eig_trunc!`, `MatrixAlgebraKit.eig_vals!`,
184192`MatrixAlgebraKit.eigh_full!`, `MatrixAlgebraKit.eigh_trunc!`, and `MatrixAlgebraKit.eigh_vals!`.
185193"""
186- function eigen (A:: AbstractArray , labels_A, labels_codomain, labels_domain; kwargs... )
187- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
188- return eigen (A, blocks (biperm)... ; kwargs... )
189- end
190- function eigen (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} ; kwargs... )
191- return eigen (A, blocks (biperm)... ; kwargs... )
192- end
193194function eigen (
194195 A:: AbstractArray ,
195- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}} ;
196+ codomain_length :: Val , domain_length :: Val ;
196197 kwargs... ,
197198 )
198199 # tensor to matrix
199- A_mat = matricize (A, codomain_perm, domain_perm)
200-
200+ A_mat = matricize (A, codomain_length, domain_length)
201201 # factorization
202202 D, V = MatrixAlgebra. eigen! (A_mat; kwargs... )
203203
204204 # matrix to tensor
205- biperm = permmortar ((codomain_perm, domain_perm ))
205+ biperm = blockedtrivialperm ((codomain_length, domain_length ))
206206 axes_codomain, = blocks (axes (A)[biperm])
207207 axes_V = tuplemortar ((axes_codomain, (axes (V, ndims (V)),)))
208208 return D, unmatricize (V, axes_V)
@@ -225,19 +225,12 @@ their labels or directly through a bi-permutation. The output is a vector of eig
225225
226226See also `MatrixAlgebraKit.eig_vals!` and `MatrixAlgebraKit.eigh_vals!`.
227227"""
228- function eigvals (A:: AbstractArray , labels_A, labels_codomain, labels_domain; kwargs... )
229- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
230- return eigvals (A, blocks (biperm)... ; kwargs... )
231- end
232- function eigvals (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} ; kwargs... )
233- return eigvals (A, blocks (biperm)... ; kwargs... )
234- end
235228function eigvals (
236229 A:: AbstractArray ,
237- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}} ;
230+ codomain_length :: Val , domain_length :: Val ;
238231 kwargs... ,
239232 )
240- A_mat = matricize (A, codomain_perm, domain_perm )
233+ A_mat = matricize (A, codomain_length, domain_length )
241234 return MatrixAlgebra. eigvals! (A_mat; kwargs... )
242235end
243236
@@ -259,26 +252,18 @@ their labels or directly through a bi-permutation.
259252
260253See also `MatrixAlgebraKit.svd_full!`, `MatrixAlgebraKit.svd_compact!`, and `MatrixAlgebraKit.svd_trunc!`.
261254"""
262- function svd (A:: AbstractArray , labels_A, labels_codomain, labels_domain; kwargs... )
263- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
264- return svd (A, blocks (biperm)... ; kwargs... )
265- end
266- function svd (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} ; kwargs... )
267- return svd (A, blocks (biperm)... ; kwargs... )
268- end
269255function svd (
270256 A:: AbstractArray ,
271- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}} ;
257+ codomain_length :: Val , domain_length :: Val ;
272258 kwargs... ,
273259 )
274260 # tensor to matrix
275- A_mat = matricize (A, codomain_perm, domain_perm)
276-
261+ A_mat = matricize (A, codomain_length, domain_length)
277262 # factorization
278263 U, S, Vᴴ = MatrixAlgebra. svd! (A_mat; kwargs... )
279264
280265 # matrix to tensor
281- biperm = permmortar ((codomain_perm, domain_perm ))
266+ biperm = blockedtrivialperm ((codomain_length, domain_length ))
282267 axes_codomain, axes_domain = blocks (axes (A)[biperm])
283268 axes_U = tuplemortar ((axes_codomain, (axes (U, 2 ),)))
284269 axes_Vᴴ = tuplemortar (((axes (Vᴴ, 1 ),), axes_domain))
@@ -296,18 +281,11 @@ their labels or directly through a bi-permutation. The output is a vector of sin
296281
297282See also `MatrixAlgebraKit.svd_vals!`.
298283"""
299- function svdvals (A:: AbstractArray , labels_A, labels_codomain, labels_domain)
300- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
301- return svdvals (A, blocks (biperm)... )
302- end
303- function svdvals (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} )
304- return svdvals (A, blocks (biperm)... )
305- end
306284function svdvals (
307285 A:: AbstractArray ,
308- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}}
286+ codomain_length :: Val , domain_length :: Val
309287 )
310- A_mat = matricize (A, codomain_perm, domain_perm )
288+ A_mat = matricize (A, codomain_length, domain_length )
311289 return MatrixAlgebra. svdvals! (A_mat)
312290end
313291
@@ -329,21 +307,14 @@ The output satisfies `N' * A ≈ 0` and `N' * N ≈ I`.
329307 The options are `:qr`, `:qrpos` and `:svd`. The former two require `0 == atol == rtol`.
330308 The default is `:qrpos` if `atol == rtol == 0`, and `:svd` otherwise.
331309"""
332- function left_null (A:: AbstractArray , labels_A, labels_codomain, labels_domain; kwargs... )
333- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
334- return left_null (A, blocks (biperm)... ; kwargs... )
335- end
336- function left_null (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} ; kwargs... )
337- return left_null (A, blocks (biperm)... ; kwargs... )
338- end
339310function left_null (
340311 A:: AbstractArray ,
341- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}} ;
312+ codomain_length :: Val , domain_length :: Val ;
342313 kwargs... ,
343314 )
344- A_mat = matricize (A, codomain_perm, domain_perm )
315+ A_mat = matricize (A, codomain_length, domain_length )
345316 N = MatrixAlgebraKit. left_null! (A_mat; kwargs... )
346- biperm = permmortar ((codomain_perm, domain_perm ))
317+ biperm = blockedtrivialperm ((codomain_length, domain_length ))
347318 axes_codomain = first (blocks (axes (A)[biperm]))
348319 axes_N = tuplemortar ((axes_codomain, (axes (N, 2 ),)))
349320 return unmatricize (N, axes_N)
@@ -367,21 +338,14 @@ The output satisfies `A * Nᴴ' ≈ 0` and `Nᴴ * Nᴴ' ≈ I`.
367338 The options are `:lq`, `:lqpos` and `:svd`. The former two require `0 == atol == rtol`.
368339 The default is `:lqpos` if `atol == rtol == 0`, and `:svd` otherwise.
369340"""
370- function right_null (A:: AbstractArray , labels_A, labels_codomain, labels_domain; kwargs... )
371- biperm = blockedperm_indexin (Tuple .((labels_A, labels_codomain, labels_domain))... )
372- return right_null (A, blocks (biperm)... ; kwargs... )
373- end
374- function right_null (A:: AbstractArray , biperm:: AbstractBlockPermutation{2} ; kwargs... )
375- return right_null (A, blocks (biperm)... ; kwargs... )
376- end
377341function right_null (
378342 A:: AbstractArray ,
379- codomain_perm :: Tuple{Vararg{Int}} , domain_perm :: Tuple{Vararg{Int}} ;
343+ codomain_length :: Val , domain_length :: Val ;
380344 kwargs... ,
381345 )
382- A_mat = matricize (A, codomain_perm, domain_perm )
346+ A_mat = matricize (A, codomain_length, domain_length )
383347 Nᴴ = MatrixAlgebraKit. right_null! (A_mat; kwargs... )
384- biperm = permmortar ((codomain_perm, domain_perm ))
348+ biperm = blockedtrivialperm ((codomain_length, domain_length ))
385349 axes_domain = last (blocks ((axes (A)[biperm])))
386350 axes_Nᴴ = tuplemortar (((axes (Nᴴ, 1 ),), axes_domain))
387351 return unmatricize (Nᴴ, axes_Nᴴ)
0 commit comments