# ProjMPO

## Description

`ITensors.ITensorMPS.ProjMPO`

— TypeA ProjMPO computes and stores the projection of an MPO into a basis defined by an MPS, leaving a certain number of site indices of the MPO unprojected. Which sites are unprojected can be shifted by calling the `position!`

method.

Drawing of the network represented by a ProjMPO `P(H)`

, showing the case of `nsite(P)==2`

and `position!(P,psi,4)`

for an MPS `psi`

:

```
o--o--o- -o--o--o--o--o--o <psi|
| | | | | | | | | | |
o--o--o--o--o--o--o--o--o--o--o H
| | | | | | | | | | |
o--o--o- -o--o--o--o--o--o |psi>
```

## Methods

`ITensors.product`

— Method```
product(P::ProjMPO,v::ITensor)::ITensor
(P::ProjMPO)(v::ITensor)
```

Efficiently multiply the ProjMPO `P`

by an ITensor `v`

in the sense that the ProjMPO is a generalized square matrix or linear operator and `v`

is a generalized vector in the space where it acts. The returned ITensor will have the same indices as `v`

. The operator overload `P(v)`

is shorthand for `product(P,v)`

.

`ITensors.ITensorMPS.position!`

— Method`position!(P::ProjMPO, psi::MPS, pos::Int)`

Given an MPS `psi`

, shift the projection of the MPO represented by the ProjMPO `P`

such that the set of unprojected sites begins with site `pos`

. This operation efficiently reuses previous projections of the MPO on sites that have already been projected. The MPS `psi`

must have compatible bond indices with the previous projected MPO tensors for this operation to succeed.

`ITensors.ITensorMPS.noiseterm`

— Method```
noiseterm(P::ProjMPO,
phi::ITensor,
ortho::String)
```

Return a "noise term" or density matrix perturbation ITensor as proposed in Phys. Rev. B 72, 180403 for aiding convergence of DMRG calculations. The ITensor `phi`

is the contracted product of MPS tensors acted on by the ProjMPO `P`

, and `ortho`

is a String which can take the values `"left"`

or `"right"`

depending on the sweeping direction of the DMRG calculation.

## Properties

`Base.length`

— Method`length(P::ProjMPO)`

The length of a ProjMPO is the same as the length of the MPO used to construct it

`Base.eltype`

— Method`eltype(P::ProjMPO)`

Deduce the element type (such as Float64 or ComplexF64) of the tensors in the ProjMPO `P`

.

`Base.size`

— Method`size(P::ProjMPO)`

The size of a ProjMPO are its dimensions `(d,d)`

when viewed as a matrix or linear operator acting on a space of dimension `d`

.

For example, if a ProjMPO maps from a space with indices `(a,s1,s2,b)`

to the space `(a',s1',s2',b')`

then the size is `(d,d)`

where `d = dim(a)*dim(s1)*dim(s1)*dim(b)`