MPSEnvironment¶
full name: tenpy.networks.mps.MPSEnvironment
parent module:
tenpy.networks.mps
type: class
-
class
tenpy.networks.mps.
MPSEnvironment
(bra, ket, init_LP=None, init_RP=None, age_LP=0, age_RP=0)[source]¶ Bases:
object
Stores partial contractions of \(<bra|Op|ket>\) for local operators Op.
The network for a contraction \(<bra|Op|ket>\) of a local operator Op, say exemplary at sites i, i+1 looks like:
| .-----M[0]--- ... --M[1]---M[2]--- ... ->--. | | | | | | | | | |------| | | LP[0] | | Op | RP[-1] | | | |------| | | | | | | | | .-----N[0]*-- ... --N[1]*--N[2]*-- ... -<--.
Of course, we can also calculate the overlap <bra|ket> by using the special case
Op = Id
.We use the following label convention (where arrows indicate qconj):
| .-->- vR vL ->-. | | | | LP RP | | | | .--<- vR* vL* -<-.
To avoid recalculations of the whole network e.g. in the DMRG sweeps, we store the contractions up to some site index in this class. For
bc='finite','segment'
, the very left and right partLP[0]
andRP[-1]
are trivial and don’t change, but forbc='infinite'
they are might be updated (by inserting another unit cell to the left/right).The MPS bra and ket have to be in canonical form. All the environments are constructed without the singular values on the open bond. In other words, we contract left-canonical A to the left parts LP and right-canonical B to the right parts RP. Thus, the special case
ket=bra
should yield identity matrices for LP and RP.- Parameters
- bra
MPS
The MPS to project on. Should be given in usual ‘ket’ form; we call conj() on the matrices directly. Stored in place, without making copies. If necessary to match charges, we call
gauge_total_charge()
.- ket
MPO
| None The MPS on which the local operator acts. Stored in place, without making copies. If
None
, use bra.- init_LP
None
|Array
Initial very left part
LP
. IfNone
, build trivial one withinit_LP()
.- init_RP
None
|Array
Initial very right part
RP
. IfNone
, build trivial one withinit_RP()
.- age_LPint
The number of physical sites involved into the contraction yielding firstLP.
- age_RPint
The number of physical sites involved into the contraction yielding lastRP.
- bra
- Attributes
- Lint
Number of physical sites involved into the Environment, i.e. the least common multiple of
bra.L
andket.L
.- bra, ket
MPS
The two MPS for the contraction.
- dtypetype
The data type.
- _finitebool
Whether the boundary conditions of the MPS are finite.
- _LPlist of {
None
|Array
} Left parts of the environment, len L.
LP[i]
contains the contraction strictly left of site i (orNone
, if we don’t have it calculated).- _RPlist of {
None
|Array
} Right parts of the environment, len L.
RP[i]
contains the contraction strictly right of site i (orNone
, if we don’t have it calculated).- _LP_agelist of int |
None
Used for book-keeping, how large the DMRG system grew:
_LP_age[i]
stores the number of physical sites invovled into the contraction network which yieldsself._LP[i]
.- _RP_agelist of int |
None
Used for book-keeping, how large the DMRG system grew:
_RP_age[i]
stores the number of physical sites invovled into the contraction network which yieldsself._RP[i]
.
Methods
del_LP
(self, i)Delete stored part strictly to the left of site i.
del_RP
(self, i)Delete storde part scrictly to the right of site i.
expectation_value
(self, ops[, sites, axes])Expectation value
<bra|ops|ket>
of (n-site) operator(s).full_contraction
(self, i0)Calculate the overlap by a full contraction of the network.
get_LP
(self, i[, store])Calculate LP at given site from nearest available one (including i).
get_LP_age
(self, i)Return number of physical sites in the contractions of get_LP(i).
get_RP
(self, i[, store])Calculate RP at given site from nearest available one (including i).
get_RP_age
(self, i)Return number of physical sites in the contractions of get_RP(i).
init_LP
(self, i)Build initial left part
LP
.init_RP
(self, i)Build initial right part
RP
for an MPS/MPOEnvironment.set_LP
(self, i, LP, age)Store part to the left of site i.
set_RP
(self, i, RP, age)Store part to the right of site i.
test_sanity
(self)Sanity check, raises ValueErrors, if something is wrong.
-
init_LP
(self, i)[source]¶ Build initial left part
LP
.- Parameters
- iint
Build
LP
left of site i.
- Returns
- init_LP
Array
Identity contractible with the vL leg of
ket.get_B(i)
, labels'vR*', 'vR'
.
- init_LP
-
init_RP
(self, i)[source]¶ Build initial right part
RP
for an MPS/MPOEnvironment.- Parameters
- iint
Build
RP
right of site i.
- Returns
- init_RP
Array
Identity contractible with the vR leg of
ket.get_B(i)
, labels'vL*', 'vL'
.
- init_RP
-
get_LP
(self, i, store=True)[source]¶ Calculate LP at given site from nearest available one (including i).
The returned
LP_i
corresponds to the following contraction, where the M’s and the N’s are in the ‘A’ form:| .-------M[0]--- ... --M[i-1]--->- 'vR' | | | | | LP[0] | | | | | | | .-------N[0]*-- ... --N[i-1]*--<- 'vR*'
- Parameters
- iint
The returned LP will contain the contraction strictly left of site i.
- storebool
Wheter to store the calculated LP in self (
True
) or discard them (False
).
- Returns
- LP_i
Array
Contraction of everything left of site i, with labels
'vR*', 'vR'
for bra, ket.
- LP_i
-
get_RP
(self, i, store=True)[source]¶ Calculate RP at given site from nearest available one (including i).
The returned
RP_i
corresponds to the following contraction, where the M’s and the N’s are in the ‘B’ form:| 'vL' ->---M[i+1]-- ... --M[L-1]----. | | | | | | | RP[-1] | | | | | 'vL*' -<---N[i+1]*- ... --N[L-1]*---.
- Parameters
- iint
The returned RP will contain the contraction strictly right of site i.
- storebool
Wheter to store the calculated RP in self (
True
) or discard them (False
).
- Returns
- RP_i
Array
Contraction of everything left of site i, with labels
'vL*', 'vL'
for bra, ket.
- RP_i
-
get_LP_age
(self, i)[source]¶ Return number of physical sites in the contractions of get_LP(i).
Might be
None
.
-
get_RP_age
(self, i)[source]¶ Return number of physical sites in the contractions of get_RP(i).
Might be
None
.
-
full_contraction
(self, i0)[source]¶ Calculate the overlap by a full contraction of the network.
The full contraction of the environments gives the overlap
<bra|ket>
, taking into accountMPS.norm
of both bra and ket. For this purpose, this function contractsget_LP(i0+1, store=False)
andget_RP(i0, store=False)
with appropriate singular values in between.- Parameters
- i0int
Site index.
-
expectation_value
(self, ops, sites=None, axes=None)[source]¶ Expectation value
<bra|ops|ket>
of (n-site) operator(s).Calculates n-site expectation values of operators sandwiched between bra and ket. For examples the contraction for a two-site operator on site i would look like:
| .--S--B[i]--B[i+1]--. | | | | | | | |-----| | | LP[i] | op | RP[i+1] | | |-----| | | | | | | | .--S--B*[i]-B*[i+1]-.
Here, the B are taken from ket, the B* from bra. The call structure is the same as for
MPS.expectation_value()
.- Parameters
- ops(list of) {
Array
| str } The operators, for wich the expectation value should be taken, All operators should all have the same number of legs (namely 2 n). If less than
len(sites)
operators are given, we repeat them periodically. Strings (like'Id', 'Sz'
) are translated into single-site operators defined bysites
.- siteslist
List of site indices. Expectation values are evaluated there. If
None
(default), the entire chain is taken (clipping for finite b.c.)- axesNone | (list of str, list of str)
Two lists of each n leg labels giving the physical legs of the operator used for contraction. The first n legs are contracted with conjugated B, the second n legs with the non-conjugated B.
None
defaults to(['p'], ['p*'])
for single site (n=1), or(['p0', 'p1', ... 'p{n-1}'], ['p0*', 'p1*', .... 'p{n-1}*'])
for n > 1.
- ops(list of) {
- Returns
- exp_vals1D ndarray
Expectation values,
exp_vals[i] = <bra|ops[i]|ket>
, whereops[i]
acts on site(s)j, j+1, ..., j+{n-1}
withj=sites[i]
.
Examples
One site examples (n=1):
>>> env.expectation_value('Sz') [Sz0, Sz1, ..., Sz{L-1}] >>> env.expectation_value(['Sz', 'Sx']) [Sz0, Sx1, Sz2, Sx3, ... ] >>> env.expectation_value('Sz', sites=[0, 3, 4]) [Sz0, Sz3, Sz4]
Two site example (n=2), assuming homogeneous sites:
>>> SzSx = npc.outer(psi.sites[0].Sz.replace_labels(['p', 'p*'], ['p0', 'p0*']), psi.sites[1].Sx.replace_labels(['p', 'p*'], ['p1', 'p1*'])) >>> env.expectation_value(SzSx) [Sz0Sx1, Sz1Sx2, Sz2Sx3, ... ] # with len L-1 for finite bc, or L for infinite
Example measuring <bra|SzSx|ket> on each second site, for inhomogeneous sites:
>>> SzSx_list = [npc.outer(psi.sites[i].Sz.replace_labels(['p', 'p*'], ['p0', 'p0*']), psi.sites[i+1].Sx.replace_labels(['p', 'p*'], ['p1', 'p1*'])) for i in range(0, psi.L-1, 2)] >>> env.expectation_value(SzSx_list, range(0, psi.L-1, 2)) [Sz0Sx1, Sz2Sx3, Sz4Sx5, ...]