diff --git a/examples/example.fcidump b/examples/example.fcidump new file mode 100644 index 0000000..4e0331f --- /dev/null +++ b/examples/example.fcidump @@ -0,0 +1,115 @@ + &FCI NORB= 4,NELEC= 4,MS2=0, + ORBSYM=1,1,1,1, + ISYM=1, + &END + 0.3499742123097077 1 1 1 1 + -2.498001805406602e-16 1 1 2 1 + 0.3187342023639617 1 1 2 2 + -0.05760857527185771 1 1 3 1 + -1.110223024625157e-16 1 1 3 2 + 0.3220240709613745 1 1 3 3 + 1.387778780781446e-16 1 1 4 1 + -0.05991995008750695 1 1 4 2 + -6.938893903907228e-18 1 1 4 3 + 0.3621561856539379 1 1 4 4 + -2.914335439641036e-16 2 1 1 1 + 0.1642654175746083 2 1 2 1 + 4.163336342344337e-17 2 1 2 2 + -5.551115123125783e-17 2 1 3 1 + 0.06981328566162441 2 1 3 2 + 2.012279232133096e-16 2 1 3 3 + -0.0304856292338336 2 1 4 1 + 6.938893903907228e-17 2 1 4 2 + 0.1683938036450707 2 1 4 3 + -4.85722573273506e-16 2 1 4 4 + 0.3187342023639616 2 2 1 1 + 1.387778780781446e-17 2 2 2 1 + 0.332316870291691 2 2 2 2 + 0.01754743835178967 2 2 3 1 + 1.387778780781446e-16 2 2 3 2 + 0.3353562107746392 2 2 3 3 + 8.326672684688674e-17 2 2 4 1 + 0.0152359076849083 2 2 4 2 + 8.326672684688674e-17 2 2 4 3 + 0.3306045769036404 2 2 4 4 + -0.05760857527185767 3 1 1 1 + -6.245004513516506e-17 3 1 2 1 + 0.01754743835178967 3 1 2 2 + 0.1276194809490623 3 1 3 1 + 1.665334536937735e-16 3 1 3 2 + 0.01816042619236698 3 1 3 3 + -8.326672684688674e-17 3 1 4 1 + 0.129061412900203 3 1 4 2 + -3.747002708109903e-16 3 1 4 3 + -0.06015443486773168 3 1 4 4 + -1.318389841742373e-16 3 2 1 1 + 0.06981328566162442 3 2 2 1 + 1.665334536937735e-16 3 2 2 2 + 1.665334536937735e-16 3 2 3 1 + 0.1460718360858071 3 2 3 2 + -6.938893903907228e-17 3 2 3 3 + 0.1039908809723566 3 2 4 1 + 3.469446951953614e-17 3 2 4 2 + 0.07291782739227803 3 2 4 3 + -3.261280134836397e-16 3 2 4 4 + 0.3220240709613745 3 3 1 1 + 2.081668171172169e-16 3 3 2 1 + 0.3353562107746392 3 3 2 2 + 0.01816042619236699 3 3 3 1 + -1.110223024625157e-16 3 3 3 2 + 0.3420576807178073 3 3 3 3 + -2.775557561562891e-16 3 3 4 1 + 0.01784240987907962 3 3 4 2 + 2.914335439641036e-16 3 3 4 3 + 0.3351920397593786 3 3 4 4 + 1.52655665885959e-16 4 1 1 1 + -0.0304856292338336 4 1 2 1 + 8.326672684688674e-17 4 1 2 2 + -8.326672684688674e-17 4 1 3 1 + 0.1039908809723566 4 1 3 2 + -2.567390744445674e-16 4 1 3 3 + 0.123330670470909 4 1 4 1 + -2.983724378680108e-16 4 1 4 2 + -0.0305887632454903 4 1 4 3 + 8.326672684688674e-17 4 1 4 4 + -0.05991995008750692 4 2 1 1 + 8.326672684688674e-17 4 2 2 1 + 0.01523590768490828 4 2 2 2 + 0.1290614129002031 4 2 3 1 + 4.85722573273506e-17 4 2 3 2 + 0.01784240987907961 4 2 3 3 + -2.983724378680108e-16 4 2 4 1 + 0.1321793953169099 4 2 4 2 + -2.498001805406602e-16 4 2 4 3 + -0.06336384545113198 4 2 4 4 + -2.081668171172169e-17 4 3 1 1 + 0.1683938036450707 4 3 2 1 + 1.318389841742373e-16 4 3 2 2 + -3.747002708109903e-16 4 3 3 1 + 0.07291782739227805 4 3 3 2 + 2.844946500601964e-16 4 3 3 3 + -0.0305887632454903 4 3 4 1 + -2.498001805406602e-16 4 3 4 2 + 0.175364225960666 4 3 4 3 + -2.289834988289385e-16 4 3 4 4 + 0.3621561856539378 4 4 1 1 + -4.996003610813204e-16 4 4 2 1 + 0.3306045769036404 4 4 2 2 + -0.0601544348677317 4 4 3 1 + -3.05311331771918e-16 4 4 3 2 + 0.3351920397593786 4 4 3 3 + 1.110223024625157e-16 4 4 4 1 + -0.06336384545113199 4 4 4 2 + -2.498001805406602e-16 4 4 4 3 + 0.3791549038771729 4 4 4 4 + -1.138312749838361 1 1 0 0 + 4.440892098500626e-16 2 1 0 0 + -1.046210689921655 2 2 0 0 + 0.09232698471396558 3 1 0 0 + 2.775557561562891e-16 3 2 0 0 + -0.9826377000736198 3 3 0 0 + 8.326672684688674e-17 4 1 0 0 + 0.07411836288065318 4 2 0 0 + -1.387778780781446e-16 4 3 0 0 + -0.972184230939295 4 4 0 0 + 1.146550777804458 0 0 0 0 diff --git a/examples/molkit.ipynb b/examples/molkit.ipynb index 3baab91..dfe756d 100644 --- a/examples/molkit.ipynb +++ b/examples/molkit.ipynb @@ -4,179 +4,827 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Molkit" + "# Tutorial: Molkit\n", + "\n", + "## Introduction\n", + "This tutorial will be focus in tools available in the new ModelHamiltonian module to manipulate molecular hamiltonians." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Instantiating a Molecular Hamiltonian" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/workspaces/ModelHamiltonian/moha/molkit/hamiltonians.py:179: UserWarning: Duplicate entries in the FCIDUMP file are ignored\n", + " data = load_fcidump(open(path, 'r'))\n" + ] + } + ], "source": [ - "# import libraries\n", "import numpy as np\n", "from moha import HamHeisenberg\n", + "from moha.molkit.hamiltonians import MolHam\n", + "\n", + "# load a hamiltonian from the fcidump file\n", + "hami = MolHam()\n", + "hami.from_fcidump('example.fcidump')\n", + "print(hami)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Converting the Hamiltonian to the Spin-Orbital Basis\n", "\n", - "J_eq = np.array([[0, 1],\n", - " [1, 0]])\n", - "J_ax = np.array([[0, 0.5],\n", - " [0.5, 0]\n", - " ])\n", + "You can easily perform this conversion by using the `spinize_H` method, which returns the one-body and two-body integrals in the spin-orbital basis.\n", "\n", - "mu = np.zeros(2)\n", + "#### Conversion Rules\n", "\n", - "ham = HamHeisenberg(J_eq=J_eq, J_ax=J_ax, mu=mu)\n", - "one_body = ham.generate_one_body_integral(dense=True)\n", - "two_body = ham.generate_two_body_integral(dense=True)" + "- *One-body term:*\n", + " - The spatial one-body integral is mapped to the spin-orbital basis as:\n", + " - $h_{pq}^{\\alpha\\alpha} = h_{pq}^{\\beta\\beta} = h_{pq}^{\\text{spatial}}$\n", + " - $h_{pq}^{\\alpha\\beta} = h_{pq}^{\\beta\\alpha} = 0$\n", + "\n", + "- *Two-body term:*\n", + " - The spatial two-body integral is mapped as:\n", + " - $V_{pqrs}^{\\alpha\\alpha\\alpha\\alpha} = V_{pqrs}^{\\alpha\\beta\\alpha\\beta} = V_{pqrs}^{\\beta\\alpha\\beta\\alpha} = V_{pqrs}^{\\text{spatial}}$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "One-body integrals (spin basis):\n", + " [[-1.13831275e+00 4.44089210e-16 9.23269847e-02 8.32667268e-17\n", + " 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", + " [ 4.44089210e-16 -1.04621069e+00 2.77555756e-16 7.41183629e-02\n", + " 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", + " [ 9.23269847e-02 2.77555756e-16 -9.82637700e-01 -1.38777878e-16\n", + " 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", + " [ 8.32667268e-17 7.41183629e-02 -1.38777878e-16 -9.72184231e-01\n", + " 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n", + " -1.13831275e+00 4.44089210e-16 9.23269847e-02 8.32667268e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n", + " 4.44089210e-16 -1.04621069e+00 2.77555756e-16 7.41183629e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n", + " 9.23269847e-02 2.77555756e-16 -9.82637700e-01 -1.38777878e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n", + " 8.32667268e-17 7.41183629e-02 -1.38777878e-16 -9.72184231e-01]]\n", + "Two-body integrals (spin basis):\n", + " [[[[ 3.49974212e-01 -2.91433544e-16 -5.76085753e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-2.91433544e-16 1.64265418e-01 -6.24500451e-17 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-5.76085753e-02 -6.24500451e-17 1.27619481e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[-2.91433544e-16 3.18734202e-01 -1.31838984e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.64265418e-01 1.38777878e-17 6.98132857e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-6.24500451e-17 1.75474384e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[-5.76085753e-02 -1.31838984e-16 3.22024071e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-6.24500451e-17 6.98132857e-02 2.08166817e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.27619481e-01 1.66533454e-16 1.81604262e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.18734202e-01\n", + " -1.31838984e-16 -5.99199501e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.38777878e-17\n", + " 6.98132857e-02 8.32667268e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.75474384e-02\n", + " 1.66533454e-16 1.29061413e-01]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -1.31838984e-16\n", + " 3.22024071e-01 -2.08166817e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 6.98132857e-02\n", + " 2.08166817e-16 1.68393804e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.81604262e-02 -3.74700271e-16]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -5.99199501e-02\n", + " -2.08166817e-17 3.62156186e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 8.32667268e-17\n", + " 1.68393804e-01 -4.99600361e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.29061413e-01\n", + " -3.74700271e-16 -6.01544349e-02]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]]\n", + "\n", + "\n", + " [[[-2.91433544e-16 1.64265418e-01 -6.24500451e-17 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 3.18734202e-01 1.38777878e-17 1.75474384e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-1.31838984e-16 6.98132857e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 1.64265418e-01 1.38777878e-17 6.98132857e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.38777878e-17 3.32316870e-01 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 6.98132857e-02 1.66533454e-16 1.46071836e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[-6.24500451e-17 6.98132857e-02 2.08166817e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.75474384e-02 1.66533454e-16 3.35356211e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.66533454e-16 1.46071836e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.38777878e-17\n", + " 6.98132857e-02 8.32667268e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.32316870e-01\n", + " 1.66533454e-16 1.52359077e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.46071836e-01 4.85722573e-17]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 6.98132857e-02\n", + " 2.08166817e-16 1.68393804e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 3.35356211e-01 1.31838984e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.46071836e-01\n", + " -1.11022302e-16 7.29178274e-02]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 8.32667268e-17\n", + " 1.68393804e-01 -4.99600361e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.52359077e-02\n", + " 1.31838984e-16 3.30604577e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 7.29178274e-02 -3.05311332e-16]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]]\n", + "\n", + "\n", + " [[[-5.76085753e-02 -6.24500451e-17 1.27619481e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-1.31838984e-16 6.98132857e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 3.22024071e-01 2.08166817e-16 1.81604262e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[-6.24500451e-17 1.75474384e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 6.98132857e-02 1.66533454e-16 1.46071836e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 2.08166817e-16 3.35356211e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 1.27619481e-01 1.66533454e-16 1.81604262e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.66533454e-16 1.46071836e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.81604262e-02 -1.11022302e-16 3.42057681e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.75474384e-02\n", + " 1.66533454e-16 1.29061413e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.46071836e-01 4.85722573e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.35356211e-01\n", + " -1.11022302e-16 1.78424099e-02]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.81604262e-02 -3.74700271e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.46071836e-01\n", + " -1.11022302e-16 7.29178274e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -1.11022302e-16\n", + " 3.42057681e-01 2.84494650e-16]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.29061413e-01\n", + " -3.74700271e-16 -6.01544349e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 7.29178274e-02 -3.05311332e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.78424099e-02\n", + " 2.84494650e-16 3.35192040e-01]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]]\n", + "\n", + "\n", + " ...\n", + "\n", + "\n", + " [[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 3.18734202e-01 1.38777878e-17 1.75474384e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-1.31838984e-16 6.98132857e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-5.99199501e-02 8.32667268e-17 1.29061413e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 1.38777878e-17 3.32316870e-01 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 6.98132857e-02 1.66533454e-16 1.46071836e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 8.32667268e-17 1.52359077e-02 4.85722573e-17 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 1.75474384e-02 1.66533454e-16 3.35356211e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.66533454e-16 1.46071836e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.29061413e-01 4.85722573e-17 1.78424099e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.32316870e-01\n", + " 1.66533454e-16 1.52359077e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.46071836e-01 4.85722573e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.52359077e-02\n", + " 4.85722573e-17 1.32179395e-01]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 3.35356211e-01 1.31838984e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.46071836e-01\n", + " -1.11022302e-16 7.29178274e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 1.78424099e-02 -2.49800181e-16]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.52359077e-02\n", + " 1.31838984e-16 3.30604577e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 7.29178274e-02 -3.05311332e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.32179395e-01\n", + " -2.49800181e-16 -6.33638455e-02]]]\n", + "\n", + "\n", + " [[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [-1.31838984e-16 6.98132857e-02 1.66533454e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 3.22024071e-01 2.08166817e-16 1.81604262e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-2.08166817e-17 1.68393804e-01 -3.74700271e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 6.98132857e-02 1.66533454e-16 1.46071836e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 2.08166817e-16 3.35356211e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.68393804e-01 1.31838984e-16 7.29178274e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 1.66533454e-16 1.46071836e-01 -1.11022302e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.81604262e-02 -1.11022302e-16 3.42057681e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-3.74700271e-16 7.29178274e-02 2.84494650e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.66533454e-16\n", + " 1.46071836e-01 4.85722573e-17]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.35356211e-01\n", + " -1.11022302e-16 1.78424099e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.31838984e-16\n", + " 7.29178274e-02 -2.49800181e-16]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.46071836e-01\n", + " -1.11022302e-16 7.29178274e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -1.11022302e-16\n", + " 3.42057681e-01 2.84494650e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 7.29178274e-02\n", + " 2.84494650e-16 1.75364226e-01]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 7.29178274e-02 -3.05311332e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.78424099e-02\n", + " 2.84494650e-16 3.35192040e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -2.49800181e-16\n", + " 1.75364226e-01 -2.49800181e-16]]]\n", + "\n", + "\n", + " [[[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [-5.99199501e-02 8.32667268e-17 1.29061413e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-2.08166817e-17 1.68393804e-01 -3.74700271e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 3.62156186e-01 -4.99600361e-16 -6.01544349e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 8.32667268e-17 1.52359077e-02 4.85722573e-17 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 1.68393804e-01 1.31838984e-16 7.29178274e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-4.99600361e-16 3.30604577e-01 -3.05311332e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 1.29061413e-01 4.85722573e-17 1.78424099e-02 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-3.74700271e-16 7.29178274e-02 2.84494650e-16 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [-6.01544349e-02 -3.05311332e-16 3.35192040e-01 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]]\n", + "\n", + " ...\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.52359077e-02\n", + " 4.85722573e-17 1.32179395e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.31838984e-16\n", + " 7.29178274e-02 -2.49800181e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 3.30604577e-01\n", + " -3.05311332e-16 -6.33638455e-02]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 4.85722573e-17\n", + " 1.78424099e-02 -2.49800181e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 7.29178274e-02\n", + " 2.84494650e-16 1.75364226e-01]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -3.05311332e-16\n", + " 3.35192040e-01 -2.49800181e-16]]\n", + "\n", + " [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n", + " 0.00000000e+00 0.00000000e+00]\n", + " ...\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 1.32179395e-01\n", + " -2.49800181e-16 -6.33638455e-02]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -2.49800181e-16\n", + " 1.75364226e-01 -2.49800181e-16]\n", + " [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... -6.33638455e-02\n", + " -2.49800181e-16 3.79154904e-01]]]]\n" + ] + } + ], + "source": [ + "one_body_spin, two_body_spin = hami.spinize_H()\n", + "print(\"One-body integrals (spin basis):\\n\", one_body_spin)\n", + "print(\"Two-body integrals (spin basis):\\n\", two_body_spin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Antisymmetrizing the Two-Electron Integrals\n", + "\n", + "You can apply proper antisymmetrization to the two-electron integrals using the `antisymmetrize` method. \n", + "\n", + "This ensures the integrals obey the required permutation symmetry for fermionsm following the rule:\n", + "$V_{pqrs} = -V_{pqsr} = -V_{qprs} = V_{qpsr}$" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ - "import numpy as np\n", - "from moha import HamHeisenberg\n", - "from moha.molkit.hamiltonians import MolHam\n", - "from moha.molkit.utils.tools import from_geminal\n", - "from moha.molkit.utils.spinops import antisymmetrize_two_body\n", - "\n", - "def from_geminal(two_body_gem, n_orb):\n", - " \"\"\"\n", - " Inverse of MolHam.to_geminal().\n", - "\n", - " Parameters\n", - " ----------\n", - " two_body_gem : (n_gem, n_gem) ndarray\n", - " Matrix in the geminal basis.\n", - " n_orb : int\n", - " Number of spin orbitals.\n", - "\n", - " Returns\n", - " -------\n", - " V : (n_orb, n_orb, n_orb, n_orb) ndarray\n", - " Fully antisymmetrised two-electron tensor V_{ijkl}.\n", - " \"\"\"\n", - " n_gem = n_orb * (n_orb - 1) // 2\n", - " if two_body_gem.shape != (n_gem, n_gem):\n", - " raise ValueError(f\"Shape mismatch: got {two_body_gem.shape}, expected ({n_gem},{n_gem})\")\n", - "\n", - " # Generate flattened pair list exactly like to_geminal\n", - " pairs = [(i, j) for i in range(n_orb) for j in range(i + 1, n_orb)]\n", - " V = np.zeros((n_orb, n_orb, n_orb, n_orb))\n", - "\n", - " for A, (i, j) in enumerate(pairs):\n", - " for B, (k, l) in enumerate(pairs):\n", - " val = 0.25 * two_body_gem[A, B] # undo the factor 0.5 * 4 = 2\n", - "\n", - " # Apply antisymmetric filling\n", - " V[i, j, k, l] = val\n", - " V[j, i, k, l] = -val\n", - " V[i, j, l, k] = -val\n", - " V[j, i, l, k] = val\n", - " V[k, l, i, j] = val\n", - " V[l, k, i, j] = -val\n", - " V[k, l, j, i] = -val\n", - " V[l, k, j, i] = val\n", - "\n", - " return V\n", - "\n", - "\n", - "J_eq = np.array([[0, 1],\n", - " [1, 0]])\n", - "J_ax = np.array([[0, 0.5],\n", - " [0.5, 0]])\n", - "mu = np.zeros(2)\n", - "\n", - "ham_hei = HamHeisenberg(J_eq=J_eq, J_ax=J_ax, mu=mu)\n", - "one_body = ham_hei.generate_one_body_integral(dense=True)\n", - "two_body = ham_hei.generate_two_body_integral(dense=True)\n", - "Molecular_Hamiltonian = MolHam(one_body=one_body, two_body=two_body)\n", - "\n", - "h1_spin, h2_spin = Molecular_Hamiltonian.spinize_H()\n", - "h2_spin = antisymmetrize_two_body(h2_spin)\n", - "\n", - "reduced = Molecular_Hamiltonian.to_reduced(n_elec=2)" + "hami.antisymmetrize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Energies Tests" + "### 4. Converting the Two-Body Term to the Geminal Basis\n", + "\n", + "The `to_geminal` method converts the two-body term from the spin-orbital basis to the geminal basis. \n", + "You can specify the type of two-body term: `'rdm2'` (two-body reduced density matrix) or `'h2'` (two-body Hamiltonian).\n", + "\n", + "The Hamiltonian in the geminal basis is obtained by the following formula:\n", + "$V_{A B} =\\frac{1}{2}\\left(V_{p q r s}-V_{q p r s}-V_{p q r s}+V_{qprs}\\right)$\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'MolHam' object has no attribute 'to_geminal'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m geminal = \u001b[43mhami\u001b[49m\u001b[43m.\u001b[49m\u001b[43mto_geminal\u001b[49m(two_body_spin, \u001b[38;5;28mtype\u001b[39m=\u001b[33m'\u001b[39m\u001b[33mh2\u001b[39m\u001b[33m'\u001b[39m)\n", + "\u001b[31mAttributeError\u001b[39m: 'MolHam' object has no attribute 'to_geminal'" + ] + } + ], + "source": [ + "geminal = hami.to_geminal(two_body_spin, type='h2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5. Constructing the Reduced 4-Index Hamiltonian Tensor\n", + "\n", + "The `to_reduced` method returns the reduced 4-index Hamiltonian tensor $k_{pqrs}$ in the spin-orbital basis, given the number of electrons $N$.\n", + "\n", + "#### Formula\n", + "\n", + "$$\n", + "k_{pqrs} = \\frac{1}{2(N-1)} \\left( h_{pq} \\delta_{rs} + h_{rs} \\delta_{pq} \\right) + \\frac{1}{2} V_{pqrs}\n", + "$$\n", + "\n", + "where:\n", + "- $h_{pq}$: one-electron integrals (spin-orbital basis)\n", + "- $V_{pqrs}$: two-electron integrals (spin-orbital basis)\n", + "- $\\delta_{pq}$: Kronecker delta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "E_spin-orbital : 1.004059262354666e-12\n", - "E_geminal : 1.0040474662350293e-12\n" + "(8, 8, 8, 8)\n" ] } ], "source": [ - "import numpy as np\n", - "from pyscf import fci\n", - "from moha.molkit.hamiltonians import MolHam\n", + "reduced = hami.to_reduced(n_elec=4)\n", + "print(reduced.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6. Extracting Spin Blocks from the Two-Body Spin-Orbital Tensor\n", + "\n", + "After converting the Hamiltonian to the spin-orbital basis, you can extract the main spin blocks from the two-body tensor using the `get_spin_blocks` method, by accesing the dictionaries keys: 'aaaa', 'bbbb', 'abab'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['aaaa', 'bbbb', 'abab'])\n" + ] + } + ], + "source": [ + "spin_blocks = hami.get_spin_blocks()\n", + "print(spin_blocks.keys())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7. Computing Energy of a system\n", + "\n", + "In this section, we will compute the ground-state energy of a toy molecular system using the Full Configuration Interaction (FCI) method using the `pyscf` library.\n", "\n", + "1. Perform an FCI calculation to obtain the wavefunction and reduced density matrices (RDMs).\n", "\n", - "h_sp = np.array([[1.0, 0.2],\n", - " [0.2, 1.5]])\n", + "1. Compute the energy using both spin-orbital and geminal representations to verify consistency." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "E_spin-orbital : -4.121211958837992\n", + "E_geminal : -4.121211958837991\n" + ] + } + ], + "source": [ + "from pyscf import fci\n", + "from moha.molkit.utils.tools import to_geminal\n", "\n", - "V_sp = np.zeros((2, 2, 2, 2))\n", - "V_sp[0, 0, 0, 0] = 0.7\n", - "V_sp[1, 1, 1, 1] = 0.6\n", + "# One-electron integrals (spatial orbital basis)\n", + "h1 = hami.one_body\n", + "h2 = hami.two_body\n", + "core_energy = hami.zero_body\n", "\n", - "N_ELEC, n_spin = 2, 2 \n", - "toy = MolHam(h_sp, V_sp)\n", + "N_ELEC, norb = 4, hami.n_spatial\n", "\n", - "h_spin, V_spin = toy.spinize_H() \n", - "norb = h_spin.shape[0]\n", - "e_fci, ci_vec = fci.direct_spin1.kernel(h_spin, V_spin, norb, N_ELEC, ecore=0.0)\n", + "# Perform Full CI calculation\n", + "e_fci, ci_vec = fci.direct_spin1.kernel(h1, h2, norb, N_ELEC, ecore=core_energy)\n", "rdm1s, rdm2s = fci.direct_spin1.make_rdm12s(ci_vec, norb, N_ELEC)\n", "\n", - "rdm1 = np.block([\n", - " [rdm1s[0], np.zeros_like(rdm1s[0])],\n", - " [np.zeros_like(rdm1s[1]), rdm1s[1]]\n", - "])\n", - "\n", - "n = norb // 2 # spatial orbitals\n", - "rdm2 = np.zeros((2*n, 2*n, 2*n, 2*n))\n", - "for i in range(n):\n", - " for j in range(n):\n", - " for k in range(n):\n", - " for l in range(n):\n", - " # αααα\n", - " rdm2[i, j, k, l] = rdm2s[0][i, k, j, l]\n", - " # ββββ\n", - " rdm2[i+n, j+n, k+n, l+n] = rdm2s[2][i, k, j, l]\n", - " # αβαβ\n", - " rdm2[i, j+n, k, l+n] = rdm2s[1][i, k, j, l]\n", - " # βαβα (hermitian transpose of αβαβ)\n", - " rdm2[i+n, j, k+n, l] = rdm2s[1][i, k, j, l]\n", - "\n", - "H = toy.to_reduced(n_elec=N_ELEC) # H = h↑ + 0.5 * V\n", - "E_spin = np.einsum('pqrs,pqrs', H, rdm2)\n", - "H_gem = toy.to_geminal(H, type='h2')\n", - "rdm_gem = toy.to_geminal(rdm2, type='rdm2')\n", - "E_gem = np.einsum('pq,pq', H_gem, rdm_gem)\n", + "# construct 2-rdm\n", + "rdm2s_new = np.zeros((8, 8, 8, 8))\n", + "for i in range(4):\n", + " for j in range(4):\n", + " for k in range(4):\n", + " for l in range(4):\n", + " rdm2s_new[i, j, k, l] = rdm2s[0][i, k, j, l] # aaaa\n", + " rdm2s_new[i+4, j+4, k+4, l+4] = rdm2s[2][i, k, j, l] #bbbb\n", + " rdm2s_new[i, j+4, k, l+4] = rdm2s[1][i, k, j, l] #abab\n", + " rdm2s_new[i+4, j, k+4, l] = rdm2s[1][i, k, j, l] #baba\n", + "\n", + "\n", + "\n", + "# Convert to reduced form\n", + "H = hami.to_reduced(n_elec=N_ELEC) # H = 0.5 * (h \\outer h)/(N - 1) + 0.5 * V\n", + "# Compute the energy in the MO basis\n", + "E_spin = np.sum(H * rdm2s_new)\n", + "\n", + "# Convert to geminal form\n", + "H_gem = to_geminal(H, type='h2')\n", + "rdm_gem = to_geminal(rdm2s_new, type='rdm2')\n", + "\n", + "# Energy from geminal formulation\n", + "E_gem = np.einsum('pq,pq', H_gem, rdm_gem)\n", "\n", + "# Print the energies from both formulations\n", "print(\"E_spin-orbital :\", E_spin)\n", "print(\"E_geminal :\", E_gem)\n", - "assert np.allclose(E_spin, E_gem, atol=1e-10), \"Energies do not match!\"" + "assert np.allclose(E_spin, E_gem), \"Energies do not match!\"" ] } ], "metadata": { "kernelspec": { - "display_name": "moha", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -190,7 +838,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.13" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/moha/molkit/hamiltonians.py b/moha/molkit/hamiltonians.py index 11263d0..1d1df5c 100644 --- a/moha/molkit/hamiltonians.py +++ b/moha/molkit/hamiltonians.py @@ -5,6 +5,7 @@ get_spin_blocks, upscale_one_body ) +from .utils.tools import load_fcidump import numpy as np @@ -15,7 +16,7 @@ class MolHam: in the form of one- and two-electron integrals. """ - def __init__(self, one_body, two_body): + def __init__(self, one_body=None, two_body=None, zero_body=0): """Initialize MolHam with one and two electron integrals. Parameters @@ -24,12 +25,19 @@ def __init__(self, one_body, two_body): One-electron integrals in spatial orbital basis two_body : np.ndarray Two-electron integrals in spatial orbital basis + zero_body: float + Core energy """ + self.zero_body = zero_body self.one_body = one_body self.two_body = two_body - self.n_spatial = one_body.shape[0] - self.n_spin = 2 * self.n_spatial + if self.one_body is not None: + self.n_spatial = one_body.shape[0] + self.n_spin = 2 * self.n_spatial + else: + self.n_spatial = None + self.n_spin = None self.reduced_ham = None def antisymmetrize(self): @@ -47,76 +55,10 @@ def get_spin_blocks(self): """ if not hasattr(self, "two_body_spin"): raise RuntimeError( - "Call .spinize() first to compute spin-orbital form.") + "Call .spinize_H() first to compute spin-orbital form.") return get_spin_blocks(self.two_body_spin, self.n_spatial) - def to_geminal(self, two_body=None, type='h2'): - r""" - Convert the two-body term to the geminal basis. - - Parameters - ---------- - two_body : np.ndarray - Two-body term in spin-orbital basis in physics notation. - type : str - ['rdm2', 'h2']. Type of the two-body term. - - 'rdm2' : 2 body reduced density matrix - - 'h2' : 2 body Hamiltonian - - Returns - ------- - two_body_gem : np.ndarray - Two-body term in the geminal basis - - Notes - ----- - Assuming that rdm2 obbey the following permutation rules: - - :math:`\Gamma_{p q r s}=-\Gamma_{q p r s}=-\Gamma_{p q s r} - =\Gamma_{q p s r}` - we can convert the two-body term to the geminal basis - by the following formula: - - .. math:: - - \Gamma_{p q}=0.5 * 4 \Gamma_{p q r s} - - where: - - :math:`\Gamma_{p q}` is the two-body term in the geminal basis - - :math:`\Gamma_{p q r s}` is the two-body term in the spin-orbital - Hamiltonian in the geminal basis is obtained by the following formula: - - .. math:: - - V_{A B} - =\frac{1}{2}\left(V_{p q r s}-V_{q p r s}-V_{p q r s}+V_{qprs}\right) - - """ - n = two_body.shape[0] - two_body_gem = [] - - # i,j,k,l -> pqrs - for p in range(n): - for q in range(p + 1, n): - for r in range(n): - for s in range(r + 1, n): - if type == 'rdm2': - two_body_gem.append( - 0.5 * 4 * two_body[p, q, r, s] - ) - elif type == 'h2': - two_body_gem.append( - 0.5 * ( - two_body[p, q, r, s] - - two_body[q, p, r, s] - - two_body[p, q, s, r] - + two_body[q, p, s, r] - ) - ) - - n_gem = n * (n - 1) // 2 - return np.array(two_body_gem).reshape(n_gem, n_gem) - def spinize_H(self) -> tuple[np.ndarray, np.ndarray]: r"""Convert the one/two body terms from spatial to spin-orbital basis. @@ -174,6 +116,9 @@ def spinize_H(self) -> tuple[np.ndarray, np.ndarray]: # βαβα two_body_spin[n:, :n, n:, :n] = two_body + self.one_body_spin = one_body_spin + self.two_body_spin = two_body_spin + return one_body_spin, two_body_spin def to_reduced(self, n_elec): @@ -212,3 +157,22 @@ def to_reduced(self, n_elec): k = h_upscaled + 0.5 * V_spin return k + + def from_fcidump(self, path): + """Assign Hamiltonian parameters from an FCIDUMP file. + + Parameters + ---------- + path : str + Path to the FCIDUMP file. + + Returns + ------- + None + """ + data = load_fcidump(open(path)) + self.one_body = data['one_ints'] + self.two_body = data['two_ints'] + self.zero_body = data['core_energy'] + self.n_spatial = self.one_body.shape[0] + self.n_spin = 2 * self.n_spatial diff --git a/moha/molkit/utils/tools.py b/moha/molkit/utils/tools.py index c3904d7..fad250f 100644 --- a/moha/molkit/utils/tools.py +++ b/moha/molkit/utils/tools.py @@ -1,6 +1,74 @@ r"""Utilities for molecular Hamiltonians.""" import numpy as np +from warnings import warn + + +def to_geminal(two_body=None, type='h2'): + r""" + Convert the two-body term to the geminal basis. + + Parameters + ---------- + two_body : np.ndarray + Two-body term in spin-orbital basis in physics notation. + type : str + ['rdm2', 'h2']. Type of the two-body term. + - 'rdm2' : 2 body reduced density matrix + - 'h2' : 2 body Hamiltonian + + Returns + ------- + two_body_gem : np.ndarray + Two-body term in the geminal basis + + Notes + ----- + Assuming that rdm2 obbey the following permutation rules: + - :math:`\Gamma_{p q r s}=-\Gamma_{q p r s}=-\Gamma_{p q s r} + =\Gamma_{q p s r}` + we can convert the two-body term to the geminal basis + by the following formula: + + .. math:: + + \Gamma_{p q}=0.5 * 4 \Gamma_{p q r s} + + where: + - :math:`\Gamma_{p q}` is the two-body term in the geminal basis + - :math:`\Gamma_{p q r s}` is the two-body term in the spin-orbital + Hamiltonian in the geminal basis is obtained by the following formula: + + .. math:: + + V_{A B} + =\frac{1}{2}\left(V_{p q r s}-V_{q p r s}-V_{p q r s}+V_{qprs}\right) + + """ + n = two_body.shape[0] + two_body_gem = [] + + # i,j,k,l -> pqrs + for p in range(n): + for q in range(p + 1, n): + for r in range(n): + for s in range(r + 1, n): + if type == 'rdm2': + two_body_gem.append( + 0.5 * 4 * two_body[p, q, r, s] + ) + elif type == 'h2': + two_body_gem.append( + 0.5 * ( + two_body[p, q, r, s] + - two_body[q, p, r, s] + - two_body[p, q, s, r] + + two_body[q, p, s, r] + ) + ) + + n_gem = n * (n - 1) // 2 + return np.array(two_body_gem).reshape(n_gem, n_gem) def from_geminal(two_body_gem, n_orb): @@ -42,3 +110,125 @@ def from_geminal(two_body_gem, n_orb): V[l, k, j, i] = val return V + + +def set_four_index_element(four_index_object, i0, i1, i2, i3, value): + """Assign a value to a four-index tensor with 8-fold symmetry. + + Adapted from the IOData library: + https://iodata.readthedocs.io/en/latest/index.html + + Assign values to a four-index object, accounting for + 8‑fold index symmetry. + This function assumes physicists' notation. + + Parameters + ---------- + four_index_object : np.ndarray + Four-index tensor to modify + (shape=(nbasis, nbasis, nbasis, nbasis)). + i0, i1, i2, i3 : int + Indices of the element to assign. + value : float + Value of the matrix element to store. + """ + four_index_object[i0, i1, i2, i3] = value + four_index_object[i1, i0, i3, i2] = value + four_index_object[i2, i1, i0, i3] = value + four_index_object[i0, i3, i2, i1] = value + four_index_object[i2, i3, i0, i1] = value + four_index_object[i3, i2, i1, i0] = value + four_index_object[i1, i2, i3, i0] = value + four_index_object[i3, i0, i1, i2] = value + + +def load_fcidump(lit) -> dict: + """Load integrals from an FCIDUMP file. + + Adapted from the IOData module: + https://iodata.readthedocs.io/en/latest/index.html + + Parse the Molpro 2012 FCIDUMP format (restricted wave functions). + + Parameters + ---------- + lit : LineIterator + Iterator over lines of the FCIDUMP file. + + Returns + ------- + dict + Dictionary with one- and two-electron integrals and core energy. + Keys: 'nelec', 'spinpol', 'one_ints', 'two_ints', 'core_energy'. + + Notes + ----- + 1. This function works only for restricted wave functions. + 2. One- and two-electron integrals are stored in chemists' notation + in an FCIDUMP file, while IOData and MoHa internally use + physicists' notation. + 3. The FCIDUMP format changed in MOLPRO 2012; + older versions are not supported. + """ + # check header + line = next(lit) + if not line.startswith(" &FCI NORB="): + raise (f"Incorrect file header: {line.strip()}", lit) + + # read info from header + words = line[5:].split(",") + header_info = {} + for word in words: + if word.count("=") == 1: + key, value = word.split("=") + header_info[key.strip()] = value.strip() + nbasis = int(header_info["NORB"]) + nelec = int(header_info["NELEC"]) + spinpol = int(header_info["MS2"]) + + # skip rest of header + for line in lit: + words = line.split() + if words[0] == "&END" or words[0] == "/END" or words[0] == "/": + break + + # read the integrals + one_mo = np.zeros((nbasis, nbasis)) + two_mo = np.zeros((nbasis, nbasis, nbasis, nbasis)) + core_energy = 0.0 + + for line in lit: + words = line.split() + if len(words) != 5: + raise ( + f"Expecting 5 fields on each data line in FCIDUMP, " + f"got {len(words)}.", + lit, + ) + value = float(words[0]) + if words[3] != "0": + ii = int(words[1]) - 1 + ij = int(words[2]) - 1 + ik = int(words[3]) - 1 + il = int(words[4]) - 1 + if two_mo[ii, ik, ij, il] != 0.0: + warn( + "Duplicate entries in the FCIDUMP file are ignored", + stacklevel=2, + ) + set_four_index_element(two_mo, ii, ik, ij, il, value) + elif words[1] != "0": + ii = int(words[1]) - 1 + ij = int(words[2]) - 1 + one_mo[ii, ij] = value + one_mo[ij, ii] = value + else: + core_energy = value + + return { + "nelec": nelec, + "spinpol": spinpol, + "one_ints": one_mo, + "two_ints": two_mo, + "core_energy": core_energy, + }