22function planaradd! (C:: AbstractTensorMap{S,N₁,N₂} ,
33 A:: AbstractTensorMap{S} ,
44 p:: Index2Tuple{N₁,N₂} ,
5- α,
6- β,
5+ α:: Number ,
6+ β:: Number ,
77 backend:: Backend... ) where {S,N₁,N₂}
88 return add_transpose! (C, A, p, α, β, backend... )
99end
1010
11- function planartrace! (C:: AbstractTensorMap{S,N₁,N₂} ,
11+ function planartrace! (C:: AbstractTensorMap{S,N₁,N₂} ,
1212 A:: AbstractTensorMap{S} ,
1313 p:: Index2Tuple{N₁,N₂} ,
1414 q:: Index2Tuple{N₃,N₃} ,
15- α,
16- β,
15+ α:: Number ,
16+ β:: Number ,
1717 backend:: Backend... ) where {S,N₁,N₂,N₃}
1818 if BraidingStyle (sectortype (S)) == Bosonic ()
1919 return trace_permute! (C, A, p, q, α, β, backend... )
@@ -44,21 +44,25 @@ function planartrace!(C::AbstractTensorMap{S,N₁,N₂},
4444 return C
4545end
4646
47-
48- function planarcontract! (C:: AbstractTensorMap{S,N₁,N₂} ,
47+ function planarcontract! (C:: AbstractTensorMap{S,N₁,N₂} ,
4948 A:: AbstractTensorMap{S} ,
5049 pA:: Index2Tuple ,
5150 B:: AbstractTensorMap{S} ,
5251 pB:: Index2Tuple ,
5352 pAB:: Index2Tuple{N₁,N₂} ,
54- α,
55- β,
53+ α:: Number ,
54+ β:: Number ,
5655 backend:: Backend... ) where {S,N₁,N₂}
56+ if BraidingStyle (sectortype (S)) == Bosonic ()
57+ return contract (C, A, pA, B, pB, pAB, α, β, backend... )
58+ end
59+
5760 codA, domA = codomainind (A), domainind (A)
5861 codB, domB = codomainind (B), domainind (B)
5962 oindA, cindA = pA
6063 cindB, oindB = pB
61- oindA, cindA, oindB, cindB = reorder_indices (codA, domA, codB, domB, oindA, cindA, oindB, cindB, pAB... )
64+ oindA, cindA, oindB, cindB = reorder_indices (codA, domA, codB, domB, oindA, cindA,
65+ oindB, cindB, pAB... )
6266
6367 if oindA == codA && cindA == domA
6468 A′ = A
@@ -80,81 +84,6 @@ function planarcontract!(C::AbstractTensorMap{S,N₁,N₂},
8084 return C
8185end
8286
83- # function planaradd!(α, tsrc::AbstractTensorMap{S},
84- # β, tdst::AbstractTensorMap{S,N₁,N₂},
85- # p1::IndexTuple{N₁}, p2::IndexTuple{N₂}) where {S,N₁,N₂}
86- # return add_transpose!(α, tsrc, β, tdst, p1, p2)
87- # end
88-
89- # function planar_trace!(α, tsrc::AbstractTensorMap{S},
90- # β, tdst::AbstractTensorMap{S,N₁,N₂},
91- # p1::IndexTuple{N₁}, p2::IndexTuple{N₂},
92- # q1::IndexTuple{N₃}, q2::IndexTuple{N₃}) where {S,N₁,N₂,N₃}
93- # if BraidingStyle(sectortype(S)) == Bosonic()
94- # return trace!(α, tsrc, β, tdst, p1, p2, q1, q2)
95- # end
96-
97- # @boundscheck begin
98- # all(i -> space(tsrc, p1[i]) == space(tdst, i), 1:N₁) ||
99- # throw(SpaceMismatch("trace: tsrc = $(codomain(tsrc))←$(domain(tsrc)),
100- # tdst = $(codomain(tdst))←$(domain(tdst)), p1 = $(p1), p2 = $(p2)"))
101- # all(i -> space(tsrc, p2[i]) == space(tdst, N₁ + i), 1:N₂) ||
102- # throw(SpaceMismatch("trace: tsrc = $(codomain(tsrc))←$(domain(tsrc)),
103- # tdst = $(codomain(tdst))←$(domain(tdst)), p1 = $(p1), p2 = $(p2)"))
104- # all(i -> space(tsrc, q1[i]) == dual(space(tsrc, q2[i])), 1:N₃) ||
105- # throw(SpaceMismatch("trace: tsrc = $(codomain(tsrc))←$(domain(tsrc)),
106- # q1 = $(q1), q2 = $(q2)"))
107- # end
108-
109- # if iszero(β)
110- # fill!(tdst, β)
111- # elseif β != 1
112- # rmul!(tdst, β)
113- # end
114- # pdata = (p1..., p2...)
115- # for (f₁, f₂) in fusiontrees(tsrc)
116- # for ((f₁′, f₂′), coeff) in planar_trace(f₁, f₂, p1, p2, q1, q2)
117- # TO._trace!(α * coeff, tsrc[f₁, f₂], true, tdst[f₁′, f₂′], pdata, q1, q2)
118- # end
119- # end
120- # return tdst
121- # end
122-
123- # function planar_contract!(α, A::AbstractTensorMap{S}, B::AbstractTensorMap{S},
124- # β, C::AbstractTensorMap{S},
125- # oindA::IndexTuple, cindA::IndexTuple,
126- # oindB::IndexTuple, cindB::IndexTuple,
127- # p1::IndexTuple, p2::IndexTuple,
128- # syms::Union{Nothing,NTuple{3,Symbol}}=nothing) where {S}
129- # codA, domA = codomainind(A), domainind(A)
130- # codB, domB = codomainind(B), domainind(B)
131- # oindA, cindA, oindB, cindB = reorder_indices(codA, domA, codB, domB, oindA, cindA,
132- # oindB, cindB, p1, p2)
133-
134- # if oindA == codA && cindA == domA
135- # A′ = A
136- # else
137- # if isnothing(syms)
138- # A′ = TO.similar_from_indices(eltype(A), oindA, cindA, A, :N)
139- # else
140- # A′ = TO.cached_similar_from_indices(syms[1], eltype(A), oindA, cindA, A, :N)
141- # end
142- # add_transpose!(true, A, false, A′, oindA, cindA)
143- # end
144- # if cindB == codB && oindB == domB
145- # B′ = B
146- # else
147- # if isnothing(syms)
148- # B′ = TO.similar_from_indices(eltype(B), cindB, oindB, B, :N)
149- # else
150- # B′ = TO.cached_similar_from_indices(syms[2], eltype(B), cindB, oindB, B, :N)
151- # end
152- # add_transpose!(true, B, false, B′, cindB, oindB)
153- # end
154- # mul!(C, A′, B′, α, β)
155- # return C
156- # end
157-
15887# auxiliary routines
15988_cyclicpermute (t:: Tuple ) = (Base. tail (t)... , t[1 ])
16089_cyclicpermute (t:: Tuple{} ) = ()
0 commit comments