@@ -12,7 +12,9 @@ using ITensors:
12
12
map_diag,
13
13
noncommonind,
14
14
noprime,
15
+ replaceind,
15
16
replaceinds,
17
+ sim,
16
18
space,
17
19
sqrt_decomp
18
20
using ITensors. NDTensors:
@@ -52,16 +54,24 @@ invsqrt_diag(it::ITensor) = map_diag(inv ∘ sqrt, it)
52
54
pinv_diag (it:: ITensor ) = map_diag (pinv, it)
53
55
pinvsqrt_diag (it:: ITensor ) = map_diag (pinv ∘ sqrt, it)
54
56
55
- function map_itensor (
56
- f:: Function , A:: ITensor , lind= first (inds (A)); regularization= nothing , kwargs...
57
- )
58
- USV = svd (A, lind; kwargs... )
59
- U, S, V, spec, u, v = USV
60
- S = map_diag (s -> f (s + regularization), S)
61
- sqrtDL, δᵤᵥ, sqrtDR = sqrt_decomp (S, u, v)
62
- sqrtDR = denseblocks (sqrtDR) * denseblocks (δᵤᵥ)
63
- L, R = U * sqrtDL, V * sqrtDR
64
- return L * R
57
+ # TODO : Make this work for non-hermitian A
58
+ function eigendecomp (A:: ITensor , linds, rinds; ishermitian= false , kwargs... )
59
+ @assert ishermitian
60
+ D, U = eigen (A, linds, rinds; ishermitian, kwargs... )
61
+ ul, ur = noncommonind (D, U), commonind (D, U)
62
+ Ul = replaceinds (U, vcat (rinds, ur), vcat (linds, ul))
63
+
64
+ return Ul, D, dag (U)
65
+ end
66
+
67
+ function map_eigvals (f:: Function , A:: ITensor , inds... ; ishermitian= false , kwargs... )
68
+ if isdiag (A)
69
+ return map_diag (f, A)
70
+ end
71
+
72
+ Ul, D, Ur = eigendecomp (A, inds... ; ishermitian, kwargs... )
73
+
74
+ return Ul * map_diag (f, D) * Ur
65
75
end
66
76
67
77
# Analagous to `denseblocks`.
0 commit comments