Skip to content

Commit d5f3168

Browse files
authored
Merge 182e412 into 6b6b362
2 parents 6b6b362 + 182e412 commit d5f3168

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/tensor_operations/matrix_decomposition.jl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ Perform a factorization of `A` into ITensors `L` and `R` such that `A ≈ L * R`
630630
631631
For truncation arguments, see: [`svd`](@ref)
632632
"""
633-
function factorize(A::ITensor, Linds...; kwargs...)
633+
function factorize(A::ITensor, Linds...; maxdim=nothing, kwargs...)
634634
ortho::String = get(kwargs, :ortho, "left")
635635
tags::TagSet = get(kwargs, :tags, "Link,fact")
636636
plev::Int = get(kwargs, :plev, 0)
@@ -661,9 +661,14 @@ function factorize(A::ITensor, Linds...; kwargs...)
661661
# Determines when to use eigen vs. svd (eigen is less precise,
662662
# so eigen should only be used if a larger cutoff is requested)
663663
automatic_cutoff = 1e-12
664-
Lis = indices(Linds...)
665-
dL, dR = dim(Lis), dim(indices(setdiff(inds(A), Lis)))
666-
maxdim = get(kwargs, :maxdim, min(dL, dR))
664+
Lis = commoninds(A, indices(Linds...))
665+
Ris = uniqueinds(A, Lis)
666+
dL, dR = dim(Lis), dim(Ris)
667+
# maxdim is forced to be at most the max given SVD
668+
if isnothing(maxdim)
669+
maxdim = min(dL, dR)
670+
end
671+
maxdim = min(maxdim, min(dL, dR))
667672
might_truncate = !isnothing(cutoff) || maxdim < min(dL, dR)
668673

669674
if isnothing(which_decomp)
@@ -677,13 +682,13 @@ function factorize(A::ITensor, Linds...; kwargs...)
677682
end
678683

679684
if which_decomp == "svd"
680-
LR = factorize_svd(A, Linds...; kwargs...)
685+
LR = factorize_svd(A, Linds...; kwargs..., maxdim=maxdim)
681686
if isnothing(LR)
682687
return nothing
683688
end
684689
L, R, spec = LR
685690
elseif which_decomp == "eigen"
686-
L, R, spec = factorize_eigen(A, Linds...; kwargs...)
691+
L, R, spec = factorize_eigen(A, Linds...; kwargs..., maxdim=maxdim)
687692
elseif which_decomp == "qr"
688693
L, R = factorize_qr(A, Linds...; kwargs...)
689694
spec = Spectrum(nothing, 0.0)

test/base/test_decomp.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,20 @@ end
465465
@test blockdim(u, b) == blockdim(i, b) || blockdim(u, b) >= min_blockdim
466466
end
467467
end
468+
469+
@testset "factorize with mindim" begin
470+
l = Index(8, "l")
471+
s1 = Index(2, "s1")
472+
s2 = Index(2, "s2")
473+
r = Index(2, "r")
474+
475+
phi = randomITensor(l, s1, s2, r)
476+
477+
U, B = factorize(phi, (l, s1); ortho="left", mindim=8, which_decomp="eigen")
478+
479+
@test norm(U * B - phi) < 1E-5
480+
@test dim(commonind(U, B)) <= 4
481+
end
468482
end
469483

470484
nothing

0 commit comments

Comments
 (0)