## Learn to Use ITensor

main / classes / mps_mpo_algs

# Algorithms for MPS and MPO (also IQMPS and IQMPO)

## Summing MPS

• sum(MPS psi1, MPS psi2, Args args = Args::global()) -> MPS
sum(IQMPS psi1, IQMPS psi2, Args args = Args::global()) -> IQMPS

Return the sum of the MPS psi1 and ps2. The returned MPS will have an orthogonality center on site 1. Before being returned, the MPS representing the sum will be compressed using truncation parameters provided in the named arguments args.

Show Example
auto psi3 = sum(psi1,psi2,{"Maxm",500,"Cutoff",1E-8});

• sum(vector<MPS> terms, Args args = Args::global()) -> MPS
sum(vector<IQMPS> terms, Args args = Args::global()) -> IQMPS

Returns the sum of all the MPS provided in the vector terms as a single MPS, using the truncation accuracy parameters (such as "Cutoff" or "Maxm") provided in the named arguments args to control the accuracy of the sum.

This function uses a hierarchical, tree-like algorithm which first sums pairs of MPS, then pairs of pairs, etc. so that the largest bond dimensions are only reached toward the end of the process for maximum efficiency. Therefore using this algorithm can be much faster than calling the above two-argument sum function to sum the terms one at a time.

Show Example
auto terms = vector<MPS>(4);
terms.at(0) = psi0;
terms.at(1) = psi1;
terms.at(2) = psi2;
terms.at(3) = psi3;

auto res = sum(terms,{"Cutoff",1E-8});


## Overlaps, Matrix Elements, and Expectation Values

• overlap(MPS psi1, MPS psi2) -> Real
overlap(IQMPS psi1, IQMPS psi2) -> Real

overlapC(MPS psi1, MPS psi2) -> Cplx
overlapC(IQMPS psi1, IQMPS psi2) -> Cplx

Compute the exact overlap $\langle \psi_1|\psi_2 \rangle$ of two MPS or IQMPS. If the overlap value is expected to be a complex number use overlapC.

The algorithm used scales as $m^3 d$ where $m$ is typical bond dimension of the MPS and $d$ is the site dimension.

(In ITensor version 1.x this function was called psiphi. This name is still supported for backwards compatibility.)

• overlap(MPS psi1, MPO W, MPS psi2) -> Real
overlap(IQMPS psi1, IQMPO W, IQMPS psi2) -> Real

overlapC(MPS psi1, MPO W, MPS psi2) -> Cplx
overlapC(IQMPS psi1, IQMPO W, IQMPS psi2) -> Cplx

Compute the exact overlap (or matrix element) $\langle \psi_1|W|\psi_2 \rangle$ of two MPS psi1 and psi2 with respect to an MPO W.

The algorithm used scales as $m^3\, k\,d + m^2\, k^2\, d^2$ where $m$ is typical bond dimension of the MPS, $k$ is the typical MPO dimension, and $d$ is the site dimension.

(In ITensor version 1.x this function was called psiHphi. This name is still supported for backwards compatibility.)

• overlap(MPS psi1, MPO W1, MPO W2, MPS psi2) -> Real
overlap(IQMPS psi1, IQMPO W1, IQMPO W2, IQMPS psi2) -> Real

overlapC(MPS psi1, MPO W1, MPO W2, MPS psi2) -> Cplx
overlapC(IQMPS psi1, IQMPO W1, IQMPO W2, IQMPS psi2) -> Cplx

Compute the exact overlap (or matrix element) $\langle \psi_1|W_1 W_2 |\psi_2 \rangle$ of two MPS psi1 and psi2 with respect to two MPOs W1 and W2.

The algorithm used scales as $m^3\, k^2\,d + m^2\, k^3\, d^2$ where $m$ is typical bond dimension of the MPS, $k$ is the typical MPO dimension, and $d$ is the site dimension.

(In ITensor version 1.x this function was called psiHKphi. This name is still supported for backwards compatibility.)

## Multiplying MPOs

• nmultMPO(MPO A, MPO B, MPO & C, Args args = Args::global())
nmultMPO(IQMPO A, IQMPO B, IQMPO & C, Args args = Args::global())

Multiply MPOs A and B. On return, the result is stored in C. MPO tensors are multiplied one at a time from left to right and the resulting tensors are compressed using the truncation parameters (such as "Cutoff" and "Maxm") provided through the named arguments args.

Show Example
MPO C;
nmultMPO(A,B,C,{"Maxm",500,"Cutoff",1E-8});


## Applying MPO to MPS

• exactApplyMPO(MPO K, MPS psi, Args args = Args::global()) -> MPS
exactApplyMPO(IQMPO K, IQMPS psi, Args args = Args::global()) -> IQMPS

Apply an MPO K to an MPS psi, resulting in the MPS phi: $|\phi\rangle = K |\psi\rangle$ .
The resulting MPS is returned.

No approximation is made when applying the MPO, but after applying it the resulting MPS is compressed using the truncation parameters provided in the named arguments args.

If input MPS has typical bond dimension $m$ and MPO has typical bond dimension $k$ , scaling is $m^3 k^2 + m^2 k^3$ .

Named arguments recognized:

• "Cutoff" — (default: 1E-13) truncation error cutoff for compressing resulting MPS

• "Maxm" — maximum bond dimension of resulting compressed MPS

• "Verbose" — (default: false) if true, prints extra output

• checkMPOProd(MPS psi2, MPO K, MPS psi1) -> Real
checkMPOProd(IQMPS psi2, IQMPO K, IQMPS psi1) -> Real

Computes, without approximation, the difference $||\, |\psi_2\rangle - K |\psi_1\rangle ||^2$ , where K is an arbitrary MPO. This is especially useful for testing methods for applying an MPO to an MPS.