{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "f1v7ZIHNvg7D" }, "source": [ "# Quantum Chemistry Hamiltonians\n", "\n", "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/block-hczhai/block2-preview/blob/master/docs/source/tutorial/qc-hamiltonians.ipynb)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yVRKfOfyvaox" }, "outputs": [], "source": [ "!pip install block2==0.5.4rc14 -qq --progress-bar off --extra-index-url=https://block-hczhai.github.io/block2-preview/pypi/\n", "!pip install pyscf==2.12.1 -qq --progress-bar off" ] }, { "cell_type": "markdown", "metadata": { "id": "QbsjgwANwd-C" }, "source": [ "## Introduction\n", "\n", "In this tutorial we explain how to perform quantum chemistry DMRG using the python interface of ``block2``.\n", "\n", "The quantum chemistry Hamiltonian in its second quantized form has to be defined in a set of orbitals, such as the Hartree-Fock (or Density Functional Theory) orbitals. The symmetries that can be used in the DMRG calculation thus have a dependence on the symmetry of the Hartree-Fock orbitals.\n", "\n", "1. For spin-restricted Hartree-Fock (RHF) orbitals, we can perform spin-adapted DMRG (``SU2`` mode in ``block2``) or non-spin-adapted DMRG with any lower symmetries (``SZ`` or ``SGF``).\n", "\n", "2. For spin-unrestricted Hartree-Fock (UHF) orbitals, we can perform non-spin-adapted DMRG (``SZ`` mode in ``block2``) or DMRG with lower symmetries (such as ``SGF``).\n", "\n", "3. For general Hartree-Fock (GHF) orbitals, we can perform DMRG in spin-orbitals (``SGF`` mode in ``block2``) or first translate the Hamiltonian into the qubit Hamiltonian then do DMRG (``SGB`` mode in ``block2``).\n", "\n", "4. For relativistic Dirac Hartree-Fock (DHF) orbitals, we can perform DMRG in complex spin-orbitals (``SGFCPX`` mode in ``block2``).\n", "\n", "5. For atom and diatomic molecules, we can perform spin-adapted/non-spin-adapted/spin-orbital DMRG (``SAnySU2LZ/SAnySZLZ/SAnySGFLZ`` modes in ``block2``) with the $L_z$ symmetry.\n", "\n", "Next, we will explain how to set up the integrals and perform DMRG in each of the modes (1) (2) (3) (4) and (5). The quantum chemistry integrals will be generated using ``pyscf`` and transformed using funtions defined in ``pyblock2._pyscf.ao2mo``.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "aEtzPUucyvCg" }, "outputs": [], "source": [ "import numpy as np\n", "from pyblock2._pyscf.ao2mo import integrals as itg\n", "from pyblock2.driver.core import DMRGDriver, SymmetryTypes\n", "\n", "bond_dims = [250] * 4 + [500] * 4\n", "noises = [1e-4] * 4 + [1e-5] * 4 + [0]\n", "thrds = [1e-10] * 8" ] }, { "cell_type": "markdown", "metadata": { "id": "kzFc7fBTyuQ_" }, "source": [ "## Spin-Restricted Integrals\n", "\n", "Here we use ``get_rhf_integrals`` function to get the integrals. Note that in order to do DMRG in a CASCI space, one can set the ``ncore`` (number of core orbitals) and ``ncas`` (number of active orbitals) parameters in ``get_*_integrals``. ``ncas=None`` will include all orbitals in DMRG.\n", "\n", "For medium to large scale DMRG calculations, it is highly recommended to use a scratch space with high IO speed rather than the ``./tmp`` used in the following example. When running multiple independent DMRG jobs simultaneously, each job should have a distinct scratch folder name to avoid file I/O conflicts. One also needs to set a suitable ``stack_mem`` in the ``DMRGDriver`` constructor to set the memory used for storing renormalized operators (in bytes). The default is ``stack_mem=int(1024**3)`` (1 GB). For medium scale calculations 10 to 30 GB might be required.\n", "\n", "For the meaning of DMRG parameters, please have a look at the [Hubbard - Run DMRG](https://block2.readthedocs.io/en/latest/tutorial/hubbard.html#Run-DMRG) page." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6t5RHG5hvv8V", "outputId": "fef01818-68cb-4461-8f1c-17e0423a37a7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 5.5986859646912075e-14\n", "integral cutoff error = 0.0\n", "mpo terms = 1030\n", "\n", "Build MPO | Nsites = 10 | Nterms = 1030 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 13 DW = 0.00e+00 NNZ = 13 SPT = 0.0000 Tmvc = 0.000 T = 0.008\n", " Site = 1 / 10 .. Mmpo = 34 DW = 0.00e+00 NNZ = 63 SPT = 0.8575 Tmvc = 0.000 T = 0.004\n", " Site = 2 / 10 .. Mmpo = 56 DW = 0.00e+00 NNZ = 121 SPT = 0.9364 Tmvc = 0.001 T = 0.004\n", " Site = 3 / 10 .. Mmpo = 74 DW = 0.00e+00 NNZ = 373 SPT = 0.9100 Tmvc = 0.000 T = 0.004\n", " Site = 4 / 10 .. Mmpo = 80 DW = 0.00e+00 NNZ = 269 SPT = 0.9546 Tmvc = 0.000 T = 0.004\n", " Site = 5 / 10 .. Mmpo = 94 DW = 0.00e+00 NNZ = 169 SPT = 0.9775 Tmvc = 0.000 T = 0.004\n", " Site = 6 / 10 .. Mmpo = 54 DW = 0.00e+00 NNZ = 181 SPT = 0.9643 Tmvc = 0.000 T = 0.003\n", " Site = 7 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 73 SPT = 0.9549 Tmvc = 0.000 T = 0.014\n", " Site = 8 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 41 SPT = 0.9024 Tmvc = 0.000 T = 0.005\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.000 T = 0.005\n", "Ttotal = 0.055 Tmvc-total = 0.003 MPO bond dimension = 94 MaxDW = 0.00e+00\n", "NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Rank = 0 Ttotal = 0.125 MPO method = FastBipartite bond dimension = 94 NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.856 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.252 | E = -107.6541224475 | DE = -5.37e-12 | DW = 4.75e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.706 | E = -107.6541224475 | DE = 2.84e-14 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.132 | E = -107.6541224475 | DE = -9.09e-13 | DW = 5.74e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.609 | E = -107.6541224475 | DE = 2.84e-14 | DW = 1.65e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.111 | E = -107.6541224475 | DE = 0.00e+00 | DW = 5.79e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.623 | E = -107.6541224475 | DE = -5.68e-14 | DW = 2.13e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.076 | E = -107.6541224475 | DE = 2.84e-14 | DW = 6.59e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 4.452 | E = -107.6541224475 | DE = 2.84e-14 | DW = 2.76e-20\n", "\n", "DMRG energy = -107.654122447524415\n", "Energy from pdms = -107.654122447524443\n", "Energy from expectation = -107.654122447524287\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "pdm1 = driver.get_1pdm(ket)\n", "pdm2 = driver.get_2pdm(ket).transpose(0, 3, 1, 2)\n", "print('Energy from pdms = %20.15f' % (np.einsum('ij,ij->', pdm1, h1e)\n", " + 0.5 * np.einsum('ijkl,ijkl->', pdm2, driver.unpack_g2e(g2e)) + ecore))\n", "\n", "impo = driver.get_identity_mpo()\n", "expt = driver.expectation(ket, mpo, ket) / driver.expectation(ket, impo, ket)\n", "print('Energy from expectation = %20.15f' % expt)" ] }, { "cell_type": "markdown", "metadata": { "id": "ErrotOt42zbM" }, "source": [ "We can also run non-spin-adapted DMRG (``SZ`` mode) using the restricted integrals." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rUIaHYBZ2gBZ", "outputId": "4c976305-0ba2-4a76-f67c-9b6983d7ceb2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 7.225136772727681e-14\n", "integral cutoff error = 0.0\n", "mpo terms = 2778\n", "\n", "Build MPO | Nsites = 10 | Nterms = 2778 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 26 DW = 0.00e+00 NNZ = 26 SPT = 0.0000 Tmvc = 0.001 T = 0.034\n", " Site = 1 / 10 .. Mmpo = 66 DW = 0.00e+00 NNZ = 143 SPT = 0.9167 Tmvc = 0.001 T = 0.034\n", " Site = 2 / 10 .. Mmpo = 110 DW = 0.00e+00 NNZ = 283 SPT = 0.9610 Tmvc = 0.011 T = 0.042\n", " Site = 3 / 10 .. Mmpo = 138 DW = 0.00e+00 NNZ = 1023 SPT = 0.9326 Tmvc = 0.004 T = 0.018\n", " Site = 4 / 10 .. Mmpo = 158 DW = 0.00e+00 NNZ = 535 SPT = 0.9755 Tmvc = 0.001 T = 0.046\n", " Site = 5 / 10 .. Mmpo = 186 DW = 0.00e+00 NNZ = 463 SPT = 0.9842 Tmvc = 0.001 T = 0.015\n", " Site = 6 / 10 .. Mmpo = 106 DW = 0.00e+00 NNZ = 415 SPT = 0.9790 Tmvc = 0.001 T = 0.021\n", " Site = 7 / 10 .. Mmpo = 58 DW = 0.00e+00 NNZ = 163 SPT = 0.9735 Tmvc = 0.000 T = 0.015\n", " Site = 8 / 10 .. Mmpo = 26 DW = 0.00e+00 NNZ = 87 SPT = 0.9423 Tmvc = 0.000 T = 0.022\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 26 SPT = 0.0000 Tmvc = 0.000 T = 0.017\n", "Ttotal = 0.263 Tmvc-total = 0.021 MPO bond dimension = 186 MaxDW = 0.00e+00\n", "NNZ = 3164 SIZE = 102772 SPT = 0.9692\n", "\n", "Rank = 0 Ttotal = 0.504 MPO method = FastBipartite bond dimension = 186 NNZ = 3164 SIZE = 102772 SPT = 0.9692\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.658 | E = -107.6541224475 | DW = 4.14e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.407 | E = -107.6541224475 | DE = -1.32e-11 | DW = 5.09e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.150 | E = -107.6541224475 | DE = -1.31e-12 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.998 | E = -107.6541224475 | DE = 1.42e-12 | DW = 5.21e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.947 | E = -107.6541224475 | DE = -1.19e-12 | DW = 3.60e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.944 | E = -107.6541224475 | DE = 9.09e-13 | DW = 1.83e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.888 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.889 | E = -107.6541224475 | DE = -1.25e-12 | DW = 1.43e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 8.448 | E = -107.6541224475 | DE = 0.00e+00 | DW = 5.39e-20\n", "\n", "DMRG energy = -107.654122447524529\n" ] } ], "source": [ "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "jeeDGMB83AaU" }, "source": [ "We can also run DMRG in spin orbitals (``SGF`` mode) using the restricted integrals, which will be much slower (for more realistic systems)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yM1JgseK26_K", "outputId": "ad6eae23-d7eb-4653-e7e3-36a307b711fb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 7.225136772727683e-14\n", "integral cutoff error = 0.0\n", "mpo terms = 2438\n", "\n", "Build MPO | Nsites = 20 | Nterms = 2438 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.000 T = 0.005\n", " Site = 1 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 19 SPT = 0.8643 Tmvc = 0.001 T = 0.010\n", " Site = 2 / 20 .. Mmpo = 45 DW = 0.00e+00 NNZ = 45 SPT = 0.9500 Tmvc = 0.001 T = 0.012\n", " Site = 3 / 20 .. Mmpo = 62 DW = 0.00e+00 NNZ = 131 SPT = 0.9530 Tmvc = 0.001 T = 0.020\n", " Site = 4 / 20 .. Mmpo = 81 DW = 0.00e+00 NNZ = 159 SPT = 0.9683 Tmvc = 0.002 T = 0.008\n", " Site = 5 / 20 .. Mmpo = 104 DW = 0.00e+00 NNZ = 203 SPT = 0.9759 Tmvc = 0.001 T = 0.009\n", " Site = 6 / 20 .. Mmpo = 125 DW = 0.00e+00 NNZ = 265 SPT = 0.9796 Tmvc = 0.002 T = 0.019\n", " Site = 7 / 20 .. Mmpo = 126 DW = 0.00e+00 NNZ = 974 SPT = 0.9382 Tmvc = 0.001 T = 0.029\n", " Site = 8 / 20 .. Mmpo = 151 DW = 0.00e+00 NNZ = 188 SPT = 0.9901 Tmvc = 0.001 T = 0.011\n", " Site = 9 / 20 .. Mmpo = 148 DW = 0.00e+00 NNZ = 344 SPT = 0.9846 Tmvc = 0.001 T = 0.015\n", " Site = 10 / 20 .. Mmpo = 177 DW = 0.00e+00 NNZ = 246 SPT = 0.9906 Tmvc = 0.001 T = 0.010\n", " Site = 11 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 402 SPT = 0.9872 Tmvc = 0.001 T = 0.009\n", " Site = 12 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 306 SPT = 0.9883 Tmvc = 0.000 T = 0.012\n", " Site = 13 / 20 .. Mmpo = 100 DW = 0.00e+00 NNZ = 242 SPT = 0.9835 Tmvc = 0.000 T = 0.006\n", " Site = 14 / 20 .. Mmpo = 77 DW = 0.00e+00 NNZ = 150 SPT = 0.9805 Tmvc = 0.000 T = 0.006\n", " Site = 15 / 20 .. Mmpo = 54 DW = 0.00e+00 NNZ = 94 SPT = 0.9774 Tmvc = 0.000 T = 0.010\n", " Site = 16 / 20 .. Mmpo = 39 DW = 0.00e+00 NNZ = 82 SPT = 0.9611 Tmvc = 0.000 T = 0.003\n", " Site = 17 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 50 SPT = 0.9359 Tmvc = 0.000 T = 0.003\n", " Site = 18 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 20 SPT = 0.8571 Tmvc = 0.000 T = 0.003\n", " Site = 19 / 20 .. Mmpo = 1 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.000 T = 0.004\n", "Ttotal = 0.204 Tmvc-total = 0.014 MPO bond dimension = 178 MaxDW = 0.00e+00\n", "NNZ = 3934 SIZE = 200866 SPT = 0.9804\n", "\n", "Rank = 0 Ttotal = 0.341 MPO method = FastBipartite bond dimension = 178 NNZ = 3934 SIZE = 200866 SPT = 0.9804\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.578 | E = -107.6541216205 | DW = 7.62e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.716 | E = -107.6541223420 | DE = -7.21e-07 | DW = 6.45e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.877 | E = -107.6541224347 | DE = -9.27e-08 | DW = 7.64e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.516 | E = -107.6541224347 | DE = 9.38e-13 | DW = 6.15e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.397 | E = -107.6541224379 | DE = -3.17e-09 | DW = 6.46e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.224 | E = -107.6541224379 | DE = -3.38e-11 | DW = 7.42e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.123 | E = -107.6541224379 | DE = 0.00e+00 | DW = 6.46e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.919 | E = -107.6541224379 | DE = 6.82e-13 | DW = 7.25e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 8.532 | E = -107.6541224379 | DE = 0.00e+00 | DW = 6.05e-20\n", "\n", "DMRG energy = -107.654122437941069\n" ] } ], "source": [ "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "\n", "g2e = driver.unpack_g2e(g2e, n_sites=ncas)\n", "orb_sym = [orb_sym[i // 2] for i in range(len(orb_sym) * 2)]\n", "n_sites = ncas * 2\n", "\n", "driver.initialize_system(n_sites=n_sites, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "Tv12wxAZ-__F" }, "source": [ "## Read and Write FCIDUMP Files\n", "\n", "Instead of generating integrals (``h1e`` and ``g2e``) using ``pyscf``, we can also read these integrals from a FCIDUMP file (which can be generated using any of many other quantum chemistry packages) then perform DMRG. Additionally, we also provide methods to write the FCIDUMP file using the data in the ``h1e`` and ``g2e`` arrays.\n", "\n", "After invoking ``driver.read_fcidump``, the integrals and target state infomation can be obtained from ``driver.h1e``, ``driver.g2e``, ``driver.n_sites``, etc." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iPFRxRzO9MQe", "outputId": "07caadf9-72d4-42a6-ae30-7a3bf443b59b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "symmetrize error = 2.4200000000000016e-14\n", "integral symmetrize error = 0.0\n", "integral cutoff error = 0.0\n", "mpo terms = 1030\n", "\n", "Build MPO | Nsites = 10 | Nterms = 1030 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 13 DW = 0.00e+00 NNZ = 13 SPT = 0.0000 Tmvc = 0.001 T = 0.015\n", " Site = 1 / 10 .. Mmpo = 34 DW = 0.00e+00 NNZ = 63 SPT = 0.8575 Tmvc = 0.002 T = 0.008\n", " Site = 2 / 10 .. Mmpo = 56 DW = 0.00e+00 NNZ = 121 SPT = 0.9364 Tmvc = 0.001 T = 0.008\n", " Site = 3 / 10 .. Mmpo = 74 DW = 0.00e+00 NNZ = 373 SPT = 0.9100 Tmvc = 0.001 T = 0.008\n", " Site = 4 / 10 .. Mmpo = 80 DW = 0.00e+00 NNZ = 269 SPT = 0.9546 Tmvc = 0.004 T = 0.019\n", " Site = 5 / 10 .. Mmpo = 94 DW = 0.00e+00 NNZ = 169 SPT = 0.9775 Tmvc = 0.000 T = 0.005\n", " Site = 6 / 10 .. Mmpo = 54 DW = 0.00e+00 NNZ = 181 SPT = 0.9643 Tmvc = 0.000 T = 0.004\n", " Site = 7 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 73 SPT = 0.9549 Tmvc = 0.000 T = 0.003\n", " Site = 8 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 41 SPT = 0.9024 Tmvc = 0.000 T = 0.007\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.000 T = 0.002\n", "Ttotal = 0.079 Tmvc-total = 0.009 MPO bond dimension = 94 MaxDW = 0.00e+00\n", "NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Rank = 0 Ttotal = 0.140 MPO method = FastBipartite bond dimension = 94 NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.513 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.765 | E = -107.6541224475 | DE = -3.13e-12 | DW = 4.68e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.010 | E = -107.6541224475 | DE = 0.00e+00 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.246 | E = -107.6541224475 | DE = -5.97e-13 | DW = 6.02e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.513 | E = -107.6541224475 | DE = -5.68e-14 | DW = 1.68e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.770 | E = -107.6541224475 | DE = 8.53e-14 | DW = 4.69e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.045 | E = -107.6541224475 | DE = -2.84e-14 | DW = 2.14e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.294 | E = -107.6541224475 | DE = 0.00e+00 | DW = 4.87e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 2.472 | E = -107.6541224475 | DE = 2.84e-14 | DW = 4.03e-20\n", "\n", "DMRG energy = -107.654122447524557\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "\n", "# write integrals to file\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "driver.write_fcidump(h1e, g2e, ecore, filename='N2.STO3G.FCIDUMP', h1e_symm=True, pg='d2h')\n", "\n", "# read integrals from file\n", "driver.read_fcidump(filename='N2.STO3G.FCIDUMP', pg='d2h')\n", "driver.initialize_system(n_sites=driver.n_sites, n_elec=driver.n_elec,\n", " spin=driver.spin, orb_sym=driver.orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=driver.h1e, g2e=driver.g2e, ecore=driver.ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "-auHBxs_5KpK" }, "source": [ "## The ``SZ`` Mode\n", "\n", "Here we use ``get_uhf_integrals`` function to get the integrals." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dQ_84lHJ3Zbw", "outputId": "7edc3e62-5673-4787-ea49-1dd7941e1825" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 1.5510746027850855e-13\n", "integral cutoff error = 0.0\n", "mpo terms = 2778\n", "\n", "Build MPO | Nsites = 10 | Nterms = 2778 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 26 DW = 0.00e+00 NNZ = 26 SPT = 0.0000 Tmvc = 0.001 T = 0.014\n", " Site = 1 / 10 .. Mmpo = 66 DW = 0.00e+00 NNZ = 143 SPT = 0.9167 Tmvc = 0.001 T = 0.015\n", " Site = 2 / 10 .. Mmpo = 110 DW = 0.00e+00 NNZ = 283 SPT = 0.9610 Tmvc = 0.002 T = 0.013\n", " Site = 3 / 10 .. Mmpo = 138 DW = 0.00e+00 NNZ = 1023 SPT = 0.9326 Tmvc = 0.001 T = 0.011\n", " Site = 4 / 10 .. Mmpo = 158 DW = 0.00e+00 NNZ = 535 SPT = 0.9755 Tmvc = 0.001 T = 0.010\n", " Site = 5 / 10 .. Mmpo = 186 DW = 0.00e+00 NNZ = 463 SPT = 0.9842 Tmvc = 0.001 T = 0.008\n", " Site = 6 / 10 .. Mmpo = 106 DW = 0.00e+00 NNZ = 415 SPT = 0.9790 Tmvc = 0.000 T = 0.008\n", " Site = 7 / 10 .. Mmpo = 58 DW = 0.00e+00 NNZ = 163 SPT = 0.9735 Tmvc = 0.000 T = 0.006\n", " Site = 8 / 10 .. Mmpo = 26 DW = 0.00e+00 NNZ = 87 SPT = 0.9423 Tmvc = 0.000 T = 0.005\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 26 SPT = 0.0000 Tmvc = 0.000 T = 0.005\n", "Ttotal = 0.095 Tmvc-total = 0.007 MPO bond dimension = 186 MaxDW = 0.00e+00\n", "NNZ = 3164 SIZE = 102772 SPT = 0.9692\n", "\n", "Rank = 0 Ttotal = 0.170 MPO method = FastBipartite bond dimension = 186 NNZ = 3164 SIZE = 102772 SPT = 0.9692\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.401 | E = -107.6541224475 | DW = 4.14e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.190 | E = -107.6541224475 | DE = -1.80e-11 | DW = 5.07e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.846 | E = -107.6541224475 | DE = -1.11e-12 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.333 | E = -107.6541224475 | DE = 1.11e-12 | DW = 5.10e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.881 | E = -107.6541224475 | DE = -9.38e-13 | DW = 3.60e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.435 | E = -107.6541224475 | DE = 8.81e-13 | DW = 1.28e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.997 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.553 | E = -107.6541224475 | DE = -1.34e-12 | DW = 1.64e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 5.919 | E = -107.6541224475 | DE = -5.68e-14 | DW = 9.83e-20\n", "\n", "DMRG energy = -107.654122447524585\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.UHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_uhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "xBptlc0J5m7x" }, "source": [ "## The ``SGF`` Mode\n", "\n", "Here we use ``get_ghf_integrals`` function to get the integrals." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4aRS3PNz5iCK", "outputId": "2f508ebf-21f5-43af-ea51-3e2533b61ffa" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 2.2056297680002223e-13\n", "integral cutoff error = 0.0\n", "mpo terms = 5992\n", "\n", "Build MPO | Nsites = 20 | Nterms = 5992 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.001 T = 0.017\n", " Site = 1 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 19 SPT = 0.8643 Tmvc = 0.001 T = 0.014\n", " Site = 2 / 20 .. Mmpo = 47 DW = 0.00e+00 NNZ = 49 SPT = 0.9479 Tmvc = 0.002 T = 0.015\n", " Site = 3 / 20 .. Mmpo = 62 DW = 0.00e+00 NNZ = 251 SPT = 0.9139 Tmvc = 0.002 T = 0.011\n", " Site = 4 / 20 .. Mmpo = 81 DW = 0.00e+00 NNZ = 273 SPT = 0.9456 Tmvc = 0.003 T = 0.020\n", " Site = 5 / 20 .. Mmpo = 104 DW = 0.00e+00 NNZ = 357 SPT = 0.9576 Tmvc = 0.001 T = 0.013\n", " Site = 6 / 20 .. Mmpo = 129 DW = 0.00e+00 NNZ = 563 SPT = 0.9580 Tmvc = 0.002 T = 0.011\n", " Site = 7 / 20 .. Mmpo = 126 DW = 0.00e+00 NNZ = 2318 SPT = 0.8574 Tmvc = 0.003 T = 0.021\n", " Site = 8 / 20 .. Mmpo = 155 DW = 0.00e+00 NNZ = 212 SPT = 0.9891 Tmvc = 0.001 T = 0.008\n", " Site = 9 / 20 .. Mmpo = 148 DW = 0.00e+00 NNZ = 702 SPT = 0.9694 Tmvc = 0.001 T = 0.010\n", " Site = 10 / 20 .. Mmpo = 181 DW = 0.00e+00 NNZ = 396 SPT = 0.9852 Tmvc = 0.001 T = 0.009\n", " Site = 11 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 728 SPT = 0.9774 Tmvc = 0.001 T = 0.010\n", " Site = 12 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 496 SPT = 0.9810 Tmvc = 0.001 T = 0.008\n", " Site = 13 / 20 .. Mmpo = 100 DW = 0.00e+00 NNZ = 412 SPT = 0.9720 Tmvc = 0.000 T = 0.011\n", " Site = 14 / 20 .. Mmpo = 77 DW = 0.00e+00 NNZ = 254 SPT = 0.9670 Tmvc = 0.000 T = 0.005\n", " Site = 15 / 20 .. Mmpo = 54 DW = 0.00e+00 NNZ = 120 SPT = 0.9711 Tmvc = 0.000 T = 0.004\n", " Site = 16 / 20 .. Mmpo = 39 DW = 0.00e+00 NNZ = 124 SPT = 0.9411 Tmvc = 0.000 T = 0.005\n", " Site = 17 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 76 SPT = 0.9026 Tmvc = 0.000 T = 0.003\n", " Site = 18 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 22 SPT = 0.8429 Tmvc = 0.000 T = 0.002\n", " Site = 19 / 20 .. Mmpo = 1 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.000 T = 0.002\n", "Ttotal = 0.199 Tmvc-total = 0.021 MPO bond dimension = 181 MaxDW = 0.00e+00\n", "NNZ = 7386 SIZE = 204350 SPT = 0.9639\n", "\n", "Rank = 0 Ttotal = 0.296 MPO method = FastBipartite bond dimension = 181 NNZ = 7386 SIZE = 204350 SPT = 0.9639\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.091 | E = -107.6541220194 | DW = 8.01e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.230 | E = -107.6541223360 | DE = -3.17e-07 | DW = 7.44e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.557 | E = -107.6541224309 | DE = -9.49e-08 | DW = 8.01e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.886 | E = -107.6541224309 | DE = 1.79e-12 | DW = 6.88e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.128 | E = -107.6541224313 | DE = -3.64e-10 | DW = 8.01e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.178 | E = -107.6541224313 | DE = 1.31e-12 | DW = 5.93e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.296 | E = -107.6541224313 | DE = -5.68e-14 | DW = 8.01e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 9.355 | E = -107.6541224313 | DE = -2.30e-12 | DW = 8.16e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 10.016 | E = -107.6541224313 | DE = 2.84e-14 | DW = 8.22e-20\n", "\n", "DMRG energy = -107.654122431266515\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "R_uMrwZk_eY9" }, "source": [ "## The ``SGB`` Mode\n", "\n", "In this section, we try to solve the problem by first transfroming the model into a qubit (spin) model. The code will automatically use Jordan-Wigner transform to change the fermionic operators in the Hamiltonian into spin operators, before constructing the MPO.\n", "\n", "To use the ``SGB`` mode for ab initio systems, remember to add the ``heis_twos=1`` parameter (indicating the 1/2 spin at each site) in ``driver.initialize_system``." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4YxKU9N-_xom", "outputId": "3da21b0c-390f-4458-a176-4b8aaa7915fd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 2.03655637126935e-13\n", "integral cutoff error = 0.0\n", "mpo terms = 5906\n", "\n", "Build MPO | Nsites = 20 | Nterms = 5906 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.001 T = 0.009\n", " Site = 1 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 19 SPT = 0.8643 Tmvc = 0.001 T = 0.011\n", " Site = 2 / 20 .. Mmpo = 47 DW = 0.00e+00 NNZ = 49 SPT = 0.9479 Tmvc = 0.002 T = 0.012\n", " Site = 3 / 20 .. Mmpo = 62 DW = 0.00e+00 NNZ = 251 SPT = 0.9139 Tmvc = 0.002 T = 0.017\n", " Site = 4 / 20 .. Mmpo = 81 DW = 0.00e+00 NNZ = 273 SPT = 0.9456 Tmvc = 0.003 T = 0.018\n", " Site = 5 / 20 .. Mmpo = 104 DW = 0.00e+00 NNZ = 357 SPT = 0.9576 Tmvc = 0.002 T = 0.014\n", " Site = 6 / 20 .. Mmpo = 129 DW = 0.00e+00 NNZ = 563 SPT = 0.9580 Tmvc = 0.003 T = 0.017\n", " Site = 7 / 20 .. Mmpo = 126 DW = 0.00e+00 NNZ = 2318 SPT = 0.8574 Tmvc = 0.004 T = 0.019\n", " Site = 8 / 20 .. Mmpo = 155 DW = 0.00e+00 NNZ = 208 SPT = 0.9893 Tmvc = 0.001 T = 0.011\n", " Site = 9 / 20 .. Mmpo = 148 DW = 0.00e+00 NNZ = 684 SPT = 0.9702 Tmvc = 0.001 T = 0.012\n", " Site = 10 / 20 .. Mmpo = 181 DW = 0.00e+00 NNZ = 384 SPT = 0.9857 Tmvc = 0.001 T = 0.011\n", " Site = 11 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 718 SPT = 0.9777 Tmvc = 0.001 T = 0.009\n", " Site = 12 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 496 SPT = 0.9810 Tmvc = 0.001 T = 0.014\n", " Site = 13 / 20 .. Mmpo = 100 DW = 0.00e+00 NNZ = 412 SPT = 0.9720 Tmvc = 0.001 T = 0.010\n", " Site = 14 / 20 .. Mmpo = 77 DW = 0.00e+00 NNZ = 234 SPT = 0.9696 Tmvc = 0.000 T = 0.005\n", " Site = 15 / 20 .. Mmpo = 54 DW = 0.00e+00 NNZ = 118 SPT = 0.9716 Tmvc = 0.000 T = 0.006\n", " Site = 16 / 20 .. Mmpo = 39 DW = 0.00e+00 NNZ = 124 SPT = 0.9411 Tmvc = 0.000 T = 0.005\n", " Site = 17 / 20 .. Mmpo = 20 DW = 0.00e+00 NNZ = 76 SPT = 0.9026 Tmvc = 0.000 T = 0.006\n", " Site = 18 / 20 .. Mmpo = 7 DW = 0.00e+00 NNZ = 22 SPT = 0.8429 Tmvc = 0.000 T = 0.005\n", " Site = 19 / 20 .. Mmpo = 1 DW = 0.00e+00 NNZ = 7 SPT = 0.0000 Tmvc = 0.000 T = 0.005\n", "Ttotal = 0.214 Tmvc-total = 0.024 MPO bond dimension = 181 MaxDW = 0.00e+00\n", "NNZ = 7320 SIZE = 204350 SPT = 0.9642\n", "\n", "Rank = 0 Ttotal = 0.317 MPO method = FastBipartite bond dimension = 181 NNZ = 7320 SIZE = 204350 SPT = 0.9642\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.172 | E = -107.6541214496 | DW = 5.29e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.994 | E = -107.6541223419 | DE = -8.92e-07 | DW = 6.70e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.754 | E = -107.6541224354 | DE = -9.35e-08 | DW = 5.28e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.536 | E = -107.6541224354 | DE = -1.14e-13 | DW = 6.50e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.606 | E = -107.6541224379 | DE = -2.55e-09 | DW = 6.45e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.653 | E = -107.6541224379 | DE = 2.27e-13 | DW = 5.96e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.786 | E = -107.6541224379 | DE = 5.68e-14 | DW = 6.45e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.843 | E = -107.6541224379 | DE = 1.39e-12 | DW = 6.44e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 8.501 | E = -107.6541224379 | DE = -2.84e-14 | DW = 6.36e-20\n", "\n", "DMRG energy = -107.654122437938938\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGB, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym, heis_twos=1)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "yM7OGJQV556O" }, "source": [ "## Relativistic DMRG\n", "\n", "For relativistic DMRG, we use ``get_dhf_integrals`` function to get the integrals. We use the ``SGFCPX`` Mode in ``block2`` to execute DMRG. Note that the integrals, MPO, and MPS will all contain complex numbers in this mode.\n", "\n", "The ``symm_type`` parameter ``SymmetryTypes.SGFCPX`` can also be written as ``SymmetryTypes.SGF | SymmetryTypes.CPX``." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "16tFcwdw50gU", "outputId": "4146c5ab-33c7-4859-c5c5-3447a47ee300" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "integral symmetrize error = 0.0\n", "integral cutoff error = 0.0\n", "mpo terms = 44348\n", "\n", "Build MPO | Nsites = 20 | Nterms = 44348 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 20 .. Mmpo = 9 DW = 0.00e+00 NNZ = 9 SPT = 0.0000 Tmvc = 0.004 T = 0.017\n", " Site = 1 / 20 .. Mmpo = 28 DW = 0.00e+00 NNZ = 23 SPT = 0.9087 Tmvc = 0.005 T = 0.020\n", " Site = 2 / 20 .. Mmpo = 63 DW = 0.00e+00 NNZ = 404 SPT = 0.7710 Tmvc = 0.006 T = 0.029\n", " Site = 3 / 20 .. Mmpo = 78 DW = 0.00e+00 NNZ = 589 SPT = 0.8801 Tmvc = 0.007 T = 0.029\n", " Site = 4 / 20 .. Mmpo = 97 DW = 0.00e+00 NNZ = 933 SPT = 0.8767 Tmvc = 0.007 T = 0.030\n", " Site = 5 / 20 .. Mmpo = 120 DW = 0.00e+00 NNZ = 1315 SPT = 0.8870 Tmvc = 0.008 T = 0.032\n", " Site = 6 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 1722 SPT = 0.9024 Tmvc = 0.010 T = 0.038\n", " Site = 7 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 2141 SPT = 0.9182 Tmvc = 0.009 T = 0.034\n", " Site = 8 / 20 .. Mmpo = 213 DW = 0.00e+00 NNZ = 2577 SPT = 0.9320 Tmvc = 0.009 T = 0.037\n", " Site = 9 / 20 .. Mmpo = 252 DW = 0.00e+00 NNZ = 2967 SPT = 0.9447 Tmvc = 0.010 T = 0.040\n", " Site = 10 / 20 .. Mmpo = 213 DW = 0.00e+00 NNZ = 17974 SPT = 0.6651 Tmvc = 0.010 T = 0.056\n", " Site = 11 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 2599 SPT = 0.9315 Tmvc = 0.004 T = 0.023\n", " Site = 12 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 2195 SPT = 0.9161 Tmvc = 0.003 T = 0.021\n", " Site = 13 / 20 .. Mmpo = 120 DW = 0.00e+00 NNZ = 1787 SPT = 0.8987 Tmvc = 0.002 T = 0.017\n", " Site = 14 / 20 .. Mmpo = 97 DW = 0.00e+00 NNZ = 1403 SPT = 0.8795 Tmvc = 0.005 T = 0.021\n", " Site = 15 / 20 .. Mmpo = 78 DW = 0.00e+00 NNZ = 1013 SPT = 0.8661 Tmvc = 0.002 T = 0.014\n", " Site = 16 / 20 .. Mmpo = 63 DW = 0.00e+00 NNZ = 652 SPT = 0.8673 Tmvc = 0.001 T = 0.011\n", " Site = 17 / 20 .. Mmpo = 28 DW = 0.00e+00 NNZ = 496 SPT = 0.7188 Tmvc = 0.001 T = 0.012\n", " Site = 18 / 20 .. Mmpo = 9 DW = 0.00e+00 NNZ = 26 SPT = 0.8968 Tmvc = 0.000 T = 0.005\n", " Site = 19 / 20 .. Mmpo = 1 DW = 0.00e+00 NNZ = 9 SPT = 0.0000 Tmvc = 0.000 T = 0.003\n", "Ttotal = 0.488 Tmvc-total = 0.103 MPO bond dimension = 252 MaxDW = 0.00e+00\n", "NNZ = 40834 SIZE = 323082 SPT = 0.8736\n", "\n", "Rank = 0 Ttotal = 0.589 MPO method = FastBipartite bond dimension = 252 NNZ = 40834 SIZE = 323082 SPT = 0.8736\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 27.182 | E = -107.6929206708 | DW = 6.28e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 40.137 | E = -107.6929209452 | DE = -2.74e-07 | DW = 7.49e-10\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 51.567 | E = -107.6929209492 | DE = -3.94e-09 | DW = 2.15e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 60.941 | E = -107.6929209492 | DE = -5.40e-13 | DW = 7.52e-10\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 80.487 | E = -107.6929209492 | DE = -4.55e-13 | DW = 7.91e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 98.052 | E = -107.6929209492 | DE = -5.68e-14 | DW = 1.15e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 121.383 | E = -107.6929209492 | DE = 0.00e+00 | DW = 6.27e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 138.658 | E = -107.6929209492 | DE = -2.84e-14 | DW = 1.15e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 147.981 | E = -107.6929209492 | DE = 2.84e-14 | DW = 7.89e-20\n", "\n", "DMRG energy = -107.692920949170187\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.DHF(mol).set(with_gaunt=True, with_breit=True).run(conv_tol=1E-12)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_dhf_integrals(mf,\n", " ncore=0, ncas=None, pg_symm=False)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGFCPX, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "xZEMwvUYrfXT" }, "source": [ "## The ``LZ`` Mode\n", "\n", "For diatomic molecules, we can set symmetry ``dooh`` in ``pyscf``, and then use ``itg.lz_symm_adaptation`` to adapt the atomic orbitals for the ``LZ`` symmetry before running Hartree-Fock. Then we can use the ``LZ`` modes in ``block2`` to perform DMRG.\n", "\n", "The ``LZ`` mode can be combined with ``SU2``, ``SZ`` or ``SGF`` spin symmetries, and the ``SAny`` prefix in ``SymmetryTypes``. To activate the ``SAny`` prefix, the ``block2`` code needs to be compiled with the ``-DUSE_SANY=ON`` option (this option is ON by default in the ``pip`` precompiled binaries). Optionally, when ``-DUSE_SANY=ON``, one can also set ``-DUSE_SG=OFF -DUSE_SU2SZ=OFF`` to disable the normal ``SU2/SZ/SGF`` modes. One can use ``SymmetryTypes.SAnySU2/SymmetryTypes.SAnySZ/SymmetryTypes.SAnySGF`` instead for normal symmetries (with some limitations) when ``-DUSE_SG=OFF -DUSE_SU2SZ=OFF`` is used.\n", "\n", "With ``SU2`` (spin-adapted DMRG):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "r_QeMxLzvcD8", "outputId": "5020f2f3-ddf5-44cc-92a4-c09c9bf9bc54" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 0 0 0 -1 1 0 1 -1 0]\n", "integral symmetrize error = 2.0562981879479644e-15\n", "integral cutoff error = 6.776263578034403e-21\n", "mpo terms = 1882\n", "\n", "Build MPO | Nsites = 10 | Nterms = 1882 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.001 T = 0.036\n", " Site = 1 / 10 .. Mmpo = 34 DW = 0.00e+00 NNZ = 106 SPT = 0.7773 Tmvc = 0.001 T = 0.049\n", " Site = 2 / 10 .. Mmpo = 56 DW = 0.00e+00 NNZ = 189 SPT = 0.9007 Tmvc = 0.001 T = 0.054\n", " Site = 3 / 10 .. Mmpo = 66 DW = 0.00e+00 NNZ = 824 SPT = 0.7771 Tmvc = 0.001 T = 0.058\n", " Site = 4 / 10 .. Mmpo = 88 DW = 0.00e+00 NNZ = 154 SPT = 0.9735 Tmvc = 0.001 T = 0.035\n", " Site = 5 / 10 .. Mmpo = 94 DW = 0.00e+00 NNZ = 318 SPT = 0.9616 Tmvc = 0.000 T = 0.029\n", " Site = 6 / 10 .. Mmpo = 64 DW = 0.00e+00 NNZ = 237 SPT = 0.9606 Tmvc = 0.000 T = 0.024\n", " Site = 7 / 10 .. Mmpo = 40 DW = 0.00e+00 NNZ = 145 SPT = 0.9434 Tmvc = 0.000 T = 0.020\n", " Site = 8 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 49 SPT = 0.9125 Tmvc = 0.000 T = 0.010\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.000 T = 0.007\n", "Ttotal = 0.321 Tmvc-total = 0.005 MPO bond dimension = 94 MaxDW = 0.00e+00\n", "NNZ = 2050 SIZE = 29320 SPT = 0.9301\n", "\n", "Rank = 0 Ttotal = 0.379 MPO method = FastBipartite bond dimension = 94 NNZ = 2050 SIZE = 29320 SPT = 0.9301\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.704 | E = -107.6541224475 | DW = 2.06e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.071 | E = -107.6541224475 | DE = 1.19e-12 | DW = 3.19e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.438 | E = -107.6541224475 | DE = -2.84e-14 | DW = 2.06e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.808 | E = -107.6541224475 | DE = -8.64e-12 | DW = 3.50e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.291 | E = -107.6541224475 | DE = -2.84e-14 | DW = 5.14e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.713 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.17e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.196 | E = -107.6541224475 | DE = 2.84e-14 | DW = 5.84e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.622 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.86e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 3.889 | E = -107.6541224475 | DE = 2.84e-14 | DW = 1.94e-20\n", "\n", "DMRG energy = -107.654122447523761\n" ] } ], "source": [ "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"dooh\", verbose=0)\n", "mol.symm_orb, z_irrep, g_irrep = itg.lz_symm_adaptation(mol)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym_z = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=1, irrep_id=z_irrep)\n", "print(orb_sym_z)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SAnySU2LZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym_z, pg_irrep=0)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "s2TkncgDvl6v" }, "source": [ "With ``SZ`` (non-spin-adapted DMRG):" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wTX3hBE1vniu", "outputId": "12e3d421-1688-4fe7-d247-cf9a922a87c6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 0 0 0 -1 1 0 1 -1 0]\n", "integral symmetrize error = 8.030340066584701e-15\n", "integral cutoff error = 1.249373597200093e-20\n", "mpo terms = 5237\n", "\n", "Build MPO | Nsites = 10 | Nterms = 5237 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 30 SPT = 0.0000 Tmvc = 0.002 T = 0.077\n", " Site = 1 / 10 .. Mmpo = 66 DW = 0.00e+00 NNZ = 278 SPT = 0.8596 Tmvc = 0.001 T = 0.117\n", " Site = 2 / 10 .. Mmpo = 110 DW = 0.00e+00 NNZ = 478 SPT = 0.9342 Tmvc = 0.002 T = 0.126\n", " Site = 3 / 10 .. Mmpo = 123 DW = 0.00e+00 NNZ = 2285 SPT = 0.8311 Tmvc = 0.001 T = 0.131\n", " Site = 4 / 10 .. Mmpo = 170 DW = 0.00e+00 NNZ = 360 SPT = 0.9828 Tmvc = 0.001 T = 0.062\n", " Site = 5 / 10 .. Mmpo = 186 DW = 0.00e+00 NNZ = 814 SPT = 0.9743 Tmvc = 0.001 T = 0.065\n", " Site = 6 / 10 .. Mmpo = 126 DW = 0.00e+00 NNZ = 579 SPT = 0.9753 Tmvc = 0.001 T = 0.046\n", " Site = 7 / 10 .. Mmpo = 82 DW = 0.00e+00 NNZ = 264 SPT = 0.9744 Tmvc = 0.000 T = 0.025\n", " Site = 8 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 187 SPT = 0.9240 Tmvc = 0.000 T = 0.017\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 30 SPT = 0.0000 Tmvc = 0.000 T = 0.011\n", "Ttotal = 0.678 Tmvc-total = 0.009 MPO bond dimension = 186 MaxDW = 0.00e+00\n", "NNZ = 5305 SIZE = 111588 SPT = 0.9525\n", "\n", "Rank = 0 Ttotal = 0.740 MPO method = FastBipartite bond dimension = 186 NNZ = 5305 SIZE = 111588 SPT = 0.9525\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.233 | E = -107.6541224475 | DW = 3.06e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.979 | E = -107.6541224475 | DE = -1.18e-11 | DW = 3.32e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.687 | E = -107.6541224455 | DE = 2.05e-09 | DW = 3.06e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.429 | E = -107.6541224455 | DE = -3.41e-13 | DW = 3.27e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.297 | E = -107.6541224455 | DE = -1.14e-13 | DW = 3.09e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.229 | E = -107.6541224455 | DE = 1.14e-13 | DW = 1.40e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.354 | E = -107.6541224455 | DE = -2.84e-14 | DW = 3.09e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.963 | E = -107.6541224455 | DE = 1.71e-13 | DW = 1.58e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 9.102 | E = -107.6541224455 | DE = -2.84e-14 | DW = 1.23e-19\n", "\n", "DMRG energy = -107.654122445468445\n" ] } ], "source": [ "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"dooh\", verbose=0)\n", "mol.symm_orb, z_irrep, g_irrep = itg.lz_symm_adaptation(mol)\n", "mf = scf.UHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym_z = itg.get_uhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=1, irrep_id=z_irrep)\n", "print(orb_sym_z)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SAnySZLZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym_z, pg_irrep=0)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "Xvb_7dJKvwBo" }, "source": [ "With ``SGF`` (spin-orbital DMRG):" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "h-v3TPOjv0JX", "outputId": "e34634ce-5a43-4e43-9f45-6433b4e86e28" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 0 0 0 0 0 0 0 -1 -1 1 1 0 0 1 1 -1 -1 0 0]\n", "integral symmetrize error = 1.457638075028426e-14\n", "integral cutoff error = 6.527447649778452e-20\n", "mpo terms = 13645\n", "\n", "Build MPO | Nsites = 20 | Nterms = 13645 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 20 .. Mmpo = 9 DW = 0.00e+00 NNZ = 9 SPT = 0.0000 Tmvc = 0.002 T = 0.100\n", " Site = 1 / 20 .. Mmpo = 28 DW = 0.00e+00 NNZ = 23 SPT = 0.9087 Tmvc = 0.002 T = 0.171\n", " Site = 2 / 20 .. Mmpo = 47 DW = 0.00e+00 NNZ = 307 SPT = 0.7667 Tmvc = 0.003 T = 0.226\n", " Site = 3 / 20 .. Mmpo = 62 DW = 0.00e+00 NNZ = 358 SPT = 0.8771 Tmvc = 0.003 T = 0.276\n", " Site = 4 / 20 .. Mmpo = 81 DW = 0.00e+00 NNZ = 515 SPT = 0.8975 Tmvc = 0.003 T = 0.292\n", " Site = 5 / 20 .. Mmpo = 104 DW = 0.00e+00 NNZ = 667 SPT = 0.9208 Tmvc = 0.003 T = 0.305\n", " Site = 6 / 20 .. Mmpo = 131 DW = 0.00e+00 NNZ = 796 SPT = 0.9416 Tmvc = 0.003 T = 0.309\n", " Site = 7 / 20 .. Mmpo = 126 DW = 0.00e+00 NNZ = 5583 SPT = 0.6618 Tmvc = 0.003 T = 0.305\n", " Site = 8 / 20 .. Mmpo = 161 DW = 0.00e+00 NNZ = 266 SPT = 0.9869 Tmvc = 0.002 T = 0.142\n", " Site = 9 / 20 .. Mmpo = 168 DW = 0.00e+00 NNZ = 732 SPT = 0.9729 Tmvc = 0.002 T = 0.138\n", " Site = 10 / 20 .. Mmpo = 187 DW = 0.00e+00 NNZ = 1400 SPT = 0.9554 Tmvc = 0.002 T = 0.130\n", " Site = 11 / 20 .. Mmpo = 178 DW = 0.00e+00 NNZ = 964 SPT = 0.9710 Tmvc = 0.001 T = 0.110\n", " Site = 12 / 20 .. Mmpo = 147 DW = 0.00e+00 NNZ = 850 SPT = 0.9675 Tmvc = 0.001 T = 0.080\n", " Site = 13 / 20 .. Mmpo = 120 DW = 0.00e+00 NNZ = 667 SPT = 0.9622 Tmvc = 0.001 T = 0.066\n", " Site = 14 / 20 .. Mmpo = 97 DW = 0.00e+00 NNZ = 441 SPT = 0.9621 Tmvc = 0.001 T = 0.041\n", " Site = 15 / 20 .. Mmpo = 78 DW = 0.00e+00 NNZ = 300 SPT = 0.9603 Tmvc = 0.000 T = 0.031\n", " Site = 16 / 20 .. Mmpo = 57 DW = 0.00e+00 NNZ = 417 SPT = 0.9062 Tmvc = 0.000 T = 0.025\n", " Site = 17 / 20 .. Mmpo = 28 DW = 0.00e+00 NNZ = 84 SPT = 0.9474 Tmvc = 0.000 T = 0.009\n", " Site = 18 / 20 .. Mmpo = 9 DW = 0.00e+00 NNZ = 28 SPT = 0.8889 Tmvc = 0.000 T = 0.007\n", " Site = 19 / 20 .. Mmpo = 1 DW = 0.00e+00 NNZ = 9 SPT = 0.0000 Tmvc = 0.000 T = 0.004\n", "Ttotal = 2.767 Tmvc-total = 0.032 MPO bond dimension = 187 MaxDW = 0.00e+00\n", "NNZ = 14416 SIZE = 229418 SPT = 0.9372\n", "\n", "Rank = 0 Ttotal = 2.864 MPO method = FastBipartite bond dimension = 187 NNZ = 14416 SIZE = 229418 SPT = 0.9372\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.314 | E = -107.6541218464 | DW = 1.76e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.490 | E = -107.6541222920 | DE = -4.46e-07 | DW = 5.23e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.869 | E = -107.6541224411 | DE = -1.49e-07 | DW = 1.75e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.083 | E = -107.6541224411 | DE = -5.34e-12 | DW = 5.24e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.880 | E = -107.6541224448 | DE = -3.71e-09 | DW = 9.90e-12\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 10.506 | E = -107.6541224455 | DE = -6.31e-10 | DW = 5.25e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 12.313 | E = -107.6541224455 | DE = -2.84e-14 | DW = 9.88e-12\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 13.931 | E = -107.6541224455 | DE = 8.53e-14 | DW = 5.12e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 14.954 | E = -107.6541224455 | DE = 0.00e+00 | DW = 8.00e-20\n", "\n", "DMRG energy = -107.654122445469611\n" ] } ], "source": [ "from pyscf.scf.ghf_symm import GHF\n", "from pyscf import symm, lib\n", "from pyscf.scf import hf_symm\n", "import scipy.linalg\n", "import numpy as np\n", "\n", "# fix pyscf 2.3.0 bug in ghf_symm for complex orbtials\n", "def ghf_eig(self, h, s, symm_orb=None, irrep_id=None):\n", " if symm_orb is None or irrep_id is None:\n", " mol = self.mol\n", " symm_orb = mol.symm_orb\n", " irrep_id = mol.irrep_id\n", " nirrep = len(symm_orb)\n", " symm_orb = [scipy.linalg.block_diag(c, c) for c in symm_orb]\n", " h = symm.symmetrize_matrix(h, symm_orb)\n", " s = symm.symmetrize_matrix(s, symm_orb)\n", " cs = []\n", " es = []\n", " orbsym = []\n", " for ir in range(nirrep):\n", " e, c = self._eigh(h[ir], s[ir])\n", " cs.append(c)\n", " es.append(e)\n", " orbsym.append([irrep_id[ir]] * e.size)\n", " e = np.hstack(es)\n", " c = hf_symm.so2ao_mo_coeff(symm_orb, cs)\n", " c = lib.tag_array(c, orbsym=np.hstack(orbsym))\n", " return e, c\n", "\n", "GHF.eig = ghf_eig\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"dooh\", verbose=0)\n", "mol.symm_orb, z_irrep, g_irrep = itg.lz_symm_adaptation(mol)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym_z = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=1, irrep_id=z_irrep)\n", "print(orb_sym_z)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SAnySGFLZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym_z, pg_irrep=0)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=1)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "r8wd-wIq7pKV" }, "source": [ "## Expectation and N-Particle Density Matrices" ] }, { "cell_type": "markdown", "metadata": { "id": "Q2jepYQu7vOW" }, "source": [ "Once the optimized MPS is obtained, we can compute the expectation value on it, including its norm, the energy expectation, $\\langle S^2 \\rangle$, N-particle density matrix, or any operator that can be constructed as an MPO.\n", "\n", "In this example, we compute the triplet state." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sYihDUiI6mTn", "outputId": "ac8d2203-f9c8-4206-ba88-5d0f2090b4c2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.580 | E = -106.9391328597 | DW = 3.38e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.880 | E = -106.9391328597 | DE = -3.04e-12 | DW = 9.74e-19\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.193 | E = -106.9391328597 | DE = -5.68e-14 | DW = 3.38e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.481 | E = -106.9391328597 | DE = 2.56e-13 | DW = 1.53e-18\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.833 | E = -106.9391328597 | DE = 5.68e-14 | DW = 1.12e-16\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.168 | E = -106.9391328597 | DE = -1.42e-13 | DW = 1.35e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.507 | E = -106.9391328597 | DE = 2.84e-14 | DW = 1.12e-16\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.825 | E = -106.9391328597 | DE = 1.14e-13 | DW = 1.38e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 3.045 | E = -106.9391328597 | DE = 0.00e+00 | DW = 2.47e-20\n", "\n", "DMRG energy = -106.939132859666600\n", "Norm^2 = 1.000000000000000\n", "Energy expectation = -106.939132859666586\n", " expectation = 2.000000000000001\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "spin = 2\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "impo = driver.get_identity_mpo()\n", "\n", "normsq = driver.expectation(ket, impo, ket)\n", "ener = driver.expectation(ket, mpo, ket)\n", "\n", "print('Norm^2 = %20.15f' % normsq)\n", "print('Energy expectation = %20.15f' % (ener / normsq))\n", "\n", "# [ in spin-adapted mode this is always S(S+1) ]\n", "ssq_mpo = driver.get_spin_square_mpo(iprint=0)\n", "ssq = driver.expectation(ket, ssq_mpo, ket)\n", "print(' expectation = %20.15f' % (ssq / normsq))" ] }, { "cell_type": "markdown", "metadata": { "id": "5uw83pUS9hkY" }, "source": [ "We can also evaluate expectation of arbitray operator such as the occupancy in the first orbital\n", "\n", "$$\n", "\\hat{N}_0 = a^\\dagger_{0\\alpha} a_{0\\alpha} + a^\\dagger_{0\\beta} a_{0\\beta}\n", "= \\sqrt{2} \\big(a_0^\\dagger\\big)^{[1/2]} \\otimes_{[0]} \\big(a_0\\big)^{[1/2]}\n", "$$" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gRqEzZnK8d8h", "outputId": "89fdac56-6751-4a4e-e2a8-f998ecf83816" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "N0 expectation = 1.999995824361892\n" ] } ], "source": [ "b = driver.expr_builder()\n", "b.add_term(\"(C+D)0\", [0, 0], np.sqrt(2))\n", "n_mpo = driver.get_mpo(b.finalize(), iprint=0)\n", "\n", "n_0 = driver.expectation(ket, n_mpo, ket)\n", "print('N0 expectation = %20.15f' % (n_0 / normsq))" ] }, { "cell_type": "markdown", "metadata": { "id": "axO7Quw3-L9v" }, "source": [ "We can then verify this number using 1PDM:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "AiPieq3Z-JrA", "outputId": "b1b2ec20-55ca-49ed-9120-a4f8a5068754" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "N0 expectation from 1pdm = 1.999995824361891\n" ] } ], "source": [ "pdm1 = driver.get_1pdm(ket)\n", "print('N0 expectation from 1pdm = %20.15f' % pdm1[0, 0])" ] }, { "cell_type": "markdown", "metadata": { "id": "xdFhzPE7-rb6" }, "source": [ "We can compute the 3PDM and compare the result with the FCI 3PDM. Note that in ``pyscf`` the 3PDM is defined as\n", "\n", "$$\n", "\\mathrm{DM}_{ijklmn} := \\langle E_{ij} E_{kl} E_{mn} \\rangle\n", "$$\n", "\n", "So we have to use the same convention in ``block2`` by setting the ``npdm_expr`` parameter in ``block2`` to ``((C+D)0+((C+D)0+(C+D)0)0)0``.\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NIxjfBJP-byp", "outputId": "b8a96317-7daa-450d-bf20-b704395c7218" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-106.93913286 -106.85412245 -106.70055113]\n", "diff = 5.3418848100122e-06\n" ] } ], "source": [ "pdm3_b2 = driver.get_3pdm(ket, iprint=0, npdm_expr=\"((C+D)0+((C+D)0+(C+D)0)0)0\")\n", "\n", "from pyscf import fci\n", "\n", "mx = fci.addons.fix_spin_(fci.FCI(mf), ss=2)\n", "mx.kernel(h1e, g2e, ncas, nelec=n_elec, nroots=3, tol=1E-12)\n", "print(mx.e_tot)\n", "pdm3_fci = fci.rdm.make_dm123('FCI3pdm_kern_sf', mx.ci[0], mx.ci[0], ncas, n_elec)[2]\n", "\n", "print('diff = ', np.linalg.norm(pdm3_fci - pdm3_b2))" ] }, { "cell_type": "markdown", "metadata": { "id": "j5ywJ3n9xaQx" }, "source": [ "## Extract CSF and Determinant Coefficients\n", "\n", "We can extract CSF (or determinant) coefficients from the spin-adapted MPS (or the non-spin-adapted MPS). The algorithm can compute all CSF or determinant with the absolute value of the coefficient above a threshold (called ``cutoff``). The square of coefficient is the probability (weight) of the CSF or determinant.\n", "\n", "Extracting CSF coefficients from spin-adapted MPS in the ``SU2`` mode:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wlUvVFbTxUxt", "outputId": "a4bb9211-5774-46ce-ac74-189e245e2f7f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.497 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.747 | E = -107.6541224475 | DE = -3.33e-12 | DW = 4.05e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.990 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.224 | E = -107.6541224475 | DE = -4.83e-13 | DW = 5.95e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.498 | E = -107.6541224475 | DE = 0.00e+00 | DW = 2.70e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.755 | E = -107.6541224475 | DE = 0.00e+00 | DW = 6.84e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.121 | E = -107.6541224475 | DE = -2.84e-14 | DW = 2.50e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.617 | E = -107.6541224475 | DE = 2.84e-14 | DW = 6.27e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 2.911 | E = -107.6541224475 | DE = 2.84e-14 | DW = 3.40e-20\n", "\n", "DMRG energy = -107.654122447524642\n", "mps center changed (temporarily)\n", "dtrie finished 0.004684378000092693\n", "Number of CSF = 9 (cutoff = 0.05)\n", "Sum of weights of included CSF = 0.984368811359562\n", "\n", "CSF 0 2222222000 = 0.957506528669410\n", "CSF 1 2222202200 = -0.131287867807398\n", "CSF 2 2222022020 = -0.131287794595548\n", "CSF 3 2222+-2+-0 = 0.118594301088579\n", "CSF 4 2222++2--0 = -0.084968224982026\n", "CSF 5 2220222020 = -0.054710635444609\n", "CSF 6 2220222200 = -0.054710465272209\n", "CSF 7 2222+2+0-- = 0.053881241407867\n", "CSF 8 22222++-0- = 0.053881215166800\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "csfs, coeffs = driver.get_csf_coefficients(ket, cutoff=0.05, iprint=1)" ] }, { "cell_type": "markdown", "metadata": { "id": "Xo2eVRUfy7xE" }, "source": [ "Extracting determinant coefficients from non-spin-adapted MPS in the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JEGGNKwBy0Rj", "outputId": "5195ebc6-a414-4181-b2bb-682a56944d13" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.826 | E = -107.6541224475 | DW = 4.14e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.306 | E = -107.6541224475 | DE = -1.90e-12 | DW = 5.67e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.783 | E = -107.6541224475 | DE = -1.42e-12 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.259 | E = -107.6541224475 | DE = 1.42e-12 | DW = 5.13e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.822 | E = -107.6541224475 | DE = 2.07e-12 | DW = 3.60e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.380 | E = -107.6541224475 | DE = -3.24e-12 | DW = 1.71e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.960 | E = -107.6541224475 | DE = -2.84e-14 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.519 | E = -107.6541224475 | DE = 8.81e-13 | DW = 1.76e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 4.910 | E = -107.6541224475 | DE = -2.84e-14 | DW = 7.05e-20\n", "\n", "DMRG energy = -107.654122447523420\n", "mps center changed (temporarily)\n", "dtrie finished 0.0024573000000600587\n", "Number of DET = 7 (cutoff = 0.05)\n", "Sum of weights of included DET = 0.971331592192659\n", "\n", "DET 0 2222222000 = -0.957506477722952\n", "DET 1 2222202200 = 0.131287949363695\n", "DET 2 2222022020 = 0.131287934434239\n", "DET 3 2222ab2ab0 = -0.083825435733035\n", "DET 4 2222ba2ba0 = -0.083825435117335\n", "DET 5 2220222020 = 0.054710529942414\n", "DET 6 2220222200 = 0.054710516357351\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.UHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_uhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "csfs, coeffs = driver.get_csf_coefficients(ket, cutoff=0.05, iprint=1)" ] }, { "cell_type": "markdown", "metadata": { "id": "NhiNjmry-D8D" }, "source": [ "## Construct MPS from CSFs or Determinants\n", "\n", "If we know important CSFs or determinants in the state and their coefficients, we can also use this information to construct MPS, and this can be used as an initial guess and further optimized. Note that this initial guess can generate very good initial energies, but if the given CSFs have many common doubly occupied and empty orbitals, the MPS will very likely optimize to a local minima.\n", "\n", "In the ``SU2`` mode:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Xu_MA3r3Mb5g", "outputId": "9080d91e-9bb5-4f03-f29b-edc91aefdd74" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.517 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.760 | E = -107.6541224475 | DE = -1.25e-11 | DW = 5.82e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.007 | E = -107.6541224475 | DE = 2.84e-14 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.256 | E = -107.6541224475 | DE = -1.39e-12 | DW = 4.80e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.533 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.06e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.779 | E = -107.6541224475 | DE = 0.00e+00 | DW = 5.63e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.052 | E = -107.6541224475 | DE = 5.68e-14 | DW = 4.42e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.328 | E = -107.6541224475 | DE = -5.68e-14 | DW = 5.11e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 2.508 | E = -107.6541224475 | DE = 2.84e-14 | DW = 5.29e-20\n", "\n", "DMRG energy = -107.654122447524387\n", "mps center changed (temporarily)\n", "dtrie finished 0.0019679109999515276\n", "Number of CSF = 9 (cutoff = 0.05)\n", "Sum of weights of included CSF = 0.984368809657108\n", "\n", "CSF 0 2222222000 = 0.957506521875156\n", "CSF 1 2222202200 = -0.131287813613838\n", "CSF 2 2222022020 = -0.131287676854108\n", "CSF 3 2222+-2+-0 = 0.118594392287611\n", "CSF 4 2222++2--0 = -0.084968279487238\n", "CSF 5 2220222020 = -0.054710673444325\n", "CSF 6 2220222200 = -0.054710596031564\n", "CSF 7 2222+2+0-- = 0.053881289057961\n", "CSF 8 22222++-0- = 0.053881233355426\n", "0.9843688096571082\n", "-107.61553663531718\n", "\n", "Sweep = 0 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.052 | E = -107.6285064669 | DW = 6.01e-21\n", "\n", "Sweep = 1 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.102 | E = -107.6288048128 | DE = -2.98e-04 | DW = 1.43e-21\n", "\n", "Sweep = 2 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.155 | E = -107.6289019710 | DE = -9.72e-05 | DW = 1.63e-21\n", "\n", "Sweep = 3 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.206 | E = -107.6289019713 | DE = -3.35e-10 | DW = 1.14e-20\n", "\n", "Ground state energy = -107.628901971339630\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "csfs, coeffs = driver.get_csf_coefficients(ket, cutoff=0.05, iprint=1)\n", "\n", "mps = driver.get_mps_from_csf_coefficients(csfs, coeffs, tag=\"CMPS\", dot=2)\n", "impo = driver.get_identity_mpo()\n", "print(driver.expectation(mps, impo, mps))\n", "print(driver.expectation(mps, mpo, mps) / driver.expectation(mps, impo, mps))\n", "\n", "energy = driver.dmrg(mpo, mps, n_sweeps=5, bond_dims=[500] * 5, noises=[1E-5],\n", " thrds=[1E-10] * 5, iprint=1)\n", "print('Ground state energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "zCHMLB2kOGOY" }, "source": [ "In the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "MGIr2B15OHoq", "outputId": "1b8cb402-d760-4203-e705-37c0ef2b0ca9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.819 | E = -107.6541224475 | DW = 4.14e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.305 | E = -107.6541224475 | DE = -5.66e-12 | DW = 5.12e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.770 | E = -107.6541224475 | DE = -6.25e-13 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.241 | E = -107.6541224475 | DE = 1.14e-12 | DW = 4.98e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.812 | E = -107.6541224475 | DE = -1.14e-12 | DW = 3.60e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.601 | E = -107.6541224475 | DE = 8.53e-13 | DW = 1.77e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.558 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.488 | E = -107.6541224475 | DE = -1.14e-12 | DW = 1.67e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 6.143 | E = -107.6541224475 | DE = -2.84e-14 | DW = 4.96e-20\n", "\n", "DMRG energy = -107.654122447524500\n", "mps center changed (temporarily)\n", "dtrie finished 0.004142805999890697\n", "Number of DET = 7 (cutoff = 0.05)\n", "Sum of weights of included DET = 0.971331639061928\n", "\n", "DET 0 2222222000 = -0.957506569121758\n", "DET 1 2222022020 = 0.131287834673405\n", "DET 2 2222202200 = 0.131287815095743\n", "DET 3 2222ba2ba0 = -0.083825277849152\n", "DET 4 2222ab2ab0 = -0.083825277218030\n", "DET 5 2220222200 = 0.054710476468495\n", "DET 6 2220222020 = 0.054710443995518\n", "0.9713316390619284\n", "-107.5944732555996\n", "\n", "Sweep = 0 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.090 | E = -107.6101011814 | DW = 8.24e-21\n", "\n", "Sweep = 1 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.185 | E = -107.6102811404 | DE = -1.80e-04 | DW = 1.03e-20\n", "\n", "Sweep = 2 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.282 | E = -107.6104759466 | DE = -1.95e-04 | DW = 1.28e-20\n", "\n", "Sweep = 3 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.375 | E = -107.6104759470 | DE = -4.56e-10 | DW = 1.14e-20\n", "\n", "Ground state energy = -107.610475947023915\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.UHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_uhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "dets, coeffs = driver.get_csf_coefficients(ket, cutoff=0.05, iprint=1)\n", "\n", "mps = driver.get_mps_from_csf_coefficients(dets, coeffs, tag=\"CMPS\", dot=2)\n", "impo = driver.get_identity_mpo()\n", "print(driver.expectation(mps, impo, mps))\n", "print(driver.expectation(mps, mpo, mps) / driver.expectation(mps, impo, mps))\n", "\n", "energy = driver.dmrg(mpo, mps, n_sweeps=5, bond_dims=[500] * 5, noises=[1E-5],\n", " thrds=[1E-10] * 5, iprint=1)\n", "print('Ground state energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "lKczQwpW-KzH" }, "source": [ "## MPS Initial Guess from Occupancies\n", "\n", "We can also construct the MPS using an estimate of the occupancy information at each site from a cheaper method (such as CCSD). We can use this information to construct the initial quantum number distribution in the MPS.\n", "\n", "Note that this initial guess can generate very good energies in the first few sweeps, but if the given occupancies have many doubly occupied and empty orbitals, the MPS will very likely optimize to a local minima. One can shift the occupancies into the equal probability occupancies (for example, setting ``bias=0.4`` in the example below) to randomize the initial guess.\n", "\n", "In the ``SU2`` mode:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "89CYdAQERbng", "outputId": "ae078bed-8222-4eb1-c3a8-eab887798bd1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.053 | E = -107.5033999317 | DW = 2.74e-21\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.107 | E = -107.5830578672 | DE = -7.97e-02 | DW = 5.53e-21\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.175 | E = -107.5836402840 | DE = -5.82e-04 | DW = 1.44e-20\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.238 | E = -107.5867932582 | DE = -3.15e-03 | DW = 3.21e-21\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.292 | E = -107.5868061724 | DE = -1.29e-05 | DW = 1.17e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.355 | E = -107.5868152464 | DE = -9.07e-06 | DW = 9.11e-21\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.412 | E = -107.5868152464 | DE = 0.00e+00 | DW = 1.51e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.466 | E = -107.5868152464 | DE = 0.00e+00 | DW = 1.40e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 0.521 | E = -107.5868152464 | DE = 0.00e+00 | DW = 2.11e-20\n", "\n", "DMRG energy = -107.586815246376730\n" ] } ], "source": [ "from pyscf import gto, scf, cc\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "bias = 0.1 # make it more random\n", "occs = np.diag(cc.CCSD(mf).run().make_rdm1())\n", "occs = occs + bias * (occs < 1) - bias * (occs > 1)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, occs=occs, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "MBBhzM1DRlEC" }, "source": [ "In the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EFggxZINRmky", "outputId": "b33d097e-685e-4c45-a57d-82d9e06b4458" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.060 | E = -107.5033999316 | DW = 1.96e-21\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.131 | E = -107.5830508082 | DE = -7.97e-02 | DW = 5.41e-21\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.204 | E = -107.5836402367 | DE = -5.89e-04 | DW = 3.59e-21\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.294 | E = -107.5867932578 | DE = -3.15e-03 | DW = 1.80e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.382 | E = -107.5868061676 | DE = -1.29e-05 | DW = 1.53e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.469 | E = -107.5868152464 | DE = -9.08e-06 | DW = 1.02e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.557 | E = -107.5868152464 | DE = 0.00e+00 | DW = 1.19e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.641 | E = -107.5868152464 | DE = 0.00e+00 | DW = 1.39e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 0.717 | E = -107.5868152464 | DE = 2.84e-14 | DW = 1.67e-20\n", "\n", "DMRG energy = -107.586815246376702\n" ] } ], "source": [ "from pyscf import gto, scf, cc\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.UHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_uhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "bias = 0.1 # make it more random\n", "occs = np.diag(np.sum(cc.UCCSD(mf).run().make_rdm1(), axis=0))\n", "occs = occs + bias * (occs < 1) - bias * (occs > 1)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, occs=occs, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "QEmsn2bvSDPv" }, "source": [ "In the ``SGF`` mode:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5ov6ybDJSEqY", "outputId": "ea9c4e62-849a-4122-dcc9-29787678aa77" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.097 | E = -107.6538892686 | DW = 2.59e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.444 | E = -107.6539226748 | DE = -3.34e-05 | DW = 9.28e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.623 | E = -107.6539461908 | DE = -2.35e-05 | DW = 5.62e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.728 | E = -107.6539506829 | DE = -4.49e-06 | DW = 1.96e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.627 | E = -107.6539506829 | DE = 3.07e-12 | DW = 2.73e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.502 | E = -107.6539506829 | DE = 7.39e-13 | DW = 4.70e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.419 | E = -107.6539506829 | DE = 0.00e+00 | DW = 2.73e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.281 | E = -107.6539506829 | DE = -3.84e-12 | DW = 4.67e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 8.825 | E = -107.6539506829 | DE = -2.84e-14 | DW = 5.57e-20\n", "\n", "DMRG energy = -107.653950682886418\n" ] } ], "source": [ "from pyscf import gto, scf, cc\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "bias = 0.25 # make it more random\n", "occs = np.sum(cc.GCCSD(mf).run().make_rdm1(), axis=0)\n", "occs = occs + bias * (occs < 0.5) - bias * (occs > 0.5)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, occs=occs, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "pHzJ0eA09yM3" }, "source": [ "## Change from SU2 MPS to SZ MPS\n", "\n", "We can also transform the spin-adapted MPS generated in the ``SU2`` mode to the non-spin-adapted MPS, which can be used in the ``SZ`` mode. After obtaining the non-spin-adapted MPS, one need to redo ``driver.initialize_system``, ``driver.get_qc_mpo``, etc. to make sure every object is now represented in the ``SZ`` mode, then you can operate on the ``SZ`` non-spin-adapted MPS.\n", "\n", "In the following example, we first compute the spin-adapted MPS, then translate it into the non-spin-adapted MPS to extract the determinant coefficients.\n", "\n", "As the transform from SU2 format to SZ format is only implemented for left canonicalized MPS, we need to add a line ``driver.align_mps_center(ket, ref=0)`` to change its canonical center to zero (if it is not zero) before translating an MPS from SU2 format to SZ format.\n", "\n", "For a non-singlet SU2 MPS (not the case in the example below), as it can have multiple SZ components, we need to specify a specific SZ component. This is done via the ``sz`` argument of ``driver.mps_change_to_sz``. When we extract only a component of the non-singlet SU2 MPS, the norm of the extracted MPS will be smaller than the norm of the original SU2 MPS. Therefore, one may explicitly compute the ``norm**2`` of the translated MPS (using ``driver.expectation(zket, driver.get_identity_mpo(), zket)``), and the computed PDM quantities should be scaled by ``1 / norm**2``. Quantities like orbital entropies have to be computed after the MPS is normalized. MPSs can be normalized using ``zket.iscale(1 / norm)``." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "bshiEyU9TIcg", "outputId": "3001adef-3168-4989-a799-d2e5cbe23190" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.499 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.747 | E = -107.6541224475 | DE = -4.09e-12 | DW = 5.36e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.058 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.439 | E = -107.6541224475 | DE = -5.97e-13 | DW = 6.52e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.891 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.75e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.294 | E = -107.6541224475 | DE = -2.84e-14 | DW = 4.50e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.744 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.05e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.162 | E = -107.6541224475 | DE = 2.84e-14 | DW = 4.93e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 3.455 | E = -107.6541224475 | DE = 0.00e+00 | DW = 2.44e-20\n", "\n", "DMRG energy = -107.654122447524585\n", "mps center changed (temporarily)\n", "dtrie finished 0.002923151000004509\n", "Number of CSF = 9 (cutoff = 0.05)\n", "Sum of weights of included CSF = 0.984368801370672\n", "\n", "CSF 0 2222222000 = -0.957506527302991\n", "CSF 1 2222202200 = 0.131287890948123\n", "CSF 2 2222022020 = 0.131287890439278\n", "CSF 3 2222+-2+-0 = -0.118594401232681\n", "CSF 4 2222++2--0 = 0.084968039984560\n", "CSF 5 2220222020 = 0.054710469983632\n", "CSF 6 2220222200 = 0.054710326229694\n", "CSF 7 2222+2+0-- = -0.053881243065345\n", "CSF 8 22222++-0- = -0.053881235680181\n", "-107.65412244752449\n", "mps center changed (temporarily)\n", "dtrie finished 0.004040642000063599\n", "Number of DET = 7 (cutoff = 0.05)\n", "Sum of weights of included DET = 0.971331607927357\n", "\n", "DET 0 2222222000 = -0.957506527302991\n", "DET 1 2222202200 = 0.131287890948123\n", "DET 2 2222022020 = 0.131287890439278\n", "DET 3 2222ba2ba0 = -0.083825360995141\n", "DET 4 2222ab2ab0 = -0.083825360995141\n", "DET 5 2220222020 = 0.054710469983632\n", "DET 6 2220222200 = 0.054710326229694\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "driver.align_mps_center(ket, ref=0)\n", "csfs, coeffs = driver.get_csf_coefficients(ket, cutoff=0.05, iprint=1)\n", "zket = driver.mps_change_to_sz(ket, \"ZKET\")\n", "\n", "driver.symm_type = SymmetryTypes.SZ\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "impo = driver.get_identity_mpo()\n", "print(driver.expectation(zket, mpo, zket) / driver.expectation(zket, impo, zket))\n", "csfs, vals = driver.get_csf_coefficients(zket, cutoff=0.05, iprint=1)" ] }, { "cell_type": "markdown", "metadata": { "id": "DI9giYpoVAl4" }, "source": [ "## Change between Real and Complex MPS\n", "\n", "We can also change between the MPS with complex numbers and the MPS with real numbers. For complex MPS to real MPS, the imaginary part will be discarded (and the norm of the transformed MPS may decrease). This may be useful when you do a ground state calculation in the real domain and then do the real time evolution in the complex domain.\n", "\n", "From real to complex:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "POXO7BS5TjuT", "outputId": "97643c4b-b560-466e-d6a9-90b182c9ed0b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.521 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.758 | E = -107.6541224475 | DE = -1.76e-12 | DW = 6.23e-20\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.002 | E = -107.6541224475 | DE = 0.00e+00 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.260 | E = -107.6541224475 | DE = -2.84e-13 | DW = 5.93e-20\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.552 | E = -107.6541224475 | DE = 0.00e+00 | DW = 1.65e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.792 | E = -107.6541224475 | DE = 0.00e+00 | DW = 5.19e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.053 | E = -107.6541224475 | DE = 0.00e+00 | DW = 2.83e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.301 | E = -107.6541224475 | DE = 5.68e-14 | DW = 6.71e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 2.491 | E = -107.6541224475 | DE = 0.00e+00 | DW = 2.80e-20\n", "\n", "DMRG energy = -107.654122447524671\n", "1.0\n", "-107.65412244752463\n", "integral symmetrize error = 1.758383454541612e-14\n", "integral cutoff error = 0.0\n", "mpo terms = 1030\n", "\n", "Build MPO | Nsites = 10 | Nterms = 1030 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 13 DW = 0.00e+00 NNZ = 13 SPT = 0.0000 Tmvc = 0.000 T = 0.006\n", " Site = 1 / 10 .. Mmpo = 34 DW = 0.00e+00 NNZ = 63 SPT = 0.8575 Tmvc = 0.001 T = 0.006\n", " Site = 2 / 10 .. Mmpo = 56 DW = 0.00e+00 NNZ = 121 SPT = 0.9364 Tmvc = 0.001 T = 0.005\n", " Site = 3 / 10 .. Mmpo = 74 DW = 0.00e+00 NNZ = 373 SPT = 0.9100 Tmvc = 0.001 T = 0.006\n", " Site = 4 / 10 .. Mmpo = 80 DW = 0.00e+00 NNZ = 269 SPT = 0.9546 Tmvc = 0.000 T = 0.005\n", " Site = 5 / 10 .. Mmpo = 94 DW = 0.00e+00 NNZ = 169 SPT = 0.9775 Tmvc = 0.000 T = 0.004\n", " Site = 6 / 10 .. Mmpo = 54 DW = 0.00e+00 NNZ = 181 SPT = 0.9643 Tmvc = 0.000 T = 0.004\n", " Site = 7 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 73 SPT = 0.9549 Tmvc = 0.000 T = 0.003\n", " Site = 8 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 41 SPT = 0.9024 Tmvc = 0.000 T = 0.002\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.000 T = 0.003\n", "Ttotal = 0.044 Tmvc-total = 0.003 MPO bond dimension = 94 MaxDW = 0.00e+00\n", "NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Rank = 0 Ttotal = 0.081 MPO method = FastBipartite bond dimension = 94 NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "(0.9999999999999999+0j)\n", "(-107.65412244752464+0j)\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "impo = driver.get_identity_mpo()\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "print(driver.expectation(ket, impo, ket))\n", "print(driver.expectation(ket, mpo, ket) / driver.expectation(ket, impo, ket))\n", "zket = driver.mps_change_complex(ket, \"ZKET\")\n", "\n", "driver.symm_type = driver.symm_type ^ SymmetryTypes.CPX\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "impo = driver.get_identity_mpo()\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, integral_cutoff=1E-8, iprint=1)\n", "print(driver.expectation(zket, impo, zket))\n", "print(driver.expectation(zket, mpo, zket) / driver.expectation(zket, impo, zket))" ] }, { "cell_type": "markdown", "metadata": { "id": "8lXIUcWqUYvQ" }, "source": [ "From complex to real:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "J5F8UhOzUaoQ", "outputId": "6794f74d-f267-4414-8f73-715da0abf5e7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.593 | E = -107.6541224475 | DW = 1.87e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.095 | E = -107.6541224475 | DE = -7.25e-12 | DW = 1.53e-19\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.625 | E = -107.6541224475 | DE = -5.68e-14 | DW = 1.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.922 | E = -107.6541224475 | DE = -1.22e-12 | DW = 1.47e-19\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.467 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.49e-19\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.856 | E = -107.6541224475 | DE = 5.68e-14 | DW = 5.30e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.193 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.30e-19\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.511 | E = -107.6541224475 | DE = 0.00e+00 | DW = 6.00e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 3.733 | E = -107.6541224475 | DE = 2.84e-14 | DW = 3.78e-20\n", "\n", "DMRG energy = -107.654122447524557\n", "(1+3.326128828347501e-17j)\n", "(-107.65412244752451+5.487212746008987e-15j)\n", "integral symmetrize error = 1.9716021141012156e-14\n", "integral cutoff error = 0.0\n", "mpo terms = 1030\n", "\n", "Build MPO | Nsites = 10 | Nterms = 1030 | Algorithm = FastBIP | Cutoff = 1.00e-20\n", " Site = 0 / 10 .. Mmpo = 13 DW = 0.00e+00 NNZ = 13 SPT = 0.0000 Tmvc = 0.000 T = 0.006\n", " Site = 1 / 10 .. Mmpo = 34 DW = 0.00e+00 NNZ = 63 SPT = 0.8575 Tmvc = 0.000 T = 0.011\n", " Site = 2 / 10 .. Mmpo = 56 DW = 0.00e+00 NNZ = 121 SPT = 0.9364 Tmvc = 0.001 T = 0.005\n", " Site = 3 / 10 .. Mmpo = 74 DW = 0.00e+00 NNZ = 373 SPT = 0.9100 Tmvc = 0.000 T = 0.005\n", " Site = 4 / 10 .. Mmpo = 80 DW = 0.00e+00 NNZ = 269 SPT = 0.9546 Tmvc = 0.000 T = 0.005\n", " Site = 5 / 10 .. Mmpo = 94 DW = 0.00e+00 NNZ = 169 SPT = 0.9775 Tmvc = 0.000 T = 0.004\n", " Site = 6 / 10 .. Mmpo = 54 DW = 0.00e+00 NNZ = 181 SPT = 0.9643 Tmvc = 0.000 T = 0.004\n", " Site = 7 / 10 .. Mmpo = 30 DW = 0.00e+00 NNZ = 73 SPT = 0.9549 Tmvc = 0.000 T = 0.003\n", " Site = 8 / 10 .. Mmpo = 14 DW = 0.00e+00 NNZ = 41 SPT = 0.9024 Tmvc = 0.000 T = 0.003\n", " Site = 9 / 10 .. Mmpo = 1 DW = 0.00e+00 NNZ = 14 SPT = 0.0000 Tmvc = 0.000 T = 0.002\n", "Ttotal = 0.047 Tmvc-total = 0.003 MPO bond dimension = 94 MaxDW = 0.00e+00\n", "NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "\n", "Rank = 0 Ttotal = 0.079 MPO method = FastBipartite bond dimension = 94 NNZ = 1317 SIZE = 27073 SPT = 0.9514\n", "0.8950611475659227\n", "-107.6541224475247\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SU2 | SymmetryTypes.CPX, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "impo = driver.get_identity_mpo()\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "print(driver.expectation(ket, impo, ket))\n", "print(driver.expectation(ket, mpo, ket) / driver.expectation(ket, impo, ket))\n", "rket = driver.mps_change_complex(ket, \"rket\")\n", "\n", "driver.symm_type = driver.symm_type ^ SymmetryTypes.CPX\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "impo = driver.get_identity_mpo()\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, integral_cutoff=1E-8, iprint=1)\n", "print(driver.expectation(rket, impo, rket))\n", "print(driver.expectation(rket, mpo, rket) / driver.expectation(rket, impo, rket))" ] }, { "cell_type": "markdown", "metadata": { "id": "HL8LI5zk0B4V" }, "source": [ "## MPS Bipartite Entanglement\n", "\n", "We can get the the bipartite entanglement $S_k=-\\sum_i \\Lambda_k^2 \\log \\Lambda_k^2$ at each virtual bond (at site $k$) in MPS in the ``SZ``/``SGF`` mode, where $\\Lambda_k$ are singular values in the bond at site $k$.\n", "\n", "In the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sk-lJfw0zBlV", "outputId": "f15dc699-6618-4d3a-d754-f10bfc5b56fd" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.789 | E = -107.6541224475 | DW = 4.15e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.279 | E = -107.6541224475 | DE = -4.43e-12 | DW = 5.20e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.734 | E = -107.6541224475 | DE = 1.51e-12 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.209 | E = -107.6541224475 | DE = -1.62e-12 | DW = 5.14e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.793 | E = -107.6541224475 | DE = -1.25e-12 | DW = 3.60e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.342 | E = -107.6541224475 | DE = 9.95e-13 | DW = 2.04e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.991 | E = -107.6541224475 | DE = 2.84e-14 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.931 | E = -107.6541224475 | DE = -1.14e-12 | DW = 1.69e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 5.595 | E = -107.6541224475 | DE = 5.68e-14 | DW = 7.96e-20\n", "\n", "DMRG energy = -107.654122447524585\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "bip_ent_sz = driver.get_bipartite_entanglement()" ] }, { "cell_type": "markdown", "metadata": { "id": "Pmefdp7-3mKl" }, "source": [ "In the ``SGF`` mode:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Mz5J9KZa3o8I", "outputId": "e4a63eab-b8d5-468c-9f83-210cb34637ac" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.182 | E = -107.6541211614 | DW = 8.43e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.011 | E = -107.6541223352 | DE = -1.17e-06 | DW = 7.39e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.806 | E = -107.6541224309 | DE = -9.56e-08 | DW = 8.43e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.602 | E = -107.6541224309 | DE = 3.58e-12 | DW = 6.84e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.655 | E = -107.6541224313 | DE = -4.10e-10 | DW = 8.63e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.697 | E = -107.6541224313 | DE = 1.90e-12 | DW = 8.46e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.823 | E = -107.6541224313 | DE = 8.53e-14 | DW = 8.62e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.152 | E = -107.6541224313 | DE = -2.73e-12 | DW = 7.37e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 9.272 | E = -107.6541224313 | DE = 0.00e+00 | DW = 7.39e-20\n", "\n", "DMRG energy = -107.654122431266543\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "bip_ent_sgf = driver.get_bipartite_entanglement()" ] }, { "cell_type": "markdown", "metadata": { "id": "zh6BePFj3xs2" }, "source": [ "We can then plot the bipartite entanglement in MPS with spatial orbital (``SZ``) and spin orbital (``SGF``) sites:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 665 }, "id": "4wybUNot3_td", "outputId": "3fdb7dc8-e791-4aee-87f6-f12bd5778101" }, "outputs": [ { "data": { "image/png": "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2n19ffHggw9i/fr1+Pvf/44ffvgBtrY1l+n1119HTk4OZsyYYZBwtVUTZ98rdQj1WGJMgGXGZYkxEREREbVXVpFYAcDbb7+NvXv34tixYwgLC8OQIUOQnp6OkydPwtPTE6tWrTLYPjc3FwkJCbh6tX5J7M8//xwnTpzAzz//jG7duqF///44f/48zp07h7CwMHz66afmellERERERNQGWE1ipVKpcODAAXzwwQfYsGEDNm/eDDc3N8ycORMLFiy46YS/DfHw8MCpU6cwb948bN68GZs2bYK3tzdefPFFvPfee3B1dW29F9LKVEoVdq/cZ9BWWlmCmKxzSM+/jEpNJezkdgh064wov54GXdpUSpXZYmrOvq2F14qIiIiImkomhBBSB9Ee1ZZbv1k5diIiIiIiMh9jv59bRVVAIiIiIiIiKTGxIiIiIiIiMhITKyIiIiIiIiMxsSIiIiIiIjISEysiIiIiIiIjMbEiIiIiIiIyEhMrIiIiIiIiIzGxIiIiIiIiMhITKyIiIiIiIiMxsSIiIiIiIjISEysiIiIiIiIjMbEiIiIiIiIyEhMrIiIiIiIiIzGxIiIiIiIiMhITKyIiIiIiIiPJhBBC6iDaI2dnZ1RVVSEkJETqUIiIiIiI2r3k5GQoFAoUFxe3aH8+sZKIo6MjFAqF1GEYSE5ORnJystRhtCu85ubHa25+vObmx2tufrzm5sdrbn7Wfs0VCgUcHR1bvD+fWJFOREQEAOD8+fMSR9J+8JqbH6+5+fGamx+vufnxmpsfr7n58ZrfGp9YERERERERGYmJFRERERERkZGYWBERERERERmJiRUREREREZGRmFgREREREREZiVUBiYiIiIiIjMQnVkREREREREZiYkVERERERGQkJlZERERERERGYmJFRERERERkJCZWRERERERERmJiRUREREREZCQmVkREREREREZiYmXFysvL8c4776Br165QqVTo1KkTZs2ahaysrGYfq6CgAC+99BICAwOhVCoRGBiIOXPm4MaNG6YPvA0qKyvD5s2b8cQTTyA8PBwqlQqOjo6IjIzE/PnzUVJS0qzjdenSBTKZ7Kb/Ll682EqvpG256667bnmddu7c2azj8T6/tYMHD97yetf+mz9/fpOOx/u8zunTp/Hhhx9i6tSp8Pf3112DxqxZswa33XYbnJyc4ObmhnHjxuHY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Nzc3cdddd4kVK1bUe0LTXl24cEE899xzom/fvsLT01PY2toKFxcXMXDgQLF48eIGy6zzPjeNiooK3VQCsbGxt9yW93nTrF69utH3j9WrVze4X79+/YSDg4NwdXUVY8aMEUePHm3wHAcOHBAARGBgYIPrq6urxeLFi0VERIRQqVTC3d1dTJ8+XZw/f96Er9RyNOea11675v43utk1z8rKEnPmzBEDBw4UPj4+QqFQCCcnJ9G3b1/x7rvvivz8fPNcBDNrzjUvKioSb7zxhhg2bJjw8/MTSqVSODg4iIiICPHKK6+IzMzMBs/B+9xQS99barsbL1mypNFz8D6vIxNCCNOkaERERERERO0TqwISEREREREZiYkVERERERGRkZhYERERERERGYmJFRERERERkZGYWBERERERERmJiRUREREREZGRmFgREREREREZiYkVERERERGRkZhYERERERERGYmJFRERERERkZGYWBERERERERmJiRUREUlKJpOhS5cuUodhtjjmzZsHmUyGNWvWtPq5mmvPnj2QyWR4+umnpQ6FiKjNYWJFREQWJy0tDTKZDHfddZfUobQrZ86cAQD069dP4kiIiNoeW6kDICKi9i0+Ph4KhULqMCwmDilFR0cDYGJFRNQSTKyIiEhS3bp1kzoEAJYTh5TOnDkDhUKBXr16SR0KEVGbw66ARETUKs6dO4dHHnkEwcHBUKlU8PT0RFRUFObMmYOrV6/qtvvr2KZ58+YhKCgIAHDo0CHIZDLdv5kzZxqc4/Lly3j++ecREhIClUoFNzc33HvvvTh27Fiz421ojJV+l8Ty8nK8+eabCAwMhFKpRGhoKP71r39BCNHg8bZu3YpBgwbBwcEB7u7umDZtGhITE28ZQ3Nez9/+9jfIZDK8/vrr9dYlJibCyckJTk5OuHTpUpNef0lJCS5duoSePXtCqVQarPvxxx/h5OQEHx8fHDlypEnHIyJqb5hYERGRyZ0+fRoDBgzA+vXr4ezsjEmTJmHgwIGoqqrCkiVLkJCQcNN9o6KiMG3aNACAt7c3ZsyYoft355136rY7fvw4IiMjsWzZMigUCowfPx49e/bErl27MHToUPz4448mez2VlZUYPXo0VqxYgf79+2P48OHIysrCm2++iblz59bbfvny5Zg0aRJOnjyJAQMGYNSoUTh9+jRuu+02JCcnN3iO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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(np.arange(len(bip_ent_sz)) * 2, bip_ent_sz, linestyle='-', marker='o',\n", " mfc='white', mec=\"#7FB685\", color=\"#7FB685\", label='SZ')\n", "plt.plot(np.arange(len(bip_ent_sgf)), bip_ent_sgf, linestyle='-', marker='s',\n", " mfc='white', mec=\"#3C5B39\", color=\"#3C5B39\", label='SGF')\n", "plt.xlim((-1, ncas - 1))\n", "plt.legend(loc='upper left')\n", "plt.xlabel(\"site index $k$\")\n", "plt.ylabel(\"bipartite entanglement $S_k$\")\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "G31uZ79j2jgo" }, "source": [ "## Orbital Entropy and Mutual Information\n", "\n", "For the optimized MPS in the ``SZ``/``SGF`` mode, we can compute the 1- and 2- orbital density matrices and mutual information for pairs of orbitals.\n", "\n", "In the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "I9tuVN4o2auM", "outputId": "47f6d3ca-a31a-4056-875b-5aaaafd4cc25" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.404 | E = -107.6541224475 | DW = 4.14e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.188 | E = -107.6541224475 | DE = -1.58e-11 | DW = 5.10e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.906 | E = -107.6541224475 | DE = -9.66e-13 | DW = 4.14e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.666 | E = -107.6541224475 | DE = 1.48e-12 | DW = 5.15e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.563 | E = -107.6541224475 | DE = -7.11e-13 | DW = 3.61e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.463 | E = -107.6541224475 | DE = 9.09e-13 | DW = 1.59e-19\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.332 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.60e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.195 | E = -107.6541224475 | DE = -1.68e-12 | DW = 1.90e-19\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 7.761 | E = -107.6541224475 | DE = 0.00e+00 | DW = 6.47e-20\n", "\n", "DMRG energy = -107.654122447524557\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAJ1CAYAAACcrFeBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABcSAAAXEgFnn9JSAAAhsElEQVR4nO3de5CV9X348c8GltuKIAJjGIOUFYlsBgppbSLZwfpLIpnREBxDBuMMoAENOk3GYv5Ibby106mwsU7CBGoU6XDRNhdNmMRpLQZtEOQyhBa8pAtCxHSWAJGLy3I7vz90aY2LInsOz4fD6zXDDPN8d5/vRw+XN8855zk1pVKpFAAApPChogcAAOB/iTMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJz9gdbW1vjWt74Vl1xySfTo0SMGDRoUN954Y+zYsaPo0TiBN998M5544om46aabYvjw4dGjR4+oq6uLUaNGxb333hv79+8vekQ+gF27dsXAgQOjpqYmLr744qLH4STt3LkzZs2aFcOHD4+ePXtGv379YsyYMXHHHXcUPRrvY82aNTFp0qQYNGhQ1NbWRt++faOxsTEWLFgQpVKp6PHOSjUl/+ePO3jwYPz5n/95rFq1Kj784Q9HY2NjvPrqq/HCCy/EgAEDYtWqVTF06NCix+QPfP/734/p06dHRMSll14aH/vYx2Lv3r2xcuXK2LdvX3z0ox+NFStWxMCBAwuelJMxderU+Kd/+qcolUpRX18f//3f/130SLyPdevWxVVXXRW7du2KhoaG478HN2/eHK+99locOXKk6BE5gR/+8IfxpS99KY4ePRpjxoyJiy++OHbu3BnPPfdcHDlyJK6//vpYvHhx0WOefUoc91d/9VeliCh98pOfLO3bt+/48aamplJElMaNG1fccJzQo48+WpoxY0Zp8+bN7zj++uuvl0aPHl2KiNLkyZMLmo4P4umnny5FRGnGjBmliCjV19cXPRLvo6WlpdS/f/9Sr169Sk8++eS71levXl3AVJyMw4cPlwYOHFiKiNLixYvfsbZ58+ZSv379ShFRWr58eUETnr3E2dva2tpKffr0KUVEaf369e9aHzlyZCkiSmvXri1gOk7VypUrSxFR6t69e6mtra3ocXgPb775Zqm+vr40YsSI0iuvvCLOzhBf/epXSxFRmjt3btGj8AH953/+ZykiSsOHD+9w/S/+4i9KEVH6+7//+9M8GV5z9rZf/vKX8cYbb0R9fX2MHj36XevXXXddRET89Kc/Pd2j0QmjRo2KiIi2trbYtWtXwdPwXu65557YsmVLzJs3L2pra4seh5PQ2toaixYtirq6upg2bVrR4/ABde/e/aS+7vzzz6/wJPwhcfa2X/3qVxERMWbMmA7X249v3LjxtM1E523ZsiUiImpra6Nfv34FT8OJbNy4MZqammLatGnR2NhY9DicpLVr18a+ffti9OjR0bNnz/j5z38et99+e8ycOTP+4R/+IV5//fWiR+Q9DB06NOrr6+Pll1+OJUuWvGPtxRdfjEWLFsV5550XEydOLGjCs1fXogfIYvv27RERceGFF3a43n5827Ztp20mOu/BBx+MiIjx48ef9L8SOb2OHTsWX/nKV6Jv375x//33Fz0OH8DmzZsjImLgwIHxhS98IZ588sl3rH/zm9+Mhx9+OCZPnlzEeLyPLl26xMKFC+Pqq6+OL3/5y9HU1BTDhg2LlpaWeO6552LEiBHx6KOP+odtAVw5e1v77RZ69erV4XpdXV1EROzbt++0zUTn/OxnP4uHH344amtr47777it6HE7gO9/5TqxZsyZmz57t6ZMzzJ49eyIi4ic/+Uk89dRTMXfu3GhpaYlXX301Zs2aFa2trTFlypTYsGFDsYNyQmPHjo0VK1bE0KFDY/369fH444/HM888Ex/60IfiM5/5jDsUFEScUZVeeumluOGGG6JUKsXs2bOPv/aMXLZv3x533nlnjBs3LqZOnVr0OHxAx44di4iII0eOxL333hszZ86MAQMGxEUXXRSzZ8+OL37xi3H48OGYPXt2wZNyIkuXLo3LLrssPvKRj8Tq1atj//798corr8TUqVOjqakprrzyymhrayt6zLOOOHvbOeecExFv3dC0IwcOHIiIiN69e5+2mTg1O3bsiPHjx8eePXvi9ttvj6997WtFj8QJ3HrrrXHo0KGYN29e0aNwCtr/3IyIDt8Q0H5sxYoVp20mTt6vf/3rmDJlSvTv3z+WLVsWl112WdTV1cWwYcNi/vz5cfXVV8f69evjkUceKXrUs47XnL1t8ODBERHx2muvdbjefvyiiy46bTPxwe3evTs++9nPxrZt22LatGkxZ86cokfiPSxbtiz69u0bt9xyyzuOHzx4MCLeCu0rrrgiIiIee+yxuOCCC073iLyH9j8Pe/XqFQMGDHjX+pAhQyIioqWl5XSOxUl67LHH4vDhwzF+/Ph3hHa7SZMmxbJly+LZZ5+Nr371qwVMePYSZ29rf9pr/fr1Ha63Hx85cuRpm4kPZv/+/fG5z30uNm/eHNdee2089NBDUVNTU/RYvI/f//73J7yycvDgweNr7cFGHu23HWptbY22trZ3velm9+7dEREd/sVP8dovOvTp06fD9fbj7a8t5PTxtObbxo4dG3369Inm5uYOX7z6gx/8ICIirrnmmtM8GSejra0tJkyYEC+88EJcddVVsXTp0ujSpUvRY/E+Sm/dCPtdP7Zu3RoREfX19cePtV+FIY/BgwfHqFGjolQqdRjY7cc6unckxWu/Er127doO19esWRMR4fdeAcTZ27p16xa33XZbRLz1Opj215hFRHz729+OjRs3xrhx4+LjH/94USNyAkePHo3JkyfH8uXLo7GxMX70ox9Ft27dih4Lzgrf+MY3IiJi1qxZ8dvf/vb48Q0bNkRTU1NExLuetiaHCRMmRETEs88+G9/73vfesbZq1ap44IEHIuJ/b8LO6eODz/+PgwcPxhVXXBGrV68+/sHn27Zti9WrV/vg88QefPDB+PrXvx4RERMnToxzzz23w6+bM2dO9O/f/zROxql69dVX44/+6I988PkZYurUqbFw4cLo27dvXH755dHa2horV66Mtra2mD59evzjP/5j0SNyAnfcccfx1+Y2NDTEiBEj4vXXX4/nn38+jh07FjNmzIj58+cXPOXZR5z9gdbW1vi7v/u7WLJkSfzmN7+Jfv36xfjx4+O+++474Q1qKdbdd98d99xzz/t+3datW12eP0OIszNLqVSK73//+zF//vx48cUXo6amJkaOHBk333xzTJkypejxeB8//vGPY968ebFu3bp44403onfv3vHHf/zHMX36dDcQLog4AwBIxGvOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImIsxNoaGiIhoaGosfgFHjszmwevzObx+/M5bHLQ5wBACQizgAAEhFnAACJiDMAgETEGQBAIjWlUqlU9BAn44ILLogDBw7E4MGDT8t+zc3NERFRX19/WvajfDx2ZzaP35nN43fm8tiV1/bt26Ouri7+53/+5wN/7xkTZ717947Dhw/7RQMApNfc3By1tbWxb9++D/y9XSswT0W0XzHbtGlTwZMAALy3ztwzzmvOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImULc5aW1vjW9/6VlxyySXRo0ePGDRoUNx4442xY8eOcm0BAFD1yhJnBw8ejCuvvDLuu+++2L9/f0yYMCE+8pGPxIIFC2L06NGxZcuWcmwDAFD1yhJnf/M3fxOrVq2KT37yk/HKK6/E448/HqtXr46mpqbYuXNn3HjjjeXYBgCg6nU6zg4dOhTf/e53IyJi7ty5cc455xxfu/3222PkyJGxYsWKWLduXWe3AgCoep2Os1/+8pfxxhtvRH19fYwePfpd69ddd11ERPz0pz/t7FYAAFWv03H2q1/9KiIixowZ0+F6+/GNGzd2disAgKrX6Tjbvn17RERceOGFHa63H9+2bVtntwIAqHpdO3uC/fv3R0REr169Olyvq6uLiIh9+/ad1PkaGho6PN7c3Bz19fWnMCEAwJnDTWgBABLp9JWz9ndnvvnmmx2uHzhwICIievfufVLn27RpU4fHT3RFDQCgmnT6ytngwYMjIuK1117rcL39+EUXXdTZrQAAql6n42zUqFEREbF+/foO19uPjxw5srNbAQBUvU7H2dixY6NPnz7R3NwcGzZseNf6D37wg4iIuOaaazq7FQBA1et0nHXr1i1uu+22iIi49dZbj7/GLCLi29/+dmzcuDHGjRsXH//4xzu7FQBA1ev0GwIiIu688854+umnY+XKlTFs2LBobGyMbdu2xerVq2PAgAHxyCOPlGMbAICqV5ZbafTo0SOeeeaZ+Ou//uvo1atXPPHEE7Ft27aYOnVqrF+/PoYOHVqObQAAql5NqVQqFT3EyWi/lcaJbrUBAJBFZ7rFTWgBABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiXQtegCoBkePlYoeoaJ2tR4qegQ6oUtNTdEjQIeWb20peoSK2dt2JM7tfmqZ5coZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEikLHH25ptvxhNPPBE33XRTDB8+PHr06BF1dXUxatSouPfee2P//v3l2AYAoOqVJc6WLFkSEydOjEceeSS6dOkSn//856OxsTG2bt0ad911V/zpn/5ptLS0lGMrAICqVpY4q62tjRkzZsTmzZtj8+bN8c///M/x1FNPxcsvvxyjR4+Ol156Kb7+9a+XYysAgKpWUyqVSpXc4Pnnn4/LL788unfvHnv37o1u3bqd0nkaGhoiImLTpk3lHA/K4uixiv42Ktyu1kNFj0AndKmpKXoE6NDyrdX7rNrtE/5fnNu96yl1S8XfEDBq1KiIiGhra4tdu3ZVejsAgDNaxeNsy5YtEfHWU5/9+vWr9HYAAGe0rpXe4MEHH4yIiPHjx0f37t3f9+vbn778Q83NzVFfX1/W2QAAsqnolbOf/exn8fDDD0dtbW3cd999ldwKAKAqVOzK2UsvvRQ33HBDlEqlmD179vHXnr2fE71w7kRX1AAAqklFrpzt2LEjxo8fH3v27Inbb789vva1r1ViGwCAqlP2ONu9e3d89rOfjW3btsW0adNizpw55d4CAKBqlTXO9u/fH5/73Odi8+bNce2118ZDDz0UNe6vAwBw0soWZ21tbTFhwoR44YUX4qqrroqlS5dGly5dynV6AICzQlni7OjRozF58uRYvnx5NDY2xo9+9KNT/iQAAICzWVnerfnd7343fvzjH0dERP/+/WPmzJkdft2cOXOif//+5dgSAKAqlSXO9uzZc/zn7ZHWkbvvvlucAQC8h7I8rXn33XdHqVR63x9Dhgwpx3YAAFWr4p+tCQDAyRNnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJdC16AM4eR4+Vih6hYrp8qKboESqqWxf/jjuTda3yX5/P/2ZX0SNwiq6+5MNFj1Axd3U79cTyJy4AQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiXQtegDOHrtaDxU9QsV061Ld/87p26O26BEq6opHf1H0CBW16No/K3qEirp/5ctFj1AxTzePK3qEivqvmW8UPULFHDp2LLqf4t8N1f03CgDAGUacAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiVQkznbt2hUDBw6MmpqauPjiiyuxBQBAVapInP3lX/5l/O53v6vEqQEAqlrZ4+zf//3fY+HChTF9+vRynxoAoOqVNc5aW1vj5ptvjhEjRsSsWbPKeWoAgLNC13Ke7J577oktW7bEihUrora2tpynBgA4K5TtytnGjRujqakppk2bFo2NjeU6LQDAWaUsV86OHTsWX/nKV6Jv375x//33d+pcDQ0NHR5vbm6O+vr6Tp0bACC7ssTZd77znVizZk0sWLAgzj///HKcEgDgrNTpONu+fXvceeedMW7cuJg6dWqnB9q0aVOHx090RQ0AoJp0+jVnt956axw6dCjmzZtXjnkAAM5qnb5ytmzZsujbt2/ccsst7zh+8ODBiIjYsWNHXHHFFRER8dhjj8UFF1zQ2S0BAKpWWV5z9vvf/z5WrFjR4drBgwePr7UHGwAAHev005qlUqnDH1u3bo2IiPr6+uPHhgwZ0tntAACqWkU+WxMAgFMjzgAAEhFnAACJlPWzNf+vIUOGRKlUqtTpAQCqkitnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgES6Fj0AkN8Vj/6i6BEq6hdTryh6hIp6bW9r0SNU1NPN44oeoWI+Xb+i6BEogCtnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACTStegBOHt0qakpeoSK6fqh6v1vi4hYdO2fFT1CRb22t7XoESrqwnN7Fj1CRb14296iR+AUzVvbXPQIFbOn9VBccE6PU/peV84AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBEyhpnO3fujFmzZsXw4cOjZ8+e0a9fvxgzZkzccccd5dwGAKBqlS3O1q1bF5deemk0NTVFbW1tTJgwIT7xiU/E7t2744EHHijXNgAAVa1rOU6yc+fOGD9+fLS2tsaTTz4Zn//859+x/sILL5RjGwCAqleWOLvrrrvid7/7XcydO/ddYRYRcdlll5VjGwCAqtfppzVbW1tj0aJFUVdXF9OmTSvHTAAAZ61OXzlbu3Zt7Nu3Lz71qU9Fz5494+c//3n827/9Wxw8eDAuueSSmDRpUgwaNKgcswIAVL1Ox9nmzZsjImLgwIHxhS98IZ588sl3rH/zm9+Mhx9+OCZPnnxS52toaOjweHNzc9TX13duWACA5Dr9tOaePXsiIuInP/lJPPXUUzF37txoaWmJV199NWbNmhWtra0xZcqU2LBhQ2e3AgCoep2+cnbs2LGIiDhy5Ej87d/+bcycOfP42uzZs2Pbtm3xL//yLzF79uxYvHjx+55v06ZNHR4/0RU1AIBq0ukrZ+ecc87xn3f0hoD2YytWrOjsVgAAVa/TcXbRRRdFRESvXr1iwIAB71ofMmRIRES0tLR0disAgKrX6TgbPXp0RLx1S422trZ3re/evTsi3nmFDQCAjnU6zgYPHhyjRo2KUqnU4VOX7cfaIw4AgBMry2drfuMb34iIiFmzZsVvf/vb48c3bNgQTU1NERFxyy23lGMrAICqVpaPb7r++uvjX//1X2PhwoUxYsSIuPzyy6O1tTVWrlwZbW1tMX369PjiF79Yjq0AAKpaWeIsImLBggUxduzYmD9/fvziF7+ImpqaGDNmTNx8880xZcqUcm0DAFDVyhZnNTU1MX369Jg+fXq5TgkAcNYpy2vOAAAoD3EGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJBI16IHgGrw/G92FT1CRd2/8uWiR6iop5vHFT1CRb14296iR6ioj/bvXfQIFXP5w8uLHqGiHrrmT4oeoWKW9ex2yt/ryhkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiXQtegAgv6ebxxU9QkV9un5F0SPQCZc/vLzoESpm5U1XFj1CRW1q2Vv0CCm5cgYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEilrnK1ZsyYmTZoUgwYNitra2ujbt280NjbGggULolQqlXMrAICq1LVcJ/rhD38YX/rSl+Lo0aMxZsyYaGxsjJ07d8Zzzz0X//Ef/xFPP/10LF68uFzbAQBUpbJcOTty5EjMnDkzjh49GosXL45169bF448/HsuXL4+NGzdGv379YsmSJfHMM8+UYzsAgKpVljh76aWXoqWlJYYPHx7XX3/9O9YuvfTSuOGGGyLirac9AQA4sbLEWffu3U/q684///xybAcAULXKEmdDhw6N+vr6ePnll2PJkiXvWHvxxRdj0aJFcd5558XEiRPLsR0AQNUqyxsCunTpEgsXLoyrr746vvzlL0dTU1MMGzYsWlpa4rnnnosRI0bEo48+Gv369XvfczU0NHR4vLm5Oerr68sxLgBAWmV7t+bYsWNjxYoVMXHixFi/fn2sX78+IiK6desWn/nMZ2Lo0KHl2goAoGqVLc6WLl0a06ZNi0984hOxdOnSaGhoiNdffz3mzJkTTU1N8cwzz8TKlSvf9/VpmzZt6vD4ia6oAQBUk7K85uzXv/51TJkyJfr37x/Lli2Lyy67LOrq6mLYsGExf/78uPrqq2P9+vXxyCOPlGM7AICqVZY4e+yxx+Lw4cMxfvz4OOecc961PmnSpIiIePbZZ8uxHQBA1SpLnL322msREdGnT58O19uP79mzpxzbAQBUrbLE2QUXXBAREWvXru1wvf3ms0OGDCnHdgAAVasscTZhwoSIeOtpy+9973vvWFu1alU88MADERFx3XXXlWM7AICqVZY4GzNmTMyaNSsiImbOnBkf+9jHYtKkSfGpT30qxo4dGwcOHIgZM2bEpz/96XJsBwBQtcp2K43Zs2fH5ZdfHvPmzYt169bFyy+/HL17945x48bF9OnTY/LkyeXaCgCgapUtziIiJk6c6COaAAA6oSxPawIAUB7iDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgEXEGAJCIOAMASEScAQAkIs4AABIRZwAAiYgzAIBExBkAQCLiDAAgka5FD8DZY/nWlqJHqJirL/lw0SNU1H/NfKPoEeiEeWubix6hoh665k+KHqFiNrXsLXqEimoYeG7RI1RM9y6nfv3LlTMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACQizgAAEhFnAACJiDMAgETEGQBAIuIMACARcQYAkIg4AwBIRJwBACRSUyqVSkUPcTJ69+4dhw8fjvr6+qJH4RTtbTtS9AgV07tb16JHqKhDx44VPQKdsKf1UNEjVNR5PbsVPQKnqHuX6r1G1NzcHLW1tbFv374P/L1nzN8odXV1ceDAgdO2X3Nzc0SEGCyjc7ufnl9uHrvyO51/gHr8yu+Cc3qctr08fmcuj1151dbWRl1d3Sl97xlz5ex0a2hoiIiITZs2FTwJH5TH7szm8TuzefzOXB67PKr3eiIAwBlInAEAJCLOAAASEWcAAImIMwCARLxbEwAgEVfOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQiDgDAEhEnAEAJCLOAAASEWcAAImIMwCARMQZAEAi4gwAIBFxBgCQyP8HCphwyPS9/mMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "ordm1 = driver.get_orbital_entropies(ket, orb_type=1)\n", "ordm2 = driver.get_orbital_entropies(ket, orb_type=2)\n", "minfo = 0.5 * (ordm1[:, None] + ordm1[None, :] - ordm2) * (1 - np.identity(len(ordm1)))\n", "\n", "import matplotlib.pyplot as plt\n", "plt.matshow(minfo, cmap='ocean_r')\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "3nFzol-J8M2J" }, "source": [ "In the ``SGF`` mode:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "02YNFNho8Oc_", "outputId": "a8f1e4e6-3d9a-415a-9f58-34633c6dade8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.852 | E = -107.6541217988 | DW = 7.63e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.490 | E = -107.6541223313 | DE = -5.33e-07 | DW = 7.48e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.184 | E = -107.6541224348 | DE = -1.04e-07 | DW = 7.65e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.857 | E = -107.6541224348 | DE = 6.82e-12 | DW = 7.21e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.588 | E = -107.6541224379 | DE = -3.11e-09 | DW = 8.57e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 10.540 | E = -107.6541224379 | DE = -9.01e-12 | DW = 6.84e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 12.280 | E = -107.6541224379 | DE = -2.84e-14 | DW = 8.57e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 13.677 | E = -107.6541224379 | DE = 2.84e-12 | DW = 9.28e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 14.361 | E = -107.6541224379 | DE = -2.84e-14 | DW = 7.96e-20\n", "\n", "DMRG energy = -107.654122437939137\n" ] }, { "data": { "image/png": "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iu0EADBSVRZ1V1xxRUREbNq06ZiXHzo+c+bMYjsBAIxUlUXdddddF+eee250dXXF5s2bj7p89erVERFx8803F94MAGDkqSzq6urq4s4774yIiDvuuOPw79BFRDz66KOxZcuW+MxnPhNXXXVVVSsCAIwYlT779f7774+XX3451q9fH9OnT49PfepTsX379ujo6IgLL7ww/umf/qnK9QAARozKztRFRIwdOzZeeeWVaGtri/Hjx8eaNWti+/bt0draGps2bYpLL720yvUAAEaMmsHBwcGqlzhTDr1O3fFexw4AYLg43W6p9EwdAABDQ9QBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkMCoqheA4aKn70DReY1jRxedl132z1/p2zehruyXh/6Bg0Xn1Z5TU2xW6dtWV1v2fE3p27fuP98uOm/2pPOKzXrv4GCMOo37pjN1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAqIOACABUQcAkICoAwBIQNQBACQg6gAAEhB1AAAJiDoAgARGVb0AfJievgPFZjWOHV1s1tmg5OcuovznL/vt23dgoOi8utqy5xj2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CYg6AIAERB0AQAKiDgAgAVEHAJCAqAMASEDUAQAkIOoAABIQdQAACYg6AIAERB0AQAKjql4APkz/wMFis+pqfY8Dh2z5w7tF583843OLznu7d3/ReQyd+37+66Lz/vbPLy8265X6Mad1fV/FAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASEHUAAAmIOgCABEZVvQB8mNpzaorN2vfeQLFZERHbe/YWnVfa+NG1Redtfqun6LwFTzcVnRedjxQd94eVdxSd93bv/qLzLqofU2xWTcv3is2KiPivV/+66Lzntv6+6LxH5l1RdF7P/gPFZh0cjDidL3vO1AEAJCDqAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASEHUAAAmIOgCABEQdAEACog4AIAFRBwCQgKgDAEhA1AEAJCDqAAASGFX1AvBh+gcOFptVV+t7nKG0+a2eovNmTWwsOi86Hyk7r3lJ2XlxR+F5ZdW0fK/YrMHXflBsVkTEys3bis67ecbFRef17D9QdF7jmNHFZtXW1JzW9X0VAwBIQNQBACQg6gAAEhB1AAAJiDoAgAREHQBAAkMSdRs3boyHHnooFixYEE1NTVFTUxM1H/K03AcffPDw+xzr37333jsUawEAnDWG5HXqli1bFs8+++xJX++6666Lyy677KjjV1111VCsBQBw1hiSqJszZ07MnDkzWlpaoqWlJaZOnRr79+//yOt985vfjNbW1qFYAQDgrDYkUbd06dKh+DAAAJwiT5QAAEig0r/9um7duti8eXP09fVFU1NTfP7zn/f7dAAAp6DSqFu1atURb7e1tcXChQtj5cqV0dDQcMIfp7m5+ZjHu7q6Ytq0aae1IwDASFDJj18vu+yyePjhh6OzszP27NkTv/vd7+InP/lJTJ48OZ555pn4+te/XsVaAAAjViVn6m677bYj3q6vr4+vfe1rcf3118fll18ea9asifb29rj22mtP6ON1dnYe8/jxzuABAGQz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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)\n", "\n", "ordm1 = driver.get_orbital_entropies(ket, orb_type=1)\n", "ordm2 = driver.get_orbital_entropies(ket, orb_type=2)\n", "minfo = 0.5 * (ordm1[:, None] + ordm1[None, :] - ordm2) * (1 - np.identity(len(ordm1)))\n", "\n", "import matplotlib.pyplot as plt\n", "plt.matshow(minfo, cmap='ocean_r')\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "NEIOP7H-8cKF" }, "source": [ "## Orbital Reordering\n", "\n", "We support several algorithms (such as \"fiedler\" and \"gaopt\") to reorder the orbitals used in DMRG, so that the entanglement in the MPS can be decreased. With an optimal orbital reordering, one can expect a better energy expectation with a low bond dimension MPS.\n", "\n", "The orbital reordering can be applied directly on the integrals ``h1e``, ``g2e`` (unpacked), and ``orb_sym`` (if there are point group symmetries), before they are used by ``pyblock2``. This is the recommended way, and the user is responsible for tracking the orbital ordering.\n", "\n", "In the ``SZ`` mode (using the exchange integral as the cost function):" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "XGegv00P-G8Q", "outputId": "0b971020-6272-4a7a-a90c-c0cfc8978b14" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.154 | E = -107.6541224475 | DW = 3.94e-14\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.779 | E = -107.6541224475 | DE = -1.71e-13 | DW = 5.09e-14\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.519 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.53e-14\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.267 | E = -107.6541224475 | DE = -1.71e-13 | DW = 5.99e-14\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.325 | E = -107.6541224475 | DE = -2.84e-14 | DW = 1.60e-19\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.298 | E = -107.6541224475 | DE = 0.00e+00 | DW = 9.10e-20\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.249 | E = -107.6541224475 | DE = 1.42e-13 | DW = 1.68e-19\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.029 | E = -107.6541224475 | DE = 5.68e-14 | DW = 8.36e-20\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 7.552 | E = -107.6541224475 | DE = -2.84e-14 | DW = 2.65e-20\n", "\n", "Method = fiedler DMRG energy = -107.654122447502473\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.165 | E = -107.6541224475 | DW = 4.14e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.551 | E = -107.6541224475 | DE = -1.21e-11 | DW = 4.20e-11\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.929 | E = -107.6541224475 | DE = -2.30e-12 | DW = 4.13e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.314 | E = -107.6541224475 | DE = -2.27e-13 | DW = 4.41e-11\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.783 | E = -107.6541224475 | DE = 5.68e-14 | DW = 8.96e-21\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.298 | E = -107.6541224475 | DE = -1.14e-13 | DW = 1.20e-14\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.812 | E = -107.6541224475 | DE = 5.68e-14 | DW = 1.14e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.337 | E = -107.6541224475 | DE = 0.00e+00 | DW = 1.21e-14\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 4.638 | E = -107.6541224475 | DE = -1.42e-13 | DW = 4.79e-20\n", "\n", "Method = gaopt DMRG energy = -107.654122447524131\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2cAAAHZCAYAAAACFENJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABcSAAAXEgFnn9JSAAAx30lEQVR4nO3de5hVdb0/8M/ADLcBGRDwEgI5KsIUHDA9KXEgTykeM6THS6gJpJiXc8pj2HlKy1uXY4jWUU/iDTFRMuto+aTllbxy1ShALRRMzAAVZbgMl1m/P3xmfk57kIHZsr7MvF7Pw/PIWnut9WaxnQ/vvfZeuyTLsiwAAADIVZu8AwAAAKCcAQAAJEE5AwAASIByBgAAkADlDAAAIAHKGQAAQAKUMwAAgAQoZwAAAAlQzgAAABKgnAEAACRAOQMAAEiAcgYAAJAA5QwAACAByhkAAEAClDNata1bt8bVV18dQ4YMifLy8igpKYmSkpK49957Y+TIkVFSUhKXXnrpLs912223RUlJSfTr169g3aWXXholJSUxcuTIXZ4LAIAPT2neASBP559/flx33XUREdGuXbvYa6+9IiKiQ4cOecYCAIrk8ccfj8cffzz69esX48ePzzsOfCBXzmi11q5dG1OnTo2IiB/+8IexcePGeOONN+KNN96IUaNGRZ8+faJ///7Ro0ePnJMCADvr8ccfj8suuyxuu+22vKPAdrlyRqv1wgsvxObNmyMi4pxzzomSkpIG62+//fY8YgEA0Eq5ckartX79+vr/7ty5c45JAABAOaMVqrvZxvtvqFF3I5D3L2/KDUH+9Kc/xVlnnRUHHnhgdOrUKTp37hyDBg2Kiy66KFavXv2BOZ599tk4/vjjo0ePHtGxY8fo379/XHTRRVFdXd3sP+OqVavi4osvjiFDhkTXrl2jQ4cOsf/++8cZZ5wRixYtanSbxx9/vP4cREQ899xzceqpp0bv3r2jrKzMDUgAWogsy2LatGlx+OGHR5cuXaJr167xz//8z3HjjTdGlmUxfvz4KCkpKfh81htvvBHXXnttjB49OgYMGBBdu3aNjh07xgEHHBBnnnnmNufL+z333HNx+umnR9++faNDhw7RrVu3OOKII+JHP/pR1NTUNLrNP94k66GHHopjjjkmevbsGR07doyqqqr47ne/Gxs3bmyw3bJly6KkpCQuu+yyiIiYNWtWg3lfUlLirY6kJ4NWZubMmdlee+2VdevWLYuILCKyvfbaq/7XmDFjsizLshEjRmQRkV1yySWN7ufKK6/M2rRpU7+PTp06Ze3atav//T777JMtWLCg0W1vueWWBtt27dq1ftuDDz44u/rqq7OIyPr27Vuw7SWXXJJFRDZixIhG9/3QQw9lFRUV9fsuKyvLysvL63/frl27bPr06QXbPfbYY/WPueeee7KysrIsIrI99tgj69ChwzaPB8DuY8uWLdnJJ59c//O+pKQk69atW/1MGjt2bDZu3LgsIrJx48Y12LZueURkpaWlWffu3bPS0tL6Ze3bt8/uueeebR776quvzkpKShrMvrpZExHZoEGDstdff71gu2nTptXPxOuvv75+HxUVFQ2OP2TIkOytt96q3+7VV1/N9tprr/oZWFZW1mDe77XXXtnMmTOLdm6hGJQzWq33l5HGfFA5u/nmm7OIyDp37px973vfy/72t79lWfbe0Js3b1525JFHZhGR9e7dO1u7dm2DbefPn18/TEaOHJktWbIky7Is27RpU3bXXXdlFRUV9eVqR8vZwoULs44dO2YRkU2cODFbvHhxtmXLlizLsmz58uXZueeeWz9U586du83z0blz5+zf/u3f6rNlWZa99NJL2zyXAOwefvCDH9T/rL/ggguy1atXZ1mWZe+88072/e9/v76sNVbOrrjiimzy5MnZH//4x2zz5s1ZlmXZ1q1bsz/96U/ZqaeemkVEVl5enq1YsaLguL/+9a/rjzt69Ojs5ZdfzrIsy2pqarLbb78969KlSxYR2RFHHFE/t+rUlbNOnTplZWVl2Yknnpi9+uqrWZZl2fr167Of/OQnWfv27bOIqH+B9f2296ImpEQ5o9Xa2XL27rvv1penBx98sNFtN2/enB1yyCFZRGTXXHNNg3XHHHNMFhHZQQcdlK1fv75g2wcffLA+146Ws7pS+M1vfrPRXFmWZV/96lfrh+P7vf98HHbYYQXDEYDdW3V1dbbHHntkEZGdccYZjT6mbsY0Vs6259hjj80iIrviiisK1g0YMCCLiGz48OGNzpdf/epX9cf9+c9/3mBdXTmrm31bt24t2L7uRdOIyObMmdPon0k5Y3fgM2ewg37xi1/EmjVrYsiQIXH00Uc3+pjS0tIYO3ZsRET89re/rV++Zs2a+t9feOGF0bFjx4Jtjz766Dj88MN3ONeyZcvi0UcfjdLS0pg0adI2H3f66adHRMTDDz8cW7dubfQxF154YbRt23aHMwCQrt/97nfx7rvvRkTERRdd1Ohjvv71r0enTp12av/HHntsREQ8+eSTDZYvXLgwlixZEhERF198caPz5bjjjovDDjssIiLuuuuubR7j4osvjjZtCv/5OmHChOjdu3dERMycOXOn8kMK3EofdtBTTz0VERFLliyJvffee5uP27BhQ0RELF++vH7ZggULora2NiIijjzyyG1ue+SRR8YzzzyzU7lqa2tj4MCB23xcXSFbt25dvPnmm9GrV6+CxwwbNmyHjg1A+hYsWBAREX369ImPfvSjjT6mS5cuccghh8QTTzzR6Po//OEPMXXq1HjyySdj2bJlUV1dHVmWNXjMa6+91uD38+bNi4j3XrgcMWLENvN99rOfjTlz5tQ//h+VlpbG8OHDG13Xpk2bGDlyZNxxxx3b3B52B8oZ7KDXX389IiI2btxYcGeoxrz/lv0rV66s/++PfOQj29ym7tW/nclVW1sbf//735u0zfuzvV9jhQ2A3duqVasiImLffff9wMdtaz5dd9118bWvfa3+RcaSkpLo2rVrtG/fPiLee1Hy3XffjXXr1jXYrm729ejRo/6xjambfe+fle+3ve3rcm9re9gdeFsj7KC6K08nn3xyZO99bvMDfy1btmyX5tprr72alCvLsvrbEv8jb2kEaLnqvjJlRyxZsiTOP//8qK2tjRNPPDHmzJkTGzdujLfffjveeOONeOONN+Lqq6+OiCi4kgY0nXIGO6jurYzvf7tiU73/itSKFSu2+bgPWre9XKtXry541RIAevbsGRH//50W29LYDLrnnnti69atMWDAgJg5c2Yceuih0a5duwaPeeONNxrdX93sW7169Ta/yyzi/78dclvv3li9enVs2rRpu7m9+4PdmXIGO6ju81jz58+Pv/3tbzu07dChQ+s/yPzYY49t83GPPvroTufaunVrPPDAAzu8PQAt29ChQyPivRcXt/Wujurq6pg/f37B8r/+9a8RETF48OBGb8gR8d6NphrziU98IiIitmzZErNmzdpmvrrtDz300EbXb9myZZufhcuyrH7fdcerU5fXFT12B8oZ7KATTzwxKioqYvPmzXHBBRd84A/72traWLNmTf3vKyoq4qijjoqIiKuuuqrRz6w9/PDD8fTTT+9wrgMPPDBGjhwZEe/dheudd975wMe/9dZbO3wMAHZfRx11VOyxxx4REfH973+/0cdcc801jX4euWvXrhER8cc//rHRuffAAw/E448/3ug+Bw0aVH+jqu9+97uN3in4N7/5TcyePTsiov5ux4353ve+V/+Zt/ebPn16fYE8+eSTG6yr+zO/fx5DqpQz2EEVFRXxox/9KCLeu13vscceG7Nnz64fFrW1tbFkyZKYMmVKVFVVxf33399g+yuuuCLatm0bL7zwQhx77LHx4osvRsR7rwjefffdcdJJJ0VFRcVOZbv22mujc+fO8dJLL8UnP/nJuO+++xoUwBUrVsRPf/rT+Nd//df4r//6r506BgC7p/Ly8vqf/TfddFN84xvfqH+hbu3atXHllVfGpZdeGt26dSvYdtSoURERsWjRojjvvPPqt1u3bl1MnTo1TjjhhNhzzz23eewrr7wyIiKeeOKJOOGEE+KVV16JiIjNmzfHjBkz6gvZEUccEccff3yj++jUqVM8+eSTccopp9S/BXLjxo1x4403xjnnnBMREaNHj66/JX+dj33sY/XZd+bFT9ildtk3qkFidvZLqOv85Cc/ydq1a1e/j/bt22d77rlnVlZWVr8sIrI77rijYNupU6dmJSUl9Y/p2rVr1r59+ywisoMPPji7+uqrd+pLqLMsy5588sls7733rt9327Ztsz333DPr2LFjg1xnnnnmDp0PAHZ/mzdvzk444YT6n/dt2rTJunXrlrVt2zaLiOxLX/pSdvrpp2cRkX3lK19psO0Xv/jFBnOkoqKifrtDDjkku/baa7c5u7Isy66++uoGs6+ioqLBHP34xz+erVixomC7ui+h7tu3b3bdddfV76Nbt24NZu7gwYOz1atXN/pn7t+/f/3junXrlvXt2zfr27dvwRdeQ95cOYOddPbZZ8eLL74YkyZNisGDB0f79u1jzZo10blz5/jEJz4R//Ef/xEPPfRQo2/POOuss+Kpp56K4447Lrp37x41NTXRt2/f+OY3vxlz5sxp9FXLpho2bFi89NJLcdVVV8W//Mu/REVFRaxZsybatm0bAwYMiNNOOy1mzJhRf/UPgNajtLQ07r777rj55pvjsMMOi44dO8aWLVviE5/4RNx8881x++2317/97x/fxVE3OwYNGhTt27ePrVu3xsc//vH4wQ9+EE899VR07tz5A4/9n//5nzFv3rw47bTTYr/99ov169dHx44d45Of/GRcc801MXfu3O3e5v+8886L3/72tzFq1Kho06ZNtGnTJg4++OC4/PLL45lnnmn06l1paWk88sgjceaZZ8ZHP/rRWLduXSxfvjyWL18e1dXVO3T+4MNWkmU+HQkAwHs3zejTp0+89tprcfvtt8eXvvSlvCPFbbfdFhMmTIi+ffvusq+ngby4cgYAQERE/PSnP43XXnstSktL4zOf+UzecaDVUc4AAFqRsWPHxj333BOrV6+uX/b3v/89/vu//zsmTpwYERGnn3567LPPPnlFhFarNO8AAADsOg888EDMnDkzIt67A2JZWVmDr18ZPnx4XHPNNXnFg1ZNOQMAaEX+53/+Jx544IF47rnnYuXKlVFdXR09e/aMf/qnf4ovfvGL8aUvfSnKysryjgmtkhuCAAAAJMBnzgAAABKgnAEAACRAOQMAAEiAcgYAAJAA5QwAACAByhkAAEACWk0527BhQ3znO9+Jgw46KDp06BD77rtvfPnLX44VK1bkHS0J69evj3vvvTfOOOOM6N+/f3To0CHKy8tj8ODBcfnll0d1dXXeEZP15ptvRq9evaKkpCQOOOCAvOMkZ9WqVTFp0qTo379/dOzYMbp37x5Dhw6NCy+8MO9oyZg7d26cdNJJse+++0ZZWVlUVFTE8OHDY9q0aeHbTthR5t0HM+92nnn3wcy77TPvtq9VfM/Zxo0b49Of/nQ8++yzsc8++8Tw4cNj2bJlMWfOnOjZs2c8++yzsf/+++cdM1c333xzTJw4MSIiBgwYEB/72Mfi3XffjaeffjrWrl0bBx98cMyaNSt69eqVc9L0jB8/Pm6//fbIsiwqKyvjL3/5S96RkjF//vw4+uij480334yqqqr659XixYvjtddeiy1btuQdMXe/+MUv4uSTT46tW7fG0KFD44ADDohVq1bFE088EVu2bIlTTjklZsyYkXdMdhPm3faZdzvPvNs28277zLsmylqBiy66KIuI7PDDD8/Wrl1bv3zKlClZRGQjRozIL1wibrvttuyss87KFi9e3GD566+/ng0ZMiSLiGzs2LE5pUvXww8/nEVEdtZZZ2URkVVWVuYdKRkrV67MevTokXXq1Cm77777CtbPnj07h1Rp2bx5c9arV68sIrIZM2Y0WLd48eKse/fuWURkjz76aE4J2d2Yd9tn3u0c827bzLvtM++arsWXs5qamqxr165ZRGQLFiwoWD9o0KAsIrJ58+blkG738PTTT2cRkbVv3z6rqanJO04y1q9fn1VWVmYDBw7MXnrpJcPqH5xzzjlZRGTXX3993lGS9cc//jGLiKx///6Nrv/qV7+aRUR25ZVX7uJk7I7Mu+Yz7xpn3n0w8277zLuma/GfOXvqqafinXfeicrKyhgyZEjB+hNOOCEiIn7961/v6mi7jcGDB0dERE1NTbz55ps5p0nHZZddFi+//HLccMMNUVZWlnecpGzYsCHuuOOOKC8vjwkTJuQdJ1nt27dv0uP23HPPDzkJLYF513zmXePMu20z75rGvGu6Fl/O/vCHP0RExNChQxtdX7d84cKFuyzT7ubll1+OiIiysrLo3r17zmnSsHDhwpgyZUpMmDAhhg8fnnec5MybNy/Wrl0bQ4YMiY4dO8YDDzwQF1xwQZx77rnxox/9KF5//fW8IyZh//33j8rKynjxxRfjzjvvbLBuyZIlcccdd0S3bt1izJgxOSVkd2LeNZ95V8i8+2DmXdOYd01XmneAD9urr74aERG9e/dudH3d8uXLl++yTLubH//4xxERMWrUqCa/8tGS1dbWxplnnhkVFRXxwx/+MO84SVq8eHFERPTq1SuOP/74uO+++xqs/9a3vhW33HJLjB07No94yWjbtm1Mnz49Pve5z8Wpp54aU6ZMiQMPPDBWrlwZTzzxRAwcODBuu+02/0ikScy75jPvGjLvts+8axrzrula/JWzulvidurUqdH15eXlERGxdu3aXZZpd/Kb3/wmbrnlligrK4srrrgi7zhJuPbaa2Pu3LkxefJkl9+34e23346IiF/96lfx4IMPxvXXXx8rV66MZcuWxaRJk2LDhg0xbty4eP755/MNmoBhw4bFrFmzYv/9948FCxbEz372s3jssceiTZs28dnPfrbV31mPpjPvmse8K2TebZ9513TmXdO0+HLGznvhhRfitNNOiyzLYvLkyfXvxW/NXn311bj44otjxIgRMX78+LzjJKu2tjYiIrZs2RKXX355nHvuudGzZ8/o27dvTJ48OU488cTYvHlzTJ48Oeek+bvrrrvisMMOi/322y9mz54d1dXV8dJLL8X48eNjypQpceSRR0ZNTU3eMaFFM+8KmXdNY941nXnXNC2+nHXu3Dki3vvSycasW7cuIiK6dOmyyzLtDlasWBGjRo2Kt99+Oy644IL42te+lnekJJx33nmxadOmuOGGG/KOkrS6/+8iotEPSNctmzVr1i7LlKI///nPMW7cuOjRo0fcf//9cdhhh0V5eXkceOCBMXXq1Pjc5z4XCxYsiFtvvTXvqOwGzLudY941zrxrGvOuacy7pmvxnznr06dPRES89tprja6vW963b99dlil1b731Vhx11FGxfPnymDBhQlx11VV5R0rG/fffHxUVFXH22Wc3WL5x48aIeG/Ijxw5MiIiZs6cGXvvvfeujpiEuv+fOnXqFD179ixY369fv4iIWLly5a6MlZyZM2fG5s2bY9SoUQ0GfJ2TTjop7r///vj9738f55xzTg4J2Z2YdzvOvNs2865pzLumMe+arsWXs7q3JixYsKDR9XXLBw0atMsypay6ujqOOeaYWLx4cXzhC1+Im266KUpKSvKOlZQ1a9Zs8xWwjRs31q+rG2CtUd1tvDds2BA1NTUFH6x/6623IiIa/QHdmtT9Y7lr166Nrq9bXveZBvgg5t2OMe+2z7zbPvOuacy7pmvxb2scNmxYdO3aNZYuXdrohzHvueeeiIg47rjjdnGy9NTU1MTo0aNjzpw5cfTRR8ddd90Vbdu2zTtWUrL3vri94Ncrr7wSERGVlZX1y+peLWuN+vTpE4MHD44syxod7HXLGvsuptak7pXmefPmNbp+7ty5ERGt+rlE05l3TWfebZ951zTmXdOYdztg137ndT4uuuiiLCKyI444Iquurq5fPmXKlCwishEjRuQXLhFbtmzJxowZk0VENnz48GzdunV5R9qtvPLKK1lEZJWVlXlHScaMGTOyiMg+/vGPZ6+//nr98ueeey7r3r17FhHZ3XffnWPC/M2fPz+LiCwisv/93/9tsO6ZZ57JysvLs4jIHnrooZwSsrsx77bPvGse866Qebd95l3TlWRZlu3qQrirbdy4MUaOHBmzZ8+OffbZJ4YPHx7Lly+P2bNnR8+ePePZZ59t9bfv/PGPfxznn39+RESMGTMm9thjj0Yfd9VVV0WPHj12YbLdw7Jly+KjH/1oVFZWxl/+8pe84yRj/PjxMX369KioqIgjjjgiNmzYEE8//XTU1NTExIkT48Ybb8w7Yu4uvPDC+s+5VFVVxcCBA+P111+PZ555Jmpra+Oss86KqVOn5pyS3YV5t33mXfOYd40z77bPvGuivNvhrrJ+/frs29/+dlZZWZm1a9cu23vvvbPx48dnf/3rX/OOloRLLrmk/hWND/r1yiuv5B01SV5JbFxtbW124403ZoccckjWqVOnrLy8PDv88MOz2267Le9oSfnlL3+ZHXXUUdmee+6ZlZaWZt26dcs+/elPZ3feeWfe0dgNmXcfzLxrHvOuceZd05h329cqrpwBAACkrsXfEAQAAGB3oJwBAAAkQDkDAABIgHIGAACQAOUMAAAgAcoZAABAApQzAACABChnAAAACVDOAAAAEqCcAQAAJEA5AwAASECrK2dVVVVRVVWVd4zkOU9N4zw1jfPUNM4TxeT51DTOU9M4T03jPDWN87Rtra6cAQAApEg5AwAASIByBgAAkADlDAAAIAHKGQAAQAJKsizL8g7RFHvvvXesW7cu+vTp06z9LF26NCIiKisrixGrxXKemsZ5ahrnqWla+nl69dVXo7y8PN544428oyTNvNu1nKemcZ6axnlqmpZ+npoz73abctalS5fYvHlzcn+Jy9asyztCgfWbl+cdoUB5u355RyjwkS4d845QoE1J3gkKpfgTYkuCodq39UaE7Vm6dGmUlZXF2rVr846StFTnHQBN05x5V/oh5PlQ1L2CuGjRopyTNDTytsfzjlBg1rJP5x2hwOGV0/OOUGDa6EPzjlCgc7v0/pfctLU27wgFVq2ryTtCgapee+QdIXm+06ZpUp13ADRNc+adl3oBAAASoJwBAAAkQDkDAABIgHIGAACQAOUMAAAgAcoZAABAApQzAACABChnAAAACVDOAAAAElC0crZhw4b4zne+EwcddFB06NAh9t133/jyl78cK1asKNYhAAAAWqyilLONGzfGkUceGVdccUVUV1fH6NGjY7/99otp06bFkCFD4uWXXy7GYQAAAFqsopSz7373u/Hss8/G4YcfHi+99FL87Gc/i9mzZ8eUKVNi1apV8eUvf7kYhwEAAGixml3ONm3aFNddd11ERFx//fXRuXPn+nUXXHBBDBo0KGbNmhXz589v7qEAAABarGaXs6eeeireeeedqKysjCFDhhSsP+GEEyIi4te//nVzDwUAANBiNbuc/eEPf4iIiKFDhza6vm75woULm3soAACAFqu0uTt49dVX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AOUMAAAgAcoZAABAApQzAACABChnAAAACVDOAAAAEqCcAQAAJEA5AwAASIByBgAAkADlDAAAIAHKGQAAQAKUMwAAgAQoZwAAAAlQzgAAABKgnAEAACRAOQMAAEiAcgYAAJAA5QwAACAByhkAAEAClDMAAIAEKGcAAAAJUM4AAAASoJwBAAAkQDkDAABIgHIGAACQAOUMAAAgAcoZAABAApQzAACABChnAAAACVDOAAAAElCad4AdkWURm7bW5h0jeUP36ZZ3hN1CzZb0nksdS7O8IxRo26Yk7wgF7l/yt7wjFDixqnfeEaDVadc2vdeY5654K+8IBT530D55Ryiwtda8a4r2pek9x5/565t5Ryhw6Ee65x2hgZJmPJXS+xsHAABohZQzAACABChnAAAACVDOAAAAEqCcAQAAJEA5AwAASIByBgAAkADlDAAAIAHKGQAAQAKUMwAAgAQUtZytWrUqJk2aFP3794+OHTtG9+7dY+jQoXHhhRcW8zAAAAAtTtHK2fz582PAgAExZcqUKCsri9GjR8cnP/nJeOutt+Kaa64p1mEAAABapNJi7GTVqlUxatSo2LBhQ9x3333x+c9/vsH6OXPmFOMwAAAALVZRytkll1wSq1evjuuvv76gmEVEHHbYYcU4DAAAQIvV7Lc1btiwIe64444oLy+PCRMmFCMTAABAq9PsK2fz5s2LtWvXxqc+9ano2LFjPPDAA/HQQw/Fxo0b46CDDoqTTjop9t1332JkBQAAaLGaXc4WL14cERG9evWK448/Pu67774G67/1rW/FLbfcEmPHjm3S/qqqqhpdvnTp0uj30f2bFxYAEvFB866ysnIXpwEgBc1+W+Pbb78dERG/+tWv4sEHH4zrr78+Vq5cGcuWLYtJkybFhg0bYty4cfH8888391AAAAAtVrOvnNXW1kZExJYtW+J73/tenHvuufXrJk+eHMuXL4+f//znMXny5JgxY8Z297do0aJGl1dVVcXW2qy5cQEgCR807wBonZp95axz5871/93YDUHqls2aNau5hwIAAGixml3O+vbtGxERnTp1ip49exas79evX0RErFy5srmHAgAAaLGaXc6GDBkSEe/dUr+mpqZg/VtvvRURDa+wAQAA0FCzy1mfPn1i8ODBkWVZo29drFtWV+IAAAAo1OxyFhHxjW98IyIiJk2aFH/729/q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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e_orig, g2e_orig, orb_sym_orig = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "g2e_orig = driver.unpack_g2e(g2e_orig, n_sites=ncas)\n", "\n", "minfos = {}\n", "for method in [\"fiedler\", \"gaopt\"]:\n", " idx = driver.orbital_reordering(h1e_orig, g2e_orig, method=method)\n", " h1e = h1e_orig[idx][:, idx]\n", " g2e = g2e_orig[idx][:, idx][:, :, idx][:, :, :, idx]\n", " orb_sym = np.array(orb_sym_orig)[idx]\n", "\n", " driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", " mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", " ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", " energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", " print('Method = %s DMRG energy = %20.15f' % (method, energy))\n", " minfos[method] = driver.get_orbital_interaction_matrix(ket)\n", "\n", "import matplotlib.pyplot as plt\n", "f, axs = plt.subplots(1, 2, sharey=True)\n", "f.set_size_inches(w=14 / 2, h=7 / 2)\n", "for ax, (method, minfo) in zip(axs, minfos.items()):\n", " ax.matshow(minfo, cmap='ocean_r')\n", " ax.set_title(method)\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "xNaeSZ4-Bqkm" }, "source": [ "In the ``SGF`` mode (using the exchange integral as the cost function):" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "DZNoWg9PBvxn", "outputId": "c67d38a3-2cd3-4d49-9ed7-843be5e16248" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.089 | E = -107.6421167128 | DW = 1.94e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.269 | E = -107.6541224404 | DE = -1.20e-02 | DW = 2.02e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.843 | E = -107.6541224449 | DE = -4.57e-09 | DW = 2.63e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 9.347 | E = -107.6541224419 | DE = 3.04e-09 | DW = 2.48e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 11.393 | E = -107.6541224475 | DE = -5.62e-09 | DW = 2.71e-11\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 13.951 | E = -107.6541224475 | DE = -9.66e-13 | DW = 2.95e-11\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 16.841 | E = -107.6541224475 | DE = -3.13e-13 | DW = 2.74e-11\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 18.893 | E = -107.6541224475 | DE = 1.99e-13 | DW = 3.67e-11\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 19.757 | E = -107.6541224475 | DE = 7.11e-12 | DW = 3.64e-20\n", "\n", "Method = fiedler DMRG energy = -107.654122447517537\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.646 | E = -107.6540666856 | DW = 5.18e-08\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.397 | E = -107.6541222892 | DE = -5.56e-05 | DW = 4.78e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.321 | E = -107.6541224442 | DE = -1.55e-07 | DW = 5.35e-08\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.216 | E = -107.6541224442 | DE = -8.87e-12 | DW = 4.55e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.531 | E = -107.6541224475 | DE = -3.35e-09 | DW = 1.02e-10\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.955 | E = -107.6541224475 | DE = -6.82e-13 | DW = 2.97e-11\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 10.368 | E = -107.6541224475 | DE = 4.55e-13 | DW = 1.01e-10\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 11.805 | E = -107.6541224475 | DE = -7.67e-13 | DW = 2.97e-11\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 12.680 | E = -107.6541224475 | DE = 3.69e-13 | DW = 2.59e-20\n", "\n", "Method = gaopt DMRG energy = -107.654122447524415\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3QAAAHZCAYAAADOjXmiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABcSAAAXEgFnn9JSAAA2lklEQVR4nO39e5RddX0//j8nM5PJZCbJhBhIJA13EOdjkECQy0JSPoogIhTxY7VgQVFLtQWv2EowJajYcpGK7Y+qHyjUVaxR8VbR8EFcyiUIEWlTBBslXCQQYkIySSaXyf79wTdTYiZAknfmzE4ej7VYiznn7Oe8ZmfPec/z7HNpqqqqCgAAALUzrNEDAAAAsG0UOgAAgJpS6AAAAGpKoQMAAKgphQ4AAKCmFDoAAICaUugAAABqSqEDAACoKYUOAACgphQ6AACAmlLoAAAAakqhAwAAqCmFDgAAoKYUOgAAgJpS6GAr9fX15corr8yhhx6ajo6ONDU1pampKTfffHOmT5+epqamzJw5c9Dnuv7669PU1JS99957s+tmzpyZpqamTJ8+fdDnAgBgx2lp9ABQNxdccEGuueaaJMnw4cOzxx57JElGjBjRyLEAgEJuv/323H777dl7771z9tlnN3oceEHO0MFWWLFiRa699tokyd/+7d+mt7c3ixYtyqJFi3LiiSdm8uTJOeigg/Kyl72swZMCANvq9ttvz9/8zd/k+uuvb/Qo8KKcoYOt8Mtf/jLr1q1Lkpx33nlpamra5PobbrihEWMBALCLcoYOtsKqVav6/7+zs7OBkwAAgEIHL8nGNxx5/puKbHwzlOdf/lLeFOU///M/8973vjcHHHBARo4cmc7OzkyZMiWf+MQn8swzz7zgHHfffXdOO+20vOxlL0t7e3sOOuigfOITn0hPT892/4yLFy/ORRddlEMPPTRjxozJiBEjsu++++bd73535s+fP+A2t99+e/8+SJKf//zn+ZM/+ZNMmjQpra2t3oQFYCdRVVWuu+66HHXUURk1alTGjBmT17zmNfmnf/qnVFWVs88+O01NTZu93mzRokX5/Oc/n1NPPTUHH3xwxowZk/b29uy///4599xzt7i+PN/Pf/7zvPOd78xee+2VESNGZOzYsTn66KPzuc99LmvWrBlwm99/o7A5c+bkpJNOyvjx49Pe3p7u7u5ceuml6e3t3WS7Rx55JE1NTfmbv/mbJMmPf/zjTdb7pqYmT8Nk6KmAF3XTTTdVe+yxRzV27NgqSZWk2mOPPfr/+6M/+qOqqqrquOOOq5JUn/zkJwfM+exnP1sNGzasP2PkyJHV8OHD+7+eOHFiNW/evAG3/fKXv7zJtmPGjOnf9hWveEV15ZVXVkmqvfbaa7NtP/nJT1ZJquOOO27A7Dlz5lRdXV392a2trVVHR0f/18OHD6/++Z//ebPtfvSjH/XfZvbs2VVra2uVpBo9enQ1YsSILX4/AOpj/fr11dve9rb++/umpqZq7Nix/WvS29/+9upP//RPqyTVn/7pn26y7cbLk1QtLS3VbrvtVrW0tPRf1tbWVs2ePXuL3/vKK6+smpqaNln7Nq41SaopU6ZUv/3tbzfb7rrrrutfE7/whS/0Z3R1dW3y/Q899NDqd7/7Xf92jz76aLXHHnv0r4Gtra2brPd77LFHddNNNxXbt1CCQgdb4fkFZiAvVOi+9KUvVUmqzs7O6lOf+lT15JNPVlX13EJ57733Vscff3yVpJo0aVK1YsWKTba97777+heg6dOnVw8++GBVVVW1du3a6l//9V+rrq6u/kK2tYXugQceqNrb26sk1Xve857qv/7rv6r169dXVVVVCxcurP78z/+8fyH+2c9+tsX90dnZWb3xjW/sn62qqurhhx/e4r4EoB4+85nP9N/Xf+hDH6qeeeaZqqqq6tlnn60+/elP9xe8gQrdrFmzqr/7u7+r/uM//qNat25dVVVV1dfXV/3nf/5n9Sd/8idVkqqjo6N64oknNvu+3/nOd/q/76mnnlr9+te/rqqqqtasWVPdcMMN1ahRo6ok1dFHH92/bm20sdCNHDmyam1trd761rdWjz76aFVVVbVq1arqH//xH6u2trYqSf+Dss/3Yg+EwlCi0MFW2NZCt3z58v7Cdcsttwy47bp166rDDjusSlJdddVVm1x30kknVUmqAw88sFq1atVm295yyy39c21todtYJP/qr/5qwLmqqqr+8i//sn9Bfb7n748jjjhiswUVgHrr6empRo8eXSWp3v3udw94m41rzECF7sWcfPLJVZJq1qxZm1138MEHV0mqY489dsD15dvf/nb/9/3a1762yXUbC93Gta+vr2+z7Tc+0Jqkuueeewb8mRQ66sBr6GAQfP3rX8+yZcty6KGH5g1veMOAt2lpacnb3/72JMkPfvCD/suXLVvW//VHP/rRtLe3b7btG97whhx11FFbPdcjjzyS2267LS0tLfnIRz6yxdu9853vTJLceuut6evrG/A2H/3oR9Pc3LzVMwAwdP3whz/M8uXLkySf+MQnBrzNhz/84YwcOXKb8k8++eQkyU9/+tNNLn/ggQfy4IMPJkkuuuiiAdeXU045JUcccUSS5F//9V+3+D0uuuiiDBu2+Z+855xzTiZNmpQkuemmm7ZpfhgKfGwBDII77rgjSfLggw9mwoQJW7zd6tWrkyQLFy7sv2zevHnZsGFDkuT444/f4rbHH3987rrrrm2aa8OGDXnlK1+5xdttLHErV67MkiVLsvvuu292m2OOOWarvjcAQ9+8efOSJJMnT84+++wz4G1GjRqVww47LD/5yU8GvP4Xv/hFrr322vz0pz/NI488kp6enlRVtcltHn/88U2+vvfee5M892Dncccdt8X5Xv/61+eee+7pv/3va2lpybHHHjvgdcOGDcv06dPzL//yL1vcHupAoYNB8Nvf/jZJ0tvbu9k7ag3k+R+P8PTTT/f//5577rnFbTY+yrgtc23YsCFPPfXUS9rm+bM930AlD4B6W7x4cZLk5S9/+Qvebkvr0zXXXJPzzz+//4HJpqamjBkzJm1tbUmeeyBz+fLlWbly5SbbbVz7Xvayl/XfdiAb177nr5XP92Lbb5x7S9tDHXjKJQyCjWe43va2t6V67rWrL/jfI488Mqhz7bHHHi9prqqq+t8C+vd5uiXAzmvjx9NsjQcffDAXXHBBNmzYkLe+9a2555570tvbm6VLl2bRokVZtGhRrrzyyiTZ7Iwd8NIpdDAINj7N8vlPpXypnn/m64knntji7V7ouheb65lnntns0VEAGD9+fJL/eUbHlgy0Bs2ePTt9fX05+OCDc9NNN2XatGkZPnz4JrdZtGjRgHkb175nnnlmi581l/zPUzW39CyRZ555JmvXrn3RuT3LhDpT6GAQbHx92X333Zcnn3xyq7adOnVq/4u5f/SjH23xdrfddts2z9XX15fvf//7W709ADu3qVOnJnnuAcktPXukp6cn991332aXP/bYY0mSQw45ZMA3JUmee7OtgRx++OFJkvXr1+fHP/7xFufbuP20adMGvH79+vVbfG1fVVX92Ru/30Yb53XmkDpQ6GAQvPWtb01XV1fWrVuXD33oQy+4QGzYsCHLli3r/7qrqysnnHBCkuTyyy8f8DV4t956a+68886tnuuAAw7I9OnTkzz37mXPPvvsC97+d7/73VZ/DwDq64QTTsjo0aOTJJ/+9KcHvM1VV1014Ourx4wZkyT5j//4jwHXve9///u5/fbbB8ycMmVK/5t1XXrppQO+w/K///u/Z+7cuUnS/y7RA/nUpz7V/xq+5/vnf/7n/tL5tre9bZPrNv7Mz1+PYahS6GAQdHV15XOf+1yS594a+eSTT87cuXP7F5gNGzbkwQcfzBVXXJHu7u5897vf3WT7WbNmpbm5Ob/85S9z8skn56GHHkry3COP//Zv/5b/83/+T7q6urZpts9//vPp7OzMww8/nCOPPDLf+ta3NimNTzzxRG688cb87//9v3PhhRdu0/cAoJ46Ojr67/u/+MUv5mMf+1j/g3srVqzIZz/72cycOTNjx47dbNsTTzwxSTJ//vy8//3v799u5cqVufbaa3PGGWdk3LhxW/zen/3sZ5MkP/nJT3LGGWfkN7/5TZJk3bp1+cpXvtJf4o4++uicdtppA2aMHDkyP/3pT/OOd7yj/+mZvb29+ad/+qecd955SZJTTz21/+MPNvpf/+t/9c++LQ+YwqAatE+8g53Atn6w+Eb/+I//WA0fPrw/o62trRo3blzV2traf1mS6l/+5V822/baa6+tmpqa+m8zZsyYqq2trUpSveIVr6iuvPLKbfpg8aqqqp/+9KfVhAkT+rObm5urcePGVe3t7ZvMde65527V/gCg/tatW1edccYZ/ff3w4YNq8aOHVs1NzdXSaqzzjqreuc731klqd73vvdtsu0f//Efb7KOdHV19W932GGHVZ///Oe3uHZVVVVdeeWVm6x9XV1dm6yjr3rVq6onnnhis+02frD4XnvtVV1zzTX9GWPHjt1kzT3kkEOqZ555ZsCf+aCDDuq/3dixY6u99tqr2muvvTb7EHNoNGfoYBD92Z/9WR566KF85CMfySGHHJK2trYsW7YsnZ2dOfzww/MXf/EXmTNnzoBPHXnve9+bO+64I6ecckp22223rFmzJnvttVf+6q/+Kvfcc8+Aj46+VMccc0wefvjhXH755Xnta1+brq6uLFu2LM3NzTn44INz5pln5itf+Ur/WUYAdh0tLS35t3/7t3zpS1/KEUcckfb29qxfvz6HH354vvSlL+WGG27of2ri7z9bZOPaMWXKlLS1taWvry+vetWr8pnPfCZ33HFHOjs7X/B7f/CDH8y9996bM888M3/wB3+QVatWpb29PUceeWSuuuqq/OxnP3vRj1R4//vfnx/84Ac58cQTM2zYsAwbNiyveMUrcskll+Suu+4a8CxhS0tL/t//+38599xzs88++2TlypVZuHBhFi5cmJ6enq3af7CjNVWVV3sCALBtqqrK5MmT8/jjj+eGG27IWWed1eiRcv311+ecc87JXnvtNWgfBQSN4gwdAADb7MYbb8zjjz+elpaWvO51r2v0OLDLUegAAHhBb3/72zN79uw888wz/Zc99dRTueyyy/Ke97wnSfLOd74zEydObNSIsMtqafQAAAAMbd///vdz0003JXnunSNbW1s3+aibY489NldddVWjxoNdmkIHAMAL+vu///t8//vfz89//vM8/fTT6enpyfjx4/PqV786f/zHf5yzzjorra2tjR4TdkneFAUAAKCmvIYOAACgphQ6AACAmlLoAAAAakqhAwAAqCmFDgAAoKYUOgAAgJraZQvd6tWrc/HFF+fAAw/MiBEj8vKXvzzvete78sQTTzR6tJ3S9OnT09TUtMX/brnllkaPWDv33XdfLrvsspx++umZNGlS/758Mddff32OOOKIdHZ2Zrfddssb3/jG3HnnnYMwcf1t7T6fOXPmCx73H//4xwdxenZV1rvBZb0rz3o3+Kx39bJLfrB4b29vjj/++Nx9992ZOHFiTj311DzyyCO57rrr8t3vfjd333139t1330aPuVN6y1veks7Ozs0u33PPPRswTb3NmjUr3/rWt7ZqmwsuuCBXX3112tvbc8IJJ6S3tzdz5szJD3/4w8yePTunnXbajhl2J7Et+zxJjjnmmOy///6bXX7YYYeVGAu2yHrXONa7cqx3g896Vy+7ZKG79NJLc/fdd+eoo47KD3/4w/473CuvvDIf/vCH8653vSu33357Y4fcSV1++eXZe++9Gz3GTuGoo47KlClTMm3atEybNi1777131qxZs8Xb33rrrbn66qszbty43HXXXTnggAOSJHfddVemT5+ec845J9OnT09XV9cg/QT1s7X7fKNzzz03Z5999o4fEH6P9a5xrHflWO8Gn/WuZqpdzJo1a6oxY8ZUSap58+Ztdv2UKVOqJNW9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e2tzsaxqZlUsa2d23rT9Gj3CLqXoMf61DxXLKqG7+/+3zdsWOUN333335bLLLsvpp5+eSZMmpampKU1NTS+63fXXX58jjjginZ2d2W233fLGN74xd955Z4mRAAAAdnpFztDNmjUr3/rWt7ZqmwsuuCBXX3112tvbc8IJJ6S3tzdz5szJD3/4w8yePTunnXZaidEAAAB2WkUK3VFHHZUpU6Zk2rRpmTZtWvbee++sWbNmi7e/9dZbc/XVV2fcuHG56667csABByRJ7rrrrkyfPj3nnHNOpk+fnq6urhLjAQAA7JSKFLoLL7xwq25/5ZVXJkkuuuii/jKXPFcM/+zP/ix///d/ny9/+cv58Ic/XGI8AACAndKgv8vl6tWrc9tttyVJzjjjjM2u33jZd77znUGdCwAAoG4GvdA99NBDWbNmTcaPH59JkyZtdv3UqVOTJA888MBgjwYAAFArg17oHn300SQZsMwlSUdHR7q6urJ06dKsWLFiMEcDAAColUH/HLqenp4kyciRI7d4m46OjixbtiwrVqzIqFGjXjSzu7t7wMsXLFiQ/fbz+SAA7BysdwD8vkE/QwcAAEAZg36GrrOzM0myatWqLd5m5cqVSfKSzs4lyfz58we8fEuPZAJAHVnvAPh9g36GbvLkyUmSxx9/fMDrV65cmWXLlmXs2LEvudABAADsiga90B100EFpa2vL4sWL88QTT2x2/bx585IkU6ZMGezRAAAAamXQC117e3uOP/74JMnXvva1za6fPXt2kuSUU04Z1LkAAADqpiFvivKhD30oSXLppZfmV7/6Vf/ld911V6699tp0dXXl3e9+dyNGAwAAqI0ib4ryve99L7Nmzer/eu3atUmSI488sv+yGTNm5OSTT06SvO51r8v555+fq6++Oq9+9avz+te/PmvXrs2cOXNSVVWuu+66dHV1lRgNAABgp1Wk0C1evDhz587d7PLnX7Z48eJNrvvc5z6XV7/61bnmmmsyZ86cDB8+PK973esyY8aMHH300SXGAgAA2Kk1VVVVNXqIHWXj2zhv6W2eARja3I+/NPYTQL1tz/24DxYHAACoKYUOAACgphQ6AACAmlLoAAAAakqhAwAAqCmFDgAAoKYUOgAAgJpS6AAAAGpKoQMAAKgphQ4AAKCmFDoAAICaUugAAABqSqEDAACoKYUOAACgphQ6AACA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e_orig, g2e_orig, orb_sym_orig = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "g2e_orig = driver.unpack_g2e(g2e_orig, n_sites=ncas)\n", "\n", "minfos = {}\n", "for method in [\"fiedler\", \"gaopt\"]:\n", " idx = driver.orbital_reordering(h1e_orig, g2e_orig, method=method)\n", " h1e = h1e_orig[idx][:, idx]\n", " g2e = g2e_orig[idx][:, idx][:, :, idx][:, :, :, idx]\n", " orb_sym = np.array(orb_sym_orig)[idx]\n", "\n", " driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym)\n", " mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", " ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", " energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", " print('Method = %s DMRG energy = %20.15f' % (method, energy))\n", " minfos[method] = driver.get_orbital_interaction_matrix(ket)\n", "\n", "import matplotlib.pyplot as plt\n", "f, axs = plt.subplots(1, 2, sharey=True)\n", "f.set_size_inches(w=14 / 2, h=7 / 2)\n", "for ax, (method, minfo) in zip(axs, minfos.items()):\n", " ax.matshow(minfo, cmap='ocean_r')\n", " ax.set_title(method)\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "hO_incWgCMHO" }, "source": [ "The orbital reordering can also be done implicitly using the ``reorder`` argument in ``DMRGDriver.get_qc_mpo``. ``pyblock2`` will automatically recover the original ordering for observables, whenever possible, such as $N$-PDMs. But ordering for quantities like bipartite/orbital entropy are not recovered (kept as the computational ordering since they are indicators of the orbital topology). In order to avoid any confusion, this implicit reordering approach is not recommended unless only the ground state energy and $N$-PDMs are needed.\n", "\n", "Implicit orbital reordering using ``gaopt`` in the ``SZ`` mode:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mXC8qDnUDq3S", "outputId": "c0997487-f0b4-40d2-d7f5-1269a381c9ac" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.869 | E = -107.6541224475 | DW = 4.11e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.480 | E = -107.6541224475 | DE = -1.18e-11 | DW = 4.28e-11\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.116 | E = -107.6541224475 | DE = -2.10e-12 | DW = 4.13e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.707 | E = -107.6541224475 | DE = -1.42e-13 | DW = 4.76e-11\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.456 | E = -107.6541224475 | DE = -8.53e-14 | DW = 1.46e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.258 | E = -107.6541224475 | DE = 5.68e-14 | DW = 1.22e-14\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.046 | E = -107.6541224475 | DE = 0.00e+00 | DW = 2.52e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.088 | E = -107.6541224475 | DE = -5.68e-14 | DW = 1.21e-14\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 6.794 | E = -107.6541224475 | DE = 0.00e+00 | DW = 4.16e-20\n", "\n", "DMRG energy = -107.654122447523960\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, reorder=\"gaopt\", iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('DMRG energy = %20.15f' % energy)" ] }, { "cell_type": "markdown", "metadata": { "id": "TbWG2pgsEDiR" }, "source": [ "One can also run a small bond dimension DMRG with the default orbital ordering to get the mutual information for orbital correlation, then use this matrix as the cost function to get the orbital ordering for doing more efficient DMRG (this is supported in the ``SZ`` and ``SGF`` modes). See the following example.\n", "\n", "In the ``SGF`` mode (using the mutual information as the cost function):" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "z4Y0CyVpEbUv", "outputId": "73ebb4e9-2c8e-4fac-be9c-b135dd8b2867" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 50 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 0.790 | E = -107.6461019596 | DW = 1.12e-04\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 50 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.199 | E = -107.6518646319 | DE = -5.76e-03 | DW = 8.45e-05\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 50 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.658 | E = -107.6524131412 | DE = -5.49e-04 | DW = 4.76e-05\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 50 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.123 | E = -107.6524673390 | DE = -5.42e-05 | DW = 4.58e-05\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 50 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.589 | E = -107.6525301747 | DE = -6.28e-05 | DW = 3.18e-05\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 50 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.076 | E = -107.6525427750 | DE = -1.26e-05 | DW = 3.17e-05\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 50 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.514 | E = -107.6525457470 | DE = -2.97e-06 | DW = 3.25e-05\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 50 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.945 | E = -107.6525492373 | DE = -3.49e-06 | DW = 3.25e-05\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 50 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 4.315 | E = -107.6525424769 | DE = 6.76e-06 | DW = 2.77e-05\n", "\n", "Sweep = 9 | Direction = backward | Bond dimension = 50 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 4.642 | E = -107.6525448992 | DE = -2.42e-06 | DW = 2.79e-05\n", "\n", "ATTENTION: DMRG is not converged to desired tolerance of 1.00e-08\n", "Approx DMRG energy = -107.652544899236361\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.878 | E = -107.6541143612 | DW = 4.90e-10\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.658 | E = -107.6541224474 | DE = -8.09e-06 | DW = 2.78e-08\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.499 | E = -107.6541224475 | DE = -1.10e-10 | DW = 4.87e-10\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.253 | E = -107.6541224475 | DE = 1.76e-12 | DW = 2.78e-08\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.260 | E = -107.6541224475 | DE = -3.67e-12 | DW = 7.63e-20\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.300 | E = -107.6541224475 | DE = -5.68e-14 | DW = 9.52e-12\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 7.397 | E = -107.6541224475 | DE = 1.42e-12 | DW = 8.05e-20\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.455 | E = -107.6541224475 | DE = 1.14e-13 | DW = 9.44e-12\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 9.077 | E = -107.6541224475 | DE = 3.27e-12 | DW = 2.36e-20\n", "\n", "Method = fiedler DMRG energy = -107.654122447518702\n", "\n", "Sweep = 0 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.205 | E = -107.6541223034 | DW = 1.54e-09\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.032 | E = -107.6541224434 | DE = -1.40e-07 | DW = 2.01e-09\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.921 | E = -107.6541224475 | DE = -4.10e-09 | DW = 1.56e-09\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 250 | Noise = 1.00e-04 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.728 | E = -107.6541224475 | DE = 2.64e-12 | DW = 2.01e-09\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.899 | E = -107.6541224475 | DE = -5.54e-12 | DW = 1.05e-13\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.131 | E = -107.6541224475 | DE = 2.84e-14 | DW = 3.63e-14\n", "\n", "Sweep = 6 | Direction = forward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 8.302 | E = -107.6541224475 | DE = 0.00e+00 | DW = 1.05e-13\n", "\n", "Sweep = 7 | Direction = backward | Bond dimension = 500 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 11.248 | E = -107.6541224475 | DE = -5.68e-14 | DW = 3.58e-14\n", "\n", "Sweep = 8 | Direction = forward | Bond dimension = 500 | Noise = 0.00e+00 | Dav threshold = 1.00e-09\n", "Time elapsed = 12.502 | E = -107.6541224475 | DE = 0.00e+00 | DW = 3.66e-20\n", "\n", "Method = gaopt DMRG energy = -107.654122447523818\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3QAAAHZCAYAAADOjXmiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAABcSAAAXEgFnn9JSAAA0e0lEQVR4nO3de5RddX03/vckM5NMJpcJGEgkTbgjRgIEgkAWklJFMKUgl1oVbFBqpdiKYIsK0ZSgYh8IomgXrT5E0FVaY8UHfaCEIj4KJEgiYiOFNkq4SCRgQu63yf794S9TQiZAwpc5szOv11pZi9n77M98zmbP+Zz32efs01RVVRUAAABqp1+jGwAAAGDnCHQAAAA1JdABAADUlEAHAABQUwIdAABATQl0AAAANSXQAQAA1JRABwAAUFMCHQAAQE0JdAAAADUl0AEAANSUQAcAAFBTAh0AAEBNCXQAAAA1JdDBDurs7MzMmTNz+OGHp729PU1NTWlqasott9ySyZMnp6mpKdOnT+/xvmbNmpWmpqbsvffe26ybPn16mpqaMnny5B7vCwCA105zoxuAurnwwgtz3XXXJUlaW1uz5557JkkGDhzYyLYAgELuvvvu3H333dl7770zderURrcDL8kZOtgBK1euzPXXX58k+bu/+7usW7cuS5YsyZIlS3LSSSdlzJgxOeigg/K6172uwZ0CADvr7rvvzt/+7d9m1qxZjW4FXpYzdLAD/vM//zMbN25Mkpx//vlpamraav2NN97YiLYAAOijnKGDHbBmzZqu/x48eHADOwEAAIEOXpEtFxx54UVFtlwM5YXLX8lFUf7jP/4jH/zgB3PAAQdk0KBBGTx4cMaPH59LL700zz777Ev2MXfu3Jx22ml53etel7a2thx00EG59NJLs2rVqld9H5cuXZrLLrsshx9+eIYNG5aBAwdm3333zQc+8IEsXLiw223uvvvurn2QJD/96U/z3ve+N6NHj05LS4uLsADsIqqqyg033JBjjjkmQ4YMybBhw/LmN785//AP/5CqqjJ16tQ0NTVt83mzJUuW5Etf+lJOPfXUHHzwwRk2bFja2tqy//7757zzztvufHmhn/70p3nf+96XsWPHZuDAgRk+fHiOPfbYfOELX8j69eu73ebFFwqbM2dOTj755IwYMSJtbW0ZN25crrjiiqxbt26r7R577LE0NTXlb//2b5MkP/zhD7ea901NTd6GSe9TAS/r5ptvrvbcc89q+PDhVZIqSbXnnnt2/XvnO99ZVVVVHX/88VWS6tOf/nS3dT7/+c9X/fr166oxaNCgqrW1tevnUaNGVQsWLOh226997WtbbTts2LCubd/whjdUM2fOrJJUY8eO3WbbT3/601WS6vjjj++29pw5c6qOjo6u2i0tLVV7e3vXz62trdXXv/71bbb7wQ9+0HWb2bNnVy0tLVWSaujQodXAgQO3+/sAqI9NmzZV73rXu7oe75uamqrhw4d3zaR3v/vd1Z/+6Z9WSao//dM/3WrbLcuTVM3NzdVuu+1WNTc3dy0bMGBANXv27O3+7pkzZ1ZNTU1bzb4tsyZJNX78+OrXv/71NtvdcMMNXTPxy1/+cleNjo6OrX7/4YcfXv32t7/t2u7xxx+v9txzz64Z2NLSstW833PPPaubb7652L6FEgQ62AEvDDDdealA99WvfrVKUg0ePLj6zGc+Uz399NNVVf1uUD7wwAPVCSecUCWpRo8eXa1cuXKrbefPn981gCZPnlw9/PDDVVVV1YYNG6p/+qd/qjo6OroC2Y4Guoceeqhqa2urklR/9md/Vv3iF7+oNm3aVFVVVS1evLj6i7/4i65B/JOf/GS7+2Pw4MHVO97xjq7eqqqqHn300e3uSwDq4XOf+1zXY/1FF11UPfvss1VVVdXzzz9fffazn+0KeN0FuhkzZlT/63/9r+rnP/95tXHjxqqqqqqzs7P6j//4j+q9731vlaRqb2+vnnrqqW1+76233tr1e0899dTql7/8ZVVVVbV+/frqxhtvrIYMGVIlqY499tiuubXFlkA3aNCgqqWlpTrrrLOqxx9/vKqqqlqzZk3193//99WAAQOqJF0vyr7Qy70QCr2JQAc7YGcD3YoVK7oC1+23397tths3bqyOOOKIKkl1zTXXbLXu5JNPrpJUBx54YLVmzZpttr399tu7+trRQLclSH7iE5/otq+qqqq/+qu/6hqoL/TC/XHUUUdtM1ABqLdVq1ZVQ4cOrZJUH/jAB7q9zZYZ012gezlTpkypklQzZszYZt3BBx9cJamOO+64bufL//k//6fr937rW9/aat2WQLdl9nV2dm6z/ZYXWpNU999/f7f3SaCjDnyGDnrAt7/97SxfvjyHH3543v72t3d7m+bm5rz73e9Okvzbv/1b1/Lly5d3/fzXf/3XaWtr22bbt7/97TnmmGN2uK/HHnssd911V5qbm/Oxj31su7d73/velyS5884709nZ2e1t/vqv/zr9+/ff4R4A6L3uuOOOrFixIkly6aWXdnubiy++OIMGDdqp+lOmTEmS/PjHP95q+UMPPZSHH344SXLZZZd1O19OOeWUHHXUUUmSf/qnf9ru77jsssvSr9+2T3nPPffcjB49Okly880371T/0Bv42gLoAffcc0+S5OGHH87IkSO3e7u1a9cmSRYvXty1bMGCBdm8eXOS5IQTTtjutieccELuu+++nepr8+bNeeMb37jd220JcatXr85zzz2XPfbYY5vbTJo0aYd+NwC934IFC5IkY8aMyT777NPtbYYMGZIjjjgiP/rRj7pd/7Of/SzXX399fvzjH+exxx7LqlWrUlXVVrd58sknt/r5gQceSPK7FzuPP/747fb3tre9Lffff3/X7V+subk5xx13XLfr+vXrl8mTJ+cb3/jGdreHOhDooAf8+te/TpKsW7dumytqdeeFX4/wzDPPdP33Xnvttd1ttrzKuDN9bd68Ob/5zW9e0TYv7O2Fugt5ANTb0qVLkySvf/3rX/J225tP1113XT7ykY90vTDZ1NSUYcOGZcCAAUl+90LmihUrsnr16q222zL7Xve613XdtjtbZt8LZ+ULvdz2W/re3vZQB95yCT1gyxmud73rXal+99nVl/z32GOP9Whfe+655yvqq6qqrktAv5i3WwLsurZ8Pc2OePjhh3PhhRdm8+bNOeuss3L//fdn3bp1WbZsWZYsWZIlS5Zk5syZSbLNGTvglRPooAdseZvlC99K+Uq98MzXU089td3bvdS6l+vr2Wef3ebVUQAYMWJEkv95R8f2dDeDZs+enc7Ozhx88MG5+eabM3HixLS2tm51myVLlnRbb8vse/bZZ7f7XXPJ/7xVc3vvEnn22WezYcOGl+3bu0yoM4EOesCWz5fNnz8/Tz/99A5tO2HChK4Pc//gBz/Y7u3uuuuune6rs7Mzt9122w5vD8CubcKECUl+94Lk9t49smrVqsyfP3+b5U888USS5NBDD+32oiTJ7y621Z0jjzwySbJp06b88Ic/3G5/W7afOHFit+s3bdq03c/2VVXVVXvL79tiS7/OHFIHAh30gLPOOisdHR3ZuHFjLrroopccEJs3b87y5cu7fu7o6MiJJ56YJLnqqqu6/QzenXfemXvvvXeH+zrggAMyefLkJL+7etnzzz//krf/7W9/u8O/A4D6OvHEEzN06NAkyWc/+9lub3PNNdd0+/nqYcOGJUl+/vOfdzv3brvtttx9993d1hw/fnzXxbquuOKKbq+w/H//7//NvHnzkqTrKtHd+cxnPtP1Gb4X+vrXv94VOt/1rndttW7LfX7hPIbeSqCDHtDR0ZEvfOELSX53aeQpU6Zk3rx5XQNm8+bNefjhh3P11Vdn3Lhx+d73vrfV9jNmzEj//v3zn//5n5kyZUoeeeSRJL975fFf/uVf8sd//Mfp6OjYqd6+9KUvZfDgwXn00Udz9NFH57vf/e5WofGpp57KTTfdlD/4gz/IJZdcslO/A4B6am9v73rs/8d//Mf8zd/8TdeLeytXrsznP//5TJ8+PcOHD99m25NOOilJsnDhwlxwwQVd261evTrXX399zjzzzOy+++7b/d2f//znkyQ/+tGPcuaZZ+ZXv/pVkmTjxo355je/2RXijj322Jx22mnd1hg0aFB+/OMf5z3veU/X2zPXrVuXf/iHf8j555+fJDn11FO7vv5gize96U1dve/MC6bQo3rsG+9gF7CzXyy+xd///d9Xra2tXTUGDBhQ7b777lVLS0vXsiTVN77xjW22vf7666umpqau2wwbNqwaMGBAlaR6wxveUM2cOXOnvli8qqrqxz/+cTVy5Miu2v3796923333qq2tbau+zjvvvB3aHwDU38aNG6szzzyz6/G+X79+1fDhw6v+/ftXSapzzjmnet/73lclqf78z/98q23/5E/+ZKs50tHR0bXdEUccUX3pS1/a7uyqqqqaOXPmVrOvo6Njqzl6yCGHVE899dQ22235YvGxY8dW1113XVeN4cOHbzVzDz300OrZZ5/t9j4fdNBBXbcbPnx4NXbs2Grs2LHbfIk5NJozdNCDPvShD+WRRx7Jxz72sRx66KEZMGBAli9fnsGDB+fII4/MX/7lX2bOnDndvnXkgx/8YO65556ccsop2W233bJ+/fqMHTs2n/jEJ3L//fd3++roKzVp0qQ8+uijueqqq/KWt7wlHR0dWb58efr375+DDz44Z599dr75zW92nWUEoO9obm7Ov/zLv+SrX/1qjjrqqLS1tWXTpk058sgj89WvfjU33nhj11sTX/xukS2zY/z48RkwYEA6OztzyCGH5HOf+1zuueeeDB48+CV/90c/+tE88MADOfvss/N7v/d7WbNmTdra2nL00UfnmmuuyU9+8pOX/UqFCy64IP/2b/+Wk046Kf369Uu/fv3yhje8IZdffnnuu+++bs8SNjc359///d9z3nnnZZ999snq1auzePHiLF68OKtWrdqh/Qevtaaq8mlPAAB2TlVVGTNmTJ588snceOONOeeccxrdUmbNmpVzzz03Y8eO7bGvAoJGcYYOAICddtNNN+XJJ59Mc3Nz3vrWtza6HehzBDoAAF7Su9/97syePTvPPvts17Lf/OY3ufLKK/Nnf/ZnSZL3ve99GTVqVKNahD6rudENAADQu9122225+eabk/zuypEtLS1bfdXNcccdl2uuuaZR7UGfJtABAPCSvvjFL+a2227LT3/60zzzzDNZtWpVRowYkcMOOyx/8id/knPOOSctLS2NbhP6JBdFAQAAqCmfoQMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgpvpsoFu7dm0+9alP5cADD8zAgQPz+te/Pu9///vz1FNPNbq1XdLkyZPT1NS03X+33357o1usnfnz5+fKK6/M6aefntGjR3fty5cza9asHHXUURk8eHB22223vOMd78i9997bAx3X347u8+nTp7/kcf/xj3+8B7unrzLvepZ5V5551/PMu3rpk18svm7dupxwwgmZO3duRo0alVNPPTWPPfZYbrjhhnzve9/L3Llzs++++za6zV3SGWeckcGDB2+zfK+99mpAN/U2Y8aMfPe7392hbS688MJce+21aWtry4knnph169Zlzpw5ueOOOzJ79uycdtppr02zu4id2edJMmnSpOy///7bLD/iiCNKtAXbZd41jnlXjnnX88y7eumTge6KK67I3Llzc8wxx+SOO+7oesCdOXNmLr744rz//e/P3Xff3dgmd1FXXXVV9t5770a3sUs45phjMn78+EycODETJ07M3nvvnfXr12/39nfeeWeuvfba7L777rnvvvtywAEHJEnuu+++TJ48Oeeee24mT56cjo6OHroH9bOj+3yL8847L1OnTn3tG4QXMe8ax7wrx7zreeZdzVR9zPr166thw4ZVSaoFCxZss378+PFVkuqBBx5oQHe7ruOPP75KUv3qV79qdCu7rAEDBlQv9Sd98sknV0mqa665Zpt1f/VXf1Ulqa666qrXsMNdz8vt809/+tNVkuqGG27ouabg/2feNYZ599oz73qeede79bnP0N1zzz15/vnns99+++Xwww/fZv2ZZ56ZJLn11lt7ujV4zaxduzZ33XVXkv85xl/IcQ+7HvOOvsi8oy/qc2+5/NnPfpYkmTBhQrfrtyx/6KGHeqynvuRrX/tannvuufTr1y8HHnhgTjvttIwZM6bRbe3yHnnkkaxfvz4jRozI6NGjt1nvuH9t3XXXXXnwwQezbt26jB49OieffLLPE/CaM+8ay7xrDPOuscy7xuhzge7xxx9Pkm7/yF+4fPHixT3WU19yxRVXbPXzxz72sUybNi3Tpk1rUEd9w8sd9+3t7eno6MiyZcuycuXKDBkypCfb2+XddNNNW/08bdq0nHHGGZk1a1a3F02AEsy7xjLvGsO8ayzzrjH63FsuV61alSQZNGhQt+vb29uTJCtXruyxnvqCt7zlLbnpppuyaNGirFmzJo888kg+85nPpLm5OZ/61Kdy7bXXNrrFXdrLHfeJY/+1sP/+++eqq67KwoULs2rVqjzxxBP55je/mb322ivf/va3c8455zS6RXZh5l1jmHeNZd41hnnXWH3uDB2Ncfnll2/184EHHphPfvKTOfLII/P2t78906dPzwc/+MG0tbU1qEMo7+yzz97q5/b29rznPe/J7//+7+eQQw7JLbfckrlz5+boo49uUIdAaeYdfZF511h97gzdltO9a9as6Xb96tWrk8Qp+B5y4okn5sgjj8zy5cszb968Rrezy3q54z5x7PekUaNG5dxzz00SXzLMa8a8613Mu55h3vUu5l3P6HOBbssHkp988slu129ZPnbs2B7rqa/b8v0wTz/9dIM72XW93HG/evXqLF++PMOHDzfgeojjnteaedf7+Lt/7Zl3vY/j/rXX5wLdoYcemiRZsGBBt+u3LB8/fnyP9dTXLVu2LMn/vKed8g466KAMGDAgS5cuzVNPPbXNesd9z3Pc81oz73off/evPfOu93Hcv/b6XKCbNGlShg0blkWLFuXBBx/cZv3s2bOTJKecckoPd9Y3LV26ND/60Y+SbP/S2rx6bW1tOeGEE5Ik3/rWt7ZZ77jvWVVV5Tvf+U4Sxz2vHfOudzHveoZ517uYdz2k0d9s3giXXnpplaQ69thjq1WrVnUtv/rqq6sk1fHHH9+45nZB99xzT/Wd73yn2rRp01bLf/WrX1WTJk2qklR/9Ed/1KDudh0DBgyoXupPes6cOVWSavfdd68effTRruX33ntvNWDAgKqjo6NatmxZD3S663ipff7MM89U1113XbVixYqtlq9cubL68z//8ypJNXLkyGr16tU90Sp9lHnXs8y7nmHe9TzzrndrqqqqakSQbKR169Zl8uTJmTdvXkaNGpXjjjsuixcvzrx58zJixIjMnTs3++67b6Pb3GXMmjUr5557bkaOHJkJEyako6Mjixcvzvz587Nu3bqMGzcud911V/bYY49Gt1or3//+9zNjxoyun++///5UVZU3v/nNXcumTZuWKVOmdP184YUX5tprr82gQYPytre9LRs2bMicOXNSVVVmz56d0047rSfvQu3syD5/7LHHss8++2Tw4MGZOHFiRo0alaVLl2bBggV57rnn0tHRke9973uZNGlSI+4KfYR517PMu9eGedfzzLuaaVyWbKw1a9ZU06ZNq/bbb7+qtbW1GjlyZDV16tTqiSeeaHRru5xf/OIX1fnnn19NmDChGjFiRNXc3FwNGzasOvroo6urr766WrNmTaNbrKUbbrihSvKS/2644YZutzviiCOqQYMGVR0dHdVJJ51U3XPPPT1/B2poR/b5ihUrqksuuaQ6/vjjq7322qsaMGBANWjQoGrcuHHVxRdfXD355JONvTP0GeZdzzHvXhvmXc8z7+qlT56hAwAA2BX0uYuiAAAA7CoEOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgpgQ6AACAmhLoAAAAaqrPB7px48Zl3LhxjW6jT7HPe5b93fPsc3ojx2XPs897lv3d8+zz3qHPBzoAAIC6EugAAABqSqADAACoKYEOAACgpgQ6AACAmmqqqqpqdBOvlZEjR2b16tUZM2bMdm+zaNGiJMl+++3XU231efZ5z7K/e559Xs7jjz+e9vb2LFmypNGt9GrmXe9kn/cs+7vn2eflvJp5t0sHuiFDhmTjxo0OMoCaWrRoUVpaWrJy5cpGt9KrmXcA9fZq5l3za9DPDlm7dm0+97nP5eabb87jjz+e3XbbLSeddFJmzJiRvfba61XV3vJK5cKFC0u0CkAP8/1Gr4x5B1Bvr2be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Mccck/Hjx2fixImZOHFi9t5776xfv/5ltzvvvPMyderUEi0AAAD0OUUC3SWXXFKiDAAAADvARVEAAABqqqFfW3DXXXflwQcfzLp16zJ69OicfPLJPj8HAADwCjU00N10001b/Txt2rScccYZmTVrVgYPHvyK64wbN67b5YsWLcp+++33qnoEgN7CvAPgxRrylsv9998/V111VRYuXJhVq1bliSeeyDe/+c3stdde+fa3v51zzjmnEW0BAADUSkPO0J199tlb/dze3p73vOc9+f3f//0ccsghueWWWzJ37twcffTRr6jewoULu12+vVcyAaCOzDsAXqxXXRRl1KhROffcc5Mkt99+e4O7AQAA6N16VaBLkgMOOCBJ8vTTTze4EwAAgN6t1wW6ZcuWJfnd2zABAADYvl4V6Kqqyne+850kyYQJExrcDQAAQO/W44Fu6dKl+fKXv5yVK1dutXzVqlU5//zzM2/evIwcOTKnn356T7cGAABQK0Wucvn9738/M2bM6Pp5w4YNSbLVVSqnTZuWKVOmZPXq1fnwhz+cj3/845k4cWJGjRqVpUuXZsGCBXnuuefS0dGR2bNnZ9CgQSVaAwAA2GUVCXRLly7NvHnztln+wmVLly5Nkuy+++655JJLMnfu3Dz66KO59957079//+yzzz6ZOnVqPvrRj2avvfYq0RYAAMAurUigmzp1aqZOnfqKbjtkyJBceeWVJX4tAABAn9aQLxanjA2dm4vV6t/UVKTOc2s3FKmTJG3N/YvUKdlTqf00pLXcn94zq9cXqdPav9xHav/ytp8WqXPS/iOL1EmSt4wdUaROyeNp9NC2InWeX7exSB3oC0o+1pVSaias3LCpSJ2StUrOu97YU6nnYiV7+tCR+xWps7zgbOkY2FKkzif//edF6iTJl04+vEidUsfAq3mO2fse1QAAAHhFBDoAAICaEugAAABqSqADAACoKYEOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKYEOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgppob3UBftKFzc5E6rf3L5fGn164rUqdjQEuROkmycsOmInVK9rS+0P+75es3FqmTJG3N/YvUKXVcJsln/+CQInVWFToGkuST//7zInVO2n9kkTpJ8vy6MsfBuD2GFqkDvHIlHzNLzZYhreWe1pWaU6VmeZJ0VlWROiV7KrXPSx0DSTJm2KAidZ5asbZInaTcDP7KlAlF6iTJk4Xu34KnlxWps2rjpp0+npyhAwAAqCmBDgAAoKYEOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKYEOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmmhvdQF/U2r/35ehRgwc2uoVttLX0b3QL2yjVU0daitTZ1XUMLLefvjJlQrFaACVn+ZqNnUXqdFZVkTpJsntba5E6JffThs7NReqU7GnVhk3FapUyoND9W7RsVZE6SfKlkw8vUufJFWuL1EmS0UPbitQZ3FomTrW/iueYvS9ZAAAA8IoIdAAAADUl0AEAANSUQAcAAFBTAh0AAEBNCXQAAAA1JdABAADUlEAHAABQUwIdAABATQl0AAAANSXQAQAA1JRABwAAUFMCHQAAQE0JdAAAADUl0AEAANSUQAcAAFBTAh0AAEBNNTe6AQCAvqxjYEuROhs6NxepU7LWmo2dReokSXO/piJ1SvY0qKV/kTqDW8udY+ncXBWpM2HU8CJ1knLH04KnlxWpkySDW8vEoFJ/v/2adv74doYOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKYEOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKaaqqqqGt3Ea2XIkCHZuHFj9ttvv0a3AsBOWLRoUVpaWrJy5cpGt9KrmXckSckndOWeHZbsqqlQnXI9NTWV6anUPStp0+Zy+6l/of20auOmInWSpL2lf5E6/Qrdt1cz75qLdNBLtbe3Z/Xq1S95m0WLFiWJIdiD7POeZX/3PPu8nJaWlrS3tze6jV7PvOudenqflwwFhZ6jpiejyivf370xPvU+zf1efj/19DE+pHXXjS6vZt7t0mfoXolx48YlSRYuXNjgTvoO+7xn2d89zz6nN3Jc9jz7vGfZ3z3PPu8dfIYOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKb6/FUuAQAA6soZOgAAgJoS6AAAAGpKoAMAAKgpgQ4AAKCmBDoAAICaEugAAABqSqADAACoKYEOAACgpgQ6AACAmhLoAAAAakqgAwAAqCmBDgAAoKYEOgAAgJoS6AAAAGrq/wPX1P4sxhqfRwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.GHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e_orig, g2e_orig, orb_sym_orig = itg.get_ghf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SGF, n_threads=4)\n", "g2e_orig = driver.unpack_g2e(g2e_orig, n_sites=ncas)\n", "\n", "# approx DMRG to get orbital_interaction_matrix\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, orb_sym=orb_sym_orig)\n", "mpo = driver.get_qc_mpo(h1e=h1e_orig, g2e=g2e_orig, ecore=ecore, iprint=0)\n", "ket = driver.get_random_mps(tag=\"GS\", bond_dim=50, nroots=1)\n", "energy = driver.dmrg(mpo, ket, n_sweeps=10, bond_dims=[50] * 8, noises=noises,\n", " thrds=thrds, iprint=1)\n", "print('Approx DMRG energy = %20.15f' % energy)\n", "minfo_orig = driver.get_orbital_interaction_matrix(ket)\n", "\n", "minfos = {}\n", "for method in [\"fiedler\", \"gaopt\"]:\n", " idx = driver.orbital_reordering_interaction_matrix(minfo_orig, method=method)\n", " h1e = h1e_orig[idx][:, idx]\n", " g2e = g2e_orig[idx][:, idx][:, :, idx][:, :, :, idx]\n", " orb_sym = np.array(orb_sym_orig)[idx]\n", "\n", " driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", " mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", " ket = driver.get_random_mps(tag=\"GS\", bond_dim=250, nroots=1)\n", " energy = driver.dmrg(mpo, ket, n_sweeps=20, bond_dims=bond_dims, noises=noises,\n", " thrds=thrds, iprint=1)\n", " print('Method = %s DMRG energy = %20.15f' % (method, energy))\n", " minfos[method] = driver.get_orbital_interaction_matrix(ket)\n", "\n", "import matplotlib.pyplot as plt\n", "f, axs = plt.subplots(1, 2, sharey=True)\n", "f.set_size_inches(w=14 / 2, h=7 / 2)\n", "for ax, (method, minfo) in zip(axs, minfos.items()):\n", " ax.matshow(minfo, cmap='ocean_r')\n", " ax.set_title(method)\n", "plt.gcf().set_dpi(150)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "reC2RWqDOihl" }, "source": [ "## Excited States\n", "\n", "To obtain the excited states and their energies, we can perform DMRG for a state-averged MPS, optionally followed by a state-specific refinement." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "A2BXFBnJ3baF", "outputId": "6ee875b1-7c1f-4b2f-a44a-d5114b372cef" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sweep = 0 | Direction = forward | Bond dimension = 100 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 1.873 | E[ 3] = -107.6541184424 -107.0314355209 -106.9595839138 | DW = 8.49e-05\n", "\n", "Sweep = 1 | Direction = backward | Bond dimension = 100 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 2.807 | E[ 3] = -107.6541184424 -107.0314355209 -106.9595839138 | DE = -1.51e-11 | DW = 1.61e-04\n", "\n", "Sweep = 2 | Direction = forward | Bond dimension = 100 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 3.640 | E[ 3] = -107.6541138875 -107.0314486179 -106.9594564029 | DE = 1.28e-04 | DW = 7.20e-05\n", "\n", "Sweep = 3 | Direction = backward | Bond dimension = 100 | Noise = 1.00e-05 | Dav threshold = 1.00e-10\n", "Time elapsed = 4.520 | E[ 3] = -107.6541138875 -107.0314486178 -106.9594564029 | DE = -9.18e-12 | DW = 1.47e-04\n", "\n", "Sweep = 4 | Direction = forward | Bond dimension = 100 | Noise = 0.00e+00 | Dav threshold = 1.00e-10\n", "Time elapsed = 5.353 | E[ 3] = -107.6540972369 -107.0314487272 -106.9594391430 | DE = 1.73e-05 | DW = 6.81e-05\n", "\n", "Sweep = 5 | Direction = backward | Bond dimension = 100 | Noise = 0.00e+00 | Dav threshold = 1.00e-10\n", "Time elapsed = 6.315 | E[ 3] = -107.6540972369 -107.0314487272 -106.9594391430 | DE = -1.78e-11 | DW = 1.43e-04\n", "\n", "State-averaged MPS energies = [-107.654097236858902 -107.031448727151187 -106.959439143016382]\n", "State-specific MPS E[0] = -107.654122447521317\n", "State-specific MPS E[1] = -107.031449471624697\n", "State-specific MPS E[2] = -106.959626154671795\n" ] } ], "source": [ "from pyscf import gto, scf\n", "\n", "mol = gto.M(atom=\"N 0 0 0; N 0 0 1.1\", basis=\"sto3g\", symmetry=\"d2h\", verbose=0)\n", "mf = scf.RHF(mol).run(conv_tol=1E-14)\n", "ncas, n_elec, spin, ecore, h1e, g2e, orb_sym = itg.get_rhf_integrals(mf,\n", " ncore=0, ncas=None, g2e_symm=8)\n", "\n", "driver = DMRGDriver(scratch=\"./tmp\", symm_type=SymmetryTypes.SZ, n_threads=4)\n", "driver.initialize_system(n_sites=ncas, n_elec=n_elec, spin=spin, orb_sym=orb_sym)\n", "\n", "mpo = driver.get_qc_mpo(h1e=h1e, g2e=g2e, ecore=ecore, iprint=0)\n", "\n", "ket = driver.get_random_mps(tag=\"KET\", bond_dim=100, nroots=3)\n", "energies = driver.dmrg(mpo, ket, n_sweeps=10, bond_dims=[100], noises=[1e-5] * 4 + [0],\n", " thrds=[1e-10] * 8, iprint=1)\n", "print('State-averaged MPS energies = [%s]' % \" \".join(\"%20.15f\" % x for x in energies))\n", "\n", "kets = [driver.split_mps(ket, ir, tag=\"KET-%d\" % ir) for ir in range(ket.nroots)]\n", "for ir in range(ket.nroots):\n", " energy = driver.dmrg(mpo, kets[ir], n_sweeps=10, bond_dims=[200], noises=[1e-5] * 4 + [0],\n", " thrds=[1e-10] * 8, iprint=0, proj_weights=[5.0] * ir, proj_mpss=kets[:ir])\n", " print('State-specific MPS E[%d] = %20.15f' % (ir, energy))" ] } ], "metadata": { "colab": { "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }