From e930293cb49e0fe98b54c05d62b3aca3430fe45a Mon Sep 17 00:00:00 2001 From: Ben Corbett <32752943+corbett5@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:13:43 -0800 Subject: [PATCH] Filled out the README. (#7) --- README.md | 102 +++++++++++++++++ docs/plot-generators/fh.png | Bin 0 -> 37898 bytes docs/plot-generators/plots.ipynb | 71 ++++++++++++ docs/plot-generators/renormalizer-plots.py | 41 +++++++ examples/electronic-structure.jl | 91 +++++++++++++++ examples/electrons.jl | 122 --------------------- examples/fermi-hubbard.jl | 68 ++++++++++++ 7 files changed, 373 insertions(+), 122 deletions(-) create mode 100644 docs/plot-generators/fh.png create mode 100644 docs/plot-generators/plots.ipynb create mode 100644 docs/plot-generators/renormalizer-plots.py create mode 100644 examples/electronic-structure.jl delete mode 100644 examples/electrons.jl create mode 100644 examples/fermi-hubbard.jl diff --git a/README.md b/README.md index 10f7040..f528dea 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,105 @@ [![Build Status](https://github.com/ITensor/ITensorMPOConstruction.jl/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/ITensor/ITensorMPOConstruction.jl/actions/workflows/CI.yml?query=branch%3Amain) [![Coverage](https://codecov.io/gh/ITensor/ITensorMPOConstruction.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/ITensor/ITensorMPOConstruction.jl) [![Code Style: Blue](https://img.shields.io/badge/code%20style-blue-4495d1.svg)](https://github.com/invenia/BlueStyle) + +A fast algorithm for constructing a Matrix Product Operator (MPO) from a sum of local operators. This is a replacement for `MPO(os::OpSum, sites::Vector{<:Index})`. In all cases examined so far this algorithm constructs an MPO with a smaller (or equal) bond dimension faster than the competition. + +## Constraints + +This algorithm shares same constraints as ITensor's default algorithm. + +* The operator must be expressed as a sum of products of single site operators. For example a CNOT could not appear in the sum since it is a two site operator. +* When dealing with Fermionic systems the parity of each term in the sum must be even. That is the combined number of creation and annihilation operators must be even. + +There are also two additional constraints: + +* Each term in the sum of products representation can only have a single operator acting on a site. For example a term such as $\mathbf{X}^{(1)} \mathbf{X}^{(1)}$ is not allowed. However, there is a pre-processing utility that can automatically replace $\mathbf{X}^{(1)} \mathbf{X}^{(1)}$ with $\mathbf{I}^{(1)}$. This is not a hard requirement for the algorithm, just a simplification to improve performance. Many operators of interest can be easily expressed in a form where only a single operator acts on each site in a term. +* When constructing a quantum number (QN) conserving operator the total flux of the operator must be zero. It would be trivial to remove this constraint. + +## `MPO_new` + +The main exported function is `MPO_new` which takes an `OpSum` and transforms it into a MPO. + +```julia +function MPO_new(os::OpSum, sites::Vector{<:Index}; kwargs...)::MPO +``` + +The optional keyword arguments are +* `tol::Real`: The tolerance used in the sparse QR decomposition. The default value is calculated separately for each QR decomposition, it is almost always a good value. +* `basisOpCacheVec::OpCacheVec`: A list of operators to use as a basis for each site. The operators on at each site are expressed as one of these basis operators. + +## Examples: Fermi-Hubbard Hamiltonian in Momentum Space + +The one dimensional Fermi-Hubbard Hamiltonian with periodic boundary conditions on $N$ sites can be expressed in momentum space as + +$$ +\mathcal{H} = \sum_{k = 1}^N \epsilon(k) \left( n_{k, \downarrow} + n_{k, \uparrow} \right) + \frac{U}{N} \sum_{p, q, k = 1}^N c^\dagger_{p - k, \uparrow} c^\dagger_{q + k, \downarrow} c_{q, \downarrow} c_{p, \uparrow} +$$ + +where $\epsilon(k) = -2 t \cos(\frac{2 \pi k}{N})$ and $c_k = c_{k + N}$. Below is a plot of the bond dimension of the MPO produced by ITensors' default algorithm, [Renormalizer](https://github.com/shuaigroup/Renormalizer) which uses the [bipartite-graph algorithm](https://doi.org/10.1063/5.0018149), and `ITensorMPOConstruction`. + +![](./docs/plot-generators/fh.png) + +Of note is that the bond dimension of the MPO produced by Renormalizer scales as $O(N^2)$, both ITensors and ITensorMPOConstruction however produce an MPO with a bond dimension that scales as $O(N)$. Below is a table of the time it took to construct the MPO for various number of sites. Some warm up was done for the Julia calculations to avoid measuring compilation overhead. Data recorded on 2021 MacBook Pro with the M1 Max CPU and 32GB of memory. + +| $N$ | ITensors | Renormalizer | ITensorMPOConstruction | +|-----|----------|--------------|------------------------| +| 10 | 0.35s | 0.26 | 0.03s | +| 20 | 27s | 3.4s | 0.15s | +| 30 | N/A | 17s | 0.41s | +| 40 | N/A | 59s | 0.93s | +| 50 | N/A | 244s | 1.8s | +| 100 | N/A | N/A | 20s | +| 200 | N/A | N/A | 310s | + + +The code for this example can be found in [examples/fermi-hubbard.jl](https://github.com/ITensor/ITensorMPOConstruction.jl/blob/main/examples/fermi-hubbard.jl). Just like with ITensors, the terms in the Hamiltonian are put into an `OpSum` and then the `OpSum` is transformed into an `MPO`. The code to produce the `OpSum` is + +```julia +os = OpSum{Float64}() +for k in 1:N + epsilon = -2 * t * cospi(2 * k / N) + os .+= epsilon, "Nup", k + os .+= epsilon, "Ndn", k +end + +for p in 1:N + for q in 1:N + for k in 1:N + os .+= U / N, "Cdagup", mod1(p - k, N), "Cdagdn", mod1(q + k, N), "Cdn", q, "Cup", p + end + end +end +``` + +The astute reader will notice that this `OpSum` has multiple operators acting on the same site. For example, it contains the term `"Cdagup", 1, "Cdagdn", 1, "Cdn", 1, "Cup", 1`. If we try and pass this `OpSum` to `MPO_New` directly it will throw an error. However, `"Cdagup", 1, "Cdagdn", 1, "Cdn", 1, "Cup", 1` is equivalent to `"Nup * Ndn", 1` and by passing a set of basis operators to `MPO_New` we can automatically convert any product of operators acting on a single site into one of these single basis operators. This is accomplished by the following + +```julia +sites = siteinds("Electron", N; conserve_qns=true) + +operatorNames = [ + "I", + "Cdn", + "Cup", + "Cdagdn", + "Cdagup", + "Ndn", + "Nup", + "Cup * Cdn", + "Cup * Cdagdn", + "Cup * Ndn", + "Cdagup * Cdn", + "Cdagup * Cdagdn", + "Cdagup * Ndn", + "Nup * Cdn", + "Nup * Cdagdn", + "Nup * Ndn", +] + +opCacheVec = [ + [OpInfo(ITensors.Op(name, n), sites[n]) for name in operatorNames] for + n in eachindex(sites) +] + +return MPO_new(os, sites; basisOpCacheVec=opCacheVec) +``` \ No newline at end of file diff --git a/docs/plot-generators/fh.png b/docs/plot-generators/fh.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1d2053103eb2d5ecbd3507fe95bc7e9756b494 GIT binary patch literal 37898 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�$rmo$Y?d(Q+S^qGcsnEm!F}o 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 literal 0 HcmV?d00001 diff --git a/docs/plot-generators/plots.ipynb b/docs/plot-generators/plots.ipynb new file mode 100644 index 0000000..46762b9 --- /dev/null +++ b/docs/plot-generators/plots.ipynb @@ -0,0 +1,71 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ffsqJ06cUFavXq3Y2toqixcvLnCcSUlJCqAkJSXl23f79m3l1KlTyu3btwt8vuIiODhYeeGFFwy2LV26VHF0dDTY9s033yg1atRQrKyslOrVqyvz58/X74uMjFQA5ddff1Vat26t2NjYKHXq1FH27dunL3Pp0iWlS5cuipOTk2Jra6v4+/srGzZs0O/ftWuX0qhRI8XS0lLx9PRUxo0bp2RnZ+v3t2rVShk2bJjy1ltvKa6urkrr1q0VRcl9P4wfP16xsrJSoqKi9OVfe+01ZcSIEYqjo6OydOlS/fa73z/Z2dmKra2tMn78eEVRFOWNN95Q7OzslOjoaIPrT09PV8qVK6d06NBBv61jx45KuXLllNTU1HzP661bt/Q/X758WenatatiZ2en2NvbKz179lRiYmL0+ydNmqTUrVtX+f7775WKFSsqDg4Oyv/+9z8lOTlZX+aXX35RatWqpVhbWysuLi5K27ZtldTUVGXSpEkKYHDbuXOn/jVZvXq10rJlS8XKykpZunSp/rHuNHv2bKVixYoG27777jvF399f/3oMGzZM//zd+Vh5x919Xq1Wq0yZMkUpV66cYmlpqdStW1fZuHGjfn9B3jP38jT/rglR0s3ackapOG694v/hRiUyPv/noqk86Pv7biZNiHbu3JnvAx1QgoOD71n+XgnRzZs3lZdfflnRaDSKg4ODMmDAACUlJcWgzNGjR5VnnnlGsbKyUsqVK6d89tlnRsVpdEKk0ylKZqppbjpdga+rIAnRjz/+qJQtW1b59ddflYsXLyq//vqr4uLioixbtkxRlP++3GrUqKGsX79eOXPmjPLSSy8pFStW1Cc1nTt3Vp577jnl2LFjyoULF5Q///xT2b17t6IoinL16lXF1tZWGTp0qHL69Gll3bp1ipubmzJp0iR9DK1atVI0Go0yduxYJSIiQomIiFAU5b/3Q9euXZWPP/5YURRFSUtLUxwcHJTw8PCHJkSKoiiOjo7K6NGjFa1Wqzg5OSlDhgy553M1depURaVSKTdv3lRu3rypqFQq5dNPP33g86vVapV69eopzzzzjHL48GFl//79SoMGDZRWrVrpy0yaNEnRaDRK9+7dlePHjyt79uxRPD09lffee09RFEW5fv26Ym5ursyaNUuJjIxUjh07psyfP19JSUlRUlJSlF69eikdOnRQoqOjlejoaCUz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "numSites = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]\n", + "bondDims = [2, 8, 23, 42, 59, 80, 103, 130, 159, 192, 227, 266, 307, 352, 399, 450, 503, 560, 619, 682, 747, 816, 887, 962, 1039, 1120, 1203, 1290, 1379, 1472]\n", + "plt.plot(numSites, bondDims, label=\"Renormalizer\")\n", + "\n", + "numSites = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]\n", + "bondDims = [1, 8, 12, 36, 36, 56, 60, 76, 80, 96, 100, 116, 120, 136, 140, 156, 160, 176, 180, 196, 200, 216, 220, 236, 240, 256, 260, 276, 280, 296]\n", + "plt.plot(numSites, bondDims, label=\"ITensorMPOConstruction\")\n", + "\n", + "numSites = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]\n", + "bondDims = [1, 8, 12, 36, 36, 56, 60, 76, 80, 96, 100, 116, 120, 136, 140, 156, 160, 176, 180, 196]\n", + "plt.plot(numSites, bondDims, label=\"ITensor\")\n", + "\n", + "plt.title(\"Fermi-Hubbard Hamiltonian in momentum space\")\n", + "plt.xlabel(\"Number of sites\")\n", + "plt.ylabel(\"Maximum bond dimension\")\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/plot-generators/renormalizer-plots.py b/docs/plot-generators/renormalizer-plots.py new file mode 100644 index 0000000..45b92bc --- /dev/null +++ b/docs/plot-generators/renormalizer-plots.py @@ -0,0 +1,41 @@ +import numpy as np +from timeit import default_timer as timer +from renormalizer import Model, Op, BasisSimpleElectron, Mpo + + +def fermiHubbardKS(N, t, U): + toSite = lambda k, s: 2 * k + s + + terms = [] + for k in range(N): + for spin in (0, 1): + factor = -2 * t * np.cos((2 * np.pi * k) / N) + terms.append(Op(r"a^\dagger a", toSite(k, spin), factor)) + + for p in range(N): + for q in range(N): + for k in range(N): + factor = U / N + sites = [toSite((p - k) % N, 1), toSite((q + k) % N, 0), toSite(q, 0), toSite(p, 1)] + terms.append(Op(r"a^\dagger a^\dagger a a", sites, factor)) + + model = Model([BasisSimpleElectron(i) for i in range(2 * N)], terms) + return Mpo(model) + +numSites = [] +bondDims = [] +times = [] +for N in [10, 20, 30, 40, 50]: + start = timer() + mpo = fermiHubbardKS(N, 1, 4) + stop = timer() + + numSites.append(N) + bondDims.append(max(mpo.bond_dims)) + times.append(stop - start) + + print(f"N = {N}, time = {times[-1]}") + +print("numSites = ", numSites) +print("bondDims = ", bondDims) +print("times = ", times) diff --git a/examples/electronic-structure.jl b/examples/electronic-structure.jl new file mode 100644 index 0000000..cbc3018 --- /dev/null +++ b/examples/electronic-structure.jl @@ -0,0 +1,91 @@ +using ITensorMPOConstruction +using ITensors + +function electronic_structure_example( + N::Int, complexBasisFunctions::Bool; useITensorsAlg::Bool=false +)::MPO + coeff() = rand() + 1im * complexBasisFunctions * rand() + + os = complexBasisFunctions ? OpSum{ComplexF64}() : OpSum{Float64}() + for a in 1:N + for b in a:N + epsilon_ab = coeff() + os .+= epsilon_ab, "Cdagup", a, "Cup", b + os .+= epsilon_ab, "Cdagdn", a, "Cdn", b + + a == b && continue + os .+= conj(epsilon_ab), "Cdagup", b, "Cup", a + os .+= conj(epsilon_ab), "Cdagdn", b, "Cdn", a + end + end + + for j in 1:N + for s_j in ("dn", "up") + for k in 1:N + s_k = s_j + (s_k, k) <= (s_j, j) && continue + + for l in 1:N + for s_l in ("dn", "up") + (s_l, l) <= (s_j, j) && continue + + for m in 1:N + s_m = s_l + (s_m, m) <= (s_k, k) && continue + + value = coeff() + os .+= value, "Cdag$s_j", j, "Cdag$s_l", l, "C$s_m", m, "C$s_k", k + os .+= conj(value), "Cdag$s_k", k, "Cdag$s_m", m, "C$s_l", l, "C$s_j", j + end + end + end + end + end + end + + sites = siteinds("Electron", N; conserve_qns=true) + + ## The only additional step required is to provide an operator basis in which to represent the OpSum. + if useITensorsAlg + return MPO(os, sites) + else + operatorNames = [ + "I", + "Cdn", + "Cup", + "Cdagdn", + "Cdagup", + "Ndn", + "Nup", + "Cup * Cdn", + "Cup * Cdagdn", + "Cup * Ndn", + "Cdagup * Cdn", + "Cdagup * Cdagdn", + "Cdagup * Ndn", + "Nup * Cdn", + "Nup * Cdagdn", + "Nup * Ndn", + ] + + opCacheVec = [ + [OpInfo(ITensors.Op(name, n), sites[n]) for name in operatorNames] for + n in eachindex(sites) + ] + + return MPO_new(os, sites; basisOpCacheVec=opCacheVec) + end +end + +let + N = 25 + + # Ensure compilation + electronic_structure_example(5, false) + + println("Constructing the Electronic Structure MPO for $N orbitals") + @time mpo = electronic_structure_example(N, false) + println("The maximum bond dimension is $(maxlinkdim(mpo))") +end + +nothing; diff --git a/examples/electrons.jl b/examples/electrons.jl deleted file mode 100644 index a4f176d..0000000 --- a/examples/electrons.jl +++ /dev/null @@ -1,122 +0,0 @@ -using ITensorMPOConstruction -using ITensors -using TimerOutputs - -function electron_op_cache_vec(sites::Vector{<:Index}) - operatorNames = [ - "I", - "Cdn", - "Cup", - "Cdagdn", - "Cdagup", - "Ndn", - "Nup", - "Cup * Cdn", - "Cup * Cdagdn", - "Cup * Ndn", - "Cdagup * Cdn", - "Cdagup * Cdagdn", - "Cdagup * Ndn", - "Nup * Cdn", - "Nup * Cdagdn", - "Nup * Ndn", - ] - - return [ - [OpInfo(ITensors.Op(name, n), sites[n]) for name in operatorNames] for - n in eachindex(sites) - ] -end - -function Fermi_Hubbard_momentum_space(N::Int, t::Real=1.0, U::Real=4.0)::MPO - ## Create the OpSum as per usual. - os = OpSum{Float64}() - for k in 1:N - epsilon = cospi(2 * k / N) - os .+= -t * epsilon, "Nup", k - os .+= -t * epsilon, "Ndn", k - end - - for p in 1:N - for q in 1:N - for k in 1:N - os .+= U / N, "Cdagup", mod1(p - k, N), "Cdagdn", mod1(q + k, N), "Cdn", q, "Cup", p - end - end - end - - sites = siteinds("Electron", N; conserve_qns=true) - - ## The only additional step required is to provide an operator basis in which to represent the OpSum. - opCacheVec = electron_op_cache_vec(sites) - return MPO_new(os, sites; basisOpCacheVec=opCacheVec) -end - -function electronic_structure_example(N::Int, complexBasisFunctions::Bool)::MPO - coeff() = rand() + 1im * complexBasisFunctions * rand() - - os = complexBasisFunctions ? OpSum{ComplexF64}() : OpSum{Float64}() - for a in 1:N - for b in a:N - epsilon_ab = coeff() - os .+= epsilon_ab, "Cdagup", a, "Cup", b - os .+= epsilon_ab, "Cdagdn", a, "Cdn", b - - a == b && continue - os .+= conj(epsilon_ab), "Cdagup", b, "Cup", a - os .+= conj(epsilon_ab), "Cdagdn", b, "Cdn", a - end - end - - for j in 1:N - for s_j in ("dn", "up") - for k in 1:N - s_k = s_j - (s_k, k) <= (s_j, j) && continue - - for l in 1:N - for s_l in ("dn", "up") - (s_l, l) <= (s_j, j) && continue - - for m in 1:N - s_m = s_l - (s_m, m) <= (s_k, k) && continue - - value = coeff() - os .+= value, "Cdag$s_j", j, "Cdag$s_l", l, "C$s_m", m, "C$s_k", k - os .+= conj(value), "Cdag$s_k", k, "Cdag$s_m", m, "C$s_l", l, "C$s_j", j - end - end - end - end - end - end - - sites = siteinds("Electron", N; conserve_qns=true) - - ## The only additional step required is to provide an operator basis in which to represent the OpSum. - opCacheVec = electron_op_cache_vec(sites) - return MPO_new(os, sites; basisOpCacheVec=opCacheVec) -end - -let - N = 50 - - # Ensure compilation - Fermi_Hubbard_momentum_space(10) - - println("Constructing the Fermi-Hubbard momentum space MPO for $N sites") - @time Fermi_Hubbard_momentum_space(N) -end - -let - N = 25 - - # Ensure compilation - electronic_structure_example(5, false) - - println("Constructing the Electronic Structure MPO for $N orbitals") - H = electronic_structure_example(N, false) -end - -nothing; diff --git a/examples/fermi-hubbard.jl b/examples/fermi-hubbard.jl new file mode 100644 index 0000000..d56b88d --- /dev/null +++ b/examples/fermi-hubbard.jl @@ -0,0 +1,68 @@ +using ITensorMPOConstruction +using ITensors + +function Fermi_Hubbard_momentum_space( + N::Int, t::Real=1.0, U::Real=4.0; useITensorsAlg::Bool=false +)::MPO + ## Create the OpSum as per usual. + os = OpSum{Float64}() + for k in 1:N + epsilon = -2 * t * cospi(2 * k / N) + os .+= epsilon, "Nup", k + os .+= epsilon, "Ndn", k + end + + for p in 1:N + for q in 1:N + for k in 1:N + os .+= U / N, "Cdagup", mod1(p - k, N), "Cdagdn", mod1(q + k, N), "Cdn", q, "Cup", p + end + end + end + + sites = siteinds("Electron", N; conserve_qns=true) + + ## The only additional step required is to provide an operator basis in which to represent the OpSum. + if useITensorsAlg + return MPO(os, sites) + else + operatorNames = [ + "I", + "Cdn", + "Cup", + "Cdagdn", + "Cdagup", + "Ndn", + "Nup", + "Cup * Cdn", + "Cup * Cdagdn", + "Cup * Ndn", + "Cdagup * Cdn", + "Cdagup * Cdagdn", + "Cdagup * Ndn", + "Nup * Cdn", + "Nup * Cdagdn", + "Nup * Ndn", + ] + + opCacheVec = [ + [OpInfo(ITensors.Op(name, n), sites[n]) for name in operatorNames] for + n in eachindex(sites) + ] + + return MPO_new(os, sites; basisOpCacheVec=opCacheVec) + end +end + +let + N = 50 + + # Ensure compilation + Fermi_Hubbard_momentum_space(10) + + println("Constructing the Fermi-Hubbard momentum space MPO for $N sites") + @time mpo = Fermi_Hubbard_momentum_space(N) + println("The maximum bond dimension is $(maxlinkdim(mpo))") +end + +nothing;