Skip to content

Commit 4e846a8

Browse files
committed
Update factorizations
1 parent 5f20623 commit 4e846a8

File tree

1 file changed

+24
-60
lines changed

1 file changed

+24
-60
lines changed

src/factorizations.jl

Lines changed: 24 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
183191
See 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
193194
function 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
226226
See 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
235228
function 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...)
242235
end
243236

@@ -259,26 +252,18 @@ their labels or directly through a bi-permutation.
259252
260253
See 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
269255
function 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
297282
See 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
306284
function 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)
312290
end
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
339310
function 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
377341
function 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

Comments
 (0)