From 677768a9faa1cc6c59832a6c360fdafd85f20354 Mon Sep 17 00:00:00 2001 From: leburgel Date: Tue, 21 Jun 2022 18:19:10 +0200 Subject: [PATCH] update --- .gitignore | 3 +- README.md | 18 +- matlab/chapter1.m | 88 ++-- matlab/chapter1Solution.m | 102 ++-- matlab/chapter2Solution.m | 180 +++---- python/chapter1.ipynb | 409 ++++++++------- python/chapter1Solution.ipynb | 438 +++++++++------- python/chapter2.ipynb | 668 ++++++++++++++----------- python/chapter2Solution.ipynb | 738 +++++++++++++++------------ python/chapter3.ipynb | 535 ++++++++++++-------- python/chapter3Solution.ipynb | 582 +++++++++++++-------- python/img/2minham.png | Bin 9076 -> 0 bytes python/img/2minham.svg | 119 +++++ python/img/AcPrime2.svg | 149 ++++++ python/img/Acprime.png | Bin 77775 -> 0 bytes python/img/Acprime.svg | 361 +++++++++++++ python/img/AlVl.png | Bin 8732 -> 0 bytes python/img/CPrime2.svg | 87 ++++ python/img/Cprime.png | Bin 72668 -> 0 bytes python/img/Cprime.svg | 328 ++++++++++++ python/img/FL.png | Bin 12132 -> 0 bytes python/img/FR.png | Bin 12765 -> 0 bytes python/img/FlFr.png | Bin 10629 -> 0 bytes python/img/H_Ac.png | Bin 22260 -> 0 bytes python/img/H_Ac.svg | 285 +++++++++++ python/img/H_C.png | Bin 19434 -> 0 bytes python/img/H_C.svg | 203 ++++++++ python/img/Heff.png | Bin 197712 -> 0 bytes python/img/HeffExcitation.svg | 862 ++++++++++++++++++++++++++++++++ python/img/L1.png | Bin 62039 -> 0 bytes python/img/L1.svg | 507 +++++++++++++++++++ python/img/LB.png | Bin 17057 -> 0 bytes python/img/LB.svg | 165 ++++++ python/img/Lh.png | Bin 10279 -> 0 bytes python/img/Lh.svg | 149 ++++++ python/img/Lh2.png | Bin 19137 -> 0 bytes python/img/LhMixed.svg | 162 ++++++ python/img/Lhmixed.png | Bin 9630 -> 0 bytes python/img/MPSnormalised.png | Bin 7090 -> 0 bytes python/img/MPSstate.png | Bin 2277 -> 0 bytes python/img/Mexp.svg | 183 +++++++ python/img/O.svg | 96 ++++ python/img/OAc.png | Bin 17252 -> 0 bytes python/img/OC.png | Bin 15177 -> 0 bytes python/img/O_Ac.svg | 165 ++++++ python/img/O_C.svg | 106 ++++ python/img/R1.png | Bin 62937 -> 0 bytes python/img/R1.svg | 499 ++++++++++++++++++ python/img/RB.png | Bin 17644 -> 0 bytes python/img/RB.svg | 165 ++++++ python/img/Rh.png | Bin 10431 -> 0 bytes python/img/Rh.svg | 149 ++++++ python/img/Rh2.png | Bin 20228 -> 0 bytes python/img/RhMixed.svg | 171 +++++++ python/img/Rhmixed.png | Bin 10107 -> 0 bytes python/img/SchmidtDecomp.png | Bin 3002 -> 0 bytes python/img/Vl.svg | 124 +++++ python/img/VlX.png | Bin 6045 -> 0 bytes python/img/VlX.svg | 67 +++ python/img/Z.svg | 354 +++++++++++++ python/img/Z2.svg | 114 +++++ python/img/centerTerms.png | Bin 15150 -> 0 bytes python/img/centerTerms.svg | 134 +++++ python/img/channels.svg | 142 ++++++ python/img/delta.svg | 172 +++++++ python/img/diagC.svg | 140 ++++++ python/img/energyOptimum.png | Bin 10957 -> 0 bytes python/img/envNorm.svg | 88 ++++ python/img/environments.svg | 203 ++++++++ python/img/equations.png | Bin 23541 -> 0 bytes python/img/excitation.svg | 464 +++++++++++++++++ python/img/excitationOrth.svg | 179 +++++++ python/img/expVal.svg | 230 +++++++++ python/img/expVal2.svg | 73 +++ python/img/expVal3.svg | 69 +++ python/img/expValHam.svg | 300 +++++++++++ python/img/expValue.png | Bin 5164 -> 0 bytes python/img/expValue2.png | Bin 2220 -> 0 bytes python/img/expValue3.png | Bin 1793 -> 0 bytes python/img/fixedPoint.svg | 190 +++++++ python/img/fixedPoints.png | Bin 4026 -> 0 bytes python/img/fixedPoints.svg | 133 +++++ python/img/gaugeExcitation.svg | 126 +++++ python/img/gaugeFix.png | Bin 14110 -> 0 bytes python/img/gaugeFix.svg | 103 ++++ python/img/gaugeTransform.png | Bin 1672 -> 0 bytes python/img/gaugeTransform.svg | 89 ++++ python/img/gaugeTransform2.png | Bin 13782 -> 0 bytes python/img/grad.svg | 170 +++++++ python/img/grad2.png | Bin 8336 -> 0 bytes python/img/gradFull.svg | 220 ++++++++ python/img/gradTerm.svg | 142 ++++++ python/img/gradTerms.png | Bin 9260 -> 0 bytes python/img/gradient.png | Bin 18373 -> 0 bytes python/img/gradientCalc.png | Bin 22787 -> 0 bytes python/img/hamExpVal.png | Bin 7565 -> 0 bytes python/img/lambda.svg | 211 ++++++++ python/img/leftGauge.svg | 78 +++ python/img/leftOrth.svg | 72 +++ python/img/leftOrth2.svg | 210 ++++++++ python/img/leftOrthonormal.png | Bin 1647 -> 0 bytes python/img/leftOrthonormal2.png | Bin 4842 -> 0 bytes python/img/leftTerm.png | Bin 6643 -> 0 bytes python/img/leftTerms.svg | 62 +++ python/img/mixedGauge.png | Bin 5023 -> 0 bytes python/img/mixedGauge.svg | 226 +++++++++ python/img/mixedGauge2.png | Bin 2033 -> 0 bytes python/img/mixedGauge2.svg | 91 ++++ python/img/mixedGauge3.png | Bin 3567 -> 0 bytes python/img/mpsNorm.svg | 323 ++++++++++++ python/img/orthonormal.png | Bin 10038 -> 0 bytes python/img/partFunc.png | Bin 23696 -> 0 bytes python/img/q.svg | 118 +++++ python/img/qrConv.svg | 91 ++++ python/img/qrStep.svg | 120 +++++ python/img/quasi_inveff.svg | 164 ++++++ python/img/quasiparticle.png | Bin 31927 -> 0 bytes python/img/regTransfer.png | Bin 8371 -> 0 bytes python/img/regTransfer.svg | 106 ++++ python/img/rightGauge.svg | 98 ++++ python/img/rightOrth.svg | 72 +++ python/img/rightOrthonormal.png | Bin 1388 -> 0 bytes python/img/rightTerm.png | Bin 6642 -> 0 bytes python/img/rightTerms.svg | 62 +++ python/img/t.svg | 145 ++++++ python/img/tm.svg | 131 +++++ python/img/traceNorm.png | Bin 1464 -> 0 bytes python/img/traceNorm.svg | 54 ++ python/img/transferMPO.png | Bin 10358 -> 0 bytes python/img/transferMatrix.png | Bin 2365 -> 0 bytes python/img/transferMpo.svg | 136 +++++ python/img/transferPower.svg | 87 ++++ python/img/truncMPS.png | Bin 5742 -> 0 bytes python/img/truncMPS.svg | 318 ++++++++++++ python/img/umps.svg | 119 +++++ python/img/unitaryGauge.svg | 72 +++ python/tutorialFunctions.py | 219 ++++---- 137 files changed, 14365 insertions(+), 1718 deletions(-) delete mode 100644 python/img/2minham.png create mode 100644 python/img/2minham.svg create mode 100644 python/img/AcPrime2.svg delete mode 100644 python/img/Acprime.png create mode 100644 python/img/Acprime.svg delete mode 100644 python/img/AlVl.png create mode 100644 python/img/CPrime2.svg delete mode 100644 python/img/Cprime.png create mode 100644 python/img/Cprime.svg delete mode 100644 python/img/FL.png delete mode 100644 python/img/FR.png delete mode 100644 python/img/FlFr.png delete mode 100644 python/img/H_Ac.png create mode 100644 python/img/H_Ac.svg delete mode 100644 python/img/H_C.png create mode 100644 python/img/H_C.svg delete mode 100644 python/img/Heff.png create mode 100644 python/img/HeffExcitation.svg delete mode 100644 python/img/L1.png create mode 100644 python/img/L1.svg delete mode 100644 python/img/LB.png create mode 100644 python/img/LB.svg delete mode 100644 python/img/Lh.png create mode 100644 python/img/Lh.svg delete mode 100644 python/img/Lh2.png create mode 100644 python/img/LhMixed.svg delete mode 100644 python/img/Lhmixed.png delete mode 100644 python/img/MPSnormalised.png delete mode 100644 python/img/MPSstate.png create mode 100644 python/img/Mexp.svg create mode 100644 python/img/O.svg delete mode 100644 python/img/OAc.png delete mode 100644 python/img/OC.png create mode 100644 python/img/O_Ac.svg create mode 100644 python/img/O_C.svg delete mode 100644 python/img/R1.png create mode 100644 python/img/R1.svg delete mode 100644 python/img/RB.png create mode 100644 python/img/RB.svg delete mode 100644 python/img/Rh.png create mode 100644 python/img/Rh.svg delete mode 100644 python/img/Rh2.png create mode 100644 python/img/RhMixed.svg delete mode 100644 python/img/Rhmixed.png delete mode 100644 python/img/SchmidtDecomp.png create mode 100644 python/img/Vl.svg delete mode 100644 python/img/VlX.png create mode 100644 python/img/VlX.svg create mode 100644 python/img/Z.svg create mode 100644 python/img/Z2.svg delete mode 100644 python/img/centerTerms.png create mode 100644 python/img/centerTerms.svg create mode 100644 python/img/channels.svg create mode 100644 python/img/delta.svg create mode 100644 python/img/diagC.svg delete mode 100644 python/img/energyOptimum.png create mode 100644 python/img/envNorm.svg create mode 100644 python/img/environments.svg delete mode 100644 python/img/equations.png create mode 100644 python/img/excitation.svg create mode 100644 python/img/excitationOrth.svg create mode 100644 python/img/expVal.svg create mode 100644 python/img/expVal2.svg create mode 100644 python/img/expVal3.svg create mode 100644 python/img/expValHam.svg delete mode 100644 python/img/expValue.png delete mode 100644 python/img/expValue2.png delete mode 100644 python/img/expValue3.png create mode 100644 python/img/fixedPoint.svg delete mode 100644 python/img/fixedPoints.png create mode 100644 python/img/fixedPoints.svg create mode 100644 python/img/gaugeExcitation.svg delete mode 100644 python/img/gaugeFix.png create mode 100644 python/img/gaugeFix.svg delete mode 100644 python/img/gaugeTransform.png create mode 100644 python/img/gaugeTransform.svg delete mode 100644 python/img/gaugeTransform2.png create mode 100644 python/img/grad.svg delete mode 100644 python/img/grad2.png create mode 100644 python/img/gradFull.svg create mode 100644 python/img/gradTerm.svg delete mode 100644 python/img/gradTerms.png delete mode 100644 python/img/gradient.png delete mode 100644 python/img/gradientCalc.png delete mode 100644 python/img/hamExpVal.png create mode 100644 python/img/lambda.svg create mode 100644 python/img/leftGauge.svg create mode 100644 python/img/leftOrth.svg create mode 100644 python/img/leftOrth2.svg delete mode 100644 python/img/leftOrthonormal.png delete mode 100644 python/img/leftOrthonormal2.png delete mode 100644 python/img/leftTerm.png create mode 100644 python/img/leftTerms.svg delete mode 100644 python/img/mixedGauge.png create mode 100644 python/img/mixedGauge.svg delete mode 100644 python/img/mixedGauge2.png create mode 100644 python/img/mixedGauge2.svg delete mode 100644 python/img/mixedGauge3.png create mode 100644 python/img/mpsNorm.svg delete mode 100644 python/img/orthonormal.png delete mode 100644 python/img/partFunc.png create mode 100644 python/img/q.svg create mode 100644 python/img/qrConv.svg create mode 100644 python/img/qrStep.svg create mode 100644 python/img/quasi_inveff.svg delete mode 100644 python/img/quasiparticle.png delete mode 100644 python/img/regTransfer.png create mode 100644 python/img/regTransfer.svg create mode 100644 python/img/rightGauge.svg create mode 100644 python/img/rightOrth.svg delete mode 100644 python/img/rightOrthonormal.png delete mode 100644 python/img/rightTerm.png create mode 100644 python/img/rightTerms.svg create mode 100644 python/img/t.svg create mode 100644 python/img/tm.svg delete mode 100644 python/img/traceNorm.png create mode 100644 python/img/traceNorm.svg delete mode 100644 python/img/transferMPO.png delete mode 100644 python/img/transferMatrix.png create mode 100644 python/img/transferMpo.svg create mode 100644 python/img/transferPower.svg delete mode 100644 python/img/truncMPS.png create mode 100644 python/img/truncMPS.svg create mode 100644 python/img/umps.svg create mode 100644 python/img/unitaryGauge.svg diff --git a/.gitignore b/.gitignore index ab455f5..03dadbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -.ipynb_checkpoints/* -*-checkpoint.ipynb +.ipynb_checkpoints *~ *.pyc diff --git a/README.md b/README.md index c260cbc..a843074 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -# BadHonnefTutorial +# uniformMpsTutorial -This repository contains the files for the tutorial sessions on tangent space methods for uniform matrix product stats, given at the 2020 school on Tensor Network based approaches to Quantum Many-Body Systems, held in Bad Honnef. +This repository contains a tutorial on tangent space methods for uniform matrix product states, originally written to be taught at the [2020 school on Tensor Network based approaches to Quantum Many-Body Systems](http://quantumtensor.pks.mpg.de/index.php/schools/2020-school/) held in Bad Honnef, Germany. The tutorials are based on the lecture notes ['Tangent-space methods for uniform matrix product states'](https://doi.org/10.21468/SciPostPhysLectNotes.7) by Laurens Vanderstraeten, Jutho Haegeman and Frank Verstraete. ## Setup and installation -The tutorial is given in the form of Python notebooks, which provide a detailed guide through the relevant concepts and algorithms, interspersed with checks and demonstrations. Reference implementations are also given in MATLAB. +The tutorial is given in the form of IPython Notebooks, which provide a detailed guide through the relevant concepts and algorithms, interspersed with checks and demonstrations. Reference implementations are also given in MATLAB. The easiest way to get all of the tools needed to open and run the notebooks is to install Python via the anaconda distribution: https://docs.anaconda.com/anaconda/install/. This automatically comes with all packages needed for this tutorial. -If you already have a python version installed, you may install the jupyter notebook package seperately through pip by running +If you already have a python version installed, you may [install Jupyter](https://jupyter.org/install) seperately via the [Python Package Index](https://pypi.org/) by running ```console pip install notebook ``` @@ -18,7 +18,7 @@ Once jupyter notebook is installed, clone this repository to a local folder of y jupyter notebook ``` -For performing contractions of tensor networks, we have opted to use the Python implementation of the ncon contractor (https://arxiv.org/abs/1402.0939), which can be found at https://github.com/mhauru/ncon. There are undoubtedly many contraction tools that work equally well and any of them may of course be used, but this one has a particularly intuituve and handy syntax. To install ncon, you may run +For performing contractions of tensor networks, we have opted to use the Python implementation of the [ncon contractor](https://arxiv.org/abs/1402.0939), which can be found at https://github.com/mhauru/ncon. There are undoubtedly many contraction tools that work equally well and any of them may of course be used, but this one has a particularly intuituve and handy syntax. To install ncon, you may run ```console pip install ncon ``` @@ -33,13 +33,11 @@ The tutorial consists of three parts: This part is concerned with the basics of MPS in the thermodynamic limit: normalization, fixed points, algorithms for gauging an MPS, and computing expectation values. #### 2. Finding ground states of local Hamiltonians -This part describes how to perform a variational search in the space of MPS to find the ground state of a local Hamiltonian. We start by considering a simple gradient based approach, and then introduce the vumps algorithm. We also briefly touch upon how excited states may be constructed using the result of the vumps ground state search. +This part describes how to perform a variational search in the space of MPS to find the ground state of a local Hamiltonian. We start by considering a simple gradient based approach, and then introduce the [VUMPS algorithm](https://journals.aps.org/prb/abstract/10.1103/PhysRevB.97.045145). We also briefly touch upon how excited states may be constructed using the result of the VUMPS ground state search. The algorithms are demonstrated for the case of the one-dimensional quantum spin-1 Heisenberg model. #### 3. Transfer matrices and fixed points -In this part the vumps algorithm is extended to matrix product operators (MPOs), and it is then used to compute the partition function and magnetization for the 2d classical Ising model. +In this part the VUMPS algorithm is extended to transfer matrices in the form of matrix product operators (MPOs), which can then be used to contract infinite two-dimensional tensor networks. The algorithm is demonstrated for the case of the classical two-dimensional Ising model, and is for example used to compute its partition function and evaluate the expectation value of the magnetization. ## Use of this tutorial -Each chapter provides a jupyter notebook (.ipynb) file with guided exercices on implementing the algorithms, as well as a solution notebook. Similar files are available for MATLAB. - -The approach itself is very basic, where all algorithms are broken down and illustrated in digestible steps. The implementations are very simple: there are no black boxes or fancy tricks involved, everything is built from the ground up. As a result, implementing all these steps from the start would most likely take longer than two tutorial sessions. The contents of the tutorial should therefore not just be seen as a task to complete, but just as much as a reference on how one would go about implementing these concepts. Please feel free to use this in any way you see fit. +Each chapter provides a notebook (.ipynb) file with guided exercices on implementing the algorithms, as well as a solution notebook. Similar files are available for MATLAB. The approach itself is very basic, where all algorithms are broken down and illustrated in digestible steps. The implementations are very simple: there are no black boxes or fancy tricks involved, everything is built from the ground up. While these tutorials were originally intended to be taught at a school on tensor networks, they now serve as a general reference on uniform MPS and how one would go about implementing these concepts. diff --git a/matlab/chapter1.m b/matlab/chapter1.m index ad35959..06d6c2e 100644 --- a/matlab/chapter1.m +++ b/matlab/chapter1.m @@ -32,8 +32,8 @@ assert(~isreal(A), 'MPS tensor should have complex values') -% normalising an MPS through naive diagonalization of the transfer matrix: -A = normaliseMPSNaive(A); +% normalizing an MPS through naive diagonalization of the transfer matrix: +A = normalizeMPSNaive(A); [l, r] = fixedPointsNaive(A); assert(ArrayIsEqual(l, l', 1e-12), 'left fixed point should be hermitian!') @@ -41,15 +41,15 @@ assert(ArrayIsEqual(l, ncon({A, l, conj(A)}, {[1, 2, -2], [3, 1], [3, 2, -1]}), 1e-12), 'l should be a left fixed point!') assert(ArrayIsEqual(r, ncon({A, r, conj(A)}, {[-1, 2, 1], [1, 3], [-2, 2, 3]}), 1e-12), 'r should be a right fixed point!') -assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalised!') +assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalized!') %% 1.2 Gauge fixing % left and right orthonormalisation through taking square root of fixed points -[L, Al] = leftOrthonormaliseNaive(A, l); -[R, Ar] = rightOrthonormaliseNaive(A, r); +[L, Al] = leftOrthonormalizeNaive(A, l); +[R, Ar] = rightOrthonormalizeNaive(A, r); assert(ArrayIsEqual(R * R', r, 1e-12), 'Right gauge does not square to r') assert(ArrayIsEqual(L' * L, l, 1e-12), 'Left gauge does not sqaure to l') @@ -77,8 +77,8 @@ A = createMPS(D, d); -% normalising an MPS through action of transfer matrix on a left and right matrix as a function handle: -A = normaliseMPS(A); +% normalizing an MPS through action of transfer matrix on a left and right matrix as a function handle: +A = normalizeMPS(A); [l, r] = fixedPoints(A); assert(ArrayIsEqual(l, l', 1e-12), 'left fixed point should be hermitian!') @@ -86,13 +86,13 @@ assert(ArrayIsEqual(l, ncon({A, l, conj(A)}, {[1, 2, -2], [3, 1], [3, 2, -1]}), 1e-12), 'l should be a left fixed point!') assert(ArrayIsEqual(r, ncon({A, r, conj(A)}, {[-1, 2, 1], [1, 3], [-2, 2, 3]}), 1e-12), 'r should be a right fixed point!') -assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalised!') +assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalized!') % gauging an MPS through iterative QR decompositions: [Al, Ac, Ar, C] = mixedCanonical(A); -% [R, Ar] = rightOrthonormalise(A); -% [L, Al] = leftOrthonormalise(A); +% [R, Ar] = rightOrthonormalize(A); +% [L, Al] = leftOrthonormalize(A); assert(ArrayIsEqual(eye(D), ncon({Ar, conj(Ar)}, {[-1 1 2], [-2 1 2]}), 1e-12), 'Ar not in right-orthonormal form') assert(ArrayIsEqual(eye(D), ncon({Al, conj(Al)}, {[1 2 -2], [1 2 -1]}), 1e-12), 'Al not in left-orthonormal form') @@ -103,7 +103,7 @@ %% 1.5 Computing expectation values A = createMPS(D, d); -A = normaliseMPS(A); +A = normalizeMPS(A); [l, r] = fixedPoints(A); [Al, Ac, Ar, C] = mixedCanonical(A); @@ -167,8 +167,8 @@ end -function Anew = normaliseMPSNaive(A) - % Normalise an MPS tensor. +function Anew = normalizeMPSNaive(A) + % Normalize an MPS tensor. % % Parameters % ---------- @@ -185,7 +185,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % directly diagonalising (D ** 2, D ** 2) matrix. + % directly diagonalizing (D ** 2, D ** 2) matrix. end @@ -208,7 +208,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix. + % diagonalizing (D ** 2, D ** 2) matrix. end @@ -231,13 +231,13 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix. + % diagonalizing (D ** 2, D ** 2) matrix. end function [l, r] = fixedPointsNaive(A) - % Find normalised fixed points. + % Find normalized fixed points. % % Parameters % ---------- @@ -257,7 +257,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix + % diagonalizing (D ** 2, D ** 2) matrix end @@ -265,7 +265,7 @@ %% 1.2 Gauge fixing -function [L, Al] = leftOrthonormaliseNaive(A, l) +function [L, Al] = leftOrthonormalizeNaive(A, l) % Transform A to left-orthonormal gauge. % % Parameters @@ -280,19 +280,19 @@ % left gauge with 2 legs, % ordered left-right. % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal % % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix + % diagonalizing (D ** 2, D ** 2) matrix end -function [R, Ar] = rightOrthonormaliseNaive(A, r) +function [R, Ar] = rightOrthonormalizeNaive(A, r) % Transform A to right-orthonormal gauge. % % Parameters @@ -307,14 +307,14 @@ % right gauge with 2 legs, % ordered left-right. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal % % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) dmatrix + % diagonalizing (D ** 2, D ** 2) dmatrix end @@ -331,15 +331,15 @@ % Returns % ------- % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % Ac : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % C : array(D, D) @@ -370,15 +370,15 @@ % Returns % ------- % AlTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % AcTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % ArTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % CTilde : array(Dtrunc, Dtrunc) @@ -392,8 +392,8 @@ %% 1.4 Algorithms for finding canonical forms -function Anew = normaliseMPS(A) - % Normalise an MPS tensor. +function Anew = normalizeMPS(A) + % Normalize an MPS tensor. % % Parameters % ---------- @@ -462,7 +462,7 @@ function [l, r] = fixedPoints(A) - % Find normalised fixed points. + % Find normalized fixed points. % % Parameters % ---------- @@ -490,7 +490,7 @@ % rqPos: already implemented as function 'lq' in the folder 'AuxiliaryFunctions' -function [R, Ar] = rightOrthonormalise(A, R0, tol, maxIter) +function [R, Ar] = rightOrthonormalize(A, R0, tol, maxIter) % Transform A to right-orthonormal gauge. % % Parameters @@ -513,7 +513,7 @@ % right gauge with 2 legs, % ordered left-right. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right-orthonormal @@ -523,7 +523,7 @@ % qrPos: already implemented as function 'qrpos' in the folder 'AuxiliaryFunctions' -function [L, Al] = leftOrthonormalise(A, L0, tol, maxIter) +function [L, Al] = leftOrthonormalize(A, L0, tol, maxIter) % Transform A to left-orthonormal gauge. % % Parameters @@ -546,7 +546,7 @@ % left gauge with 2 legs, % ordered left-right. % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left-orthonormal @@ -565,15 +565,15 @@ % Returns % ------- % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % Ac : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % C : array(D, D) @@ -602,10 +602,10 @@ % ordered left-bottom-right. % l : array(D, D), optional % left fixed point of transfermatrix, - % normalised. + % normalized. % r : array(D, D), optional % right fixed point of transfermatrix, - % normalised. + % normalized. % % Returns % ------- @@ -654,10 +654,10 @@ % ordered left-bottom-right. % l : array(D, D), optional % left fixed point of transfermatrix, - % normalised. + % normalized. % r : array(D, D), optional % right fixed point of transfermatrix, - % normalised. + % normalized. % % Returns % ------- diff --git a/matlab/chapter1Solution.m b/matlab/chapter1Solution.m index ac27fb7..d0a40f7 100644 --- a/matlab/chapter1Solution.m +++ b/matlab/chapter1Solution.m @@ -20,7 +20,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% 1.1 Normalisation +%% 1.1 Normalization d = 3; D = 5; @@ -32,8 +32,8 @@ assert(~isreal(A), 'MPS tensor should have complex values') -% normalising an MPS through naive diagonalization of the transfer matrix: -A = normaliseMPSNaive(A); +% normalizing an MPS through naive diagonalization of the transfer matrix: +A = normalizeMPSNaive(A); [l, r] = fixedPointsNaive(A); assert(ArrayIsEqual(l, l', 1e-12), 'left fixed point should be hermitian!') @@ -41,15 +41,15 @@ assert(ArrayIsEqual(l, ncon({A, l, conj(A)}, {[1, 2, -2], [3, 1], [3, 2, -1]}), 1e-12), 'l should be a left fixed point!') assert(ArrayIsEqual(r, ncon({A, r, conj(A)}, {[-1, 2, 1], [1, 3], [-2, 2, 3]}), 1e-12), 'r should be a right fixed point!') -assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalised!') +assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalized!') %% 1.2 Gauge fixing % left and right orthonormalisation through taking square root of fixed points -[L, Al] = leftOrthonormaliseNaive(A, l); -[R, Ar] = rightOrthonormaliseNaive(A, r); +[L, Al] = leftOrthonormalizeNaive(A, l); +[R, Ar] = rightOrthonormalizeNaive(A, r); assert(ArrayIsEqual(R * R', r, 1e-12), 'Right gauge does not square to r') assert(ArrayIsEqual(L' * L, l, 1e-12), 'Left gauge does not sqaure to l') @@ -77,8 +77,8 @@ A = createMPS(D, d); -% normalising an MPS through action of transfer matrix on a left and right matrix as a function handle: -A = normaliseMPS(A); +% normalizing an MPS through action of transfer matrix on a left and right matrix as a function handle: +A = normalizeMPS(A); [l, r] = fixedPoints(A); assert(ArrayIsEqual(l, l', 1e-12), 'left fixed point should be hermitian!') @@ -86,13 +86,13 @@ assert(ArrayIsEqual(l, ncon({A, l, conj(A)}, {[1, 2, -2], [3, 1], [3, 2, -1]}), 1e-12), 'l should be a left fixed point!') assert(ArrayIsEqual(r, ncon({A, r, conj(A)}, {[-1, 2, 1], [1, 3], [-2, 2, 3]}), 1e-12), 'r should be a right fixed point!') -assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalised!') +assert(abs(trace(l*r) - 1) < 1e-12, 'Left and right fixed points should be trace normalized!') % gauging an MPS through iterative QR decompositions: [Al, Ac, Ar, C] = mixedCanonical(A); -% [R, Ar] = rightOrthonormalise(A); -% [L, Al] = leftOrthonormalise(A); +% [R, Ar] = rightOrthonormalize(A); +% [L, Al] = leftOrthonormalize(A); assert(ArrayIsEqual(eye(D), ncon({Ar, conj(Ar)}, {[-1 1 2], [-2 1 2]}), 1e-12), 'Ar not in right-orthonormal form') assert(ArrayIsEqual(eye(D), ncon({Al, conj(Al)}, {[1 2 -2], [1 2 -1]}), 1e-12), 'Al not in left-orthonormal form') @@ -103,7 +103,7 @@ %% 1.5 Computing expectation values A = createMPS(D, d); -A = normaliseMPS(A); +A = normalizeMPS(A); [l, r] = fixedPoints(A); [Al, Ac, Ar, C] = mixedCanonical(A); @@ -166,8 +166,8 @@ end -function Anew = normaliseMPSNaive(A) - % Normalise an MPS tensor. +function Anew = normalizeMPSNaive(A) + % Normalize an MPS tensor. % % Parameters % ---------- @@ -184,7 +184,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % directly diagonalising (D ** 2, D ** 2) matrix. + % directly diagonalizing (D ** 2, D ** 2) matrix. D = size(A, 1); E = createTransfermatrix(A); @@ -211,7 +211,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix. + % diagonalizing (D ** 2, D ** 2) matrix. D = size(A, 1); E = createTransfermatrix(A); @@ -242,7 +242,7 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix. + % diagonalizing (D ** 2, D ** 2) matrix. D = size(A, 1); E = createTransfermatrix(A); @@ -256,7 +256,7 @@ function [l, r] = fixedPointsNaive(A) - % Find normalised fixed points. + % Find normalized fixed points. % % Parameters % ---------- @@ -276,18 +276,18 @@ % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix + % diagonalizing (D ** 2, D ** 2) matrix l = leftFixedPointNaive(A); r = rightFixedPointNaive(A); - l = l / trace(l*r); % normalise + l = l / trace(l*r); % normalize end %% 1.2 Gauge fixing -function [L, Al] = leftOrthonormaliseNaive(A, l) +function [L, Al] = leftOrthonormalizeNaive(A, l) % Transform A to left-orthonormal gauge. % % Parameters @@ -302,14 +302,14 @@ % left gauge with 2 legs, % ordered left-right. % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal % % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) matrix + % diagonalizing (D ** 2, D ** 2) matrix if nargin < 2 l = leftFixedPointNaive(A); @@ -320,7 +320,7 @@ end -function [R, Ar] = rightOrthonormaliseNaive(A, r) +function [R, Ar] = rightOrthonormalizeNaive(A, r) % Transform A to right-orthonormal gauge. % % Parameters @@ -335,14 +335,14 @@ % right gauge with 2 legs, % ordered left-right. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal % % Complexity % ---------- % O(D ** 6) algorithm, - % diagonalising (D ** 2, D ** 2) dmatrix + % diagonalizing (D ** 2, D ** 2) dmatrix if nargin < 2 r = rightFixedPointNaive(A); @@ -365,15 +365,15 @@ % Returns % ------- % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % Ac : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % C : array(D, D) @@ -386,8 +386,8 @@ % O(D ** 6) algorithm, % diagonalisation of (D ** 2, D ** 2) matrix - [L, Al] = leftOrthonormaliseNaive(A); - [R, Ar] = rightOrthonormaliseNaive(A); + [L, Al] = leftOrthonormalizeNaive(A); + [R, Ar] = rightOrthonormalizeNaive(A); C = L * R; [U, C, V] = svd(C); % normalize center matrix @@ -415,15 +415,15 @@ % Returns % ------- % AlTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % AcTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % ArTilde : array(Dtrunc, d, Dtrunc) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % CTilde : array(Dtrunc, Dtrunc) @@ -450,8 +450,8 @@ %% 1.4 Algorithms for finding canonical forms -function Anew = normaliseMPS(A) - % Normalise an MPS tensor. +function Anew = normalizeMPS(A) + % Normalize an MPS tensor. % % Parameters % ---------- @@ -540,7 +540,7 @@ function [l, r] = fixedPoints(A) - % Find normalised fixed points. + % Find normalized fixed points. % % Parameters % ---------- @@ -564,14 +564,14 @@ l = leftFixedPoint(A); r = rightFixedPoint(A); - l = l / trace(l*r); % normalise + l = l / trace(l*r); % normalize end % rqPos: already implemented as function 'lq' in the folder 'AuxiliaryFunctions' -function [R, Ar] = rightOrthonormalise(A, R0, tol, maxIter) +function [R, Ar] = rightOrthonormalize(A, R0, tol, maxIter) % Transform A to right-orthonormal gauge. % % Parameters @@ -594,7 +594,7 @@ % right gauge with 2 legs, % ordered left-right. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right-orthonormal @@ -633,7 +633,7 @@ % qrPos: already implemented as function 'qrpos' in the folder 'AuxiliaryFunctions' -function [L, Al] = leftOrthonormalise(A, L0, tol, maxIter) +function [L, Al] = leftOrthonormalize(A, L0, tol, maxIter) % Transform A to left-orthonormal gauge. % % Parameters @@ -656,7 +656,7 @@ % left gauge with 2 legs, % ordered left-right. % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left-orthonormal @@ -705,15 +705,15 @@ % Returns % ------- % Al : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % left orthonormal. % Ac : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % center gauge. % Ar : array(D, d, D) - % MPS tensor zith 3 legs, + % MPS tensor with 3 legs, % ordered left-bottom-right, % right orthonormal. % C : array(D, D) @@ -730,8 +730,8 @@ end D = size(A, 1); R0 = randcomplex(D, D); L0 = randcomplex(D, D); % initialize random matrices - [L, Al] = leftOrthonormalise(A, L0, tol); - [R, Ar] = rightOrthonormalise(A, R0, tol); + [L, Al] = leftOrthonormalize(A, L0, tol); + [R, Ar] = rightOrthonormalize(A, R0, tol); [U, C, V] = svd(L * R); % normalize center matrix nrm = trace(C * C'); @@ -757,10 +757,10 @@ % ordered left-bottom-right. % l : array(D, D), optional % left fixed point of transfermatrix, - % normalised. + % normalized. % r : array(D, D), optional % right fixed point of transfermatrix, - % normalised. + % normalized. % % Returns % ------- @@ -807,10 +807,10 @@ % ordered left-bottom-right. % l : array(D, D), optional % left fixed point of transfermatrix, - % normalised. + % normalized. % r : array(D, D), optional % right fixed point of transfermatrix, - % normalised. + % normalized. % % Returns % ------- diff --git a/matlab/chapter2Solution.m b/matlab/chapter2Solution.m index 3722726..03b3d33 100644 --- a/matlab/chapter2Solution.m +++ b/matlab/chapter2Solution.m @@ -1,66 +1,66 @@ -% Matlab script for chapter 1 of Bad Honnef tutorial on "Tangent space -% methods for Tangent-space methods for uniform matrix product states", -% based on the lecture notes: https://arxiv.org/abs/1810.07006 +% % Matlab script for chapter 1 of Bad Honnef tutorial on "Tangent space +% % methods for Tangent-space methods for uniform matrix product states", +% % based on the lecture notes: https://arxiv.org/abs/1810.07006 +% % +% % Detailed explanations of all the different steps can be found in the +% % python notebooks for the different chapters. These files provide a canvas +% % for a MATLAB implementation that mirrors the contents of the python +% % notebooks +% +% %% 2. Finding ground states of local Hamiltonians +% +% % Unlike the notebooks, where function definitions and corresponding checks +% % are constructed in sequence, here all checks and demonstrations are +% % placed at the start of the script, while all function definitions must +% % be given at the bottom of the script +% +% +% %% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % DEMONSTRATIONS +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% %% 2.2 Gradient descent algorithms +% +% +% % Variational optimization of spin-1 Heisenberg Hamiltonian through +% % minimization of the gradient in uniform gauge +% +% % coupling strengths +% Jx = -1; Jy = -1; Jz = -1; hz = 0; % Heisenberg antiferromagnet +% % Heisenberg Hamiltonian +% h = Heisenberg(Jx, Jy, Jz, hz); +% +% % initialize bond dimension, physical dimension +% D = 12; +% d = 3; +% +% % initialize random MPS +% A = createMPS(D, d); +% A = normaliseMPS(A); +% +% +% % Minimization of the energy through naive gradient descent +% tol = 1e-4; % tolerance for norm of gradient +% fprintf('\n\nGradient descent optimization:\n\n') +% tic; +% [E1, A1] = groundStateGradDescent(h, D, 0.1, A, tol, 5e2); +% t1 = toc; +% fprintf('\nTime until convergence: %fs\n', t1) +% fprintf('Computed energy: %.14f\n\n', E1) +% +% +% % Minimization of the energy using the fminunc minimizer: +% tol = 1e-6; % tolerance for fminunc +% fprintf('\n\nOptimization using fminunc:\n\n') +% tic +% [E2, A2] = groundStateMinimise(h, D, A, tol); +% t2 = toc; +% fprintf('\nTime until convergence: %fs\n', t2) +% fprintf('Computed energy: %.14f\n', E2) % -% Detailed explanations of all the different steps can be found in the -% python notebooks for the different chapters. These files provide a canvas -% for a MATLAB implementation that mirrors the contents of the python -% notebooks - -%% 2. Finding ground states of local Hamiltonians - -% Unlike the notebooks, where function definitions and corresponding checks -% are constructed in sequence, here all checks and demonstrations are -% placed at the start of the script, while all function definitions must -% be given at the bottom of the script - - -%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% DEMONSTRATIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%% 2.2 Gradient descent algorithms - - -% Variational optimization of spin-1 Heisenberg Hamiltonian through -% minimization of the gradient in uniform gauge - -% coupling strengths -Jx = -1; Jy = -1; Jz = -1; hz = 0; % Heisenberg antiferromagnet -% Heisenberg Hamiltonian -h = Heisenberg(Jx, Jy, Jz, hz); - -% initialize bond dimension, physical dimension -D = 12; -d = 3; - -% initialize random MPS -A = createMPS(D, d); -A = normaliseMPS(A); - - -% Minimization of the energy through naive gradient descent -tol = 1e-4; % tolerance for norm of gradient -fprintf('\n\nGradient descent optimization:\n\n') -tic; -[E1, A1] = groundStateGradDescent(h, D, 0.1, A, tol, 5e2); -t1 = toc; -fprintf('\nTime until convergence: %fs\n', t1) -fprintf('Computed energy: %.14f\n\n', E1) - - -% Minimization of the energy using the fminunc minimizer: -tol = 1e-6; % tolerance for fminunc -fprintf('\n\nOptimization using fminunc:\n\n') -tic -[E2, A2] = groundStateMinimise(h, D, A, tol); -t2 = toc; -fprintf('\nTime until convergence: %fs\n', t2) -fprintf('Computed energy: %.14f\n', E2) - %% 2.3 VUMPS @@ -1047,14 +1047,16 @@ [Al, Ac, Ar, C] = mixedCanonical(A0); flag = true; delta = 1e-5; + i = 0; while flag + i = i + 1; % regularise H hTilde = reducedHamMixed(h, Ac, Ar); % calculate environments - Lh = LhMixed(hTilde, Al, C, delta/10); - Rh = RhMixed(hTilde, Ar, C, delta/10); + Lh = LhMixed(hTilde, Al, C, delta/100); + Rh = RhMixed(hTilde, Ar, C, delta/100); % calculate new center - [AcTilde, CTilde] = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, tol); + [AcTilde, CTilde] = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, delta/100); % find Al, Ar from new Ac, C [AlTilde, AcTilde, ArTilde, CTilde] = minAcC(AcTilde, CTilde); % calculate norm @@ -1067,47 +1069,47 @@ Al = AlTilde; Ac = AcTilde; Ar = ArTilde; C = CTilde; % print current energy, optional... E = real(expVal2Mixed(h, Ac, Ar)); - fprintf('Current energy: %.14f\n', E); + fprintf('iteration:\t%d,\tenergy:\t%.12f\tgradient norm\t%.4e\n', i, E, delta) end end %% 2.4 Elementary excitations -function [x,e]=quasiParticle(h,Al,Ar,Ac,C,p,num) +function [x,e] = quasiParticle(h,Al,Ar,Ac,C,p,num) -tol=1e-12; D=size(Al,1); d=size(Al,2); +tol = 1e-12; D = size(Al,1); d = size(Al,2); % renormalize hamiltonian and find left and right environments hTilde = reducedHamMixed(h, Ac, Ar); Lh = LhMixed(hTilde, Al, C, tol); Rh = RhMixed(hTilde, Ar, C, tol); % find reduced parametrization -L=reshape(permute(conj(Al),[3 1 2]),[D D*d]); +L = reshape(permute(conj(Al),[3 1 2]),[D D*d]); VL = reshape(null(L),[D d D*(d-1)]); [x,e] = eigs(@(x)ApplyHeff(x),D^2*(d-1),num,'sr'); -function y=ApplyHeff(x) +function y = ApplyHeff(x) - x=reshape(x,[D*(d-1) D]); - B=ncon({VL,x},{[-1,-2,1],[1,-3]},1); + x = reshape(x,[D*(d-1) D]); + B = ncon({VL,x},{[-1,-2,1],[1,-3]},1); % right disconnected - right=ncon({B,conj(Ar)},{[-1,2,1],[-2,2,1]}); + right = ncon({B,conj(Ar)},{[-1,2,1],[-2,2,1]}); [right, ~] = gmres(@(v)ApplyELR(v,p), reshape(right, [], 1), [], tol); right = reshape(right, [D D]); % left disconnected - left=... + left = ... 1*ncon({Lh,B,conj(Al)},{[1,2],[2,3,-2],[1,3,-1]})+... 1*ncon({Al,B,conj(Al),conj(Al),hTilde},{[1,2,4],[4,5,-2],[1,3,6],[6,7,-1],[3,7,2,5]})+... exp(-1i*p)*ncon({B,Ar,conj(Al),conj(Al),hTilde},{[1,2,4],[4,5,-2],[1,3,6],[6,7,-1],[3,7,2,5]}); [left, ~] = gmres(@(v)ApplyERL(v,-p), reshape(left, [], 1), [], tol); left = reshape(left, [D D]); - y=... + y = ... 1*ncon({B,Ar,conj(Ar),hTilde},{[-1,2,1],[1,3,4],[-3,5,4],[-2,5,2,3]})+... exp(1i*p)*ncon({Al,B,conj(Ar),hTilde},{[-1,2,1],[1,3,4],[-3,5,4],[-2,5,2,3]})+... exp(-1i*p)*ncon({B,Ar,conj(Al),hTilde},{[4,3,1],[1,2,-3],[4,5,-1],[5,-2,3,2]})+... @@ -1119,24 +1121,24 @@ exp(-1i*p)*ncon({left,Ar},{[-1,1],[1,-2,-3]})+... exp(+1i*p)*ncon({Lh,Al,right},{[-1,1],[1,-2,2],[2,-3]}); - y=ncon({y,conj(VL)},{[1,2,-2],[1,2,-1]}); - y=reshape(y,[],1); + y = ncon({y,conj(VL)},{[1,2,-2],[1,2,-1]}); + y = reshape(y,[],1); end - function y=ApplyELR(x,p) - x=reshape(x,[D D]); - overlap=ncon({conj(C),x},{[1,2],[1,2]}); - y=ncon({Al,conj(Ar),x},{[-1,3,1],[-2,3,2],[1,2]}); - y=x-exp(1i*p)*(y-overlap*C); - y=reshape(y,[D^2 1]); + function y = ApplyELR(x,p) + x = reshape(x,[D D]); + overlap = ncon({conj(C),x},{[1,2],[1,2]}); + y = ncon({Al,conj(Ar),x},{[-1,3,1],[-2,3,2],[1,2]}); + y = x-exp(1i*p)*(y-overlap*C); + y = reshape(y,[D^2 1]); end - function y=ApplyERL(x,p) - x=reshape(x,[D D]); - overlap=ncon({conj(C),x},{[1,2],[1,2]}); - y=ncon({x,Ar,conj(Al)},{[1,2],[2,3,-2],[1,3,-1]}); - y=x-exp(1i*p)*(y-overlap*C); - y=reshape(y,[D^2 1]); + function y = ApplyERL(x,p) + x = reshape(x,[D D]); + overlap = ncon({conj(C),x},{[1,2],[1,2]}); + y = ncon({x,Ar,conj(Al)},{[1,2],[2,3,-2],[1,3,-1]}); + y = x-exp(1i*p)*(y-overlap*C); + y = reshape(y,[D^2 1]); end end diff --git a/python/chapter1.ipynb b/python/chapter1.ipynb index 7ca4f40..5923902 100644 --- a/python/chapter1.ipynb +++ b/python/chapter1.ipynb @@ -15,22 +15,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 1. Matrix product states in the thermodynamic limit\n", - "### 1.1 Normalisation\n", - "We start by considering a uniform MPS in the thermodynamic limit, which is defined by \n", - "$$ |\\Psi(A)> = \\sum_i^d \\nu_L^\\dagger \\left[ \\prod_{m\\in Z} A_i \\right]\\nu_R |i>. $$\n", + "### 1.1 Normalization\n", + "We start by considering a uniform MPS in the thermodynamic limit, which is defined as \n", + "$$\\left | \\Psi(A) \\right \\rangle = \\sum_{\\{i\\}} \\boldsymbol{v}_L^\\dagger \\left[ \\prod_{m\\in\\mathbb{Z}} A^{i_m} \\right] \\boldsymbol{v}_R \\left | \\{i\\} \\right \\rangle.$$\n", "\n", - "Here, $A_i$ are complex matrices of size $D \\times D$, for every entry of the index $d$. This allows for the interpretation of the object $A$ as a three-legged tensor of dimensions $D\\times d \\times D$, where we will refer to $D$ as the bond dimension and $d$ as the physical dimension. With this object and the diagrammatic language of tensor networks, we can represent the state as\n", + "Here, $\\boldsymbol{v}_L^\\dagger$ and $\\boldsymbol{v}_R$ represent boundary vectors at infinity and the $A^i$ are complex matrices of size $D \\times D$ for every entry of the index $i$. This allows for the interpretation of the object $A$ as a three-legged tensor of dimensions $D\\times d \\times D$, where we will refer to $D$ as the bond dimension and $d$ as the physical dimension. With this object and the diagrammatic language of tensor networks, we can represent the state as\n", "\n", - "\"MPS\n", + "
\"MPSstate\"/
\n", "\n", - "Thus, we initialise and represent a uniform MPS state as follows:" + "Thus, we initialize and represent a uniform MPS state as follows:" ] }, { @@ -77,28 +77,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "One of the most relevant objects in all our calculations will be the transfer matrix, defined as\n", + "One of the central objects in any MPS calculation is the transfer matrix, defined in our case as\n", "\n", - "\"transfer\n", + "
\"transfer
\n", "\n", - "where we will be using the convention of ordering the legs as\n", + "This object corresponds to an operator acting on the space of $D \\times D$ matrices, and can be interpreted as a 4-leg tensor. We will use the following convention for ordering the legs:\n", "1. top left\n", "2. bottom left\n", "3. top right\n", "4. bottom right\n", "\n", - "The transfer matrix can be shown to be a completely positive map, such that the leading eigenvalue is a positive number, which we conveniently rescale to unity for a proper normalization of the state in the thermodynamic limit. This means solving the (left and right) eigenvalue equation:\n", + "The transfer matrix can be shown to be a completely positive map, such that its leading eigenvalue is a positive number. This eigenvalue should be rescaled to one to ensure a proper normalization of the state in the thermodynamic limit. To perform this normalization, we must therefore find the left and right fixed points $l$ and $r$ which correspond to the largest eigenvalues of the eigenvalue equations\n", "\n", - "\"fixed\n", + "
\"fixed
\n", "\n", - "Additionally, we may fix the normalisation of the eigenvectors by requiring that their trace is equal to one:\n", + "Normalizing the state then means rescaling the MPS tensor $A \\leftarrow A / \\sqrt{\\lambda}$. Additionally, we may fix the normalization of the eigenvectors by requiring that their trace is equal to one:\n", "\n", - "\"norm\"\n", + "
\"norm\"/
\n", "\n", + "With these properties in place, the norm of an MPS can be evaluated as\n", "\n", - "If we now require that there is no influence of the boundary on the bulk, we require the overlap of the boundary vectors with the fixed points to equal unity. In this case, we will have properly normalised the MPS:\n", + "
\"norm\"/
\n", "\n", - "\"normalised\n" + "It can be readily seen that the infinite product of transfer matrices reduces to a projector onto the fixed points, so that the norm reduces to the overlap between the boundary vectors and the fixed points. Since there is no effect of the boundary vectors on the bulk properties of the MPS, we can always choose these such that MPS is properly normalized as $ \\left \\langle \\Psi(\\bar{A})\\middle | \\Psi(A) \\right \\rangle = 1$." ] }, { @@ -113,13 +114,13 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " E : np.array(D, D, D, D)\n", + " E : np.array (D, D, D, D)\n", " Transfermatrix with 4 legs,\n", " ordered topLeft-bottomLeft-topRight-bottomRight.\n", " \"\"\"\n", @@ -137,26 +138,26 @@ "metadata": {}, "outputs": [], "source": [ - "def normaliseMPS(A):\n", + "def normalizeMPS(A):\n", " \"\"\"\n", - " Normalise an MPS tensor.\n", + " Normalize an MPS tensor.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " Anew : np.array(D, d, D)\n", + " Anew : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", "\n", " return Anew" @@ -174,20 +175,20 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", " \n", " return l" @@ -205,20 +206,20 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", " \n", " return r" @@ -232,27 +233,27 @@ "source": [ "def fixedPoints(A):\n", " \"\"\"\n", - " Find normalised fixed points.\n", + " Find normalized fixed points.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix\n", + " diagonalizing (D ** 2, D ** 2) matrix\n", " \"\"\"\n", " \n", " return l, r" @@ -266,7 +267,7 @@ }, "outputs": [], "source": [ - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "l, r = fixedPoints(A)\n", "\n", "assert np.allclose(l, np.conj(l).T, 1e-12), \"left fixed point should be hermitian!\"\n", @@ -274,27 +275,47 @@ "\n", "assert np.allclose(l, ncon((A, l, np.conj(A)), ([1, 2, -2], [3, 1], [3, 2, -1])), 1e-12), \"l should be a left fixed point!\"\n", "assert np.allclose(r, ncon((A, r, np.conj(A)), ([-1, 2, 1], [1, 3], [-2, 2, 3])), 1e-12), \"r should be a right fixed point!\"\n", - "assert np.abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalised!\"" + "assert np.abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalized!\"" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "### 1.2 Gauge fixing\n", - "While a single $A$ corresponds to a unique state $|\\Psi(A)>$, the converse is not true, as different tensors may give rise to the same state. This is easily seen by noting that the gauge transform\n", - "\"gauge\n", + "### 1.2 Gauge freedom\n", + "While a given MPS tensor $A$ corresponds to a unique state $\\left | \\Psi(A) \\right \\rangle$, the converse is not true, as different tensors may give rise to the same state. This is easily seen by noting that the gauge transform\n", + "\n", + "
\"gauge
\n", "\n", "leaves the physical state invariant. We may use this freedom in parametrization to impose canonical forms on the MPS tensor $A$.\n", "\n", - "We start by considering the left-orthonormal form $A_L$ of an MPS, which has the property that\n", - "\"left\n", + "We start by considering the *left-orthonormal form* of an MPS, which is defined in terms of a tensor $A_L$ that satisfies the condition\n", + "\n", + "
\"left
\n", + "\n", + "We can find the gauge transform $L$ that brings $A$ into this form\n", + "\n", + "
\"left
\n", + "\n", + "by decomposing the fixed point $l$ as $l = L^\\dagger L$, such that\n", + "\n", + "
\"left
\n", + "\n", + "Note that this gauge choice still leaves room for unitary gauge transformations\n", + "\n", + "
\"unitary
\n", "\n", - "We can find the matrix $L$ that brings $A$ into this form by decomposing the fixed point $l$ as $l = L^\\dagger L$, such that\n", - "\"left\n", + "which can be used to bring the right fixed point $r$ into diagonal form. Similarly, we can find the gauge transform that brings $A$ into *right-orthonormal form*\n", "\n", - "Furthermore, there is still room for unitary gauge transformations such that we can also bring the right fixed point in diagonal form. Similarly, we can consider the right-orthonormal form $A_R$, where we have\n", - "\"right" + "
\"right
\n", + "\n", + "such that\n", + "\n", + "
\"right
\n", + "\n", + "and the left fixed point $l$ is diagonal. The routines that bring a given MPS into canonical form by decomposing the corresponding transfer matrix fixed points can be defined as follows:" ] }, { @@ -303,34 +324,30 @@ "metadata": {}, "outputs": [], "source": [ - "\"\"\"As transfer matrix is positive definite, fixed points are also positive definite, thus allowing for a\n", - "square root algorithm of the eigenvalues. Note that taking square roots is typically less favourable,\n", - "as this increases the error\"\"\"\n", - "\n", - "def leftOrthonormalise(A, l=None):\n", + "def leftOrthonormalize(A, l=None):\n", " \"\"\"\n", " Transform A to left-orthonormal gauge.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " L : np.array(D, D)\n", + " L : np.array (D, D)\n", " left gauge with 2 legs,\n", " ordered left-right.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix\n", + " diagonalizing (D ** 2, D ** 2) matrix\n", " \"\"\"\n", " \n", " return L, Al" @@ -342,30 +359,30 @@ "metadata": {}, "outputs": [], "source": [ - "def rightOrthonormalise(A, r=None):\n", + "def rightOrthonormalize(A, r=None):\n", " \"\"\"\n", " Transform A to right-orthonormal gauge.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " R : np.array(D, D)\n", + " R : np.array (D, D)\n", " right gauge with 2 legs,\n", " ordered left-right.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) dmatrix\n", + " diagonalizing (D ** 2, D ** 2) dmatrix\n", " \"\"\"\n", " \n", " return R, Ar" @@ -377,8 +394,8 @@ "metadata": {}, "outputs": [], "source": [ - "L, Al = leftOrthonormalise(A, l)\n", - "R, Ar = rightOrthonormalise(A, r)\n", + "L, Al = leftOrthonormalize(A, l)\n", + "R, Ar = rightOrthonormalize(A, r)\n", "\n", "assert np.allclose(R @ np.conj(R).T, r), \"Right gauge doesn't square to r\"\n", "assert np.allclose(np.conj(L).T @ L, l), \"Left gauge doesn't sqaure to l\"\n", @@ -390,22 +407,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, there is the notion of a mixed gauge for the uniform MPS by choosing a 'center site', bringing the left tensors in left-orthonormal form and the right tensors in right-orthonormal form, and redefining the center tensor as follows:\n", - "\"mixed\n", + "Finally, we can define a *mixed gauge* for the uniform MPS by choosing one site, the 'center site', and bringing all tensors to the left of it in the left-orthonormal form and all the tensors to the right of it in the right-orthonormal form. Defining a new tensor $A_C$ on the center site, we obtain the form\n", + "\n", + "
\"right
\n", + "\n", + "By contrast, the original representation using the same tensor at every site is commonly referred to as the *uniform gauge*. The mixed gauge has an intuitive interpretation. Defining $C = LR$, this tensor then implements the gauge transform that maps the left-orthonormal tensor to the right-orthonormal one, thereby defining the center-site tensor $A_C$:\n", "\n", + "
\"right
\n", "\n", - "The mixed gauge has an intuitive interpretation. Defining $C = LR$, this implements the gauge transform that maps the left-orthonormal tensor to the right-orthonormal one, hence defining the center-site tensor $A_C$:\n", - "\"mixed\n", - "The above is called the mixed gauge condition and allows us to freely move the center tensor $A_C$ around in the MPS.\n", + "This relation is called the mixed gauge condition and allows us to freely move the center tensor $A_C$ through the MPS, linking the left- and right orthonormal tensors.\n", "\n", + "Finally we may bring $C$ into diagonal form by performing a singular value decomposition $C = USV^\\dagger$ and absorbing $U$ and $V^\\dagger$ into the definition of $A_L$ and $A_R$ using the residual unitary gauge freedom\n", "\n", - "Finally we may perform an SVD of $C = USV^\\dagger$, and taking up $U$ and $V^\\dagger$ in the definition of $A_L$ and $A_R$, such that we are left with a diagonal $C$ on the virtual bonds.\n", - "\"mixed\n", + "
\"mixed
\n", "\n", - "In fact, this means that we can write down a Schmidt decomposition of the state across an arbitrary bond in the chain, and the diagonal elements $C_l$ are exactly the Schmidt numbers of any bipartition of the MPS. \n", - "\"Schmidt\n", - "Hence, we can calculate the bipartite entanglement entropy by \n", - "$$ S = -\\sum_l C_l^2 \\log(C_l^2) $$\n" + "The mixed canonical form with a diagonal $C$ now allows to straightforwardly write down a Schmidt decomposition of the state across an arbitrary bond in the chain\n", + "\n", + "$$ \\left | \\Psi(A) \\right \\rangle = \\sum_{i=1}^{D} C_i \\left | \\Psi^i_L(A_L) \\right \\rangle \\otimes \\left | \\Psi^i_R(A_R) \\right \\rangle,$$\n", + "\n", + "where the states $\\left | \\Psi^i_L(A_L) \\right \\rangle$ and $\\left | \\Psi^i_R(A_R) \\right \\rangle$ are orthogonal states on half the lattice. The diagonal elements $C_i$ are exactly the Schmidt numbers of any bipartition of the MPS, and as such determine its bipartite entanglement entropy\n", + "\n", + "$$ S = -\\sum_i C_i^2 \\log(C_i^2) .$$" ] }, { @@ -420,25 +442,25 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ac : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -446,7 +468,7 @@ " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalisation of (D ** 2, D ** 2) matrix\n", + " diagonalization of (D ** 2, D ** 2) matrix\n", " \"\"\"\n", "\n", " return Al, Ac, Ar, C" @@ -464,7 +486,7 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", @@ -499,15 +521,19 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "### 1.3 Truncation of a uniform MPS\n", - "The mixed canonical form is not only useful for finding the entanglement entropy, it also allows for a way to truncate MPS states efficiently. This is done by truncating the Schmidt decomposition, such that the new MPS has a reduced bond dimension for that ond. This truncation can be shown to be optimal in the sense that the norm between the original and the truncated MPS is minimised. The truncated MPS in the mixed gauge is thus:\n", - "\"truncated\n", "\n", - "We mention that this is a local optimization, in the sense that it maximizes the local overlap, however not the global overlap. This would require a variational optimization of the following cost function:\n", - "$$ || ~|\\Psi(A)> - |\\Psi(\\tilde{A})> ||^2 $$\n", - "We postpone the detailed discussion hereof until later." + "The mixed canonical form also enables efficient truncatation an MPS. The sum in the above Schmidt decomposition can be truncated, giving rise to a new MPS that has a reduced bond dimension for that bond. This truncation is optimal in the sense that the norm between the original and the truncated MPS is maximized. To arrive at a translation invariant truncated MPS, we can truncate the columns of the absorbed isometries $U$ and $V^\\dagger$ correspondingly, thereby transforming *every* tensor $A_L$ or $A_R$. The truncated MPS in the mixed gauge is then given by\n", + "\n", + "
\"truncated
\n", + "\n", + "We note that the resulting state based on this local truncation is not guaranteed to correspond to the MPS with a lower bond dimension that is globally optimal. This would require a variational optimization of the cost function.\n", + "\n", + "$$ \\left | \\left | ~\\left | \\Psi(A) \\right \\rangle - \\left | \\Psi(\\tilde{A}) \\right \\rangle ~\\right | \\right |^2.$$" ] }, { @@ -522,7 +548,7 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " Dtrunc : int\n", @@ -530,19 +556,19 @@ " \n", " Returns\n", " -------\n", - " AlTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " AlTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " AcTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " AcTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " ArTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " ArTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " CTilde : np.array(Dtrunc, Dtrunc)\n", + " CTilde : np.array (Dtrunc, Dtrunc)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -557,8 +583,9 @@ "metadata": {}, "outputs": [], "source": [ - "AlTilde, AcTilde, ArTilde, CTilde = truncateMPS(A, 3)\n", - "assert AlTilde.shape[0] == 3 and AlTilde.shape[2] == 3, \"Something went wrong in truncating the MPS\"" + "Dtrunc = 3\n", + "AlTilde, AcTilde, ArTilde, CTilde = truncateMPS(A, Dtrunc)\n", + "assert AlTilde.shape[0] == Dtrunc and AlTilde.shape[2] == Dtrunc, \"Something went wrong in truncating the MPS\"" ] }, { @@ -566,11 +593,9 @@ "metadata": {}, "source": [ "### 1.4 Algorithms for finding canonical forms\n", - "One of the great things of MPS is that they provide efficient approximations of physical states, and for gapped systems they are expected to be exact in the limit $D \\rightarrow \\infty$. The idea is that if we increase the bond dimension enough, we can get to arbitrary precision. However, increasing the bond dimension comes at a numerical cost, as the MPS algorithms scale in $D$. It is possible to ensure that the complexity of all MPS algorithms scales as $O(D^3)$, however this means we need to be a little smarter with the previously encountered algorithms.\n", - "\n", - "As a first step, we can refrain from explicitly building the matrices that are used in the eigenvalue solvers, but this will easily extend to all following algorithms. We can circumvent explicitly building the matrix by implementing a function that corresponds to the action of the operator, usually called a handle, and passing this to the eigenvalue solver.\n", + "The success of using MPS for describing physical systems stems from the fact that they provide efficient approximations to a large class of physically relevant states. In one dimension, they have been shown to approximate low-energy states of gapped systems arbitrarily well at only a polynomial cost in the bond dimension $D$. This means that in principle we can push MPS results for these systems to arbitrary precision as long as we increase the bond dimension enough. However, increasing the bond dimension comes at a numerical cost, as the complexity of any MPS algorithm scales with $D$. As opposed to the naive routines given above, it is possible to ensure that the complexity of all MPS algorithms scales as $O(D^3)$, so long as we are a bit careful when implementing them.\n", "\n", - "For example, a better way of fixing the normalisation of an MPS tensor, as well as determining left and right fixed points is by implementing the handles and using the optimal contraction sequences:" + "As a first example, we can refrain from explicitly contructing the matrices that are used in the eigenvalue problems, and instead pass a function that implements the action of the corresponding operator on a vector to the eigenvalue solver. We demonstrate this for the problem of normalizing an MPS, where instead of explicitly constructing the transfer matrix we now define a function handle which implements its action on the right and left fixed points using an optimal contraction sequence:" ] }, { @@ -579,19 +604,19 @@ "metadata": {}, "outputs": [], "source": [ - "def normaliseMPS(A):\n", + "def normalizeMPS(A):\n", " \"\"\"\n", - " Normalise an MPS tensor.\n", + " Normalize an MPS tensor.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " Anew : np.array(D, d, D)\n", + " Anew : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", @@ -616,13 +641,13 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", "\n", @@ -647,13 +672,13 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", "\n", @@ -674,20 +699,20 @@ "source": [ "def fixedPoints(A):\n", " \"\"\"\n", - " Find normalised fixed points.\n", + " Find normalized fixed points.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", "\n", @@ -697,7 +722,7 @@ " D ** 3 contraction for transfer matrix handle.\n", " \"\"\"\n", "\n", - " return l / trace, r" + " return l, r" ] }, { @@ -709,7 +734,7 @@ "outputs": [], "source": [ "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "l, r = fixedPoints(A)\n", "\n", "assert np.allclose(l, np.conj(l).T, 1e-12), \"left fixed point should be hermitian!\"\n", @@ -717,14 +742,31 @@ "\n", "assert np.allclose(l, ncon((A, l, np.conj(A)), ([1, 2, -2], [3, 1], [3, 2, -1])), 1e-12), \"l should be a left fixed point!\"\n", "assert np.allclose(r, ncon((A, r, np.conj(A)), ([-1, 2, 1], [1, 3], [-2, 2, 3])), 1e-12), \"r should be a right fixed point!\"\n", - "assert abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalised!\"" + "assert abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalized!\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Furthermore, taking the square root of such a fixed point to find the left and right gauge is also a way to introduce larger errors than neccesary. This can be circumvented by using an iterative scheme that makes use of a unique decomposition, such as a QR or polar decomposition. Note however that for a QR decomposition to be unique we need the diagonal elements of R to have a positive sign." + "We can similarly improve both the efficiency and accuracy of the routines bringing a given MPS into its mixed canonical form. While plugging in the more efficient ways of finding the left and right fixed point into the above `mixedCanonical` routine would reduce its complexity to $O(D^3)$, this algorithm would still be suboptimal in terms of numerical accuracy. This arises from the fact that, while $l$ and $r$ are theoretically known to be positive hermitian matrices, at least one of them will nevertheless have small eigenvalues, say of order $\\eta$, if the MPS is supposed to provide a good approximation to an actual state. In practice, $l$ and $r$ are determined using an iterative eigensolver and will only be accurate up to a specified tolerance $\\epsilon$. Upon taking the 'square roots' $L$ and $R$, the numerical precision will then decrease to $\\text{min}(\\sqrt{\\epsilon}, \\epsilon/\\sqrt{\\eta})$. Furthermore, gauge transforming $A$ with $L$ or $R$ requires the potentially ill-conditioned inversions of $L$ and $R$, and will typically yield $A_L$ and $A_R$ which violate the orthonormalization condition in the same order $\\epsilon/\\sqrt{\\eta}$. We can circumvent both these probelems by resorting to so-called *single-layer algorithms*. These are algorithms that only work on the level of the MPS tensors in the ket layer, and never consider operations for which contractions with the bra layer are needed. We now demonstrate such a single-layer algorithm for finding canonical forms.\n", + "\n", + "Suppose we are given an MPS tensor $A$, then from the above discussion we know that bringing it into left canonical form means finding a left-orthonormal tensor $A_L$ and a matrix $L$ such that $L A=A_L L$. The idea is then to solve this equation iteratively, where in every iteration\n", + "\n", + "1. we start from a matrix $L^{i}$\n", + "2. we construct the tensor $L^{i}A$\n", + "3. we take a QR decomposition to obtain $A_L^{i+1} L^{i+1} = L^{i}A$, and\n", + "4. we take $L^{i+1}$ to the next iteration\n", + "\n", + "The QR decomposition is represented diagrammatically as\n", + "\n", + "
\"QR
\n", + "\n", + "This iterative procedure is bound to converge to a fixed point for which $L^{(i+1)}=L^{(i)}=L$ and $A_L$ is left orthonormal by construction:\n", + "\n", + "
\"QR
\n", + "\n", + "A similar procedure can be used to find a right-orthonormal tensor $A_R$ and a matrix $R$ such that $A R = R A_R$. It is important to note that the convergence of this procedure relies on the fact that the QR decomposition is unique, which is not actually the case in general. However, it can be made unique by imposing that the diagonal elements of the triangular matrix $R$ must be positive. This extra condition is imposed in the routines `qrPos` and `rqPos` defined below." ] }, { @@ -739,15 +781,15 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(M, N)\n", + " A : np.array (M, N)\n", " Matrix to decompose.\n", " \n", " Returns\n", " -------\n", - " R : np.array(M, M)\n", + " R : np.array (M, M)\n", " Upper triangular matrix,\n", " positive diagonal elements.\n", - " Q : np.array(M, N)\n", + " Q : np.array (M, N)\n", " Orthogonal matrix.\n", " \n", " Complexity\n", @@ -755,7 +797,6 @@ " ~O(max(M, N) ** 3) algorithm.\n", " \"\"\"\n", "\n", - " \n", " M, N = A.shape\n", " \n", " # LQ decomposition: scipy conventions: Q.shape = (N, N), L.shape = (M, N)\n", @@ -773,16 +814,16 @@ " return R, Q\n", "\n", "\n", - "def rightOrthonormalise(A, R0=None, tol=1e-14, maxIter=1e5):\n", + "def rightOrthonormalize(A, R0=None, tol=1e-14, maxIter=1e5):\n", " \"\"\"\n", " Transform A to right-orthonormal gauge.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " R0 : np.array(D, D), optional\n", + " R0 : np.array (D, D), optional\n", " Right gauge matrix,\n", " initial guess.\n", " tol : float, optional\n", @@ -793,11 +834,11 @@ "\n", " Returns\n", " -------\n", - " R : np.array(D, D)\n", + " R : np.array (D, D)\n", " right gauge with 2 legs,\n", " ordered left-right.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal\n", " \"\"\"\n", @@ -817,14 +858,14 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(M, N)\n", + " A : np.array (M, N)\n", " Matrix to decompose.\n", " \n", " Returns\n", " -------\n", - " Q : np.array(M, N)\n", + " Q : np.array (M, N)\n", " Orthogonal matrix.\n", - " R : np.array(N, N)\n", + " R : np.array (N, N)\n", " Upper triangular matrix,\n", " positive diagonal elements.\n", " \n", @@ -850,16 +891,16 @@ " return Q, R\n", "\n", "\n", - "def leftOrthonormalise(A, L0=None, tol=1e-14, maxIter=1e5):\n", + "def leftOrthonormalize(A, L0=None, tol=1e-14, maxIter=1e5):\n", " \"\"\"\n", " Transform A to left-orthonormal gauge.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " L0 : np.array(D, D), optional\n", + " L0 : np.array (D, D), optional\n", " Left gauge matrix,\n", " initial guess.\n", " tol : float, optional\n", @@ -870,11 +911,11 @@ "\n", " Returns\n", " -------\n", - " L : np.array(D, D)\n", + " L : np.array (D, D)\n", " left gauge with 2 legs,\n", " ordered left-right.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left-orthonormal\n", " \"\"\"\n", @@ -894,25 +935,25 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ac : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -954,17 +995,20 @@ "metadata": {}, "source": [ "### 1.5 Computing expectation values \n", - "Having described the states in different gauges, we want to use these to determine the expectation values of extensive operators:\n", - "$$ O = \\frac{1}{Z} \\sum_{n\\in Z} O_n $$\n", + "Now that we have seen the different ways to parametrize a given MPS, namely the uniform gauge and the mixed gauge, we wish to use these to compute expectation values of an extensive operator:\n", + "$$ O = \\frac{1}{\\mathbb{Z}} \\sum_{n \\in \\mathbb{Z}} O_n. $$\n", + "\n", + "If we assume that each $O_n$ acts on a single site and we are working with a properly normalized MPS, translation invariance dictates that the expectation value of $O$ is given by the contraction\n", + "\n", + "
\"Expectation
\n", "\n", - "If we work with properly normalized MPS, the expectation value per site of a one-body operator (such as an order parameter e.g. $X_i$) is then found by considering the following contraction:\n", - "\"Expectation\n", + "In the uniform gauge, we can use the fixed points of the transfer matrix to contract everything to the left and to the right of the operator, such that we are left with the contraction\n", "\n", - "If we use the uniform gauge, we can use the fixed points of the transfer matrix to collapse everything on the left and right, such that we are left with the contraction:\n", - "\"Expectation\n", + "
\"Expectation
\n", "\n", - "However, in the mixed gauge, we can locate the center site where the operator is acting, and then contract everything to the left and right to the identity, such that we find\n", - "\"Expectation" + "In the mixed gauge, we can locate the center site where the operator is acting, and then contract everything to the left and right to the identity to arrive at the particularly simple expression\n", + "\n", + "
\"Expectation
" ] }, { @@ -979,24 +1023,24 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d)\n", + " O : np.array (d, d)\n", " single-site operator.\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", "\n", " Returns\n", " -------\n", " o : complex float\n", " expectation value of O.\n", " \"\"\"\n", - " \n", + "\n", " # given as an example:\n", "\n", " # calculate fixed points if not given\n", @@ -1021,9 +1065,9 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d)\n", + " O : np.array (d, d)\n", " single-site operator.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", @@ -1045,7 +1089,7 @@ "source": [ "O = np.random.rand(d,d) + 1.0j * np.random.rand(d,d)\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "Al, Ac, Ar, C = mixedCanonical(A)\n", "expVal = expVal1Uniform(O, A)\n", "expValMix = expVal1Mixed(O, Ac)\n", @@ -1057,8 +1101,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This procedure generalises easily to operators that act on multiple sites. In particular, the Hamiltonian $h$ can be evaluated as\n", - "\"Expectation" + "This procedure can be readily generalized to operators that act on multiple sites. In particular, a two-site operator such as a Hamiltonian term $h$ can be evaluated as\n", + "\n", + "
\"Expectation
" ] }, { @@ -1073,18 +1118,18 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d, d, d)\n", + " O : np.array (d, d, d, d)\n", " two-site operator,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", "\n", " Returns\n", " -------\n", @@ -1107,14 +1152,14 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d, d, d)\n", + " O : np.array (d, d, d, d)\n", " two-site operator,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right gauged.\n", @@ -1149,7 +1194,7 @@ "metadata": { "celltoolbar": "Attachments", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1163,7 +1208,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/chapter1Solution.ipynb b/python/chapter1Solution.ipynb index 7ce4509..2410090 100644 --- a/python/chapter1Solution.ipynb +++ b/python/chapter1Solution.ipynb @@ -15,22 +15,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 1. Matrix product states in the thermodynamic limit\n", - "### 1.1 Normalisation\n", - "We start by considering a uniform MPS in the thermodynamic limit, which is defined by \n", - "$$ |\\Psi(A)> = \\sum_i^d \\nu_L^\\dagger \\left[ \\prod_{m\\in Z} A_i \\right]\\nu_R |i>. $$\n", + "### 1.1 Normalization\n", + "We start by considering a uniform MPS in the thermodynamic limit, which is defined as \n", + "$$\\left | \\Psi(A) \\right \\rangle = \\sum_{\\{i\\}} \\boldsymbol{v}_L^\\dagger \\left[ \\prod_{m\\in\\mathbb{Z}} A^{i_m} \\right] \\boldsymbol{v}_R \\left | \\{i\\} \\right \\rangle.$$\n", "\n", - "Here, $A_i$ are complex matrices of size $D \\times D$, for every entry of the index $d$. This allows for the interpretation of the object $A$ as a three-legged tensor of dimensions $D\\times d \\times D$, where we will refer to $D$ as the bond dimension and $d$ as the physical dimension. With this object and the diagrammatic language of tensor networks, we can represent the state as\n", + "Here, $\\boldsymbol{v}_L^\\dagger$ and $\\boldsymbol{v}_R$ represent boundary vectors at infinity and the $A^i$ are complex matrices of size $D \\times D$ for every entry of the index $i$. This allows for the interpretation of the object $A$ as a three-legged tensor of dimensions $D\\times d \\times D$, where we will refer to $D$ as the bond dimension and $d$ as the physical dimension. With this object and the diagrammatic language of tensor networks, we can represent the state as\n", "\n", - "\"MPS\n", + "
\"MPSstate\"/
\n", "\n", - "Thus, we initialise and represent a uniform MPS state as follows:" + "Thus, we initialize and represent a uniform MPS state as follows:" ] }, { @@ -79,28 +80,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "One of the most relevant objects in all our calculations will be the transfer matrix, defined as\n", + "One of the central objects in any MPS calculation is the transfer matrix, defined in our case as\n", "\n", - "\"transfer\n", + "
\"transfer
\n", "\n", - "where we will be using the convention of ordering the legs as\n", + "This object corresponds to an operator acting on the space of $D \\times D$ matrices, and can be interpreted as a 4-leg tensor. We will use the following convention for ordering the legs:\n", "1. top left\n", "2. bottom left\n", "3. top right\n", "4. bottom right\n", "\n", - "The transfer matrix can be shown to be a completely positive map, such that the leading eigenvalue is a positive number, which we conveniently rescale to unity for a proper normalization of the state in the thermodynamic limit. This means solving the (left and right) eigenvalue equation:\n", + "The transfer matrix can be shown to be a completely positive map, such that its leading eigenvalue is a positive number. This eigenvalue should be rescaled to one to ensure a proper normalization of the state in the thermodynamic limit. To perform this normalization, we must therefore find the left and right fixed points $l$ and $r$ which correspond to the largest eigenvalues of the eigenvalue equations\n", "\n", - "\"fixed\n", + "
\"fixed
\n", "\n", - "Additionally, we may fix the normalisation of the eigenvectors by requiring that their trace is equal to one:\n", + "Normalizing the state then means rescaling the MPS tensor $A \\leftarrow A / \\sqrt{\\lambda}$. Additionally, we may fix the normalization of the eigenvectors by requiring that their trace is equal to one:\n", "\n", - "\"norm\"\n", + "
\"norm\"/
\n", "\n", + "With these properties in place, the norm of an MPS can be evaluated as\n", "\n", - "If we now require that there is no influence of the boundary on the bulk, we require the overlap of the boundary vectors with the fixed points to equal unity. In this case, we will have properly normalised the MPS:\n", + "
\"norm\"/
\n", "\n", - "\"normalised\n" + "It can be readily seen that the infinite product of transfer matrices reduces to a projector onto the fixed points, so that the norm reduces to the overlap between the boundary vectors and the fixed points. Since there is no effect of the boundary vectors on the bulk properties of the MPS, we can always choose these such that MPS is properly normalized as $ \\left \\langle \\Psi(\\bar{A})\\middle | \\Psi(A) \\right \\rangle = 1$." ] }, { @@ -115,13 +117,13 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " E : np.array(D, D, D, D)\n", + " E : np.array (D, D, D, D)\n", " Transfermatrix with 4 legs,\n", " ordered topLeft-bottomLeft-topRight-bottomRight.\n", " \"\"\"\n", @@ -137,26 +139,26 @@ "metadata": {}, "outputs": [], "source": [ - "def normaliseMPS(A):\n", + "def normalizeMPS(A):\n", " \"\"\"\n", - " Normalise an MPS tensor.\n", + " Normalize an MPS tensor.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " Anew : np.array(D, d, D)\n", + " Anew : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", "\n", " D = A.shape[0]\n", @@ -181,20 +183,20 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", " \n", " D = A.shape[0]\n", @@ -226,20 +228,20 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix.\n", + " diagonalizing (D ** 2, D ** 2) matrix.\n", " \"\"\"\n", " \n", " D = A.shape[0]\n", @@ -267,27 +269,27 @@ "source": [ "def fixedPoints(A):\n", " \"\"\"\n", - " Find normalised fixed points.\n", + " Find normalized fixed points.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix\n", + " diagonalizing (D ** 2, D ** 2) matrix\n", " \"\"\"\n", " \n", " # find fixed points\n", @@ -307,7 +309,7 @@ }, "outputs": [], "source": [ - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "l, r = fixedPoints(A)\n", "\n", "assert np.allclose(l, np.conj(l).T, 1e-12), \"left fixed point should be hermitian!\"\n", @@ -315,27 +317,47 @@ "\n", "assert np.allclose(l, ncon((A, l, np.conj(A)), ([1, 2, -2], [3, 1], [3, 2, -1])), 1e-12), \"l should be a left fixed point!\"\n", "assert np.allclose(r, ncon((A, r, np.conj(A)), ([-1, 2, 1], [1, 3], [-2, 2, 3])), 1e-12), \"r should be a right fixed point!\"\n", - "assert np.abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalised!\"" + "assert np.abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalized!\"" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "### 1.2 Gauge fixing\n", - "While a single $A$ corresponds to a unique state $|\\Psi(A)>$, the converse is not true, as different tensors may give rise to the same state. This is easily seen by noting that the gauge transform\n", - "\"gauge\n", + "### 1.2 Gauge freedom\n", + "While a given MPS tensor $A$ corresponds to a unique state $\\left | \\Psi(A) \\right \\rangle$, the converse is not true, as different tensors may give rise to the same state. This is easily seen by noting that the gauge transform\n", + "\n", + "
\"gauge
\n", "\n", "leaves the physical state invariant. We may use this freedom in parametrization to impose canonical forms on the MPS tensor $A$.\n", "\n", - "We start by considering the left-orthonormal form $A_L$ of an MPS, which has the property that\n", - "\"left\n", + "We start by considering the *left-orthonormal form* of an MPS, which is defined in terms of a tensor $A_L$ that satisfies the condition\n", + "\n", + "
\"left
\n", + "\n", + "We can find the gauge transform $L$ that brings $A$ into this form\n", + "\n", + "
\"left
\n", + "\n", + "by decomposing the fixed point $l$ as $l = L^\\dagger L$, such that\n", + "\n", + "
\"left
\n", + "\n", + "Note that this gauge choice still leaves room for unitary gauge transformations\n", "\n", - "We can find the matrix $L$ that brings $A$ into this form by decomposing the fixed point $l$ as $l = L^\\dagger L$, such that\n", - "\"left\n", + "
\"unitary
\n", "\n", - "Furthermore, there is still room for unitary gauge transformations such that we can also bring the right fixed point in diagonal form. Similarly, we can consider the right-orthonormal form $A_R$, where we have\n", - "\"right" + "which can be used to bring the right fixed point $r$ into diagonal form. Similarly, we can find the gauge transform that brings $A$ into *right-orthonormal form*\n", + "\n", + "
\"right
\n", + "\n", + "such that\n", + "\n", + "
\"right
\n", + "\n", + "and the left fixed point $l$ is diagonal. The routines that bring a given MPS into canonical form by decomposing the corresponding transfer matrix fixed points can be defined as follows:" ] }, { @@ -344,34 +366,30 @@ "metadata": {}, "outputs": [], "source": [ - "\"\"\"As transfer matrix is positive definite, fixed points are also positive definite, thus allowing for a\n", - "square root algorithm of the eigenvalues. Note that taking square roots is typically less favourable,\n", - "as this increases the error\"\"\"\n", - "\n", - "def leftOrthonormalise(A, l=None):\n", + "def leftOrthonormalize(A, l=None):\n", " \"\"\"\n", " Transform A to left-orthonormal gauge.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " L : np.array(D, D)\n", + " L : np.array (D, D)\n", " left gauge with 2 legs,\n", " ordered left-right.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) matrix\n", + " diagonalizing (D ** 2, D ** 2) matrix\n", " \"\"\"\n", " \n", " # find left fixed point\n", @@ -394,30 +412,30 @@ "metadata": {}, "outputs": [], "source": [ - "def rightOrthonormalise(A, r=None):\n", + "def rightOrthonormalize(A, r=None):\n", " \"\"\"\n", " Transform A to right-orthonormal gauge.\n", " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " R : np.array(D, D)\n", + " R : np.array (D, D)\n", " right gauge with 2 legs,\n", " ordered left-right.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal\n", " \n", " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalising (D ** 2, D ** 2) dmatrix\n", + " diagonalizing (D ** 2, D ** 2) dmatrix\n", " \"\"\"\n", " \n", " # find right fixed point\n", @@ -440,8 +458,8 @@ "metadata": {}, "outputs": [], "source": [ - "L, Al = leftOrthonormalise(A, l)\n", - "R, Ar = rightOrthonormalise(A, r)\n", + "L, Al = leftOrthonormalize(A, l)\n", + "R, Ar = rightOrthonormalize(A, r)\n", "\n", "assert np.allclose(R @ np.conj(R).T, r), \"Right gauge doesn't square to r\"\n", "assert np.allclose(np.conj(L).T @ L, l), \"Left gauge doesn't sqaure to l\"\n", @@ -453,22 +471,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, there is the notion of a mixed gauge for the uniform MPS by choosing a 'center site', bringing the left tensors in left-orthonormal form and the right tensors in right-orthonormal form, and redefining the center tensor as follows:\n", - "\"mixed\n", + "Finally, we can define a *mixed gauge* for the uniform MPS by choosing one site, the 'center site', and bringing all tensors to the left of it in the left-orthonormal form and all the tensors to the right of it in the right-orthonormal form. Defining a new tensor $A_C$ on the center site, we obtain the form\n", "\n", + "
\"right
\n", "\n", - "The mixed gauge has an intuitive interpretation. Defining $C = LR$, this implements the gauge transform that maps the left-orthonormal tensor to the right-orthonormal one, hence defining the center-site tensor $A_C$:\n", - "\"mixed\n", - "The above is called the mixed gauge condition and allows us to freely move the center tensor $A_C$ around in the MPS.\n", + "By contrast, the original representation using the same tensor at every site is commonly referred to as the *uniform gauge*. The mixed gauge has an intuitive interpretation. Defining $C = LR$, this tensor then implements the gauge transform that maps the left-orthonormal tensor to the right-orthonormal one, thereby defining the center-site tensor $A_C$:\n", "\n", + "
\"right
\n", "\n", - "Finally we may perform an SVD of $C = USV^\\dagger$, and taking up $U$ and $V^\\dagger$ in the definition of $A_L$ and $A_R$, such that we are left with a diagonal $C$ on the virtual bonds.\n", - "\"mixed\n", + "This relation is called the mixed gauge condition and allows us to freely move the center tensor $A_C$ through the MPS, linking the left- and right orthonormal tensors.\n", "\n", - "In fact, this means that we can write down a Schmidt decomposition of the state across an arbitrary bond in the chain, and the diagonal elements $C_l$ are exactly the Schmidt numbers of any bipartition of the MPS. \n", - "\"Schmidt\n", - "Hence, we can calculate the bipartite entanglement entropy by \n", - "$$ S = -\\sum_l C_l^2 \\log(C_l^2) $$\n" + "Finally we may bring $C$ into diagonal form by performing a singular value decomposition $C = USV^\\dagger$ and absorbing $U$ and $V^\\dagger$ into the definition of $A_L$ and $A_R$ using the residual unitary gauge freedom\n", + "\n", + "
\"mixed
\n", + "\n", + "The mixed canonical form with a diagonal $C$ now allows to straightforwardly write down a Schmidt decomposition of the state across an arbitrary bond in the chain\n", + "\n", + "$$ \\left | \\Psi(A) \\right \\rangle = \\sum_{i=1}^{D} C_i \\left | \\Psi^i_L(A_L) \\right \\rangle \\otimes \\left | \\Psi^i_R(A_R) \\right \\rangle,$$\n", + "\n", + "where the states $\\left | \\Psi^i_L(A_L) \\right \\rangle$ and $\\left | \\Psi^i_R(A_R) \\right \\rangle$ are orthogonal states on half the lattice. The diagonal elements $C_i$ are exactly the Schmidt numbers of any bipartition of the MPS, and as such determine its bipartite entanglement entropy\n", + "\n", + "$$ S = -\\sum_i C_i^2 \\log(C_i^2) .$$" ] }, { @@ -483,25 +506,25 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ac : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -509,19 +532,19 @@ " Complexity\n", " ----------\n", " O(D ** 6) algorithm,\n", - " diagonalisation of (D ** 2, D ** 2) matrix\n", + " diagonalization of (D ** 2, D ** 2) matrix\n", " \"\"\"\n", "\n", " D = A.shape[0]\n", "\n", " # Compute left and right orthonormal forms\n", - " L, Al = leftOrthonormalise(A)\n", - " R, Ar = rightOrthonormalise(A)\n", + " L, Al = leftOrthonormalize(A)\n", + " R, Ar = rightOrthonormalize(A)\n", " \n", " # center matrix C is matrix multiplication of L and R\n", " C = L @ R\n", " \n", - " # singular value decomposition to diagonalise C\n", + " # singular value decomposition to diagonalize C\n", " U, S, Vdag = svd(C)\n", " C = np.diag(S)\n", "\n", @@ -529,7 +552,7 @@ " Al = ncon((np.conj(U).T, Al, U), ([-1, 1], [1, -2, 2], [2, -3]))\n", " Ar = ncon((Vdag, Ar, np.conj(Vdag).T), ([-1, 1], [1, -2, 2], [2, -3]))\n", "\n", - " # normalise center matrix\n", + " # normalize center matrix\n", " norm = np.trace(C @ np.conj(C).T)\n", " C /= np.sqrt(norm)\n", "\n", @@ -551,7 +574,7 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \n", @@ -593,15 +616,19 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "### 1.3 Truncation of a uniform MPS\n", - "The mixed canonical form is not only useful for finding the entanglement entropy, it also allows for a way to truncate MPS states efficiently. This is done by truncating the Schmidt decomposition, such that the new MPS has a reduced bond dimension for that ond. This truncation can be shown to be optimal in the sense that the norm between the original and the truncated MPS is minimised. The truncated MPS in the mixed gauge is thus:\n", - "\"truncated\n", "\n", - "We mention that this is a local optimization, in the sense that it maximizes the local overlap, however not the global overlap. This would require a variational optimization of the following cost function:\n", - "$$ || ~|\\Psi(A)> - |\\Psi(\\tilde{A})> ||^2 $$\n", - "We postpone the detailed discussion hereof until later." + "The mixed canonical form also enables efficient truncatation an MPS. The sum in the above Schmidt decomposition can be truncated, giving rise to a new MPS that has a reduced bond dimension for that bond. This truncation is optimal in the sense that the norm between the original and the truncated MPS is maximized. To arrive at a translation invariant truncated MPS, we can truncate the columns of the absorbed isometries $U$ and $V^\\dagger$ correspondingly, thereby transforming *every* tensor $A_L$ or $A_R$. The truncated MPS in the mixed gauge is then given by\n", + "\n", + "
\"truncated
\n", + "\n", + "We note that the resulting state based on this local truncation is not guaranteed to correspond to the MPS with a lower bond dimension that is globally optimal. This would require a variational optimization of the cost function.\n", + "\n", + "$$ \\left | \\left | ~\\left | \\Psi(A) \\right \\rangle - \\left | \\Psi(\\tilde{A}) \\right \\rangle ~\\right | \\right |^2.$$" ] }, { @@ -616,7 +643,7 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " Dtrunc : int\n", @@ -624,19 +651,19 @@ " \n", " Returns\n", " -------\n", - " AlTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " AlTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " AcTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " AcTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " ArTilde : np.array(Dtrunc, d, Dtrunc)\n", - " MPS tensor zith 3 legs,\n", + " ArTilde : np.array (Dtrunc, d, Dtrunc)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " CTilde : np.array(Dtrunc, Dtrunc)\n", + " CTilde : np.array (Dtrunc, Dtrunc)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -655,7 +682,7 @@ " ArTilde = ncon((Vdag, Ar, np.conj(Vdag).T), ([-1, 1], [1, -2, 2], [2, -3]))\n", " CTilde = np.diag(S)\n", " \n", - " # normalise center matrix\n", + " # normalize center matrix\n", " norm = np.trace(CTilde @ np.conj(CTilde).T)\n", " CTilde /= np.sqrt(norm)\n", "\n", @@ -671,8 +698,9 @@ "metadata": {}, "outputs": [], "source": [ - "AlTilde, AcTilde, ArTilde, CTilde = truncateMPS(A, 3)\n", - "assert AlTilde.shape[0] == 3 and AlTilde.shape[2] == 3, \"Something went wrong in truncating the MPS\"" + "Dtrunc = 3\n", + "AlTilde, AcTilde, ArTilde, CTilde = truncateMPS(A, Dtrunc)\n", + "assert AlTilde.shape[0] == Dtrunc and AlTilde.shape[2] == Dtrunc, \"Something went wrong in truncating the MPS\"" ] }, { @@ -680,11 +708,9 @@ "metadata": {}, "source": [ "### 1.4 Algorithms for finding canonical forms\n", - "One of the great things of MPS is that they provide efficient approximations of physical states, and for gapped systems they are expected to be exact in the limit $D \\rightarrow \\infty$. The idea is that if we increase the bond dimension enough, we can get to arbitrary precision. However, increasing the bond dimension comes at a numerical cost, as the MPS algorithms scale in $D$. It is possible to ensure that the complexity of all MPS algorithms scales as $O(D^3)$, however this means we need to be a little smarter with the previously encountered algorithms.\n", - "\n", - "As a first step, we can refrain from explicitly building the matrices that are used in the eigenvalue solvers, but this will easily extend to all following algorithms. We can circumvent explicitly building the matrix by implementing a function that corresponds to the action of the operator, usually called a handle, and passing this to the eigenvalue solver.\n", + "The success of using MPS for describing physical systems stems from the fact that they provide efficient approximations to a large class of physically relevant states. In one dimension, they have been shown to approximate low-energy states of gapped systems arbitrarily well at only a polynomial cost in the bond dimension $D$. This means that in principle we can push MPS results for these systems to arbitrary precision as long as we increase the bond dimension enough. However, increasing the bond dimension comes at a numerical cost, as the complexity of any MPS algorithm scales with $D$. As opposed to the naive routines given above, it is possible to ensure that the complexity of all MPS algorithms scales as $O(D^3)$, so long as we are a bit careful when implementing them.\n", "\n", - "For example, a better way of fixing the normalisation of an MPS tensor, as well as determining left and right fixed points is by implementing the handles and using the optimal contraction sequences:" + "As a first example, we can refrain from explicitly contructing the matrices that are used in the eigenvalue problems, and instead pass a function that implements the action of the corresponding operator on a vector to the eigenvalue solver. We demonstrate this for the problem of normalizing an MPS, where instead of explicitly constructing the transfer matrix we now define a function handle which implements its action on the right and left fixed points using an optimal contraction sequence:" ] }, { @@ -693,19 +719,19 @@ "metadata": {}, "outputs": [], "source": [ - "def normaliseMPS(A):\n", + "def normalizeMPS(A):\n", " \"\"\"\n", - " Normalise an MPS tensor.\n", + " Normalize an MPS tensor.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " Anew : np.array(D, d, D)\n", + " Anew : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", @@ -742,13 +768,13 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", "\n", @@ -790,13 +816,13 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", "\n", @@ -834,20 +860,20 @@ "source": [ "def fixedPoints(A):\n", " \"\"\"\n", - " Find normalised fixed points.\n", + " Find normalized fixed points.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " l : np.array(D, D)\n", + " l : np.array (D, D)\n", " left fixed point with 2 legs,\n", " ordered bottom-top.\n", - " r : np.array(D, D)\n", + " r : np.array (D, D)\n", " right fixed point with 2 legs,\n", " ordered top-bottom.\n", "\n", @@ -875,7 +901,7 @@ "outputs": [], "source": [ "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "l, r = fixedPoints(A)\n", "\n", "assert np.allclose(l, np.conj(l).T, 1e-12), \"left fixed point should be hermitian!\"\n", @@ -883,14 +909,31 @@ "\n", "assert np.allclose(l, ncon((A, l, np.conj(A)), ([1, 2, -2], [3, 1], [3, 2, -1])), 1e-12), \"l should be a left fixed point!\"\n", "assert np.allclose(r, ncon((A, r, np.conj(A)), ([-1, 2, 1], [1, 3], [-2, 2, 3])), 1e-12), \"r should be a right fixed point!\"\n", - "assert abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalised!\"" + "assert abs(ncon((l, r), ([1, 2], [2, 1])) - 1) < 1e-12, \"Left and right fixed points should be trace normalized!\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Furthermore, taking the square root of such a fixed point to find the left and right gauge is also a way to introduce larger errors than neccesary. This can be circumvented by using an iterative scheme that makes use of a unique decomposition, such as a QR or polar decomposition. Note however that for a QR decomposition to be unique we need the diagonal elements of R to have a positive sign." + "We can similarly improve both the efficiency and accuracy of the routines bringing a given MPS into its mixed canonical form. While plugging in the more efficient ways of finding the left and right fixed point into the above `mixedCanonical` routine would reduce its complexity to $O(D^3)$, this algorithm would still be suboptimal in terms of numerical accuracy. This arises from the fact that, while $l$ and $r$ are theoretically known to be positive hermitian matrices, at least one of them will nevertheless have small eigenvalues, say of order $\\eta$, if the MPS is supposed to provide a good approximation to an actual state. In practice, $l$ and $r$ are determined using an iterative eigensolver and will only be accurate up to a specified tolerance $\\epsilon$. Upon taking the 'square roots' $L$ and $R$, the numerical precision will then decrease to $\\text{min}(\\sqrt{\\epsilon}, \\epsilon/\\sqrt{\\eta})$. Furthermore, gauge transforming $A$ with $L$ or $R$ requires the potentially ill-conditioned inversions of $L$ and $R$, and will typically yield $A_L$ and $A_R$ which violate the orthonormalization condition in the same order $\\epsilon/\\sqrt{\\eta}$. We can circumvent both these probelems by resorting to so-called *single-layer algorithms*. These are algorithms that only work on the level of the MPS tensors in the ket layer, and never consider operations for which contractions with the bra layer are needed. We now demonstrate such a single-layer algorithm for finding canonical forms.\n", + "\n", + "Suppose we are given an MPS tensor $A$, then from the above discussion we know that bringing it into left canonical form means finding a left-orthonormal tensor $A_L$ and a matrix $L$ such that $L A=A_L L$. The idea is then to solve this equation iteratively, where in every iteration\n", + "\n", + "1. we start from a matrix $L^{i}$\n", + "2. we construct the tensor $L^{i}A$\n", + "3. we take a QR decomposition to obtain $A_L^{i+1} L^{i+1} = L^{i}A$, and\n", + "4. we take $L^{i+1}$ to the next iteration\n", + "\n", + "The QR decomposition is represented diagrammatically as\n", + "\n", + "
\"QR
\n", + "\n", + "This iterative procedure is bound to converge to a fixed point for which $L^{(i+1)}=L^{(i)}=L$ and $A_L$ is left orthonormal by construction:\n", + "\n", + "
\"QR
\n", + "\n", + "A similar procedure can be used to find a right-orthonormal tensor $A_R$ and a matrix $R$ such that $A R = R A_R$. It is important to note that the convergence of this procedure relies on the fact that the QR decomposition is unique, which is not actually the case in general. However, it can be made unique by imposing that the diagonal elements of the triangular matrix $R$ must be positive. This extra condition is imposed in the routines `qrPos` and `rqPos` defined below." ] }, { @@ -905,15 +948,15 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(M, N)\n", + " A : np.array (M, N)\n", " Matrix to decompose.\n", " \n", " Returns\n", " -------\n", - " R : np.array(M, M)\n", + " R : np.array (M, M)\n", " Upper triangular matrix,\n", " positive diagonal elements.\n", - " Q : np.array(M, N)\n", + " Q : np.array (M, N)\n", " Orthogonal matrix.\n", " \n", " Complexity\n", @@ -939,16 +982,16 @@ " return R, Q\n", "\n", "\n", - "def rightOrthonormalise(A, R0=None, tol=1e-14, maxIter=1e5):\n", + "def rightOrthonormalize(A, R0=None, tol=1e-14, maxIter=1e5):\n", " \"\"\"\n", " Transform A to right-orthonormal gauge.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " R0 : np.array(D, D), optional\n", + " R0 : np.array (D, D), optional\n", " Right gauge matrix,\n", " initial guess.\n", " tol : float, optional\n", @@ -959,27 +1002,28 @@ "\n", " Returns\n", " -------\n", - " R : np.array(D, D)\n", + " R : np.array (D, D)\n", " right gauge with 2 legs,\n", " ordered left-right.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal\n", " \"\"\"\n", "\n", " D = A.shape[0]\n", " d = A.shape[1]\n", + " tol = max(tol, 1e-14)\n", " i = 1\n", "\n", " # Random guess for R0 if none specified\n", " if R0 is None:\n", " R0 = np.random.rand(D, D)\n", "\n", - " # Normalise R0\n", + " # Normalize R0\n", " R0 = R0 / np.linalg.norm(R0)\n", "\n", - " # Initialise loop\n", + " # Initialize loop\n", " R, Ar = rqPos(np.reshape(ncon((A, R0), ([-1, -2, 1], [1, -3])), (D, D * d)))\n", " R = R / np.linalg.norm(R)\n", " convergence = np.linalg.norm(R - R0)\n", @@ -989,7 +1033,7 @@ " # calculate AR and decompose\n", " Rnew, Ar = rqPos(np.reshape(ncon((A, R), ([-1, -2, 1], [1, -3])), (D, D * d)))\n", "\n", - " # normalise new R\n", + " # normalize new R\n", " Rnew = Rnew / np.linalg.norm(Rnew)\n", "\n", " # calculate convergence criterium\n", @@ -1017,14 +1061,14 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(M, N)\n", + " A : np.array (M, N)\n", " Matrix to decompose.\n", " \n", " Returns\n", " -------\n", - " Q : np.array(M, N)\n", + " Q : np.array (M, N)\n", " Orthogonal matrix.\n", - " R : np.array(N, N)\n", + " R : np.array (N, N)\n", " Upper triangular matrix,\n", " positive diagonal elements.\n", " \n", @@ -1050,16 +1094,16 @@ " return Q, R\n", "\n", "\n", - "def leftOrthonormalise(A, L0=None, tol=1e-14, maxIter=1e5):\n", + "def leftOrthonormalize(A, L0=None, tol=1e-14, maxIter=1e5):\n", " \"\"\"\n", " Transform A to left-orthonormal gauge.\n", "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " L0 : np.array(D, D), optional\n", + " L0 : np.array (D, D), optional\n", " Left gauge matrix,\n", " initial guess.\n", " tol : float, optional\n", @@ -1070,27 +1114,28 @@ "\n", " Returns\n", " -------\n", - " L : np.array(D, D)\n", + " L : np.array (D, D)\n", " left gauge with 2 legs,\n", " ordered left-right.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left-orthonormal\n", " \"\"\"\n", "\n", " D = A.shape[0]\n", " d = A.shape[1]\n", + " tol = max(tol, 1e-14)\n", " i = 1\n", "\n", " # Random guess for L0 if none specified\n", " if L0 is None:\n", " L0 = np.random.rand(D, D)\n", "\n", - " # Normalise L0\n", + " # Normalize L0\n", " L0 = L0 / np.linalg.norm(L0)\n", "\n", - " # Initialise loop\n", + " # Initialize loop\n", " Al, L = qrPos(np.reshape(ncon((L0, A), ([-1, 1], [1, -2, -3])), (D * d, D)))\n", " L = L / np.linalg.norm(L)\n", " convergence = np.linalg.norm(L - L0)\n", @@ -1100,7 +1145,7 @@ " # calculate LA and decompose\n", " Al, Lnew = qrPos(np.reshape(ncon((L, A), ([-1, 1], [1, -2, -3])), (D * d, D)))\n", "\n", - " # normalise new L\n", + " # normalize new L\n", " Lnew = Lnew / np.linalg.norm(Lnew)\n", "\n", " # calculate convergence criterium\n", @@ -1128,25 +1173,25 @@ "\n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", "\n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ac : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " diagonal.\n", @@ -1157,6 +1202,7 @@ " \"\"\"\n", "\n", " D = A.shape[0]\n", + " tol = max(tol, 1e-14)\n", "\n", " # Random guess for L0 if none specified\n", " if L0 is None:\n", @@ -1167,13 +1213,13 @@ " R0 = np.random.rand(D, D)\n", "\n", " # Compute left and right orthonormal forms\n", - " L, Al = leftOrthonormalise(A, L0, tol, maxIter)\n", - " R, Ar = rightOrthonormalise(A, R0, tol, maxIter)\n", + " L, Al = leftOrthonormalize(A, L0, tol, maxIter)\n", + " R, Ar = rightOrthonormalize(A, R0, tol, maxIter)\n", "\n", " # center matrix C is matrix multiplication of L and R\n", " C = L @ R\n", "\n", - " # singular value decomposition to diagonalise C\n", + " # singular value decomposition to diagonalize C\n", " U, S, Vdag = svd(C)\n", " C = np.diag(S)\n", "\n", @@ -1181,7 +1227,7 @@ " Al = ncon((np.conj(U).T, Al, U), ([-1, 1], [1, -2, 2], [2, -3]))\n", " Ar = ncon((Vdag, Ar, np.conj(Vdag).T), ([-1, 1], [1, -2, 2], [2, -3]))\n", "\n", - " # normalise center matrix\n", + " # normalize center matrix\n", " norm = np.trace(C @ np.conj(C).T)\n", " C /= np.sqrt(norm)\n", "\n", @@ -1220,17 +1266,20 @@ "metadata": {}, "source": [ "### 1.5 Computing expectation values \n", - "Having described the states in different gauges, we want to use these to determine the expectation values of extensive operators:\n", - "$$ O = \\frac{1}{Z} \\sum_{n\\in Z} O_n $$\n", + "Now that we have seen the different ways to parametrize a given MPS, namely the uniform gauge and the mixed gauge, we wish to use these to compute expectation values of an extensive operator:\n", + "$$ O = \\frac{1}{\\mathbb{Z}} \\sum_{n \\in \\mathbb{Z}} O_n. $$\n", + "\n", + "If we assume that each $O_n$ acts on a single site and we are working with a properly normalized MPS, translation invariance dictates that the expectation value of $O$ is given by the contraction\n", + "\n", + "
\"Expectation
\n", "\n", - "If we work with properly normalized MPS, the expectation value per site of a one-body operator (such as an order parameter e.g. $X_i$) is then found by considering the following contraction:\n", - "\"Expectation\n", + "In the uniform gauge, we can use the fixed points of the transfer matrix to contract everything to the left and to the right of the operator, such that we are left with the contraction\n", "\n", - "If we use the uniform gauge, we can use the fixed points of the transfer matrix to collapse everything on the left and right, such that we are left with the contraction:\n", - "\"Expectation\n", + "
\"Expectation
\n", "\n", - "However, in the mixed gauge, we can locate the center site where the operator is acting, and then contract everything to the left and right to the identity, such that we find\n", - "\"Expectation" + "In the mixed gauge, we can locate the center site where the operator is acting, and then contract everything to the left and right to the identity to arrive at the particularly simple expression\n", + "\n", + "
\"Expectation
" ] }, { @@ -1245,17 +1294,17 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d)\n", + " O : np.array (d, d)\n", " single-site operator.\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", "\n", " Returns\n", " -------\n", @@ -1285,9 +1334,9 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d)\n", + " O : np.array (d, d)\n", " single-site operator.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", @@ -1312,7 +1361,7 @@ "source": [ "O = np.random.rand(d,d) + 1.0j * np.random.rand(d,d)\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "Al, Ac, Ar, C = mixedCanonical(A)\n", "expVal = expVal1Uniform(O, A)\n", "expValMix = expVal1Mixed(O, Ac)\n", @@ -1324,8 +1373,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This procedure generalises easily to operators that act on multiple sites. In particular, the Hamiltonian $h$ can be evaluated as\n", - "\"Expectation" + "This procedure can be readily generalized to operators that act on multiple sites. In particular, a two-site operator such as a Hamiltonian term $h$ can be evaluated as\n", + "\n", + "
\"Expectation
" ] }, { @@ -1340,18 +1390,18 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d, d, d)\n", + " O : np.array (d, d, d, d)\n", " two-site operator,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", "\n", " Returns\n", " -------\n", @@ -1381,14 +1431,14 @@ "\n", " Parameters\n", " ----------\n", - " O : np.array(d, d, d, d)\n", + " O : np.array (d, d, d, d)\n", " two-site operator,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right gauged.\n", @@ -1426,7 +1476,7 @@ "metadata": { "celltoolbar": "Attachments", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1440,7 +1490,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/chapter2.ipynb b/python/chapter2.ipynb index 04f65d0..061cc1b 100644 --- a/python/chapter2.ipynb +++ b/python/chapter2.ipynb @@ -15,29 +15,30 @@ "from scipy.linalg import svd, polar, null_space\n", "from functools import partial\n", "from time import time\n", - "from tutorialFunctions import createMPS, normaliseMPS, fixedPoints, rightOrthonormalise, mixedCanonical, expVal2Uniform, expVal2Mixed" + "from tutorialFunctions import createMPS, normalizeMPS, fixedPoints, rightOrthonormalize, mixedCanonical, expVal2Uniform, expVal2Mixed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 2. Finding ground states of local Hamiltonians\n", "\n", - "Having found a way of encoding the states, the next step is to implement a way of finding the ground state. To this end, we consider a nearest-neighbour Hamiltonian H, of the form\n", - "$$H = \\sum_n h_{n, n+1}.$$\n", - "Here $h_{n,n+1}$ is a hermitian operator acting non-trivially on the sites $n$ and $n+1$. As in any variational approach, the variational principle serves as a guide for finding ground-state approximations, we want to minimise the expectation value of the energy,\n", - "$$ \\min_A \\frac{<\\Psi(\\bar{A})| H | \\Psi(A) >}{<\\Psi(\\bar{A})|\\Psi(A)>}. $$\n", + "In the previous chapter, we stated that uniform MPS can be used to efficiently approximate low-energy states of one-dimensional systems with gapped local Hamiltonians. Having defined ways of representing and manipulating MPS, the logical next step is therefore to have a look at how exactly they can be used to find ground states. To this end, we consider a nearest-neighbour Hamiltonian $H$ of the form\n", + "\n", + "$$H = \\sum_n h_{n, n+1}$$\n", + "\n", + "acting on an infinite one-dimensional system. Here, $h_{n,n+1}$ is a hermitian operator acting non-trivially on sites $n$ and $n+1$. As in any variational approach, the variational principle serves as a guide for finding ground-state approximations, dictating that the optimal MPS approximation of the ground state corresponds to the minimum of the expectation value of the energy,\n", + "\n", + "$$ \\min_A \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | H \\middle | \\Psi(A) \\right \\rangle}{\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle}. $$\n", "\n", - "In the thermodynamic limit the energy diverges with system size, but, since we are working with translation-invariant states only, we should rather minimise the energy density. We also will restrict to properly normalised states. Diagrammatically, the minimization problem is recast as\n", + "In the thermodynamic limit the energy diverges with system size, but, since we are working with translation-invariant states only, we should rather minimize the energy density. In the following we will always restrict our discussion to preoperly normalized states. Diagrammatically, the minimization problem can then be recast as\n", "\n", - "\"minimization\n", + "
\"minimization
\n", "\n", - "We now turn to some numerical optimization strategies for minimizing this energy density directly." + "In this notebook we illustratre numerical optimization strategies for minimizing this energy density directly." ] }, { @@ -46,20 +47,35 @@ "source": [ "### 2.1 The gradient\n", "\n", - "Any optimization problem relies on an efficient evaluation of the gradient, so the first thing to do is to compute this quantity (efficiently). The objective function $f$ that we want to minimize is a real function of the complex-valued $A$, or equivalently, the independent variables $A$ and $\\bar{A}$. The gradient $g$ is then obtained by differentiating $f(\\bar{A},A)$ with respect to $\\bar{A}$,\n", + "Any optimization problem relies on an efficient evaluation of the gradient, so the first thing to do is to compute this quantity. The objective function $f$ that we want to minimize is a real function of the complex-valued $A$, or equivalently, of the independent variables $A$ and $\\bar{A}$. The gradient $g$ is then obtained by differentiating $f(\\bar{A},A)$ with respect to $\\bar{A}$,\n", "\n", - "\"gradient\n", + "$$\n", + "\\begin{align}\n", + "g &= 2 \\times \\frac{\\partial f(\\bar{A},A) }{ \\partial \\bar{A} } \\\\\n", + "&= 2\\times \\frac{\\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle } {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle} - 2\\times \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle} {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle^2} \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle ,\\\\\n", + "&= 2\\times \\frac{\\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle - e \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle } {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle},\\\\\n", + "\\end{align}\n", + "$$\n", "\n", - "If we make sure that the MPS is properly normalised, and subtract the current energy density from every term in the hamiltonian, the gradient takes on the simple form\n", - "$$ g = 2 \\partial_{\\bar{A}} <\\Psi(\\bar{A})| h | \\Psi(A) >.$$\n", + "where we have clearly indicated $A$ and $\\bar{A}$ as independent variables and $e$ is the current energy density given by\n", + "\n", + "$$\n", + "e = \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle} {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle}.\n", + "$$\n", + "\n", + "If we make sure that the MPS is properly normalized and subtract the current energy density from every term in the hamiltonian, $h \\leftarrow h - e$, the gradient takes on the simple form\n", + "\n", + "$$ g = 2 \\times \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle.$$\n", "\n", "Thus, the gradient is obtained by differentiating the expression\n", "\n", - "\"grad2\"\n", + "
\"gradient\"
\n", + "\n", + "with respect to $\\bar{A}$. This gives rise to a sum over all sites, where in every term we differentiate with respect to one tensor $\\bar{A}$ in the bra layer. Differentiating with respect to one $\\bar{A}$ tensor amounts to leaving out that tensor, and interpreting the open legs as outgoing ones, i.e. each term looks like\n", "\n", - "with respect to $\\bar{A}$. Differentiating with respect to one $\\bar{A}$ tensor amounts to leaving out that tensor, and interpreting the open legs as outgoing ones, i.e. each term looks like\n", + "
\"gradient
\n", "\n", - "\"gradTerms\"" + "The full gradient is then obtained as an infinite sum over these terms. By dividing the terms into three different classes and doing some bookkeeping as illustrated below, we can eventually write this sum in a relatively simple closed form." ] }, { @@ -67,9 +83,9 @@ "metadata": {}, "source": [ "#### Terms of the 'center' kind\n", - "The first kind of terms that arise in the above expression for the gradient are obtained by removing one of the $\\bar{A}$ on the legs of the Hamiltonian term. This leads to\n", + "The first kind of terms that arise in the above expression for the gradient are obtained by differentiation with respect to an $\\bar{A}$ tensor on the legs of the Hamiltonian operator. This results in two 'center' terms\n", "\n", - "\"centerTerms\"\n" + "
\"center
" ] }, { @@ -88,21 +104,21 @@ " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " term1 : np.array(D, d, D)\n", + " term1 : np.array (D, d, D)\n", " first term of gradient,\n", " ordered left-mid-right.\n", - " term2 : np.array(D, d, D)\n", + " term2 : np.array (D, d, D)\n", " second term of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -115,35 +131,31 @@ "metadata": {}, "source": [ "#### Terms of the 'left' kind\n", - "For the terms where we omit an $\\bar{A}$ tensor to the left of the operator $h$, we can contract everything to the left of this missing $\\bar{A}$ tensor with the fixed point $l$, and everything to the right of the site containing the Hamiltonian is contracted with $r$.\n", + "For the terms where we leave out an $\\bar{A}$ tensor to the left of $h$, which we will call 'left' terms, we can contract everything to the left of this missing $\\bar{A}$ with the left fixed point $l$, while everything to the right of $h$ can be contracted with right fixed point $r$.\n", "\n", - "In between these two parts of the network, there is $E^n$, the transfermatrix multiplied $n$ times where $n$ is the separation between the two regions. Thus, summing all terms of the 'left' kind together means that we sum over $n$, and the relevant tensor becomes\n", + "In between these two outer parts of the network there remains a region where the regular MPS transfer matrix $E$ is applied a number of times. The action of this region is therefore captured by the operator $E^n$, where the power $n$ is determined by the seperation between the outer left and right parts for the specific term under consideration. When summing all left terms, the outer parts of the contraction always remain the same, while only the power $n$ differs for every term. Thus, summing all left terms corresponds to contracting the operator \n", "\n", - "$$E_\\text{sum} = 1 + E + E^2 + \\dots = \\frac{1}{1-E}.$$\n", + "$$E_\\text{sum} = 1 + E + E^2 + \\dots = \\frac{1}{1-E}$$\n", "\n", - "However, we must be careful when doing this, as the transfer matrix has leading eigenvalue $1$ (as defined by our normalization), this quantity will diverge. This can be solved by defining a regularized transfer matrix $\\tilde{E}$, substracting the divergent part:\n", + "between the left and right outer parts. Here, we have naively used the geometric series to write the sum in a closed form. However, since by our normalization the transfer matrix has leading eigenvalue $1$, this resulting expression will diverge and is therefore ill-defined. We can get around this by introducing a regularized transfer matrix $\\tilde{E}$ which is defined by subtracting the divergent part,\n", "\n", - "![regTransfer](img/regTransfer.png)\n", + "
\"regularized
\n", "\n", - "and only then taking the inverse.\n", + "Since we have already shifted the energy density to have a zero expectation value, $h \\leftarrow h - e$, it can easily be verified that the contribution of the leading divergent part vanishes in every left term, meaning that we can simply replace the original transfer matrix by its regularized version without changing any of the terms, and only then take the infinite sum which now has a well defined expression in terms of an inverse,\n", "\n", - "$$ \\tilde{E}_\\text{sum} = \\frac{1}{1-\\tilde{E}} =: (1 - E)^p $$\n", + "$$ E_\\text{sum} \\rightarrow \\frac{1}{1-\\tilde{E}} \\equiv (1 - E)^P ,$$\n", "\n", - "To ensure that this substraction has no effect on the outcome, we will redefine the Hamiltonian to have expectation value $0$. Such a constant shift in energy has no effect when we calculate the gradient. The benefit is that the divergent part we substracted from the transfermatrix vanishes.\n", + "where we have introduced the pseudo-inverse defined as $(1 - E)^P = (1-\\tilde{E})^{-1}$.\n", "\n", - "$$ \\tilde{H} = H - e $$\n", + "Using this notation we can define the partial contraction\n", "\n", - "Using this, we define the partial contraction\n", - "\n", - "![Rh](img/Rh.png)\n", + "
\"right
\n", "\n", "such that the sum of all left terms equals\n", "\n", - "![leftTerms](img/leftTerm.png)\n", - "\n", - "Implementing this inverse naively would be an ill-defined problem, so we resort to other algorithms to find $R_h$. Multiplying both sides with $(1-\\tilde{E})$ results in an equation of the form $Ax = b$, which may be solved for $x$ by implementing a Generalized Minimal RESidual (GMRES) algorithm. \n", + "
\"left
\n", "\n", - "Note that again such an algorithm requires only the action of A on a vector, not the actual matrix, such that its construction should again be implemented using a function handle." + "If we would compute the partial contraction $R_h$ directly by explicitly computing the pseudo-inverse, this would entail a computational complexity $O(D^6)$. Instead, we can define $L_h$ as the solution of a linear system by multiplying both sides of the corresponding definition by $(1-\\tilde{E})$. This results in an equation of the form $Ax = b$, which may be solved for $x$ by using Krylov-based iterative methods such as a Generalized Minimal RESidual (GMRES) algorithm. Note that these methods only require the action of $A = (1-\\tilde{E})$ on a vector and not the full matrix $A$. This action can again be supplied to the linear solver using a function handle." ] }, { @@ -154,7 +166,7 @@ "source": [ "def reducedHamUniform(h, A, l=None, r=None):\n", " \"\"\"\n", - " Regularise Hamiltonian such that its expectation value is 0.\n", + " Regularize Hamiltonian such that its expectation value is 0.\n", " \n", " Parameters\n", " ----------\n", @@ -162,14 +174,14 @@ " Hamiltonian that needs to be reduced,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", @@ -194,22 +206,22 @@ " Parameters\n", " ----------\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", - " v : np.array(D**2)\n", + " normalized.\n", + " v : np.array (D**2)\n", " right matrix of size (D, D) on which\n", " (1 - Etilde) acts,\n", " given as a vector of size (D**2,)\n", " \n", " Returns\n", " -------\n", - " vNew : np.array(D**2)\n", + " vNew : np.array (D**2)\n", " result of action of (1 - Etilde)\n", " on a right matrix,\n", " given as a vector of size (D**2,)\n", @@ -249,20 +261,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " result of contraction,\n", " ordered top-bottom.\n", " \"\"\"\n", @@ -300,20 +312,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " leftTerms : np.array(D, d, D)\n", + " leftTerms : np.array (D, d, D)\n", " left terms of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -326,13 +338,14 @@ "metadata": {}, "source": [ "#### Terms of the 'right' kind\n", - "In a very similar way, the terms where we leave out an $\\bar{A}$ to the right of the operator $h$, can be evaluated with the following contractions:\n", "\n", - "![Lh](img/Lh.png)\n", + "In a similar way, the terms where we leave out an $\\bar{A}$ to the right of $h$ can be evaluated by defining the partial contraction\n", "\n", - "such that the sum of all 'right' terms equals\n", + "
\"Lh\"
\n", "\n", - "![rightTerms](img/rightTerm.png)" + "which can again be found by solving a linear system, such that the sum of all right terms can be written as\n", + "\n", + "
\"rightTerms\"
" ] }, { @@ -348,22 +361,22 @@ " Parameters\n", " ----------\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", - " v : np.array(D**2)\n", + " normalized.\n", + " v : np.array (D**2)\n", " right matrix of size (D, D) on which\n", " (1 - Etilde) acts,\n", " given as a vector of size (D**2,)\n", " \n", " Returns\n", " -------\n", - " vNew : np.array(D**2)\n", + " vNew : np.array (D**2)\n", " result of action of (1 - Etilde)\n", " on a left matrix,\n", " given as a vector of size (D**2,)\n", @@ -387,20 +400,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " result of contraction,\n", " ordered bottom-top.\n", " \"\"\"\n", @@ -423,20 +436,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " rightTerms : np.array(D, d, D)\n", + " rightTerms : np.array (D, d, D)\n", " right terms of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -448,9 +461,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The gradient is then found by summing all these contributions:\n", + "#### The gradient\n", + "\n", + "The full gradient is then found by summing the contributions of all three types of terms,\n", "\n", - "\"gradient\"\n" + "
\"gradient\"
" ] }, { @@ -468,20 +483,20 @@ " h : np.array (d, d, d, d)\n", " Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " grad : np.array(D, d, D)\n", + " grad : np.array (D, d, D)\n", " Gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -494,11 +509,12 @@ "metadata": {}, "source": [ "### 2.2 Gradient descent algorithms\n", - "The simplest way to use this information to find the ground state of a Hamiltonian is then to use a method of gradient descent, or just by iterating, for a small step $\\epsilon$,\n", "\n", - "$$ A_{i+1} = A_i - \\epsilon g $$\n", + "The most straightforward way to use this expression for the gradient to find the ground state of a Hamiltonian is to implement a gradient-search method for minimizing the energy expecation value. The simplest such method is a steepest-descent search, where in every iteration the tensor $A$ is updated in the direction opposite to the gradient along a small step $\\varepsilon$,\n", "\n", - "in order to find the optimal MPS tensor $A^*$ for which the gradient vanishes. However, this can be further improved upon by using more advanced algorithms, as for example those already implemented by the scipy package scipy.optimize." + "$$ A_{i+1} = A_i - \\varepsilon g .$$\n", + "\n", + "This procedure is repeated until we find the optimal MPS tensor $A^*$ for which the gradient vanishes. This approach can be improved upon by resorting to other optimization schemes such a conjugate-gradient or quasi-Newton methods. Below we demonstrate both a simple steepest-descent with a fixed step size, as well as an approach using routines supplied by the scipy package in `scipy.optimize`." ] }, { @@ -507,21 +523,21 @@ "metadata": {}, "outputs": [], "source": [ - "def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4):\n", + "def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4, verbose=True):\n", " \"\"\"\n", " Find the ground state using gradient descent.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", " eps : float\n", " Stepsize.\n", " A0 : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " initial guess.\n", " tol : float\n", @@ -531,7 +547,7 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " ground state MPS,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -541,7 +557,7 @@ " # if no initial value, choose random\n", " if A0 is None:\n", " A0 = createMPS(D, d)\n", - " A0 = normaliseMPS(A0)\n", + " A0 = normalizeMPS(A0)\n", " \n", " # calculate gradient\n", " g = gradient(h, A0)\n", @@ -550,15 +566,15 @@ " A = A0\n", " \n", " i = 0\n", - " while not(np.all(np.abs(g) < tol)):\n", + " while not(np.linalg.norm(g) < tol):\n", " # do a step\n", " A = A - eps * g\n", - " A = normaliseMPS(A)\n", + " A = normalizeMPS(A)\n", " i += 1\n", " \n", - " if not(i % 100):\n", + " if verbose and not(i % 100):\n", " E = np.real(expVal2Uniform(h, A))\n", - " print('Current energy:', E)\n", + " print('iteration:\\t{:d}\\tenergy:\\t{:.12f}\\tgradient norm:\\t{:.4e}'.format(i, E, np.linalg.norm(g)))\n", " \n", " # calculate new gradient\n", " g = gradient(h, A)\n", @@ -586,14 +602,14 @@ "metadata": {}, "outputs": [], "source": [ - "def groundStateMinimise(h, D, A0=None, tol=1e-4):\n", + "def groundStateMinimize(h, D, A0=None, tol=1e-4):\n", " \"\"\"\n", " Find the ground state using a scipy minimizer.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", @@ -608,7 +624,7 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " ground state MPS,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -621,7 +637,7 @@ " \n", " Parameters\n", " ----------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " D : int\n", " Bond dimension.\n", @@ -630,7 +646,7 @@ " \n", " Returns\n", " -------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \"\"\"\n", @@ -649,13 +665,13 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor,\n", " ordered left-bottom-right\n", " \n", " Returns\n", " -------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " \"\"\"\n", " \n", @@ -671,7 +687,7 @@ " # if no initial MPS, take random one\n", " if A0 is None:\n", " A0 = createMPS(D, d)\n", - " A0 = normaliseMPS(A0)\n", + " A0 = normalizeMPS(A0)\n", " \n", " # define f for minimize in scipy\n", " def f(varA):\n", @@ -680,20 +696,20 @@ " \n", " Parameters\n", " ----------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " \n", " Returns\n", " -------\n", " e : float\n", " function value @varA\n", - " g : np.array(2 * D * d * D)\n", + " g : np.array (2 * D * d * D)\n", " gradient vector @varA\n", " \"\"\"\n", " \n", " # unwrap varA\n", " A = unwrapper(varA)\n", - " A = normaliseMPS(A)\n", + " A = normalizeMPS(A)\n", " \n", " # calculate fixed points\n", " l, r = fixedPoints(A)\n", @@ -721,7 +737,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "These methods can be tested for the specific case of the antiferromagnetic Heisenberg model. To this end we first define the spin 1 Heisenberg Hamiltonian:" + "To demonstrate these methods, we now have a look the specific case of the antiferromagnetic spin-1 Heisenberg model in one dimension. To this end we first define the spin-1 Heisenberg Hamiltonian:" ] }, { @@ -767,15 +783,15 @@ "source": [ "d, D = 3, 12\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "\n", "h = Heisenberg(-1, -1, -1, 0)\n", "\n", "# energy optimization using naive gradient descent\n", - "# for D=12 or higher: tolerance lower than 1e-3 gives very long runtimes\n", + "# for D=12 or higher: tolerance lower than 1e-2 gives very long runtimes\n", "print('Gradient descent optimization:\\n')\n", "t0 = time()\n", - "E1, A1 = groundStateGradDescent(h, D, eps=1e-1, A0=A, tol=1e-3, maxIter=1e4)\n", + "E1, A1 = groundStateGradDescent(h, D, eps=1e-1, A0=A, tol=1e-2, maxIter=1e4)\n", "print('Time until convergence:', time()-t0, 's')\n", "print('Computed energy:', E1, '\\n')\n", "\n", @@ -783,7 +799,7 @@ "# for D=12 and tolerance 1e-5: runtime of somewhere around 100s\n", "print('Optimization using scipy minimize:\\n')\n", "t0 = time()\n", - "E2, A2 = groundStateMinimise(h, D, A0=A, tol=1e-4)\n", + "E2, A2 = groundStateMinimize(h, D, A0=A, tol=1e-4)\n", "print('Time until convergence:', time()-t0, 's')\n", "print('Computed energy:', E2, '\\n')" ] @@ -792,12 +808,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.3 VUMPS\n", - "In the previous section we have not made use of the fact that we can use specific gauges to optimalise the procedure. A variational ground-state optimization algorithm that does exploit the power of the mixed gauge is VUMPS, Variational Uniform Matrix Product States, described in Algorithm 4 in the lecture notes.\n", + "### 2.3 The VUMPS algorithm\n", "\n", - "In order to implement this algorithm, we repeat most of the steps of the previous sectionm however now working with the mixed gauge.\n", + "In the previous section we have derived an expression for the gradient starting from an MPS in the uniform gauge, which corresponds to an object that lives in the space of MPS tensors. We now discuss how to improve upon direct optimization schemes based on this form of the gradient by exploiting the structure of the MPS manifold as well as the mixed gauge for MPS.\n", "\n", - "We start off by implementing the regularisation of the two-site Hamiltonian, now using the mixed gauge algorithm:" + "Indeed, while the gradient in the above form indicates a direction in the space of complex tensors in which the energy decreases, intuitively it would make more sense if we could find a way to interpret the gradient as a direction *along the MPS manifold* along which we can decrease the energy. This can be achieved by interpreting the gradient as a *tangent vector in the tangent space to the MPS manifold*. By formulating the energy optimization in terms of this tangent space gradient written in mixed gauge, one arives at the [VUMPS](https://doi.org/10.1103/PhysRevB.97.045145) algorithm (which stand for 'variational uniform matrix product states'). The precise derivation of the tangent space gradient in mixed gauge falls beyond the scope of this tutorial, and can be found in the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7). Instead we will simply illustrate the implementation of the VUMPS algorithm given the mixed gauge tangent space gradient.\n", + "\n", + "Most of the following required steps will be reminiscent of those outlined above, where we now consistently work in the mixed gauge. We start off by implementing the regularization of the two-site Hamiltonian in the mixed gauge." ] }, { @@ -808,18 +825,18 @@ "source": [ "def reducedHamMixed(h, Ac, Ar):\n", " \"\"\"\n", - " Regularise Hamiltonian such that its expectation value is 0.\n", + " Regularize Hamiltonian such that its expectation value is 0.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", " Hamiltonian that needs to be reduced,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right gauged.\n", @@ -838,39 +855,61 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Then, we want to calculate the gradient in the mixed gauge. The expression for the gradient can be found by making use of the tangent space projector, such that the final expression is\n", + "The variational optimum of the energy is characterized by the condition that the gradient is zero at this point. Writing the tangent space gradient as $G$, we now wish to formulate an algorithm which minimizes the error measure\n", + "\n", + "$$ \\varepsilon = \\left( \\boldsymbol{G}^\\dagger \\boldsymbol{G} \\right)^{1/2} $$\n", + "\n", + "in an efficient way. The explicit form of the tangent space gradient in mixed gauge is given by\n", "\n", - "$$ G = A^\\prime_{A_C} - A_L C^\\prime, $$\n", - "where the primed factors are defined as\n", + "$$ G = A^\\prime_{C} - A_L C^\\prime = A^\\prime_{C} - C^\\prime A_R, $$\n", "\n", + "where $A^\\prime_{C}$ and $C^\\prime$ are defined as\n", "\n", - "![Acprime](img/Acprime.png)\n", + "
\"Ac
\n", "\n", + "and\n", + "\n", + "
\"C
\n", "\n", - "![Cprime](img/Cprime.png)\n", + "Here, we again use $L_h$ and $R_h$ to indicate the partial contractions\n", "\n", - "If we define effective hamiltonians $H_{A_C}(\\bullet)$ and $H_C(\\bullet)$ such that \n", + "
\"Lh
\n", + "\n", + "and\n", "\n", - "$$ A_C^\\prime = H_{A_C}(A_C) $$\n", - "$$ C^\\prime = H_C(C), $$\n", + "
\"Rh
\n", "\n", - "We characterise an optimal MPS with the consistency equations for the mixed gauge, supplemented by\n", + "where the transfer matrices $E^L_L$ and $E^R_R$ appearing in these expressions now contain only left-gauged and right-gauged MPS tensors $A_L$ and $A_R$ respectively.\n", "\n", - "$$ A_LC = CA_R = A_C $$\n", - "$$ H_{A_C}(A_C) \\sim A_C $$\n", - "$$ H_C(C) \\sim C. $$" + "If we interpret the two terms appearing in the tangent space gradient as defining the effective Hamiltonians $H_{A_C}(\\cdot)$ and $H_C(\\cdot)$ such that\n", + "\n", + "$$\n", + "\\begin{align}\n", + "H_{A_C}(A_C) = A_C^\\prime \\\\\n", + "H_C(C) = C^\\prime ,\n", + "\\end{align}\n", + "$$\n", + "\n", + "we can characterize the variational optimum in terms of the fixed points of these operators. Indeed, since the tangent space gradient should be zero at the variational optimum, this point satisfies $A_C' = A_L C' = C' A_R$. This implies that the optimal MPS should obey the following set of equations,\n", + "\n", + "$$\n", + "\\begin{align}\n", + "H_{A_C}(A_C) \\propto A_C \\\\\n", + "H_C(C) \\propto C \\\\\n", + "A_C = A_L C = C A_R ,\n", + "\\end{align}\n", + "$$\n", + "\n", + "meaning that the optimal MPS should correspond to a fixed point of the effective Hamiltonians $H_{A_C}$ and $H_C$ and satisfy the mixed gauge condition. The VUMPS algorithm then consists of an iterative method for finding a set $\\{A_L, A_C, A_R, C\\}$ that satisfies these equations simultaneously." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Similar to before, we again have to compute contributions of right and left environment terms, which are now given by:\n", - "![Rhmixed](img/Rhmixed.png)\n", - "and\n", - "![LhMixed](img/Lhmixed.png)\n", + "#### Defining the required operators\n", "\n", - "In order to compute these tensors, we now require a function handle for the action of the right (resp. left) transfer matrix on a right (resp. left) matrix, with $A$ replaced by $A_L, A_R$. There is however no need to implement this action again for this specific case: we can reuse the implementations EtildeRight and EtildeLeft from above, if we take into account that the left (resp. right) fixed point of the right (resp. left) transfer matrix is precisely $C^\\dagger C$ (resp. $C C^\\dagger$); this can be easily verified using the property (15)." + "Similar to before, we again have to compute the contributions of the left and right environment terms $L_h$ and $R_h$ given above. We therefore require function handles defining the action of the left (resp. right) transfer matrix $E^L_L$ (resp. $E^R_R$) on a left (resp. right) matrix. To this end, we can simply reuse the implementations `EtildeLeft` and `EtildeRight` defined above, if we take into account that the left (resp. right) fixed point of $E^L_L$ (resp. $E^R_R$) is the identity while its right (resp. left) fixed point is precisely $C C^\\dagger$ (resp. $C^\\dagger C$). This last fact follows immediately from the mixed gauge condition." ] }, { @@ -879,21 +918,21 @@ "metadata": {}, "outputs": [], "source": [ - "def RhMixed(hTilde, Ar, C, tol=1e-3):\n", + "def LhMixed(hTilde, Al, C, tol=1e-5):\n", " \"\"\"\n", - " Calculate Rh, for a given MPS in mixed gauge.\n", + " Calculate Lh, for a given MPS in mixed gauge.\n", " \n", " Parameters\n", " ----------\n", " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Ar : np.array (D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", - " right-orthonormal.\n", - " C : np.array(D, D)\n", + " left-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " tol : float, optional\n", @@ -901,12 +940,13 @@ " \n", " Returns\n", " -------\n", - " Rh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " result of contraction,\n", - " ordered top-bottom.\n", + " ordered bottom-top.\n", + " \n", " \"\"\"\n", " \n", - " return Rh" + " return Lh" ] }, { @@ -915,21 +955,21 @@ "metadata": {}, "outputs": [], "source": [ - "def LhMixed(hTilde, Al, C, tol=1e-3):\n", + "def RhMixed(hTilde, Ar, C, tol=1e-5):\n", " \"\"\"\n", - " Calculate Lh, for a given MPS in mixed gauge.\n", + " Calculate Rh, for a given MPS in mixed gauge.\n", " \n", " Parameters\n", " ----------\n", " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array (D, d, D)\n", + " renormalized.\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", - " left-orthonormal.\n", - " C : np.array(D, D)\n", + " right-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " tol : float, optional\n", @@ -937,24 +977,23 @@ " \n", " Returns\n", " -------\n", - " Lh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " result of contraction,\n", - " ordered bottom-top.\n", - " \n", + " ordered top-bottom.\n", " \"\"\"\n", " \n", - " return Lh" + " return Rh" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We then implement the actions of the effective Hamiltonians $H_{A_C}$ and $H_{C}$ defined in equations (131) and (132) respectively:\n", + "Next we implement the actions of the effective Hamiltonians $H_{A_C}$ and $H_{C}$ defined above,\n", "\n", - "$H_{A_C}(A_C) = $ \"H_Ac\"\n", + "
\"H_Ac\"
\n", "\n", - "$H_{C}(C) = $ \"H_C\"" + "
\"H_C\"
" ] }, { @@ -963,7 +1002,6 @@ "metadata": {}, "outputs": [], "source": [ - "# define handle for effective hamiltonian for Ac\n", "def H_Ac(hTilde, Al, Ar, Lh, Rh, v):\n", " \"\"\"\n", " Action of the effective Hamiltonian for Ac (131) on a vector.\n", @@ -973,7 +1011,7 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", @@ -982,25 +1020,25 @@ " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", - " v : np.array(D, d, D)\n", + " v : np.array (D, d, D)\n", " Tensor of size (D, d, D)\n", "\n", " Returns\n", " -------\n", - " H_AcV : np.array(D, d, D)\n", + " H_AcV : np.array (D, d, D)\n", " Result of the action of H_Ac on the vector v,\n", " representing a tensor of size (D, d, D)\n", "\n", " \"\"\"\n", - " \n", - " # given as an example\n", "\n", + " # given as an example\n", + " \n", " # first term\n", " term1 = ncon((Al, v, np.conj(Al), hTilde), ([4, 2, 1], [1, 3, -3], [4, 5, -1], [2, 3, 5, -2]))\n", "\n", @@ -1034,7 +1072,7 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", @@ -1043,18 +1081,18 @@ " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", - " v : np.array(D, D)\n", + " v : np.array (D, D)\n", " Matrix of size (D, D)\n", "\n", " Returns\n", " -------\n", - " H_CV : np.array(D, D)\n", + " H_CV : np.array (D, D)\n", " Result of the action of H_C on the matrix v.\n", "\n", " \"\"\"\n", @@ -1066,11 +1104,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The vumps algorithm consists now of an iterative method for finding $\\{A_L, A_R, A_C, C\\}$ that satisfies the equations that define the optimum simultaneously. This is done as follows.\n", + "#### Implementing the VUMPS algorithm\n", + "\n", + "In order to find a set $\\{A_L^*, A_C^*, A_R^*, C^*\\}$ that satisfies the VUMPS fixed point equations given above, we use an iterative method in which each iteration consists of the following steps, each time starting from a given set $\\{A_L, A_C, A_R, C\\}$:\n", + "\n", + "1. Solve the eigenvalue equations for $H_{A_C}$ and $H_C$, giving new center tensors $\\tilde{A}_C$ and $\\tilde{C}$.\n", "\n", - "1. calcNewCenter:\n", + "2. From these new center tensors, construct a set $\\{\\tilde{A}_L, \\tilde{A}_R, \\tilde{A}_C, \\tilde{C}\\}$.\n", "\n", - "We start off the algorithm by finding two new tensors $\\tilde{A_C}$ and $\\tilde{C}$, by solving the eigenvalue problem defined by the effective Hamiltonians we implemented before." + "3. Update the set of tensors $\\{A_L, A_C, A_R, C\\} \\leftarrow \\{\\tilde{A}_L, \\tilde{A}_C, \\tilde{A}_R, \\tilde{C}\\}$ and evaluate the norm of the gradient $\\varepsilon = \\left | \\left | H_{A_C} (A_C) - A_L H_C(C) \\right | \\right |$.\n", + "\n", + "4. If the norm of the gradient lies above the given tolerance, repeat." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Updating the center tensors\n", + "\n", + "We start by defining a routine `calcNewCenter` which finds the new center tensors $\\tilde{A}_C$ and $\\tilde{C}$ by solving the eigenvalue problem defined by the effective Hamiltonians implemented above." ] }, { @@ -1079,7 +1132,7 @@ "metadata": {}, "outputs": [], "source": [ - "def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3):\n", + "def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-5):\n", " \"\"\"\n", " Find new guess for Ac and C as fixed points of the maps H_Ac and H_C.\n", " \n", @@ -1088,26 +1141,26 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array(D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", " tol : float, optional\n", @@ -1115,11 +1168,11 @@ " \n", " Returns\n", " -------\n", - " AcTilde : np.array(D, d, D)\n", + " AcTilde : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " \"\"\"\n", @@ -1131,18 +1184,31 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2. minAcC\n", + "##### Extract a new set of mixed-gauge MPS tensors\n", + "\n", + "Once we have new center tensors, we can use these to construct a new set of mixed-gauge MPS tensors. To do this in a stable way, we will determine the global updates $\\tilde{A}_L$ and $\\tilde{A}_R$ as the left and right isometric tensors that minimize\n", "\n", - "Once we have new center tensors, we may use these to construct new mixed gauge MPS tensors according to algorithm 5 in the lecture notes. This is done with the following left and right polar decompositions:\n", + "$$\n", + "\\begin{align}\n", + "\\varepsilon_L = \\min ||\\tilde{A}_C - \\tilde{A}_L \\tilde{C}||_2 \\\\\n", + "\\varepsilon_R = \\min ||\\tilde{A}_C - \\tilde{C} \\tilde{A}_L||_2 .\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ \\tilde{A_C} = U^l_{A_C} P^l_{A_C}, \\qquad \\tilde{C} = U^l_{C} P^l_{C} $$\n", - "$$ \\tilde{A_C} = P^r_{A_C} U^r_{A_C} , \\qquad \\tilde{C} = P^r_{C} U^r_{C} $$\n", + "This can be achieved in a robust and close to optimal way by making use of the left and right polar decompositions\n", "\n", - "We then obtain:\n", + "$$\n", + "\\begin{align}\n", + "\\tilde{A}_C = U^l_{A_C} P^l_{A_C}, \\qquad \\tilde{C} = U^l_{C} P^l_{C}, \\\\\n", + "\\tilde{A}_C = P^r_{A_C} U^r_{A_C} , \\qquad \\tilde{C} = P^r_{C} U^r_{C},\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ \\tilde{A_L} = U^l_{A_C} (U^l_C)^\\dagger, \\qquad \\tilde{A_R} = (U^r_C)^\\dagger U^r_{A_C}. $$\n", + "to obtain\n", "\n", - "In order to give the procedure some additional stability, we may consider using the $\\tilde{A_L}$ obtained through these polar decompositions to compute the tensors $\\tilde{A_R}$ and $\\tilde{A_C}$ by right orthonormalization of this $\\tilde{A_L}$. This approach ensures that the MPS is in proper mixed gauge at all times, which improves the convergence of the whole procedure." + "$$ \\tilde{A}_L = U^l_{A_C} (U^l_C)^\\dagger, \\qquad \\tilde{A}_R = (U^r_C)^\\dagger U^r_{A_C}. $$\n", + "\n", + "In order to give the procedure some additional stability, we may also choose to use the $\\tilde{A}_L$ obtained with these polar decompositions to compute the tensors $\\tilde{A}_R$ and $\\tilde{A}_C$ by right orthonormalization of this $\\tilde{A}_L$. This approach ensures that the MPS satisfies the mixed gauge condition at all times, improving the overal stabilitiy of the VUMPS algorithm. This procedure is implemented in the `minAcC` routine." ] }, { @@ -1151,36 +1217,36 @@ "metadata": {}, "outputs": [], "source": [ - "def minAcC(AcTilde, CTilde):\n", + "def minAcC(AcTilde, CTilde, tol=1e-5):\n", " \"\"\"\n", " Find Al and Ar corresponding to Ac and C, according to algorithm 5 in the lecture notes.\n", " \n", " Parameters\n", " ----------\n", - " AcTilde : np.array(D, d, D)\n", + " AcTilde : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " new guess for center gauge. \n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " new guess for center gauge\n", " \n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge. \n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " center gauge\n", @@ -1194,9 +1260,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3. gradientNorm\n", + "##### Evaluating the norm of the gradient\n", "\n", - "As a last step, we require the norm of the gradient, as in Eq. (130), in order to check if we have converged." + "As a last step, we use the routine `gradientNorm` to compute the norm of the tangent space gradient in order to check if the procedure has converged." ] }, { @@ -1214,26 +1280,26 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array(D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", " \n", @@ -1262,7 +1328,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, this allows to implement the VUMPS algorithm:" + "Finally, this allows to implement the VUMPS algorithm." ] }, { @@ -1271,14 +1337,14 @@ "metadata": {}, "outputs": [], "source": [ - "def vumps(h, D, A0=None, tol=1e-4):\n", + "def vumps(h, D, A0=None, tol=1e-4, tolFactor=1e-1, verbose=True):\n", " \"\"\"\n", " Find the ground state of a given Hamiltonian using VUMPS.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", @@ -1293,19 +1359,19 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " Al : np.array(D, d, D)\n", + " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " \"\"\"\n", @@ -1317,7 +1383,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can again test this implementation on the spin-1 Heisenberg antiferromagnet:" + "We can again test this implementation on the spin-1 Heisenberg antiferromagnet." ] }, { @@ -1328,14 +1394,14 @@ "source": [ "d, D = 3, 12\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "\n", "h = Heisenberg(-1, -1, -1, 0)\n", "\n", "# energy optimization using VUMPS\n", "print('Energy optimization using VUMPS:\\n')\n", "t0 = time()\n", - "E, Al, Ac, Ar, C = vumps(h, D, A0=A, tol=1e-4)\n", + "E, Al, Ac, Ar, C = vumps(h, D, A0=A, tol=1e-4, tolFactor=1e-2, verbose=True)\n", "print('\\nTime until convergence:', time()-t0, 's\\n')\n", "print('Computed energy:', E, '\\n')" ] @@ -1344,7 +1410,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once we have obtained this ground state MPS, it is worthwile to have a look at the corresponding entanglement spectrum." + "Having obtained this ground state MPS, it is worthwile to have a look at the corresponding entanglement spectrum." ] }, { @@ -1376,88 +1442,100 @@ "\n", "#### Quasiparticle ansatz\n", "\n", - "The methods described above can be further extended beyond the calculation of the ground state, and we now briefly show how one can also obtain quasiparticle excitations on top of this ground state. For this, we define the quasiparticle ansatz, given by\n", + "The methods described above can be extended beyond computing the ground state. We briefly discuss how one can also study excitations on top of a given ground state. For this, we introduce the MPS quasiparticle ansatz, given by\n", "\n", - "\"quasiparticle\"\n", + "
\"quasiparticle
\n", "\n", - "i.e. we change one $A$ tensor of the ground state at site $n$ and make a momentum superposition.\n", + "This ansatz cosists of defining a new state by changing one $A$ tensor of the ground state at site $n$ and taking a momentum superposition.\n", "\n", - "Before we start optimizing the tensor $B$, we first note that the excitation ansatw is, in fact, just a boosted version of a tangent vector. In particular, this allows for additional tricks and manipulations, similar to the previous sections. For example, the $B$ tensor has gauge degrees of freedom: the state is invariant under an additive gauge transformation of the form\n", + "Before describing how to optimize the tensor $B$, it is worthwile to investigate the corresponding variational space in a bit more detail. First, we note that this excitation ansatz can be interpreted as nothing more than a boosted version of a tangent vector to the MPS manifold. In particular, this means that we will be able to apply all kinds of useful tricks and manipulations to the tensor $B$ (cfr. the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7) for an introduction to tangent vectors and their properties). For example, we can see that $B$ has gauge degrees of freedom, as the corresponding excited state is invariant under an additive gauge transformation of the form\n", "\n", - "\"gaugeTransform\"\n", + "
\"gauge
\n", "\n", - "with $Y$ an arbitrary $D \\times D$ matrix. These correspond to zero modes in the variational subspace, which we can (and should) eliminate to make the variational optimization well-conditioned, by imposing a gauge fixing condition. We use the left gauge-fixing condition\n", + "where $Y$ is an arbitrary $D \\times D$ matrix. This gauge freedom can be eliminated, thereby removing the zero modes in the variational subspace, by imposing a *left gauge-fixing condition*\n", "\n", - "\"gauge\n", + "
\"gauge
\n", "\n", - "which is automatically satisfied if we parametrise the $B$ tensor as\n", + "If we parametrize the tensor $B$ as\n", "\n", - "\"Vlx\"\n", + "
\"VlX\"
\n", "\n", - "where we find Vl as the orthonormalised $D(d-1)$ - dimensional null space of the matrix \n", + "where $V_L$ is the $ D \\times d \\times D(d-1)$ tensor corresponding to the $D(d-1)$-dimensional null space of $A_L$ satisfying\n", "\n", - "\"AlVl\"\n", - "\"orthonormal\"" + "
\"Vl\"
\n", + "\n", + "then the gauge condition is automatically satisfied. In particular, this fixing of the gauge freedom ensures that the excitation is orthogonal to the ground state,\n", + "\n", + "
\"excitationOrth\"
\n", + "\n", + "In this form, we have put forward an ansatz for an excited state characterized by a single $D(d-1) \\times D$ matrix $X$ such that\n", + "\n", + "1. All gauge degrees of freedom are fixed.\n", + "2. All zero modes in the variational subspace are removed.\n", + "3. Calculating the norm becomes straightforward.\n", + "4. The excitation is orthogonal to the ground state." ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "#### Solving the eigenvalue problem\n", "\n", - "We have put forward an ansatz for excitations, characterised by a matrix $X$ such that\n", + "Having introduced an excitation ansatz which has all the right properties and is defined in terms of a single matrix $X$, all that is left to do is to minimize the energy function,\n", "\n", - "1. All gauge degrees of freedom are fixed.\n", - "2. All zero modes in the variational subspace are removed.\n", - "3. Calculating the norm becomes straightforward.\n", - "4. The excitation is orthogonal to the ground state, even at momentum $0$.\n", + "$$ \\min_{X} \\frac{\\left \\langle \\Phi_p(X) \\middle | H \\middle | \\Phi_p(X) \\right \\rangle}{\\left \\langle \\Phi_p(X) \\middle | \\Phi_p(X) \\right \\rangle}. $$\n", "\n", - "All we have left to do is minimising the energy function,\n", + "As both the numerator and the denominator are quadratic functions of the variational parameters $X$, this optimization problem reduces to solving a generalized eigenvalue problem\n", "\n", - "\"energy\n", + "$$ H_{\\text{eff}}(q) X = \\omega N_{\\text{eff}}(q) X, $$\n", "\n", - "As both numerator and denominator are quadratic functions of the variational parameters $X$, this optimization problem reduces to solving the generalised eigenvalue problem\n", + "where the effective energy and normalization matrices are defined as\n", "\n", - "$$ H_{eff}(q) X = \\omega N_{eff}(q) X, $$\n", + "$$\n", + "\\begin{align}\n", + "& 2\\pi\\delta(p-p') (\\boldsymbol{X'})^\\dagger H_{\\text{eff}}(q) \\boldsymbol{X} = \\left \\langle \\Phi_{p'}(X') \\middle | H \\middle | \\Phi_p(X) \\right \\rangle \\\\\n", + "& 2\\pi\\delta(p-p') (\\boldsymbol{X'})^\\dagger N_{\\text{eff}}(q) \\boldsymbol{X} = \\left \\langle \\Phi_{p'}(X') \\middle | \\Phi_p(X) \\right \\rangle,\n", + "\\end{align}\n", + "$$\n", "\n", - "where the effective energy and normalization matrix are defined as\n", + "and $\\boldsymbol{X}$ denotes a vectorized version of the matrix $X$. Since the overlap between two excited states is of the simple Euclidean form (cfr. the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7)), the effective normalization matrix reduces to the unit matrix, and we are left with an ordinary eigenvalue problem.\n", "\n", - "\"equations\"\n", + "To solve this eigenvalue problem, we need to find an expression for $H_{\\text{eff}}$, or rather of the action thereof on a trial vector $\\boldsymbol{Y}$. In order to find this action we first transform the vector $\\boldsymbol{X}$ into a tensor $B$ by contracting its corresponding matrix with the right leg of $V_L$, and then compute all different contributions that pop up in a matrix element of the form $\\left \\langle \\Phi_p(B') \\middle | H \\middle | \\Phi_p(B) \\right \\rangle$. This procedure is similar to what we have done when computing the gradient above, where we now need to take into account all different positions of the nearest-neighbor operator $h$ of the Hamiltonian, the input tensor $B$ and the output. Though slightly more involved than before, we can again define the following partion contractions\n", "\n", - "Now since the overlap between two excited states is of the simple Euclidean form, the effective normalization matrix reduces to the unit matrix, and we are left with an ordinary eigenvalue problem.\n", + "
\"LhMixed\"
\n", "\n", - "To solve this eigenvalue problem, we need to find an expression of $H_{eff}$, or rather of the action thereof on a trial vector." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The calculation is done by implementing the following partial contractions:\n", - "\n", - "\"Lh2\"\n", - "\"Rh2\"\n", - "\"LB\"\n", - "\"RB\"\n", - "\"L1\"\n", - "\"R1\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the above partial contractions, we find the action of the (reduced) Hamiltonian on a given input vector $B$ as\n", + "
\n", "\n", - "\"Heff\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The total procedure is captured by the following python function:" + "
\"RhMixed\"
\n", + "\n", + "
\n", + "\n", + "
\"LB\"
\n", + "\n", + "
\n", + "\n", + "
\"RB\"
\n", + "\n", + "
\n", + "\n", + "
\"L1\"
\n", + "\n", + "
\n", + "\n", + "
\"R1\"
\n", + "\n", + "Using these partial contractions, we find the action of the effective energy matrix on a given input tensor $B(Y)$ as\n", + "\n", + "
\"HeffExcitation\"
\n", + "\n", + "In the last step, we need the action of $H_{\\text{eff}}(p)$ on the vector $\\boldsymbol{Y}$, so we need to perform a last contraction\n", + "\n", + "
\"quasi_inveff\"
\n", + "\n", + "The total procedure is implemented in the routine `quasiParticle`." ] }, { @@ -1477,7 +1555,7 @@ " def ApplyHeff(x):\n", " \n", " x = np.reshape(x, (D*(d-1), D))\n", - " B = ncon((VL, x), ([-1, -2, 1], [1, -3]))\n", + " B = ncon((Vl, x), ([-1, -2, 1], [1, -3]))\n", " \n", " def ApplyELR(x, p):\n", " x = x.reshape((D,D))\n", @@ -1523,14 +1601,14 @@ " np.exp(-1j*p)*ncon((left,Ar),([-1,1],[1,-2,-3]))+\\\n", " np.exp(+1j*p)*ncon((Lh,Al,right),([-1,1],[1,-2,2],[2,-3]))\n", " \n", - " y = ncon((y, np.conj(VL)), ([1, 2, -2], [1, 2, -1]))\n", + " y = ncon((y, np.conj(Vl)), ([1, 2, -2], [1, 2, -1]))\n", " y = y.reshape(-1)\n", " \n", " return y\n", " \n", " # find reduced parametrization\n", " L = np.reshape(np.moveaxis(np.conj(Al), -1, 0), (D, D*d))\n", - " VL = np.reshape(null_space(L), (D, d, D*(d-1)))\n", + " Vl = np.reshape(null_space(L), (D, d, D*(d-1)))\n", " handleHeff = LinearOperator((D**2*(d-1), D**2*(d-1)), matvec=lambda x: ApplyHeff(x))\n", " e, x = eigs(handleHeff, k=num, which='SR')\n", " \n", @@ -1541,7 +1619,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can use this to compute the Haldane gap on top of the ground state for the spin-1 Heisenberg antiferromagnet we have just obtained using VUMPS:" + "We can use this to compute the Haldane gap on top of the ground state of the spin-1 Heisenberg antiferromagnet we have just obtained using VUMPS." ] }, { @@ -1566,7 +1644,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1580,7 +1658,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/chapter2Solution.ipynb b/python/chapter2Solution.ipynb index 2b10d46..88ff1fd 100644 --- a/python/chapter2Solution.ipynb +++ b/python/chapter2Solution.ipynb @@ -15,29 +15,30 @@ "from scipy.linalg import svd, polar, null_space\n", "from functools import partial\n", "from time import time\n", - "from tutorialFunctions import createMPS, normaliseMPS, fixedPoints, rightOrthonormalise, mixedCanonical, expVal2Uniform, expVal2Mixed" + "from tutorialFunctions import createMPS, normalizeMPS, fixedPoints, rightOrthonormalize, mixedCanonical, expVal2Uniform, expVal2Mixed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 2. Finding ground states of local Hamiltonians\n", "\n", - "Having found a way of encoding the states, the next step is to implement a way of finding the ground state. To this end, we consider a nearest-neighbour Hamiltonian H, of the form\n", - "$$H = \\sum_n h_{n, n+1}.$$\n", - "Here $h_{n,n+1}$ is a hermitian operator acting non-trivially on the sites $n$ and $n+1$. As in any variational approach, the variational principle serves as a guide for finding ground-state approximations, we want to minimise the expectation value of the energy,\n", - "$$ \\min_A \\frac{<\\Psi(\\bar{A})| H | \\Psi(A) >}{<\\Psi(\\bar{A})|\\Psi(A)>}. $$\n", + "In the previous chapter, we stated that uniform MPS can be used to efficiently approximate low-energy states of one-dimensional systems with gapped local Hamiltonians. Having defined ways of representing and manipulating MPS, the logical next step is therefore to have a look at how exactly they can be used to find ground states. To this end, we consider a nearest-neighbour Hamiltonian $H$ of the form\n", + "\n", + "$$H = \\sum_n h_{n, n+1}$$\n", + "\n", + "acting on an infinite one-dimensional system. Here, $h_{n,n+1}$ is a hermitian operator acting non-trivially on sites $n$ and $n+1$. As in any variational approach, the variational principle serves as a guide for finding ground-state approximations, dictating that the optimal MPS approximation of the ground state corresponds to the minimum of the expectation value of the energy,\n", "\n", - "In the thermodynamic limit the energy diverges with system size, but, since we are working with translation-invariant states only, we should rather minimise the energy density. We also will restrict to properly normalised states. Diagrammatically, the minimization problem is recast as\n", + "$$ \\min_A \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | H \\middle | \\Psi(A) \\right \\rangle}{\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle}. $$\n", "\n", - "\"minimization\n", + "In the thermodynamic limit the energy diverges with system size, but, since we are working with translation-invariant states only, we should rather minimize the energy density. In the following we will always restrict our discussion to preoperly normalized states. Diagrammatically, the minimization problem can then be recast as\n", "\n", - "We now turn to some numerical optimization strategies for minimizing this energy density directly." + "
\"minimization
\n", + "\n", + "In this notebook we illustratre numerical optimization strategies for minimizing this energy density directly." ] }, { @@ -46,20 +47,35 @@ "source": [ "### 2.1 The gradient\n", "\n", - "Any optimization problem relies on an efficient evaluation of the gradient, so the first thing to do is to compute this quantity (efficiently). The objective function $f$ that we want to minimize is a real function of the complex-valued $A$, or equivalently, the independent variables $A$ and $\\bar{A}$. The gradient $g$ is then obtained by differentiating $f(\\bar{A},A)$ with respect to $\\bar{A}$,\n", + "Any optimization problem relies on an efficient evaluation of the gradient, so the first thing to do is to compute this quantity. The objective function $f$ that we want to minimize is a real function of the complex-valued $A$, or equivalently, of the independent variables $A$ and $\\bar{A}$. The gradient $g$ is then obtained by differentiating $f(\\bar{A},A)$ with respect to $\\bar{A}$,\n", + "\n", + "$$\n", + "\\begin{align}\n", + "g &= 2 \\times \\frac{\\partial f(\\bar{A},A) }{ \\partial \\bar{A} } \\\\\n", + "&= 2\\times \\frac{\\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle } {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle} - 2\\times \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle} {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle^2} \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle ,\\\\\n", + "&= 2\\times \\frac{\\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle - e \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle } {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle},\\\\\n", + "\\end{align}\n", + "$$\n", "\n", - "\"gradient\n", + "where we have clearly indicated $A$ and $\\bar{A}$ as independent variables and $e$ is the current energy density given by\n", "\n", - "If we make sure that the MPS is properly normalised, and subtract the current energy density from every term in the hamiltonian, the gradient takes on the simple form\n", - "$$ g = 2 \\partial_{\\bar{A}} <\\Psi(\\bar{A})| h | \\Psi(A) >.$$\n", + "$$\n", + "e = \\frac{\\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle} {\\left \\langle \\Psi(\\bar{A}) \\middle | \\Psi(A) \\right \\rangle}.\n", + "$$\n", + "\n", + "If we make sure that the MPS is properly normalized and subtract the current energy density from every term in the hamiltonian, $h \\leftarrow h - e$, the gradient takes on the simple form\n", + "\n", + "$$ g = 2 \\times \\partial_{\\bar{A}} \\left \\langle \\Psi(\\bar{A}) \\middle | h \\middle | \\Psi(A) \\right \\rangle.$$\n", "\n", "Thus, the gradient is obtained by differentiating the expression\n", "\n", - "\"grad2\"\n", + "
\"gradient\"
\n", + "\n", + "with respect to $\\bar{A}$. This gives rise to a sum over all sites, where in every term we differentiate with respect to one tensor $\\bar{A}$ in the bra layer. Differentiating with respect to one $\\bar{A}$ tensor amounts to leaving out that tensor, and interpreting the open legs as outgoing ones, i.e. each term looks like\n", "\n", - "with respect to $\\bar{A}$. Differentiating with respect to one $\\bar{A}$ tensor amounts to leaving out that tensor, and interpreting the open legs as outgoing ones, i.e. each term looks like\n", + "
\"gradient
\n", "\n", - "\"gradTerms\"" + "The full gradient is then obtained as an infinite sum over these terms. By dividing the terms into three different classes and doing some bookkeeping as illustrated below, we can eventually write this sum in a relatively simple closed form." ] }, { @@ -67,9 +83,9 @@ "metadata": {}, "source": [ "#### Terms of the 'center' kind\n", - "The first kind of terms that arise in the above expression for the gradient are obtained by removing one of the $\\bar{A}$ on the legs of the Hamiltonian term. This leads to\n", + "The first kind of terms that arise in the above expression for the gradient are obtained by differentiation with respect to an $\\bar{A}$ tensor on the legs of the Hamiltonian operator. This results in two 'center' terms\n", "\n", - "\"centerTerms\"\n" + "
\"center
" ] }, { @@ -88,21 +104,21 @@ " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " term1 : np.array(D, d, D)\n", + " term1 : np.array (D, d, D)\n", " first term of gradient,\n", " ordered left-mid-right.\n", - " term2 : np.array(D, d, D)\n", + " term2 : np.array (D, d, D)\n", " second term of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -125,35 +141,31 @@ "metadata": {}, "source": [ "#### Terms of the 'left' kind\n", - "For the terms where we omit an $\\bar{A}$ tensor to the left of the operator $h$, we can contract everything to the left of this missing $\\bar{A}$ tensor with the fixed point $l$, and everything to the right of the site containing the Hamiltonian is contracted with $r$.\n", + "For the terms where we leave out an $\\bar{A}$ tensor to the left of $h$, which we will call 'left' terms, we can contract everything to the left of this missing $\\bar{A}$ with the left fixed point $l$, while everything to the right of $h$ can be contracted with right fixed point $r$.\n", "\n", - "In between these two parts of the network, there is $E^n$, the transfermatrix multiplied $n$ times where $n$ is the separation between the two regions. Thus, summing all terms of the 'left' kind together means that we sum over $n$, and the relevant tensor becomes\n", + "In between these two outer parts of the network there remains a region where the regular MPS transfer matrix $E$ is applied a number of times. The action of this region is therefore captured by the operator $E^n$, where the power $n$ is determined by the seperation between the outer left and right parts for the specific term under consideration. When summing all left terms, the outer parts of the contraction always remain the same, while only the power $n$ differs for every term. Thus, summing all left terms corresponds to contracting the operator \n", "\n", - "$$E_\\text{sum} = 1 + E + E^2 + \\dots = \\frac{1}{1-E}.$$\n", + "$$E_\\text{sum} = 1 + E + E^2 + \\dots = \\frac{1}{1-E}$$\n", "\n", - "However, we must be careful when doing this, as the transfer matrix has leading eigenvalue $1$ (as defined by our normalization), this quantity will diverge. This can be solved by defining a regularized transfer matrix $\\tilde{E}$, substracting the divergent part:\n", + "between the left and right outer parts. Here, we have naively used the geometric series to write the sum in a closed form. However, since by our normalization the transfer matrix has leading eigenvalue $1$, this resulting expression will diverge and is therefore ill-defined. We can get around this by introducing a regularized transfer matrix $\\tilde{E}$ which is defined by subtracting the divergent part,\n", "\n", - "![regTransfer](img/regTransfer.png)\n", + "
\"regularized
\n", "\n", - "and only then taking the inverse.\n", + "Since we have already shifted the energy density to have a zero expectation value, $h \\leftarrow h - e$, it can easily be verified that the contribution of the leading divergent part vanishes in every left term, meaning that we can simply replace the original transfer matrix by its regularized version without changing any of the terms, and only then take the infinite sum which now has a well defined expression in terms of an inverse,\n", "\n", - "$$ \\tilde{E}_\\text{sum} = \\frac{1}{1-\\tilde{E}} =: (1 - E)^p $$\n", + "$$ E_\\text{sum} \\rightarrow \\frac{1}{1-\\tilde{E}} \\equiv (1 - E)^P ,$$\n", "\n", - "To ensure that this substraction has no effect on the outcome, we will redefine the Hamiltonian to have expectation value $0$. Such a constant shift in energy has no effect when we calculate the gradient. The benefit is that the divergent part we substracted from the transfermatrix vanishes.\n", + "where we have introduced the pseudo-inverse defined as $(1 - E)^P = (1-\\tilde{E})^{-1}$.\n", "\n", - "$$ \\tilde{H} = H - e $$\n", + "Using this notation we can define the partial contraction\n", "\n", - "Using this, we define the partial contraction\n", - "\n", - "![Rh](img/Rh.png)\n", + "
\"right
\n", "\n", "such that the sum of all left terms equals\n", "\n", - "![leftTerms](img/leftTerm.png)\n", - "\n", - "Implementing this inverse naively would be an ill-defined problem, so we resort to other algorithms to find $R_h$. Multiplying both sides with $(1-\\tilde{E})$ results in an equation of the form $Ax = b$, which may be solved for $x$ by implementing a Generalized Minimal RESidual (GMRES) algorithm. \n", + "
\"left
\n", "\n", - "Note that again such an algorithm requires only the action of A on a vector, not the actual matrix, such that its construction should again be implemented using a function handle." + "If we would compute the partial contraction $R_h$ directly by explicitly computing the pseudo-inverse, this would entail a computational complexity $O(D^6)$. Instead, we can define $L_h$ as the solution of a linear system by multiplying both sides of the corresponding definition by $(1-\\tilde{E})$. This results in an equation of the form $Ax = b$, which may be solved for $x$ by using Krylov-based iterative methods such as a Generalized Minimal RESidual (GMRES) algorithm. Note that these methods only require the action of $A = (1-\\tilde{E})$ on a vector and not the full matrix $A$. This action can again be supplied to the linear solver using a function handle." ] }, { @@ -164,7 +176,7 @@ "source": [ "def reducedHamUniform(h, A, l=None, r=None):\n", " \"\"\"\n", - " Regularise Hamiltonian such that its expectation value is 0.\n", + " Regularize Hamiltonian such that its expectation value is 0.\n", " \n", " Parameters\n", " ----------\n", @@ -172,14 +184,14 @@ " Hamiltonian that needs to be reduced,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", @@ -216,22 +228,22 @@ " Parameters\n", " ----------\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", - " v : np.array(D**2)\n", + " normalized.\n", + " v : np.array (D**2)\n", " right matrix of size (D, D) on which\n", " (1 - Etilde) acts,\n", " given as a vector of size (D**2,)\n", " \n", " Returns\n", " -------\n", - " vNew : np.array(D**2)\n", + " vNew : np.array (D**2)\n", " result of action of (1 - Etilde)\n", " on a right matrix,\n", " given as a vector of size (D**2,)\n", @@ -269,20 +281,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " result of contraction,\n", " ordered top-bottom.\n", " \"\"\"\n", @@ -318,20 +330,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " leftTerms : np.array(D, d, D)\n", + " leftTerms : np.array (D, d, D)\n", " left terms of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -354,13 +366,14 @@ "metadata": {}, "source": [ "#### Terms of the 'right' kind\n", - "In a very similar way, the terms where we leave out an $\\bar{A}$ to the right of the operator $h$, can be evaluated with the following contractions:\n", "\n", - "![Lh](img/Lh.png)\n", + "In a similar way, the terms where we leave out an $\\bar{A}$ to the right of $h$ can be evaluated by defining the partial contraction\n", "\n", - "such that the sum of all 'right' terms equals\n", + "
\"Lh\"
\n", "\n", - "![rightTerms](img/rightTerm.png)" + "which can again be found by solving a linear system, such that the sum of all right terms can be written as\n", + "\n", + "
\"rightTerms\"
" ] }, { @@ -376,22 +389,22 @@ " Parameters\n", " ----------\n", " A : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", - " v : np.array(D**2)\n", + " normalized.\n", + " v : np.array (D**2)\n", " right matrix of size (D, D) on which\n", " (1 - Etilde) acts,\n", " given as a vector of size (D**2,)\n", " \n", " Returns\n", " -------\n", - " vNew : np.array(D**2)\n", + " vNew : np.array (D**2)\n", " result of action of (1 - Etilde)\n", " on a left matrix,\n", " given as a vector of size (D**2,)\n", @@ -429,20 +442,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " result of contraction,\n", " ordered bottom-top.\n", " \"\"\"\n", @@ -478,20 +491,20 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " rightTerms : np.array(D, d, D)\n", + " rightTerms : np.array (D, d, D)\n", " right terms of gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -513,9 +526,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The gradient is then found by summing all these contributions:\n", + "#### The gradient\n", + "\n", + "The full gradient is then found by summing the contributions of all three types of terms,\n", "\n", - "\"gradient\"\n" + "
\"gradient\"
" ] }, { @@ -533,20 +548,20 @@ " h : np.array (d, d, d, d)\n", " Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", - " l : np.array(D, D), optional\n", + " l : np.array (D, D), optional\n", " left fixed point of transfermatrix,\n", - " normalised.\n", - " r : np.array(D, D), optional\n", + " normalized.\n", + " r : np.array (D, D), optional\n", " right fixed point of transfermatrix,\n", - " normalised.\n", + " normalized.\n", " \n", " Returns\n", " -------\n", - " grad : np.array(D, d, D)\n", + " grad : np.array (D, d, D)\n", " Gradient,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -555,7 +570,7 @@ " if l is None or r is None:\n", " l, r = fixedPoints(A)\n", " \n", - " # renormalise Hamiltonian\n", + " # renormalize Hamiltonian\n", " hTilde = reducedHamUniform(h, A, l, r)\n", " \n", " # find terms\n", @@ -573,11 +588,12 @@ "metadata": {}, "source": [ "### 2.2 Gradient descent algorithms\n", - "The simplest way to use this information to find the ground state of a Hamiltonian is then to use a method of gradient descent, or just by iterating, for a small step $\\epsilon$,\n", "\n", - "$$ A_{i+1} = A_i - \\epsilon g $$\n", + "The most straightforward way to use this expression for the gradient to find the ground state of a Hamiltonian is to implement a gradient-search method for minimizing the energy expecation value. The simplest such method is a steepest-descent search, where in every iteration the tensor $A$ is updated in the direction opposite to the gradient along a small step $\\varepsilon$,\n", + "\n", + "$$ A_{i+1} = A_i - \\varepsilon g .$$\n", "\n", - "in order to find the optimal MPS tensor $A^*$ for which the gradient vanishes. However, this can be further improved upon by using more advanced algorithms, as for example those already implemented by the scipy package scipy.optimize." + "This procedure is repeated until we find the optimal MPS tensor $A^*$ for which the gradient vanishes. This approach can be improved upon by resorting to other optimization schemes such a conjugate-gradient or quasi-Newton methods. Below we demonstrate both a simple steepest-descent with a fixed step size, as well as an approach using routines supplied by the scipy package in `scipy.optimize`." ] }, { @@ -586,21 +602,21 @@ "metadata": {}, "outputs": [], "source": [ - "def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4):\n", + "def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4, verbose=True):\n", " \"\"\"\n", " Find the ground state using gradient descent.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", " eps : float\n", " Stepsize.\n", " A0 : np.array (D, d, D)\n", - " normalised MPS tensor with 3 legs,\n", + " normalized MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " initial guess.\n", " tol : float\n", @@ -610,7 +626,7 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " ground state MPS,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -620,7 +636,7 @@ " # if no initial value, choose random\n", " if A0 is None:\n", " A0 = createMPS(D, d)\n", - " A0 = normaliseMPS(A0)\n", + " A0 = normalizeMPS(A0)\n", " \n", " # calculate gradient\n", " g = gradient(h, A0)\n", @@ -629,15 +645,15 @@ " A = A0\n", " \n", " i = 0\n", - " while not(np.all(np.abs(g) < tol)):\n", + " while not(np.linalg.norm(g) < tol):\n", " # do a step\n", " A = A - eps * g\n", - " A = normaliseMPS(A)\n", + " A = normalizeMPS(A)\n", " i += 1\n", " \n", - " if not(i % 100):\n", + " if verbose and not(i % 100):\n", " E = np.real(expVal2Uniform(h, A))\n", - " print('Current energy:', E)\n", + " print('iteration:\\t{:d}\\tenergy:\\t{:.12f}\\tgradient norm:\\t{:.4e}'.format(i, E, np.linalg.norm(g)))\n", " \n", " # calculate new gradient\n", " g = gradient(h, A)\n", @@ -665,14 +681,14 @@ "metadata": {}, "outputs": [], "source": [ - "def groundStateMinimise(h, D, A0=None, tol=1e-4):\n", + "def groundStateMinimize(h, D, A0=None, tol=1e-4):\n", " \"\"\"\n", " Find the ground state using a scipy minimizer.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", @@ -687,7 +703,7 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " ground state MPS,\n", " ordered left-mid-right.\n", " \"\"\"\n", @@ -700,7 +716,7 @@ " \n", " Parameters\n", " ----------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " D : int\n", " Bond dimension.\n", @@ -709,7 +725,7 @@ " \n", " Returns\n", " -------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right.\n", " \"\"\"\n", @@ -728,13 +744,13 @@ " \n", " Parameters\n", " ----------\n", - " A : np.array(D, d, D)\n", + " A : np.array (D, d, D)\n", " MPS tensor,\n", " ordered left-bottom-right\n", " \n", " Returns\n", " -------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " \"\"\"\n", " \n", @@ -750,7 +766,7 @@ " # if no initial MPS, take random one\n", " if A0 is None:\n", " A0 = createMPS(D, d)\n", - " A0 = normaliseMPS(A0)\n", + " A0 = normalizeMPS(A0)\n", " \n", " # define f for minimize in scipy\n", " def f(varA):\n", @@ -759,20 +775,20 @@ " \n", " Parameters\n", " ----------\n", - " varA : np.array(2 * D * d * D)\n", + " varA : np.array (2 * D * d * D)\n", " MPS tensor in real vector form.\n", " \n", " Returns\n", " -------\n", " e : float\n", " function value @varA\n", - " g : np.array(2 * D * d * D)\n", + " g : np.array (2 * D * d * D)\n", " gradient vector @varA\n", " \"\"\"\n", " \n", " # unwrap varA\n", " A = unwrapper(varA)\n", - " A = normaliseMPS(A)\n", + " A = normalizeMPS(A)\n", " \n", " # calculate fixed points\n", " l, r = fixedPoints(A)\n", @@ -800,7 +816,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "These methods can be tested for the specific case of the antiferromagnetic Heisenberg model. To this end we first define the spin 1 Heisenberg Hamiltonian:" + "To demonstrate these methods, we now have a look the specific case of the antiferromagnetic spin-1 Heisenberg model in one dimension. To this end we first define the spin-1 Heisenberg Hamiltonian:" ] }, { @@ -846,15 +862,15 @@ "source": [ "d, D = 3, 12\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "\n", "h = Heisenberg(-1, -1, -1, 0)\n", "\n", "# energy optimization using naive gradient descent\n", - "# for D=12 or higher: tolerance lower than 1e-3 gives very long runtimes\n", + "# for D=12 or higher: tolerance lower than 1e-2 gives very long runtimes\n", "print('Gradient descent optimization:\\n')\n", "t0 = time()\n", - "E1, A1 = groundStateGradDescent(h, D, eps=1e-1, A0=A, tol=1e-3, maxIter=1e4)\n", + "E1, A1 = groundStateGradDescent(h, D, eps=1e-1, A0=A, tol=1e-2, maxIter=1e4)\n", "print('Time until convergence:', time()-t0, 's')\n", "print('Computed energy:', E1, '\\n')\n", "\n", @@ -862,7 +878,7 @@ "# for D=12 and tolerance 1e-5: runtime of somewhere around 100s\n", "print('Optimization using scipy minimize:\\n')\n", "t0 = time()\n", - "E2, A2 = groundStateMinimise(h, D, A0=A, tol=1e-4)\n", + "E2, A2 = groundStateMinimize(h, D, A0=A, tol=1e-4)\n", "print('Time until convergence:', time()-t0, 's')\n", "print('Computed energy:', E2, '\\n')" ] @@ -871,12 +887,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 2.3 VUMPS\n", - "In the previous section we have not made use of the fact that we can use specific gauges to optimalise the procedure. A variational ground-state optimization algorithm that does exploit the power of the mixed gauge is VUMPS, Variational Uniform Matrix Product States, described in Algorithm 4 in the lecture notes.\n", + "### 2.3 The VUMPS algorithm\n", "\n", - "In order to implement this algorithm, we repeat most of the steps of the previous sectionm however now working with the mixed gauge.\n", + "In the previous section we have derived an expression for the gradient starting from an MPS in the uniform gauge, which corresponds to an object that lives in the space of MPS tensors. We now discuss how to improve upon direct optimization schemes based on this form of the gradient by exploiting the structure of the MPS manifold as well as the mixed gauge for MPS.\n", "\n", - "We start off by implementing the regularisation of the two-site Hamiltonian, now using the mixed gauge algorithm:" + "Indeed, while the gradient in the above form indicates a direction in the space of complex tensors in which the energy decreases, intuitively it would make more sense if we could find a way to interpret the gradient as a direction *along the MPS manifold* along which we can decrease the energy. This can be achieved by interpreting the gradient as a *tangent vector in the tangent space to the MPS manifold*. By formulating the energy optimization in terms of this tangent space gradient written in mixed gauge, one arives at the [VUMPS](https://doi.org/10.1103/PhysRevB.97.045145) algorithm (which stand for 'variational uniform matrix product states'). The precise derivation of the tangent space gradient in mixed gauge falls beyond the scope of this tutorial, and can be found in the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7). Instead we will simply illustrate the implementation of the VUMPS algorithm given the mixed gauge tangent space gradient.\n", + "\n", + "Most of the following required steps will be reminiscent of those outlined above, where we now consistently work in the mixed gauge. We start off by implementing the regularization of the two-site Hamiltonian in the mixed gauge." ] }, { @@ -887,18 +904,18 @@ "source": [ "def reducedHamMixed(h, Ac, Ar):\n", " \"\"\"\n", - " Regularise Hamiltonian such that its expectation value is 0.\n", + " Regularize Hamiltonian such that its expectation value is 0.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", " Hamiltonian that needs to be reduced,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauged.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right gauged.\n", @@ -925,39 +942,61 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Then, we want to calculate the gradient in the mixed gauge. The expression for the gradient can be found by making use of the tangent space projector, such that the final expression is\n", + "The variational optimum of the energy is characterized by the condition that the gradient is zero at this point. Writing the tangent space gradient as $G$, we now wish to formulate an algorithm which minimizes the error measure\n", + "\n", + "$$ \\varepsilon = \\left( \\boldsymbol{G}^\\dagger \\boldsymbol{G} \\right)^{1/2} $$\n", + "\n", + "in an efficient way. The explicit form of the tangent space gradient in mixed gauge is given by\n", + "\n", + "$$ G = A^\\prime_{C} - A_L C^\\prime = A^\\prime_{C} - C^\\prime A_R, $$\n", "\n", - "$$ G = A^\\prime_{A_C} - A_L C^\\prime, $$\n", - "where the primed factors are defined as\n", + "where $A^\\prime_{C}$ and $C^\\prime$ are defined as\n", "\n", + "
\"Ac
\n", "\n", - "![Acprime](img/Acprime.png)\n", + "and\n", + "\n", + "
\"C
\n", + "\n", + "Here, we again use $L_h$ and $R_h$ to indicate the partial contractions\n", + "\n", + "
\"Lh
\n", + "\n", + "and\n", + "\n", + "
\"Rh
\n", "\n", + "where the transfer matrices $E^L_L$ and $E^R_R$ appearing in these expressions now contain only left-gauged and right-gauged MPS tensors $A_L$ and $A_R$ respectively.\n", "\n", - "![Cprime](img/Cprime.png)\n", + "If we interpret the two terms appearing in the tangent space gradient as defining the effective Hamiltonians $H_{A_C}(\\cdot)$ and $H_C(\\cdot)$ such that\n", "\n", - "If we define effective hamiltonians $H_{A_C}(\\bullet)$ and $H_C(\\bullet)$ such that \n", + "$$\n", + "\\begin{align}\n", + "H_{A_C}(A_C) = A_C^\\prime \\\\\n", + "H_C(C) = C^\\prime ,\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ A_C^\\prime = H_{A_C}(A_C) $$\n", - "$$ C^\\prime = H_C(C), $$\n", + "we can characterize the variational optimum in terms of the fixed points of these operators. Indeed, since the tangent space gradient should be zero at the variational optimum, this point satisfies $A_C' = A_L C' = C' A_R$. This implies that the optimal MPS should obey the following set of equations,\n", "\n", - "We characterise an optimal MPS with the consistency equations for the mixed gauge, supplemented by\n", + "$$\n", + "\\begin{align}\n", + "H_{A_C}(A_C) \\propto A_C \\\\\n", + "H_C(C) \\propto C \\\\\n", + "A_C = A_L C = C A_R ,\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ A_LC = CA_R = A_C $$\n", - "$$ H_{A_C}(A_C) \\sim A_C $$\n", - "$$ H_C(C) \\sim C. $$" + "meaning that the optimal MPS should correspond to a fixed point of the effective Hamiltonians $H_{A_C}$ and $H_C$ and satisfy the mixed gauge condition. The VUMPS algorithm then consists of an iterative method for finding a set $\\{A_L, A_C, A_R, C\\}$ that satisfies these equations simultaneously." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Similar to before, we again have to compute contributions of right and left environment terms, which are now given by:\n", - "![Rhmixed](img/Rhmixed.png)\n", - "and\n", - "![LhMixed](img/Lhmixed.png)\n", + "#### Defining the required operators\n", "\n", - "In order to compute these tensors, we now require a function handle for the action of the right (resp. left) transfer matrix on a right (resp. left) matrix, with $A$ replaced by $A_L, A_R$. There is however no need to implement this action again for this specific case: we can reuse the implementations EtildeRight and EtildeLeft from above, if we take into account that the left (resp. right) fixed point of the right (resp. left) transfer matrix is precisely $C^\\dagger C$ (resp. $C C^\\dagger$); this can be easily verified using the property (15)." + "Similar to before, we again have to compute the contributions of the left and right environment terms $L_h$ and $R_h$ given above. We therefore require function handles defining the action of the left (resp. right) transfer matrix $E^L_L$ (resp. $E^R_R$) on a left (resp. right) matrix. To this end, we can simply reuse the implementations `EtildeLeft` and `EtildeRight` defined above, if we take into account that the left (resp. right) fixed point of $E^L_L$ (resp. $E^R_R$) is the identity while its right (resp. left) fixed point is precisely $C C^\\dagger$ (resp. $C^\\dagger C$). This last fact follows immediately from the mixed gauge condition." ] }, { @@ -966,21 +1005,21 @@ "metadata": {}, "outputs": [], "source": [ - "def RhMixed(hTilde, Ar, C, tol=1e-3):\n", + "def LhMixed(hTilde, Al, C, tol=1e-5):\n", " \"\"\"\n", - " Calculate Rh, for a given MPS in mixed gauge.\n", + " Calculate Lh, for a given MPS in mixed gauge.\n", " \n", " Parameters\n", " ----------\n", " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Ar : np.array (D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", - " right-orthonormal.\n", - " C : np.array(D, D)\n", + " left-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " tol : float, optional\n", @@ -988,25 +1027,27 @@ " \n", " Returns\n", " -------\n", - " Rh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " result of contraction,\n", - " ordered top-bottom.\n", + " ordered bottom-top.\n", + " \n", " \"\"\"\n", " \n", - " D = Ar.shape[0]\n", + " D = Al.shape[0]\n", + " tol = max(tol, 1e-14)\n", " \n", - " # construct fixed points for Ar\n", - " l = np.conj(C).T @ C # left fixed point of right transfer matrix\n", - " r = np.eye(D) # right fixed point of right transfer matrix: right orthonormal\n", - "\n", + " # construct fixed points for Al\n", + " l = np.eye(D) # left fixed point of left transfer matrix: left orthonormal\n", + " r = C @ np.conj(C).T # right fixed point of left transfer matrix\n", + " \n", " # construct b\n", - " b = ncon((Ar, Ar, np.conj(Ar), np.conj(Ar), hTilde), ([-1, 2, 1], [1, 3, 4], [-2, 7, 6], [6, 5, 4], [2, 3, 7, 5]))\n", + " b = ncon((Al, Al, np.conj(Al), np.conj(Al), hTilde), ([4, 2, 1], [1, 3, -2], [4, 5, 6], [6, 7, -1], [2, 3, 5, 7]))\n", " \n", - " # solve ax = b for x\n", - " a = LinearOperator((D ** 2, D ** 2), matvec=partial(EtildeRight, Ar, l, r))\n", - " Rh = gmres(a, b.reshape(D ** 2), tol=tol)[0]\n", + " # solve a x = b for x\n", + " a = LinearOperator((D ** 2, D ** 2), matvec=partial(EtildeLeft, Al, l, r)) \n", + " Lh = gmres(a, b.reshape(D ** 2), tol=tol)[0]\n", " \n", - " return Rh.reshape((D, D))" + " return Lh.reshape((D, D))" ] }, { @@ -1015,21 +1056,21 @@ "metadata": {}, "outputs": [], "source": [ - "def LhMixed(hTilde, Al, C, tol=1e-3):\n", + "def RhMixed(hTilde, Ar, C, tol=1e-5):\n", " \"\"\"\n", - " Calculate Lh, for a given MPS in mixed gauge.\n", + " Calculate Rh, for a given MPS in mixed gauge.\n", " \n", " Parameters\n", " ----------\n", " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array (D, d, D)\n", + " renormalized.\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", - " left-orthonormal.\n", - " C : np.array(D, D)\n", + " right-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " tol : float, optional\n", @@ -1037,37 +1078,37 @@ " \n", " Returns\n", " -------\n", - " Lh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " result of contraction,\n", - " ordered bottom-top.\n", - " \n", + " ordered top-bottom.\n", " \"\"\"\n", " \n", - " D = Al.shape[0]\n", + " D = Ar.shape[0]\n", + " tol = max(tol, 1e-14)\n", " \n", - " # construct fixed points for Al\n", - " l = np.eye(D) # left fixed point of left transfer matrix: left orthonormal\n", - " r = C @ np.conj(C).T # right fixed point of left transfer matrix\n", - " \n", + " # construct fixed points for Ar\n", + " l = np.conj(C).T @ C # left fixed point of right transfer matrix\n", + " r = np.eye(D) # right fixed point of right transfer matrix: right orthonormal\n", + "\n", " # construct b\n", - " b = ncon((Al, Al, np.conj(Al), np.conj(Al), hTilde), ([4, 2, 1], [1, 3, -2], [4, 5, 6], [6, 7, -1], [2, 3, 5, 7]))\n", + " b = ncon((Ar, Ar, np.conj(Ar), np.conj(Ar), hTilde), ([-1, 2, 1], [1, 3, 4], [-2, 7, 6], [6, 5, 4], [2, 3, 7, 5]))\n", " \n", - " # solve a x = b for x\n", - " a = LinearOperator((D ** 2, D ** 2), matvec=partial(EtildeLeft, Al, l, r)) \n", - " Lh = gmres(a, b.reshape(D ** 2), tol=tol)[0]\n", + " # solve ax = b for x\n", + " a = LinearOperator((D ** 2, D ** 2), matvec=partial(EtildeRight, Ar, l, r))\n", + " Rh = gmres(a, b.reshape(D ** 2), tol=tol)[0]\n", " \n", - " return Lh.reshape((D, D))" + " return Rh.reshape((D, D))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We then implement the actions of the effective Hamiltonians $H_{A_C}$ and $H_{C}$ defined in equations (131) and (132) respectively:\n", + "Next we implement the actions of the effective Hamiltonians $H_{A_C}$ and $H_{C}$ defined above,\n", "\n", - "$H_{A_C}(A_C) = $ \"H_Ac\"\n", + "
\"H_Ac\"
\n", "\n", - "$H_{C}(C) = $ \"H_C\"" + "
\"H_C\"
" ] }, { @@ -1076,7 +1117,6 @@ "metadata": {}, "outputs": [], "source": [ - "# define handle for effective hamiltonian for Ac\n", "def H_Ac(hTilde, Al, Ar, Lh, Rh, v):\n", " \"\"\"\n", " Action of the effective Hamiltonian for Ac (131) on a vector.\n", @@ -1086,7 +1126,7 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", @@ -1095,18 +1135,18 @@ " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", - " v : np.array(D, d, D)\n", + " v : np.array (D, d, D)\n", " Tensor of size (D, d, D)\n", "\n", " Returns\n", " -------\n", - " H_AcV : np.array(D, d, D)\n", + " H_AcV : np.array (D, d, D)\n", " Result of the action of H_Ac on the vector v,\n", " representing a tensor of size (D, d, D)\n", "\n", @@ -1145,7 +1185,7 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", + " renormalized.\n", " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", @@ -1154,18 +1194,18 @@ " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right-orthonormal.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", - " v : np.array(D, D)\n", + " v : np.array (D, D)\n", " Matrix of size (D, D)\n", "\n", " Returns\n", " -------\n", - " H_CV : np.array(D, D)\n", + " H_CV : np.array (D, D)\n", " Result of the action of H_C on the matrix v.\n", "\n", " \"\"\"\n", @@ -1189,11 +1229,26 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The vumps algorithm consists now of an iterative method for finding $\\{A_L, A_R, A_C, C\\}$ that satisfies the equations that define the optimum simultaneously. This is done as follows.\n", + "#### Implementing the VUMPS algorithm\n", + "\n", + "In order to find a set $\\{A_L^*, A_C^*, A_R^*, C^*\\}$ that satisfies the VUMPS fixed point equations given above, we use an iterative method in which each iteration consists of the following steps, each time starting from a given set $\\{A_L, A_C, A_R, C\\}$:\n", + "\n", + "1. Solve the eigenvalue equations for $H_{A_C}$ and $H_C$, giving new center tensors $\\tilde{A}_C$ and $\\tilde{C}$.\n", + "\n", + "2. From these new center tensors, construct a set $\\{\\tilde{A}_L, \\tilde{A}_R, \\tilde{A}_C, \\tilde{C}\\}$.\n", "\n", - "1. calcNewCenter:\n", + "3. Update the set of tensors $\\{A_L, A_C, A_R, C\\} \\leftarrow \\{\\tilde{A}_L, \\tilde{A}_C, \\tilde{A}_R, \\tilde{C}\\}$ and evaluate the norm of the gradient $\\varepsilon = \\left | \\left | H_{A_C} (A_C) - A_L H_C(C) \\right | \\right |$.\n", "\n", - "We start off the algorithm by finding two new tensors $\\tilde{A_C}$ and $\\tilde{C}$, by solving the eigenvalue problem defined by the effective Hamiltonians we implemented before." + "4. If the norm of the gradient lies above the given tolerance, repeat." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Updating the center tensors\n", + "\n", + "We start by defining a routine `calcNewCenter` which finds the new center tensors $\\tilde{A}_C$ and $\\tilde{C}$ by solving the eigenvalue problem defined by the effective Hamiltonians implemented above." ] }, { @@ -1202,7 +1257,7 @@ "metadata": {}, "outputs": [], "source": [ - "def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3):\n", + "def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-5):\n", " \"\"\"\n", " Find new guess for Ac and C as fixed points of the maps H_Ac and H_C.\n", " \n", @@ -1211,26 +1266,26 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array(D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", " tol : float, optional\n", @@ -1238,17 +1293,18 @@ " \n", " Returns\n", " -------\n", - " AcTilde : np.array(D, d, D)\n", + " AcTilde : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " \"\"\"\n", " \n", " D = Al.shape[0]\n", " d = Al.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # calculate left en right environment if they are not given\n", " if Lh is None:\n", @@ -1286,18 +1342,31 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "2. minAcC\n", + "##### Extract a new set of mixed-gauge MPS tensors\n", + "\n", + "Once we have new center tensors, we can use these to construct a new set of mixed-gauge MPS tensors. To do this in a stable way, we will determine the global updates $\\tilde{A}_L$ and $\\tilde{A}_R$ as the left and right isometric tensors that minimize\n", "\n", - "Once we have new center tensors, we may use these to construct new mixed gauge MPS tensors according to algorithm 5 in the lecture notes. This is done with the following left and right polar decompositions:\n", + "$$\n", + "\\begin{align}\n", + "\\varepsilon_L = \\min ||\\tilde{A}_C - \\tilde{A}_L \\tilde{C}||_2 \\\\\n", + "\\varepsilon_R = \\min ||\\tilde{A}_C - \\tilde{C} \\tilde{A}_L||_2 .\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ \\tilde{A_C} = U^l_{A_C} P^l_{A_C}, \\qquad \\tilde{C} = U^l_{C} P^l_{C} $$\n", - "$$ \\tilde{A_C} = P^r_{A_C} U^r_{A_C} , \\qquad \\tilde{C} = P^r_{C} U^r_{C} $$\n", + "This can be achieved in a robust and close to optimal way by making use of the left and right polar decompositions\n", "\n", - "We then obtain:\n", + "$$\n", + "\\begin{align}\n", + "\\tilde{A}_C = U^l_{A_C} P^l_{A_C}, \\qquad \\tilde{C} = U^l_{C} P^l_{C}, \\\\\n", + "\\tilde{A}_C = P^r_{A_C} U^r_{A_C} , \\qquad \\tilde{C} = P^r_{C} U^r_{C},\n", + "\\end{align}\n", + "$$\n", "\n", - "$$ \\tilde{A_L} = U^l_{A_C} (U^l_C)^\\dagger, \\qquad \\tilde{A_R} = (U^r_C)^\\dagger U^r_{A_C}. $$\n", + "to obtain\n", "\n", - "In order to give the procedure some additional stability, we may consider using the $\\tilde{A_L}$ obtained through these polar decompositions to compute the tensors $\\tilde{A_R}$ and $\\tilde{A_C}$ by right orthonormalization of this $\\tilde{A_L}$. This approach ensures that the MPS is in proper mixed gauge at all times, which improves the convergence of the whole procedure." + "$$ \\tilde{A}_L = U^l_{A_C} (U^l_C)^\\dagger, \\qquad \\tilde{A}_R = (U^r_C)^\\dagger U^r_{A_C}. $$\n", + "\n", + "In order to give the procedure some additional stability, we may also choose to use the $\\tilde{A}_L$ obtained with these polar decompositions to compute the tensors $\\tilde{A}_R$ and $\\tilde{A}_C$ by right orthonormalization of this $\\tilde{A}_L$. This approach ensures that the MPS satisfies the mixed gauge condition at all times, improving the overal stabilitiy of the VUMPS algorithm. This procedure is implemented in the `minAcC` routine." ] }, { @@ -1306,36 +1375,36 @@ "metadata": {}, "outputs": [], "source": [ - "def minAcC(AcTilde, CTilde):\n", + "def minAcC(AcTilde, CTilde, tol=1e-5):\n", " \"\"\"\n", " Find Al and Ar corresponding to Ac and C, according to algorithm 5 in the lecture notes.\n", " \n", " Parameters\n", " ----------\n", - " AcTilde : np.array(D, d, D)\n", + " AcTilde : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " new guess for center gauge. \n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " new guess for center gauge\n", " \n", " Returns\n", " -------\n", - " Al : np.array(D, d, D)\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge. \n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right,\n", " center gauge\n", @@ -1344,6 +1413,7 @@ " \n", " D = AcTilde.shape[0]\n", " d = AcTilde.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # polar decomposition of Ac\n", " UlAc, _ = polar(AcTilde.reshape((D * d, D)))\n", @@ -1354,8 +1424,8 @@ " # construct Al\n", " Al = (UlAc @ np.conj(UlC).T).reshape(D, d, D)\n", " \n", - " # find corresponding Ar, C, and Ac through right orthonormalising Al\n", - " C, Ar = rightOrthonormalise(Al)\n", + " # find corresponding Ar, C, and Ac through right orthonormalizing Al\n", + " C, Ar = rightOrthonormalize(Al, CTilde, tol=tol)\n", " nrm = np.trace(C @ np.conj(C).T)\n", " C = C / np.sqrt(nrm)\n", " Ac = ncon((Al, C), ([-1, -2, 1], [1, -3]))\n", @@ -1367,9 +1437,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "3. gradientNorm\n", + "##### Evaluating the norm of the gradient\n", "\n", - "As a last step, we require the norm of the gradient, as in Eq. (130), in order to check if we have converged." + "As a last step, we use the routine `gradientNorm` to compute the norm of the tangent space gradient in order to check if the procedure has converged." ] }, { @@ -1387,26 +1457,26 @@ " hTilde : np.array (d, d, d, d)\n", " reduced Hamiltonian,\n", " ordered topLeft-topRight-bottomLeft-bottomRight,\n", - " renormalised.\n", - " Al : np.array(D, d, D)\n", + " renormalized.\n", + " Al : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor zith 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Lh : np.array(D, D)\n", + " Lh : np.array (D, D)\n", " left environment,\n", " ordered bottom-top.\n", - " Rh : np.array(D, D)\n", + " Rh : np.array (D, D)\n", " right environment,\n", " ordered top-bottom.\n", " \n", @@ -1433,7 +1503,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, this allows to implement the VUMPS algorithm:" + "Finally, this allows to implement the VUMPS algorithm." ] }, { @@ -1442,14 +1512,14 @@ "metadata": {}, "outputs": [], "source": [ - "def vumps(h, D, A0=None, tol=1e-4):\n", + "def vumps(h, D, A0=None, tol=1e-4, tolFactor=1e-1, verbose=True):\n", " \"\"\"\n", " Find the ground state of a given Hamiltonian using VUMPS.\n", " \n", " Parameters\n", " ----------\n", " h : np.array (d, d, d, d)\n", - " Hamiltonian to minimise,\n", + " Hamiltonian to minimize,\n", " ordered topLeft-topRight-bottomLeft-bottomRight.\n", " D : int\n", " Bond dimension\n", @@ -1464,19 +1534,19 @@ " -------\n", " E : float\n", " expectation value @ minimum\n", - " Al : np.array(D, d, D)\n", + " Al : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", + " Ar : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", " \"\"\"\n", @@ -1492,20 +1562,17 @@ " \n", " flag = True\n", " delta = 1e-5\n", + " i = 0\n", " \n", " while flag:\n", - " # regularise H\n", + " i += 1\n", + " \n", + " # regularize H\n", " hTilde = reducedHamMixed(h, Ac, Ar)\n", " \n", " # calculate environments\n", - " Lh = LhMixed(hTilde, Al, C, tol=delta/10)\n", - " Rh = RhMixed(hTilde, Ar, C, tol=delta/10)\n", - " \n", - " # calculate new center\n", - " AcTilde, CTilde = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, tol=delta/10)\n", - " \n", - " # find Al, Ar from Ac, C\n", - " AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde)\n", + " Lh = LhMixed(hTilde, Al, C, tol=delta*tolFactor)\n", + " Rh = RhMixed(hTilde, Ar, C, tol=delta*tolFactor)\n", " \n", " # calculate norm\n", " delta = gradientNorm(hTilde, Al, Ac, Ar, C, Lh, Rh)\n", @@ -1514,12 +1581,19 @@ " if delta < tol:\n", " flag = False\n", " \n", + " # calculate new center\n", + " AcTilde, CTilde = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, tol=delta*tolFactor)\n", + " \n", + " # find Al, Ar from AcTilde, CTilde\n", + " AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde, tol=delta*tolFactor**2)\n", + " \n", " # update tensors\n", " Al, Ac, Ar, C = AlTilde, AcTilde, ArTilde, CTilde\n", " \n", - " # print current energy, optional...\n", - " E = np.real(expVal2Mixed(h, Ac, Ar))\n", - " print('Current energy:', E)\n", + " # print current energy\n", + " if verbose:\n", + " E = np.real(expVal2Mixed(h, Ac, Ar))\n", + " print('iteration:\\t{:d}\\tenergy:\\t{:.12f}\\tgradient norm:\\t{:.4e}'.format(i, E, delta))\n", " \n", " return E, Al, Ac, Ar, C" ] @@ -1528,7 +1602,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can again test this implementation on the spin-1 Heisenberg antiferromagnet:" + "We can again test this implementation on the spin-1 Heisenberg antiferromagnet." ] }, { @@ -1539,14 +1613,14 @@ "source": [ "d, D = 3, 12\n", "A = createMPS(D, d)\n", - "A = normaliseMPS(A)\n", + "A = normalizeMPS(A)\n", "\n", "h = Heisenberg(-1, -1, -1, 0)\n", "\n", "# energy optimization using VUMPS\n", "print('Energy optimization using VUMPS:\\n')\n", "t0 = time()\n", - "E, Al, Ac, Ar, C = vumps(h, D, A0=A, tol=1e-4)\n", + "E, Al, Ac, Ar, C = vumps(h, D, A0=A, tol=1e-4, tolFactor=1e-2, verbose=True)\n", "print('\\nTime until convergence:', time()-t0, 's\\n')\n", "print('Computed energy:', E, '\\n')" ] @@ -1555,7 +1629,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Once we have obtained this ground state MPS, it is worthwile to have a look at the corresponding entanglement spectrum." + "Having obtained this ground state MPS, it is worthwile to have a look at the corresponding entanglement spectrum." ] }, { @@ -1587,88 +1661,100 @@ "\n", "#### Quasiparticle ansatz\n", "\n", - "The methods described above can be further extended beyond the calculation of the ground state, and we now briefly show how one can also obtain quasiparticle excitations on top of this ground state. For this, we define the quasiparticle ansatz, given by\n", + "The methods described above can be extended beyond computing the ground state. We briefly discuss how one can also study excitations on top of a given ground state. For this, we introduce the MPS quasiparticle ansatz, given by\n", + "\n", + "
\"quasiparticle
\n", + "\n", + "This ansatz cosists of defining a new state by changing one $A$ tensor of the ground state at site $n$ and taking a momentum superposition.\n", + "\n", + "Before describing how to optimize the tensor $B$, it is worthwile to investigate the corresponding variational space in a bit more detail. First, we note that this excitation ansatz can be interpreted as nothing more than a boosted version of a tangent vector to the MPS manifold. In particular, this means that we will be able to apply all kinds of useful tricks and manipulations to the tensor $B$ (cfr. the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7) for an introduction to tangent vectors and their properties). For example, we can see that $B$ has gauge degrees of freedom, as the corresponding excited state is invariant under an additive gauge transformation of the form\n", + "\n", + "
\"gauge
\n", "\n", - "\"quasiparticle\"\n", + "where $Y$ is an arbitrary $D \\times D$ matrix. This gauge freedom can be eliminated, thereby removing the zero modes in the variational subspace, by imposing a *left gauge-fixing condition*\n", "\n", - "i.e. we change one $A$ tensor of the ground state at site $n$ and make a momentum superposition.\n", + "
\"gauge
\n", "\n", - "Before we start optimizing the tensor $B$, we first note that the excitation ansatw is, in fact, just a boosted version of a tangent vector. In particular, this allows for additional tricks and manipulations, similar to the previous sections. For example, the $B$ tensor has gauge degrees of freedom: the state is invariant under an additive gauge transformation of the form\n", + "If we parametrize the tensor $B$ as\n", "\n", - "\"gaugeTransform\"\n", + "
\"VlX\"
\n", "\n", - "with $Y$ an arbitrary $D \\times D$ matrix. These correspond to zero modes in the variational subspace, which we can (and should) eliminate to make the variational optimization well-conditioned, by imposing a gauge fixing condition. We use the left gauge-fixing condition\n", + "where $V_L$ is the $ D \\times d \\times D(d-1)$ tensor corresponding to the $D(d-1)$-dimensional null space of $A_L$ satisfying\n", "\n", - "\"gauge\n", + "
\"Vl\"
\n", "\n", - "which is automatically satisfied if we parametrise the $B$ tensor as\n", + "then the gauge condition is automatically satisfied. In particular, this fixing of the gauge freedom ensures that the excitation is orthogonal to the ground state,\n", "\n", - "\"Vlx\"\n", + "
\"excitationOrth\"
\n", "\n", - "where we find Vl as the orthonormalised $D(d-1)$ - dimensional null space of the matrix \n", + "In this form, we have put forward an ansatz for an excited state characterized by a single $D(d-1) \\times D$ matrix $X$ such that\n", "\n", - "\"AlVl\"\n", - "\"orthonormal\"" + "1. All gauge degrees of freedom are fixed.\n", + "2. All zero modes in the variational subspace are removed.\n", + "3. Calculating the norm becomes straightforward.\n", + "4. The excitation is orthogonal to the ground state." ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "#### Solving the eigenvalue problem\n", "\n", - "We have put forward an ansatz for excitations, characterised by a matrix $X$ such that\n", + "Having introduced an excitation ansatz which has all the right properties and is defined in terms of a single matrix $X$, all that is left to do is to minimize the energy function,\n", "\n", - "1. All gauge degrees of freedom are fixed.\n", - "2. All zero modes in the variational subspace are removed.\n", - "3. Calculating the norm becomes straightforward.\n", - "4. The excitation is orthogonal to the ground state, even at momentum $0$.\n", + "$$ \\min_{X} \\frac{\\left \\langle \\Phi_p(X) \\middle | H \\middle | \\Phi_p(X) \\right \\rangle}{\\left \\langle \\Phi_p(X) \\middle | \\Phi_p(X) \\right \\rangle}. $$\n", "\n", - "All we have left to do is minimising the energy function,\n", + "As both the numerator and the denominator are quadratic functions of the variational parameters $X$, this optimization problem reduces to solving a generalized eigenvalue problem\n", "\n", - "\"energy\n", + "$$ H_{\\text{eff}}(q) X = \\omega N_{\\text{eff}}(q) X, $$\n", "\n", - "As both numerator and denominator are quadratic functions of the variational parameters $X$, this optimization problem reduces to solving the generalised eigenvalue problem\n", + "where the effective energy and normalization matrices are defined as\n", "\n", - "$$ H_{eff}(q) X = \\omega N_{eff}(q) X, $$\n", + "$$\n", + "\\begin{align}\n", + "& 2\\pi\\delta(p-p') (\\boldsymbol{X'})^\\dagger H_{\\text{eff}}(q) \\boldsymbol{X} = \\left \\langle \\Phi_{p'}(X') \\middle | H \\middle | \\Phi_p(X) \\right \\rangle \\\\\n", + "& 2\\pi\\delta(p-p') (\\boldsymbol{X'})^\\dagger N_{\\text{eff}}(q) \\boldsymbol{X} = \\left \\langle \\Phi_{p'}(X') \\middle | \\Phi_p(X) \\right \\rangle,\n", + "\\end{align}\n", + "$$\n", "\n", - "where the effective energy and normalization matrix are defined as\n", + "and $\\boldsymbol{X}$ denotes a vectorized version of the matrix $X$. Since the overlap between two excited states is of the simple Euclidean form (cfr. the [lecture notes](https://doi.org/10.21468/SciPostPhysLectNotes.7)), the effective normalization matrix reduces to the unit matrix, and we are left with an ordinary eigenvalue problem.\n", "\n", - "\"equations\"\n", + "To solve this eigenvalue problem, we need to find an expression for $H_{\\text{eff}}$, or rather of the action thereof on a trial vector $\\boldsymbol{Y}$. In order to find this action we first transform the vector $\\boldsymbol{X}$ into a tensor $B$ by contracting its corresponding matrix with the right leg of $V_L$, and then compute all different contributions that pop up in a matrix element of the form $\\left \\langle \\Phi_p(B') \\middle | H \\middle | \\Phi_p(B) \\right \\rangle$. This procedure is similar to what we have done when computing the gradient above, where we now need to take into account all different positions of the nearest-neighbor operator $h$ of the Hamiltonian, the input tensor $B$ and the output. Though slightly more involved than before, we can again define the following partion contractions\n", "\n", - "Now since the overlap between two excited states is of the simple Euclidean form, the effective normalization matrix reduces to the unit matrix, and we are left with an ordinary eigenvalue problem.\n", + "
\"LhMixed\"
\n", "\n", - "To solve this eigenvalue problem, we need to find an expression of $H_{eff}$, or rather of the action thereof on a trial vector." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The calculation is done by implementing the following partial contractions:\n", - "\n", - "\"Lh2\"\n", - "\"Rh2\"\n", - "\"LB\"\n", - "\"RB\"\n", - "\"L1\"\n", - "\"R1\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the above partial contractions, we find the action of the (reduced) Hamiltonian on a given input vector $B$ as\n", + "
\n", "\n", - "\"Heff\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The total procedure is captured by the following python function:" + "
\"RhMixed\"
\n", + "\n", + "
\n", + "\n", + "
\"LB\"
\n", + "\n", + "
\n", + "\n", + "
\"RB\"
\n", + "\n", + "
\n", + "\n", + "
\"L1\"
\n", + "\n", + "
\n", + "\n", + "
\"R1\"
\n", + "\n", + "Using these partial contractions, we find the action of the effective energy matrix on a given input tensor $B(Y)$ as\n", + "\n", + "
\"HeffExcitation\"
\n", + "\n", + "In the last step, we need the action of $H_{\\text{eff}}(p)$ on the vector $\\boldsymbol{Y}$, so we need to perform a last contraction\n", + "\n", + "
\"quasi_inveff\"
\n", + "\n", + "The total procedure is implemented in the routine `quasiParticle`." ] }, { @@ -1688,7 +1774,7 @@ " def ApplyHeff(x):\n", " \n", " x = np.reshape(x, (D*(d-1), D))\n", - " B = ncon((VL, x), ([-1, -2, 1], [1, -3]))\n", + " B = ncon((Vl, x), ([-1, -2, 1], [1, -3]))\n", " \n", " def ApplyELR(x, p):\n", " x = x.reshape((D,D))\n", @@ -1734,14 +1820,14 @@ " np.exp(-1j*p)*ncon((left,Ar),([-1,1],[1,-2,-3]))+\\\n", " np.exp(+1j*p)*ncon((Lh,Al,right),([-1,1],[1,-2,2],[2,-3]))\n", " \n", - " y = ncon((y, np.conj(VL)), ([1, 2, -2], [1, 2, -1]))\n", + " y = ncon((y, np.conj(Vl)), ([1, 2, -2], [1, 2, -1]))\n", " y = y.reshape(-1)\n", " \n", " return y\n", " \n", " # find reduced parametrization\n", " L = np.reshape(np.moveaxis(np.conj(Al), -1, 0), (D, D*d))\n", - " VL = np.reshape(null_space(L), (D, d, D*(d-1)))\n", + " Vl = np.reshape(null_space(L), (D, d, D*(d-1)))\n", " handleHeff = LinearOperator((D**2*(d-1), D**2*(d-1)), matvec=lambda x: ApplyHeff(x))\n", " e, x = eigs(handleHeff, k=num, which='SR')\n", " \n", @@ -1752,7 +1838,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can use this to compute the Haldane gap on top of the ground state for the spin-1 Heisenberg antiferromagnet we have just obtained using VUMPS:" + "We can use this to compute the Haldane gap on top of the ground state of the spin-1 Heisenberg antiferromagnet we have just obtained using VUMPS." ] }, { @@ -1777,7 +1863,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1791,7 +1877,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/chapter3.ipynb b/python/chapter3.ipynb index 19b0f16..8d39d7d 100644 --- a/python/chapter3.ipynb +++ b/python/chapter3.ipynb @@ -8,55 +8,135 @@ }, "outputs": [], "source": [ + "# do all necessary imports for this chapter\n", "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.linalg import sqrtm\n", "from scipy.sparse.linalg import eigs, LinearOperator\n", "from ncon import ncon\n", "from tutorialFunctions import createMPS, mixedCanonical, minAcC\n", - "from time import time\n", - "import matplotlib.pyplot as plt" + "from time import time" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 3. Transfer matrices and fixed points\n", "\n", - "### 3.1 The vumps algorithm for MPOs\n", + "### 3.1 MPS as fixed points of one-dimensional transfer matrices\n", + "\n", + "Matrix product states have been used extensively as a variational ansatz for ground states of local Hamiltonians. In recent years, it has been observed that they can also provide accurate approximations for fixed points of transfer matrices. In this notebook we investigate how tangent-space methods for MPS can be applied to one-dimensional transfer matrices.\n", + "\n", + "A one-dimensional transfer matrix in the form of a *matrix product operator* (MPO) is given by\n", + "\n", + "$$\n", + "T(O) = \\sum_{\\{i\\}, \\{j\\}} \\left( \\dots O^{i_{n-1}, j_{n-1}} O^{i_{n}, j_{n}} O^{i_{n+1}, j_{n+1}} \\dots \\right)\n", + "\\left | i_{n-1} \\right \\rangle \\left \\langle j_{n-1} \\right | \\otimes \\left | i_{n} \\right \\rangle \\left \\langle j_{n} \\right | \\otimes \\left | i_{n+1} \\right \\rangle \\left \\langle j_{n+1} \\right | \\dots \\;,\n", + "$$\n", + "\n", + "which can be represented diagrammatically as\n", + "\n", + "
\"transferMpo\"/
\n", + "\n", + "Such an object naturally arises in the context of infinite two-dimensional tensor networks, which can be interpreted as an infinite power of a corresponding one-dimensional row-to-row transfer matrix. This means that the contraction of the network is equivalent to finding the leading eigenvector $\\left | \\Psi \\right \\rangle$, referred to as the *fixed point*, of the transfer matrix which satisfies the equation\n", + "\n", + "$$T(O) \\left | \\Psi \\right \\rangle \\propto \\left | \\Psi \\right \\rangle.$$\n", + "\n", + "We can now propose an MPS ansatz for this fixed point, such that it obeys the eigenvalue equation\n", + "\n", + "
\"fixedPoint\"/
\n", + "\n", + "This MPS fixed point can be computed through a variation on the VUMPS algorithm introduced in the previous chapter, as will be explained in the next section. Suppose for now that we have managed to find an MPS representation $\\left | \\Psi(A) \\right \\rangle$ of the fixed point of $T(O)$. The corresponding eigenvalue $\\Lambda$ is then given by\n", + "\n", + "$$ \\Lambda = \\left \\langle \\Psi(\\bar{A}) \\middle | T \\middle | \\Psi(A) \\right \\rangle , $$\n", + "\n", + "assuming as always that we are dealing with a properly normalized MPS. If we bring $\\left | \\Psi(A) \\right \\rangle$ in mixed canonical form, then $\\Lambda$ is given by the network\n", + "\n", + "
\"lambda\"/
\n", + "\n", + "We can contract this resulting infinite network by finding the fixed points of the left and right channel operators $T_L$ and $T_R$ which are defined as\n", + "\n", + "
\"channels\"/
\n", "\n", - "Matrix product states have been used extensively as variational ansatz for ground states of local hamiltonians, but in the last years it has been observed that they can also provide accurate approximations for fixed points of transfer matrices. In this chapter we investigate tangent-space methods for one-dimensional transfer matrices.\n", + "The corresponding fixed points $F_L$ and $F_R$, also referred to as the left and right *environments*, satisfy\n", "\n", - "A one-dimensional transfer matrix in the form of matrix product operator (MPO) can be represented diagrammatically as\n", + "
\"environments\"/
\n", "\n", - "\"transferMPO\"\n", + "and can be normalized such that\n", "\n", - "Whenever we contract an infinite two-dimensional tensor network, we want to find the fixed point of this operator, i.e. we want to solve the fixed-point equation\n", + "
\"envNorm\"/
\n", "\n", - "$$ T(O) |\\Psi> \\propto |\\Psi> $$\n", + "The eigenvalues $\\lambda_L$ and $\\lambda_R$ have to correspond to the same value $\\lambda$ by construction, so that $\\Lambda$ is given by\n", "\n", - "such that we can collapse the vertical direction of the network.\n", + "$$ \\Lambda = \\lim_{N \\to \\infty} \\lambda^N ,$$\n", "\n", - "We now make the ansatz that the fixed point (leading eigenvector) of this operator is an MPS. Suppose now we have indeed found an MPS representation $|\\Psi(A)>$ of the fixed point of $T(O)$, then the eigenvalue is given by\n", + "where $N$ is the number of sites in the horizontal direction. Finally, we note that we can associate a *free energy density* $f = -\\frac{1}{N} \\log \\Lambda = -\\log \\lambda$ to this MPS fixed point.\n", "\n", - "$$ \\Lambda = <\\Psi(A)| T |\\Psi(A) > $$\n", "\n", - "Bringing the MPS in mixed canonical form, we write\n", + "### 3.2 The VUMPS algorithm for MPOs\n", "\n", - "\"partition\n", + "In order to formulate an algorithm for finding this MPS fixed point we start by stating the optimality condition it must satisfy in order to qualify as an approximate eigenvector of $T(O)$. Intuitively, what we would like to impose is that the residual $T(O) \\left| \\Psi \\right \\rangle - \\Lambda \\left | \\Psi \\right \\rangle$ is equal to zero. While this condition can never be satisfied exactly for any MPS approximation, we can however demand that the tangent space projection of this residual vanishes,\n", "\n", - "Again, contracting this infinite network requires that we find $F_L$ and $F_R$, the fixed points of the left and right channel operators, such that we may now collapse the horizontal direction. These are found by considering the following diagrams:\n", + "$$\n", + "\\mathcal{P}_A \\left( T(O) \\left| \\Psi \\right \\rangle - \\Lambda \\left | \\Psi \\right \\rangle \\right) = 0,\n", + "$$\n", "\n", - "\"Fl\"\n", - "\"Fr\"\n", + "where $\\mathcal{P}_A$ is the projector onto the tangent space to the MPS manifold at $A$. Similar to the Hamiltonian case, this projected residual can be characterized in terms of a tangent space gradient $G$,\n", "\n", - "Finally these are properly normalised if we set\n", - "\"FlFr\"\n", + "$$\n", + "G = A_C' - A_L C' = A_c' - C' A_R,\n", + "$$\n", + "\n", + "where $A_C'$ and $C'$ are now given by\n", + "\n", + "
\"AcPrime2\"/
\n", + "\n", + "and\n", + "\n", + "
\"CPrime2\"/
\n", + "\n", + "The optimality condition for the fixed point MPS is then equivalent to having $||G|| = 0$. In addition, if the MPO defining the transfer matrix is hermitian then it can be shown that the optimality condition corresponds to the variational minimum of the free energy density introduced above. Similar to the Hamiltonian case, if we introduce operators $O_{A_C}(\\cdot)$ and $O_C(\\cdot)$ such that\n", + "\n", + "$$\n", + "\\begin{align}\n", + "O_{A_C}(A_C) = A_C', \\\\\n", + "O_{C}(C) = C',\n", + "\\end{align}\n", + "$$\n", + "\n", + "then it follows that the fixed point is characterized by the set of equations\n", + "\n", + "$$\n", + "\\begin{align}\n", + "O_{A_C}(A_C) \\propto A_C, \\\\\n", + "O_{C}(C) \\propto C, \\\\\n", + "A_C = A_L C = C A_R.\n", + "\\end{align}\n", + "$$\n", + "\n", + "The VUMPS algorithm for MPOs then corresponds to an iterative scheme for finding the solutions to these equations starting from a given set $\\{A_L, A_C, A_R, C\\}$ which consists of the following steps:\n", + "\n", + "1. Find the left and right environments $F_L$ and $F_R$ and use these to solve the eigenvalue equations for $O_{A_C}$ and $O_C$, giving new center tensors $\\tilde{A}_C$ and $\\tilde{C}$.\n", + "\n", + "2. From these new center tensors, extract the $\\tilde{A}_L$ and $\\tilde{A}_R$ that minimize $||\\tilde{A}_C - \\tilde{A}_L \\tilde{C}||$ and $||\\tilde{A}_C - \\tilde{C} \\tilde{A}_L||$ using the `minAcC` routine from the previous chapter.\n", + "\n", + "3. Update the set of tensors $\\{A_L, A_C, A_R, C\\} \\leftarrow \\{\\tilde{A}_L, \\tilde{A}_C, \\tilde{A}_R, \\tilde{C}\\}$ and evaluate the optimality condition $\\varepsilon = \\left | \\left | O_{A_C} (A_C) - A_L O_C(C) \\right | \\right |$.\n", + "\n", + "4. If the optimality condition lies above the given tolerance, repeat." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Implementing the VUMPS algorithm\n", "\n", - "We therefore first require routines for finding and normalising these fixed points." + "We start by implementing the routines for finding and normalizing the left and right environments of the channel operators." ] }, { @@ -65,9 +145,9 @@ "metadata": {}, "outputs": [], "source": [ - "def leftFixedPointMPO(O, Al, tol):\n", + "def leftEnvironment(O, Al, tol):\n", " \"\"\"\n", - " Computes the left fixed point (250).\n", + " Computes the left environment as the fixed point of the left channel operator.\n", "\n", " Parameters\n", " ----------\n", @@ -85,8 +165,8 @@ " -------\n", " lam : float\n", " Leading left eigenvalue.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", "\n", " \"\"\"\n", @@ -95,19 +175,20 @@ " \n", " D = Al.shape[0]\n", " d = Al.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # construct handle for the action of the relevant operator and cast to linear operator\n", - " transferLeftHandleMPO = lambda v: (ncon((v.reshape((D,d,D)), Al, np.conj(Al), O),([5, 3, 1], [1, 2, -3], [5, 4, -1], [3, 2, -2, 4]))).reshape(-1)\n", - " transferLeftMPO = LinearOperator((D**2*d, D**2*d), matvec=transferLeftHandleMPO)\n", + " channelLeftHandle = lambda v: (ncon((v.reshape((D,d,D)), Al, np.conj(Al), O),([5, 3, 1], [1, 2, -3], [5, 4, -1], [3, 2, -2, 4]))).reshape(-1)\n", + " channelLeft = LinearOperator((D**2*d, D**2*d), matvec=channelLeftHandle)\n", " # compute the largest magnitude eigenvalue and corresponding eigenvector\n", - " lam, Fl = eigs(transferLeftMPO, k=1, which=\"LM\", tol=tol)\n", + " lam, Fl = eigs(channelLeft, k=1, which=\"LM\", tol=tol)\n", " \n", - " return lam, Fl.reshape((D,d,D))\n", + " return lam[0], Fl.reshape((D,d,D))\n", "\n", "\n", - "def rightFixedPointMPO(O, Ar, tol):\n", + "def rightEnvironment(O, Ar, tol):\n", " \"\"\"\n", - " Computes the right fixed point (250).\n", + " Computes the right environment as the fixed point of the right channel operator.\n", "\n", " Parameters\n", " ----------\n", @@ -125,8 +206,8 @@ " -------\n", " lam : float\n", " Leading right eigenvalue.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", "\n", " \"\"\"\n", @@ -134,65 +215,58 @@ " return lam, Fr\n", "\n", "\n", - "def overlapFixedPointsMPO(Fl, Fr, C):\n", + "def environments(O, Al, Ar, C, tol=1e-5):\n", " \"\"\"\n", - " Performs the contraction that gives the overlap of the fixed points (251).\n", + " Compute the left and right environments of the channel operators\n", + " as well as the corresponding eigenvalue.\n", "\n", " Parameters\n", " ----------\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", - " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", - " ordered top-middle-bottom.\n", - " C : np.array(D, D)\n", + " O : np.array (d, d, d, d)\n", + " MPO tensor,\n", + " ordered left-top-right-bottom.\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", + " ordered left-bottom-right,\n", + " left-orthonormal.\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", + " ordered left-bottom-right,\n", + " right-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", + " tol : float, optional\n", + " tolerance for eigenvalue solver\n", "\n", " Returns\n", " -------\n", - " overlap : float\n", - " Overlap of the fixed points.\n", + " lam : float\n", + " Leading eigenvalue of the channel\n", + " operators.\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", + " ordered bottom-middle-top.\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", + " ordered top-middle-bottom.\n", "\n", " \"\"\"\n", " \n", - " # given\n", - " \n", - " overlap = ncon((Fl, Fr, C, np.conj(C)), ([1, 3, 2], [5, 3, 4], [2, 5], [1, 4]))\n", - " \n", - " return overlap\n" + " return lam, Fl, Fr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We now want to use the VUMPS algorithm for finding this fixed point MPS of the MPO $T(O)$.\n", - "\n", - "To do so, we calculate the tangent-space projector in mixed gauge and again find two terms that can be characterised by the maps\n", - "\n", - "\"OAC\"\n", - "\"OC\"\n", + "Next we implement the action of the effective operators $O_{A_C}$ and $O_C$ on a given input tensor,\n", "\n", - "Together with the consistency conditions, a fixed point is thus characterised by the set of equations:\n", + "
\"O_Ac\"/
\n", "\n", - "$$ O_{A_C}(A_C) \\propto A_C $$\n", - "$$ O_C(C) \\propto C $$\n", - "$$ A_C = A_L C = CA_R $$\n", + "and\n", "\n", - "The vumps algorithm for MPO's can then be formulated in a similar way as in the Hamiltonian case:\n", - " (i) we start from a given MPS $\\{A^i_L , A^i_R , A^i_C , C^i \\}$\n", - " (ii) determine $F_L$ and $F_R$\n", - " (iii) solve the two eigenvalue equations obtaining $\\tilde{A}_C$ and $\\tilde{C}$, and\n", - " (iv) determine the $A^{i+1}_L$ and $A^{i+1}_R$ that minimize $||\\tilde{A} - A^{i+1}_L \\tilde{C}||$ and $||\\tilde{A} - \\tilde{C}A^{i+1}_R||$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can already determin the left and right fixed points, so we now need the action of the maps $O_{A_C}$ and $O_C$ on a given tensor:" + "
\"O_C\"/
" ] }, { @@ -201,70 +275,70 @@ "metadata": {}, "outputs": [], "source": [ - "def O_Ac(X, O, Fl, Fr, lam):\n", + "def O_Ac(x, O, Fl, Fr, lam):\n", " \"\"\"\n", - " Action of the map (256) on a given tensor.\n", + " Action of the operator O_Ac on a given tensor.\n", "\n", " Parameters\n", " ----------\n", - " X : np.array(D, d, D)\n", + " x : np.array (D, d, D)\n", " Tensor of size (D, d, D)\n", " O : np.array (d, d, d, d)\n", " MPO tensor,\n", " ordered left-top-right-bottom.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " lam : float\n", " Leading eigenvalue.\n", "\n", " Returns\n", " -------\n", - " Xnew : np.array(D, d, D)\n", - " Result of the action of O_Ac on the tensor X.\n", + " y : np.array (D, d, D)\n", + " Result of the action of O_Ac on the tensor x.\n", "\n", " \"\"\"\n", " \n", " # given as an example\n", " \n", - " Xnew = ncon((Fl, Fr, X, O),([-1, 2, 1], [4, 5, -3], [1, 3, 4], [2, 3, 5, -2])) / lam\n", + " y = ncon((Fl, Fr, x, O),([-1, 2, 1], [4, 5, -3], [1, 3, 4], [2, 3, 5, -2])) / lam\n", " \n", - " return Xnew\n", + " return y\n", "\n", "\n", - "def O_C(X, Fl, Fr):\n", + "def O_C(x, Fl, Fr):\n", " \"\"\"\n", - " Action of the map (257) on a given tensor.\n", + " Action of the operator O_C on a given tensor.\n", "\n", " Parameters\n", " ----------\n", - " X : np.array(D, D)\n", + " x : np.array (D, D)\n", " Tensor of size (D, D)\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", "\n", " Returns\n", " -------\n", - " Xnew : np.array(D, d, D)\n", - " Result of the action of O_C on the tensor X.\n", + " y : np.array (D, d, D)\n", + " Result of the action of O_C on the tensor x.\n", "\n", " \"\"\"\n", " \n", - " return Xnew" + " return y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Solving the eigenvalue equations for these operators gives an update for the center tensors, $\\tilde{A}_C$ and $\\tilde{C}$:" + "This then allows to define a new routine `calcNewCenterMpo` which finds the new center tensors $\\tilde{A}_C$ and $\\tilde{C}$ by solving the eigenvalue problems for $O_{A_C}$ and $O_C$." ] }, { @@ -273,7 +347,7 @@ "metadata": {}, "outputs": [], "source": [ - "def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-3):\n", + "def calcNewCenterMpo(O, Ac, C, Fl, Fr, lam, tol=1e-5):\n", " \"\"\"\n", " Find new guess for Ac and C as fixed points of the maps O_Ac and O_C.\n", " \n", @@ -282,18 +356,18 @@ " O : np.array (d, d, d, d)\n", " MPO tensor,\n", " ordered left-top-right-bottom.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " lam : float\n", " Leading eigenvalue.\n", @@ -302,11 +376,11 @@ " \n", " Returns\n", " -------\n", - " AcTilde : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " AcTilde : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", "\n", @@ -319,7 +393,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "And after retrieving $\\tilde{A}_C$ and $\\tilde{C}$ we can use the same 'minAcC()' function as in the case of Hamiltonian vumps to iterate the whole procedure until convergence. These building blocks now allow to implement the vumps algorithm for MPOs (algorithm 8):" + "Since the `minAcC` routine to extract a new set of mixed gauge MPS tensors from the updated $\\tilde{A}_C$ and $\\tilde{C}$ can be reused from the previous chapter, we now have all the tools needed to implement the VUMPS algorithm for MPOs." ] }, { @@ -328,7 +402,7 @@ "metadata": {}, "outputs": [], "source": [ - "def vumpsMPO(O, D, A0=None, tol=1e-4):\n", + "def vumpsMpo(O, D, A0=None, tol=1e-4, tolFactor=1e-2, verbose=True):\n", " \"\"\"\n", " Find the fixed point MPS of a given MPO using VUMPS.\n", " \n", @@ -350,26 +424,26 @@ " -------\n", " lam : float\n", " Leading eigenvalue.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " \n", " \"\"\"\n", @@ -381,22 +455,53 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The partition function is eventually given by the left and right fixed point eigenvalue lambda. To check this we define some functions calculating the free energy and the magnetization for the simulation and the exact solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.2 The 2d classical Ising model\n", + "### 3.2 The two-dimensional classical Ising model\n", + "\n", + "Next we apply the VUMPS algorithm for MPOs to the two-dimensional classical Ising model. To this end, consider classical spins $s_i = \\pm 1$ placed on the sites of an infinite square lattice which interact according to the nearest-neighbor Hamiltonian\n", + "\n", + "$$H = -J \\sum_{\\langle i,j \\rangle} s_i s_j \\,.$$\n", + "\n", + "We now wish to compute the corresponding partition function,\n", + "\n", + "$$ \\mathcal{Z} = \\sum_{\\{s_i\\}} \\text{e}^{-\\beta H({\\{s_i\\}})},$$\n", + "\n", + "using our freshly implemented algorithm. In order to do this we first rewrite this partition function as the contraction of an infinite two-dimensional tensor network,\n", + "\n", + "
\"Z\"/
\n", + "\n", + "where every edge in the network has bond dimension $d = 2$. Here, the black dots represent $ \\delta $-tensors\n", + "\n", + "
\"delta\"/
\n", + "\n", + "and the matrices $t$ encode the Boltzmann weights associated to each nearest-neighbor interaction,\n", + "\n", + "
\"t\"/
\n", + "\n", + "In order to arrive at a translation invariant network corresponding to a single hermitian MPO tensor we can take the matrix square root $q$ of each Boltzmann matrix such that\n", + "\n", + "
\"q\"/
\n", + "\n", + "and absorb the result symmetrically into the $\\delta$-tensors at each vertex to define the MPO tensor\n", + "\n", + "
\"O\"/
\n", + "\n", + "The partition function then becomes\n", + "\n", + "
\"Z2p\"/
\n", + "\n", + "which precisely corresponds to an infinite power of a row-to-row transfer matrix $T(O)$ of the kind defined above. We can therefore use the VUMPS algorithm to determine its fixed point, where the corresponding eigenvalue automatically gives us the free energy density as explained before.\n", + "\n", + "Having found this fixed point and its corresponding environments, we can easily evaluate expectation values of local observables. For example, say we want to find the expectation value of the magnetization at site $\\mu$,\n", "\n", - "We can use this algorithm to compute the partition function of the 2d classical Ising model, which can be written as a two-dimensional tensor network contraction. This is done by constructing a one-dimensional transfer matrix in the form of an MPO, and noting that the partition function is then an (infinite) product of these transfer matrices, stacked vertically.\n", + "$$ \\langle m \\rangle = \\frac{1}{\\mathcal{Z}} \\sum_{\\{s_i\\}} s_\\mu \\text{e}^{-\\beta H({\\{s_i\\}})}.$$\n", "\n", - "We start by defining the tensors that make up the transfer matrix for the Ising model. If we consider an infinite square lattice, we may simulate the model by placing a spin $1/2$ degree of freedom on each vertex, and then characterising the interactions by inserting a matrix $Q$ with Boltzmann weights on each of the edges. In the graphical language of tensor networks this corresponds to having a 4-legged 'delta tensor' on the vertices and a 2-legged $Q$ on the bonds.\n", + "We can access this quantity by introducing a magnetization tensor $M$, placing it at site $\\mu$ and contracting the partition function network around it as\n", "\n", - "If we want to rephrase this in terms of the transfer matrix we defined above, we split every bond interaction matrix over the two adjacent vertices and absorp them in the definition of the MPO tensor $O$. The partition function is given by contracting a tensor network consisting of all these rank 4 MPO tensors $O$, which have dimensions $(d,d,d,d)$. We can find the MPS fixed point of the corresponding transfer matrix using the vumps algorithm, which allows to perform this infinite contraction efficiently.\n", + "
\"Mexp\"/
\n", "\n", - "Below we define this Ising MPO operator $O$, along with a magnetization operator $M$ that can be obtained by contracting the spin-1/2 $Z$ operator into a given MPO tensor. We then construct routines that compute the Ising partition function and magnetization (as the expectation value of the $M$ operator) for a given fixed point MPS. This can be compared with the exact Onsager solution. Doing this for a range of different temperatures then allows us to compute the magnetization and free energy in the Ising model as a functions of temperature:" + "where the normalization factor $\\mathcal{Z}$ in the denominator is taken care of by the same contraction where $O$ is left at site $\\mu$ (which in this case is of course nothing more than the eigenvalue $\\lambda$). The magnetization tensor $M$ is defined entirely analogously to the MPO tensor $O$, but where instead of a regular $\\delta$-tensor the entry $i=j=k=l=1$ (using base-0 indexing) is set to $-1$ instead of $1$.\n", + "\n", + "We can now define the routines for constructing the Ising MPO and magnetization tensor an computing local expectation values, as well as a routine that implements [Onsager's exact solution for this model](https://en.wikipedia.org/wiki/Ising_model#Onsager's_exact_solution) to compare our results to." ] }, { @@ -425,13 +530,13 @@ " ordered left-top-right-bottom.\n", "\n", " \"\"\"\n", - " # basic vertex tensor\n", + " # basic vertex delta tensor\n", " vertex = np.zeros( (2,) * 4 )\n", " vertex[tuple([np.arange(2)] * 4)] = 1\n", - " # build square root of matrix of Boltzmann weights and pull into vertex edges\n", - " c, s = np.sqrt(np.cosh(beta*J)), np.sqrt(np.sinh(beta*J))\n", - " Qsqrt = 1/np.sqrt(2) * np.array([[c+s, c-s],[c-s, c+s]])\n", - " O = ncon((Qsqrt, Qsqrt, Qsqrt, Qsqrt, vertex), ([-1,1], [-2,2], [-3,3], [-4,4], [1,2,3,4]))\n", + " # take matrix square root of Boltzmann weights and pull into vertex edges\n", + " t = np.array([[np.exp(beta*J), np.exp(-beta*J)], [np.exp(-beta*J), np.exp(beta*J)]])\n", + " q = sqrtm(t)\n", + " O = ncon((q, q, q, q, vertex), ([-1, 1], [-2, 2], [-3, 3], [-4, 4], [1, 2, 3, 4]))\n", " return O\n", "\n", "\n", @@ -450,87 +555,56 @@ " Returns\n", " -------\n", " M : np.array (2, 2, 2, 2)\n", - " Magnetization MPO tensor,\n", + " Magnetization tensor,\n", " ordered left-top-right-bottom.\n", "\n", " \"\"\"\n", + " # basic vertex delta tensor\n", " vertex = np.zeros( (2,) * 4 )\n", " vertex[tuple([np.arange(2)] * 4)] = 1\n", - " Z = np.array([[1,0],[0,-1]])\n", - " c, s = np.sqrt(np.cosh(beta*J)), np.sqrt(np.sinh(beta*J))\n", - " Qsqrt = 1/np.sqrt(2) * np.array([[c+s, c-s],[c-s, c+s]])\n", - " vertexZ = ncon((Z, vertex), ([-1,1], [1,-2,-3,-4]))\n", - " M = ncon((Qsqrt, Qsqrt, Qsqrt, Qsqrt, vertexZ), ([-1,1], [-2,2], [-3,3], [-4,4], [1,2,3,4]))\n", + " # change sign of (1, 1, 1, 1) entry\n", + " vertex[1, 1, 1, 1] = -1;\n", + " # take matrix square root of Boltzmann weights and pull into vertex edges\n", + " t = np.array([[np.exp(beta*J), np.exp(-beta*J)], [np.exp(-beta*J), np.exp(beta*J)]])\n", + " q = sqrtm(t)\n", + " M = ncon((q, q, q, q, vertex), ([-1, 1], [-2, 2], [-3, 3], [-4, 4], [1, 2, 3, 4]))\n", " return M\n", "\n", "\n", - "def isingMagnetization(beta, J, Ac, Fl, Fr):\n", - " \"\"\"\n", - " Computes the expectation value of the magnetization in the Ising model\n", - " for a given temperature and coupling\n", - " \n", - " Parameters\n", - " ----------\n", - " beta : float\n", - " Inverse temperature.\n", - " J : float\n", - " Coupling strength.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor of the MPS fixed point,\n", - " with 3 legs ordered left-bottom-right,\n", - " center gauge.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", - " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", - " ordered top-middle-bottom.\n", - " \n", - " Returns\n", - " -------\n", - " M : float\n", - " Expectation value of the magnetization at the given temperature\n", - " and coupling.\n", - "\n", - " \"\"\"\n", - " return ncon((Fl, Ac, isingM(beta, J), np.conj(Ac), Fr), (\n", - " [1, 3, 2], [2,7,5],[3,7,8,6],[1,6,4], [5,8,4]))\n", - "\n", - "\n", - "def isingZ(beta, J, Ac, Fl, Fr):\n", + "def expValMpo(O, Ac, Fl, Fr):\n", " \"\"\"\n", - " Computes the Ising model partition function for a given temperature and\n", - " coupling\n", + " Gives the MPO tensor corresponding to the partition function of the 2d \n", + " classical Ising model at a given temperature and coupling, obtained by\n", + " distributing the Boltzmann weights evenly over all vertices.\n", " \n", " Parameters\n", " ----------\n", - " beta : float\n", - " Inverse temperature.\n", - " J : float\n", - " Coupling strength.\n", - " Ac : np.array(D, d, D)\n", + " O : np.array (2, 2, 2, 2)\n", + " local operator of which we want to\n", + " compute the expectation value,\n", + " ordered left-top-right-bottom.\n", + " Ac : np.array (D, d, D)\n", " MPS tensor of the MPS fixed point,\n", " with 3 legs ordered left-bottom-right,\n", " center gauge.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environmnt,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environmnt,\n", " ordered top-middle-bottom.\n", " \n", " Returns\n", " -------\n", - " Z : float\n", - " Value of the partition function at the given temperature and\n", - " coupling.\n", + " e : float\n", + " expectation value of the operator O.\n", + " \n", "\n", " \"\"\"\n", + " e = ncon((Fl, Ac, O, np.conj(Ac), Fr), (\n", + " [1, 3, 2], [2, 7, 5], [3, 7, 8, 6], [1, 6, 4], [5, 8, 4]))\n", " \n", - " Z = ncon((Fl, Ac, isingO(beta, J), np.conj(Ac), Fr), (\n", - " [1, 3, 2], [2,7,5],[3,7,8,6],[1,6,4], [5,8,4]))\n", - " \n", - " return Z\n", + " return e\n", "\n", "\n", "def isingExact(beta, J):\n", @@ -566,6 +640,13 @@ " return magnetization, free, energy" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now demonstrate the VUMPS algorithm for MPOs. We will fix $J = 1$ in the following, and investigate the behavior of the model as a function of temperature. Since we know the critical piont is located at $T_c = \\frac{2}{\\log\\left(1 + \\sqrt{2}\\right)} \\approx 2.26919$, let us first have a look at $T = 4$ and $T = 1$ far above and below the critical temperature, for which we expect a vanishing and non-vanishing magnetization respectively." + ] + }, { "cell_type": "code", "execution_count": null, @@ -575,11 +656,65 @@ "D = 12\n", "d = 2\n", "J = 1\n", + "tol = 1e-8\n", + "tolFactor = 1e-4\n", + "A0 = createMPS(D, d)\n", + "\n", + "T = 4\n", + "print('Running for T = {}\\n'.format(T))\n", + "beta = 1 / T\n", + "O = isingO(beta, J)\n", + "M = isingM(beta, J)\n", + "lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=A0, tol=tol, tolFactor=tolFactor, verbose=True)\n", + "mag = np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr))\n", + "magExact = isingExact(beta, J)[0]\n", + "freeEnergy = -np.log(lam)/beta\n", + "freeEnergyExact = isingExact(beta, J)[1]\n", + "print('\\nFree energy: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " freeEnergy, np.abs((freeEnergy - freeEnergyExact) / freeEnergyExact)))\n", + "print('Magnetization: {:.10f}\\n'.format(mag))\n", + "\n", + "T = 1\n", + "print('Running for T = {}\\n'.format(T))\n", + "beta = 1 / T\n", + "O = isingO(beta, J)\n", + "M = isingM(beta, J)\n", + "lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=A0, tol=tol, tolFactor=tolFactor, verbose=True)\n", + "mag = np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr))\n", + "magExact = isingExact(beta, J)[0]\n", + "freeEnergy = -np.log(lam)/beta\n", + "freeEnergyExact = isingExact(beta, J)[1]\n", + "print('\\nFree energy: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " freeEnergy, np.abs((freeEnergy - freeEnergyExact) / freeEnergyExact)))\n", + "print('Magnetization: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " mag, np.abs((mag - magExact) / magExact)))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We clearly see that far from the critical point the VUMPS algorithm achieves excellent agreement with the exact solution efficiently at very small bond dimensions.\n", "\n", - "print('Bond dimension: D =', D)\n", + "As a final demonstration, we compute the magnetization and free energy over a range from $T = 1$ to $T = 3.4$ and plot the results. Note that convergence of the algorithm slows down significantly near the critical point, as can be expected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "D = 12\n", + "d = 2\n", + "J = 1\n", + "\n", + "print('Bond dimension: D = {}\\n'.format(D))\n", "Al = createMPS(D, d)\n", "# optimization parameters\n", - "tol = 1e-5\n", + "tol = 1e-8\n", + "tolFactor = 1e-2\n", + "verbose = False\n", "\n", "Ts = np.linspace(1., 3.4, 100)\n", "magnetizations = []\n", @@ -590,15 +725,15 @@ "for T in Ts:\n", " beta = 1/T\n", " O = isingO(beta, J)\n", - " print('T={}'.format(T))\n", + " M = isingM(beta, J)\n", + " print('Running for T = {:.5f}'.format(T), end=\"\\r\")\n", " \n", - " lam, Al, Ac, Ar, C, Fl, Fr = vumpsMPO(O, D, A0=Al, tol=tol)\n", - " magnetizations.append(np.abs(isingMagnetization(beta, J, Ac, Fl, Fr)/isingZ(beta, J, Ac, Fl, Fr)))\n", + " lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=Al, tol=tol, tolFactor=tolFactor, verbose=verbose)\n", + " magnetizations.append(np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr)))\n", " magnetizationsExact.append(isingExact(beta, J)[0])\n", " freeEnergies.append(-np.log(lam)/beta)\n", " freeEnergiesExact.append(isingExact(beta, J)[1])\n", "\n", - "\n", "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16,5), dpi=120)\n", "ax1.set_title('Magnetization as a function of the temperature')\n", "ax1.set(xlabel=r'$T$', ylabel=r'$$')\n", @@ -622,7 +757,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -636,7 +771,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/chapter3Solution.ipynb b/python/chapter3Solution.ipynb index 63d6a2b..6daa04f 100644 --- a/python/chapter3Solution.ipynb +++ b/python/chapter3Solution.ipynb @@ -8,55 +8,135 @@ }, "outputs": [], "source": [ + "# do all necessary imports for this chapter\n", "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.linalg import sqrtm\n", "from scipy.sparse.linalg import eigs, LinearOperator\n", "from ncon import ncon\n", "from tutorialFunctions import createMPS, mixedCanonical, minAcC\n", - "from time import time\n", - "import matplotlib.pyplot as plt" + "from time import time" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "# Tangent-space methods for uniform matrix product states\n", - "\n", - "https://arxiv.org/abs/1810.07006\n", + "# [Tangent-space methods for uniform matrix product states](https://doi.org/10.21468/SciPostPhysLectNotes.7)\n", "\n", "## 3. Transfer matrices and fixed points\n", "\n", - "### 3.1 The vumps algorithm for MPOs\n", + "### 3.1 MPS as fixed points of one-dimensional transfer matrices\n", + "\n", + "Matrix product states have been used extensively as a variational ansatz for ground states of local Hamiltonians. In recent years, it has been observed that they can also provide accurate approximations for fixed points of transfer matrices. In this notebook we investigate how tangent-space methods for MPS can be applied to one-dimensional transfer matrices.\n", + "\n", + "A one-dimensional transfer matrix in the form of a *matrix product operator* (MPO) is given by\n", + "\n", + "$$\n", + "T(O) = \\sum_{\\{i\\}, \\{j\\}} \\left( \\dots O^{i_{n-1}, j_{n-1}} O^{i_{n}, j_{n}} O^{i_{n+1}, j_{n+1}} \\dots \\right)\n", + "\\left | i_{n-1} \\right \\rangle \\left \\langle j_{n-1} \\right | \\otimes \\left | i_{n} \\right \\rangle \\left \\langle j_{n} \\right | \\otimes \\left | i_{n+1} \\right \\rangle \\left \\langle j_{n+1} \\right | \\dots \\;,\n", + "$$\n", + "\n", + "which can be represented diagrammatically as\n", + "\n", + "
\"transferMpo\"/
\n", + "\n", + "Such an object naturally arises in the context of infinite two-dimensional tensor networks, which can be interpreted as an infinite power of a corresponding one-dimensional row-to-row transfer matrix. This means that the contraction of the network is equivalent to finding the leading eigenvector $\\left | \\Psi \\right \\rangle$, referred to as the *fixed point*, of the transfer matrix which satisfies the equation\n", + "\n", + "$$T(O) \\left | \\Psi \\right \\rangle \\propto \\left | \\Psi \\right \\rangle.$$\n", + "\n", + "We can now propose an MPS ansatz for this fixed point, such that it obeys the eigenvalue equation\n", + "\n", + "
\"fixedPoint\"/
\n", + "\n", + "This MPS fixed point can be computed through a variation on the VUMPS algorithm introduced in the previous chapter, as will be explained in the next section. Suppose for now that we have managed to find an MPS representation $\\left | \\Psi(A) \\right \\rangle$ of the fixed point of $T(O)$. The corresponding eigenvalue $\\Lambda$ is then given by\n", + "\n", + "$$ \\Lambda = \\left \\langle \\Psi(\\bar{A}) \\middle | T \\middle | \\Psi(A) \\right \\rangle , $$\n", + "\n", + "assuming as always that we are dealing with a properly normalized MPS. If we bring $\\left | \\Psi(A) \\right \\rangle$ in mixed canonical form, then $\\Lambda$ is given by the network\n", + "\n", + "
\"lambda\"/
\n", + "\n", + "We can contract this resulting infinite network by finding the fixed points of the left and right channel operators $T_L$ and $T_R$ which are defined as\n", + "\n", + "
\"channels\"/
\n", + "\n", + "The corresponding fixed points $F_L$ and $F_R$, also referred to as the left and right *environments*, satisfy\n", + "\n", + "
\"environments\"/
\n", "\n", - "Matrix product states have been used extensively as variational ansatz for ground states of local hamiltonians, but in the last years it has been observed that they can also provide accurate approximations for fixed points of transfer matrices. In this chapter we investigate tangent-space methods for one-dimensional transfer matrices.\n", + "and can be normalized such that\n", "\n", - "A one-dimensional transfer matrix in the form of matrix product operator (MPO) can be represented diagrammatically as\n", + "
\"envNorm\"/
\n", "\n", - "\"transferMPO\"\n", + "The eigenvalues $\\lambda_L$ and $\\lambda_R$ have to correspond to the same value $\\lambda$ by construction, so that $\\Lambda$ is given by\n", "\n", - "Whenever we contract an infinite two-dimensional tensor network, we want to find the fixed point of this operator, i.e. we want to solve the fixed-point equation\n", + "$$ \\Lambda = \\lim_{N \\to \\infty} \\lambda^N ,$$\n", "\n", - "$$ T(O) |\\Psi> \\propto |\\Psi> $$\n", + "where $N$ is the number of sites in the horizontal direction. Finally, we note that we can associate a *free energy density* $f = -\\frac{1}{N} \\log \\Lambda = -\\log \\lambda$ to this MPS fixed point.\n", "\n", - "such that we can collapse the vertical direction of the network.\n", "\n", - "We now make the ansatz that the fixed point (leading eigenvector) of this operator is an MPS. Suppose now we have indeed found an MPS representation $|\\Psi(A)>$ of the fixed point of $T(O)$, then the eigenvalue is given by\n", + "### 3.2 The VUMPS algorithm for MPOs\n", "\n", - "$$ \\Lambda = <\\Psi(A)| T |\\Psi(A) > $$\n", + "In order to formulate an algorithm for finding this MPS fixed point we start by stating the optimality condition it must satisfy in order to qualify as an approximate eigenvector of $T(O)$. Intuitively, what we would like to impose is that the residual $T(O) \\left| \\Psi \\right \\rangle - \\Lambda \\left | \\Psi \\right \\rangle$ is equal to zero. While this condition can never be satisfied exactly for any MPS approximation, we can however demand that the tangent space projection of this residual vanishes,\n", "\n", - "Bringing the MPS in mixed canonical form, we write\n", + "$$\n", + "\\mathcal{P}_A \\left( T(O) \\left| \\Psi \\right \\rangle - \\Lambda \\left | \\Psi \\right \\rangle \\right) = 0,\n", + "$$\n", "\n", - "\"partition\n", + "where $\\mathcal{P}_A$ is the projector onto the tangent space to the MPS manifold at $A$. Similar to the Hamiltonian case, this projected residual can be characterized in terms of a tangent space gradient $G$,\n", "\n", - "Again, contracting this infinite network requires that we find $F_L$ and $F_R$, the fixed points of the left and right channel operators, such that we may now collapse the horizontal direction. These are found by considering the following diagrams:\n", + "$$\n", + "G = A_C' - A_L C' = A_c' - C' A_R,\n", + "$$\n", "\n", - "\"Fl\"\n", - "\"Fr\"\n", + "where $A_C'$ and $C'$ are now given by\n", "\n", - "Finally these are properly normalised if we set\n", - "\"FlFr\"\n", + "
\"AcPrime2\"/
\n", "\n", - "We therefore first require routines for finding and normalising these fixed points." + "and\n", + "\n", + "
\"CPrime2\"/
\n", + "\n", + "The optimality condition for the fixed point MPS is then equivalent to having $||G|| = 0$. In addition, if the MPO defining the transfer matrix is hermitian then it can be shown that the optimality condition corresponds to the variational minimum of the free energy density introduced above. Similar to the Hamiltonian case, if we introduce operators $O_{A_C}(\\cdot)$ and $O_C(\\cdot)$ such that\n", + "\n", + "$$\n", + "\\begin{align}\n", + "O_{A_C}(A_C) = A_C', \\\\\n", + "O_{C}(C) = C',\n", + "\\end{align}\n", + "$$\n", + "\n", + "then it follows that the fixed point is characterized by the set of equations\n", + "\n", + "$$\n", + "\\begin{align}\n", + "O_{A_C}(A_C) \\propto A_C, \\\\\n", + "O_{C}(C) \\propto C, \\\\\n", + "A_C = A_L C = C A_R.\n", + "\\end{align}\n", + "$$\n", + "\n", + "The VUMPS algorithm for MPOs then corresponds to an iterative scheme for finding the solutions to these equations starting from a given set $\\{A_L, A_C, A_R, C\\}$ which consists of the following steps:\n", + "\n", + "1. Find the left and right environments $F_L$ and $F_R$ and use these to solve the eigenvalue equations for $O_{A_C}$ and $O_C$, giving new center tensors $\\tilde{A}_C$ and $\\tilde{C}$.\n", + "\n", + "2. From these new center tensors, extract the $\\tilde{A}_L$ and $\\tilde{A}_R$ that minimize $||\\tilde{A}_C - \\tilde{A}_L \\tilde{C}||$ and $||\\tilde{A}_C - \\tilde{C} \\tilde{A}_L||$ using the `minAcC` routine from the previous chapter.\n", + "\n", + "3. Update the set of tensors $\\{A_L, A_C, A_R, C\\} \\leftarrow \\{\\tilde{A}_L, \\tilde{A}_C, \\tilde{A}_R, \\tilde{C}\\}$ and evaluate the optimality condition $\\varepsilon = \\left | \\left | O_{A_C} (A_C) - A_L O_C(C) \\right | \\right |$.\n", + "\n", + "4. If the optimality condition lies above the given tolerance, repeat." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Implementing the VUMPS algorithm\n", + "\n", + "We start by implementing the routines for finding and normalizing the left and right environments of the channel operators." ] }, { @@ -65,9 +145,9 @@ "metadata": {}, "outputs": [], "source": [ - "def leftFixedPointMPO(O, Al, tol):\n", + "def leftEnvironment(O, Al, tol):\n", " \"\"\"\n", - " Computes the left fixed point (250).\n", + " Computes the left environment as the fixed point of the left channel operator.\n", "\n", " Parameters\n", " ----------\n", @@ -85,26 +165,27 @@ " -------\n", " lam : float\n", " Leading left eigenvalue.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", "\n", " \"\"\"\n", " D = Al.shape[0]\n", " d = Al.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # construct handle for the action of the relevant operator and cast to linear operator\n", - " transferLeftHandleMPO = lambda v: (ncon((v.reshape((D,d,D)), Al, np.conj(Al), O),([5, 3, 1], [1, 2, -3], [5, 4, -1], [3, 2, -2, 4]))).reshape(-1)\n", - " transferLeftMPO = LinearOperator((D**2*d, D**2*d), matvec=transferLeftHandleMPO)\n", + " channelLeftHandle = lambda v: (ncon((v.reshape((D,d,D)), Al, np.conj(Al), O),([5, 3, 1], [1, 2, -3], [5, 4, -1], [3, 2, -2, 4]))).reshape(-1)\n", + " channelLeft = LinearOperator((D**2*d, D**2*d), matvec=channelLeftHandle)\n", " # compute the largest magnitude eigenvalue and corresponding eigenvector\n", - " lam, Fl = eigs(transferLeftMPO, k=1, which=\"LM\", tol=tol)\n", + " lam, Fl = eigs(channelLeft, k=1, which=\"LM\", tol=tol)\n", " \n", - " return lam, Fl.reshape((D,d,D))\n", + " return lam[0], Fl.reshape((D,d,D))\n", "\n", "\n", - "def rightFixedPointMPO(O, Ar, tol):\n", + "def rightEnvironment(O, Ar, tol):\n", " \"\"\"\n", - " Computes the right fixed point (250).\n", + " Computes the right environment as the fixed point of the right channel operator.\n", "\n", " Parameters\n", " ----------\n", @@ -122,80 +203,81 @@ " -------\n", " lam : float\n", " Leading right eigenvalue.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", "\n", " \"\"\"\n", " D = Ar.shape[0]\n", " d = Ar.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # construct handle for the action of the relevant operator and cast to linear operator\n", - " transferRightHandleMPO = lambda v: (ncon((v.reshape(D, d, D), Ar, np.conj(Ar), O), ([1, 3, 5], [-1, 2, 1], [-3, 4, 5], [-2, 2, 3, 4]))).reshape(-1)\n", - " transferRightMPO = LinearOperator((D**2*d, D**2*d), matvec=transferRightHandleMPO)\n", + " channelRightHandle = lambda v: (ncon((v.reshape(D, d, D), Ar, np.conj(Ar), O), ([1, 3, 5], [-1, 2, 1], [-3, 4, 5], [-2, 2, 3, 4]))).reshape(-1)\n", + " channelRight = LinearOperator((D**2*d, D**2*d), matvec=channelRightHandle)\n", " # compute the largest magnitude eigenvalue and corresponding eigenvector\n", - " lam, Fr = eigs(transferRightMPO, k=1, which=\"LM\", tol=tol)\n", + " lam, Fr = eigs(channelRight, k=1, which=\"LM\", tol=tol)\n", " \n", - " return lam, Fr.reshape((D,d,D))\n", - "\n", + " return lam[0], Fr.reshape((D,d,D))\n", "\n", - "def overlapFixedPointsMPO(Fl, Fr, C):\n", + "def environments(O, Al, Ar, C, tol=1e-5):\n", " \"\"\"\n", - " Performs the contraction that gives the overlap of the fixed points (251).\n", + " Compute the left and right environments of the channel operators\n", + " as well as the corresponding eigenvalue.\n", "\n", " Parameters\n", " ----------\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", - " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", - " ordered top-middle-bottom.\n", - " C : np.array(D, D)\n", + " O : np.array (d, d, d, d)\n", + " MPO tensor,\n", + " ordered left-top-right-bottom.\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", + " ordered left-bottom-right,\n", + " left-orthonormal.\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", + " ordered left-bottom-right,\n", + " right-orthonormal.\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", + " tol : float, optional\n", + " tolerance for eigenvalue solver\n", "\n", " Returns\n", " -------\n", - " overlap : float\n", - " Overlap of the fixed points.\n", + " lam : float\n", + " Leading eigenvalue of the channel\n", + " operators.\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", + " ordered bottom-middle-top.\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", + " ordered top-middle-bottom.\n", "\n", " \"\"\"\n", + " tol = max(tol, 1e-14)\n", + " \n", + " lamL, Fl = leftEnvironment(O, Al, tol)\n", + " _, Fr = rightEnvironment(O, Ar, tol)\n", " \n", " overlap = ncon((Fl, Fr, C, np.conj(C)), ([1, 3, 2], [5, 3, 4], [2, 5], [1, 4]))\n", " \n", - " return overlap\n" + " return np.real(lamL), Fl / overlap, Fr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We now want to use the VUMPS algorithm for finding this fixed point MPS of the MPO $T(O)$.\n", - "\n", - "To do so, we calculate the tangent-space projector in mixed gauge and again find two terms that can be characterised by the maps\n", + "Next we implement the action of the effective operators $O_{A_C}$ and $O_C$ on a given input tensor,\n", "\n", - "\"OAC\"\n", - "\"OC\"\n", + "
\"O_Ac\"/
\n", "\n", - "Together with the consistency conditions, a fixed point is thus characterised by the set of equations:\n", + "and\n", "\n", - "$$ O_{A_C}(A_C) \\propto A_C $$\n", - "$$ O_C(C) \\propto C $$\n", - "$$ A_C = A_L C = CA_R $$\n", - "\n", - "The vumps algorithm for MPO's can then be formulated in a similar way as in the Hamiltonian case:\n", - " (i) we start from a given MPS $\\{A^i_L , A^i_R , A^i_C , C^i \\}$\n", - " (ii) determine $F_L$ and $F_R$\n", - " (iii) solve the two eigenvalue equations obtaining $\\tilde{A}_C$ and $\\tilde{C}$, and\n", - " (iv) determine the $A^{i+1}_L$ and $A^{i+1}_R$ that minimize $||\\tilde{A} - A^{i+1}_L \\tilde{C}||$ and $||\\tilde{A} - \\tilde{C}A^{i+1}_R||$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can already determin the left and right fixed points, so we now need the action of the maps $O_{A_C}$ and $O_C$ on a given tensor:" + "
\"O_C\"/
" ] }, { @@ -204,70 +286,70 @@ "metadata": {}, "outputs": [], "source": [ - "def O_Ac(X, O, Fl, Fr, lam):\n", + "def O_Ac(x, O, Fl, Fr, lam):\n", " \"\"\"\n", - " Action of the map (256) on a given tensor.\n", + " Action of the operator O_Ac on a given tensor.\n", "\n", " Parameters\n", " ----------\n", - " X : np.array(D, d, D)\n", + " x : np.array (D, d, D)\n", " Tensor of size (D, d, D)\n", " O : np.array (d, d, d, d)\n", " MPO tensor,\n", " ordered left-top-right-bottom.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " lam : float\n", " Leading eigenvalue.\n", "\n", " Returns\n", " -------\n", - " Xnew : np.array(D, d, D)\n", - " Result of the action of O_Ac on the tensor X.\n", + " y : np.array (D, d, D)\n", + " Result of the action of O_Ac on the tensor x.\n", "\n", " \"\"\"\n", " \n", - " Xnew = ncon((Fl, Fr, X, O),([-1, 2, 1], [4, 5, -3], [1, 3, 4], [2, 3, 5, -2])) / lam\n", + " y = ncon((Fl, Fr, x, O),([-1, 2, 1], [4, 5, -3], [1, 3, 4], [2, 3, 5, -2])) / lam\n", " \n", - " return Xnew\n", + " return y\n", "\n", "\n", - "def O_C(X, Fl, Fr):\n", + "def O_C(x, Fl, Fr):\n", " \"\"\"\n", - " Action of the map (257) on a given tensor.\n", + " Action of the operator O_C on a given tensor.\n", "\n", " Parameters\n", " ----------\n", - " X : np.array(D, D)\n", + " x : np.array (D, D)\n", " Tensor of size (D, D)\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", "\n", " Returns\n", " -------\n", - " Xnew : np.array(D, d, D)\n", - " Result of the action of O_C on the tensor X.\n", + " y : np.array (D, d, D)\n", + " Result of the action of O_C on the tensor x.\n", "\n", " \"\"\"\n", " \n", - " Xnew = ncon((Fl, Fr, X), ([-1, 3, 1], [2, 3, -2], [1, 2]))\n", + " y = ncon((Fl, Fr, x), ([-1, 3, 1], [2, 3, -2], [1, 2]))\n", " \n", - " return Xnew" + " return y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Solving the eigenvalue equations for these operators gives an update for the center tensors, $\\tilde{A}_C$ and $\\tilde{C}$:" + "This then allows to define a new routine `calcNewCenterMpo` which finds the new center tensors $\\tilde{A}_C$ and $\\tilde{C}$ by solving the eigenvalue problems for $O_{A_C}$ and $O_C$." ] }, { @@ -276,7 +358,7 @@ "metadata": {}, "outputs": [], "source": [ - "def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-3):\n", + "def calcNewCenterMpo(O, Ac, C, Fl, Fr, lam, tol=1e-5):\n", " \"\"\"\n", " Find new guess for Ac and C as fixed points of the maps O_Ac and O_C.\n", " \n", @@ -285,18 +367,18 @@ " O : np.array (d, d, d, d)\n", " MPO tensor,\n", " ordered left-top-right-bottom.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " lam : float\n", " Leading eigenvalue.\n", @@ -305,11 +387,11 @@ " \n", " Returns\n", " -------\n", - " AcTilde : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " AcTilde : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " CTilde : np.array(D, D)\n", + " CTilde : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", "\n", @@ -317,12 +399,13 @@ " \n", " D = Ac.shape[0]\n", " d = Ac.shape[1]\n", + " tol = max(tol, 1e-14)\n", " \n", " # construct handle for O_Ac map and cast to linear operator\n", - " handleAc = lambda X: (O_Ac(X.reshape((D,d,D)), O, Fl, Fr, lam)).reshape(-1)\n", + " handleAc = lambda x: (O_Ac(x.reshape((D,d,D)), O, Fl, Fr, lam)).reshape(-1)\n", " handleAc = LinearOperator((D**2*d, D**2*d), matvec=handleAc)\n", " # construct handle for O_C map and cast to linear operator\n", - " handleC = lambda X: (O_C(X.reshape(D, D), Fl, Fr)).reshape(-1)\n", + " handleC = lambda x: (O_C(x.reshape(D, D), Fl, Fr)).reshape(-1)\n", " handleC = LinearOperator((D**2, D**2), matvec=handleC)\n", " # compute fixed points of these maps: gives new guess for center tensors\n", " _, AcTilde = eigs(handleAc, k=1, which=\"LM\", v0=Ac.reshape(-1), tol=tol)\n", @@ -339,7 +422,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "And after retrieving $\\tilde{A}_C$ and $\\tilde{C}$ we can use the same 'minAcC()' function as in the case of Hamiltonian vumps to iterate the whole procedure until convergence. These building blocks now allow to implement the vumps algorithm for MPOs (algorithm 8):" + "Since the `minAcC` routine to extract a new set of mixed gauge MPS tensors from the updated $\\tilde{A}_C$ and $\\tilde{C}$ can be reused from the previous chapter, we now have all the tools needed to implement the VUMPS algorithm for MPOs." ] }, { @@ -348,7 +431,7 @@ "metadata": {}, "outputs": [], "source": [ - "def vumpsMPO(O, D, A0=None, tol=1e-4):\n", + "def vumpsMpo(O, D, A0=None, tol=1e-4, tolFactor=1e-2, verbose=True):\n", " \"\"\"\n", " Find the fixed point MPS of a given MPO using VUMPS.\n", " \n", @@ -370,31 +453,32 @@ " -------\n", " lam : float\n", " Leading eigenvalue.\n", - " Al : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Al : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " left orthonormal.\n", - " Ar : np.array(D, d, D)\n", - " MPS tensor zith 3 legs,\n", + " Ar : np.array (D, d, D)\n", + " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " right orthonormal.\n", - " Ac : np.array(D, d, D)\n", + " Ac : np.array (D, d, D)\n", " MPS tensor with 3 legs,\n", " ordered left-bottom-right,\n", " center gauge.\n", - " C : np.array(D, D)\n", + " C : np.array (D, D)\n", " Center gauge with 2 legs,\n", " ordered left-right.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environment,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environment,\n", " ordered top-middle-bottom.\n", " \n", " \"\"\"\n", " \n", " d = O.shape[0]\n", + " tol = max(tol, 1e-14)\n", " \n", " # if no initial guess, random one\n", " if A0 is None:\n", @@ -405,21 +489,32 @@ " \n", " delta = 1e-4\n", " flag = True\n", + " i = 0\n", + " \n", " while flag:\n", - " # compute left and right fixed points\n", - " lam, Fl = leftFixedPointMPO(O, Al, delta/10)\n", - " _ , Fr = rightFixedPointMPO(O, Ar, delta/10)\n", - " Fl /= overlapFixedPointsMPO(Fl, Fr, C)\n", - " lam = np.real(lam)[0]\n", - " # compute updates on Ac and C\n", - " AcTilde, CTilde = calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, delta/10)\n", - " AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde)\n", + " i += 1\n", + " \n", + " # compute left and right environments and corrsponding eigenvalue\n", + " lam, Fl, Fr = environments(O, Al, Ar, C, delta*tolFactor)\n", + " \n", " # calculate convergence measure, check for convergence\n", - " delta = np.linalg.norm(O_Ac(Ac, O, Fl, Fr, lam) - ncon((Al, O_C(C, Fl, Fr)), ([-1, -2, 1], [1, -3])))\n", + " G = O_Ac(Ac, O, Fl, Fr, lam) - ncon((Al, O_C(C, Fl, Fr)), ([-1, -2, 1], [1, -3]))\n", + " delta = np.linalg.norm(G)\n", " if delta < tol:\n", " flag = False\n", + " \n", + " # compute updates on Ac and C\n", + " AcTilde, CTilde = calcNewCenterMpo(O, Ac, C, Fl, Fr, lam, delta*tolFactor)\n", + " \n", + " # find Al, Ar from AcTilde, CTilde\n", + " AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde, delta*tolFactor**2)\n", + " \n", " # update tensors\n", " Al, Ac, Ar, C = AlTilde, AcTilde, ArTilde, CTilde\n", + " \n", + " # print current eigenvalue\n", + " if verbose:\n", + " print('iteration:\\t{:d}\\tlambda:\\t{:.12f}\\tgradient norm:\\t{:.4e}'.format(i, lam, delta))\n", " \n", " return lam, Al, Ac, Ar, C, Fl, Fr" ] @@ -428,22 +523,53 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The partition function is eventually given by the left and right fixed point eigenvalue lambda. To check this we define some functions calculating the free energy and the magnetization for the simulation and the exact solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 3.2 The 2d classical Ising model\n", + "### 3.2 The two-dimensional classical Ising model\n", + "\n", + "Next we apply the VUMPS algorithm for MPOs to the two-dimensional classical Ising model. To this end, consider classical spins $s_i = \\pm 1$ placed on the sites of an infinite square lattice which interact according to the nearest-neighbor Hamiltonian\n", + "\n", + "$$H = -J \\sum_{\\langle i,j \\rangle} s_i s_j \\,.$$\n", + "\n", + "We now wish to compute the corresponding partition function,\n", + "\n", + "$$ \\mathcal{Z} = \\sum_{\\{s_i\\}} \\text{e}^{-\\beta H({\\{s_i\\}})},$$\n", + "\n", + "using our freshly implemented algorithm. In order to do this we first rewrite this partition function as the contraction of an infinite two-dimensional tensor network,\n", + "\n", + "
\"Z\"/
\n", + "\n", + "where every edge in the network has bond dimension $d = 2$. Here, the black dots represent $ \\delta $-tensors\n", + "\n", + "
\"delta\"/
\n", + "\n", + "and the matrices $t$ encode the Boltzmann weights associated to each nearest-neighbor interaction,\n", + "\n", + "
\"t\"/
\n", + "\n", + "In order to arrive at a translation invariant network corresponding to a single hermitian MPO tensor we can take the matrix square root $q$ of each Boltzmann matrix such that\n", + "\n", + "
\"q\"/
\n", + "\n", + "and absorb the result symmetrically into the $\\delta$-tensors at each vertex to define the MPO tensor\n", + "\n", + "
\"O\"/
\n", + "\n", + "The partition function then becomes\n", "\n", - "We can use this algorithm to compute the partition function of the 2d classical Ising model, which can be written as a two-dimensional tensor network contraction. This is done by constructing a one-dimensional transfer matrix in the form of an MPO, and noting that the partition function is then an (infinite) product of these transfer matrices, stacked vertically.\n", + "
\"Z2p\"/
\n", "\n", - "We start by defining the tensors that make up the transfer matrix for the Ising model. If we consider an infinite square lattice, we may simulate the model by placing a spin $1/2$ degree of freedom on each vertex, and then characterising the interactions by inserting a matrix $Q$ with Boltzmann weights on each of the edges. In the graphical language of tensor networks this corresponds to having a 4-legged 'delta tensor' on the vertices and a 2-legged $Q$ on the bonds.\n", + "which precisely corresponds to an infinite power of a row-to-row transfer matrix $T(O)$ of the kind defined above. We can therefore use the VUMPS algorithm to determine its fixed point, where the corresponding eigenvalue automatically gives us the free energy density as explained before.\n", "\n", - "If we want to rephrase this in terms of the transfer matrix we defined above, we split every bond interaction matrix over the two adjacent vertices and absorp them in the definition of the MPO tensor $O$. The partition function is given by contracting a tensor network consisting of all these rank 4 MPO tensors $O$, which have dimensions $(d,d,d,d)$. We can find the MPS fixed point of the corresponding transfer matrix using the vumps algorithm, which allows to perform this infinite contraction efficiently.\n", + "Having found this fixed point and its corresponding environments, we can easily evaluate expectation values of local observables. For example, say we want to find the expectation value of the magnetization at site $\\mu$,\n", "\n", - "Below we define this Ising MPO operator $O$, along with a magnetization operator $M$ that can be obtained by contracting the spin-1/2 $Z$ operator into a given MPO tensor. We then construct routines that compute the Ising partition function and magnetization (as the expectation value of the $M$ operator) for a given fixed point MPS. This can be compared with the exact Onsager solution. Doing this for a range of different temperatures then allows us to compute the magnetization and free energy in the Ising model as a functions of temperature:" + "$$ \\langle m \\rangle = \\frac{1}{\\mathcal{Z}} \\sum_{\\{s_i\\}} s_\\mu \\text{e}^{-\\beta H({\\{s_i\\}})}.$$\n", + "\n", + "We can access this quantity by introducing a magnetization tensor $M$, placing it at site $\\mu$ and contracting the partition function network around it as\n", + "\n", + "
\"Mexp\"/
\n", + "\n", + "where the normalization factor $\\mathcal{Z}$ in the denominator is taken care of by the same contraction where $O$ is left at site $\\mu$ (which in this case is of course nothing more than the eigenvalue $\\lambda$). The magnetization tensor $M$ is defined entirely analogously to the MPO tensor $O$, but where instead of a regular $\\delta$-tensor the entry $i=j=k=l=1$ (using base-0 indexing) is set to $-1$ instead of $1$.\n", + "\n", + "We can now define the routines for constructing the Ising MPO and magnetization tensor an computing local expectation values, as well as a routine that implements [Onsager's exact solution for this model](https://en.wikipedia.org/wiki/Ising_model#Onsager's_exact_solution) to compare our results to." ] }, { @@ -472,13 +598,13 @@ " ordered left-top-right-bottom.\n", "\n", " \"\"\"\n", - " # basic vertex tensor\n", + " # basic vertex delta tensor\n", " vertex = np.zeros( (2,) * 4 )\n", " vertex[tuple([np.arange(2)] * 4)] = 1\n", - " # build square root of matrix of Boltzmann weights and pull into vertex edges\n", - " c, s = np.sqrt(np.cosh(beta*J)), np.sqrt(np.sinh(beta*J))\n", - " Qsqrt = 1/np.sqrt(2) * np.array([[c+s, c-s],[c-s, c+s]])\n", - " O = ncon((Qsqrt, Qsqrt, Qsqrt, Qsqrt, vertex), ([-1,1], [-2,2], [-3,3], [-4,4], [1,2,3,4]))\n", + " # take matrix square root of Boltzmann weights and pull into vertex edges\n", + " t = np.array([[np.exp(beta*J), np.exp(-beta*J)], [np.exp(-beta*J), np.exp(beta*J)]])\n", + " q = sqrtm(t)\n", + " O = ncon((q, q, q, q, vertex), ([-1, 1], [-2, 2], [-3, 3], [-4, 4], [1, 2, 3, 4]))\n", " return O\n", "\n", "\n", @@ -497,87 +623,56 @@ " Returns\n", " -------\n", " M : np.array (2, 2, 2, 2)\n", - " Magnetization MPO tensor,\n", + " Magnetization tensor,\n", " ordered left-top-right-bottom.\n", "\n", " \"\"\"\n", + " # basic vertex delta tensor\n", " vertex = np.zeros( (2,) * 4 )\n", " vertex[tuple([np.arange(2)] * 4)] = 1\n", - " Z = np.array([[1,0],[0,-1]])\n", - " c, s = np.sqrt(np.cosh(beta*J)), np.sqrt(np.sinh(beta*J))\n", - " Qsqrt = 1/np.sqrt(2) * np.array([[c+s, c-s],[c-s, c+s]])\n", - " vertexZ = ncon((Z, vertex), ([-1,1], [1,-2,-3,-4]))\n", - " M = ncon((Qsqrt, Qsqrt, Qsqrt, Qsqrt, vertexZ), ([-1,1], [-2,2], [-3,3], [-4,4], [1,2,3,4]))\n", + " # change sign of (1, 1, 1, 1) entry\n", + " vertex[1, 1, 1, 1] = -1;\n", + " # take matrix square root of Boltzmann weights and pull into vertex edges\n", + " t = np.array([[np.exp(beta*J), np.exp(-beta*J)], [np.exp(-beta*J), np.exp(beta*J)]])\n", + " q = sqrtm(t)\n", + " M = ncon((q, q, q, q, vertex), ([-1, 1], [-2, 2], [-3, 3], [-4, 4], [1, 2, 3, 4]))\n", " return M\n", "\n", "\n", - "def isingMagnetization(beta, J, Ac, Fl, Fr):\n", - " \"\"\"\n", - " Computes the expectation value of the magnetization in the Ising model\n", - " for a given temperature and coupling\n", - " \n", - " Parameters\n", - " ----------\n", - " beta : float\n", - " Inverse temperature.\n", - " J : float\n", - " Coupling strength.\n", - " Ac : np.array(D, d, D)\n", - " MPS tensor of the MPS fixed point,\n", - " with 3 legs ordered left-bottom-right,\n", - " center gauge.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", - " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", - " ordered top-middle-bottom.\n", - " \n", - " Returns\n", - " -------\n", - " M : float\n", - " Expectation value of the magnetization at the given temperature\n", - " and coupling.\n", - "\n", - " \"\"\"\n", - " return ncon((Fl, Ac, isingM(beta, J), np.conj(Ac), Fr), (\n", - " [1, 3, 2], [2,7,5],[3,7,8,6],[1,6,4], [5,8,4]))\n", - "\n", - "\n", - "def isingZ(beta, J, Ac, Fl, Fr):\n", + "def expValMpo(O, Ac, Fl, Fr):\n", " \"\"\"\n", - " Computes the Ising model partition function for a given temperature and\n", - " coupling\n", + " Gives the MPO tensor corresponding to the partition function of the 2d \n", + " classical Ising model at a given temperature and coupling, obtained by\n", + " distributing the Boltzmann weights evenly over all vertices.\n", " \n", " Parameters\n", " ----------\n", - " beta : float\n", - " Inverse temperature.\n", - " J : float\n", - " Coupling strength.\n", - " Ac : np.array(D, d, D)\n", + " O : np.array (2, 2, 2, 2)\n", + " local operator of which we want to\n", + " compute the expectation value,\n", + " ordered left-top-right-bottom.\n", + " Ac : np.array (D, d, D)\n", " MPS tensor of the MPS fixed point,\n", " with 3 legs ordered left-bottom-right,\n", " center gauge.\n", - " Fl : np.array(D, d, D)\n", - " left fixed point,\n", + " Fl : np.array (D, d, D)\n", + " left environmnt,\n", " ordered bottom-middle-top.\n", - " Fr : np.array(D, d, D)\n", - " right fixed point,\n", + " Fr : np.array (D, d, D)\n", + " right environmnt,\n", " ordered top-middle-bottom.\n", " \n", " Returns\n", " -------\n", - " Z : float\n", - " Value of the partition function at the given temperature and\n", - " coupling.\n", + " e : float\n", + " expectation value of the operator O.\n", + " \n", "\n", " \"\"\"\n", + " e = ncon((Fl, Ac, O, np.conj(Ac), Fr), (\n", + " [1, 3, 2], [2, 7, 5], [3, 7, 8, 6], [1, 6, 4], [5, 8, 4]))\n", " \n", - " Z = ncon((Fl, Ac, isingO(beta, J), np.conj(Ac), Fr), (\n", - " [1, 3, 2], [2,7,5],[3,7,8,6],[1,6,4], [5,8,4]))\n", - " \n", - " return Z\n", + " return e\n", "\n", "\n", "def isingExact(beta, J):\n", @@ -613,6 +708,65 @@ " return magnetization, free, energy" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now demonstrate the VUMPS algorithm for MPOs. We will fix $J = 1$ in the following, and investigate the behavior of the model as a function of temperature. Since we know the critical piont is located at $T_c = \\frac{2}{\\log\\left(1 + \\sqrt{2}\\right)} \\approx 2.26919$, let us first have a look at $T = 4$ and $T = 1$ far above and below the critical temperature, for which we expect a vanishing and non-vanishing magnetization respectively." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "D = 12\n", + "d = 2\n", + "J = 1\n", + "tol = 1e-8\n", + "tolFactor = 1e-4\n", + "A0 = createMPS(D, d)\n", + "\n", + "T = 4\n", + "print('Running for T = {}\\n'.format(T))\n", + "beta = 1 / T\n", + "O = isingO(beta, J)\n", + "M = isingM(beta, J)\n", + "lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=A0, tol=tol, tolFactor=tolFactor, verbose=True)\n", + "mag = np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr))\n", + "magExact = isingExact(beta, J)[0]\n", + "freeEnergy = -np.log(lam)/beta\n", + "freeEnergyExact = isingExact(beta, J)[1]\n", + "print('\\nFree energy: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " freeEnergy, np.abs((freeEnergy - freeEnergyExact) / freeEnergyExact)))\n", + "print('Magnetization: {:.10f}\\n'.format(mag))\n", + "\n", + "T = 1\n", + "print('Running for T = {}\\n'.format(T))\n", + "beta = 1 / T\n", + "O = isingO(beta, J)\n", + "M = isingM(beta, J)\n", + "lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=A0, tol=tol, tolFactor=tolFactor, verbose=True)\n", + "mag = np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr))\n", + "magExact = isingExact(beta, J)[0]\n", + "freeEnergy = -np.log(lam)/beta\n", + "freeEnergyExact = isingExact(beta, J)[1]\n", + "print('\\nFree energy: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " freeEnergy, np.abs((freeEnergy - freeEnergyExact) / freeEnergyExact)))\n", + "print('Magnetization: {:.10f}; \\trelative difference with exact solution: {:.4e}\\n'.format(\n", + " mag, np.abs((mag - magExact) / magExact)))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We clearly see that far from the critical point the VUMPS algorithm achieves excellent agreement with the exact solution efficiently at very small bond dimensions.\n", + "\n", + "As a final demonstration, we compute the magnetization and free energy over a range from $T = 1$ to $T = 3.4$ and plot the results. Note that convergence of the algorithm slows down significantly near the critical point, as can be expected." + ] + }, { "cell_type": "code", "execution_count": null, @@ -623,10 +777,12 @@ "d = 2\n", "J = 1\n", "\n", - "print('Bond dimension: D =', D)\n", + "print('Bond dimension: D = {}\\n'.format(D))\n", "Al = createMPS(D, d)\n", "# optimization parameters\n", - "tol = 1e-5\n", + "tol = 1e-8\n", + "tolFactor = 1e-2\n", + "verbose = False\n", "\n", "Ts = np.linspace(1., 3.4, 100)\n", "magnetizations = []\n", @@ -637,15 +793,15 @@ "for T in Ts:\n", " beta = 1/T\n", " O = isingO(beta, J)\n", - " print('T={}'.format(T))\n", + " M = isingM(beta, J)\n", + " print('Running for T = {:.5f}'.format(T), end=\"\\r\")\n", " \n", - " lam, Al, Ac, Ar, C, Fl, Fr = vumpsMPO(O, D, A0=Al, tol=tol)\n", - " magnetizations.append(np.abs(isingMagnetization(beta, J, Ac, Fl, Fr)/isingZ(beta, J, Ac, Fl, Fr)))\n", + " lam, Al, Ac, Ar, C, Fl, Fr = vumpsMpo(O, D, A0=Al, tol=tol, tolFactor=tolFactor, verbose=verbose)\n", + " magnetizations.append(np.abs(expValMpo(M, Ac, Fl, Fr)/expValMpo(O, Ac, Fl, Fr)))\n", " magnetizationsExact.append(isingExact(beta, J)[0])\n", " freeEnergies.append(-np.log(lam)/beta)\n", " freeEnergiesExact.append(isingExact(beta, J)[1])\n", "\n", - "\n", "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16,5), dpi=120)\n", "ax1.set_title('Magnetization as a function of the temperature')\n", "ax1.set(xlabel=r'$T$', ylabel=r'$$')\n", @@ -669,7 +825,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -683,7 +839,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/python/img/2minham.png b/python/img/2minham.png deleted file mode 100644 index 437aaa8e56473c8a9d53efc3f44219c7c89d8142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9076 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 S7knZHO+`UnzC_kE@P7aSbGGIH diff --git a/python/img/2minham.svg b/python/img/2minham.svg new file mode 100644 index 0000000..5ef24e6 --- /dev/null +++ b/python/img/2minham.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/AcPrime2.svg b/python/img/AcPrime2.svg new file mode 100644 index 0000000..fa8ba0d --- /dev/null +++ b/python/img/AcPrime2.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Acprime.png b/python/img/Acprime.png deleted file mode 100644 index 0aec9cbeeeb393a539207e9eec6ecec9a14fe080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77775 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/AlVl.png b/python/img/AlVl.png deleted file mode 100644 index c2cf7e0fdf0fc03280e08028ced4a51c3ab4d896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8732 zcmb_?cRZE<8}|{}nc>(ogyN7bvLz`iBd zXMM`wB+37jWOGmUlB2|3+ov)7-a^D=pPq<~j3t#6iYG3jGVO>Z?xh^ti=@=v?6!Ma z8dq!3XTzD=mtJ-IT%p&MtVeV=J@4Mi#o?%LT}A5WE(GR#DORs~z8_itFg@Ia3*Ojn zX?+`u>b^!wdme>DL_TUQM$_?JGt^NbijBV>i_k-n(Q*m#bDvS`;!_JN%ZenWVMwDP zDEj|#&?7jZnuMp9S88^4zkIZ=^KjAGyY-Ik3uA^l?AyOS(QB1_eP${Cl=AG^vyb{0 z1Vu#DJUmdpJY|D|gJ~HUy5wK!9_>zGYHdH!UG8BV=B0~FKt(4eQg-(A@N#n#EDhy; zobO2?Ky-I^ySuxGrKQo|ZEzv;^76{c&MvXi~Nv|(wo_ja&ylyF){5Q z9etdh=5!sepJh*RS7Qp5@!R@ECgnC6o5U(z^!zzde$W;f93IVaHDEJYgD5<{Tsx(NPc^yl0NBjcprFS2$N*QPJ`E!i_KG1_BCx zn+P&8GMRuK!HmZvWJy^po13$$I(Z7r*RNkUd2LI^C}M)3r>BRPQWc^rOjT6Q@ZZX# zymJsXUyULmL_z7Sz|Dm#`lwXu9ET zq^^GU%$YNr`KQMuW(_Xw_4mK|Y4V8r9q*%FnKwlb3=BM*F44cZwY7EI$ms9ahSJhf zF=^?TxHvKq5s{gtCC#)kA3Z%iT8$Krr1bRjYU=9kKYnET@S8ps$I7bg?A zEAsmFYXl;RMKU}gf#Tl1do!@ySuxRtrHUy6e}Vz@jtJXl$0RlyanAR-#xVH zNiH<5wrJ*Me!jKk2`e#!FCth&Pft%P7Z*xtY3ZHy2_`5HWvI*9Fs#RFqOKil zK}7}m$;k;Uk|r$X++B`q~zosaQE)NdTA-y<gIMiV0SGJWz%i7vpnqn z;K3sMtrlc?X6V0FOC1r$y53$btRAJty?bn|;i3sSglz$P8-r*x+E4SV+_M7%61X?GUq@`SY{~=dRjP7(I9(RaaAEMZt9W7rT0OdS+%_iqc6I zGb?M|qenEQhC=?DbbN9d!4YKi{9LlK%+hX?Vej9|;$#8}-@QWuQfUSSDLlYolRW0T z;mju9M!S-)EL)S8mmSx}Y9qAE`2hzv|Nf2A;a7EW5y@@*a5gEc8s)!bd#~A#R=@mw zclS=+4I?`{yZxC6YIl4=%lVM!%KI*|U*BAA+F*E#neIOMcU1eo+Ysv(3qJIIURug? z`Es(hspd}ZUVMhIamVN=3EY+MO78$G$M%g@Fr*2K1)kWiwL`DQ0lH*bOaqB7P#x8lPkxd ztgPHTzs%OSza0*RQ{+0)uoLUefa(@=856tL62S1|mAPu2{UFqd>=pD$rVjtdk{g*c zG&E3mLlo51nmRg^4VY=&5*IEO)TuD+zqPe>@25|NFQi{yyPWxPc$n6vJ5d?G^)hk^ z8Uv@}t)WWC$H!&qLgO{ogmB8})1%hYd3N;|dME;02M1nZ;e^pBqv3BaZqd@wg@0B$ z&B=2rJB3y^wS)^ zpPHJwxw#qk@})48YWqyW)6`S~gu9p5e2$uLMrP)GXB<6J!k!YI{5X>UWj74H6=426 ze0%A0aakED;P?`|ItCepvJ+?Kqa(v1<<{R$heYJ&vgdYJq_#5|2xY8H6W*_1o9jwg zhL*i#QmSF7Q=YD&!vM9P8!yrq%E@+Y~-cqb&IxuQY{`WjEw<>lp%KH0wWS!Ilm zk9TS)w`dvc?k3jN)qSMJw~TF(C#GT}1=h3}_6Y|@YxKn>H#aNPI}V5Yvb7Xu3M0k3 zAEl>9LaEQqv_}XE3Wk-GTnN}%CJ+!1kdc*bhmu}gTm4RjvE6KCL|=-!2UQ?-F<^bm{eP|jHU8wE-TB3 zYTdYDgD`>jgY8tu#51$A4~{pu_IILDtkQ05@_={ayXK~*pF;lqHC|j_A4C9gNk7g-B=jP`mE~DaRhkv3kn>A1tYb13*#XfrSr1X1KJjR6Fz_Wnf_7K(0I!Fo9*zpR+g9M7aN$#|Ug2iK*$Ic-+1c1? zJQuVhV`Ao^`|yYGEgSrN{FqKgP7dAshTI9<+RVtpI;<~wVC5zr_(`38r zbRd~2g)ejLgh&1cbx|{@aU^oWi1_njkJhPXGDh zC6?FH(B|G==zQ$T`g)RL@S#;#JOfhPHdfn`5G4}MjtYgUoNNu{gwn=rDsEs~65{9u ziqsPrH@CMxHu|hOjh6Xm$HvBHViN}X`ockL>l+xr#Xp3yvYG9Oa`*A6G9{b!`Ea-* z%*W5qBOy`OZb^c=c5k|}ylbr1=4nh!jP_CQ=g$s+1(lVRiR;*wYyvA33WfO>XliO& zsaLGA2DDRgFb1s4jJN||+qHnw#9;?VN39-~3=9kdLqo}DNl0Gqydh<1NhxOzXG1M` z$|iFvC5MF}GInj8ohhWH-v(4`($mrsaB}8n=4Jj~UXBetp68@VINiGiU3X4cSU5*1 z^d#v>9BL8p7l=&nR5T1JqRc39@gmv6!onm+%gM@p5kzEUBo`DBKR>@D=gW$UGd61_ zKMJeo=jS7oPWB1GFnm|LR}@2JIuIF21TvL4IXU@_TV{TKN>&y!Xm83lOWck;UAv^O zXQ;Qg4WMgf=U2tfj<-VK?phVogTp->wT+EUXIEEwP70D(*&^fS&6~li?J8kfoo83bd^aZBK^G7prW$<=`fGvnK`HNzuB)i1Jj%&Q zjEyA)IBD?-j8i-FRHrmKwi7}6D(k|93zC?PAL>p{LWs7hDf0yz%SLaqTX_l(Q&MhK zO}Jv4nehb*;yE{z3$*KGqtA_n#7;5N4a0_lf&yJ8!wMs&I=CAl&cNvp!ASWBB04v3 zPQM#`Ch5F6pQ6O0sQAIYNX5vAL5)YR>c!W=Z0R1*NJc|ilo2x;1BZ&s0)X8B5zxg# z?3t+Oe@A<*e~2BR1%Qg#WIc&4Uc4we$ngwN2E?AzR4Z@-^uuja({g=XG?GXf{Ukjd zaV?iWSt)3rhMH3`vaW91ETQtYAVPt2%0d8zq6M9b#bQH`?%^FnGF#kq=qWoiN>_vH zgvH_Ur!)b}qdg15U{v|@=W00IFkc1zJ=9AI(>r%|M_pI94n08z$au^Vfx{(0;Cm8y z(*AQ^65Rf?bsiobG3yQ@5E=hmIi)e!PE6}RV#Gf9+0~P-=7K{KUGvN5X?fnE@1z9z zynk7Ixmr}(Wo&cwpW&T5JaTd@F;wgU>q}P^6xs}%i}ZMHm-xLLzIQ6@9zBm=J@q_++AZ#s1Yc+%Bm{KhR`BQB4Zse#r0qqba4j& zlPV&NFN0YNtE|_?!Ei0O4US}7rK4zXWj5CbNP(DZGP~|;FpXh z*7%A}iA;4sEluJPu?baSX<1=|epm_xrd)X2YNideC=EMzFM1cu0r_uSE1-DkYJ0~Bqap0+FrCVQRLwjGC9`kWuS-id)~0#5^GqPe~=jHauz zlS^9Kc;P!Tw#K|QgdOlrG89|qaBHx?Dw@Ux6+_LL%y{Xp74#7l&EHC{_xJGX{X8Qh z4^&fESJ!y*!5waHZZL4?k9&0u4X!S1yK=r1ZfC3mc*Bz!RMzfWqh*mxmrwyaj)=DX zKl8J5bK!&}RE|5rz0vPLY2Z@{z}-K|Dpx9{>t8v$(uq`U4f%H)LW2HGQHqV2=*BPFYod4!17QXj zwW_bD@3{n!hG1pd!1KmH&@l7umQvJ<7fUztnYN6E)+gT1A0KRMX=#0#(0|+-_&2b= zFj8`$xf>#mc+l89f`Vm>RObqtLQfSTE5O@;w*LMEU$&wMB1@fGlSI5u!?pxwNjOm9 zWH3girg1=jh48(9a)k5m;g-|h>>>)IVwdB(a^<|)TQ_wGD{wMzfap0cTQtXl zJ~qK?0&40WXudaj50?dU-|cS;fe`-w(ircqVCSNnngR#WrsH(L&*0-#_|u?99%^47 z(H2NBb)D;s!$bGl`uZ$TGcZ|_lHTgxbZ8F=XAlCe(a+zX`_iRz!AHB_|I=*0(Pyq5 z?XG()4lsjOVt;WfKN{E=FWI14%GZ&JD16R=XN&A?){W`bl(8`rXbA9qcU*h8pFbO7 zqW24NVnrfjC*ERgpp+$3M3+aaSn+I-nyQCe5CFEr^TLH2PYP6HsFr_Jb8bw&kGLAR z%f-t}2;t4>7h~1fHi24cLp!?*&{$DmHfDQMc?B-_KuD- zfCdn60sU**+w+S{NTkC1!W~w_R(C~bp<3*=pVgIG8zNRKji?4__jWk)A=^M1$g9i`ZK?C3fBbz%5637r> zW-!5FwA|zNn_ZRtX2oXfiS~ zAVXn;^CJq-XAofBu7dI$J#_R}sgH|4u*ByLYHE?%)T|fO%*(P)8DPUTQ#fWv$_?N= zDqWR}D=XySK-R|JB>0|JDa#TiCnas0{TQQXV$v&5j&e5~V8V+B=!`2)bQ|z|&D*y< z&#$M|JXpUAiW2&h63MX5kiaCWp{q*;t??0FWo0;ET#uRNfVd0*Y|s(q}d{HWP@fOtrPiaWeOA zqgJh;c?KpYbN);8(uqy$9cd-R#nAwMv+N~9z}B6BYdt_ZKLM2ddxqr#l1xcpae=4Q zpoJf&rCHnCcgySNu1~(FHz?It4S`L$tC4Cjo@`$Rh1Fpm=)hh1FwOYmXqQG72B;}pDKM;M=RgG%kn*+p{A)Rfe?Y1%J+O#A$s&%re(+{fZd-^jsBYD-@)r; znTXg!*a^vw9az4<8&lc-0RdadMUsXC0s2B2E`8}2D}i7{P^eVj9O=8weyF;)ZylgV znv2W2AfiDc9&9h(#Ol?DFZPXsxmWS?lWA^l7DIQEw!fMQ*_=^MWRs=S(9pmi|A<@l z3+xyq{$X%I1!yUJWC$7)5?_-2!$a~{Ip6E(*3XQb7=X7**YHWI_>Ycum<9+r}-qi$Hen4c8Pc~4?2tiTN zCC{Lnj{vf$XT90MbBp zG@2(oA_5h95(KzI0Y-`!vg=Rs&+eW>is4~zhFw*3xV$ntD=W(ioWi@H195N-!!M0R ziHM1Ll$7#)uM`oMWwDIDaW=-&oYKD?dN6=g#>U2#=1q(cTg|iItbz!LJ45@=56e)9 zqL|9E?s73E{Q2pSuPl^-2D;r}%*M>j%!EPqxH2fcwUi%9<>25@Y0>h`_k7E>t`QzH zGc%X*dNO>T3eIlx-`;dFTs(gE;(@QCKP>pbZLB3w8Uc(L;l=XrTGy`vyZ$F8O%E>N zt@C@YB{Wn7cw+Swj;l4+ABhzLc4B=yeCO0dMx&ird=R71q?yfO>!j=xdhG{2AJ{u%0j;z{?5* zUfM$(H8cLkndNFjety2jp5^)krnL)(UG<)o#(F59SQC-xhzLReO)=ZvN78PYd3jX8 zdr9^OTm4XL1_C-y#Y+}#E?>TkxDrYr$it%|oKiXCKf%V3HZlRwK|@a;0jC(5L=zuZ zXFcOU!M#IdSTSs~snNyvS6@%>A?!DP>%b*-O*Q#CD`sYAQy}m&E0|L`T_#RFEJi;L zIGBy$gy~??LqZbphI5#FxCl*{cLEcXWeF9aAIk;qZ*rgf!-dW#h<<1Tn{3fE2yrJZ z6H^QfJtp1xi1+6swE(zjg#9-^ti0>76kMca~CO`(*lAWZ9 z`>TDGABt(ynvMPjnZ&7uhn{Tbzi~4&A6WfSO@V&!_*D`5@!gB($s?nq=f0NQfH_lz zk6E|L;2B$3ZkU#Y=Pe1_8tUl31a`Jw9C(Td1CISTGIAb7LG{!F7*)CZ`c@xo12E!S zwCdN0^bSkfNQEM=MNm*PaT=15<-hTADMy8ckioRYG@J`@YPN5huZQ}3`)|Oj@y35Q z%ubHCZy`%;{15iFaJ$`T|uwZ#>bQ6LztSHnrko>gE^(2X2n}*9T1`vFxzZ{ z2+gl&m_?{G54ML`;p$bCchT#VbOeIH1OHio<=bl$Z*RTG`{s|sUfo&wP61L$6NW$l ze*T(YSs*O*diCnnSd*_P*rrHGoacUjd(q7M{nJ8!=Irm^WO#0nac?WoCcBL~*8zy* zzV+)mpMb!}Z{O&_pEUEf=mF77xsFFd5QLwjfd8$2DrT)!mPOn#F~JI1N)03m5Rhsl zA|FBqLT0b%YHG?{R9rm#-pc`>*1~K@Ciw8m+S;0*=6tw?4NCzK8xPEAAly)c+!O_D z;Jr3ROGQQH`1AF`4d*T=ZAf=uI^@1I#C{LLBY?z@bq=35p%Ksk?#pAf#oZF5%naYI zp}O4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Cprime.png b/python/img/Cprime.png deleted file mode 100644 index 3b7ea5ac16931e5cc187d4e66cd2aad262fe02b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72668 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 diff --git a/python/img/Cprime.svg b/python/img/Cprime.svg new file mode 100644 index 0000000..cf29994 --- /dev/null +++ b/python/img/Cprime.svg @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/FL.png b/python/img/FL.png deleted file mode 100644 index 32a6bdd71bb35c7ff68a524ad7887f60533805d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12132 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 DiK&;> diff --git a/python/img/FR.png b/python/img/FR.png deleted file mode 100644 index 0001add40064a5d005a17cd203bb929d9cd7e548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12765 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 bW?;)Z1MwEBKS}Vb7btaQ4NSS>-H`tUP|!3K diff --git a/python/img/FlFr.png b/python/img/FlFr.png deleted file mode 100644 index 6f330239b132603a9745c83652b7eb7ec1a9492a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10629 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 F{{%0S0l;rl4F_DpwknF#5Sz3*RWP1>PowH{b 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 diff --git a/python/img/H_Ac.svg b/python/img/H_Ac.svg new file mode 100644 index 0000000..09bd358 --- /dev/null +++ b/python/img/H_Ac.svg @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/H_C.png b/python/img/H_C.png deleted file mode 100644 index ba16b8a2af1b08a089873ac6ffa04cac0158accb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19434 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 diff --git a/python/img/H_C.svg b/python/img/H_C.svg new file mode 100644 index 0000000..e4b76ba --- /dev/null +++ b/python/img/H_C.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Heff.png b/python/img/Heff.png deleted file mode 100644 index 538454d214a5160689c7f3b2b182a25da8de3d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197712 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 IEvBviKOqA)bpQYW diff --git a/python/img/HeffExcitation.svg b/python/img/HeffExcitation.svg new file mode 100644 index 0000000..9800f8c --- /dev/null +++ b/python/img/HeffExcitation.svg @@ -0,0 +1,862 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/L1.png b/python/img/L1.png deleted file mode 100644 index 2e44103a48fe9f0401e34bafbc65d862d5227143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62039 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 diff --git a/python/img/L1.svg b/python/img/L1.svg new file mode 100644 index 0000000..52890dd --- /dev/null +++ b/python/img/L1.svg @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/LB.png b/python/img/LB.png deleted file mode 100644 index 008dcfc3c2007cd26e1570bc1198978f1ce42ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17057 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 diff --git a/python/img/LB.svg b/python/img/LB.svg new file mode 100644 index 0000000..fcc7e75 --- /dev/null +++ b/python/img/LB.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Lh.png b/python/img/Lh.png deleted file mode 100644 index bb605c6e91c2de9000c61420126b90f1b7be9756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10279 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 AjsO4v diff --git a/python/img/Lh.svg b/python/img/Lh.svg new file mode 100644 index 0000000..250a3ab --- /dev/null +++ b/python/img/Lh.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Lh2.png b/python/img/Lh2.png deleted file mode 100644 index bbd38c8c9b941b079ea055b39a8c006165c52dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19137 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Lhmixed.png b/python/img/Lhmixed.png deleted file mode 100644 index 9b6278bb2e64d0b369f488c1253ba3daef059740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9630 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 QC+`agFt;&lH1Q<<2PAGo!vFvP diff --git a/python/img/Mexp.svg b/python/img/Mexp.svg new file mode 100644 index 0000000..2924d25 --- /dev/null +++ b/python/img/Mexp.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/O.svg b/python/img/O.svg new file mode 100644 index 0000000..f22d277 --- /dev/null +++ b/python/img/O.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/OAc.png b/python/img/OAc.png deleted file mode 100644 index ff73cf02b5a1418b329f61c777b1ba3763ba77d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17252 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 diff --git a/python/img/OC.png b/python/img/OC.png deleted file mode 100644 index 91124adf1eca3f2598e5cb7329b3be8859a5421b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15177 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 diff --git a/python/img/O_Ac.svg b/python/img/O_Ac.svg new file mode 100644 index 0000000..f903e5e --- /dev/null +++ b/python/img/O_Ac.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/O_C.svg b/python/img/O_C.svg new file mode 100644 index 0000000..736225e --- /dev/null +++ b/python/img/O_C.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/R1.png b/python/img/R1.png deleted file mode 100644 index f17b8c6196b9ecb8e349b00e63153d3faeb35031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62937 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 XyMEtYEM_XILgDN%L3w=i%&`9fqbAau diff --git a/python/img/R1.svg b/python/img/R1.svg new file mode 100644 index 0000000..afe27f2 --- /dev/null +++ b/python/img/R1.svg @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/RB.png b/python/img/RB.png deleted file mode 100644 index 0c3d0980ceb1bdc70ba667bba15cc95dc50d3655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17644 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 DGVL8` diff --git a/python/img/RB.svg b/python/img/RB.svg new file mode 100644 index 0000000..821e9dd --- /dev/null +++ b/python/img/RB.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Rh.png b/python/img/Rh.png deleted file mode 100644 index e9375e828fec9319f5281abd3cf47dc981da04b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10431 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 KUn=`3?7sle)b}X> diff --git a/python/img/Rh.svg b/python/img/Rh.svg new file mode 100644 index 0000000..abdb1d8 --- /dev/null +++ b/python/img/Rh.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Rh2.png b/python/img/Rh2.png deleted file mode 100644 index c2c4bb42962a2794884018f24213b9886ed06e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20228 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 Zj-3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Rhmixed.png b/python/img/Rhmixed.png deleted file mode 100644 index 6b1c3b367aa6d6061a72df51440256ffda803a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10107 zcmY*<2RPPk`#%{G5*b;^NU}$E$jS(1hRp1}M`qc3WS0>_vXY&>H(9q$_6pgX-+909 ze;mJ#^d4AS;g}hRf#=Av+3k3xQPgX`!83hH^82]lo0t_m&BSALx$a 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 diff --git a/python/img/Vl.svg b/python/img/Vl.svg new file mode 100644 index 0000000..e033808 --- /dev/null +++ b/python/img/Vl.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/VlX.png b/python/img/VlX.png deleted file mode 100644 index 4fd1f7c5d38165f7ff444fff61d93a4915cc8efb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6045 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Z.svg b/python/img/Z.svg new file mode 100644 index 0000000..9f7289e --- /dev/null +++ b/python/img/Z.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/Z2.svg b/python/img/Z2.svg new file mode 100644 index 0000000..d9c8205 --- /dev/null +++ b/python/img/Z2.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/centerTerms.png b/python/img/centerTerms.png deleted file mode 100644 index 08ea2e5e2a3f285669466b4e469e0e0df5b4e3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15150 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/channels.svg b/python/img/channels.svg new file mode 100644 index 0000000..8c435b6 --- /dev/null +++ b/python/img/channels.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/delta.svg b/python/img/delta.svg new file mode 100644 index 0000000..60e7852 --- /dev/null +++ b/python/img/delta.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/diagC.svg b/python/img/diagC.svg new file mode 100644 index 0000000..d83ccd1 --- /dev/null +++ b/python/img/diagC.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/energyOptimum.png b/python/img/energyOptimum.png deleted file mode 100644 index b34143c1ddbde037c67fb8d8ebce62dd5146d80b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10957 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/environments.svg b/python/img/environments.svg new file mode 100644 index 0000000..d6f8cc0 --- /dev/null +++ b/python/img/environments.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/equations.png b/python/img/equations.png deleted file mode 100644 index fb78e90529e381c0a0a6a35828d91b9e0fbb4776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23541 zcmdSBWn5Nk*DpFj5G6&CMnFP9Fc1(>LRv~ny1P511cR0?kuK@(77%HqI|KniN|4So z?)5zHyU&jIch275_WH2aQg6BEyykU{@vkuh(M0 ze+N1DO2dCJ9E6@LU4ef*t{D2mugM%mRUH*=j2&I{?2Ql;Ya1&gHU|THBO_}EQya&v zOHKUnAqLckgzb&=9L;R3X_U;Yj1WUJ8urIDHWrRF><`!<&^&m+`;eWNoyU-;t`I?J zkmn-LlwKvQC%R}7sT^DgbV!OTag2IvtzYNdALk5xc-d1(BwgO%`G@Qh2J-EPmEtlS zF}nI&0rU^|FN+y`2o1y>P!)V8xQ_XZ277(;=&adh(}kq6r>C#S6J^*f90Rw zVYI?!SH>{9!t2{k!J>_?#`#JC_Il@nw`D`hV~*|MR`5A0m(Yf6JGp zV>8NpdY_O$DQ@zwB?t-r=SJ+f!^6W>YaN*zkCrLKO?>`Yp8xzal_G6Sz7Ft2Rwv!;={T(t%O*~@QkIe-MWR3*g89l4SklON}y;j zHfYBmtwFr+yhviYUL>28VwCmp_*nnq{EYO8Gwbis zf}j@yXGC#vae*1#^F-o|vI+h_e(0`GR&)=j&7&^6E&1a|QVc9CI(mAHnwpw@DSz(V zJ9qB*g;4Sc>AXH-n5l7SADCd?e(G@;rm3lU1;L}@E$=^D9m*Oi)T(2mqZ1x*9Qpif zOvft`DYod0VDK?q9B#{$ip_T3m}H$*(RTHD`|cg{!-wIYrQ`G+i!^KOch`!VSk&^b zi^@-aXjo4&NXp2d-)H^$?He!e6VZ^#NfGx(3P)ZlpZD+OBqXlPG`Oq0ndbG4P{6my zZsS@S*Hl&}c765g8ZudC5<0Wew3dy?Y_IZ{KEm`ZQtrd-4lCJ-u?%f!pd8 z<~Pr_+o>Zcs0x&&?y3}KsOWe`Hy9Rb*63$lx5Yqx6zQ0lh_jxpS6gX}kEcMRp{Az( z#N+U}ms-<&_;0e;x!G`y>2&qOrKP2t5s?}s6B84=KSKo+G&Lztbmkg8)yQ2or&Im? zuekmB@rE6fMUT71II7Y;#EJNxrUb%7L-S=ojagxMobmd^!3=CDH8s4cwgs{0%ziw> z#_{%6)?d8QFua9?gw|so&o&o_mzjJY^hUeXF*P-{@~&riX>;>lZPmw^7%@J#T^eL@ zaZw~)EI4gt#dL6O&-vbf00rFG>({R_ynXQ~j1?I9`IFB7CSQcr)je@Pnya=GR(3NV zacFvd_QCStYrqZ0rKsE>I41TkE?JLE`o=%)T@OvS6nkFx%Rk-q?=ptB@%N;Sm3$&H zbE_L0XVy&2)XNN+l%M6&t-2~|X6jsSAUnIe8SCqob&E1L&ZP!D2PQ&Te?`ixho z-GF`n{{8i-DuTo(E|s)ZlqKu44HRd`d+)^3pTQEFj}=-ebJ5bG@wxAdC@5U-ioG8S z_dcAXDDJ4PuzR}DhC}(pxyL+#pPzrFKlRedN%K3bYTNm@YOXdmHuc-zD8w$Lq@_g~ z-1bt&*3ghvU%WE&UzMY6osoA2N({tVRf`cgUN@*V|ID}cuR0oU)z#IdTZ|PlZc%aD ze$k)){QKKLcB)la?pj*;OoRv=UvzYI1hKQT%hqXX6g`3>Fu%|ir2Ml$KK(K|r+J3N zt!S}8&oxJ0N`8-VeUHY*M!3=7fs1?E_5SeTxTvaO?eUYDl%ds>0aL_(sET>G|5g{X zxLvUp=M*E&%(A_`yWbaoC7y9fa_e}*3cwSuK3tJOrQ&$kdNDKs=RF(W&B`?QV@ zi99Q91Gu!Gq12s|X%7zh;z&kP!OO@$q%Ud@v&*BOGCNla-aN zWKAMNd(ot;wE zMp%oFcoqfsWJZG1<)x-*M8`zU>KFpTK`fb?QczBuF*-Uxc zkhF`MOQ4)S_YYUHzykW*cE-4{#jY_r{6WKlbl^ldk_wxJd>gsMAiBA8WWDlY9 z^K&2aWaR?&0h44;F(|o@uw%o*1phAg8mzJT!a5rxKoRQIg z^!Jz9>ESkOzMmhK)m&rZJ+0b|+B0f%3yQD5YqKq@GH7w-*wo78HJdnEpdpThPniN`^~6|{(SH324^LcQ;*<7C0vfM=o3TPI$D_a58Q#m53g`g0`*K`2r)z}o-MhCq zKd-l)8vRx_D;-KzDb^DnTKS zrcq^GL2A4@m?>T9b#ZQNf)6k#O+W`d%KK`jTLltY0y$QEk;#? ztFmYDB%L2nPTYzq$M^kYHAJZ}x%ANB+qji&FD=yv_?n>Ky4MI{ch0OBmBWL%-IdAh zi%TYiWW$z*vrI$uYc@^Hpi@)+^^3rGJL+h<$POq|tHpdQdtb55}?N zUrS5!P^YdSy&oS6E7gncS<98aoA21~AGOc!bsn*dUk)3*cL9*W(phx752)47g`G80k15%Y?5I%1@)yIrLgEenUHaA|h3tkeHbBJd%+E9yK-rfy$|H3vpEW7JxVP)8g|# ztprz*hKuu)G_4@wk-BF&_`c~=!Z}NFWgEFOTx_(JTBB=wN(Jhi=z?>e2Z_C_F-m_Fr1m;3$zMC!YKm1#qI%*i2c0(?mcHC= z&%CpY?2c@Lu2FfV-Sl;rt=UZI`GasSgGX7~zkcn9s$kk3!^Y6((okU3*VB`cl0rky z=TSM#s*Ha3vGxHyU?K$d)9JHrl903y4w`aAXrp_b?UCTDEiGks?VU+Zet@$E zZ9%=-mNuB|k?(R}q7?K{M!;4B0|OkE;}1INk`$a|GV(WKI8b+qWWyRL8#(b(p?a+O zXnyDKQvJ3-j#qzl>9#(2p6q7=?x&bI?umP3bxT4HongZrup(4{2nh!zioz-eV)<~|Ja7S!QXjn)=FNx zXl$sR+RKtitdA4gjr`Hjs-xq=*Q)?p8SyB&!wRT&4-T@N)<(mX^KRY@oiBZ}{j(i< zS(M9si_dVAm)9r`=8o2Ng<}kEs zzh@cv#AQ&ZWI5N^uvi|1o@r?eozHSL7`p7sY`HfTDsU2v{d@xV)ahwnj*0A-%tUy@ z697Ido~@J<(N+z|=-cbDd^JT!{(viwt)~Uu+;}CUS=!FGe*Sz1{cj$&!OCa> z#brG5_kVwVHvnRWc(Z9#ei<3L2_%y+F-E;uB`z@`!LlnhbryHe%wLl)9@RWvZ8aRg z;S?yo@Vq!XsP;HwmrdlwgzjZITTccZnvg21sHjNB_4+kM65m(u?yW;ZH(ur{g(t+! zqsizeX$b4<>yK}J`6Ae9MuJ&6DGhi8%JbWISOjTs8m|x#wEt*+HxCyH^v`jnAC2JF zQ{5f7uqdJ?C9O;QC0Y-mHgzpLGprm;7bh6bQ+eThC~$sw>0oP49Ja#%?4vS!^#WqR zo!@F4ej!LS%S$0?Y1~}p0`rIGKnCb|dC9lx|Kj6Q@xBMfnj#*0%Re|+v_QSW@YfV^ zl;sV$=?74z-uwEZBQf`N@Nc)ks>;{c8&UE)UNP#9iN0CH*5N9)n6|%P%suh1=U7q$ z=qnZ0RYF?&D}dei0ORjQUTv#oaTem9#^}(AHx7Vfj4lXdDFrSK#nMJ{6#X={v{t*K z?-G%am^hwod0o)a%qfaDyT{Z=1EK2w^5&9SsLgUu-0s1gSJ?>}8QJb~yiKV`mG#Wz z?+E7BJ=alVvmRQ?vwNC=KGU;aB$IdMYd3tFaj~`@W&V;sgcLzZwG;(iKM1T0*U*Qp|&=f?c zqt>%hCTC;k1KFc1OddaS*s|R&)A94)s&m=89Ofl`>~(RXQ&tLG7scJ)zJ2?r`+k#P z`hZ~3*iS%`rW2)^oj;dez>Y*#1~Y@Qf39PG`#|L@d7~xXrqRr?Nji>w zyw2r5VABsk8faik00nAmx;V2bv*UN&d4KkLDOyG3S6f(j?ESL2yUO`rs_lMacYe6V zM-CjU4XR3be0&gazaK!kW1^GDVWsg*a@g6~fk~$hkP7Hau1tgxv#F;jX2~AHXFi-? ztY#(a4`w{)YQInN&`JK9fPjEfw%jv&bzeH?ri=3@5s{HbJ}=jBeKq50Z`Yq})^WRR zQr6ekU%PqJ2gHGjuxZ#14_$W*r<=T}Z?Y(bS;pEs;&Fd-o_qBZZ*h5flEE5LHpyj6 z9WmbqAp;!&>dx9_4PD@De}DhmldXC>=7QXpd1-K`tPR3``17EZ1orAmK3nA)fI|u( zr3KUyyaw%1lKa}aK)oWw|3-^!KDv!nQRUax=^RvMC0S7u7Iv*CS%4Zgk~koR-@`cu z?u4g2zhX{3Nw~BxC{)P)r`->tuF$V!Z7pk2%KB?94I4nP?fvf74lw!*+=y_|wjWCWWvZVfcOO()tCK%6U zr9f}3QLIdY8OLE3vB-fdZf02{8GEl_e3>^h+~N@wF1>kHs~z{_UFOI&c>eiMB}Xc} z)vd+|DWARyLr~%az)AHeHpS1ldG{SGmI@LXbjKOdZO657-OB@jff(5FK6#SYf)iI^ zA`(D`%USL>+9jW0SyestdDvNvJH-Y_LtsYHB-sbiAmVwb@rd`ccbDTRAr9B&?AVE$hbI-_LD~)x1x2^mDEg&K1%-+h(1+yJV>-IJ z^qXd8W<-~=Xj)7`?TK%5`od{GtlMNW*T}}Qxx4Ggs#YqZ-1v2{!QI92_waKCQui1& z{9Ctfb@cRLAcn@q#OjJU?~`!s7rq7vU1)%==!;L4D{*RH0*iG7^_n3|k9$EmOP1;s zxOG~q^;{zra5O9gAjCD`KoLVE!eU~V@ozo#hu?06CIAIltjxGqq`RXeZhBhty^jwX z0wgMEAYD8@`V2PM_!bb1pnI{j3QlY(%2Q4l(4P=*e$V4C-QC@3D2kXQ;Dt{!=e#KQ zAi>YiFaMRL=qi_d-UxZGH}v@TettjmiW*CKtTn<;K1if;m;bZJ>i)gQ;QRDW_BYng z^lk(?DiRq3NLk+S6|BPbateMF*$90f96lZFkavXm3 z^;kqyRaFfnv0AX(TQ2)izt+{ur_wg9W>n7&Qb*&dRW94$MQ?T=hHhKX1+{T1zmS7G zc;J>Gnnn5--?eT}507S1(cGIu^gvKUDQPwwn{$jAG6!s)#L9J9!R*vbln|k}d z+Km&oI@7=jtz>na9+5&96ScK{uEAYR!XO*KTP7V&j&dyv2&Hei?l#*~!Xas&FLPSo* z)&Vts+@@p=n~#sLpb)1r8X%)&M3qb2QdneU>+ATzngTa2dQgTGKTD$_7#JAvGYA3# z0@lw5Go@}Gw9sK%IHh7hu`6oW|CCV-oMpX=Z3e*1(kwa zBfY<~)Sb5Q*bv$;YkkETi|?=Z*&_}iq{FJlt(V?nyOrH8)%uPOsumpy2?@F&AgI*E zMML#QkD39d;>gHIVS<k5uql$K+Jr>B3vTZ$<593KE0rwGO%+5Ki< zO~ifgUZ1IzE68D;@`enkl>|0+e!OOE6lH$Hhc6mRhU4yv{O#Mz%nGlt?%D~JYUcCN zN%rVwr}7aghAimTiL}jeWj4Np=Ol%!{QWMV!sxlGb^Qd@uXX?YXzu9kZ38vA*r=O0 zeiZrE-cHBGHM%|<4CF>AYY2s;(iZCAVVziY(M2)T{>FA$Ho={(giKl_Qw~r!;=#O*jQI^ za11Q&1zdr?F8=COb-ttJGij~yE&%p+2b)^^RZ;R)@84r6LxGT0-VkRId4Kb+@|V`u zOL*iQx)+ak7ih&Uhgm;@PQ{-zOd9HRtZNAgIg5!qi6xAc+5Axd4#&Dd| z4t8%Y7F5l?jg2K492z1dBQtY~@t7zzVp1uj1Z?m=_P$Ptic@+&B%9=ikL>!(ow@zFcxypDj#(=sw% z29W;+bfNw_7aKLR@fLvwK2{0PZc|=OeO8K>dj7mQ?vV+idZ2%YT(p*%3rHb$Wz6g2 z-POR|MIb?<2oo)B^WquQG(sdWG?e5fX!Ji-U&yWFyEk7vMUFvtWb1NX9}n-8+%{+E z&r!T1pB@H4^fo|$^qub)OnuO?0W=sKZSU@KFdO700rJc?AIY^`%=*ze=1V6m#6LJV zXc*m2{B_u;KtxQelmpZ(dY_wOL2pj~(nc-sZ%ko$13)p3#0__he=a3;L+k$AEItH< zdDVlbi1eKbE>FEY;UNVT<~G7%+D|i}r=X~4w!1PQmL6SHzk_Y@*ZY)n&i812FcT+{ z-*fVFz5371nYxSt(`;aE#7mY|Hw^UkI{NH3t#1-Tp@oYTNnIPllT)>v#1Aqb|ro!0?-YkK{cB{#~{M`U915 z&&M|)Dx^Sz+cce z|G=UwKy5+1QFsIVLNWH#)YL<0?rN@OWo0Nc!()HKBx11iCWtn7eY5%`wQMYHytd$x zp(B-{LWQ_AGsg7|4fE^ks2hW=s2;_cfJyY^k;b)$waP&ozP`SbPM2GiH3+U=Z4MPU z_eY^!5cY|esIuJleycXPaiYpCkjI~(^nta3KK1CzqWb^^uOpLsx#^o2HjPOSmJ-s@ ze6>pj$`*F}=*0yx(y$LTY#My>^H~9cW8SzU%SwOa`t`RtidhRlnfwC-TY&f*P1S0i zuWqFB44c=Xw@q+mPENz-KwC@>${+$|9pylPD+r}R45Y_DfJMk_oH$X=NqAC{^&Tdw ziqkVPs^>G!i@Lz6mT&K&uzpSCU>iK|o7fgaqQR%sZu_n*>Ybgp$KwVd;Fok=bNW&3 zE#lqlv*T3IcOwSnZ~;&m|_!2O?DfY zk&uxQb#&waKOzWv?fkD~FEL|dMsO&vQBeikFLmjGTjeu50}L9_^fPD{*iQ5~x2t44 z_SebI_lmscL1HE4Fbz{vNw&7OCgn6If?a^nTnLWBgA0-szbdKko=p#Ov~VEsg%Tb; zDKrF^^nqabE*iISfD-srBSkvNh+Lj>0TUzW_ z|A6#EJDs?Qh=|Ara?Kd}zRCUIUcC0f-@lLSAE|}G*OleukUcW?XVFknBElKUQ@Jm% zhq1pk_r0YrfoCWKC7r?JBt+mK5@%**Nl6M@Wta2-zBO@GFV=nYoQ%hfixmqY=dsTa zb#2YDpPvMhySOv{_G4{vGzi?K9I)%|Fz3&gpFm+{?E-8Y1(XwI%QC)5l9rd3Cn6+# z22U1zp9z!XhZA5w<^orSW*y*tdMOXcQEMS44zYj4Ly?eP&_exu9{xH%0@5JnrwtOL ztkN`QNygfOXv;7Jy4=de=P-l0`#Oz=-72*%Th`m2(os#6^4yL+Gc$=vPhD@bP-R{lx;0rV zlAAp#Y{68bHWOZHAptC#c}rJM>KU|nkn)IJv3@RgMk-ZWsww}0?MKm|$)+Vl>Ocjx zLAg}VGa_VQZL{YIKZSrbPA5EW*G;E7Sy$&KC9v-n<&)$c4$h*lADw0%&g@@~v%c`u?V1{o`Dj|*+=bk}3 zEoR%82l7UShH~Ij|9phJkRUDM^#e#kDeGwBOwymSW~l|k4NABzqF zQK4)%?3*mb_`U$DEQ>ss9kn#A#s(;P?BB1-Y^HPoPKZnPL>&M8cs6k~QDH&S{e8N| zVFF7Lkj38SOgus~X)*xK(0r=0Ap3BsJfOL`8N>S%mzCuAWC4=s5Iu31^V6fW7ABvM z`~5Klf72`p3iK?nS_l5yGx*{)kR}?K!6vsz^#QEzo8+kxZgFe6;5Wy2s!nkq{b;_F zZZPa)(enPPaqHsJ(f}0DHba5q6*^wGT_y%b#z8=?%uG!F4f&vAGj)xm(E6r_DDZcI z0Pvv;4jS9>N_wa%5LXWKVWwQURCKfy(36@v#I4tT05>Hj%797Gv(M^zEnvU_juNNY z;MeR&_cX!1ABM1r5XB7CaxoyUoV=Rte|A8`h4wZG777uY`?HK;A0nU#K7M|Rs;VEu zEnXtKP!ERy5U;|X;3VUM%mzvn`t;DicYp>1!N$k`40jpl5sq?sF}!)5ejBpS67U~- zBXXvu*#j5R>$=xEEhygaOH^}^k@TD7DT?QtDmj)JyJ5 zT{qDM;Si?{T{D;i?Tf=Cy$ zY})l7p)!g5QpDE>UxIo$#FU_oChJ`)@f4@1T{#@CA0SDWZYgJC=}ReL{RFsgxi2W) zYRQeg2~i2anMcN{wlJ!GSJGDFi3^VWAzS}6dEyk zLp=a9Q`nSIz%x*q$i>!FRndQ2`W86*SHmhbxo+PUQlcVW$JIy&qYcBG%W_<9WflN| zTK!|2S^Bio34@&3@~`7n750e`T#@_u=Z|gP{Q8X9&8b_GXAfLN+?g)(P~ldL7cvK? zTS>ZNc>!X<7;kU=%rZU9^4#8@JyF0*yWGRvoJCYrwDS|Ow3Jl3z{P1K$P^NwQI*$@ z_K`#7%YcFf`47k)K%Wl8rmKFn1{M?H(u*NfMrU_d(@r?pi1;%dSlU3_L7SlDBe?_n zcG7INz9ySQ2ei}R7Ur4e;x=R0$>3rEa*Y^J5E34X((%~#SvkaIeqO75!|VL$PM(Tl zda`Ih@za_g?1E{h(a2l8iL{G|X~sZLv8eI7l*_|P_zad++>@VGJvEQ_Zn_1f&2 ze6IU8H3;!r;7EpZfB%t9!Yr#JpYdZIVZl~e&*bGlaMMXN9p9=W{h9s+Y z{kZu@kQ^Ttsl%hhM50(;VuQiT$xHv4KDCman%mZ!YVk4P&^+ti#g&?Bnu>eFvZySV zE<8BUmDt^34QC6F;NB7v5+Dh|H=HehDO2)HC(O>KuoEi@hjuHd&0el4?2yZPt zN`DpWV{ijFXa2$J=B6y1+6ty7NIZ<<=v0`$BwQLS$Vc{)=%rJrc5#3bI zO&SSdb4oRa2oZu*+b;#ab4aW2z4C~ZJoqwL`y^C_8E}>F-@iwY^V7dCpg*+Jx?aQA z=WrR7Gc=?}bOBOvWxb4;6gmIEeT%`WihCR=8Eg-fbA_DhXryyHuU6VxF2fEOPI-0- zT~J$FyBsunR1|`?21GByu%_pHbabs~JZx^1TFZblj_3WT$5$%BYGKux5n0&FSB}cZ z;bb@Iqx>8Xz&H@!B$Nynjlq%;)GwZ|ru`{zRvs{@jhTz63OB+}_RF|$$#wBNuLygl z&h;-N*!;PW8ZrzGh+*opN@M%(uP%0OCCau`?6;9Sz_m1)@PoF*admJPwq)I6u*(A_ zX;2Fx6cKWy=j`nK`S9=+9a(dM0bn7jsP44(0VCr29Z)>wZEcHtt?}Dd)C!oiNX+T( z-VNdeOW=TOB2`94hRyL~BHt5Ik;w`#4;Zw@%;{NKKX{*(2~xhX)m3e7 z?EqaJ6u7DM2mAuq+VZd7MpCR4-p*nUw0ebF7~#yhcXX2KBt zC}zdWDCHi27jyyqQ?OScywwb1ligwmAxZ~*b$a*^`2o7etAiPr0dNMP@Dl-Meh*oz zcTy>o<}40yiUvxJq%bfsOBgsRb!ES|p=GWKS-o;|(+7rzGQ(^E8h{z652A+YXg=Ak zr?0#r2!@hXR)%wK;6%p8wsZMqWoDv)bGAZepnSc)AuH{eF^U|3IiLredEE=-yEYUr zg0N@`SgfdiFko!^CZf=S^E%KYDERZRtt2EQ1QQ`v#NnwI*9kpX?z1$RQl2s%5SF$C z9)~}Roi|YM*;(zgy5^LKMshf8s7oDls+tM%!v9_-9EBZlGAN^>$bI+0mVtxb$1#OKf-EN&W$fT1Q{s<*0_$ny;^+G~|X`h;#A)wLoUMK_A4cuC6AsKk1r}q6f(C2j7*3vh{#X0)9&!TKxfO zsg-;?ZsPgMJp5sSUmXxKW=RE{2;pp7M=oy4Iy%;egfZdOH8ni!Pbfo7t2c5l@t=PC zCyU&ErJ1VQ_9L^OqUI0y>;I8u4k5%8f5VfofL^8L^d(lp?w_bK8uIkj9|Ua0uR!e3 z5R<-yH?mp6V6FTBfbnD6j(Zud;NBsl&A&3wh&KQq6!rHxho}Qsv!Mdcf+5_LcD7S5 zN&fpR^w$5C>1w6sjOUS{5C2@T{8#3?gz%r_HvS!U_Uphu+dzi-xsw0i|Jg6-=ZJUH z`EhqM&%e^(26s`5@lg-zi)y(kVYzxidf5Uh+!X-2KT0nKR$HOL3wRAd9Jgj?tj*vj zhG-t1c(;c8-XIK5f7Cpm9Sk%o#cHY&@doaN(%ta;AtqNUqX1D*ZpCC zj=A(c-#@0geL?pr?!!c$y6%XC zzk=WefMs9U(fS=>wBsNG+~RY4uU2N10}>ejF3QC7GCB%EO zz%m7bKnn3de_->XUZ>lBioaKZ#I;+? z%VJ1Jd%K@;UxL}+_E_@0QxGl4o$i5oD-Bq~XK`^<6g-PFuvx)JZ$BTaveAk82G5uY z5*kpBQ>5QWA|b^$GOZE~62X7Gj$orsy>cKCXXQJQeJ^U$3Uy`e*8Sp)6vl?Gkr9xk zuOM)T<2-&0IR91h87txcB>8-D4MbJn{N3T)U!Y8oO>73-xFg-g{E`G%?jj&2s23%i zYYf-LCjufW`v}DW=U+v7llZ0}s?9z;iBH^il0xtDVED62P3>fZ`(rek7cX9P_4VC* zn-GJmRMPo`nfYpaC^gENMI8<>Uee)!K#>!KttH>+;VN!Ya!uqtKSPOepNT3A;f+9RR5ktRje`qJ(*4BT(!hWBG!f zfg#o7XvaS!L=3u;NEUue zia>6Iz^&mH@&JWgovkgj5}vwVhlBL>Ehf$bRCq`aL{w-+GP7&bHIE=Ez~&no6a?9k zw22c4ZoL&tCyXX>PxIXu%zYg+s4aCJ%vQKfB+Mom5Lp$I*VZhbX8o%H^LnsR1)=^D zb*2wWl-PjM3BwW^AHKtBgm~-2<2e9?cJSfIoz2b7mC1^{PIu95eh6IWClaPRq`X?u z>UE3G&4XmRQm)cfK#2Y@1Oq#SbvgR)g`MHnGB|r2h8@=+yJakX=IQCV3JJ42iL$>s z@`?4gW*hRwPljFy48WJJ0!s()S4yMOG8L9cK~T_JUJWog6Fd8$`Sd@s0RU;yCg941 zQNDEj;Pj#k!rvodNQNvg#I-?I;4r&w<|rJP1X@KwUl>{nlp1oMsS*P}(IcR}B$9VI zIEGCLzJkoLu1x})hYo>-zCWM`B4KaLT}H-l=7*r&sO86lqdeeRa>v|^AY-M9X`_OE z8=xp03|w3y25Le=+T0{zVd0Ggha-uSEzoN7j5Yv%q}tNb(i$&W3}@?cHKe_w?uct< z!go_C(+mxk0vWF;BH5xbMW_^N?@V)PIle0ML6|bD zA8QKiQ#M~UP)H&-=9-!&$eKarB=y9QOyr4DCqakV6dtq`cnFe`FLXh65!;)GVG*}w zhR2U%A@GFK=c3}`nD2VJr+nKN40*j_R>TkhYRUC5fguQAvEIekyKxuceSKQp!lOj2 zv2g+mzxeyNq~Q5wOA9B+8uIP@{Yw`t1|5&8l-x_cfgo!9T`FTko>q~s#K6n{E&!eR z_eC4zf}zfq`Zc2x&^kwu^wKW{h7}bZ{qj9eMGrubR^x}-^{@0CJRnqPXvA5S`oVy@ zw6qk}bwGmxiA@r}$>YfWb6s)qgP_vN-)hhXK}rbb9|v3An%5_U$JAo70Y?|WZv(({p)#S$hV&{Cj)bW2WYXIJor zCCE{J-A+gF-Z z>EPfnQTh<%6t|%9e7 z%xMdAWhMkNA0NEoKR+~38w0`je$G?ScTzxqf-vKf>E7>=2$M&U7-;S?wfb4jusPcx z1=~LZ8X`r3Mo2(FDjo$_KRjy51ZsDU?gY5mXV0E-xb2$8?`%Vsjhza{KZY|tD7Z1Q ztYdbzwfT5L6W@8yCIx^J7m}cz`kFAf$KiSG2%}l7<=e{m`oCMkKq^2N1fer5VHBc7 zSCIg?EChBu5~~RY_*HKv0vl1E2Z!M6{oP?%9-_w&3F z1@N%o`lNS^U*{Y%D2!@Lk>6mHra^`aG#=-b@+O8r_*)1j1`M6lO7um^pS~&%7ykyZ zMgds+#2lP{l-m39mAK+y?Nu1MQl#KqYTQd+ zx%;iNGk`@Y`^#iDpz^XyLTzqr*P$xiJ{h-oj)MM>rM*(T*|7*Le7M%hLfH#o33y=5 zllK%YwgLNfjOJWA%DYVInUWc?k)mDnc=D$MXf3yIPgdK}p&dzWEWSEp4m>~$uf`X% z8*sPl&tuLgHv##=Xd|ZrZO4l@L_o9)8|sc;)6DdA{;da`MqNaxyzjE3M!BipOYkYt zA(Ykv%F~aHjbKO-qZAvMtC9d;8GJR+s1zvq+=$>hOG(F|=Z$Xx6ASFSLpTrkNaDo{ z@f?NB@e4>@^}~8;Hoc~TD&Cs%?42!?YLq35paLn?wYB=dG}DF@aQ0cs0Bgw{u@A?m z^5cc)nJA+47Epa|y*`}B+HV3s{1%AL-#|A1vAFmiNPjx8+O(g$dwUhkFVJDbUjxGc z)S@)Nb`e9@@e|yj>>vniK+?z7lrYqYha3X!dI;JT_md|i*zO=^7@C-*gDaY?T9UR{ zzTs2g91#=aODpXA1B4M&bfl%V^&#Z>4-XG%fF(jT`2u0Rj~=KIg|_=Io4h^OU*dwj z3Ik1w9J0c0yDM+t%y;5nKsf&gY&Fz0a1$FW_##G$o%K2dLT~ zpe?7uh)n511t!mTf9Al**`RmYGPI%~+Exfb-U+m2|K!)lS0TKkOi#dYy?x&%pN?`A zeX*#bOa$yFv=pGs{g7=yjn0CHDh%$FBbYTnCLh(FA2eMMhHX`(|KO8Kl7dMEQ#f7u zBv0Tp9|Q89IQ#Gc*A0X$wMK|ySUGh@&ASO(lyNLy3n?Qh)NAz}fPx%ss9dDoyIEIV z&9tmPCJ&l4Gcz+Q70lO0vZG?V;9$fj`e>9I2J~)si%M$|WdQ3bH6{f8R}f+1<^6QF z1&2)Rmn)1B%ovWN<_f$$?%M<4E7%y z$U`Lva0t$ZA zdjT}2cVnZYMT;7bSuim%qf*msEl8+LidA>FMd7W39g4UQYGT zWgwOY*#R4j>P+Hwl2mw&0SWZhh2nCuMo7O)%l_8BQIYzY9RShbiYU!^Dy`&74Go}u zmfeBB&=**)S80A77JXLhxO&@FO$eAd&yy#SkV%ohliV>*B50imF9xTMrP6)hK~bKe}sjC=a0kM>Vq?%!+6=TNkV^i^p;dyP9Ed%eWC3 zuayb>YK1fUJB=oiQ6?h6_lIW|h`T=r-%Qx8!{DjQYKerht?xV?9 zb*yym)dudhm*(z_l>LugHZ|)Ov*=SM`A8wr)Dli7jv(NawtyDV(=}V;fCbq58vxnh zQTcY14u-Rb<;ee!=RML6z*x%zvO*Y1L>WE<(HJ0*!#O@vi1w$hSGA>D3ts*r0qz^os^D0J+?{8?PA4( zWEN8U`phl$r1EzSjqg1*9PN<(Zw3YTqI4HK!ZExd1!TQ*4*l|DFp`3bOS*&FjG-#9 zuE;W0q>}{~ggRgo*Iz)JO7~P9g|KKROuc?-QGHU}Z>v?ML{fonznf8!j_(B&jZ7$K z@jojuVbr4n47rShg?yEqjkx*OrBL%&l9D65e;Yptxy2Uje+yk@?bSsD0X=Mktwhmux`Tu0!Wi3l zl?^q5>dJzRRW~zVL1qf&j6jkT=*lgi@h!mS=70YV1jZ8-6K-%vsK(plyI72z{$=6Z z*CWz*zsxorAYy;EQ((Pc(;t;cb0f$E<%LxYRP#(|v7NBRCX_3+XR`9@j znp?BM?Iy@vLLjN&%&3%7CGfd(fgkV9Zq)SyzEc(E2O;AXmXs6%80BZ=3;q)3*BWwZ zc&yM%`cMiNFibS$^z6*YRp3cErN#V|2msdaY59P0BO5%9O0y5~)asnsaBQra0_S;X;i4iFV$|gf;_wKb zvaIw5b~y8)UXSo$<32cI*eJ;b5Ja%pdtm>RZrN!SkiV+0e`@dK1b=kL?fkSxtp>)y z(s>Dg^MNyn^h2?@*&TT;YyNc#d@fz)ojz*c{!bxiogIZ;4a)VAe}$ZtlzZOjLGa=+ zdGEay`HpD`XHCt7f#X9!k&$%sl79d`+(6vU_Qra z@JkJ%VJ0FyJfv;UwnW-AiWKHl;BhhhGn9Y#Q)t9{bK?iEkCsSqZ#^Xi>O=ZK7XccA z4)XlOHpB}4tBCUq7!dM$|5L_UbUX-ArS27Q-Jw6RvdU2Gg@7&S-7w<2Zlh?CYc=vH zOlK3e7R>&%ba&%G7SS8lAJ}9Fs1%hUQU1jsS-_Y@x8%Pfx0-d%c%U<*UJoJPKurJO z!8IV-LSRt)UjY*G6?N*3A4E-hJrhwa(Z_@m-4CT{-z!**?m1+h?|@tjU=cH{DW+P; z2b=gWbHaV41~(_QwU*44v4MSF;~vuVdX`>)LOPMHpLaXJ&BTN^Xk=t%(SgAEyXO$~ zQW!`wvZ|L~fy{;oy!itq{=$^qr-U|CJQ-T{L$I%n#erpxmzzb-7~h2YaTQsoBv)h_ zz!wt}TSyP(*Z-A;dWDDJc~bY7wmTj`f9PVDQL}si7`r7~VSw*a(7V|;3wbIzwUYl% zJ%8D}`y`MvWPRpJJ~Z@#$RvKx+S`0X;K~pp@MeVvt{0$jV0bV5{3+T7F>3D7x|?g9 zU-}!SAvItrUkR^ckX8;JlwdYll<>efVTkr}VdF4NaSl+W9e`WIQ;)U{GkLVVe3t$<* z^8u9wkDQ)Y8X_{mxA-Pahxeek>1|LV#&azrnNlRYp2y`ft`*Rtct*;RQiSg z;|R3a2^1F5r4d_dzv9ig>(F>i?${h39i@T^N4#_i9sLhDI_L;0Pqox}O^;&^{#o!} z1ZC`*2;vQo>A9@94D5dJzt&wqH-Ap1v3t5c@u>c2IlkIu>lUI5v|?o>FE(7-)RYO8 zHdCI3j6}Xx9dWYfeq2VmC7}56Kq3M;fT==YOxqprnn53zPI^iPjo2IdjQ$Y>Mu?GO zPa=3V*Q)cv#s;2=i3xnB9$;=-{(MjJ_{8{I|A8X)bxsi33m=hIPJ*|6<@M>dIAqKK}gf`rC9}%(y2mg(Km;Ta70n zh#Xib*{9^k*3|qS)h~}=W-=(Lf#z5sR0T1G?@imG5Bv0~s|60@SpGD)4-)}N0J$Qg zd?!)W`-S)|ct^lC#0ZTOedf( zGfK|dQb*ecZ1WRSQc8onk0QeIkhzvg%7}+=!r#b)KqBf*BU*q%Zm`kOw9Dd-321!6 zyf!J0plkzqJCd)TUI)cD@J2v)a8}=j@mfPg&C&X+0rPN~yD(7F4=;+y0Tm%CDM>ab zCubK-&mkBql!AuHe$?34-HjUHmV+#F{%6`MDpZOLPE9cxwNxI}=NHL+gTP$NS2&`C zEGd|bF1J!v{?;n&!%@)OV_EV<4dxqeEK!wY{0PGr`(LJ))i!khi7qpiJL><1Dt863 znyrsJyASRuj6WFd_@AJNo!|KP@83I?44xgg9TO@^BHKRP*41PYJ?*`=P>baZsV zE$8s61dNpa3mMw>Mx92F&dWFdNh?!HM_mlCQYI~LZfY-P#ROShqJkiv=r2rW*xx&i z*JI|eE?@4FeE~iMxW^Ti6A>`u$2TCg7epaC+sqBUk)nW5EDu+wJmwzlhZ=le(A|Jg zC3dRuPN=Pv93LL`!#j6O*T+kG2uf@GPGQ9Ne$WYw3~(`*K@O@iIRi#4(+(ox+?9y6 zfZu}B=WH?m?!mit!ep}^)h2`P2`Udi+L6U&kb*?p3zUadm!aXPp4mp`n!p32_S_{5 z0(@VqEbii9Z~w0sWEFrHCHh+iRd-Nom8yvjHq@O*xv_8x`!W)2g*=)k+Ci&e(P?}N z$2Ab*`MT_z@PewmRgDPRh_PEBV?{-GkBmfvTi$j$12{+#Y8&b$1x^pZH8gbp{U~d0 z!MrGB8FVjc8+$AvZCKSlY(zR)^L`A3rAkhF5}(9+?k+7aD*#lxDwyg?4COBke3`&N z9a(rkAEh*s4Pqs6!#6Vh@d3yQHfBGNq^-m&uXvXlHM_J@Pt*3YNMTl`<;Nk!fDN-q z2nqFuXHn^PNC+CWXDJ8Pzk6siTQ8LUQsF*C#aoS}N4ezrU;X*AV)|&2vGDYpwWw>hB`c}g^-`fxeU1mb?KYYteXB>{AG2E0{{EGZB`OkcQwfR zWFJ>h94b+lWGlvDvwV;-pYb(lv~3ypNRQ@m6n=N#@TR)dvti}@ic!_%{gjWrmM;yw z+~qe%IUd$XZQ92ko(ZOKxWrz}Y;7i=Zq6UXy3D$YpDlovG^*rWT-0bnv-khha^;Uu z=Y9N(N{7cL*`ypPQjDlbQ%Gc8>xn20im;Y6%2lR9q_UA?T&pPejypGFgeK)^ww07b zg&gB3_s#Q~{U4tBY5aou%=i2LzTU5EQQ_eMXVX_?*vepBH+BRiQiyK0t(c5N1gK{D zC8Y;vhf6uPjva#-)OvH@$MBt`E7LUAe*3!H5so&#-+Fsr!9@F9>eE8^{e5W&_&e4- zsm{mF2|_8dvXZR(o~5nXaXcLPZtLpBapU&#E2%WOxZy)x0XGHli>r zQp)crn)iqZIE~f1_rp-JIsjlrws%EeUR-u;O3+9;t;$9@j;6#Tjw#mG?>$7fzY1qNIQJT zLPB;c`dx3orYWa-)(DqQ^i$Cmy zEf2q3vQS%VqWJ)iH^#_~l1T&9j~3CHCvEE9;|k*l@z`Un%C%*`41=_cRzjqboCcJQD=JcR;sW+ zd!K~|yY1+C9i3bAb1;ghv{o&OY(Chw^wEJA`lNa{xwfEk@`;2aj6rNvVuKv4vGirc1#Lk9YE}7#SInZF#sjl$(+6wDO?jTv%9`{RCY8NBVC3 zwmX+LUvq7f(1Gr}Lw)~^a=r3SG#hCPs{nSk+58PHUu-4cO5UHN_a|L9B}U#Eo(dr~ zwn_{FYP5hS_nptnQ^wclfnap!V{b&B82R}y3C*2A5Jq&OtJbQL$$Zf>ww7q%aAHSC zslQGr$PM8TF(~1Pv7l;j7c4ceLeziC>=OTn|(1y zpTycJ?cK{yXe64VMM9qY#eva`%L6I9Y=OC(NSCNK@z;y?TO?n#{$OTpy^Z(+Vw}CS zF!OlUl}c4FkqjB$EqqsCA8T?GI_frLPOMO&`Au*?2L}gNc0>!~bAs-#>lu>~7fQ*? z;}rU=;^*`7@~ZjfaYBiYHr9QDIEHP-V9tltQX*~g!h!uNJ`-qyot2!-r}g+J(@aq@ zF|j)($*HLVgsgCU{CE!MvO+6N8?B)Ja33<6TV!Zrl?I{JfjcfN`nAk_HDHx_WEkHVF{xOh!V4B#qEmq@ zut24I0fdSOksv+rK)!Rn_SyrHBQ~`vgV4)cya86e&fv9kL_SK2x4k# zs@!j>Qtr~pH5VQM{<3GnrL~2LS(F!uF6Vf01y9Y1tCIVC!n3=qrY0wOVhFLUtuN{g zO9O23;>vLwa0CCRqUDh~?>q~qr+vJ?Y%S{`LDY;!L(ERMN`%GMzFCN<{QSM_NqU3x z6j_j;ulA9?tmXad-HR>*<+wF|L`-UUs{wvk z%xPYwyK8JIjlnQn+HuOvEZHT=D>T0o5Zf@I>*=waCqlF~|C4IZKJP3< zn^Q5(Nt)JVGMU{!(SQY9w?6PPvvYiu`MnV^qZg0*aZF6BPB-0lmqeJ`_CWV>X}z_* z=O1kjqbBE)eF=7JhCmBCOdFsy_hLgD2Y5Gja!ME4uA!3lXaFmS6Syb-W4vb@QYAvx z8L=+KZ`_#t<5-(OWBgz*_`g-F_Q?p{!^c)$=eov8uOFU5 zV_n@Ka3H^Oxm-M|4bThY&{*^5&2)-({DA5vp*88{{)d8xaQ4|1Ha%rhL_aM)12gV|b;#i$|C9#2m(8CKX0lZYI z?8ddkKyCymxXtK#6vj5BzFk;QLPA2tn`<%o-3Xe<7;o_n$Z%;kM~CQy-!kmVFv&Ny z`b7BPOa{2zt3QP_h)(e1!`*5?QFc|Bwy7H(=n7r>o>dd(0U6(25Ak~Qi z6*EiAV1P@Wsg7FK!Ie)Jk{8$0Gehd<3xEe$cOk_Eqi9of7X*%vdql^^)(uUiFqzwM z$JL|AGlwei=WW&9MddkELL@TraH44ybmr5Cf?jzUsqIK7e@3B8uA8tNpM&XdUl|%8 z7R`+V6b0hV=N+0GluT6Mky99UQ%~2ff7D!OorWKiEr@l diff --git a/python/img/excitation.svg b/python/img/excitation.svg new file mode 100644 index 0000000..ef66171 --- /dev/null +++ b/python/img/excitation.svg @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/excitationOrth.svg b/python/img/excitationOrth.svg new file mode 100644 index 0000000..7e41eb3 --- /dev/null +++ b/python/img/excitationOrth.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/expVal.svg b/python/img/expVal.svg new file mode 100644 index 0000000..0c14c52 --- /dev/null +++ b/python/img/expVal.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/expVal2.svg b/python/img/expVal2.svg new file mode 100644 index 0000000..5840013 --- /dev/null +++ b/python/img/expVal2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/expVal3.svg b/python/img/expVal3.svg new file mode 100644 index 0000000..5a4e1e1 --- /dev/null +++ b/python/img/expVal3.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/expValHam.svg b/python/img/expValHam.svg new file mode 100644 index 0000000..d742b7c --- /dev/null +++ b/python/img/expValHam.svg @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/expValue.png b/python/img/expValue.png deleted file mode 100644 index f4791742fcfb294b21fb16097dab663a34cd9d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5164 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 diff --git a/python/img/expValue2.png b/python/img/expValue2.png deleted file mode 100644 index 6299ff2d48d7040b450b168306cd1f77e0d68ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2220 zcmV;d2vhfoP)W^^Z;3>$TJb*pVyowtY zhec5Y&N;FyL!Rf81UX80T5IHajyR6N7~Aro>)~C&-=6yz_8t@X`P28|y^p_$KUW;N z`I@S%x485XUj{JcrhL%Q3an=A~2k+(&Y}vH@T{ z!()4%!P?ua4_!5F7DWLeL}`i1^W3&ey=pY@lu`)8u<=_|3Gdp=_}Lc@;zQs4BQ9eD z*Z=YaK7ZFEc=&hgSjDgDK6##(?HTKSa1`+9Z8I6^zPAe0wlPkngTv#TBZ?wpTO%2n zZPjMADWxHFvEdR^rmUXmoe zk6On1@0O2#G|4NxE~~sQ@&Qjui7*U%zfYaK!prj%|v5Ap|(*UhcI@Ug7zAsJ`x_lo~V&ZH8x|T@9}&iqe4^1OXUh z<)&H);dIqWi=ilrz!)nx3s7z5`VQp(b* zv0N_82OR`~^)_HVvn9+V1}dT${J4%Q-fE z>KmX_cwJpBTI+J!Gm(u~f?`xm#X0X}SfHGWK0WZx;1xw-75`5LYZGzKtwuEkH#La{ zN!LXP#liF?XYlGbthaFeji>O{_k9aL{qOC{YeZ3GG*YVv$u+G1_A%W5@YDG54<5py zhn~l;ul;YwQF)#l`Q*|xwVwL=%m;J^FOK8-2fv=-Q}>?1`D%7X@hP+**s0sNdH!+i z-!Jge&D#Jj&Ge@v{#( zgBONj?Ly$~a|_)4o$3f?z--f7{f1x0tKU9|d(RZOGd^zM&0joN88vNUs;l>aT)=O> zbO?)cS8K1)r!n3cy!w%R18=@?v^IADFoRbe`gb0`eB^_hl1tX{hwQ*6m|JBMJyzSN zjk7p?FvYW1c23Ki)u$E48NB+DypC5+Jcwhj|GV}YQp(1TR*&QhIGY~8$A5M44y;S3 zaQv<(aO%?Pkm;tG0ziGN%av#G#SeTRFW0l%IaB=S_jvIur?K|WTlFUz$QisONorPb zui>Rf@4?X%XRucBZ2-)^4`fkUrHzZv;p_K5ipA+~;>(AQ;mJSgm2VxbjGJV-DyoNhe=}jW1PbpPSc{D(5 z9i?QeT-7Ift9|CW_Z}}mh21FJoPt$dufQm)l|WKR{i^I*TT!2)D8jyd`+DnBljax} z3+?I{mK`_q5G_sj@u7DWJYU}fU+`RI>2{U(h-n|m8NT4vn*{rpS9q=}_BF`|Jn{(+ zSt-JMmXJ+Ws;PXyGxf&zDew7tw(%z>@&PZ3qQQ#`c!y^jsI*yB=4yLAX~x*fI@3~0 zC#&5tipJ z%rFdb{P^+e6AcT5A3l6|%QeY?D})$5G}36{Z5M?$aL#e^cNA|7B!2{5$a>Oe6 za0vU*B;ipmK-(y2s$w)I&w!042@kjfu&x;R_8)EboAMf_q{+e~QH?Q^-)__7;k}zR u!<(>XcoWtPZ^D}4O;|I$32TNoVf`Pt{Uk+U%tUqVk$5;#AvOpu5P!xA^MDz7-I~wEJGAUNRkAMvDzz+ zVhweiNbck909p?^g z!}iAyL0+k6<`E%g2@5|@;;E0PaAtBlIx{zG$9SlSAwz8)F?W8z=lix{*YQ($zcYbn zrv3$R7YlPo@Y>#wpw3KU@0l)E`fia@LI@GW@Y@h#lv3cFBZ?xVX$r>J8e$f4?Hh)t zi%YnNMO^)Q7q*`G155WV;M3#-Of9Ye3)7gIyS{2%DP_+vB*QPuGA|?rC8jJ(FvgH1 z3GzILG3J5b9x+R}`S(%0Iq@nE&Rz#_6&FuFi^pC*j-O@=JonD8Sg06(?NZWOLkNK= zikz2NFk;9$l~S%Eq$k+sxV|Fq6SItk>1q76y!z{^J*F&6q-lyYO$W-hK@ehylwtmi zogH%#`tbAMXTQR+9Urbc!iR0X#ux}8T9f0Q7^M`VD5|w;H_E^xa+<;`G2L$0+PRCO z$a#~@vaFUEa#ph}Yc#f3Vi;rKoLl`?2+>&Cei&mA$FY^aMK4TiZ9Tp>V#wRIUC*R! z8z->a?KYkTQp!e4${R6sBsW1>mPnGMXMfP1K^Gmn{TJCoZDw1NB-Sw;FT^ONkR(a# z`?c2V2&f{aD2mp5Q&AMwdU_#-F&4yU@o{pkh3#JBEV|7_Ed9{tdweH zZrdUhFI)oyI#vV4)og_2Hyk`WJQpmEb7tG?ELrUqKYFUdkO@|)a zPQ=*yDmIW(B93FEX$mPNlv2=IBhPaPArQwg7-Qb#2_c4B>Q2P?nCj&H*1bVvOwStj zaSGOL1FfITW&^7Oks^e!KH18$^pdyMS`SSTI}ziOdj`c2z&v3YO+i;k}*v(K&qrZ|^vO!*ga;J_&g6U@o&}EQzVyZ0{)K z6EEW6pEp6d?1?>JKrgTVDd*g2uNg~Xs+3xq>0s;rvzVnRaz)}mMUp?14#3zE^B@bk z2mn~Y?O!;y^b-|ahx^~P9W;zmOStjlOW1PgJ6u`;uri19Z#;?J-_EbwW5VeG;MVl$ zh^efoTAqVGx(B=8J&luxc4E($bGSB$71Ud=b*Lg{`JW@BBSr|}91eALNrEgT@?qMd zX}V>Qd{+ZA2r)h^U&dG~a@!=()}qd(8L6+-B&ADen{r)?U@k$ONo@;q3OVPs%Ziqt z%MvC~HC7dz!wx>Gmy9vsocA7DDb*WSYmK5PdR0@t0%LUr0b>=xE6Z|K^p1KA$n^Ia zbZ3l(i{ROmVYnc4%y-yqcals~JQP9^L&XF`WxEKVm`W&w8r#MO^OA`S)jJe26Io{> zI7@boqzyx;+_g>i)LAmwAt4Zg7~7Dn7s;U#`yq(2t*Y`Oxk;tcAQ)o?Hikw~wC*z( zZ<;J;8+dyqZLCr%QjVf%U}NZ@jw&4%Bk^2-}BO=pcuv#3(4vGYmy*jmqC7cu3X zZ9o;6ZBdq`wXbH3X;iTZcqWFFwb=)J6a?6YHaX{wEp+eOexB!6>C=HH&b{Ao{;du= zoenym&ERs4ESvBuRZ%o`K!cc;)Yvd=Mr=fr1-+y;Gc%Z@Lp3c`r$@*xS~~4qmTS-s zH#!Lh#XdrG(HdiVy;6)Zr}$0qo=7VAp`JxboA~OYCEKLm?r{l{6E?JqmP*G464SDa zmWXlbF&Km~>AP;!S6lUyxC41PAP*^`c*pQEdbV?xJ2K6L*$L=V>HjZ-In&_0G>BU^wTu;1{jyU36Wndk#XObnqc%bwv^ zcPXWU^+)w%EQlFLY!Xv}O=2prNlXQzyO+=5lMC~>J!(yw;?^|2KlTD%d14uHX8mvO2WN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/fixedPoints.png b/python/img/fixedPoints.png deleted file mode 100644 index 3373f24eaf986c307998034d9f6659ca0510bf1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4026 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 PnVbS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gaugeExcitation.svg b/python/img/gaugeExcitation.svg new file mode 100644 index 0000000..e26a6d2 --- /dev/null +++ b/python/img/gaugeExcitation.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gaugeFix.png b/python/img/gaugeFix.png deleted file mode 100644 index 0b99e341411acd45f0af2cca187d1969d470f43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14110 zcmbWecQn?2{5O7;jBKKmO(B_4$w-%xRYH;^*%A$VhGb_{G9!D1D5DfIO39WLWfn3* z6w$aJ@6Yf1JHPWg=lOHYf;a6U-lXbmW8rFl^$MS%{bd`HwLRbdLwr{qT>17(?U&+{l9HD?ATKSK znBDxHMB*c9sgVsmQ|3Q;8M2+JrCz*x=pf&dy)**>=`8B?2b#j1G;Z!w5BI1tumXdDJ+EU@X8c1^g;E_q-pfy?;SUO9WoP3L zV%E=6~ghceavZ$8u$;t>#^{p1Pj>cWVI zn_C6nM6>n&fq{X#w{JCXFVPg}SXl7W($a3>EII$ey|ki&-BGcDn%z)FgpD>RG*nPg zkt;kr+;eS_KY^>SuW!1)gm>6`R@~Far?IQ+jt*nDd{0l$==kefG)zoynq!4C^hET` z%p^P+la5pQ`1p8wdpEp!Lv7U*Ngk@aOxZzp)o9?bs#cx8zp~=``_F>EhNdRXVCCgo zkFDNV4wPDymX+Pi$`Tx`a1hpv9v`=~wz1(?P~d#|=O<@-%3+E)?cl>MljajmQP-TE zS$9+0b8}e9Ie(_$J(x3P6;lr9I zPZC#nCowTBnpN?<7p0)hX!K7@Ruwf%9s0{qf_+2kLK9 zd%fXrQ={x9iN-}laYzTAH8FXDCpzr3OH52GGATKEzoew3(fRXj3XEN<{g2LD2?+@~ zz6xUzQ&vv%NTDjo&o`&rAz{rL9yCAlGR=dln|_7IkYerEFN=}d>vH~o6{#3@y;9K4 z`u%h0Du;r*SiJbTkPhX4DIQ#z8qUtnQWrb<4K zGL9M;unv}IoZNAHJ@v@-U1nxxa$eteH$`#2QP7Ru%SQX``E$$05Qa58Nt`cAjq-HN z)!JWFg=b2RX=~G(nwomPv5$ZCN^NCfgqKVv8<(1IT98xwOvT7WL`^pt$qPmoIWIlk^KBYOk(* zdQN%h(4iE0H(H!eXhE(m{{DSBY=_^tl0+Fh#s#@-mW$%G^44~Cf(H+7Kb5EZgZt>?C$JdpS{&8`ysgtl^)l{$Zi8mq%x2B0NT}?>Kbj<0y9=b1@Ag<1v&F zBbOX$wAp6Pwd#;P4L+5VmpAe4(~IO1D=VuEqe6W>y@1Y6y@8=2K`AL_)e!pn9GwI? zp*`8ZA|fJ6-RDhw7wf5~hn`A0UcS7Ew0G~`lvtMQM=4*E(OF4#ot?~oHdaH`1a9Qy z>(vGLxyFK}#)Pe#R`1{YFO(Z3spIeT;_szD*PnXlw)FhEs zW_s!NC(R|LB_$@NJM=#y1yoln)|atliestPW(rG6?cWO}CMRzWn7p2!oxS@(7qLd; z>6Pj0Kj$|-c5qldbD3f!rK2kaP70{qH!3!v^ziVg{_}Gvd7*13n?3z=7jEhb%HEO- zFQ@#r@7fiCZkL#pWbxsNjf#e#+CKEk5OkIlWq%%nul~_D9q1z3(=}D~$XkyW8%>}W zk{&4EjKCgFOXHPyoesd=I`lCKs-@){iWZsG?7~


=rZ$>{tocIeQKy4XFT-$q`R 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 Q@2-)w)OFP!sh9`;F9-Ylng9R* diff --git a/python/img/gaugeFix.svg b/python/img/gaugeFix.svg new file mode 100644 index 0000000..e44fb9f --- /dev/null +++ b/python/img/gaugeFix.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gaugeTransform.png b/python/img/gaugeTransform.png deleted file mode 100644 index fe2fe098bb12be23e3f1a03bce6f6da972e52e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1672 zcmV;326y?1P)D237qrO2f`vVO2q8^RBPu}yt2THWnP_F{f$5W@sNoP6c#m)$j^nsv3@7w`W2u*_BOy>suKJ7?Ctd(RK%%bmIB zJoB9YdCr;VJPIU|3Picl21q33AcZTbNThHj6^RtCq#}{Rjfm%Yuq+Fl^UUQq&Y<=0 zIL>u_7rSiRzG1eRrU}<|6X{E+a6Qk9x$o$SZ zhwuA|^zZvVG))5`1cqUh>|a6%D5Z%B$oGA4&Y`L*D5clgrt3OXRRtkL_yiIrT+TTZ zMFC^1WT!I5pePDB=c3F=1jZOtRfT0)q0e}pml>!eL_#SAW2~(IGR8m%5k9G0*99R2 znx++8bu7yQAq2Xv3$sCpa81($A*8GUb6ppzs=_o)5vB--F$PL$$qu(HOSpI~%Yvq9 zvD(lyO=y6KI&Qx2gHj4gsgVAK2v=3rSo=K3aiFTI2vdZ@IgcdTfIz&WqKmHU1*3f_ z*tQ*8`~kl2gAfvVA_U?!3?sG;v4tD#{o+C?9n_DUVtAehMNvwRoauwuwdhuiTDS|X z7!X^zOM5oOmf})y97mXNIp<}!<#`@dRgL{^BSg3&93o z*W-*qp8pqYT|fu8unj9Fu7$mQIz}}eMYoWCdhySf3vgde4QfKJ88fEh@tHS68T}X< zj$J7BntAQXaAh|(*WQ9V-#wi(2?{YN5w~X#wmvukwQJtO+WBKcgM+AuTlk$iad!J` z(9|PXeB$4N?Ub874M;fR{)JOpregGB6FXMdU_|4`nPoH^;d|U(7hf#D8~42S6Bjj_G)%Tm;|jXb(OerE97G8>JgwG? zuES4b*7~FHKGl#~cNAe8L*Mrc2fGqTR=9txMg3$8htdGrITjZ9cn~Yx|Iq&7LzuSZ zIL?>3$qjO+{ario%B+p}{^uqvO*NsVyYvP{9Yo~!O&>0vT!|OPK8l88od7!U)8=Uy z`S2QSYwO8rLzHlXG~xC8(}8VL!^j0#cIE=w_s+xY5sj!n)Pa1%ZQFM26l!w9?b?G6 zo}Gx>U;hq&B8`hDUqr*mI?UVOp7&*jT2^7_&UY|}j={S5V{pfNr_tB80V`+U>%#0{jKw}CHBD2fO+i&$6afbLTM^?NTeu=lh)3G|i$Fc2N*gWTRad*AuA~O#;iZpzC^0ZaFCKPI|=%L>T3uAed}P;(1yX{QrfG@vFRYN< z_x()4b*WBORTYe}iV*EkCvIM}(ioJttv09L2&&D;Qn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gaugeTransform2.png b/python/img/gaugeTransform2.png deleted file mode 100644 index 06d589fe1f4c2b703fea55e930eb4af1553aceb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13782 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 DNiUFo diff --git a/python/img/grad.svg b/python/img/grad.svg new file mode 100644 index 0000000..4798d41 --- /dev/null +++ b/python/img/grad.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/grad2.png b/python/img/grad2.png deleted file mode 100644 index 1903e1f3878a54c431ba70b1863f1f8b49211204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8336 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

mw6!XIqir4Pm9w|^lM;Di1 z)i=VVSkM}b?yuYs0eI93b)`X8`$HdIf}!Vh2_8{vL2CY3SU8)mr>V)ii82RV`Z7IT zm{&$#o&#zW4^T*a83i^RV)}GzK%0h*O$h%Ta0+J^mrzp+Gqam2Du0s^F_YH%il6?1 zyfRQnkO~T+rUVEW4ebBW?u>x|$P~!}OlU+&Nf`>V+@b(&tE!R%G9boZ7jSJ>Ru(58U#QOt)c?@hw=~ap)@29Zy?b{C zhr@l&$qCgn2V?h1^I~C=yv4w$hn42vSPGLMVazWtM@gqe+pH`Dy$b~8I+L7~m>4nD z7IQ1R7serw-5UW}55KKch+eJ!Lj_pJ@mqD8R-TfGh)5?EJDH4ep1G}$albUwIVvtG znGIVZ8yn8{NwB&UK}`q=3Qqk~6KQEPyk^e4BgA_HM)O4_CJ&Z?}9+Va;Z>qDhxbgL0N2eVy2N@aJJ-{4)7kPGBZ+h7F z8SL+O#9~rFLg29y$bxj$ahcWXV4xgy$J{KmVzA8wTJ)1YK)+EVKWeEtTP-vK;q<& zcTKRD_ZL9@AVZPHgO6PIxgj=yQ@qc~K_&Mwo$L?Q-2SI!utN* zJ5hacRy=p{-m+%9?kQTk)=2Joxa(Byxt`U66Va~>$as2uO<7s_7i_-~)cEW?@$;)`Q76J*9L9siVs}S>9y0==S_iKNOhXL{`TpMC^w^ zfb@Rh`3~r9DbF<{d~}spR9u0vqfn@i_j4V4vy>9k)4P_ugarl3VfQHtQo!zPiUS#L z+L+SRFDPQvpvsjLcrPap4*__CiG_hYbB>dli3!B*96IGF7DCvREC%gX36hSvC@~Fm zKOTBRc46f_J^h*9 z-ri!zNn~bQ;doSoQ2;PGDR`DtX*V+A$F;V->(Ow4;2;8;RSYmL5!UdJQN6k2SFrsR z)ZDD7qN*AU$}h4?MoKCGnTaR9larIhp6gH6Ha4DAKXHeRYfcDVDt75JGcz-eAPFKd zHdk39A|e9JIuZhJ=Rl`Xg@4FJyYyot< diff --git a/python/img/gradFull.svg b/python/img/gradFull.svg new file mode 100644 index 0000000..d9a7b9f --- /dev/null +++ b/python/img/gradFull.svg @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gradTerm.svg b/python/img/gradTerm.svg new file mode 100644 index 0000000..45f9e01 --- /dev/null +++ b/python/img/gradTerm.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/gradTerms.png b/python/img/gradTerms.png deleted file mode 100644 index 0a8f5f6b4cb30f776a4eeacdda367ec8e44a6cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9260 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 DJl`2y diff --git a/python/img/gradient.png b/python/img/gradient.png deleted file mode 100644 index 95afa184f01fd6565a012b1c185e801ebad2edad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18373 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%0DdFj4v^wcHak1oO|xF)%L|4y~|XW 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 z

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
mkiIun#E@mz17f*ccBev;W$LEBPDnq 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/qrConv.svg b/python/img/qrConv.svg new file mode 100644 index 0000000..5caf51c --- /dev/null +++ b/python/img/qrConv.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/qrStep.svg b/python/img/qrStep.svg new file mode 100644 index 0000000..efc51e8 --- /dev/null +++ b/python/img/qrStep.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/quasi_inveff.svg b/python/img/quasi_inveff.svg new file mode 100644 index 0000000..71e8026 --- /dev/null +++ b/python/img/quasi_inveff.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/quasiparticle.png b/python/img/quasiparticle.png deleted file mode 100644 index 391c8a505997280f7292e675d19ae228bfa28d2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31927 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 diff --git a/python/img/regTransfer.png b/python/img/regTransfer.png deleted file mode 100644 index f6bf50900c6265d6e4816dd753ea41038054968f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8371 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 diff --git a/python/img/regTransfer.svg b/python/img/regTransfer.svg new file mode 100644 index 0000000..208285f --- /dev/null +++ b/python/img/regTransfer.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/rightGauge.svg b/python/img/rightGauge.svg new file mode 100644 index 0000000..cd126ec --- /dev/null +++ b/python/img/rightGauge.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/rightOrth.svg b/python/img/rightOrth.svg new file mode 100644 index 0000000..756e2f3 --- /dev/null +++ b/python/img/rightOrth.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/rightOrthonormal.png b/python/img/rightOrthonormal.png deleted file mode 100644 index be1c47f22159928b219bd9d4ce4f5c0dd1d5abdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1388 zcmV-y1(W)TP) zO^6&t7>4T-f*>^Hkc)wWoMc%o*pmUZ5X78fA9N1>(FZ}$OP>Tmun9;)gjn%l{2`&h z?8QMc2QLAM9n3|ep}n{g6xxUzR5YER%f{Wz>#1jx-PxI*p04Vu>Uy9r%S_ET^Gr>3 z)mQZ`fyZh{+W~my!wa+=FVJ$lK+Ew0EyoMA952vvv1Bi>Iltx zlnaca2$WI?A&{nNrAr6_N-3f!QXQW4C>0pTF&JYgiel#H7DWNZ7~(iq5ScqD6Ic`l z2qDPxymlLTo`Vol>kH5olnG4J6rA(9+u@ueP1CvCag`PX4sqx5D_Gin4E^=#?RbHc z(J%1sC4BMHUhI4DH6*Lk4SIo-(JXKsx4u4vhmQAg=FmR$zP&xQ9WQV)dIjD&hfkl} zi=`tU<7jUW7W%&fH$KFh54?dB;t4D)|AMW3(hHnSZGnW4O4lZ9`0Fgket88OSi`l? zm$3WT_gMe;6kd3wkJZ%#OUWgyZFwEW7ziO?jEyGvZQhlpX=+qFntI?mZvXTaUf=U9 zUcP(-z%~4Q@=@$Mcm(IaIS%^vm-z1erx0HJXIndE4=gA6oO1+0fFwy;7b%1QW31J9 zTAoG>v3Bu!?0@$RJ~((7pIzVB_K0ymp;?xJa}G)=vMg&X=DMV53dR^1W7^|sSK#mu z{P^A?7ME9W_3Se^aC!xQ5AT1-q%lwkfglJl7z`STd0vtvK@bF5C0aj`mr`o~&?ccf z9_s}Hn;)7fOKwS$fKsX@9xK*DtF%$3t4tvbLxf?d{B@LPBRJ=^zlogl$|wIr?Wc*NNZHm9Ck19% zh9C$UZ?`Uk!9dy1x|0F{7_&}VqUvYVS%Fa$AxRP?ZPy_TLkJ-nZ`WCY<CbRF7Q8GKmQ^gTUfxt4%g!03%IH+ zp4sWRK)rZ@Gva%o27C|P$}Oy3IEm9&Zelp)k$@Mdl}hn!e1%g_?*e)JBb?iQ(qJ22 zphhZBBmO*!=N?|h4;8wg(*kXr$lv|#1mXiR-dUM`_!V$mpkGSUfM3j>52pqCbdm;q zLU+zK8*g#e02B$#^W1N#&_S0rHK{mm=Bz-!txywP+Ssci9w!Bwwx!T-t)CHpxJ4tX zj+dD-|0|D|sros0PM~QAJj>(as?c`CdZ(i2)?dg%2&L4Qn%$$P0%?2Zs(%(S5c#qOG`S}%kEA;g$*uN&ni8>m{J=ebb@U)wA| zYfaVqEXzjoNkRzXIBvDPWEl@{xdgPvqUWepwZ1HRPAMIwWZJHkeQ!J+DS8gnty*u| zz82H4rfR)sJXTh%_iSQy)p}3c0xRGJPR5zF(5~W4HlnL2Pw0kWs4XAZMOx3ukGuT8 uA+JvBdtyBE;RRZb7ic+Npyhahmh(TPjjxpi-{#i<0000C diff --git a/python/img/rightTerm.png b/python/img/rightTerm.png deleted file mode 100644 index 865bce353ca7350e70a8ba5582740787f3ddd51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6642 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�yKTrJ?l9a!RnKO-iTZ6b-n~D zTM&k=EG^GF4WN0U5IH;w1wy<42qeDvy9omB%_f#Y%@dr>)276GQsfe%@gtzSdYP8i2F~4W-4Ep!5~8|s;|8A{pt1Ct zns*H~tc-2xh!C)0f`WpCi7(sd5#m{G*{+gJKeTmXg1M-uNZ`f|gmG4SIt1tym9xPB~Eh3mV zRLT(=1bZwT)CC1;i0@vw(9N5wpds_0_tp#tr>AK^(>d$MkFhbTB)d3p8rXfl2wHGS zHi-v<3`|Uf0UKRiTg&`uZgFwA;>q0kl5q3$e{kr`j6cP<^a#Z&W6l#X z=z6@%o|~P8fTFatwibIEcRo;bRMZR5LVI6$jh+3?!ND^!vCocV?K>|)v;;Pr9*9mu zro=MxF6@ zL~`(h$6YNggp^vib@Of!82$_isHitp{z`^^C@8Jg*4Cgc8F27g3Em76@|AoPWsS)j z(7e@2Q%Kn|vVLjz!Rbe31SD}oLpWimH%0CSH+SpoWW)^(uruxL?E@e_uWnS$NUhgk ze^h>(J@!TG``sL1(l!;FV5JJf^4n}OFe~tV3`9#!7g?lY9{68!(7-_e diff --git a/python/img/rightTerms.svg b/python/img/rightTerms.svg new file mode 100644 index 0000000..f6d2b32 --- /dev/null +++ b/python/img/rightTerms.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/t.svg b/python/img/t.svg new file mode 100644 index 0000000..662a486 --- /dev/null +++ b/python/img/t.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/tm.svg b/python/img/tm.svg new file mode 100644 index 0000000..52ab081 --- /dev/null +++ b/python/img/tm.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/traceNorm.png b/python/img/traceNorm.png deleted file mode 100644 index 08b83f6556734e3140bbdf190a3565f4d77b09f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmV;p1xNacP) zy^9`29LL8x#b9woxMB*?2Ooqju87)<|H0VUM08OQMT;Re7ep9O5G{m7NGe~pFpX)p zQ4~Zbl}d^&E=&-2{AJTtS;e&Cv8cb|El&(7QLH?vDH zGI)sZ0*v&}D0vMSC9eU4l&rOe)*4DFY;SKvDOLS%9T|jVYb~-Y1Lqus5HQBTIfs-I z+uPfaQi5}iBuPLB0p}c9mcba~yXY$+YRSeJq-hF52!s&G^BmUNx#w7GQ4~dWUYe$Z zmmRI-EXzPCZ6(PV11Tj4Ay7(nTE38oPO`POYI@7E?Btrp7$ix8BuN&w1ThkoWNR&w zBte>{y~s$@6qM4=Zk|wxM)IuSKFRYOl+r=<)6qy?g1DR9m)nM^R5Ody2tlHhj>5rh!f+Sb)YcZ0dI6h#3kB`BrfoJS+uyJVO3QA*7f zXpDgnqSsVlS(ZqW1f27QEr(JHgb?I;-b-1!#H(bj^^t!lw<4tL=G$5e#@LYpA7xpB zQX0HyZ<1XCpve#9Qh{9}glH7m(pm?ffA%I>DFq=!4c=Je^`%^Y_rs1zf$`g@z(| zaWv~!T-=%BiLY$ zpS*{^F2949-u@Cl%x_F;@jAM$om*ai15a)~i^t!;Slb8YdEVJv*@Z8g;%>NhA=g{D z`pFB}IW@%=c?8o_Z{qYN3*aWMeDEOddEhm?_vc=tD|?gNc5d1AJee`pSW??Lf8ThM z>{fm>Y2x}=hs`-}bkmh(2|~yi@v6fmCyp{lZF0^sxSQ@M&Gs0(UXnb|m)bh&QhNtDu3&8xNf)MGAY2eSZk}#OVboZQ5-6dQVNW* zs22AHA=#m|t{(m1R)+XmjbV(bR;kRc3~}OPA}GnTjBC8QW0brEA(f>G!AcIP_W0a% z*9E~!4rvEPS21#51S=T`XD?J&F>+r7U3w{{_uc+(?RCrqE!hPp#{J3d2wF0LYM$(a zJkRGZQ;LM(CA-?}W1GzQ%#ao0qF}2;2oZf>?1)10svgwl$g-?eemOLvkPI|S1va6t zRHjd&kqjL4&wbTsrPSaA1CdDv4w~*HNje*hS!*GL==90EArYNqhub>3Xv^z7thH6` zl~N9-55ALVB?AXfuAfctFN4EITCGy-{Xe#LhA}$s_+~l)MIvlGlJy@)|HoUIRwSYrubDB|b)& S0kif10000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/transferMPO.png b/python/img/transferMPO.png deleted file mode 100644 index 0a1af63ba8fe51ccae8ed1eed9c38e9b7a210f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10358 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 diff --git a/python/img/transferMpo.svg b/python/img/transferMpo.svg new file mode 100644 index 0000000..0f8acda --- /dev/null +++ b/python/img/transferMpo.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/transferPower.svg b/python/img/transferPower.svg new file mode 100644 index 0000000..fbfa9d7 --- /dev/null +++ b/python/img/transferPower.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/truncMPS.png b/python/img/truncMPS.png deleted file mode 100644 index fd71fa53a10d63d647663f9425f51e496267bb5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5742 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 WF{n0>lZrA&2ACLI7*!j%!v6&h!6;Gy diff --git a/python/img/truncMPS.svg b/python/img/truncMPS.svg new file mode 100644 index 0000000..087a9f4 --- /dev/null +++ b/python/img/truncMPS.svg @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/umps.svg b/python/img/umps.svg new file mode 100644 index 0000000..84ae9a9 --- /dev/null +++ b/python/img/umps.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/unitaryGauge.svg b/python/img/unitaryGauge.svg new file mode 100644 index 0000000..b51482a --- /dev/null +++ b/python/img/unitaryGauge.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/tutorialFunctions.py b/python/tutorialFunctions.py index 8ece92b..8bd76a0 100755 --- a/python/tutorialFunctions.py +++ b/python/tutorialFunctions.py @@ -32,12 +32,12 @@ def createMPS(D, d): A : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right, - normalised. + normalized. """ A = np.random.rand(D, d, D) + 1j * np.random.rand(D, d, D) - return normaliseMPS(A) + return normalizeMPS(A) def createTransfermatrix(A): @@ -62,9 +62,9 @@ def createTransfermatrix(A): return E -def normaliseMPS(A): +def normalizeMPS(A): """ - Normalise an MPS tensor. + Normalize an MPS tensor. Parameters ---------- @@ -185,7 +185,7 @@ def rightFixedPoint(A): def fixedPoints(A): """ - Find normalised fixed points. + Find normalized fixed points. Parameters ---------- @@ -256,7 +256,7 @@ def rqPos(A): return R, Q -def rightOrthonormalise(A, R0=None, tol=1e-14, maxIter=1e5): +def rightOrthonormalize(A, R0=None, tol=1e-14, maxIter=1e5): """ Transform A to right-orthonormal gauge. @@ -280,23 +280,24 @@ def rightOrthonormalise(A, R0=None, tol=1e-14, maxIter=1e5): right gauge with 2 legs, ordered left-right. Ar : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right-orthonormal """ D = A.shape[0] d = A.shape[1] + tol = max(tol, 1e-14) i = 1 # Random guess for R0 if none specified if R0 is None: R0 = np.random.rand(D, D) - # Normalise R0 + # Normalize R0 R0 = R0 / np.linalg.norm(R0) - # Initialise loop + # Initialize loop R, Ar = rqPos(np.reshape(ncon((A, R0), ([-1, -2, 1], [1, -3])), (D, D * d))) R = R / np.linalg.norm(R) convergence = np.linalg.norm(R - R0) @@ -306,7 +307,7 @@ def rightOrthonormalise(A, R0=None, tol=1e-14, maxIter=1e5): # calculate AR and decompose Rnew, Ar = rqPos(np.reshape(ncon((A, R), ([-1, -2, 1], [1, -3])), (D, D * d))) - # normalise new R + # normalize new R Rnew = Rnew / np.linalg.norm(Rnew) # calculate convergence criterium @@ -361,7 +362,7 @@ def qrPos(A): return Q, R -def leftOrthonormalise(A, L0=None, tol=1e-14, maxIter=1e5): +def leftOrthonormalize(A, L0=None, tol=1e-14, maxIter=1e5): """ Transform A to left-orthonormal gauge. @@ -385,23 +386,24 @@ def leftOrthonormalise(A, L0=None, tol=1e-14, maxIter=1e5): left gauge with 2 legs, ordered left-right. Al : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left-orthonormal """ D = A.shape[0] d = A.shape[1] + tol = max(tol, 1e-14) i = 1 # Random guess for L0 if none specified if L0 is None: L0 = np.random.rand(D, D) - # Normalise L0 + # Normalize L0 L0 = L0 / np.linalg.norm(L0) - # Initialise loop + # Initialize loop Al, L = qrPos(np.reshape(ncon((L0, A), ([-1, 1], [1, -2, -3])), (D * d, D))) L = L / np.linalg.norm(L) convergence = np.linalg.norm(L - L0) @@ -411,7 +413,7 @@ def leftOrthonormalise(A, L0=None, tol=1e-14, maxIter=1e5): # calculate LA and decompose Al, Lnew = qrPos(np.reshape(ncon((L, A), ([-1, 1], [1, -2, -3])), (D * d, D))) - # normalise new L + # normalize new L Lnew = Lnew / np.linalg.norm(Lnew) # calculate convergence criterium @@ -440,15 +442,15 @@ def mixedCanonical(A, L0=None, R0=None, tol=1e-14, maxIter=1e5): Returns ------- Al : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left orthonormal. Ac : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. Ar : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right orthonormal. C : np.array(D, D) @@ -462,6 +464,7 @@ def mixedCanonical(A, L0=None, R0=None, tol=1e-14, maxIter=1e5): """ D = A.shape[0] + tol = max(tol, 1e-14) # Random guess for L0 if none specified if L0 is None: @@ -472,13 +475,13 @@ def mixedCanonical(A, L0=None, R0=None, tol=1e-14, maxIter=1e5): R0 = np.random.rand(D, D) # Compute left and right orthonormal forms - L, Al = leftOrthonormalise(A, L0, tol, maxIter) - R, Ar = rightOrthonormalise(A, R0, tol, maxIter) + L, Al = leftOrthonormalize(A, L0, tol, maxIter) + R, Ar = rightOrthonormalize(A, R0, tol, maxIter) # center matrix C is matrix multiplication of L and R C = L @ R - # singular value decomposition to diagonalise C + # singular value decomposition to diagonalize C U, S, Vdag = svd(C) C = np.diag(S) @@ -486,7 +489,7 @@ def mixedCanonical(A, L0=None, R0=None, tol=1e-14, maxIter=1e5): Al = ncon((np.conj(U).T, Al, U), ([-1, 1], [1, -2, 2], [2, -3])) Ar = ncon((Vdag, Ar, np.conj(Vdag).T), ([-1, 1], [1, -2, 2], [2, -3])) - # normalise center matrix + # normalize center matrix norm = np.trace(C @ np.conj(C).T) C /= np.sqrt(norm) @@ -541,15 +544,15 @@ def truncateMPS(A, Dtrunc): Returns ------- AlTilde : np.array(Dtrunc, d, Dtrunc) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left orthonormal. AcTilde : np.array(Dtrunc, d, Dtrunc) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. ArTilde : np.array(Dtrunc, d, Dtrunc) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right orthonormal. CTilde : np.array(Dtrunc, Dtrunc) @@ -571,7 +574,7 @@ def truncateMPS(A, Dtrunc): ArTilde = ncon((Vdag, Ar, np.conj(Vdag).T), ([-1, 1], [1, -2, 2], [2, -3])) CTilde = np.diag(S) - # renormalise + # renormalize norm = np.trace(CTilde @ np.conj(CTilde).T) CTilde /= np.sqrt(norm) @@ -593,10 +596,10 @@ def expVal1Uniform(O, A, l=None, r=None): ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -653,10 +656,10 @@ def expVal2Uniform(O, A, l=None, r=None): ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -719,14 +722,14 @@ def gradCenterTerms(hTilde, A, l=None, r=None): reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight. A : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -753,7 +756,7 @@ def gradCenterTerms(hTilde, A, l=None, r=None): def reducedHamUniform(h, A, l=None, r=None): """ - Regularise Hamiltonian such that its expectation value is 0. + Regularize Hamiltonian such that its expectation value is 0. Parameters ---------- @@ -761,14 +764,14 @@ def reducedHamUniform(h, A, l=None, r=None): Hamiltonian that needs to be reduced, ordered topLeft-topRight-bottomLeft-bottomRight. A : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -799,14 +802,14 @@ def EtildeRight(A, l, r, v): Parameters ---------- A : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. v : np.array(D**2) right matrix of size (D, D) on which (1 - Etilde) acts, @@ -846,16 +849,16 @@ def RhUniform(hTilde, A, l=None, r=None): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. A : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -889,16 +892,16 @@ def gradLeftTerms(hTilde, A, l=None, r=None): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. A : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -927,14 +930,14 @@ def EtildeLeft(A, l, r, v): Parameters ---------- A : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. v : np.array(D**2) right matrix of size (D, D) on which (1 - Etilde) acts, @@ -974,16 +977,16 @@ def LhUniform(hTilde, A, l=None, r=None): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. A : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -1017,16 +1020,16 @@ def gradRightTerms(hTilde, A, l=None, r=None): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. A : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -1057,16 +1060,16 @@ def gradient(h, A, l=None, r=None): h : np.array (d, d, d, d) Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. A : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right. l : np.array(D, D), optional left fixed point of transfermatrix, - normalised. + normalized. r : np.array(D, D), optional right fixed point of transfermatrix, - normalised. + normalized. Returns ------- @@ -1079,7 +1082,7 @@ def gradient(h, A, l=None, r=None): if l is None or r is None: l, r = fixedPoints(A) - # renormalise Hamiltonian + # renormalize Hamiltonian hTilde = reducedHamUniform(h, A, l, r) # find terms @@ -1099,14 +1102,14 @@ def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4): Parameters ---------- h : np.array (d, d, d, d) - Hamiltonian to minimise, + Hamiltonian to minimize, ordered topLeft-topRight-bottomLeft-bottomRight. D : int Bond dimension eps : float Stepsize. A0 : np.array (D, d, D) - normalised MPS tensor with 3 legs, + normalized MPS tensor with 3 legs, ordered left-bottom-right, initial guess. tol : float @@ -1126,7 +1129,7 @@ def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4): # if no initial value, choose random if A0 is None: A0 = createMPS(D, d) - A0 = normaliseMPS(A0) + A0 = normalizeMPS(A0) # calculate gradient g = gradient(h, A0) @@ -1137,7 +1140,7 @@ def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4): while not(np.all(np.abs(g) < tol)): # do a step A = A - eps * g - A = normaliseMPS(A) + A = normalizeMPS(A) i += 1 if not(i % 100): @@ -1157,14 +1160,14 @@ def groundStateGradDescent(h, D, eps=1e-1, A0=None, tol=1e-4, maxIter=1e4): return E, A -def groundStateMinimise(h, D, A0=None, tol=1e-4): +def groundStateMinimize(h, D, A0=None, tol=1e-4): """ Find the ground state using a scipy minimizer. Parameters ---------- h : np.array (d, d, d, d) - Hamiltonian to minimise, + Hamiltonian to minimize, ordered topLeft-topRight-bottomLeft-bottomRight. D : int Bond dimension @@ -1242,7 +1245,7 @@ def wrapper(A): # if no initial MPS, take random one if A0 is None: A0 = createMPS(D, d) - A0 = normaliseMPS(A0) + A0 = normalizeMPS(A0) # define f for minimize in scipy def f(varA): @@ -1264,7 +1267,7 @@ def f(varA): # unwrap varA A = unwrapper(varA) - A = normaliseMPS(A) + A = normalizeMPS(A) # calculate fixed points l, r = fixedPoints(A) @@ -1318,7 +1321,7 @@ def Heisenberg(Jx, Jy, Jz, hz): def reducedHamMixed(h, Ac, Ar): """ - Regularise Hamiltonian such that its expectation value is 0. + Regularize Hamiltonian such that its expectation value is 0. Parameters ---------- @@ -1352,7 +1355,7 @@ def reducedHamMixed(h, Ac, Ar): return hTilde -def RhMixed(hTilde, Ar, C, tol=1e-3): +def RhMixed(hTilde, Ar, C, tol=1e-5): """ Calculate Rh, for a given MPS in mixed gauge. @@ -1361,7 +1364,7 @@ def RhMixed(hTilde, Ar, C, tol=1e-3): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Ar : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right, @@ -1380,6 +1383,7 @@ def RhMixed(hTilde, Ar, C, tol=1e-3): """ D = Ar.shape[0] + tol = max(tol, 1e-14) # construct fixed points for Ar l = np.conj(C).T @ C # left fixed point of right transfer matrix @@ -1395,7 +1399,7 @@ def RhMixed(hTilde, Ar, C, tol=1e-3): return Rh.reshape((D, D)) -def LhMixed(hTilde, Al, C, tol=1e-3): +def LhMixed(hTilde, Al, C, tol=1e-5): """ Calculate Lh, for a given MPS in mixed gauge. @@ -1404,7 +1408,7 @@ def LhMixed(hTilde, Al, C, tol=1e-3): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Al : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right, @@ -1424,6 +1428,7 @@ def LhMixed(hTilde, Al, C, tol=1e-3): """ D = Al.shape[0] + tol = max(tol, 1e-14) # construct fixed points for Al l = np.eye(D) # left fixed point of left transfer matrix: left orthonormal @@ -1448,7 +1453,7 @@ def H_Ac(hTilde, Al, Ar, Lh, Rh, v): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Al : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right, @@ -1501,7 +1506,7 @@ def H_C(hTilde, Al, Ar, Lh, Rh, v): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Al : np.array (D, d, D) MPS tensor with 3 legs, ordered left-bottom-right, @@ -1541,7 +1546,7 @@ def H_C(hTilde, Al, Ar, Lh, Rh, v): return H_CV -def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3): +def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-5): """ Find new guess for Ac and C as fixed points of the maps H_Ac and H_C. @@ -1550,17 +1555,17 @@ def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Al : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left orthonormal. Ar : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right orthonormal. Ac : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. C : np.array(D, D) @@ -1579,7 +1584,7 @@ def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3): Returns ------- AcTilde : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. CTilde : np.array(D, D) @@ -1589,6 +1594,7 @@ def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3): D = Al.shape[0] d = Al.shape[1] + tol = max(tol, 1e-14) # calculate left en right environment if they are not given if Lh is None: @@ -1622,7 +1628,7 @@ def calcNewCenter(hTilde, Al, Ac, Ar, C, Lh=None, Rh=None, tol=1e-3): return AcTilde, CTilde -def minAcC(AcTilde, CTilde): +def minAcC(AcTilde, CTilde, tol=1e-5): """ Find Al and Ar corresponding to Ac and C, according to algorithm 5 in the lecture notes. @@ -1660,6 +1666,7 @@ def minAcC(AcTilde, CTilde): D = AcTilde.shape[0] d = AcTilde.shape[1] + tol = max(tol, 1e-14) # polar decomposition of Ac UlAc, _ = polar(AcTilde.reshape((D * d, D))) @@ -1670,8 +1677,8 @@ def minAcC(AcTilde, CTilde): # construct Al Al = (UlAc @ np.conj(UlC).T).reshape(D, d, D) - # find corresponding Ar, C, and Ac through right orthonormalising Al - C, Ar = rightOrthonormalise(Al) + # find corresponding Ar, C, and Ac through right orthonormalizing Al + C, Ar = rightOrthonormalize(Al, CTilde, tol=tol) nrm = np.trace(C @ np.conj(C).T) C = C / np.sqrt(nrm) Ac = ncon((Al, C), ([-1, -2, 1], [1, -3])) @@ -1688,17 +1695,17 @@ def gradientNorm(hTilde, Al, Ac, Ar, C, Lh, Rh): hTilde : np.array (d, d, d, d) reduced Hamiltonian, ordered topLeft-topRight-bottomLeft-bottomRight, - renormalised. + renormalized. Al : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left orthonormal. Ar : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right orthonormal. Ac : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. C : np.array(D, D) @@ -1727,14 +1734,14 @@ def gradientNorm(hTilde, Al, Ac, Ar, C, Lh, Rh): return norm -def vumps(h, D, A0=None, tol=1e-4): +def vumps(h, D, A0=None, tol=1e-4, tolFactor=1e-2, verbose=True): """ Find the ground state of a given Hamiltonian using VUMPS. Parameters ---------- h : np.array (d, d, d, d) - Hamiltonian to minimise, + Hamiltonian to minimize, ordered topLeft-topRight-bottomLeft-bottomRight. D : int Bond dimension @@ -1767,18 +1774,18 @@ def vumps(h, D, A0=None, tol=1e-4): delta = 1e-5 while flag: - # regularise H + # regularize H hTilde = reducedHamMixed(h, Ac, Ar) # calculate environments - Lh = LhMixed(hTilde, Al, C, tol=delta/10) - Rh = RhMixed(hTilde, Ar, C, tol=delta/10) + Lh = LhMixed(hTilde, Al, C, tol=delta*tolFactor) + Rh = RhMixed(hTilde, Ar, C, tol=delta*tolFactor) # calculate new center - AcTilde, CTilde = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, tol=delta/10) + AcTilde, CTilde = calcNewCenter(hTilde, Al, Ac, Ar, C, Lh, Rh, tol=delta*tolFactor) # find Al, Ar from Ac, C - AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde) + AlTilde, AcTilde, ArTilde, CTilde = minAcC(AcTilde, CTilde, tol=delta*tolFactor**2) # calculate norm delta = gradientNorm(hTilde, Al, Ac, Ar, C, Lh, Rh) @@ -1801,18 +1808,6 @@ def vumps(h, D, A0=None, tol=1e-4): Chapter 3 """ - - - - - - - - - - - - def leftFixedPointMPO(O, Al, tol): """ Computes the left fixed point (250). @@ -1972,7 +1967,7 @@ def O_C(X, Fl, Fr): return Xnew -def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-3): +def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-5): """ Find new guess for Ac and C as fixed points of the maps O_Ac and O_C. @@ -2002,7 +1997,7 @@ def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-3): Returns ------- AcTilde : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, center gauge. CTilde : np.array(D, D) @@ -2031,7 +2026,7 @@ def calcNewCenterMPO(O, Ac, C, Fl, Fr, lam, tol=1e-3): return AcTilde, CTilde -def vumpsMPO(O, D, A0=None, tol=1e-4): +def vumpsMpo(O, D, A0=None, tol=1e-4): """ Find the fixed point MPS of a given MPO using VUMPS. @@ -2054,11 +2049,11 @@ def vumpsMPO(O, D, A0=None, tol=1e-4): lam : float Leading eigenvalue. Al : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, left orthonormal. Ar : np.array(D, d, D) - MPS tensor zith 3 legs, + MPS tensor with 3 legs, ordered left-bottom-right, right orthonormal. Ac : np.array(D, d, D)

hMq+uAN`|+(u$;VtmkDq@?$Z6bvfIguR z6d!SSD86%zw*}cfN?gCOB3hMeKP-n{osTIYD0*aEvbJ{7unp;}0}C-zxM&E;U3DWP z+qr2Oq*!3YG{Y-+Q+MTV%2i!c3s(0RtdLa~2X1aVVqAS|o;v*EYusvvPGIszF=mM! z?9UzUvTX2=J!Niw03C2-n(t~ik|7VF5|_Dt3r4ToL+mmo)qkB-Y5N7xvDx?J zUKpxoGr!SET8oZclED*u?klFa4F`$HA_`gS0=K zjfpV`@Q$%4)F;EOxP##N;6u5jmoQuSjjPu}IH*tM*VNR!fQsPudyyaNk$GM$>XanH zg(%TO7$5p>r;e*+V;v%_*!=ljY_y@w{K>Qm17HlKPYDMgU>Fb(8cB(AcQlM+HeAQY zL*L4F%wes5Ha)yP?MW*^CiJSVC2tQz``#7;7xdluGy|83Ai1fYbvNVR`&Y0}aTi{z zWxTAc!>fC89M{pJ1*&WcHR84@scRr^isZY6b0>Mv2mB;cTx+3Q?v^{a2w7^YwO&3N z5X$jg$u>1(altc#2hds!T6Y^aLUvrm-eE_hDb~LBG6#ED(j}LA3igAzXk~ZrsWm?5 zU$|2|V-_G1&||NxtPGUk8ZZoZfPz4)yndGVaNSn2Jqhj)G?tQ55a?QW^d#JtzsU0E<9eB$Hd zYnN~qsb#j`j^D66H%VT-m-)B>S_)3RlcuIgwGQva$d;`msU-BTZuUCBum0MAaVH*qHH-=mzo{zuYb^-AjJ7sCT4D{_=H};btE9<51b`20(l$>< zrqRNU%Ih@MRajd}-U?P*(Eh!CaO|th68_IwzND6b3MjYXAiprM~=ci%QSe- zxF)FatHvz^NJ+j$-b52C<^6wkb9OIHhG86j$07@5Hkv_3&fK6VQPC1Mt-!WqmIWmm zt7M@PE=5+Zj}6iguaAJKiMv<4n-I zW^a3S?$y7>eo62sxEmV1ex~;HxuXXoOAh?omKASD!H5Pqn7DW96PZ~q4WVScP#p3P zgr+*w&zgheq?z4Q2h~9#4UdgA*;d)3hlR3BFcf_DKk*-OY(tfn_VAh`hQGn2^5Wy> z^N+3uJDz)LK2NDWXp+yy4l^*qL^Q-Em* z!opiMHk%D3qpDfIRWRV_40#;r`UE+O43--sh-IF}HlmA6Vq3Sm=UXH@COA{%qIq>6 z+ABw}k{s30gr>?+>w_UDW(Wg}1>RJZzYx7U!PP@Eksel0Rj0SEl_x1~;^fC?DLi-J zVMG(a6%Tz>#)8o$$djE~{HT3**rag{!vjG#U1tyco?;KH)MCk;wC+%gYw@xlU^D=I2!vl<*=s)8yjaYuoP#?;jC*-$+F(!w@Os<)=2q$wNDI{y7sX%^d>U9G z4ShB;vPSE6en_xDEs31AW6#>--)ElMCyS9H@pe?cBGm?^PL2V)f&>z;HMCQ(Jh__p zGe!$ceV-P{SV}7@+TV93Z&d1%F%CYP=f@tAj2iOsx_oI5q}2Z}k8yQImonmRa{2%i NOD5wHLvM-Y#y{4ITHOEu diff --git a/python/img/hamExpVal.png b/python/img/hamExpVal.png deleted file mode 100644 index d8a94dda480122c26eaa0a4d87982c819ccd5326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7565 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/leftGauge.svg b/python/img/leftGauge.svg new file mode 100644 index 0000000..0294f3c --- /dev/null +++ b/python/img/leftGauge.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/leftOrth.svg b/python/img/leftOrth.svg new file mode 100644 index 0000000..59468c1 --- /dev/null +++ b/python/img/leftOrth.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/leftOrth2.svg b/python/img/leftOrth2.svg new file mode 100644 index 0000000..fd0c119 --- /dev/null +++ b/python/img/leftOrth2.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/leftOrthonormal.png b/python/img/leftOrthonormal.png deleted file mode 100644 index 3c3fece25741976f4d9334ad526683bbf5644e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmV-#29WuQP) zO^6&t7>4U2gCI2Ikc)vrFTxUR*pnwaH@&QVkU98Ap$8X5=!3`#9ttnf9HcKIB1l8@ zl2vT*qEWOG10g6&qaeW_Xja##2zJOGOtRU$9zsnvJJT~gGhNkR&DH~b+jLjHey0Ar zJ_e6xAFS&Fcf>Sslg%AQ^7^14GssC+J6bOOmWg13MnO|lyl!FiXteb=DyECz+owF;@ZYD zSni#``p)G0cqy9Wt`xi9;^U_dG4KgOwxbU)Tn2 z{){hQd;pK0-ok$)?&GCs4oNBUJV%lwh@uFbbF8ke-uVaDKF50xAI9?WckxF55SG?| z1Mn+OA3IiCYcR$dU0qTX1=2J{9LI>FsI&PMQc_4M5d;CkFocv6d7eWEfwi@@J%4o- ze}59;{_H2*z*Ss2wT#}0@34a(@Zr%nYx@_JYYL?lq9{TT1Q0?DCg-}EjU^#PQ54{u zBMif#7k6j#v4ia&U&RZD9>dccmjPVD#djXWU5^~c7n^4xmrr5y$~mlme|hK`6s4%D z3Q3Y62m(kc$qbo0mm<&eK~P4~Y)E~XFVwLvh2A+eEoE6k2!S978c#%V&Pmh|z^(E##>kB{Mqyow zX={llbUhQ<1SuurIPSU_jj$R`Q=45}kix`|!4y`b8OQO=9ma7`m!gdklufKfv#Kg% zZ7Ovsgb=OFwb;U1H1$Zp1k|OVG;!7hYta-!7#j&tmV(m6SyQYb2~$v(LVu~|5>}$AlrlQ2NLdP#HKZx5MALK?N?8iZWvjzViQC!}Q3ut)>+J!q zVI`WTH=$CMLhrqF4Qo=EY*(pDk!6{eq7KuYEvizOZZ=I}C7PyRnwO$oyc8q3j(@*; z5)UmcVX5Xi`uZ7cPPmJgV%$TVlcF8G6yqM^oD{yMF#izeq-ckBrT7QGeDpG2IsX@S zTe@Q%UJ8S>D#h*@oLuSQ?$^%Z&vx!ui{n2iB93FH z`W05A8HS;e;82&swQYG;qiL!Mp)Q5VkE=~!HJYY^LtP5MtuN25M^gwf^CFQxmU({? zImXz?AD#8iC? zeX70diRJVO!&GXoIy#X;ADh_Z7p!0Eq9m4c;n>8^dT9FO*-2C1i+Da@(Y1l^@@=~;s z7C|ptdzwLB3IKB@hNF~N&J~=HLQe_DaoqUZk*cZ&=_FkI^1Dl%kOH{%lJ`z(HMvY} t6kc?kk-}pSFNJ3aFNJ3aFNJ4_{{bw^HBFWGzk>h(002ovPDHLkV1lL?^~V4J diff --git a/python/img/leftOrthonormal2.png b/python/img/leftOrthonormal2.png deleted file mode 100644 index befa599db78973f5528b71d7408d1a3f20e04af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4842 zcmai&cTiK`w#Vs3DMFAUL8OBs(u7cgfD};z3evlP2_=xw1fw7=0g)hG2q-l)rGxZh zL=Y5$QIOsxbPzBUffwd?@11$`?#$bNoH;XVpS9Qi?z7kW%!<8hV#t2x!WkMG8g`>w zdS)~=lZJ-7%1BS=esI=Wc382HRbBUDxSvc6J^R($XKr4#W=Y@} zk9k^1PT^(aS#G(}l2ef;1hbewk1l3hxp%()b~KIr-G#s+g_)C?Fs}z7Rk@HQ+1x$RO;@VQB7^=b~;lLjj4Y=eiXlELI7c$38MS(Z}+0+~3fRC9GBe;?TLYVe~YA#4B!o#SRVG2NIJxc#t& zCvzXiop9_NKi)(1d0y|-j|nvyZB`NdAC_eC@Rg?270-*W7dz|MZgcQ5&>E9cCUHW% z#qw-LXYTQ%sq16sWFe+ls@D@Ne5?|VTHbK8VVa`2WJ*4nva(EbM;B__rA1$2xg7RJ z&(`XLyzGMW4n;B2EE6x!<|-1ttI1iua{CJ4nLW?*7`fPx!S+QqX56JD@z1Db{gcUh zIEzR@y8DQW6!H6B+=H>8e1AU+qa+5jOUink+1;e;S!@x`E*R0objDqB-}9^Nje*f| z5SlTaf%>&?;91!|-u2)*t{^&ye_Whs6w%LGe>>PBN6lJ*nDslaha1L?djLMT61?3t zF#S5UqGO7@IGeLl%g2Y4e%jtC1H7@P@K*B)5L!h-Hzhn=))NbF3-^Lv>|E}3**VzW z5WC~NERJ=xPP5oQv`I5sQ9uI7ziBDlj{Bcz_XNj2aic}N$I{Hw)MwlPG|rh18xuX+ znZtJZ`$IQP9W+cJxe3~wj-6W=-!8cDzUO*C4e?$McmStRLD5n%(TXvh+TrJDYYF$b zeyNZ4*RWI7GnqR%eb+$PGs>y@?|C!@RCEO7;>={MU$6%7=-V>&;)!}WhYi1*F_n}< zu;vL7Zf!S}g%TEG97Sejv?d=P*lO8l8Sv4KGz!r;Q4ldc^)b?fCC`->rk8cn69yTR!oJvQg4J zj(xplyI-I`_&lG}U!FfeaNIiqO59w-X3an|{%pY3Gnq13G5C*-nay5TCAyo!xW&+C zMHd_BDXp6qcpgPR< zLA{dWhceR%EGl&SeFi11u1CG*Sd!_>=N?3!!$9rK+*uTM_T#P}1?iB!tDEbna!(dy zoaf=sX0ml&S~sD-LThsAptrQz>lWhK2JGm$kytwr`}oWF@{<@H0v6_&$digm+mn2|evG&wYO)S*sD7n&!h&$KPQc>%4@5csq1>+ zu2NA^SBh|_!dDZP@XqLS15dW{8y1MBn}7Yiem)BG{Y57*6NYePlnSU}bw;K8@__9? zpciu>juj8Q(Mumz5l_y|x-$WZ@b`+UrHGL_y*Ookzk3eDS6iZkzCCh>7cEE<#qV4E z4q0l>!mIX<>iq~x^#FAA3rJZ+T|UiraPDs8g_Yf5Nn${7f6FJE+HP&@w5|^#9{JjX zj`ZNL5l5!oPi_KX=NQgXK;4U2zQSU5_M5G5N_9*bn?@O^+0|pPNDO%Y;&cI>Z3Fyr z@pn<8J4!yz8_pPn)t-O0(o`6YebERL3VvNQ|0P-UzEzwy>95N@bbOWfe4ZmOMhVuJEv#@R_H4F@f+J@@Oq;t+ zFRxtb>zFjW3^juXJqOlRoqO;=gR@8nX^Wv*u47Hrl7F(gQu~5w^isa-fIzW|*~@sp z@bacxiTI_S@YT8Df`KI^j#)NYEpD2i{+Bsfce;_(n!!dWmZ(Vo#lEEdCj_qTZqb^P zgqP7A=v#>hol^eV2$fX*toZYzJQBF53-%U6yL42)y`3$~fl&Kt)To`l22MzJ7nlW2 z1`ZNk_h#o`DxY~d(m@!oRo(F{34xze-7L+YsYX_ZBh$W0elkibP!N0>e=ee{DcUR? zKW;9e;r&Xg+26xC72!+oBRgudRLne55*wHEop4{W(4UW4ZhQLj%p}t|ED|D1uc-LS zEthKP#~^tz^}v#zM)rn5UYs=(s1;$Ifhn1^?Xv-n`bn!Ts!SW$dFwucJ&x=HHYswN zPqVeOyK=-g!WvjUdkIAWLL2I7RY%r{W` z3uZdF*MVG3kH69TT-&GNVGR)C>>VV_V5+ayF4>gj9ct{2>Ul9VVfDGN22S1IIix_R z0Y3z&6Oiw;V=-#jd`*k!d{FII0kwY_%rQQxg#Z{$2k+$3)JaGC+8E}kd3o4TMY{Y( z-7C2Nrv+YezvPaNiCrMwRW9r-Q3X2xlPWe2LN=BnaxXn5eytg&n;41G3ILPM$WlZ< z7*5I0o8G7Pt7L#dsn5~e$>!9_zWL7Nq%Bz`Tl-D{yuYW4dMGM5qCiH|_29X4$45@< zUEzD#(d+rfITl4_2p&wmnpihg&@pdasI5}h;86T!B=G(6I|1OSW;ImJ4&%xCWCmMB z`@X^m74V8^z-|HayAdPn?mK*q7r?`QB{`6RCKdB?B-d z!B*O?4e|RUUelL3fSgB`jQ=_OY*^730+nzc!){n1VWj2$rT?~0^pwau* zVE3>UB-jEUdz)8z8T6idI1d0#0DZ2qmcYV`c)yF8H6TRXhtlbBs>E>+GDm#S{qi@d zIwcrZkratge_o8Z(a%;PYsRcoA*y2CI|3aTbcg{8G}63e>E|f|5|5CTvR+G=+VRr~ zm9g%Z*lwzjfW6=^)v^*s2jg9xl&1^LGB`Af`irrvRIyR9jHGPiEoZjw(zan`qCl+; zF8sex^O$P{`Jkt~Xb~LH;4$I-i^jLIedoHjdTKr)?Z;~H9?vhaoT;OVTla^XbV{xA zY>DDV@OCG(dvz>w7Ig8HV}E{`v+Sf|s0~d2o*dC4pNfX^5I{Ygj~6x^NJT;1zL>~I z-T173N-}*te9`v~MU%50PLO9~5lK;xSPYS8qc30K<%NyayV#_egg}v!EqpSv8ru>s_R(LLd;eFTL%8IaiUa6jDKD}{gv-V zB+9alE-e2|+!>6=HC@C1L$%vO@GTu?E~W9y88n70#vqn}oMRBXJ_c zo%od|0E(;TJ$-vZd@|=ONfnHayyoj{%ieQA?Mp@b16uPm?Q~O9!SgWfBd!Ju;%CXr ztxibeoW|_HdrSk{o^O(Uyo+de*O&A+-hd7*d|ANY^fwK+`<$a#H2;RT&JZr?O zsD3aR2{SAzb;w%v^!)zn;HM@9{^aP_z+4|xj=mvgIP?jh){|)uU~^^c``683o*NLU zaLI@5UuW1tm!5DZ9M5cYGxT>_appzJmiEr@FoHBE zwV9qonMrwU!(*bt#n5@z)46I|-h}cy!mqNdWOnfNFaD{{4b*$tr=(CqE;Q^1FK-pi5>tNp^O9XnbXM8+kUVs#BHKS8qFPtBfz^ef#+;1Im3sesYi8KsKTkGqO~?he3ij==x%Lnfu8{JVRCh6*S2O!bG93s zz9Hsg+|9*%DIQj%58lqXfb}eJckAf;11G-K>(u9rUC<^~0$|Q4{@PpLhrwpa3Vd9t zGeFxBsGRKbUF_VgHxKimSIx@BjcPRupxi+32YbgU+;(ouQFLWku~EE>3{hG9yl%?# zV?wv!@=w%7Nr*WJn=EXsw9XO`qb0Oo{9r2%Shh-Mo{2{|SdGZ|-7ohL;Gj|^RC1-B zLm{qOCHL{L_}W{+DSP_W7VpU3vE8h)PP3fw3Fc%CtkQN~0n&nX4x%GthIX0HbIW`f z8q?-UC|Ya1|9)GpuiCH3B11u^^Hr}wb2GUeJmC8NogFV^?4vvZ=hb5%+t+)f!a}#E z2nBUo=3sL5HbaK1lkqaMARoP8G~hSX0m9f_|FZ*h+Ldt=>-(n`_TC~y2$|Wt-{t%G z{r`P@Jsjt8&biP1zTfwKU9Z>kx`b({Kf=SNz(ybtcuI=$TJRhIk0LA#_`94gCw>u;Awv*7Hz!O^#I1M`}A+AwA7pEfFsqog6GV-7H)!Egjvgoshd|t&%W^@n(>m ztECyz#>tUJ$Hu`D;o(Zd$4}#Ahos@-;p3s<5aZ$dzL|l9Np+OuWpupKw$pud z;wI0#TWP$$;q*FSFlam{Yr|QnBd0g}WuSZ?Pc1w^bhL)F#M*&~vhUk^s{ z`*-C@gmnvM&r9%X^xS0<78Y)BTZ=OM^*8Kx%nm+g$eTCMU<&Ppx07E#gaE20StKB?-dB z*Rz|`%zd~NDZJ2jeRVNOktitU6u{kbit6X*M-kTSyd;|@>h_Sn!XWzqV|{0*>!W6_ z0FlpFo)QZO$AqH2-g*-X;#o&1Aw`(@^B#hp=X{YJR>4D3=t)UQS^4=27R>=+VYiWI z1b-Cp+g4ZBR#w_3ChjUIDB#-ViNlTR1c&Y|g;2MTjS)R5H+@QA_}`T zUZ5r?BNJFqoJ%+$@DxRDbYUUtX`=_Npdbkz9$puf^u2n|-HbjO5MJ6Tv+Wps5(b{3j(w6!NMjZ93Uc3b~Z z`5bS_$jYKR{%nct>r+gKkzx*8l1fC%k0udA;&o2zpnc7#Ps;#>K(IQ*d_X zc_T|3(2~Ib5g{rnnk4Dlpk;Wn?CIf=Q&e<2KR=&^lT$%P24!q)OvBVPdM(qRs=R3* zo0LO8fL87;Oa8EU3gug`H2xPu8rIe<28M=O^76MBnV7VEe0*9h;~d(HvnGv@O0vS)BG^7?Gp zU(3iSwcRqFH$assxAz0H)ZbeJ$^0QXxw#}$T8w_~?t%{AKL?hSma_8k#VRW+$3=Bh zL{ensdleoC}`A*}m zSJ*!uPEO7$%YM=?6&2a7SKCe#qodhX80-S(ha#8XBzk7QYT0dV71X4+{UxOXh!}Wnn?jKYy(ej>5;s z*E2PhKtx28WY<_%r(s|~?)Frnr>`$(W4w@mGOmBM%J0fMMZ|?}zQs4S==j6p6_JL% zerTeJ_w9e@)2%%I*ROt`UteD)3gDcEAf`kVquY zq(83Yy!+-9rz;Yf2hn~&N-rv!{GWtGQDb9jE!pFova%?92ZxtFMf8dNtZZ!WWaZ?P zxDpSDf4#r_+xxcF?g!JU2AW#?ur2S{OtV z$mL?fJ25$_aF5G43v}~Kb#?ywx^?yC@IQL)=0hTfg{I_sE;qDSC-a^V7sH#8{n9JH ze~*dpHpzWpe#`_}jheOpbMb4C&7X;)o3ml#=APD1g_ZVpb-nHVF&<(jMx9k#d(Y9) zQN(MH1{Pw_yZ??$ZFAwX8QRWVeUOCD@n>SojRJ^jY+T&uti9q9_$cK9f`T#e@g(yN z?%~Nyd36DtO&y7IaVTY+nQb;B&{+&GY^Q1yL*$%!EuD> z&Yqs#%|0g@y1JbP;bAD?M!Y`9_M}=5@5Oua9 zZaNDg2(wE{aLdZd(%3EJUFPQIG_mYLaE$?AK4=9^&AYJq`)1Bpz&2ZO>Zi;L0_t*Y+zS!x&}ewQMmA|fN5 z;rEjN{9ajk9~AVBSZz;#({p=P;l>?KcAgf**9}KK5bx>lw`-f={v&II3reWy;o*T? zYDYIYJlNmw0W#t;ZMp1Oi>|r`<%3OpIc!$>>df_BXy~Hg+Z^j4l-b!?Yj9WON)MsQ z@_h;KxU}?i>iSHd5pVF0mX?;LvgO8T9X7^Cj~?~)_5G5Vl7=q{InF7THy@`Mnk&f5 zYuMXw1^G)^Uqwq@E1H;?*!F8w`2X|6#=_E2DY+i0LZP6b=$V~0bZC4(U*{5JZ*Tt* zY&4XLuMLiHqxPqtwhCkDc?Ry>{JdZS<(g!QP}}*@=El6|&j)+LbTOeF=Dfjg-n_4^ z73MUoQe3@yx8SoY@h&WkHs>EXjg(YoS0rWOp>4+TvB$fpsDidO>DgMR%rTOg3Jc6q z{R-I)SB}vyW*5QMgoNIcionL2OK}P>5N**rq(|YmjV2zM~AS+hi$cPdQJx;v>8?oFS9a2=p z`k~&TAvCAE8B$QI=q_NI&z^y|x7hVzp;Xa*Bf1zGdiva91OOLW!=BB`>Z(M~d@*)O zfzSrsJE{}Nap0@_K+JM_dZY>5rg!MthtkD$qkR9>rJ_pv`bunVZ|f5E4Gwljkn`)5 zg*G=!fWYW*mG`rF&q0hlb8v`MOBGrwtzCF+%++1qdVRhq^%TB0RrWM|viJ%6{T~Yp zR3IR}81I$y$%O2alq2gvV42bM_4W5Mv6NIa59`)eS7|voaDVz;aB>;f1%PXHbazXg zE({Ibfn6YGR@V`!2@Xb|{qf@hmj}77fpm8-8hIm$_R;mKHTsk2`4Ngjw2z6&LJ(z} z*|)c}3=At3@iH?rGkbsk0_qckP4H(G=&%I`2Pp zSJ%VU{f3ChNW4Frn-^DV0Hz?A)S_Lm{fg@9etGtej$B{9eA(+|&SZ&8UAlG=Mn}Xb z=8e_ZoSmIHdw6v55C4~ooVmD5Lh^NRQ0->2)Kto{r;W!GyTch0;Uw&O2!!O>3h~6$ z6zcj9P6-|!0!ZHP%|60nVq((r`t`1iLQV@2pu=~_8bR^tVm>;lXO)+81JmsN3g>2< z3}|nc6%iL_*ZpkG}C_<5iP9-BG=7H7Zw)C#E>iivy0o?63@2W)`n==*glnGCJ8%Hsi%o#Bhdhd`S|%OTvwGr%?vm8 zTQB!LgJ&tJc*|pFU|kc@knX zUT{R-*4>RMAtBMz)1&bTHJp^QJ(5y*?`YbTUPMH{=!^WDx;l{{6D>*W5gHDo8eA6_ zmo%iSt1FMq7z0Au&W_#hVp}*aK3?MJ1U}MlK-!qT4!hV5!M`t(H8m>g9xW+}XYIwa z4qO%;F;tONSh!a7^UCG$ugoTpW^aFgxO&Eay(M&y<(NLiK*h+&%zQv)MN^HtwWTX=VEP)$TFD=r$kfX$vo~SK+4PMx1afzmB zV4x(M{a#B;i|XvMVyb`D)v(En7s8NtxZdaT)a6Fk?WW6kCs$wBkOhR^fG(42Qrj!E z2(Sw5yzK#w11%8G3cPFb0I)NHyY-T2 zV`F3Q58}1ijWMqW!ZG81aS9fWDwO>(5DG+20v?vPZv~|BmIG8>#*3=B#{!zPJ znCbUAJRAoV6?JiE=ME+&W>Ru;c3~l=pr9ZN8(TZvxF(GJ{F$etqob{}(^A?uU%OLC zSePD44Jh+YuTFm63}|Q&Q%&YWkBW-gJ3M?NPdA#Jr#b5waMAPp3#J>2vWkkPkx}^8 zmc5scj~oqwGy{PmuvT@k zH0_Rv`=Ue+4i3ha5iCkj%*lRhLHjy`0Ax{(B_Y?0`u*EV-_X!?YRMjvtq}^Zg3_l8 zS-~Td267ke5!%|?b#-+-y#_DjU0^-Q3~N@gY*X{|4gv zN9V)4YXFQ%f_9`Y9x!2eU7xMR#KyME_JyMA=;%l@eXtp3dI6=su9X!uTptADd!r{e2uz@<|5bcE z!|u8k{>bbs_Pu-efExLXRKFqDMppY1bHNZHz&I=;FQdy_&arVwIi5AdzO%tcAfVsU z1yJ}tF0Ml>K^U2jX>D)c(Gf=Ma=c|wV8@z#j6i(0on(U=W)XtJoYP?hj-Cd}tt(l> zRc3ZPRq#SlF)=MSH-74U)ujyr9!5^i$omf-=nj2fpdNrF-fS5ur{No*)O}hf4JaLG z>F7|QS+iuW!tU6e;61qL%Dj8<9C-nIE`avRr413bpX#C-K+i67BJv;R>O302|-WM@;CrphKU z5s@Mdfrgb;fml0hun@%}=nu_{7cYXRQJrNRO8*V}U&}#SLrptDqD5QPi#VzMW>O!NdY=c?76vdcEiVV*+~ZpO zUSV;1kohkHIswJ}O;fR{so~%h5aTqAj0&q&jcnOM#S(9z=K#eV5q2y`#I@C=C`6^$cGOG~SKP8>n~bD#t+^VL)jT0AD0Wk zr)Gi>b9Hvkx{>63l|--B|MnaLhKAIYRaNu$_ME>|RpmjRmnz48eI=5F4tx_D9o-EJ z8=07R0~DvoKm;{Ns65?&7h9DBu_|Bg-%03w{_*2SX%`n>;O%!46FSddys&_}6Fi0$ zFddtnot>#dKRX`7D=8&~0y=HKzt(I3yjfdYw}leY^LQUx4>&CTLx?n~?Ip(7(2TMNypVGA`5KM074bA6^g(MK9p+I(;DD6#btJ(1gV=fo53 z=}qT}2lyEJ14sE!ruh%QU?KvbUGr-jj2RhsWB`gCq6f zF$BD`^erT}vQm3>KRrF&yS2OmzB)H|pD$T;b$@<-et^%#n%&z8p&+E?M-ha9*M9nU znS4s|V#E#&`m3N~pNvho5_6&RW)@k6-z+5U=~=6l%6v%(y$$H!@R!6KXHR2TJ2^e^ zvKsk7#%q2HF!ujX08;byf5=l$PcLnOejOFA!&T{A-=a8%emILDAt6cI`Nhe>aZ}I3 zF7lSdd%#?P3BS{{O*u$&>*|s;|L3A@prN8prot}2olYcbaU{E-Ey2d@;_ zxP^{R3*9NrQdpv(H1sVBRFhwi=00*8g9Et(eFxfjW%5bYM%eJJxq4#o$TW8jPEKB^ zMmjn>c|XRJ<}BH4G`)vTHkc-IccB@@zqp4MFpvoX{H9Z+DN!oB>m5*2BgA3aa-Z7& zlDBZW4WIv})92$uFD8}}mLZh=1OxJ;18j;mMiF``y*d{^oLUtgKEzn?yKrc3pdNXN z7MGZ40ljm50Hvnp<_h~6zOC8n@R#>hR8;Z`3ZMas2AS6VNw@f>qX2~fZ*;zTQVH() zdT#V*m*t0~N17=hFZCc3 ze&t3>{>sa)Rrz*T;fYYhB2IeiEwZJzqX>+s|I6bmrF6`z_Va;%D4V}9O6GUxnc*KY O2qgt|`7+sOum2xj;pL0~ diff --git a/python/img/leftTerms.svg b/python/img/leftTerms.svg new file mode 100644 index 0000000..c5633e9 --- /dev/null +++ b/python/img/leftTerms.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/mixedGauge.png b/python/img/mixedGauge.png deleted file mode 100644 index b8f9cdaa1b7613632d0c7d46ba4efd08aa9ce216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5023 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 x>xM-=W+Uqm{ZhQ^J|5K?LfUu(=xG^3O7A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/mixedGauge2.png b/python/img/mixedGauge2.png deleted file mode 100644 index 58c290bb81ed6a39845bb94f595a31cfbb2b3685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2033 zcmV5UjLYz%{lM$|aQ527aRh_Ny9$f)>)V1x2dG)}4l;v*xN zfM9gcs@Sct#%Kaj9E4B_*o-6)6cR@s1+2!QT@(6X_wNUs(%qeDXLj!F-d*l5nJ?|` zz31L@|M#4kId=tcI2@)B%54CL!^wq9LC_HrU^w+AP52oA&_Mm zvMhrT0#Ov9s%orbvTYl(EJGB*x#tkqJj7iyw3O>@WrEIG`! zZK$dWQ4|Yo69fU0B*8F@*!rh|<2XZO&@|0+aafiGRaGGf0yIsdZi8*xL&A3)C)9US zsT4#}WNMxb!+!RjJycs%oS*P1A%ZilGG^2gR>EDNG2Qi=Ywe5`3& zEU9%EbX|v{D3RK5g&h}>TQ*HI^iJ-DEX&kV*eLg@vMiT<;kd}M94WG>s*2|3=E!!8 z=;Qtr^t#Dt+LIo&9Tr4M%Z3USWfuLNb1Sykv?83pkN?GqFK)$z%dbTud2G~n*cN3setCN=YF6z- zUx0QhQ)C%d`yz0kdbx( z|7@R$TM`K*e6H(TcHn4;7E`H|j}Qit-t#c7ZfeK=3;^`t@R}4l&Uv@vFYMs>`ncx< zEE%&BsgEZITFl`@Nqe+>kmnNWb*O@@=(3n?mAODSC*G)w2 zTpgdcByh=`%{ZPth3}uO$F$YUF*DJMj!f=1See&C8-B-*1rlbrt-!2+nO#{$DF{NK zD~JBA*l@>Hn6l!1tZb_LKeZXanQhZ?<+AVa+d#JHenQ*ga<&yMwXdS}Y+>K|XqpzX zpYXeS@nh*kGBGny_7Us6o?eNE#~Ik20nnvkR?RBx96W_@rri&%>j>JWtSDIA;pVke zkur<^gY$83?OZJUs0ni}IiJ~Od%woo+h*Xg_V+OFrq9rsw`?jbQug7`Ei%R#zu_GE zaI$R*YF6#T05a&=b{{4sy{C~@r1YJvE)9u9GEi#bAEio%fBM>m-7hB4w5JCEaPIJO zJiYxd-*#xc$|&%0?^b;F#2D1S^)tGWLHgjcn0;vj7Hl`Mj=X{`Kh49`B|C8{ubomv z${?c8u_3!3si{-3@JJtkPP8|S#r!?pIPlKR|IhJB>`xv82~47Xze6iI(-G&PNZ>k<6XX~Z0zal*;cgFy@6z3 z7C;YIEh0WZ%5soYw%S%1EjyjhNdfU!?I0SchBo1W>ujhWo8FHX{f-yVs=ZXJ8&-o{or13SZ-#818T=9nQy+im1J@F8= z1Tbn9j!Q5f4-=+t)mWg*)EF-OF~PH}C&6Ux`SPRP^`V7xpaRmH-x8JU}CL1uoPzN2PK^*@y1! zO}KICCuo0p8XoeKmWl^}^Y(;|c5b~a&2i9pwZcM~-9=G6z+#!5 z8|}ijr>bh;!tYYy3QSRyKz7--4M~!y*Jdh;66xU=&Bz@EUDqSe4fADo0NVxWLGBHQ zSO1rL(RkrF4irTJAq0kDc#6}uZD^VXQ50i&a_l~MDkjRfn!3etfKyI`?L zx1vsxA8ui~q9~rJvEw*H_ieH)GZi7da9@)Mf{=60Pm&}Eg5Wz&T3D6^Ns@fe%;wwW z+Q!;h$|y&-+|xwNAKd~jq_KXd(!Ct!9z2foxRm2KL#IE6+vYChN;u@4kK;H@{epvg z34-AHcNRChkq$X~tyOou%9V1+c{pJlR_@=HVR5lkGI8E##YLFSrQ&`LWYmr-&|#c# zREv+xJq|8P4mGO9$K@Ue7bS-p)#BrFkAsVnLyc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/mixedGauge3.png b/python/img/mixedGauge3.png deleted file mode 100644 index 600f395fe8d020212e4f80cbba72f203d6b50b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3567 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 L6vnvH=q~ZUPNmBr diff --git a/python/img/mpsNorm.svg b/python/img/mpsNorm.svg new file mode 100644 index 0000000..93309cc --- /dev/null +++ b/python/img/mpsNorm.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/img/orthonormal.png b/python/img/orthonormal.png deleted file mode 100644 index bf21b67459920fe9d8ae38f2b3ae484763205bba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 zcmd6NcRZE<-~SP1OS1PkII<<<7)6d99Z5)J7P2K<*?XLhB&!Z8B%`d5C~=TgDk&oh z*`v(3UsvDnAHUz<_dj=!&*!0>>$=W+yx!0Cx)RQs=rPi9)1go(Mgx5vGZc!#5dNp5 zIRwA)_u+MgA5?zY2Ie&ICzQr19{$bckF)eY=jGym!`{~!b;Z-m!&%zT(bw78)9I#FQ_1=ASWm%hm}*pDk#fGVN6gc zL6m`xmU&?A!nY8ccN>$`%b#X#^*tpGB#zv^m(lPcy8Ubw|4%hP9wkS++Tn#AZyuhv zPnCM^?krzET<6>6VIb{s#7xLR!f?Z9>P;Qp>QQwYVZ;*z-;RvaMyp6Js z$;s=ZOMP3p8+xJ!1S(^hgGil%cRNpCwU82V03r zi1)vYXE`$aii8#(y!C(LLiz!UWW1-R%%Az;sIl-J#)gK5&Uf!{;o+L4rKP{Zu1QKt zs$j8g?d=DjK7Gom;w=~%6*WM@B?SxQbXu064G21Ma_k8S33pZf#2g$Q?VX)tZr(%% z1_iYa3>-;KO|5q7cdO~_>+7g-|CFAepBf!arB8?!IvqQnB>VEzBa=KQvX+yvO5ukn z5=q!NU!6&8@fssUtV556&R>u zbLkSULs)@Es_T*WuMZOIv+t?%^Yi25<8LMtEa} zvW}WK>vI;o8o}oNyu!H2!NycYZpNnO=84%^+8S$VZ11@YG;Mfz_|?yqLa^qz z4k0tCUd$XuQ*(3*~3klV3LI=|^&oQ(~yf`Wn$at*sPUrbzF;h7wznJ+bE zGnioc%db$MM@B@1g|+=zh1(tQ9|vBB?J#q5AH&9uT3)>9`06Ib=f)cqGZ>x3cG45d za*HIRESc7h4n2R?=GB#zR=bG5qS!+j4po@B`}gmoGBY#10|MCja22_Ec^O$*)a4eE zSh@`1|9*^0_7vyW)6+9QfBr#zy(N4l4!-i1ZXpHgZcYxp3CV6Fydb1S;D|;tPNLAU zBUP)|Ok=&{>sMYJ4wuGTW>F@f8bBt99xyw4B*{$oTjPz6JhdCltgKY1yV&c;;7|V( zt7m$tjI^{`K|!j)>oXKLZrosHXLs0MpY_!f6RyNKU-9rrfjJ&Pd48?OPbz3?Xz=N! z@wd0d(3eS{6DCk6ncZaK!=g~V1t;w$eV$$E)6J5(v<#a`K9UsAAElN{-(TgZhdROG z?BF0QEFyA*kFUHl0vHB##VOYooHZnzK+FH%Yvu>9=Fjw(6#sO{amGv(q}QvkSlZ zJIG}6Wq}9wU9ggZpD2$!DKB^CdQ@vk+$Y?=9aU6><~-k4y!cb`~4uj=x`u z952qY9h{rf=>6K@m*Nl?=xBESe9ZetrXms&w15fP78dN))z#h$UrrD+Gao#8!qD5> zTOa(pR4OPjF|qXT4Z%b*N3m|9ma#DdvIksT2|Yc=sGDVFl34#4l%1U&1D667OtJO% z+$Z^nz0l_5k;izE`uck00K!=H_4Q9#S#do)lVh>4vbeZ7^Rb)ydGB)Q6aOX~f0FRa8`7b#>7J z9-TUWK2vI#Tj?66TcyUi`ropgaQ}FD@@)zX|CqYEIx{bC^8NdQn_F8NzTHgTH@37g?bF<0Sex#POG$a>m}Y8XatNiqzq=OPy)5YEwd5AzrNB=>PrSNC zY5B~B@q^om=ho5yJ}E(KKZOJZQ7>PPjWX|1pq+yb1<8L1cA1j}A}!K$UD1^6mycJ3UT72$ej zZZ3nL-^u}Rj7IyAAf)Y36nY;@$vkygToqlL!|4G7BvdIA%F zH^w^j1j3>_JM{~*(n@{`yct z65(PivEW73RrY9#B>c-gl47{LP%*@OH-naYvWbIxi9~C!ISLjB+ z_g(ppqdIsH&{jxDhyutE9>Z6NF$B0*9t%BsvG!W)$MTCSzsf2SQ;U>&ls(_njfE!> z2rN3fx}-~u0UP^I>+3m@5!TeO-A&i&>gv*N3IBW9%PTF4`f%Iuu$4c$(1{hN>hVSK z+L!0#86ZTc$~d3Nw+X3Qbi|yTq`kj8uX}r$;+Xip*OmUtXyy39VHbL|W%6D;TQdLC-h1%QOSqc^~ zGC^cRiTOsvNi!vw%Rr&t*qAZ=4hO@zQi%%!{^O#S#f~b~544i`4RI*&>4(5?@c4XOw3J1_Q)e+x$I632? z%*j}nFg5RS)b{T=aqOX4@87@9H~snI&Z*!;qq)0$8oo2JmF-6=pIT+mn#(SzoU0?X z<@1w=`LL`Adx5rc5@^)S#a^cawhEr&KVz0(HyTW@q@?t@(w_39B{5rz%~?x}VsB?` z-(jjV1L`|EodGsS_jN4e%Im`?X}Ijh?nqf3;Nalc+}TM=)jokB%%6pkxS_HOl5UP1 zw}rUUVF8UyOiaw|?H}~>0!n3FyLPRpJ4=@S-O6()EcEf?$6dd@xK1iO%ecC>CQ40B zJ^Qcn+MPfsKI|yfD1P%sXZ_a@J(SRghNFRDjbS@VUuxXrWG=n9+?TH*r>x9zZ`uHX zeA5C=jHKjipfiTm8**%Liraeg)O;q|4i*kKz8a7B{PhKR#cX5oTQP@ipw^&U4QUe4 z#Gqw=uhGfbSu|{SrGr$coO#;2N<3xscKRaaJ~$1?F9yVMeX$v>Cd`N|a|3JMBB zd3pJBkahz;`f&hyMyMj#0(i(OJjCy3PX@Q*Rly%qQ}L;*mehy&iT9MfWQIpZjOf{= z(hUs_b@YPuVd>XbIs}YhX9;CxWkezojb)iVYildh(Aa2H(X^U4gF#E|zRm?=1|h(B z?vY7*z}#Kf(M*Kv-sgTqs5&aLd3{C8&q3V+`;qmdeRA8{BWdZ~(J0{T50A72WTF0W=Nh}Phn!b!e6 ze-<`DSTXbS%YeXr@^Ww69XOWq)~#El!hT9tE28_yCtCY^e+Np=i4Wl8oo;7l#sKYJ z8*Q@kXWiy#XLAM(#U!BFb34YkHb6qpw6j z+XLQp+7RS<^KaIyVz*E(C=AX@sHaCK#uWkrh6AM`Q(oP#0De(}~-Q5j5Bouni zR=5ENz~0ov3&_aA7sG#A9>;a`Xw=0z&y}Mm6;$D>nSnxT#Ifi-=s0VPFCB6Nm<7Y7DlsML6v;mm6+%p6+_{7$CIm%o0mt)T9;PcgkSX5P2LobNl zF0?2csP(vr3=TmLRy@(Ih8s2uS7F<%qbEc-5Av(U#vTP9;PH5*aHXVJH&P5q!ME?- zOMLP~>S+5ac_5rX_yMO=UkOzi_sw4gY zY})`{pLzlpG}U?Jx!X`8&pLs;1-?&3OOClMNdYXC?8{Bk45v=@3-5^otE;Qb%*=vV zx}nH^l9a4$$I4{K)>A_!6kXf&G}Flj`ugLBT{mf@yQZd`{1?8kxwy2+X0nif0_D~Rt_W}BD++4!96ND> zO;b}-ScI7@1Air;TR(le;LlnrYLBx58J@%;Ta6)46+L{|_T>vVKns+Dn}H=hUo(uG zJ0%upASNy?%?RRBN=jN92P0&$AeNMrR904=f`Q_2f-I3)xeRHQBx56^sH`jw0CpXm zAR!NJpl@V!8n6KF!NRQ6tvWwAUAa-JNQwV2; z$KL{i^A%xGPz5%M1Y!hm{PzGeBAnq{7G=(O0-4;~8w+~92f_yA*=9u0XDA3pZr{$! zd$%@BQ4F?_SE(*~Gcg<(ujC-uN>NlEkt8K=d>B_-)SJv~W|XZdJz@T-?H zjnCk42VsjWiHG#{@js`g?q8q#C>$%sA_l}_UCs^(22>XxtwdL3tX5R$MMt6w;b>+?-AAwAQs%GPh z%D*{}v$D3PLxtwcXXk>eSZh)~Tg~AN&qOUpDrM&;Cer0^97@C)ppUW_Pq3H~fwsP; zr5Q6N4SJJbh8;F#FHOpnyr5k;@L^<*`rtwGpHPqdo!BItL84OFwmhg9r|*Ml3GWvp9dad^yjdj zl$6xj^XEl3Ds|dmoU31v(G_QAo^O^ZjwdEgznu6tz5nMY;cr)UW+odPG5F65E1vhz zINPk^({C}8+<1PCU>N1ecvy{SR#EQ_C83KKFE+%9Q$DkQ9UI)7rXVMmjx)ekVGITy zn&eqm9Pa`T{$a#@p9h((EfE-;%6lV&87S;dNT7lo#11txG{NsH?O*TkT)4fLcQS(i z{Q2`UA4+bI+FgXvFD@*HdQsX5pBs4YdXC*$BOB-nafYDZlKC~PmnvkRV1nAxOI$~r zRQq;|RO%tYoB=;S4$% zwgOIF(7(E#{rNLCH<#Db!BFfGlwW6WFFRk$la9q6qk8aFD=JLq>z_C0)lN2}qgA{;X`e)9tolwtUF27h88x=*_7e*=a1Os_ra&j^Q zh`xlxQ)snJ!x$iO5ozf&fNqozjvJ=vMnMXb2%k}1I2WsDi4P75dEM3)34_cS=+vDX9?WYm_(QXkS*R8$n7d6r^q-A{Kn_e`VzL&x44Am>{rjT^1_m%2XJq&zWR1F_PC+K32<8wnf*k!p2CnYetv#FvxA}tcMUb(@G@axh+Zbm50!BM zN9mvJg)Wcjyf+pSVbSgWneo|RCIK-;IU(L5Xm8= z{B~r72XYSJVNzi_QzE7d!qTtxK2aRCgqw$<<(}uDdN@qyM7K)_h8X#_Vxj+#%E?|z|bN2{ovrL0qORs#v4nzmX@3l zn)H`nR37l5p_4I0Azvr&HLC99;zDxnzC)V)Um$@RI5_zL&woAwB*p=PdzmC9A#n?s9q>OAm&Bfsdae-o zFLb4yV-uWPTSV?e8C5SXd~f3U~;X5hCNb^>zQpLv9d=B1%ReVpm>s zbDUD~YX7M_QtMM6E9}ycNCFlqCMzpzMg=YL6{t>BO-*eU!YFWjA0gZ=5<7EGpNWZS z@Oyhw@!+7@KnDLROvC87OHcaz{Cp7v_y$NhiDWPVN)Y1W;#iT$o6dkxv`K0T+o_%U z_3Ky)ud10p(Jc%DFaoSIq{w1y?Cgm!8-UUhH~@r{l$7VL@5K-^2TIQnRrJq5{4;al zM01op2q=9YA0HT$({Qyj!LXPB39X20jWuE{NhEDhfP^Bmk|I8}fcVtYSV&+D;IBjo zUv>WDO|8o#G_)nj%KU)keuAzB_VQ#x;la2l#{)^ zko3h`uoAZ)&K&mR_y7Ke)_-Y~4>Z}^XxgLEE)pOC!J2_Dh+AIvzMCzv8t{SpTZ11p z1Q9p`16l~K?4ba#EE;dsmYSmAYzc{oMBR{~agf_@gBue8f*ju_b73$T=6gRzyjt2p z(<9+sl#~IgvZ|`J@8o_m!~<&~zv(u%rVA)hdmAnLv?dO1I;O63B%m~3Uta>^j-_4$ zqZjF>a2o({u-?%s7!90cEP;&B%-OjZkUI*3E-=Xu^e3e{5Ex1^&}s`<8kMFbtnO3_|`9om}AsW(Sr$?yvwmUyMHuBV#5oAX~(Z7yw}rmf!MtUG5@E zbar;8hwZ}L*XM`N)$(-C#QGg#X4)Fi2koi}6jcG#M6RX88 zib76R%igwRt=Cv8Xm{f~@@uQBf(9%wEoUxM8Q_0y5TB5@iva((Jt_!KykHl`w!hUE zQQuHw%uovhUmkBo@+ZyxT|X=S-;fiZLEQv>Vr%OK5$@FiQoG}Ru8NPg?BvW~k-<@Y zg8%-8i1WD;bHG>Wrluxl7M95Q`D+6i$@wueDAT#ZG)-+26DBxcRG{FH81}c)otIgg zNJj$}M_^|I^u^Fzpp!bBv-=ihE1){RL)NctW0N~j?oWI(p2UKJoGB7C5H%1h<;`Ge zqcA!K2A#{7@6T{L-3L?Y4gC-*DysXCP^bhh3tHECN@MTf6=sSzG@zv=dEx1s&6P=c zmmW?jyO%cpXkn}8po!$=w?$1Eu;VZjp;c@XRarB95Hqaq?Az+K0uI{7C* z#N28;-VJzW54B)fdyVT5BX=}J(F0YBbEC~_unAEBYp7QrO3r~py#+Qx!}l5xXjgYP z9GAoOAd@O9nIX8yQd8iHzaxE77^(>AU_qE)DJx|;)&Q>@GlL6Zmm6n!9 zT2y{kTdOPH?D_Sv&!>FAN9YW)g5i2nYn;G81;ebdPBGQoqJrE>2)eUA&@~yT zN{+-s1woc4A}V?idWDE*9t~YP)7~Sa20|Extq^~gufcQag@3DiMYEWml)?cxNtX5A zLVuRV(jZX|3<+@rX3o8&DOxCPhytY6(b1v$`1Dc|9GvG~WBd@BpT^;0`fUKTsLuM~ z#l*yf6%<&2@z@|xvl-~rXW*1WL0|)!Edo6KWfx@8Vq%G@&Xvh8FiTv()6ke)-kz&K zc<>a^bCv(B*>H<^c-o^!;^0&9W@eGQySr{_*(coDq16%(A#rzZYBCPeKse2Zpx=5Q z1T2u$o0}Aro6URTmsxPMUz>wMwpM@WJLLFQqELsDkaq!0O*`NUBw24A9_CtVT4PET zI4R@Kju=dj5%yERpLGE-3n?kx;Sor;1yneS*mr12;3206LTLl_G#0VnynLpTF^0_g zLjzPBazdc~Wt;Z*cH$EgBMS-yzJC3>+^e>PbajC-e&-kde{H;vAxsL4P{D}Yf!M$Y z%6xNk^D+SG)!}MUq>TgBH3897n}wC(71ptyAQnK6w~%Qp&ps+Z$^{Aw1l%V43;L72 zy)*p}DB&x|fBrla5)!ftJ%eDLeIJ1tpijs-9brL(dCF={3N%yTBnJyXcaIh@>bEA- z`3k$1aD>Yflai3$8FU#!w|-!TwU**{04J>0*?@cj0JlxsU)doT<3K|4}q`8ptK$QiR`hcvA zhAV~9Xe#KaQFw1OP9f!IB-RyBpv9zoex&X&M51>*nxH@GFxnJUouc;wxUUF$ z^3WQTkdWx?=|S3$pdg_WNC)}nE7;Ks6}Fk8rg(e?=?_+JnCr(RNFL;Cpq-Jnd&$s{ zEZwK@6Rx8zljS~$4hr8n1V;j>;UZ_vyYC?^Ohifva>r~Lh&OKrIODwU{%>skKu z2ijO0j%g*OrGy0~k+A$v+pkEhQ?__GDI_pG@Z&D@2L3%utpu7;pkhYDHZCEr6fC{m zc{*Bvnq64%P)w^A{QIm@?%NBwZ(}xI6A{(Tq-|LE@uE6`K$f+xzoy@Jb9CS{7U`27|YG$hPNO&%YYOUuzyA!-WGX=k(IrIXQ71^ z>4c6b1Ti((I|5V839pOmZs|h@u%SUUG&GcdI|u|n1pH_WTZZdpJa;^d8+kpXw|DVD zfoYBsrqJ1ZwXAPW?Ix3(=8n6RQd_i zTY;_usi=r5BO~MLr>Eckwn)mz#3HGchev^1a!8BmnZ6|<1!t))Z2gADOvi$ut-ycV zO+#~>(07S~-6jRN3&FUW=k5b3R#sONJjx^*rhfiJ6mamEQ&gwrvYjs9WAkHx-2ZW- z&7l3GKr2EPh`bC@*cwIc2u%y!waq?|afA*M zvR$oNfVUTs7gjXcv-GKZF$Mj|!GYvl2o44aAy&Rey@>CDtVIw?zh!qd33<$0Qm8hp zupTroCZ?tk|M37CkI0KFAQO=nSAfR>NIA^|gpbs(himt#uQ3P<3wtkqRR!{xL`1d7 zP#2UzKd>0_&K>wHQq;hl9^RfA2dfC@{AiumSS+Al?X}?p$on1^HOC|+5jlw9D5!9i z;PtEJb%7!Z*WsQI@bUzZ00{ty^SBGci|cc-h(!ANE{9Y|QQz2OTj$9KZ@R3EhAi1b zpdO!=7Kgl*b5-Y1)F;eu3``Z2q7JnE0jS28meRnw6~c}IJ4G87mu@g{rySba+Cmzm z03gfL1rgfN)P&^#x@_9tq!ljJfHbJHyBm5NZ@pUnBC*KS)YLdUraA?}p){}t4*>X( y7oB1mxFX>^k(D$vs_g&0wdMZ5d5ddeA0@@)(NXsBRvo<4hBCmJ=seZF9Qi-k=-~bU diff --git a/python/img/partFunc.png b/python/img/partFunc.png deleted file mode 100644 index 477862d0e800732b93044bb65ffa28bdad941215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23696 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