@@ -118,268 +118,11 @@ function MAK.initialize_output(::typeof(svd_compact!), t::AbstractBlockTensorMap
118118 return U, S, Vᴴ
119119end
120120
121- # function TK.leftorth!(
122- # t::AbstractBlockTensorMap;
123- # alg::Union{QR, QRpos, QL, QLpos, SVD, SDD, Polar} = QRpos(),
124- # atol::Real = zero(float(real(scalartype(t)))),
125- # rtol::Real = if (alg ∉ (SVD(), SDD()))
126- # zero(float(real(scalartype(t))))
127- # else
128- # eps(real(float(one(scalartype(t))))) * iszero(atol)
129- # end,
130- # )
131- # InnerProductStyle(t) === EuclideanInnerProduct() || throw_invalid_innerproduct(:leftorth!)
132- # if !iszero(rtol)
133- # atol = max(atol, rtol * norm(t))
134- # end
135- # I = sectortype(t)
136- # dims = TK.SectorDict{I, Int}()
137- #
138- # # compute QR factorization for each block
139- # if !isempty(TK.blocks(t))
140- # generator = Base.Iterators.map(TK.blocks(t)) do (c, b)
141- # Qc, Rc = TK.MatrixAlgebra.leftorth!(b, alg, atol)
142- # dims[c] = size(Qc, 2)
143- # return c => (Qc, Rc)
144- # end
145- # QRdata = SectorDict(generator)
146- # end
147- #
148- # # construct new space
149- # S = spacetype(t)
150- # V = S(dims)
151- # if alg isa Polar
152- # @assert V ≅ domain(t)
153- # W = domain(t)
154- # else
155- # W = ProductSpace(V)
156- # end
157- #
158- # # construct output tensors
159- # T = float(scalartype(t))
160- # Q = similar(t, T, codomain(t) ← W)
161- # R = similar(t, T, W ← domain(t))
162- # if !isempty(blocksectors(domain(t)))
163- # for (c, (Qc, Rc)) in QRdata
164- # block(Q, c) .= Qc
165- # block(R, c) .= Rc
166- # end
167- # end
168- # return Q, R
169- # end
170- # function TK.leftorth!(t::SparseBlockTensorMap; kwargs...)
171- # return leftorth!(BlockTensorMap(t); kwargs...)
172- # end
173- #
174- # function TK.leftnull!(
175- # t::BlockTensorMap;
176- # alg::Union{QR, QRpos, SVD, SDD} = QRpos(),
177- # atol::Real = zero(float(real(scalartype(t)))),
178- # rtol::Real = if (alg ∉ (SVD(), SDD()))
179- # zero(float(real(scalartype(t))))
180- # else
181- # eps(real(float(one(scalartype(t))))) * iszero(atol)
182- # end,
183- # )
184- # InnerProductStyle(t) === EuclideanInnerProduct() ||
185- # throw_invalid_innerproduct(:leftnull!)
186- # if !iszero(rtol)
187- # atol = max(atol, rtol * norm(t))
188- # end
189- # I = sectortype(t)
190- # dims = SectorDict{I, Int}()
191- #
192- # # compute QR factorization for each block
193- # V = codomain(t)
194- # if !isempty(blocksectors(V))
195- # generator = Base.Iterators.map(blocksectors(V)) do c
196- # Nc = MatrixAlgebra.leftnull!(block(t, c), alg, atol)
197- # dims[c] = size(Nc, 2)
198- # return c => Nc
199- # end
200- # Ndata = SectorDict(generator)
201- # end
202- #
203- # # construct new space
204- # S = spacetype(t)
205- # W = S(dims)
206- #
207- # # construct output tensor
208- # T = float(scalartype(t))
209- # N = similar(t, T, V ← W)
210- # if !isempty(blocksectors(V))
211- # for (c, Nc) in Ndata
212- # copy!(block(N, c), Nc)
213- # end
214- # end
215- # return N
216- # end
217- # TK.leftnull!(t::SparseBlockTensorMap; kwargs...) = leftnull!(BlockTensorMap(t); kwargs...)
218- #
219- # function TK.rightorth!(
220- # t::AbstractBlockTensorMap;
221- # alg::Union{LQ, LQpos, RQ, RQpos, SVD, SDD, Polar} = LQpos(),
222- # atol::Real = zero(float(real(scalartype(t)))),
223- # rtol::Real = if (alg ∉ (SVD(), SDD()))
224- # zero(float(real(scalartype(t))))
225- # else
226- # eps(real(float(one(scalartype(t))))) * iszero(atol)
227- # end,
228- # )
229- # InnerProductStyle(t) === EuclideanInnerProduct() ||
230- # throw_invalid_innerproduct(:rightorth!)
231- # if !iszero(rtol)
232- # atol = max(atol, rtol * norm(t))
233- # end
234- # I = sectortype(t)
235- # dims = TK.SectorDict{I, Int}()
236- #
237- # # compute LQ factorization for each block
238- # if !isempty(TK.blocks(t))
239- # generator = Base.Iterators.map(TK.blocks(t)) do (c, b)
240- # Lc, Qc = TK.MatrixAlgebra.rightorth!(b, alg, atol)
241- # dims[c] = size(Qc, 1)
242- # return c => (Lc, Qc)
243- # end
244- # LQdata = SectorDict(generator)
245- # end
246- #
247- # # construct new space
248- # S = spacetype(t)
249- # V = S(dims)
250- # if alg isa Polar
251- # @assert V ≅ codomain(t)
252- # W = codomain(t)
253- # else
254- # W = ProductSpace(V)
255- # end
256- #
257- # # construct output tensors
258- # T = float(scalartype(t))
259- # L = similar(t, T, codomain(t) ← W)
260- # Q = similar(t, T, W ← domain(t))
261- # if !isempty(blocksectors(codomain(t)))
262- # for (c, (Lc, Qc)) in LQdata
263- # block(L, c) .= Lc
264- # block(Q, c) .= Qc
265- # end
266- # end
267- # return L, Q
268- # end
269- # function TK.rightorth!(t::SparseBlockTensorMap; kwargs...)
270- # return rightorth!(BlockTensorMap(t); kwargs...)
271- # end
272- #
273- # function TK.rightnull!(
274- # t::BlockTensorMap;
275- # alg::Union{LQ, LQpos, SVD, SDD} = LQpos(),
276- # atol::Real = zero(float(real(scalartype(t)))),
277- # rtol::Real = if (alg ∉ (SVD(), SDD()))
278- # zero(float(real(scalartype(t))))
279- # else
280- # eps(real(float(one(scalartype(t))))) * iszero(atol)
281- # end,
282- # )
283- # InnerProductStyle(t) === EuclideanInnerProduct() ||
284- # throw_invalid_innerproduct(:rightnull!)
285- # if !iszero(rtol)
286- # atol = max(atol, rtol * norm(t))
287- # end
288- # I = sectortype(t)
289- # dims = SectorDict{I, Int}()
290- #
291- # # compute LQ factorization for each block
292- # V = domain(t)
293- # if !isempty(blocksectors(V))
294- # generator = Base.Iterators.map(blocksectors(V)) do c
295- # Nc = MatrixAlgebra.rightnull!(block(t, c), alg, atol)
296- # dims[c] = size(Nc, 1)
297- # return c => Nc
298- # end
299- # Ndata = SectorDict(generator)
300- # end
301- #
302- # # construct new space
303- # S = spacetype(t)
304- # W = S(dims)
305- #
306- # # construct output tensor
307- # T = float(scalartype(t))
308- # N = similar(t, T, W ← V)
309- # if !isempty(blocksectors(V))
310- # for (c, Nc) in Ndata
311- # copy!(block(N, c), Nc)
312- # end
313- # end
314- # return N
315- # end
316- # TK.rightnull!(t::SparseBlockTensorMap; kwargs...) = rightnull!(BlockTensorMap(t); kwargs...)
317- #
318- # function TK.tsvd!(t::AbstractBlockTensorMap; trunc = TK.NoTruncation(), p::Real = 2, alg = SDD())
319- # return TK._tsvd!(t, alg, trunc, p)
320- # end
321- # function TK.tsvd!(t::SparseBlockTensorMap; kwargs...)
322- # return tsvd!(BlockTensorMap(t); kwargs...)
323- # end
324- #
325- # function TK._tsvd!(
326- # t::BlockTensorMap, alg::Union{SVD, SDD}, trunc::TruncationScheme, p::Real = 2
327- # )
328- # # early return
329- # if isempty(blocksectors(t))
330- # truncerr = zero(real(scalartype(t)))
331- # return TK._empty_svdtensors(t)..., truncerr
332- # end
333- #
334- # # compute SVD factorization for each block
335- # S = spacetype(t)
336- # SVDdata, dims = TK._compute_svddata!(t, alg)
337- # Σdata = SectorDict(c => Σ for (c, (U, Σ, V)) in SVDdata)
338- # truncdim = TK._compute_truncdim(Σdata, trunc, p)
339- # truncerr = TK._compute_truncerr(Σdata, truncdim, p)
340- #
341- # # construct output tensors
342- # U, Σ, V⁺ = TK._create_svdtensors(t, SVDdata, truncdim)
343- # return U, Σ, V⁺, truncerr
344- # end
345- #
346- # function TK._compute_svddata!(t::AbstractBlockTensorMap, alg::Union{SVD, SDD})
347- # InnerProductStyle(t) === EuclideanInnerProduct() || throw_invalid_innerproduct(:tsvd!)
348- # I = sectortype(t)
349- # dims = SectorDict{I, Int}()
350- # generator = Base.Iterators.map(TK.blocks(t)) do (c, b)
351- # U, Σ, V = TK.MatrixAlgebra.svd!(b, alg)
352- # dims[c] = length(Σ)
353- # return c => (U, Σ, V)
354- # end
355- # SVDdata = SectorDict(generator)
356- # return SVDdata, dims
357- # end
358- # function TK._create_svdtensors(t::AbstractBlockTensorMap, SVDdata, dims)
359- # S = spacetype(t)
360- # W = S(dims)
361- # T = float(scalartype(t))
362- # U = similar(t, T, codomain(t) ← W)
363- # Σ = similar(t, real(T), W ← W)
364- # V⁺ = similar(t, T, W ← domain(t))
365- # for (c, (Uc, Σc, V⁺c)) in SVDdata
366- # r = Base.OneTo(dims[c])
367- # block(U, c) .= view(Uc, :, r)
368- # block(Σ, c) .= Diagonal(view(Σc, r))
369- # block(V⁺, c) .= view(V⁺c, r, :)
370- # end
371- # return U, Σ, V⁺
372- # end
373- #
374- # function TK._empty_svdtensors(t::AbstractBlockTensorMap)
375- # T = scalartype(t)
376- # S = spacetype(t)
377- # I = sectortype(t)
378- # dims = SectorDict{I, Int}()
379- # W = S(dims)
380- #
381- # U = similar(t, codomain(t) ← W)
382- # Σ = similar(t, real(T), W ← W)
383- # V⁺ = similar(t, W ← domain(t))
384- # return U, Σ, V⁺
385- # end
121+ # Disambiguate Diagonal implementations
122+ # -------------------------------------
123+ # these shouldn't ever happen as blocktensors aren't diagonal
124+ for f! in (:eig_full!, :eigh_full!, :lq_compact!, :lq_full!, :qr_compact!, :qr_full!, :svd_full!)
125+ @eval function MAK. initialize_output(:: typeof ($ f!), t:: AbstractBlockTensorMap , alg:: DiagonalAlgorithm )
126+ error(" Blocktensors are incompatible with diagonal algorithm" )
127+ end
128+ end
0 commit comments