|
62 | 62 | #------------------------------------------------------------------------------------------ |
63 | 63 | const RealOrComplexFloat = Union{AbstractFloat,Complex{<:AbstractFloat}} |
64 | 64 |
|
65 | | -# DiagonalTensorMap |
66 | | -# ----------------- |
67 | | -function leftorth!(d::DiagonalTensorMap; alg=QR(), kwargs...) |
68 | | - @assert alg isa Union{QR,QL} |
69 | | - return one(d), d # TODO: this is only correct for `alg = QR()` or `alg = QL()` |
70 | | -end |
71 | | -function rightorth!(d::DiagonalTensorMap; alg=LQ(), kwargs...) |
72 | | - @assert alg isa Union{LQ,RQ} |
73 | | - return d, one(d) # TODO: this is only correct for `alg = LQ()` or `alg = RQ()` |
74 | | -end |
75 | | -leftnull!(d::DiagonalTensorMap; kwargs...) = leftnull!(TensorMap(d); kwargs...) |
76 | | -rightnull!(d::DiagonalTensorMap; kwargs...) = rightnull!(TensorMap(d); kwargs...) |
77 | | - |
78 | | -function tsvd!(d::DiagonalTensorMap; trunc=NoTruncation(), p::Real=2, alg=SDD()) |
79 | | - return _tsvd!(d, alg, trunc, p) |
80 | | -end |
81 | | - |
82 | | -# helper function |
83 | | -function _compute_svddata!(d::DiagonalTensorMap, alg::Union{SVD,SDD}) |
84 | | - InnerProductStyle(d) === EuclideanInnerProduct() || throw_invalid_innerproduct(:tsvd!) |
85 | | - I = sectortype(d) |
86 | | - dims = SectorDict{I,Int}() |
87 | | - generator = Base.Iterators.map(blocks(d)) do (c, b) |
88 | | - lb = length(b.diag) |
89 | | - U = zerovector!(similar(b.diag, lb, lb)) |
90 | | - V = zerovector!(similar(b.diag, lb, lb)) |
91 | | - p = sortperm(b.diag; by=abs, rev=true) |
92 | | - for (i, pi) in enumerate(p) |
93 | | - U[pi, i] = safesign(b.diag[pi]) |
94 | | - V[i, pi] = 1 |
95 | | - end |
96 | | - Σ = abs.(view(b.diag, p)) |
97 | | - dims[c] = lb |
98 | | - return c => (U, Σ, V) |
99 | | - end |
100 | | - SVDdata = SectorDict(generator) |
101 | | - return SVDdata, dims |
102 | | -end |
103 | | - |
104 | | -eig!(d::DiagonalTensorMap) = d, one(d) |
105 | | -eigh!(d::DiagonalTensorMap{<:Real}) = d, one(d) |
106 | | -eigh!(d::DiagonalTensorMap{<:Complex}) = DiagonalTensorMap(real(d.data), d.domain), one(d) |
107 | | - |
108 | | -function LinearAlgebra.svdvals(d::DiagonalTensorMap) |
109 | | - return SectorDict(c => LinearAlgebra.svdvals(b) for (c, b) in blocks(d)) |
110 | | -end |
111 | | -function LinearAlgebra.eigvals(d::DiagonalTensorMap) |
112 | | - return SectorDict(c => LinearAlgebra.eigvals(b) for (c, b) in blocks(d)) |
113 | | -end |
114 | | - |
115 | | -function LinearAlgebra.cond(d::DiagonalTensorMap, p::Real=2) |
116 | | - return LinearAlgebra.cond(Diagonal(d.data), p) |
117 | | -end |
118 | | - |
119 | 65 | #------------------------------# |
120 | 66 | # LinearAlgebra overloads |
121 | 67 | #------------------------------# |
122 | | -#LinearAlgebra.svdvals(t::AbstractTensorMap) = diagview(svd_vals(t)) |
123 | 68 | LinearAlgebra.svdvals!(t::AbstractTensorMap) = diagview(svd_vals!(t)) |
124 | | -#LinearAlgebra.eigvals(t::AbstractTensorMap) = diagview(eig_vals(t)) |
125 | 69 | LinearAlgebra.eigvals!(t::AbstractTensorMap; kwargs...) = diagview(eig_vals!(t)) |
126 | 70 |
|
127 | 71 | #--------------------------------------------------# |
|
0 commit comments