diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index eecad977..9031fbcf 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-14T03:34:31","documenter_version":"1.8.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-11-15T14:58:44","documenter_version":"1.8.0"}} \ No newline at end of file diff --git a/dev/examples/classic2d/1.hard-hexagon/index.html b/dev/examples/classic2d/1.hard-hexagon/index.html index 6128fd94..80ad0bd0 100644 --- a/dev/examples/classic2d/1.hard-hexagon/index.html +++ b/dev/examples/classic2d/1.hard-hexagon/index.html @@ -97,4 +97,4 @@ -

This page was generated using Literate.jl.

+

This page was generated using Literate.jl.

diff --git a/dev/examples/index.html b/dev/examples/index.html index e9268c5e..d6b7d73b 100644 --- a/dev/examples/index.html +++ b/dev/examples/index.html @@ -1,2 +1,2 @@ -Examples · MPSKit.jl
+Examples · MPSKit.jl
diff --git a/dev/examples/quantum1d/1.ising-cft/index.html b/dev/examples/quantum1d/1.ising-cft/index.html index 831dd5a6..905a0680 100644 --- a/dev/examples/quantum1d/1.ising-cft/index.html +++ b/dev/examples/quantum1d/1.ising-cft/index.html @@ -293,4 +293,4 @@

-

This page was generated using Literate.jl.

+

This page was generated using Literate.jl.

diff --git a/dev/examples/quantum1d/2.haldane/index.html b/dev/examples/quantum1d/2.haldane/index.html index a9857e52..1f06760f 100644 --- a/dev/examples/quantum1d/2.haldane/index.html +++ b/dev/examples/quantum1d/2.haldane/index.html @@ -212,4 +212,4 @@

-

This page was generated using Literate.jl.

+

This page was generated using Literate.jl.

diff --git a/dev/examples/quantum1d/3.ising-dqpt/index.html b/dev/examples/quantum1d/3.ising-dqpt/index.html index 96d21fec..5aba8bea 100644 --- a/dev/examples/quantum1d/3.ising-dqpt/index.html +++ b/dev/examples/quantum1d/3.ising-dqpt/index.html @@ -61,4 +61,4 @@ end return times, echos -end
infinite_sim (generic function with 3 methods)


This page was generated using Literate.jl.

+end
infinite_sim (generic function with 3 methods)


This page was generated using Literate.jl.

diff --git a/dev/examples/quantum1d/4.xxz-heisenberg/index.html b/dev/examples/quantum1d/4.xxz-heisenberg/index.html index a0e8f6aa..e6c17d26 100644 --- a/dev/examples/quantum1d/4.xxz-heisenberg/index.html +++ b/dev/examples/quantum1d/4.xxz-heisenberg/index.html @@ -1782,4 +1782,4 @@ [ Info: VUMPS 399: obj = -8.862878980874e-01 err = 6.3281276721e-11 time = 0.03 sec ┌ Warning: VUMPS cancel 400: obj = -8.862878980874e-01 err = 6.3702904878e-11 time = 23.07 sec └ @ MPSKit ~/Projects/Julia/MPSKit.jl/src/algorithms/groundstate/vumps.jl:67 -

This page was generated using Literate.jl.

+

This page was generated using Literate.jl.

diff --git a/dev/examples/quantum1d/5.haldane-spt/index.html b/dev/examples/quantum1d/5.haldane-spt/index.html index 2deb1ee8..87786e5f 100644 --- a/dev/examples/quantum1d/5.haldane-spt/index.html +++ b/dev/examples/quantum1d/5.haldane-spt/index.html @@ -863,4 +863,4 @@ println("S_minus + log(2) = $(S_minus + log(2))") println("S_plus = $S_plus")
S_minus + log(2) = 1.5486227235401464
 S_plus = 1.5450323530570809
-

This page was generated using Literate.jl.

+

This page was generated using Literate.jl.

diff --git a/dev/index.html b/dev/index.html index 4d812a18..e83e5db0 100644 --- a/dev/index.html +++ b/dev/index.html @@ -37,23 +37,23 @@ └── AL[1]: TensorMap((ℂ^1 ⊗ ℂ^2) ← ℂ^2)

These objects can then be used to compute observables and expectation values. For example, the expectation value of the identity operator at the third site, which is equal to the norm of the MPS, can be computed as:

N1 = LinearAlgebra.norm(mps)
 N2 = expectation_value(mps, 3 => id(physicalspace(mps, 3)))
 println("‖mps‖ = $N1")
-println("<mps|𝕀₃|mps> = $N2")
‖mps‖ = 2.236067977499789
-<mps|𝕀₃|mps> = 5.0 + 0.0im

Finally, the MPS can be optimized in order to determine groundstates of given Hamiltonians. Using the pre-defined models in MPSKitModels, we can construct the groundstate for the transverse field Ising model:

H = transverse_field_ising(; J=1.0, g=0.5)
+println("<mps|𝕀₃|mps> = $N2")
‖mps‖ = 2.23606797749979
+<mps|𝕀₃|mps> = 4.999999999999998 + 0.0im

Finally, the MPS can be optimized in order to determine groundstates of given Hamiltonians. Using the pre-defined models in MPSKitModels, we can construct the groundstate for the transverse field Ising model:

H = transverse_field_ising(; J=1.0, g=0.5)
 find_groundstate!(mps, H, DMRG(; maxiter=10))
 E0 = expectation_value(mps, H)
-println("<mps|H|mps> = $(sum(real(E0)) / length(mps))")
[ Info: DMRG init:	obj = -2.575555611189e+00	err = 4.4605e-01
-[ Info: DMRG   1:	obj = -9.765456607205e+00	err = 2.7201197751e-02	time = 0.49 sec
-[ Info: DMRG   2:	obj = -9.765503437649e+00	err = 6.8591176517e-04	time = 0.34 sec
-[ Info: DMRG   3:	obj = -9.765503492640e+00	err = 3.9295291405e-06	time = 0.01 sec
-[ Info: DMRG   4:	obj = -9.765503493029e+00	err = 3.0129566195e-06	time = 0.02 sec
-[ Info: DMRG   5:	obj = -9.765503493188e+00	err = 2.2145029150e-06	time = 0.05 sec
-[ Info: DMRG   6:	obj = -9.765503493258e+00	err = 1.5486020775e-06	time = 0.02 sec
-[ Info: DMRG   7:	obj = -9.765503493288e+00	err = 1.0433052129e-06	time = 0.01 sec
-[ Info: DMRG   8:	obj = -9.765503493300e+00	err = 6.8536474539e-07	time = 0.01 sec
-[ Info: DMRG   9:	obj = -9.765503493306e+00	err = 4.4298499071e-07	time = 0.01 sec
-┌ Warning: DMRG cancel 10:	obj = -9.765503493308e+00	err = 2.8344939926e-07	time = 0.98 sec
+println("<mps|H|mps> = $(sum(real(E0)) / length(mps))")
[ Info: DMRG init:	obj = -2.347487452359e+00	err = 4.4818e-01
+[ Info: DMRG   1:	obj = -9.765493937944e+00	err = 3.1197805050e-02	time = 0.56 sec
+[ Info: DMRG   2:	obj = -9.765503449790e+00	err = 1.7813534270e-04	time = 0.34 sec
+[ Info: DMRG   3:	obj = -9.765503488540e+00	err = 6.1130133540e-06	time = 0.02 sec
+[ Info: DMRG   4:	obj = -9.765503488901e+00	err = 2.7798031514e-06	time = 0.02 sec
+[ Info: DMRG   5:	obj = -9.765503488996e+00	err = 1.2747655811e-06	time = 0.02 sec
+[ Info: DMRG   6:	obj = -9.765503489024e+00	err = 6.0604627315e-07	time = 0.01 sec
+[ Info: DMRG   7:	obj = -9.765503489033e+00	err = 3.7247604684e-07	time = 0.02 sec
+[ Info: DMRG   8:	obj = -9.765503489036e+00	err = 2.3111917723e-07	time = 0.02 sec
+[ Info: DMRG   9:	obj = -9.765503489037e+00	err = 1.4426660914e-07	time = 0.02 sec
+┌ Warning: DMRG cancel 10:	obj = -9.765503489037e+00	err = 9.0393348473e-08	time = 1.03 sec
 └ @ MPSKit ~/work/MPSKit.jl/MPSKit.jl/src/algorithms/groundstate/dmrg.jl:54
-<mps|H|mps> = -0.9765503493307763

Infinite Matrix Product States

Similarly, an infinite MPS can be constructed by specifying the tensors for the unit cell, characterised by the spaces (dimensions) thereof.

d = 2 # physical dimension
+<mps|H|mps> = -0.9765503489037112

Infinite Matrix Product States

Similarly, an infinite MPS can be constructed by specifying the tensors for the unit cell, characterised by the spaces (dimensions) thereof.

d = 2 # physical dimension
 D = 5 # virtual dimension
 mps = InfiniteMPS(d, D) # random MPS
single site InfiniteMPS:
 │   ⋮
@@ -73,37 +73,102 @@
 

These objects can then be used to compute observables and expectation values. For example, the norm of the MPS, which is equal to the expectation value of the identity operator can be computed by:

N1 = norm(mps)
 N2 = expectation_value(mps, 1 => id(physicalspace(mps, 1)))
 println("‖mps‖ = $N1")
-println("<mps|𝕀₁|mps> = $N2")
‖mps‖ = 1.0
+println("<mps|𝕀₁|mps> = $N2")
‖mps‖ = 1.0000000000000002
 <mps|𝕀₁|mps> = 1.0 + 0.0im
Normalization of infinite MPS

Because infinite MPS cannot sensibly be normalized to anything but $1$, the norm of an infinite MPS is always set to be $1$ at construction. If this were not the case, any observable computed from the MPS would either blow up to infinity or vanish to zero.

Finally, the MPS can be optimized in order to determine groundstates of given Hamiltonians. Using the pre-defined models in MPSKitModels, we can construct the groundstate for the transverse field Ising model:

H = transverse_field_ising(; J=1.0, g=0.5)
 mps, = find_groundstate(mps, H, VUMPS(; maxiter=10))
 E0 = expectation_value(mps, H)
-println("<mps|H|mps> = $(sum(real(E0)) / length(mps))")
[ Info: VUMPS init:	obj = -5.026824571665e-01	err = 4.8691e-01
-[ Info: VUMPS   1:	obj = -1.035759046188e+00	err = 1.1317446135e-01	time = 0.00 sec
-┌ Warning: ignoring imaginary component -2.570632638199122e-6 from total weight 4.281792538207528: operator might not be hermitian?
-│   α = 3.321724080729086 - 2.570632638199122e-6im
-│   β₁ = 1.9785050579873713
-│   β₂ = 1.8399495121513372
-└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
-┌ Warning: ignoring imaginary component -2.6734379244379436e-6 from total weight 4.810506101315609: operator might not be hermitian?
-│   α = 4.121733532519911 - 2.6734379244379436e-6im
-│   β₁ = 1.8399495121513372
-│   β₂ = 1.6633903421694343
-└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
-┌ Warning: ignoring imaginary component -2.696391641077156e-6 from total weight 4.3548311829073265: operator might not be hermitian?
-│   α = 3.8633095664409143 - 2.696391641077156e-6im
-│   β₁ = 1.5419931031192062
-│   β₂ = 1.2890504627025545
-└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
-┌ Warning: ignoring imaginary component -3.273938737807791e-6 from total weight 3.093473687971975: operator might not be hermitian?
-│   α = 2.6580401492057946 - 3.273938737807791e-6im
-│   β₁ = 1.2890504627025545
-│   β₂ = 0.9180146665389293
-└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
-[ Info: VUMPS   2:	obj = -1.063544293167e+00	err = 2.9268859877e-04	time = 0.08 sec
-[ Info: VUMPS   3:	obj = -1.063544409955e+00	err = 4.6026950645e-06	time = 0.00 sec
-[ Info: VUMPS   4:	obj = -1.063544409973e+00	err = 2.6020357111e-07	time = 0.00 sec
-[ Info: VUMPS   5:	obj = -1.063544409973e+00	err = 2.3921973258e-08	time = 0.00 sec
-[ Info: VUMPS   6:	obj = -1.063544409973e+00	err = 2.4887599125e-09	time = 0.00 sec
-[ Info: VUMPS   7:	obj = -1.063544409973e+00	err = 2.6785523629e-10	time = 0.00 sec
-[ Info: VUMPS conv 8:	obj = -1.063544409973e+00	err = 4.3626407159e-11	time = 0.10 sec
-<mps|H|mps> = -1.0635444099732518

Additional Resources

For more detailed information on the functionality and capabilities of MPSKit, refer to the Manual section, or have a look at the Examples page.

Keep in mind that the documentation is still a work in progress, and that some features may not be fully documented yet. If you encounter any issues or have questions, please check the library's issue tracker on the GitHub repository and open a new issue.

Publications using MPSKit

Below you can find a list of publications that have made use of MPSKit. If you have used this package and wish to have your publication added to this list, please open a pull request or an issue on the GitHub repository.

  • R. Belyansky et al., “High-Energy Collision of Quarks and Hadrons in the Schwinger Model: From Tensor Networks to Circuit QED,” 2023, doi: 10.48550/ARXIV.2307.02522.
  • L. Devos, L. Vanderstraeten, and F. Verstraete, “Haldane gap in the SU(3) [3 0 0] Heisenberg chain,” Phys. Rev. B, vol. 106, no. 15, p. 155103, Oct. 2022, doi: 10.1103/PhysRevB.106.155103.
  • J. C. Halimeh, M. V. Damme, T. V. Zache, D. Banerjee, and P. Hauke, “Achieving the quantum field theory limit in far-from-equilibrium quantum link models,” Quantum, vol. 6, p. 878, Dec. 2022, doi: 10.22331/q-2022-12-19-878.
  • J. C. Halimeh, D. Trapin, M. Van Damme, and M. Heyl, “Local measures of dynamical quantum phase transitions,” Phys. Rev. B, vol. 104, no. 7, p. 075130, Aug. 2021, doi: 10.1103/PhysRevB.104.075130.
  • M. Hauru, M. Van Damme, and J. Haegeman, “Riemannian optimization of isometric tensor networks,” SciPost Physics, vol. 10, no. 2, p. 040, Feb. 2021, doi: 10.21468/SciPostPhys.10.2.040.
  • M. Van Damme, R. Vanhove, J. Haegeman, F. Verstraete, and L. Vanderstraeten, “Efficient matrix product state methods for extracting spectral information on rings and cylinders,” Phys. Rev. B, vol. 104, no. 11, p. 115142, Sep. 2021, doi: 10.1103/PhysRevB.104.115142.
  • M. Van Damme, T. V. Zache, D. Banerjee, P. Hauke, and J. C. Halimeh, “Dynamical quantum phase transitions in spin-$S$ $\text{U}(1)$ quantum link models,” Phys. Rev. B, vol. 106, no. 24, p. 245110, Dec. 2022, doi: 10.1103/PhysRevB.106.245110.
  • E. L. Weerda and M. Rizzi, “Fractional quantum Hall states with variational Projected Entangled-Pair States: a study of the bosonic Harper-Hofstadter model,” 2023, doi: 10.48550/ARXIV.2309.12811.
  • C. Yu and J.-W. Lee, “Closing of the Haldane gap in a spin-1 XXZ chain,” J. Korean Phys. Soc., vol. 79, no. 9, pp. 841–845, Nov. 2021, doi: 10.1007/s40042-021-00283-z.
  • Y. Zhang, A. Hulsch, H.-C. Zhang, W. Tang, L. Wang, and H.-H. Tu, “Universal Scaling of Klein Bottle Entropy near Conformal Critical Points,” Phys. Rev. Lett., vol. 130, no. 15, p. 151602, Apr. 2023, doi: 10.1103/PhysRevLett.130.151602.
  • Gertian Roose, Laurens Vanderstraeten, Jutho Haegeman, and Nick Bultinck. Anomalous domain wall condensation in a modified ising chain. Phys. Rev. B, 99: 195132, May 2019. 10.1103/​PhysRevB.99.195132.

https:/​/​doi.org/​10.1103/​PhysRevB.99.195132

  • Roose, G., Bultinck, N., Vanderstraeten, L. et al. Lattice regularisation and entanglement structure of the Gross-Neveu model. J. High Energ. Phys. 2021, 207 (2021). https://doi.org/10.1007/JHEP07(2021)207
  • Roose, G., Haegeman, J., Van Acoleyen, K. et al. The chiral Gross-Neveu model on the lattice via a Landau-forbidden phase transition. J. High Energ. Phys. 2022, 19 (2022). https://doi.org/10.1007/JHEP06(2022)019
+println("<mps|H|mps> = $(sum(real(E0)) / length(mps))")
[ Info: VUMPS init:	obj = -4.994224776100e-01	err = 4.6577e-01
+[ Info: VUMPS   1:	obj = -1.055481882601e+00	err = 7.0005137418e-02	time = 0.00 sec
+┌ Warning: ignoring imaginary component 4.684262951883816e-6 from total weight 1.0563346629573251: operator might not be hermitian?
+│   α = 0.5596558886549338 + 4.684262951883816e-6im
+│   β₁ = 0.39810887806655126
+│   β₂ = 0.8025817887553092
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 4.455953650783773e-6 from total weight 2.6515752197156957: operator might not be hermitian?
+│   α = 2.163387545504827 + 4.455953650783773e-6im
+│   β₁ = 0.8025817887553092
+│   β₂ = 1.3063184703981698
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 6.170503187616361e-6 from total weight 3.7207726053155303: operator might not be hermitian?
+│   α = 2.962345383530127 + 6.170503187616361e-6im
+│   β₁ = 1.3063184703981698
+│   β₂ = 1.8336277329389334
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 7.11099670586135e-6 from total weight 4.722010308834254: operator might not be hermitian?
+│   α = 3.8578769018621375 + 7.11099670586135e-6im
+│   β₁ = 1.8336277329389334
+│   β₂ = 2.0129521861589827
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 8.767215335672707e-6 from total weight 5.354405946048363: operator might not be hermitian?
+│   α = 4.374866674547288 + 8.767215335672707e-6im
+│   β₁ = 2.0129521861589827
+│   β₂ = 2.3405614948500126
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 9.373552826458242e-6 from total weight 5.4546162957704105: operator might not be hermitian?
+│   α = 4.382414261770208 + 9.373552826458242e-6im
+│   β₁ = 2.3405614948500126
+│   β₂ = 2.2514564310807375
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 8.078930787608352e-6 from total weight 5.483465757935781: operator might not be hermitian?
+│   α = 4.493710671287577 + 8.078930787608352e-6im
+│   β₁ = 2.2514564310807375
+│   β₂ = 2.1922374552247534
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 6.3964540209654475e-6 from total weight 4.819443318398851: operator might not be hermitian?
+│   α = 3.87216956083024 + 6.3964540209654475e-6im
+│   β₁ = 2.1922374552247534
+│   β₂ = 1.8513324205306438
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 6.801709978812576e-6 from total weight 4.6611697073592815: operator might not be hermitian?
+│   α = 3.8727908613638617 + 6.801709978812576e-6im
+│   β₁ = 1.8513324205306438
+│   β₂ = 1.8167449610735817
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 5.388356573293729e-6 from total weight 1.8005273820166514: operator might not be hermitian?
+│   α = 1.59357990039475 + 5.388356573293729e-6im
+│   β₁ = 0.3713258810775188
+│   β₂ = 0.7513448239407562
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 5.035931292890483e-6 from total weight 3.4280149143738217: operator might not be hermitian?
+│   α = 3.1077748513766688 + 5.035931292890483e-6im
+│   β₁ = 0.7513448239407562
+│   β₂ = 1.236326284535016
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 7.1468343857683525e-6 from total weight 4.244699408896721: operator might not be hermitian?
+│   α = 3.729428782120104 + 7.1468343857683525e-6im
+│   β₁ = 1.236326284535016
+│   β₂ = 1.6063409815786596
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 1.0150355522098309e-5 from total weight 4.908383978699719: operator might not be hermitian?
+│   α = 4.366985584013427 + 1.0150355522098309e-5im
+│   β₁ = 1.6063409815786596
+│   β₂ = 1.5624784293464289
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 8.198077047515129e-6 from total weight 4.254685487755011: operator might not be hermitian?
+│   α = 3.7391556546139664 + 8.198077047515129e-6im
+│   β₁ = 1.5624784293464289
+│   β₂ = 1.2960419545838031
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 7.389112685399213e-6 from total weight 4.217851435620728: operator might not be hermitian?
+│   α = 3.724408758654011 + 7.389112685399213e-6im
+│   β₁ = 1.2960419545838031
+│   β₂ = 1.4964375641279286
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 8.536462041798878e-6 from total weight 4.354806366447454: operator might not be hermitian?
+│   α = 3.955572853465539 + 8.536462041798878e-6im
+│   β₁ = 1.4964375641279286
+│   β₂ = 1.0384876054974235
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+┌ Warning: ignoring imaginary component 8.896031061027005e-6 from total weight 4.0382360854579415: operator might not be hermitian?
+│   α = 3.8273614096175756 + 8.896031061027005e-6im
+│   β₁ = 1.0384876054974235
+│   β₂ = 0.7617078279852009
+└ @ KrylovKit ~/.julia/packages/KrylovKit/xccMN/src/factorizations/lanczos.jl:170
+[ Info: VUMPS   2:	obj = -1.063544038575e+00	err = 5.3066706913e-04	time = 0.09 sec
+[ Info: VUMPS   3:	obj = -1.063544409948e+00	err = 5.2649383868e-06	time = 0.00 sec
+[ Info: VUMPS   4:	obj = -1.063544409973e+00	err = 4.1274138416e-07	time = 0.00 sec
+[ Info: VUMPS   5:	obj = -1.063544409973e+00	err = 4.2160020281e-08	time = 0.00 sec
+[ Info: VUMPS   6:	obj = -1.063544409973e+00	err = 4.4279925880e-09	time = 0.00 sec
+[ Info: VUMPS   7:	obj = -1.063544409973e+00	err = 4.7154012780e-10	time = 0.00 sec
+[ Info: VUMPS conv 8:	obj = -1.063544409973e+00	err = 7.0534198238e-11	time = 0.11 sec
+<mps|H|mps> = -1.0635444099732505

Additional Resources

For more detailed information on the functionality and capabilities of MPSKit, refer to the Manual section, or have a look at the Examples page.

Keep in mind that the documentation is still a work in progress, and that some features may not be fully documented yet. If you encounter any issues or have questions, please check the library's issue tracker on the GitHub repository and open a new issue.

Publications using MPSKit

Below you can find a list of publications that have made use of MPSKit. If you have used this package and wish to have your publication added to this list, please open a pull request or an issue on the GitHub repository.

  • R. Belyansky et al., “High-Energy Collision of Quarks and Hadrons in the Schwinger Model: From Tensor Networks to Circuit QED,” 2023, doi: 10.48550/ARXIV.2307.02522.
  • L. Devos, L. Vanderstraeten, and F. Verstraete, “Haldane gap in the SU(3) [3 0 0] Heisenberg chain,” Phys. Rev. B, vol. 106, no. 15, p. 155103, Oct. 2022, doi: 10.1103/PhysRevB.106.155103.
  • J. C. Halimeh, M. V. Damme, T. V. Zache, D. Banerjee, and P. Hauke, “Achieving the quantum field theory limit in far-from-equilibrium quantum link models,” Quantum, vol. 6, p. 878, Dec. 2022, doi: 10.22331/q-2022-12-19-878.
  • J. C. Halimeh, D. Trapin, M. Van Damme, and M. Heyl, “Local measures of dynamical quantum phase transitions,” Phys. Rev. B, vol. 104, no. 7, p. 075130, Aug. 2021, doi: 10.1103/PhysRevB.104.075130.
  • M. Hauru, M. Van Damme, and J. Haegeman, “Riemannian optimization of isometric tensor networks,” SciPost Physics, vol. 10, no. 2, p. 040, Feb. 2021, doi: 10.21468/SciPostPhys.10.2.040.
  • M. Van Damme, R. Vanhove, J. Haegeman, F. Verstraete, and L. Vanderstraeten, “Efficient matrix product state methods for extracting spectral information on rings and cylinders,” Phys. Rev. B, vol. 104, no. 11, p. 115142, Sep. 2021, doi: 10.1103/PhysRevB.104.115142.
  • M. Van Damme, T. V. Zache, D. Banerjee, P. Hauke, and J. C. Halimeh, “Dynamical quantum phase transitions in spin-$S$ $\text{U}(1)$ quantum link models,” Phys. Rev. B, vol. 106, no. 24, p. 245110, Dec. 2022, doi: 10.1103/PhysRevB.106.245110.
  • E. L. Weerda and M. Rizzi, “Fractional quantum Hall states with variational Projected Entangled-Pair States: a study of the bosonic Harper-Hofstadter model,” 2023, doi: 10.48550/ARXIV.2309.12811.
  • C. Yu and J.-W. Lee, “Closing of the Haldane gap in a spin-1 XXZ chain,” J. Korean Phys. Soc., vol. 79, no. 9, pp. 841–845, Nov. 2021, doi: 10.1007/s40042-021-00283-z.
  • Y. Zhang, A. Hulsch, H.-C. Zhang, W. Tang, L. Wang, and H.-H. Tu, “Universal Scaling of Klein Bottle Entropy near Conformal Critical Points,” Phys. Rev. Lett., vol. 130, no. 15, p. 151602, Apr. 2023, doi: 10.1103/PhysRevLett.130.151602.
  • Gertian Roose, Laurens Vanderstraeten, Jutho Haegeman, and Nick Bultinck. Anomalous domain wall condensation in a modified ising chain. Phys. Rev. B, 99: 195132, May 2019. 10.1103/​PhysRevB.99.195132.

https:/​/​doi.org/​10.1103/​PhysRevB.99.195132

  • Roose, G., Bultinck, N., Vanderstraeten, L. et al. Lattice regularisation and entanglement structure of the Gross-Neveu model. J. High Energ. Phys. 2021, 207 (2021). https://doi.org/10.1007/JHEP07(2021)207
  • Roose, G., Haegeman, J., Van Acoleyen, K. et al. The chiral Gross-Neveu model on the lattice via a Landau-forbidden phase transition. J. High Energ. Phys. 2022, 19 (2022). https://doi.org/10.1007/JHEP06(2022)019
diff --git a/dev/lib/lib/index.html b/dev/lib/lib/index.html index b1e7bf12..bb6176cf 100644 --- a/dev/lib/lib/index.html +++ b/dev/lib/lib/index.html @@ -5,44 +5,44 @@ FiniteMPS([f, eltype], N::Int, physicalspace::Union{S,CompositeSpace{S}}, maxvirtualspaces::Union{S,Vector{S}}; normalize=true, left=oneunit(S), right=oneunit(S)) where {S<:ElementarySpace} -FiniteMPS(As::Vector{<:GenericMPSTensor}; normalize=false, overwrite=false)

Construct an MPS via a specification of physical and virtual spaces, or from a list of tensors As. All cases reduce to the latter.

Arguments

  • As::Vector{<:GenericMPSTensor}: vector of site tensors

  • f::Function=rand: initializer function for tensor data

  • eltype::Type{<:Number}=ComplexF64: scalar type of tensors

  • physicalspaces::Vector{<:Union{S, CompositeSpace{S}}: list of physical spaces

  • N::Int: number of sites

  • physicalspace::Union{S,CompositeSpace{S}}: local physical space

  • virtualspaces::Vector{<:Union{S, CompositeSpace{S}}: list of virtual spaces

  • maxvirtualspace::S: maximum virtual space

Keywords

  • normalize: normalize the constructed state
  • overwrite=false: overwrite the given input tensors
  • left=oneunit(S): left-most virtual space
  • right=oneunit(S): right-most virtual space
source
MPSKit.InfiniteMPSType
InfiniteMPS{A<:GenericMPSTensor,B<:MPSBondTensor} <: AbtractMPS

Type that represents an infinite Matrix Product State.

Fields

  • AL – left-gauged MPS tensors
  • AR – right-gauged MPS tensors
  • AC – center-gauged MPS tensors
  • CR – gauge tensors

Notes

By convention, we have that:

  • AL[i] * CR[i] = AC[i] = CR[i-1] * AR[i]
  • AL[i]' * AL[i] = 1
  • AR[i] * AR[i]' = 1

Constructors

InfiniteMPS([f, eltype], physicalspaces::Vector{<:Union{S, CompositeSpace{S}},
+FiniteMPS(As::Vector{<:GenericMPSTensor}; normalize=false, overwrite=false)

Construct an MPS via a specification of physical and virtual spaces, or from a list of tensors As. All cases reduce to the latter.

Arguments

  • As::Vector{<:GenericMPSTensor}: vector of site tensors

  • f::Function=rand: initializer function for tensor data

  • eltype::Type{<:Number}=ComplexF64: scalar type of tensors

  • physicalspaces::Vector{<:Union{S, CompositeSpace{S}}: list of physical spaces

  • N::Int: number of sites

  • physicalspace::Union{S,CompositeSpace{S}}: local physical space

  • virtualspaces::Vector{<:Union{S, CompositeSpace{S}}: list of virtual spaces

  • maxvirtualspace::S: maximum virtual space

Keywords

  • normalize: normalize the constructed state
  • overwrite=false: overwrite the given input tensors
  • left=oneunit(S): left-most virtual space
  • right=oneunit(S): right-most virtual space
source
MPSKit.InfiniteMPSType
InfiniteMPS{A<:GenericMPSTensor,B<:MPSBondTensor} <: AbtractMPS

Type that represents an infinite Matrix Product State.

Fields

  • AL – left-gauged MPS tensors
  • AR – right-gauged MPS tensors
  • AC – center-gauged MPS tensors
  • CR – gauge tensors

Notes

By convention, we have that:

  • AL[i] * CR[i] = AC[i] = CR[i-1] * AR[i]
  • AL[i]' * AL[i] = 1
  • AR[i] * AR[i]' = 1

Constructors

InfiniteMPS([f, eltype], physicalspaces::Vector{<:Union{S, CompositeSpace{S}},
             virtualspaces::Vector{<:Union{S, CompositeSpace{S}};
             kwargs...) where {S<:ElementarySpace}
 InfiniteMPS(As::AbstractVector{<:GenericMPSTensor}; kwargs...)
 InfiniteMPS(ALs::AbstractVector{<:GenericMPSTensor}, C₀::MPSBondTensor;
-            kwargs...)

Construct an MPS via a specification of physical and virtual spaces, or from a list of tensors As, or a list of left-gauged tensors ALs.

Arguments

  • As::AbstractVector{<:GenericMPSTensor}: vector of site tensors

  • ALs::AbstractVector{<:GenericMPSTensor}: vector of left-gauged site tensors

  • C₀::MPSBondTensor: initial gauge tensor

  • f::Function=rand: initializer function for tensor data

  • eltype::Type{<:Number}=ComplexF64: scalar type of tensors

  • physicalspaces::AbstractVector{<:Union{S, CompositeSpace{S}}: list of physical spaces

  • virtualspaces::AbstractVector{<:Union{S, CompositeSpace{S}}: list of virtual spaces

Keywords

  • tol: gauge fixing tolerance
  • maxiter: gauge fixing maximum iterations
source
MPSKit.WindowMPSType
WindowMPS{A<:GenericMPSTensor,B<:MPSBondTensor} <: AbstractFiniteMPS

Type that represents a finite Matrix Product State embedded in an infinte Matrix Product State.

Fields

  • left_gs::InfiniteMPS – left infinite environment
  • window::FiniteMPS – finite window Matrix Product State
  • right_gs::InfiniteMPS – right infinite environment

Constructors

WindowMPS(left_gs::InfiniteMPS, window_state::FiniteMPS, [right_gs::InfiniteMPS])
+            kwargs...)

Construct an MPS via a specification of physical and virtual spaces, or from a list of tensors As, or a list of left-gauged tensors ALs.

Arguments

  • As::AbstractVector{<:GenericMPSTensor}: vector of site tensors

  • ALs::AbstractVector{<:GenericMPSTensor}: vector of left-gauged site tensors

  • C₀::MPSBondTensor: initial gauge tensor

  • f::Function=rand: initializer function for tensor data

  • eltype::Type{<:Number}=ComplexF64: scalar type of tensors

  • physicalspaces::AbstractVector{<:Union{S, CompositeSpace{S}}: list of physical spaces

  • virtualspaces::AbstractVector{<:Union{S, CompositeSpace{S}}: list of virtual spaces

Keywords

  • tol: gauge fixing tolerance
  • maxiter: gauge fixing maximum iterations
source
MPSKit.WindowMPSType
WindowMPS{A<:GenericMPSTensor,B<:MPSBondTensor} <: AbstractFiniteMPS

Type that represents a finite Matrix Product State embedded in an infinte Matrix Product State.

Fields

  • left_gs::InfiniteMPS – left infinite environment
  • window::FiniteMPS – finite window Matrix Product State
  • right_gs::InfiniteMPS – right infinite environment

Constructors

WindowMPS(left_gs::InfiniteMPS, window_state::FiniteMPS, [right_gs::InfiniteMPS])
 WindowMPS(left_gs::InfiniteMPS, window_tensors::AbstractVector, [right_gs::InfiniteMPS])
 WindowMPS([f, eltype], physicalspaces::Vector{<:Union{S, CompositeSpace{S}},
           virtualspaces::Vector{<:Union{S, CompositeSpace{S}}, left_gs::InfiniteMPS,
           [right_gs::InfiniteMPS])
 WindowMPS([f, eltype], physicalspaces::Vector{<:Union{S,CompositeSpace{S}}},
-          maxvirtualspace::S, left_gs::InfiniteMPS, [right_gs::InfiniteMPS])

Construct a WindowMPS via a specification of left and right infinite environment, and either a window state or a vector of tensors to construct the window. Alternatively, it is possible to supply the same arguments as for the constructor of FiniteMPS, followed by a left (and right) environment to construct the WindowMPS in one step.

Note

By default, the right environment is chosen to be equal to the left, however no copy is made. In this case, changing the left state will also affect the right state.

WindowMPS(state::InfiniteMPS, L::Int)

Construct a WindowMPS from an InfiniteMPS, by promoting a region of length L to a FiniteMPS.

source
MPSKit.MPSMultilineType
const MPSMultiline = Multiline{<:InfiniteMPS}

Type that represents multiple lines of InfiniteMPS objects.

Constructors

MPSMultiline(mpss::AbstractVector{<:InfiniteMPS})
+          maxvirtualspace::S, left_gs::InfiniteMPS, [right_gs::InfiniteMPS])

Construct a WindowMPS via a specification of left and right infinite environment, and either a window state or a vector of tensors to construct the window. Alternatively, it is possible to supply the same arguments as for the constructor of FiniteMPS, followed by a left (and right) environment to construct the WindowMPS in one step.

Note

By default, the right environment is chosen to be equal to the left, however no copy is made. In this case, changing the left state will also affect the right state.

WindowMPS(state::InfiniteMPS, L::Int)

Construct a WindowMPS from an InfiniteMPS, by promoting a region of length L to a FiniteMPS.

source
MPSKit.MPSMultilineType
const MPSMultiline = Multiline{<:InfiniteMPS}

Type that represents multiple lines of InfiniteMPS objects.

Constructors

MPSMultiline(mpss::AbstractVector{<:InfiniteMPS})
 MPSMultiline([f, eltype], physicalspaces::Matrix{<:Union{S, CompositeSpace{S}},
              virtualspaces::Matrix{<:Union{S, CompositeSpace{S}}) where
              {S<:ElementarySpace}
 MPSMultiline(As::AbstractMatrix{<:GenericMPSTensor}; kwargs...)
 MPSMultiline(ALs::AbstractMatrix{<:GenericMPSTensor}, 
-             C₀::AbstractVector{<:MPSBondTensor}; kwargs...)

See also: Multiline

source

Operators

MPSKit.FiniteMPOType
FiniteMPO(Os::Vector{<:MPOTensor}) -> FiniteMPO
-FiniteMPO(O::AbstractTensorMap{S,N,N}) where {S,N} -> FiniteMPO

Matrix Product Operator (MPO) acting on a finite tensor product space with a linear order.

source
MPSKit.SparseMPOType
struct SparseMPO{S,T<:MPOTensor,E<:Number}

Sparse MPO, used to represent both time evolution MPOs and hamiltonians.

source
MPSKit.MPOHamiltonianType
MPOHamiltonian(lattice::AbstractArray{<:VectorSpace}, local_operators...)
+             C₀::AbstractVector{<:MPSBondTensor}; kwargs...)

See also: Multiline

source

Operators

MPSKit.FiniteMPOType
FiniteMPO(Os::Vector{<:MPOTensor}) -> FiniteMPO
+FiniteMPO(O::AbstractTensorMap{S,N,N}) where {S,N} -> FiniteMPO

Matrix Product Operator (MPO) acting on a finite tensor product space with a linear order.

source
MPSKit.SparseMPOType
struct SparseMPO{S,T<:MPOTensor,E<:Number}

Sparse MPO, used to represent both time evolution MPOs and hamiltonians.

source
MPSKit.MPOHamiltonianType
MPOHamiltonian(lattice::AbstractArray{<:VectorSpace}, local_operators...)
 MPOHamiltonian(lattice::AbstractArray{<:VectorSpace})
 MPOHamiltonian(x::AbstractArray{<:Any,3})

MPO representation of a hamiltonian. This is a specific form of a SparseMPO, where all the sites are represented by an upper triangular block matrix of the following form:

\[\begin{pmatrix} 1 C D 0 A B 0 0 1 \end{pmatrix}\]

where A, B, C, and D are MPOTensors, or (sparse) blocks thereof.

Examples

For example, constructing a nearest-neighbour Hamiltonian would look like this:

lattice = fill(ℂ^2, 10)
-H = MPOHamiltonian(lattice, (i, i+1) => O for i in 1:length(lattice)-1)

See also instantiate_operator, which is responsable for instantiating the local operators in a form that is compatible with this constructor.

source

Environments

MPSKit.FinEnvType
FinEnv keeps track of the environments for FiniteMPS / WindowMPS
+H = MPOHamiltonian(lattice, (i, i+1) => O for i in 1:length(lattice)-1)

See also instantiate_operator, which is responsable for instantiating the local operators in a form that is compatible with this constructor.

source

Environments

MPSKit.FinEnvType
FinEnv keeps track of the environments for FiniteMPS / WindowMPS
 It automatically checks if the queried environment is still correctly cached and if not - recalculates
 
 if above is set to nothing, above === below.
 
-opp can be a vector of nothing, in which case it'll just be the overlap
source
Missing docstring.

Missing docstring for MPSKit.IDMRGEnvs. Check Documenter's build log for details.

Generic actions

MPSKit.∂CFunction
Zero-site derivative (the C matrix to the right of pos)
source
Missing docstring.

Missing docstring for ∂∂C. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂AC. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂∂AC. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂∂AC2. Check Documenter's build log for details.

Missing docstring.

Missing docstring for c_proj. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ac_proj. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ac2_proj. Check Documenter's build log for details.

MPSKit.transfer_leftFunction
transfer_left(v, A, Ā)

apply a transfer matrix to the left.

 ┌─A─
+opp can be a vector of nothing, in which case it'll just be the overlap
source
Missing docstring.

Missing docstring for MPSKit.IDMRGEnvs. Check Documenter's build log for details.

Generic actions

MPSKit.∂CFunction
Zero-site derivative (the C matrix to the right of pos)
source
Missing docstring.

Missing docstring for ∂∂C. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂AC. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂∂AC. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ∂∂AC2. Check Documenter's build log for details.

Missing docstring.

Missing docstring for c_proj. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ac_proj. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ac2_proj. Check Documenter's build log for details.

MPSKit.transfer_leftFunction
transfer_left(v, A, Ā)

apply a transfer matrix to the left.

 ┌─A─
 -v │
- └─Ā─
source

Algorithms

MPSKit.find_groundstateFunction
find_groundstate(ψ, H, [environments]; kwargs...)
-find_groundstate(ψ, H, algorithm, environments)

Compute the groundstate for Hamiltonian H with initial guess ψ. If not specified, an optimization algorithm will be attempted based on the supplied keywords.

Arguments

  • ψ::AbstractMPS: initial guess
  • H::AbstractMPO: operator for which to find the groundstate
  • [environments]: MPS environment manager
  • algorithm: optimization algorithm

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information
source
MPSKit.timestepFunction
timestep(ψ₀, H, t, dt, [alg], [envs]; kwargs...)
-timestep!(ψ₀, H, t, dt, [alg], [envs]; kwargs...)

Time-step the state ψ₀ with Hamiltonian H over a given time step dt at time t, solving the Schroedinger equation: $i ∂ψ/∂t = H ψ$.

Arguments

  • ψ₀::AbstractMPS: initial state
  • H::AbstractMPO: operator that generates the time evolution (can be time-dependent).
  • t::Number: starting time of time-step
  • dt::Number: time-step magnitude
  • [alg]: algorithm to use for the time evolution. Defaults to TDVP.
  • [envs]: MPS environment manager
source
Missing docstring.

Missing docstring for dynamicaldmrg. Check Documenter's build log for details.

MPSKit.excitationsFunction
excitations(H, algorithm::QuasiparticleAnsatz, ψ::FiniteQP, [left_environments],
+─Ā─┘
source

Algorithms

MPSKit.find_groundstateFunction
find_groundstate(ψ, H, [environments]; kwargs...)
+find_groundstate(ψ, H, algorithm, environments)

Compute the groundstate for Hamiltonian H with initial guess ψ. If not specified, an optimization algorithm will be attempted based on the supplied keywords.

Arguments

  • ψ::AbstractMPS: initial guess
  • H::AbstractMPO: operator for which to find the groundstate
  • [environments]: MPS environment manager
  • algorithm: optimization algorithm

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information
source
MPSKit.timestepFunction
timestep(ψ₀, H, t, dt, [alg], [envs]; kwargs...)
+timestep!(ψ₀, H, t, dt, [alg], [envs]; kwargs...)

Time-step the state ψ₀ with Hamiltonian H over a given time step dt at time t, solving the Schroedinger equation: $i ∂ψ/∂t = H ψ$.

Arguments

  • ψ₀::AbstractMPS: initial state
  • H::AbstractMPO: operator that generates the time evolution (can be time-dependent).
  • t::Number: starting time of time-step
  • dt::Number: time-step magnitude
  • [alg]: algorithm to use for the time evolution. Defaults to TDVP.
  • [envs]: MPS environment manager
source
Missing docstring.

Missing docstring for dynamicaldmrg. Check Documenter's build log for details.

MPSKit.excitationsFunction
excitations(H, algorithm::QuasiparticleAnsatz, ψ::FiniteQP, [left_environments],
             [right_environments]; num=1)
 excitations(H, algorithm::QuasiparticleAnsatz, ψ::InfiniteQP, [left_environments],
             [right_environments]; num=1, solver=Defaults.solver)
@@ -51,11 +51,11 @@
 excitations(H, algorithm::ChepigaAnsatz, ψ::FiniteMPS, [envs];
             num=1, pos=length(ψ)÷2)
 excitations(H, algorithm::ChepigaAnsatz2, ψ::FiniteMPS, [envs];
-            num=1, pos=length(ψ)÷2)

Compute the first excited states and their energy gap above a groundstate.

Arguments

  • H::AbstractMPO: operator for which to find the excitations
  • algorithm: optimization algorithm
  • ψ::QP: initial quasiparticle guess
  • ψs::NTuple{N, <:FiniteMPS}: N first excited states
  • [left_environments]: left groundstate environment
  • [right_environments]: right groundstate environment

Keywords

  • num::Int: number of excited states to compute
  • solver: algorithm for the linear solver of the quasiparticle environments
  • init: initial excited state guess
  • pos: position of perturbation
source
MPSKit.approximateFunction
approximate(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)
-approximate!(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)

Compute an approximation to the application of an operator O to the state ψ in the form of an MPS ψ₀.

Arguments

  • ψ₀::AbstractMPS: initial guess of the approximated state
  • (O::AbstractMPO, ψ::AbstractMPS): operator O and state ψ to be approximated
  • algorithm: approximation algorithm. See below for a list of available algorithms.
  • [environments]: MPS environment manager

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information

Algorithms

  • DMRG: Alternating least square method for maximizing the fidelity with a single-site scheme.

  • DMRG2: Alternating least square method for maximizing the fidelity with a two-site scheme.

  • IDMRG1: Variant of DMRG for maximizing fidelity density in the thermodynamic limit.

  • IDMRG2: Variant of DMRG2 for maximizing fidelity density in the thermodynamic limit.

  • VOMPS: Tangent space method for truncating uniform MPS.

source

Groundstate algorithms

MPSKit.VUMPSType
VUMPS{F} <: Algorithm

Variational optimization algorithm for uniform matrix product states, as introduced in https://arxiv.org/abs/1701.07035.

Fields

  • tol::Float64: tolerance for convergence criterium

  • maxiter::Int: maximum amount of iterations

  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs

  • verbosity::Int: display progress information

  • alg_gauge=Defaults.alg_gauge(): algorithm for gauging

  • alg_eigsolve=Defaults.alg_eigsolve(): algorithm for eigensolvers

  • alg_environments=Defaults.alg_environments(): algorithm for updating environments

source
MPSKit.IDMRG1Type
IDMRG1{A} <: Algorithm

Single site infinite DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • tol_gauge::Float64: tolerance for gauging algorithm
  • eigalg::A: eigensolver algorithm
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
source
MPSKit.IDMRG2Type
IDMRG2{A} <: Algorithm

2-site infinite DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • tol_gauge::Float64: tolerance for gauging algorithm
  • eigalg::A: eigensolver algorithm
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • trscheme::TruncationScheme: truncation algorithm for [tsvd]TensorKit.tsvd
source
MPSKit.DMRGType
DMRG{A,F} <: Algorithm

Single site DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • eigalg::A: eigensolver algorithm or a NamedTuple with the eigensolver settings
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs
source
MPSKit.DMRG2Type
DMRG2{A,F} <: Algorithm

2-site DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • eigalg::A: eigensolver algorithm or a NamedTuple with the eigensolver settings
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs
  • trscheme: truncation algorithm for [tsvd]TensorKit.tsvd
source
MPSKit.GradientGrassmannType
GradientGrassmann <: Algorithm

Variational gradient-based optimization algorithm that keeps the MPS in left-canonical form, as points on a Grassmann manifold. The optimization is then a Riemannian gradient descent with a preconditioner to induce the metric from the Hilbert space inner product.

Fields

  • method::OptimKit.OptimizationAlgorithm: algorithm to perform the gradient search
  • finalize!::Function: user-supplied function which is applied after each iteration, with signature finalize!(x::GrassmannMPS.ManifoldPoint, f, g, numiter) -> x, f, g

Constructors

GradientGrassmann(; kwargs...)

Keywords

  • method=ConjugateGradient: instance of optimization algorithm, or type of optimization algorithm to construct
  • finalize!: finalizer algorithm
  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: level of information display
source

Time evolution algorithms

MPSKit.TDVPType
TDVP{A} <: Algorithm

Single site TDVP algorithm for time evolution.

Fields

  • integrator::A: integration algorithm (defaults to Lanczos exponentiation)
  • tolgauge::Float64: tolerance for gauging algorithm
  • gaugemaxiter::Int: maximum amount of gauging iterations
  • finalize::F: user-supplied function which is applied after each timestep, with signature finalize(t, Ψ, H, envs) -> Ψ, envs
source
MPSKit.TDVP2Type
TDVP2{A} <: Algorithm

2-site TDVP algorithm for time evolution.

Fields

  • integrator::A: integrator algorithm (defaults to Lanczos exponentiation)
  • tolgauge::Float64: tolerance for gauging algorithm
  • gaugemaxiter::Int: maximum amount of gauging iterations
  • trscheme: truncation algorithm for [tsvd]TensorKit.tsvd
  • finalize::F: user-supplied function which is applied after each timestep, with signature finalize(t, Ψ, H, envs) -> Ψ, envs
source
Missing docstring.

Missing docstring for TaylorCluster. Check Documenter's build log for details.

Missing docstring.

Missing docstring for WII. Check Documenter's build log for details.

Leading boundary algorithms

Missing docstring.

Missing docstring for VUMPS. Check Documenter's build log for details.

MPSKit.VOMPSType
VOMPS{F} <: Algorithm

Power method algorithm for infinite MPS. SciPost:4.1.004

Fields

  • tol::Float64: tolerance for convergence criterium

  • maxiter::Int: maximum amount of iterations

  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, toapprox, envs) -> ψ, envs

  • verbosity::Int: display progress information

  • alg_gauge=Defaults.alg_gauge(): algorithm for gauging

  • alg_environments=Defaults.alg_environments(): algorithm for updating environments

source
Missing docstring.

Missing docstring for GradientGrassmann. Check Documenter's build log for details.

Bond change algorithms

MPSKit.OptimalExpandType
struct OptimalExpand <: Algorithm end

An algorithm that expands the given mps using the algorithm given in the VUMPS paper, by selecting the dominant contributions of a two-site updated MPS tensor, orthogonal to the original ψ.

Fields

  • trscheme::TruncationScheme = truncdim(1) : The truncation scheme to use.
source
MPSKit.RandExpandType
struct RandExpand <: Algorithm end

An algorithm that expands the bond dimension by adding random unitary vectors that are orthogonal to the existing state. This is achieved by performing a truncated SVD on a random two-site MPS tensor, which is made orthogonal to the existing state.

Fields

  • trscheme::TruncationScheme = truncdim(1) : The truncation scheme to use.
source
MPSKit.VUMPSSvdCutType
struct VUMPSSvdCut <: Algorithm end

An algorithm that uses an IDMRG2 step to change the bond dimension of a state.

Fields

  • tol_gauge::Real = Defaults.tolgauge : The tolerance for the gauge.
  • tol::Real = Defaults.tol : The tolerance for the Galerkin truncation.
  • tol_eigenval::Real = Defaults.tol : The tolerance for the eigenvalue solver.
  • trscheme::TruncationScheme = notrunc() : The truncation scheme to use.
source
MPSKit.SvdCutType
struct SvdCut <: Algorithm end

An algorithm that uses truncated SVD to change the bond dimension of a ψ.

Fields

  • trscheme::TruncationScheme = notrunc() : The truncation scheme to use.
source

Excitations

MPSKit.QuasiparticleAnsatzType
QuasiparticleAnsatz <: Algorithm

Optimization algorithm for quasiparticle excitations on top of MPS groundstates, as introduced in this paper.

Fields

  • alg::A = Defaults.eigsolver: algorithm to use for the eigenvalue problem

Constructors

QuasiparticleAnsatz()
+            num=1, pos=length(ψ)÷2)

Compute the first excited states and their energy gap above a groundstate.

Arguments

  • H::AbstractMPO: operator for which to find the excitations
  • algorithm: optimization algorithm
  • ψ::QP: initial quasiparticle guess
  • ψs::NTuple{N, <:FiniteMPS}: N first excited states
  • [left_environments]: left groundstate environment
  • [right_environments]: right groundstate environment

Keywords

  • num::Int: number of excited states to compute
  • solver: algorithm for the linear solver of the quasiparticle environments
  • init: initial excited state guess
  • pos: position of perturbation
source
MPSKit.approximateFunction
approximate(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)
+approximate!(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)

Compute an approximation to the application of an operator O to the state ψ in the form of an MPS ψ₀.

Arguments

  • ψ₀::AbstractMPS: initial guess of the approximated state
  • (O::AbstractMPO, ψ::AbstractMPS): operator O and state ψ to be approximated
  • algorithm: approximation algorithm. See below for a list of available algorithms.
  • [environments]: MPS environment manager

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information

Algorithms

  • DMRG: Alternating least square method for maximizing the fidelity with a single-site scheme.

  • DMRG2: Alternating least square method for maximizing the fidelity with a two-site scheme.

  • IDMRG1: Variant of DMRG for maximizing fidelity density in the thermodynamic limit.

  • IDMRG2: Variant of DMRG2 for maximizing fidelity density in the thermodynamic limit.

  • VOMPS: Tangent space method for truncating uniform MPS.

source

Groundstate algorithms

MPSKit.VUMPSType
VUMPS{F} <: Algorithm

Variational optimization algorithm for uniform matrix product states, as introduced in https://arxiv.org/abs/1701.07035.

Fields

  • tol::Float64: tolerance for convergence criterium

  • maxiter::Int: maximum amount of iterations

  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs

  • verbosity::Int: display progress information

  • alg_gauge=Defaults.alg_gauge(): algorithm for gauging

  • alg_eigsolve=Defaults.alg_eigsolve(): algorithm for eigensolvers

  • alg_environments=Defaults.alg_environments(): algorithm for updating environments

source
MPSKit.IDMRG1Type
IDMRG1{A} <: Algorithm

Single site infinite DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • tol_gauge::Float64: tolerance for gauging algorithm
  • eigalg::A: eigensolver algorithm
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
source
MPSKit.IDMRG2Type
IDMRG2{A} <: Algorithm

2-site infinite DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • tol_gauge::Float64: tolerance for gauging algorithm
  • eigalg::A: eigensolver algorithm
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • trscheme::TruncationScheme: truncation algorithm for [tsvd]TensorKit.tsvd
source
MPSKit.DMRGType
DMRG{A,F} <: Algorithm

Single site DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • eigalg::A: eigensolver algorithm or a NamedTuple with the eigensolver settings
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs
source
MPSKit.DMRG2Type
DMRG2{A,F} <: Algorithm

2-site DMRG algorithm for finding groundstates.

Fields

  • tol::Float64: tolerance for convergence criterium
  • eigalg::A: eigensolver algorithm or a NamedTuple with the eigensolver settings
  • maxiter::Int: maximum number of outer iterations
  • verbosity::Int: display progress information
  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, H, envs) -> ψ, envs
  • trscheme: truncation algorithm for [tsvd]TensorKit.tsvd
source
MPSKit.GradientGrassmannType
GradientGrassmann <: Algorithm

Variational gradient-based optimization algorithm that keeps the MPS in left-canonical form, as points on a Grassmann manifold. The optimization is then a Riemannian gradient descent with a preconditioner to induce the metric from the Hilbert space inner product.

Fields

  • method::OptimKit.OptimizationAlgorithm: algorithm to perform the gradient search
  • finalize!::Function: user-supplied function which is applied after each iteration, with signature finalize!(x::GrassmannMPS.ManifoldPoint, f, g, numiter) -> x, f, g

Constructors

GradientGrassmann(; kwargs...)

Keywords

  • method=ConjugateGradient: instance of optimization algorithm, or type of optimization algorithm to construct
  • finalize!: finalizer algorithm
  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: level of information display
source

Time evolution algorithms

MPSKit.TDVPType
TDVP{A} <: Algorithm

Single site TDVP algorithm for time evolution.

Fields

  • integrator::A: integration algorithm (defaults to Lanczos exponentiation)
  • tolgauge::Float64: tolerance for gauging algorithm
  • gaugemaxiter::Int: maximum amount of gauging iterations
  • finalize::F: user-supplied function which is applied after each timestep, with signature finalize(t, Ψ, H, envs) -> Ψ, envs
source
MPSKit.TDVP2Type
TDVP2{A} <: Algorithm

2-site TDVP algorithm for time evolution.

Fields

  • integrator::A: integrator algorithm (defaults to Lanczos exponentiation)
  • tolgauge::Float64: tolerance for gauging algorithm
  • gaugemaxiter::Int: maximum amount of gauging iterations
  • trscheme: truncation algorithm for [tsvd]TensorKit.tsvd
  • finalize::F: user-supplied function which is applied after each timestep, with signature finalize(t, Ψ, H, envs) -> Ψ, envs
source
Missing docstring.

Missing docstring for TaylorCluster. Check Documenter's build log for details.

Missing docstring.

Missing docstring for WII. Check Documenter's build log for details.

Leading boundary algorithms

Missing docstring.

Missing docstring for VUMPS. Check Documenter's build log for details.

MPSKit.VOMPSType
VOMPS{F} <: Algorithm

Power method algorithm for infinite MPS. SciPost:4.1.004

Fields

  • tol::Float64: tolerance for convergence criterium

  • maxiter::Int: maximum amount of iterations

  • finalize::F: user-supplied function which is applied after each iteration, with signature finalize(iter, ψ, toapprox, envs) -> ψ, envs

  • verbosity::Int: display progress information

  • alg_gauge=Defaults.alg_gauge(): algorithm for gauging

  • alg_environments=Defaults.alg_environments(): algorithm for updating environments

source
Missing docstring.

Missing docstring for GradientGrassmann. Check Documenter's build log for details.

Bond change algorithms

MPSKit.OptimalExpandType
struct OptimalExpand <: Algorithm end

An algorithm that expands the given mps using the algorithm given in the VUMPS paper, by selecting the dominant contributions of a two-site updated MPS tensor, orthogonal to the original ψ.

Fields

  • trscheme::TruncationScheme = truncdim(1) : The truncation scheme to use.
source
MPSKit.RandExpandType
struct RandExpand <: Algorithm end

An algorithm that expands the bond dimension by adding random unitary vectors that are orthogonal to the existing state. This is achieved by performing a truncated SVD on a random two-site MPS tensor, which is made orthogonal to the existing state.

Fields

  • trscheme::TruncationScheme = truncdim(1) : The truncation scheme to use.
source
MPSKit.VUMPSSvdCutType
struct VUMPSSvdCut <: Algorithm end

An algorithm that uses an IDMRG2 step to change the bond dimension of a state.

Fields

  • tol_gauge::Real = Defaults.tolgauge : The tolerance for the gauge.
  • tol::Real = Defaults.tol : The tolerance for the Galerkin truncation.
  • tol_eigenval::Real = Defaults.tol : The tolerance for the eigenvalue solver.
  • trscheme::TruncationScheme = notrunc() : The truncation scheme to use.
source
MPSKit.SvdCutType
struct SvdCut <: Algorithm end

An algorithm that uses truncated SVD to change the bond dimension of a ψ.

Fields

  • trscheme::TruncationScheme = notrunc() : The truncation scheme to use.
source

Excitations

MPSKit.QuasiparticleAnsatzType
QuasiparticleAnsatz <: Algorithm

Optimization algorithm for quasiparticle excitations on top of MPS groundstates, as introduced in this paper.

Fields

  • alg::A = Defaults.eigsolver: algorithm to use for the eigenvalue problem

Constructors

QuasiparticleAnsatz()
 QuasiparticleAnsatz(; kwargs...)
-QuasiparticleAnsatz(alg)

Create a QuasiparticleAnsatz algorithm with the given algorithm, or by passing the keyword arguments to Arnoldi.

source
MPSKit.FiniteExcitedType
FiniteExcited{A} <: Algorithm

Variational optimization algorithm for excitations of finite Matrix Product States by minimizing the energy of $H - λᵢ |ψᵢ><ψᵢ|$.

Fields

  • gsalg::A: optimization algorithm.
  • weight::Float64: energy penalty for previous states.
source

Utility

MPSKit.left_virtualspaceFunction
left_virtualspace(ψ::AbstractMPS, i::Int)

Return the left virtual space of the bond tensor to the right of site i. This is equivalent to the left virtual space of the left-gauged site tensor at site i + 1.

source
MPSKit.right_virtualspaceFunction
right_virtualspace(ψ::AbstractMPS, i::Int)

Return the right virtual space of the bond tensor to the right of site i. This is equivalent to the right virtual space of the right-gauged site tensor at site i.

source
MPSKit.physicalspaceFunction
physicalspace(ψ::AbstractMPS, i::Int)

Return the physical space of the site tensor at site i.

source
MPSKit.add_util_legFunction
add_util_leg(tensor::AbstractTensorMap{S,N1,N2}) where {S,N1,N2}
-    -> AbstractTensorMap{S,N1+1,N2+1}

Add trivial one-dimensional utility spaces with trivial sector to the left and right of a given tensor map, i.e. as the first space of the codomain and the last space of the domain.

source
MPSKit.expectation_valueFunction
expectation_value(ψ, O, [environments])
+QuasiparticleAnsatz(alg)

Create a QuasiparticleAnsatz algorithm with the given algorithm, or by passing the keyword arguments to Arnoldi.

source
MPSKit.FiniteExcitedType
FiniteExcited{A} <: Algorithm

Variational optimization algorithm for excitations of finite Matrix Product States by minimizing the energy of $H - λᵢ |ψᵢ><ψᵢ|$.

Fields

  • gsalg::A: optimization algorithm.
  • weight::Float64: energy penalty for previous states.
source

Utility

MPSKit.left_virtualspaceFunction
left_virtualspace(ψ::AbstractMPS, i::Int)

Return the left virtual space of the bond tensor to the right of site i. This is equivalent to the left virtual space of the left-gauged site tensor at site i + 1.

source
MPSKit.right_virtualspaceFunction
right_virtualspace(ψ::AbstractMPS, i::Int)

Return the right virtual space of the bond tensor to the right of site i. This is equivalent to the right virtual space of the right-gauged site tensor at site i.

source
MPSKit.physicalspaceFunction
physicalspace(ψ::AbstractMPS, i::Int)

Return the physical space of the site tensor at site i.

source
MPSKit.add_util_legFunction
add_util_leg(tensor::AbstractTensorMap{S,N1,N2}) where {S,N1,N2}
+    -> AbstractTensorMap{S,N1+1,N2+1}

Add trivial one-dimensional utility spaces with trivial sector to the left and right of a given tensor map, i.e. as the first space of the codomain and the last space of the domain.

source
MPSKit.expectation_valueFunction
expectation_value(ψ, O, [environments])
 expectation_value(ψ, inds => O)

Compute the expectation value of an operator O on a state ψ. Optionally, it is possible to make the computations more efficient by also passing in previously calculated environments.

In general, the operator O may consist of an arbitrary MPO O <: AbstractMPO that acts on all sites, or a local operator O = inds => operator acting on a subset of sites. In the latter case, inds is a tuple of indices that specify the sites on which the operator acts, while the operator is either a AbstractTensorMap or a FiniteMPO.

Arguments

  • ψ::AbstractMPS : the state on which to compute the expectation value
  • O::Union{AbstractMPO,Pair} : the operator to compute the expectation value of. This can either be an AbstractMPO, or a pair of indices and local operator..
  • environments::Cache : the environments to use for the calculation. If not given, they will be calculated.

Examples

julia> ψ = FiniteMPS(ones, Float64, 4, ℂ^2, ℂ^3);
 
 julia> S_x = TensorMap(Float64[0 1; 1 0], ℂ^2, ℂ^2);
@@ -67,5 +67,5 @@
 1.0
 
 julia> round(expectation_value(ψ, MPOHamiltonian(S_x)))
-4.0
source
MPSKit.varianceFunction
variance(state, hamiltonian, [envs=environments(state, hamiltonian)])

Compute the variance of the energy of the state with respect to the hamiltonian.

source
MPSKit.entanglement_spectrumFunction
entanglement_spectrum(ψ, [site::Int=0]) -> SectorDict{sectortype(ψ),Vector{<:Real}}

Compute the entanglement spectrum at a given site, i.e. the singular values of the gauge matrix to the right of a given site. This is a dictionary mapping the charge to the singular values.

source
MPSKit.entropyFunction
entropy(state, [site::Int])

Calculate the Von Neumann entanglement entropy of a given MPS. If an integer site is given, the entropy is across the entanglement cut to the right of site site. Otherwise, a vector of entropies is returned, one for each site.

source
MPSKit.transfer_spectrumFunction
transfer_spectrum(above::InfiniteMPS; below=above, tol=Defaults.tol, num_vals=20,
-                       sector=first(sectors(oneunit(left_virtualspace(above, 1)))))

Calculate the partial spectrum of the left mixed transfer matrix corresponding to the overlap of a given above state and a below state. The sector keyword argument can be used to specify a non-trivial total charge for the transfer matrix eigenvectors. Specifically, an auxiliary space ℂ[typeof(sector)](sector => 1)' will be added to the domain of each eigenvector. The tol and num_vals keyword arguments are passed to KrylovKit.eigolve

source
MPSKit.correlation_lengthFunction
correlation_length(above::InfiniteMPS; kwargs...)

Compute the correlation length of a given InfiniteMPS based on the next-to-leading eigenvalue of the transfer matrix. The kwargs are passed to transfer_spectrum, and can for example be used to target the correlation length in a specific sector.

source
MPSKit.entanglementplotFunction
entanglementplot(state; site=0[, kwargs...])

Plot the entanglement spectrum of a given InfiniteMPS.

Arguments

  • site::Int=0: mps index for multisite unit cells. Spectrum is computed for the bond between site and site + 1.
  • expand_symmetry::Logical=false: add quantum dimension degeneracies.
  • sortby=maximum: the method of sorting the sectors.
  • sector_margin=1//10: the amount of whitespace between sectors.
  • sector_formatter=string: how to convert sectors to strings.
  • kwargs...: other kwargs are passed on to the plotting backend.
source
MPSKit.transferplotFunction
transferplot(above, below[, sectors[, transferkwargs[, kwargs]]])

Plot the partial transfer matrix spectrum of two InfiniteMPS's.

Arguments

  • above::InfiniteMPS: above mps for transfer_spectrum.
  • below::InfiniteMPS: below mps for transfer_spectrum.
  • sectors=[]: vector of sectors for which to compute the spectrum.
  • transferkwargs: kwargs for call to transfer_spectrum.
  • kwargs: other kwargs are passed on to the plotting backend.
  • thetaorigin=0: origin of the angle range.
  • sector_formatter=string: how to convert sectors to strings.
source
+4.0source
MPSKit.varianceFunction
variance(state, hamiltonian, [envs=environments(state, hamiltonian)])

Compute the variance of the energy of the state with respect to the hamiltonian.

source
MPSKit.entanglement_spectrumFunction
entanglement_spectrum(ψ, [site::Int=0]) -> SectorDict{sectortype(ψ),Vector{<:Real}}

Compute the entanglement spectrum at a given site, i.e. the singular values of the gauge matrix to the right of a given site. This is a dictionary mapping the charge to the singular values.

source
MPSKit.entropyFunction
entropy(state, [site::Int])

Calculate the Von Neumann entanglement entropy of a given MPS. If an integer site is given, the entropy is across the entanglement cut to the right of site site. Otherwise, a vector of entropies is returned, one for each site.

source
MPSKit.transfer_spectrumFunction
transfer_spectrum(above::InfiniteMPS; below=above, tol=Defaults.tol, num_vals=20,
+                       sector=first(sectors(oneunit(left_virtualspace(above, 1)))))

Calculate the partial spectrum of the left mixed transfer matrix corresponding to the overlap of a given above state and a below state. The sector keyword argument can be used to specify a non-trivial total charge for the transfer matrix eigenvectors. Specifically, an auxiliary space ℂ[typeof(sector)](sector => 1)' will be added to the domain of each eigenvector. The tol and num_vals keyword arguments are passed to KrylovKit.eigolve

source
MPSKit.correlation_lengthFunction
correlation_length(above::InfiniteMPS; kwargs...)

Compute the correlation length of a given InfiniteMPS based on the next-to-leading eigenvalue of the transfer matrix. The kwargs are passed to transfer_spectrum, and can for example be used to target the correlation length in a specific sector.

source
MPSKit.entanglementplotFunction
entanglementplot(state; site=0[, kwargs...])

Plot the entanglement spectrum of a given InfiniteMPS.

Arguments

  • site::Int=0: mps index for multisite unit cells. Spectrum is computed for the bond between site and site + 1.
  • expand_symmetry::Logical=false: add quantum dimension degeneracies.
  • sortby=maximum: the method of sorting the sectors.
  • sector_margin=1//10: the amount of whitespace between sectors.
  • sector_formatter=string: how to convert sectors to strings.
  • kwargs...: other kwargs are passed on to the plotting backend.
source
MPSKit.transferplotFunction
transferplot(above, below[, sectors[, transferkwargs[, kwargs]]])

Plot the partial transfer matrix spectrum of two InfiniteMPS's.

Arguments

  • above::InfiniteMPS: above mps for transfer_spectrum.
  • below::InfiniteMPS: below mps for transfer_spectrum.
  • sectors=[]: vector of sectors for which to compute the spectrum.
  • transferkwargs: kwargs for call to transfer_spectrum.
  • kwargs: other kwargs are passed on to the plotting backend.
  • thetaorigin=0: origin of the angle range.
  • sector_formatter=string: how to convert sectors to strings.
source
diff --git a/dev/man/algorithms/index.html b/dev/man/algorithms/index.html index 44e495f9..4940f47d 100644 --- a/dev/man/algorithms/index.html +++ b/dev/man/algorithms/index.html @@ -79,7 +79,7 @@ # output true

The algorithm is described in more detail in the following paper:

  • Chepiga, N., & Mila, F. (2017). Excitation spectrum and density matrix renormalization group iterations. Physical Review B, 96(5), 054425.

changebonds

Many of the previously mentioned algorithms do not possess a way to dynamically change to bond dimension. This is often a problem, as the optimal bond dimension is often not a priori known, or needs to increase because of entanglement growth throughout the course of a simulation. changebonds exposes a way to change the bond dimension of a given state.

There are several different algorithms implemented, each having their own advantages and disadvantages:

  • SvdCut: The simplest method for changing the bonddimension is found by simply locally truncating the state using an SVD decomposition. This yields a (locally) optimal truncation, but clearly cannot be used to increase the bond dimension. Note that a globally optimal truncation can be obtained by using the SvdCut algorithm in combination with approximate. Since the output of this method might have a truncated bonddimension, the new state might not be identical to the input state. The truncation is controlled through trscheme, which dictates how the singular values of the original state are truncated.
  • OptimalExpand: This algorithm is based on the idea of expanding the bond dimension by investigating the two-site derivative, and adding the most important blocks which are orthogonal to the current state. From the point of view of a local two-site update, this procedure is optimal, but it requires to evaluate a two-site derivative, which can be costly when the physical space is large. The state will remain unchanged, but a one-site scheme will now be able to push the optimization further. The subspace used for expansion can be truncated through trscheme, which dictates how many singular values will be added.

  • RandExpand: This algorithm similarly adds blocks orthogonal to the current state, but does not attempt to select the most important ones, and rather just selects them at random. The advantage here is that this is much cheaper than the optimal expand, and if the bond dimension is grown slow enough, this still obtains a very good expansion scheme. Again, The state will remain unchanged and a one-site scheme will now be able to push the optimization further. The subspace used for expansion can be truncated through trscheme, which dictates how many singular values will be added.

  • VUMPSSvdCut: This algorithm is based on the VUMPS algorithm, and consists of performing a two-site update, and then truncating the state back down. Because of the two-site update, this can again become expensive, but the algorithm has the option of both expanding as well as truncating the bond dimension. Here, trscheme controls the truncation of the full state after the two-site update.

leading boundary

For statmech partition functions we want to find the approximate leading boundary MPS. Again this can be done with VUMPS:

th = nonsym_ising_mpo()
+changebonds(ψ::AbstractMPS, alg) -> ψ′

Change the bond dimension of ψ using the algorithm alg, and return the new ψ and the new envs.

See also: SvdCut, RandExpand, VUMPSSvdCut, OptimalExpand

source

There are several different algorithms implemented, each having their own advantages and disadvantages:

  • SvdCut: The simplest method for changing the bonddimension is found by simply locally truncating the state using an SVD decomposition. This yields a (locally) optimal truncation, but clearly cannot be used to increase the bond dimension. Note that a globally optimal truncation can be obtained by using the SvdCut algorithm in combination with approximate. Since the output of this method might have a truncated bonddimension, the new state might not be identical to the input state. The truncation is controlled through trscheme, which dictates how the singular values of the original state are truncated.
  • OptimalExpand: This algorithm is based on the idea of expanding the bond dimension by investigating the two-site derivative, and adding the most important blocks which are orthogonal to the current state. From the point of view of a local two-site update, this procedure is optimal, but it requires to evaluate a two-site derivative, which can be costly when the physical space is large. The state will remain unchanged, but a one-site scheme will now be able to push the optimization further. The subspace used for expansion can be truncated through trscheme, which dictates how many singular values will be added.

  • RandExpand: This algorithm similarly adds blocks orthogonal to the current state, but does not attempt to select the most important ones, and rather just selects them at random. The advantage here is that this is much cheaper than the optimal expand, and if the bond dimension is grown slow enough, this still obtains a very good expansion scheme. Again, The state will remain unchanged and a one-site scheme will now be able to push the optimization further. The subspace used for expansion can be truncated through trscheme, which dictates how many singular values will be added.

  • VUMPSSvdCut: This algorithm is based on the VUMPS algorithm, and consists of performing a two-site update, and then truncating the state back down. Because of the two-site update, this can again become expensive, but the algorithm has the option of both expanding as well as truncating the bond dimension. Here, trscheme controls the truncation of the full state after the two-site update.

leading boundary

For statmech partition functions we want to find the approximate leading boundary MPS. Again this can be done with VUMPS:

th = nonsym_ising_mpo()
 ts = InfiniteMPS([ℂ^2],[ℂ^20]);
 (ts,envs,_) = leading_boundary(ts,th,VUMPS(maxiter=400,verbosity=false));

if the mpo satisfies certain properties (positive and hermitian), it may also be possible to use GradientGrassmann.

approximate

Often, it is useful to approximate a given MPS by another, typically by one of a different bond dimension. This is achieved by approximating an application of an MPO to the initial state, by a new state.

MPSKit.approximateFunction
approximate(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)
-approximate!(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)

Compute an approximation to the application of an operator O to the state ψ in the form of an MPS ψ₀.

Arguments

  • ψ₀::AbstractMPS: initial guess of the approximated state
  • (O::AbstractMPO, ψ::AbstractMPS): operator O and state ψ to be approximated
  • algorithm: approximation algorithm. See below for a list of available algorithms.
  • [environments]: MPS environment manager

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information

Algorithms

  • DMRG: Alternating least square method for maximizing the fidelity with a single-site scheme.

  • DMRG2: Alternating least square method for maximizing the fidelity with a two-site scheme.

  • IDMRG1: Variant of DMRG for maximizing fidelity density in the thermodynamic limit.

  • IDMRG2: Variant of DMRG2 for maximizing fidelity density in the thermodynamic limit.

  • VOMPS: Tangent space method for truncating uniform MPS.

source

Varia

What follows is a medley of lesser known (or used) algorithms and don't entirely fit under one of the above categories.

Dynamical DMRG

Dynamical DMRG has been described in other papers and is a way to find the propagator. The basic idea is that to calculate $G(z) = < V | (H-z)^{-1} | V >$ , one can variationally find $(H-z) |W > = | V >$ and then the propagator simply equals $G(z) = < V | W >$.

fidelity susceptibility

The fidelity susceptibility measures how much the groundstate changes when tuning a parameter in your hamiltonian. Divergences occur at phase transitions, making it a valuable measure when no order parameter is known.

fidelity_susceptibility(groundstate,H_0,perturbing_Hams::AbstractVector)

periodic boundary conditions

You can impose periodic boundary conditions on the hamiltonian itself, while still using a normal OBC finite matrix product states. This is straightforward to implement but competitive with more advanced PBC MPS algorithms.

exact diagonalization

As a side effect, our code support exact diagonalization. The idea is to construct a finite matrix product state with maximal bond dimension, and then optimize the middle site. Because we never truncated the bond dimension, this single site effectively parametrizes the entire hilbert space.

exact_diagonalization(periodic_boundary_conditions(su2_xxx_ham(spin=1),10),which=:SR) # find the groundstate on 10 sites
+approximate!(ψ₀, (O, ψ), algorithm, [environments]; kwargs...)

Compute an approximation to the application of an operator O to the state ψ in the form of an MPS ψ₀.

Arguments

  • ψ₀::AbstractMPS: initial guess of the approximated state
  • (O::AbstractMPO, ψ::AbstractMPS): operator O and state ψ to be approximated
  • algorithm: approximation algorithm. See below for a list of available algorithms.
  • [environments]: MPS environment manager

Keywords

  • tol::Float64: tolerance for convergence criterium
  • maxiter::Int: maximum amount of iterations
  • verbosity::Int: display progress information

Algorithms

  • DMRG: Alternating least square method for maximizing the fidelity with a single-site scheme.

  • DMRG2: Alternating least square method for maximizing the fidelity with a two-site scheme.

  • IDMRG1: Variant of DMRG for maximizing fidelity density in the thermodynamic limit.

  • IDMRG2: Variant of DMRG2 for maximizing fidelity density in the thermodynamic limit.

  • VOMPS: Tangent space method for truncating uniform MPS.

source

Varia

What follows is a medley of lesser known (or used) algorithms and don't entirely fit under one of the above categories.

Dynamical DMRG

Dynamical DMRG has been described in other papers and is a way to find the propagator. The basic idea is that to calculate $G(z) = < V | (H-z)^{-1} | V >$ , one can variationally find $(H-z) |W > = | V >$ and then the propagator simply equals $G(z) = < V | W >$.

fidelity susceptibility

The fidelity susceptibility measures how much the groundstate changes when tuning a parameter in your hamiltonian. Divergences occur at phase transitions, making it a valuable measure when no order parameter is known.

fidelity_susceptibility(groundstate,H_0,perturbing_Hams::AbstractVector)

periodic boundary conditions

You can impose periodic boundary conditions on the hamiltonian itself, while still using a normal OBC finite matrix product states. This is straightforward to implement but competitive with more advanced PBC MPS algorithms.

exact diagonalization

As a side effect, our code support exact diagonalization. The idea is to construct a finite matrix product state with maximal bond dimension, and then optimize the middle site. Because we never truncated the bond dimension, this single site effectively parametrizes the entire hilbert space.

exact_diagonalization(periodic_boundary_conditions(su2_xxx_ham(spin=1),10),which=:SR) # find the groundstate on 10 sites
diff --git a/dev/man/environments/index.html b/dev/man/environments/index.html index 0dd55016..1ca73543 100644 --- a/dev/man/environments/index.html +++ b/dev/man/environments/index.html @@ -5,4 +5,4 @@ cache = environments(state,operator)

There are also some notable differences. Infinite environments typically require solving linear problems or eigenvalue problems iteratively with finite precision. To find out what precision we used we can type:

(cache.tol,cache.maxiter)

To recalculate with a different precision :

cache.tol=1e-8;
 recalculate!(cache,state)

Unlike their finite counterparts, recalculating is not done automatically. To get the environment for a different state one has to recalculate explicitly!

different_state = InfiniteMPS([ℂ^2],[ℂ^10]);
 recalculate!(cache,different_state)
-leftenv(cache,3,different_state)
+leftenv(cache,3,different_state) diff --git a/dev/man/intro/index.html b/dev/man/intro/index.html index 50a7a5bc..deebd175 100644 --- a/dev/man/intro/index.html +++ b/dev/man/intro/index.html @@ -19,14 +19,14 @@ t3 = TensorMap(rand, Float64, V2 ⊗ V2, V2)
TensorMap((Rep[ℤ₂](0=>1, 1=>1) ⊗ Rep[ℤ₂](0=>1, 1=>1)) ← Rep[ℤ₂](0=>1, 1=>1)):
 * Data for sector (Irrep[ℤ₂](0), Irrep[ℤ₂](0)) ← (Irrep[ℤ₂](0),):
 [:, :, 1] =
- 0.4264171610743689
+ 0.281048298086088
 * Data for sector (Irrep[ℤ₂](1), Irrep[ℤ₂](1)) ← (Irrep[ℤ₂](0),):
 [:, :, 1] =
- 0.02215715979104138
+ 0.05055815563667376
 * Data for sector (Irrep[ℤ₂](1), Irrep[ℤ₂](0)) ← (Irrep[ℤ₂](1),):
 [:, :, 1] =
- 0.8281871181073207
+ 0.6477289139909235
 * Data for sector (Irrep[ℤ₂](0), Irrep[ℤ₂](1)) ← (Irrep[ℤ₂](1),):
 [:, :, 1] =
- 0.7754705605380027
-

For more information, check out the TensorKit documentation!

Conventions

The general definition of an MPS tensor is as follows:

convention MPSTensor

These tensors are allowed to have an arbitrary number of physical legs, and both FiniteMPS as well as InfiniteMPS will be able to handle the resulting objects. This allows for example for the definition of boundary tensors in PEPS code, which have two physical legs.

Similarly, the definition of a bond tensor, appearing in between two MPS tensors, is as follows:

convention BondTensor

Finally, the definition of a MPO tensor, which is used to represent statistical mechanics problems as well as quantum hamiltonians, is represented as:

convention MPOTensor

While this results at first glance in the not very intuitive ordering of spaces as $V_l \otimes P \leftarrow P \otimes V_r$, this is actually the most natural ordering for keeping the algorithms planar. In particular, this is relevant for dealing with fermionic systems, where additional crossings would lead to sign problems.

+ 0.1420473510223066 +

For more information, check out the TensorKit documentation!

Conventions

The general definition of an MPS tensor is as follows:

convention MPSTensor

These tensors are allowed to have an arbitrary number of physical legs, and both FiniteMPS as well as InfiniteMPS will be able to handle the resulting objects. This allows for example for the definition of boundary tensors in PEPS code, which have two physical legs.

Similarly, the definition of a bond tensor, appearing in between two MPS tensors, is as follows:

convention BondTensor

Finally, the definition of a MPO tensor, which is used to represent statistical mechanics problems as well as quantum hamiltonians, is represented as:

convention MPOTensor

While this results at first glance in the not very intuitive ordering of spaces as $V_l \otimes P \leftarrow P \otimes V_r$, this is actually the most natural ordering for keeping the algorithms planar. In particular, this is relevant for dealing with fermionic systems, where additional crossings would lead to sign problems.

diff --git a/dev/man/lattices/index.html b/dev/man/lattices/index.html index 9a1e2b92..b47acf76 100644 --- a/dev/man/lattices/index.html +++ b/dev/man/lattices/index.html @@ -1,2 +1,2 @@ -Lattices · MPSKit.jl

Lattices

Warning

This section is still under construction. Coming soon!

+Lattices · MPSKit.jl

Lattices

Warning

This section is still under construction. Coming soon!

diff --git a/dev/man/operators/index.html b/dev/man/operators/index.html index af6bc230..69e14fa5 100644 --- a/dev/man/operators/index.html +++ b/dev/man/operators/index.html @@ -1352,4 +1352,4 @@ [:, :, 2, 1] = 0.0 + 0.0im 1.0 + 0.0im -]])

MPSKit will then automatically attach the correct boundary vectors to the Hamiltonian whenever this is required.

Note

While the above example can be constructed from building blocks that are strictly local operators, i.e. TensorMaps with a single ingoing and outgoing index. This is not always the case, especially when symmetries are involved. In those cases, the elements of the matrix $W$ have additional virtual legs that are contracted between different sites. As such, indexing an MPOHamiltonian object will result in a TensorMap with four legs.

Working with MPOHamiltonian objects

Warning

This part is still a work in progress

Because of the discussion above, the MPOHamiltonian object is in fact just a FiniteMPO, with some additional structure. This means that similar operations and properties are available, such as the virtual spaces, or the individual tensors. However, the block structure of the operator means that now the virtual spaces are not just a single space, but a collection (direct sum) of spaces, one for each row/column.

<!– TODO: add examples virtualspace once blocktensors are in place –>

DenseMPO

This operator is used for statistical physics problems. It is simply a periodic array of mpo tensors.

Can be created using

DenseMPO(t::AbstractArray{T,1}) where T<:MPOTensor

SparseMPO

SparseMPO is similar to a DenseMPO, in that it again represents an mpo tensor, periodically repeated. However this type keeps track of all internal zero blocks, allowing for a more efficient representation of certain operators (such as time evolution operators and quantum hamiltonians). You can convert a sparse mpo to a densempo, but the converse does not hold.

Indexing a SparseMPO returns a SparseMPOSlice object, which has 3 fields

MPSKit.SparseMPOSliceType
SparseMPOSlice{S,T,E} <: AbstractArray{T,2}

A view of a sparse MPO at a single position.

Fields

  • Os::AbstractMatrix{Union{T,E}}: matrix of operators.
  • domspaces::AbstractVector{S}: list of left virtual spaces.
  • imspaces::AbstractVector{S}: list of right virtual spaces.
  • pspace::S: physical space.
source

When indexing a SparseMPOSlice at index [j, k] (or equivalently SparseMPO[i][j, k]), the code looks up the corresponding field in Os[j, k]. Either that element is a tensormap, in which case it gets returned. If it equals zero(E), then we return a tensormap

domspaces[j] * pspace ← pspace * imspaces[k]

with norm zero. If the element is a nonzero number, then implicitly we have the identity operator there (multiplied by that element).

The idea here is that you don't have to worry about the underlying structure, you can just index into a sparsempo as if it is a vector of matrices. Behind the scenes we then optimize certain contractions by using the sparsity structure.

SparseMPO are always assumed to be periodic in the first index (position). In this way, we can both represent periodic infinite mpos and place dependent finite mpos.

+]])

MPSKit will then automatically attach the correct boundary vectors to the Hamiltonian whenever this is required.

Note

While the above example can be constructed from building blocks that are strictly local operators, i.e. TensorMaps with a single ingoing and outgoing index. This is not always the case, especially when symmetries are involved. In those cases, the elements of the matrix $W$ have additional virtual legs that are contracted between different sites. As such, indexing an MPOHamiltonian object will result in a TensorMap with four legs.

Working with MPOHamiltonian objects

Warning

This part is still a work in progress

Because of the discussion above, the MPOHamiltonian object is in fact just a FiniteMPO, with some additional structure. This means that similar operations and properties are available, such as the virtual spaces, or the individual tensors. However, the block structure of the operator means that now the virtual spaces are not just a single space, but a collection (direct sum) of spaces, one for each row/column.

<!– TODO: add examples virtualspace once blocktensors are in place –>

DenseMPO

This operator is used for statistical physics problems. It is simply a periodic array of mpo tensors.

Can be created using

DenseMPO(t::AbstractArray{T,1}) where T<:MPOTensor

SparseMPO

SparseMPO is similar to a DenseMPO, in that it again represents an mpo tensor, periodically repeated. However this type keeps track of all internal zero blocks, allowing for a more efficient representation of certain operators (such as time evolution operators and quantum hamiltonians). You can convert a sparse mpo to a densempo, but the converse does not hold.

Indexing a SparseMPO returns a SparseMPOSlice object, which has 3 fields

MPSKit.SparseMPOSliceType
SparseMPOSlice{S,T,E} <: AbstractArray{T,2}

A view of a sparse MPO at a single position.

Fields

  • Os::AbstractMatrix{Union{T,E}}: matrix of operators.
  • domspaces::AbstractVector{S}: list of left virtual spaces.
  • imspaces::AbstractVector{S}: list of right virtual spaces.
  • pspace::S: physical space.
source

When indexing a SparseMPOSlice at index [j, k] (or equivalently SparseMPO[i][j, k]), the code looks up the corresponding field in Os[j, k]. Either that element is a tensormap, in which case it gets returned. If it equals zero(E), then we return a tensormap

domspaces[j] * pspace ← pspace * imspaces[k]

with norm zero. If the element is a nonzero number, then implicitly we have the identity operator there (multiplied by that element).

The idea here is that you don't have to worry about the underlying structure, you can just index into a sparsempo as if it is a vector of matrices. Behind the scenes we then optimize certain contractions by using the sparsity structure.

SparseMPO are always assumed to be periodic in the first index (position). In this way, we can both represent periodic infinite mpos and place dependent finite mpos.

diff --git a/dev/man/parallelism/index.html b/dev/man/parallelism/index.html index c4e6191e..70e9a2cc 100644 --- a/dev/man/parallelism/index.html +++ b/dev/man/parallelism/index.html @@ -37,4 +37,4 @@ ┌ Warning: blasthreads_per_jlthread > cputhreads_per_jlthread. You should decrease the number of MKL threads, i.e. BLAS.set_num_threads(4). └ @ ThreadPinning ~/.julia/packages/ThreadPinning/qV2Cd/src/threadinfo.jl:256 -[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16?

MPSKit multithreading

Within MPSKit, when Julia is started with multiple threads, by default the Threads.@spawn machinery will be used to parallelize the code as much as possible. In particular, there are three main places where this is happening, which can be disabled separately through a preference-based system.

  1. During the process of some algorithms (e.g. VUMPS), local updates can take place at each site in parallel. This can be controlled by the parallelize_sites preference.

  2. During the calculation of the environments, when the MPO is block-sparse, it is possible to parallelize over these blocks. This can be enabled or disabled by the parallelize_transfers preference. (Note that left- and right environments will always be computed in parallel)

  3. During the calculation of the derivatives, when the MPO is block-sparse, it is possible to parallelize over these blocks. This can be enabled or disabled by the parallelize_derivatives preference.

For convenience, these preferences can be set via MPSKit.Defaults.set_parallelization, which takes as input pairs of preferences and booleans. For example, to disable all parallelization, one can call

Defaults.set_parallelization("sites" => false, "transfers" => false, "derivatives" => false)
Warning

These settings are statically set at compile-time, and for changes to take effect the Julia session must be restarted.

TensorKit multithreading

Finally, when dealing with tensors that have some internal symmetry, it is also possible to parallelize over the symmetry sectors. This is handled by TensorKit, and more information can be found in its documentation (Soon TM).

Memory management

Because of the way julia threads work, it is possible that the total memory usage of your program becomes rather high. This seems to be because of the fact that MPSKit spawns several tasks (in a nested way), which each allocate and deallocate quite a bit of memory in a tight loop. This seems to lead to a situation where the garbage collector is not able to keep up, and can even fail to clear the garbage before an OutOfMemory error occurs. In this case, often the best thing to do is disable the multithreading of MPSKit, specifically for the derivatives, as this seems to be the most memory intensive part. This is something that is under investigation, and hopefully will be fixed in the future.

+[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16?

MPSKit multithreading

Within MPSKit, when Julia is started with multiple threads, by default the Threads.@spawn machinery will be used to parallelize the code as much as possible. In particular, there are three main places where this is happening, which can be disabled separately through a preference-based system.

  1. During the process of some algorithms (e.g. VUMPS), local updates can take place at each site in parallel. This can be controlled by the parallelize_sites preference.

  2. During the calculation of the environments, when the MPO is block-sparse, it is possible to parallelize over these blocks. This can be enabled or disabled by the parallelize_transfers preference. (Note that left- and right environments will always be computed in parallel)

  3. During the calculation of the derivatives, when the MPO is block-sparse, it is possible to parallelize over these blocks. This can be enabled or disabled by the parallelize_derivatives preference.

For convenience, these preferences can be set via MPSKit.Defaults.set_parallelization, which takes as input pairs of preferences and booleans. For example, to disable all parallelization, one can call

Defaults.set_parallelization("sites" => false, "transfers" => false, "derivatives" => false)
Warning

These settings are statically set at compile-time, and for changes to take effect the Julia session must be restarted.

TensorKit multithreading

Finally, when dealing with tensors that have some internal symmetry, it is also possible to parallelize over the symmetry sectors. This is handled by TensorKit, and more information can be found in its documentation (Soon TM).

Memory management

Because of the way julia threads work, it is possible that the total memory usage of your program becomes rather high. This seems to be because of the fact that MPSKit spawns several tasks (in a nested way), which each allocate and deallocate quite a bit of memory in a tight loop. This seems to lead to a situation where the garbage collector is not able to keep up, and can even fail to clear the garbage before an OutOfMemory error occurs. In this case, often the best thing to do is disable the multithreading of MPSKit, specifically for the derivatives, as this seems to be the most memory intensive part. This is something that is under investigation, and hopefully will be fixed in the future.

diff --git a/dev/man/states/index.html b/dev/man/states/index.html index c50d889e..542d6aca 100644 --- a/dev/man/states/index.html +++ b/dev/man/states/index.html @@ -25,4 +25,4 @@ state.AR[row,collumn] state.CR[row,collumn]

Behind the scenes, we have a type called Multiline, defined as:

struct Multiline{T}
     data::PeriodicArray{T,1}
-end

MPSMultiline/MPOMultiline are then defined as ```julia const MPSMultiline = Multiline{<:InfiniteMPS} const MPOMultiline = Multiline{<:DenseMPO}

+end

MPSMultiline/MPOMultiline are then defined as ```julia const MPSMultiline = Multiline{<:InfiniteMPS} const MPOMultiline = Multiline{<:DenseMPO}