@@ -9,9 +9,15 @@ struct MPODerivativeOperator{L, O <: Tuple, R} <: DerivativeOperator
99 rightenv:: R
1010end
1111
12+ struct MPOContractedDerivativeOperator{L, R, N} <: DerivativeOperator
13+ leftenv:: L
14+ rightenv:: R
15+ end
16+
1217Base. length (H:: MPODerivativeOperator ) = length (H. operators)
18+ Base. length (:: MPOContractedDerivativeOperator{L, R, N} ) where {L, R, N} = N
1319
14- const MPO_C_Hamiltonian{L, R} = MPODerivativeOperator {L, Tuple{}, R}
20+ const MPO_C_Hamiltonian{L, R} = MPOContractedDerivativeOperator {L, Tuple{}, R}
1521MPO_C_Hamiltonian (GL, GR) = MPODerivativeOperator (GL, (), GR)
1622
1723const MPO_AC_Hamiltonian{L, O, R} = MPODerivativeOperator{L, Tuple{O}, R}
@@ -20,8 +26,23 @@ MPO_AC_Hamiltonian(GL, O, GR) = MPODerivativeOperator(GL, (O,), GR)
2026const MPO_AC2_Hamiltonian{L, O₁, O₂, R} = MPODerivativeOperator{L, Tuple{O₁, O₂}, R}
2127MPO_AC2_Hamiltonian (GL, O1, O2, GR) = MPODerivativeOperator (GL, (O1, O2), GR)
2228
29+ const MPO_Contracted_C_Hamiltonian{L, R} = MPOContractedDerivativeOperator{L, R, 0 }
30+ MPO_Contracted_C_Hamiltonian (GL:: L , GR:: R ) where {L, R} = MPOContractedDerivativeOperator {L,R,0} (GL, GR)
31+
32+ const MPO_Contracted_AC_Hamiltonian{L, R} = MPOContractedDerivativeOperator{L, R, 1 }
33+ MPO_Contracted_AC_Hamiltonian (GL:: L , GR:: R ) where {L, R} = MPOContractedDerivativeOperator {L,R,1} (GL, GR)
34+
35+ const MPO_Contracted_AC2_Hamiltonian{L, R} = MPOContractedDerivativeOperator{L, R, 2 }
36+ MPO_Contracted_AC2_Hamiltonian (GL:: L , GR:: R ) where {L, R} = MPOContractedDerivativeOperator {L,R,2} (GL, GR)
37+
2338# Constructors
2439# ------------
40+ const _HAM_MPS_TYPES = Union{
41+ FiniteMPS{<: MPSTensor },
42+ WindowMPS{<: MPSTensor },
43+ InfiniteMPS{<: MPSTensor },
44+ }
45+
2546function C_hamiltonian (site:: Int , below, operator, above, envs)
2647 return MPO_C_Hamiltonian (leftenv (envs, site + 1 , below), rightenv (envs, site, below))
2748end
@@ -35,6 +56,30 @@ function AC2_hamiltonian(site::Int, below, operator, above, envs)
3556 leftenv (envs, site, below), O1, O2, rightenv (envs, site + 1 , below)
3657 )
3758end
59+ function C_hamiltonian (site:: Int , below:: _HAM_MPS_TYPES , operator:: MPOHamiltonian{<:MPOTensor} , above:: _HAM_MPS_TYPES , envs)
60+ return MPO_Contracted_C_Hamiltonian (leftenv (envs, site + 1 , below), rightenv (envs, site, below))
61+ end
62+ function AC_hamiltonian (site:: Int , below:: _HAM_MPS_TYPES , operator:: MPOHamiltonian{<:MPOTensor} , above:: _HAM_MPS_TYPES , envs)
63+ O = operator[site]
64+ GL = leftenv (envs, site, below)
65+ return AC_hamiltonian (GL, O, rightenv (envs, site, below))
66+ end
67+ function AC_hamiltonian (GL:: MPSTensor , O:: MPOTensor , GR:: MPSTensor )
68+ @plansor GLW[- 1 - 2 - 3 ; - 4 - 5 ] ≔ GL[- 1 1 ; - 4 ] * O[1 - 2 ; - 5 - 3 ]
69+ return MPO_Contracted_AC_Hamiltonian (GLW, O, GR)
70+ end
71+ function AC2_hamiltonian (site:: Int , below:: _HAM_MPS_TYPES , operator:: MPOHamiltonian{<:MPOTensor} , above:: _HAM_MPS_TYPES , envs)
72+ O1 = operator[site]
73+ O2 = operator[site + 1 ]
74+ GL = leftenv (envs, site, below)
75+ GR = rightenv (envs, site + 1 , below)
76+ return AC2_hamiltonian (GL, O1, O2, GR)
77+ end
78+ function AC2_hamiltonian (GL:: MPSTensor , O1:: MPOTensor , O2:: MPOTensor , GR:: MPSTensor )
79+ @plansor GLW[- 1 - 2 - 3 ; - 4 - 5 ] ≔ GL[- 1 1 ; - 4 ] * O1[1 - 2 ; - 5 - 3 ]
80+ @plansor GWR[- 1 - 2 - 3 ; - 4 - 5 ] ≔ O2[- 3 - 5 ; - 2 1 ] * GR[- 1 1 ; - 4 ]
81+ return MPO_Contracted_AC2_Hamiltonian (GLW, GWR)
82+ end
3883
3984# Properties
4085# ----------
@@ -50,6 +95,20 @@ function TensorKit.codomain(H::MPODerivativeOperator)
5095 V_o = prod (physicalspace, H. O; init = one (V_l))
5196 return V_l ⊗ V_o ⊗ V_r
5297end
98+ function TensorKit. domain (H:: MPOContractedDerivativeOperator )
99+ V_l = right_virtualspace (H. leftenv)
100+ V_r = left_virtualspace (H. rightenv)
101+ # # TODO : How to deal with the H.O here?
102+ V_o = prod (physicalspace, H. O; init = one (V_l))
103+ return V_l ⊗ V_o ⊗ V_r
104+ end
105+ function TensorKit. codomain (H:: MPOContractedDerivativeOperator )
106+ V_l = left_virtualspace (H. leftenv)
107+ V_r = right_virtualspace (H. rightenv)
108+ # # TODO : How to deal with the H.O here?
109+ V_o = prod (physicalspace, H. O; init = one (V_l))
110+ return V_l ⊗ V_o ⊗ V_r
111+ end
53112
54113# Actions
55114# -------
@@ -105,3 +164,20 @@ function (h::MPO_AC2_Hamiltonian{<:MPSTensor, <:MPOTensor, <:MPOTensor, <:MPSTen
105164 h. operators[2 ][7 - 6 ; 4 5 ] * τ[5 - 5 ; 2 3 ]
106165 return y isa AbstractBlockTensorMap ? only (y) : y
107166end
167+ function (h:: MPO_Contracted_C_Hamiltonian )(x:: MPSBondTensor )
168+ @plansor y[- 1 ; - 2 ] ≔ h. leftenv[- 1 3 ; 1 ] * x[1 ; 2 ] * h. rightenv[2 3 ; - 2 ]
169+ return y isa AbstractBlockTensorMap ? only (y) : y
170+ end
171+ function (h:: MPO_Contracted_AC_Hamiltonian )(
172+ x:: GenericMPSTensor{<:Any, 3}
173+ )
174+ @plansor y[- 1 - 2 ; - 3 ] ≔ h. leftenv[- 1 - 2 3 ; 1 2 ] * x[1 2 ; 4 ] * h. rightenv[4 3 ; - 3 ]
175+ return y isa AbstractBlockTensorMap ? only (y) : y
176+ end
177+ function (h:: MPO_Contracted_AC2_Hamiltonian )(
178+ x:: MPOTensor
179+ )
180+ @plansor y[- 1 - 2 ; - 3 - 4 ] ≔ h. leftenv[- 1 - 2 5 ; 1 2 ] * x[1 2 ; 3 4 ] * h. rightenv[3 4 5 ; - 3 - 4 ]
181+ return y isa AbstractBlockTensorMap ? only (y) : y
182+ end
183+ # # TODO : Which interface should we use for an inplace += version to be used in hamiltonian_derivatives.jl?
0 commit comments