From 42462303ad00467f51d65ccb13ed3eb3fc7ca4a1 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 21 Aug 2025 16:53:07 -0400 Subject: [PATCH 1/4] fix antisymmetrization --- examples/molkit.ipynb | 74 ++++++++++++++++++++++-------------- moha/molkit/hamiltonians.py | 6 ++- moha/molkit/utils/spinops.py | 18 ++++++--- 3 files changed, 62 insertions(+), 36 deletions(-) diff --git a/examples/molkit.ipynb b/examples/molkit.ipynb index dfe756d..1b22376 100644 --- a/examples/molkit.ipynb +++ b/examples/molkit.ipynb @@ -26,15 +26,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\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" + "/Users/valeriichuiko/Desktop/projects/ModelHamiltonian/moha/molkit/hamiltonians.py:177: UserWarning: Duplicate entries in the FCIDUMP file are ignored\n", + " data = load_fcidump(open(path))\n" ] } ], @@ -42,6 +42,7 @@ "import numpy as np\n", "from moha import HamHeisenberg\n", "from moha.molkit.hamiltonians import MolHam\n", + "from moha.molkit.utils.tools import to_geminal\n", "\n", "# load a hamiltonian from the fcidump file\n", "hami = MolHam()\n", @@ -644,9 +645,33 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Elements 0, 1, 0, 1 and 1, 0, 0, 1 of aaaa part:\n", + " 0.07723439239467665 -0.07723439239467664\n", + "--------------------\n", + "Elements 0, 1, 0, 1 and 1, 0, 0, 1 of abab part:\n", + " 0.3187342023639616 0.1642654175746083\n", + "--------------------\n", + "Elements 0, 0, 1, 1 for aaaa and abab parts:\n", + " 0.0 0.1642654175746083\n" + ] + } + ], "source": [ - "hami.antisymmetrize()" + "hami.antisymmetrize()\n", + "hami.two_body_spin[0, 1, 0, 1]\n", + "two_body_aaaa = hami.get_spin_blocks()['aaaa']\n", + "two_body_abab = hami.get_spin_blocks()['abab']\n", + "\n", + "print(\"Elements 0, 1, 0, 1 and 1, 0, 0, 1 of aaaa part:\\n\", two_body_aaaa[0, 1, 0, 1], two_body_aaaa[1, 0, 0, 1])\n", + "print(\"--\"*10)\n", + "print(\"Elements 0, 1, 0, 1 and 1, 0, 0, 1 of abab part:\\n\", two_body_abab[0, 1, 0, 1], two_body_abab[1, 0, 0, 1])\n", + "print(\"--\"*10)\n", + "print(\"Elements 0, 0, 1, 1 for aaaa and abab parts:\\n\", two_body_aaaa[0, 0, 1, 1], two_body_abab[0, 0, 1, 1])" ] }, { @@ -666,21 +691,9 @@ "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'" - ] - } - ], + "outputs": [], "source": [ - "geminal = hami.to_geminal(two_body_spin, type='h2')" + "geminal = to_geminal(two_body_spin, type='h2')" ] }, { @@ -705,7 +718,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -732,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -763,15 +776,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "E_spin-orbital : -4.121211958837992\n", - "E_geminal : -4.121211958837991\n" + "E_spin-orbital : -3.0622781536522004\n", + "E_geminal : -3.0622781536522012\n", + "FCI energy : -3.062278153652201\n" ] } ], @@ -787,7 +801,7 @@ "N_ELEC, norb = 4, hami.n_spatial\n", "\n", "# Perform Full CI calculation\n", - "e_fci, ci_vec = fci.direct_spin1.kernel(h1, h2, norb, N_ELEC, ecore=core_energy)\n", + "e_fci, ci_vec = fci.direct_spin1.kernel(h1, np.einsum('pqrs -> prqs', h2), norb, N_ELEC, ecore=core_energy, tol=1e-12)\n", "rdm1s, rdm2s = fci.direct_spin1.make_rdm12s(ci_vec, norb, N_ELEC)\n", "\n", "# construct 2-rdm\n", @@ -815,16 +829,18 @@ "# 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 the energies from all formulations\n", "print(\"E_spin-orbital :\", E_spin)\n", "print(\"E_geminal :\", E_gem)\n", - "assert np.allclose(E_spin, E_gem), \"Energies do not match!\"" + "print(\"FCI energy :\", e_fci - core_energy)\n", + "assert np.allclose(E_spin, E_gem), \"Energies do not match!\"\n", + "assert np.allclose(E_spin, e_fci - core_energy), \"Energies do not match!\"" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -838,7 +854,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/moha/molkit/hamiltonians.py b/moha/molkit/hamiltonians.py index 1d1df5c..5c21121 100644 --- a/moha/molkit/hamiltonians.py +++ b/moha/molkit/hamiltonians.py @@ -42,7 +42,10 @@ def __init__(self, one_body=None, two_body=None, zero_body=0): def antisymmetrize(self): """Apply proper antisymmetrization to two-electron integrals.""" - self.two_body = antisymmetrize_two_body(self.two_body, inplace=True) + if not hasattr(self, "two_body_spin"): + raise RuntimeError( + "Call .spinize_H() first to compute spin-orbital form.") + self.two_body_spin = antisymmetrize_two_body(self.two_body_spin, inplace=True) def get_spin_blocks(self): """Return the main spin blocks of the two-body spin-orbital tensor. @@ -152,6 +155,7 @@ def to_reduced(self, n_elec): ``MolHam`` instance. """ h_spin, V_spin = self.spinize_H() + self.antisymmetrize() h_upscaled = upscale_one_body(h_spin, n_elec) diff --git a/moha/molkit/utils/spinops.py b/moha/molkit/utils/spinops.py index 0f38f2f..14dcf67 100644 --- a/moha/molkit/utils/spinops.py +++ b/moha/molkit/utils/spinops.py @@ -55,14 +55,20 @@ def antisymmetrize_two_body( n = nspin // 2 # number of spatial orbitals # αααα block - aa = tensor[:n, :n, :n, :n] - aa -= np.swapaxes(aa, 2, 3) - aa *= 0.5 + aa = tensor[:n, :n, :n, :n].copy() + aa = aa - np.einsum('pqrs->qprs', aa) - np.einsum('pqrs->pqsr', aa) +\ + np.einsum('pqrs->rspq', aa) - np.einsum('pqrs->srpq', aa) - np.einsum('pqrs->rsqp', aa) +\ + np.einsum('pqrs->qpsr', aa) + np.einsum('pqrs->srqp', aa) # ββββ block - bb = tensor[n:, n:, n:, n:] - bb -= np.swapaxes(bb, 2, 3) - bb *= 0.5 + bb = tensor[n:, n:, n:, n:].copy() + bb = bb - np.einsum('pqrs->qprs', bb) - np.einsum('pqrs->pqsr', bb) +\ + np.einsum('pqrs->rspq', bb) - np.einsum('pqrs->srpq', bb) - np.einsum('pqrs->rsqp', bb) +\ + np.einsum('pqrs->qpsr', bb) + np.einsum('pqrs->srqp', bb) + + + tensor[:n, :n, :n, :n] = aa / 8 + tensor[n:, n:, n:, n:] = bb / 8 return tensor From 71f9e2ba2a6b2cadaf6e236d5fb56aef203654e5 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 22 Aug 2025 13:30:20 -0400 Subject: [PATCH 2/4] fix style --- docs/molham.rst | 8 + examples/molkit.ipynb | 559 +---------------------------------- moha/molkit/hamiltonians.py | 1 - moha/molkit/utils/spinops.py | 41 ++- moha/molkit/utils/tools.py | 4 +- website/_toc.yml | 1 + 6 files changed, 39 insertions(+), 575 deletions(-) create mode 100644 docs/molham.rst diff --git a/docs/molham.rst b/docs/molham.rst new file mode 100644 index 0000000..d51428c --- /dev/null +++ b/docs/molham.rst @@ -0,0 +1,8 @@ +Molecular Hamiltonian +===================== +MolHam class +----------------- +... autoclass:: moha.molkit.hamiltonians.MolHam + :members: + + .. automethod:: __init__ \ No newline at end of file diff --git a/examples/molkit.ipynb b/examples/molkit.ipynb index 1b22376..cfd32cd 100644 --- a/examples/molkit.ipynb +++ b/examples/molkit.ipynb @@ -26,14 +26,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "/Users/valeriichuiko/Desktop/projects/ModelHamiltonian/moha/molkit/hamiltonians.py:177: UserWarning: Duplicate entries in the FCIDUMP file are ignored\n", + "/Users/valeriichuiko/Desktop/projects/ModelHamiltonian/moha/molkit/hamiltonians.py:176: UserWarning: Duplicate entries in the FCIDUMP file are ignored\n", " data = load_fcidump(open(path))\n" ] } @@ -79,554 +79,17 @@ "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" + "Shape of one-body integrals (spin basis):\n", + " (8, 8)\n", + "Shape of two-body integrals (spin basis):\n", + " (8, 8, 8, 8)\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)" + "print(\"Shape of one-body integrals (spin basis):\\n\", one_body_spin.shape)\n", + "print(\"Shape of two-body integrals (spin basis):\\n\", two_body_spin.shape)" ] }, { @@ -651,7 +114,7 @@ "output_type": "stream", "text": [ "Elements 0, 1, 0, 1 and 1, 0, 0, 1 of aaaa part:\n", - " 0.07723439239467665 -0.07723439239467664\n", + " 0.1544687847893533 -0.1544687847893533\n", "--------------------\n", "Elements 0, 1, 0, 1 and 1, 0, 0, 1 of abab part:\n", " 0.3187342023639616 0.1642654175746083\n", @@ -680,8 +143,8 @@ "source": [ "### 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", + "The `to_geminal` function in the utils module converts the two-body term from the spin-orbital basis to the geminal basis. \n", + "You can specify the type of two-body term: `'h2'` (Hamiltonian) ; we also added conversion to the geminal basis for reduced density matrices: `'rdm2'`.\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" diff --git a/moha/molkit/hamiltonians.py b/moha/molkit/hamiltonians.py index 5c21121..785f17f 100644 --- a/moha/molkit/hamiltonians.py +++ b/moha/molkit/hamiltonians.py @@ -155,7 +155,6 @@ def to_reduced(self, n_elec): ``MolHam`` instance. """ h_spin, V_spin = self.spinize_H() - self.antisymmetrize() h_upscaled = upscale_one_body(h_spin, n_elec) diff --git a/moha/molkit/utils/spinops.py b/moha/molkit/utils/spinops.py index 14dcf67..5ecd13c 100644 --- a/moha/molkit/utils/spinops.py +++ b/moha/molkit/utils/spinops.py @@ -20,7 +20,7 @@ def antisymmetrize_two_body( Returns ------- np.ndarray - Antisymmetrised tensor obeying + Antisymmetrised tensor obeys .. math:: @@ -32,18 +32,27 @@ def antisymmetrize_two_body( Notes ----- - The operation applied is + https://vergil.chemistry.gatech.edu/static/content/permsymm.pdf + + The input tensor obbeys the following 8-fold symmetry .. math:: - V^{\\sigma\\sigma\\sigma\\sigma}_{pqrs} - \\;\\;\\leftarrow\\;\\; - \\tfrac12\\,\\bigl(V^{\\sigma\\sigma\\sigma\\sigma}_{pqrs} - -V^{\\sigma\\sigma\\sigma\\sigma}_{pqsr}\\bigr), + V_{ijkl} = V_{jilk} + = V_{klij} + = V_{lkji} + = V_{kjjl} + = V_{lijk} + = V_{ilkj} + = V_{jklj} + + The operation applied is - for ``σ = α`` and ``σ = β``. All other spin sectors are returned - untouched. + .. math:: + \langle i j \| k l\rangle=\langle i j \mid k l\rangle-\langle i j \mid l k\rangle + Keep in mind, that such operation produces terms of the form + abba, baab, that are not present in the original tensor. """ if not inplace: tensor = tensor.copy() @@ -54,21 +63,7 @@ def antisymmetrize_two_body( n = nspin // 2 # number of spatial orbitals - # αααα block - aa = tensor[:n, :n, :n, :n].copy() - aa = aa - np.einsum('pqrs->qprs', aa) - np.einsum('pqrs->pqsr', aa) +\ - np.einsum('pqrs->rspq', aa) - np.einsum('pqrs->srpq', aa) - np.einsum('pqrs->rsqp', aa) +\ - np.einsum('pqrs->qpsr', aa) + np.einsum('pqrs->srqp', aa) - - # ββββ block - bb = tensor[n:, n:, n:, n:].copy() - bb = bb - np.einsum('pqrs->qprs', bb) - np.einsum('pqrs->pqsr', bb) +\ - np.einsum('pqrs->rspq', bb) - np.einsum('pqrs->srpq', bb) - np.einsum('pqrs->rsqp', bb) +\ - np.einsum('pqrs->qpsr', bb) + np.einsum('pqrs->srqp', bb) - - - tensor[:n, :n, :n, :n] = aa / 8 - tensor[n:, n:, n:, n:] = bb / 8 + tensor = tensor - np.einsum('pqrs->pqsr', tensor) return tensor diff --git a/moha/molkit/utils/tools.py b/moha/molkit/utils/tools.py index fad250f..a06211d 100644 --- a/moha/molkit/utils/tools.py +++ b/moha/molkit/utils/tools.py @@ -55,16 +55,14 @@ def to_geminal(two_body=None, type='h2'): for s in range(r + 1, n): if type == 'rdm2': two_body_gem.append( - 0.5 * 4 * two_body[p, q, r, s] + 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 diff --git a/website/_toc.yml b/website/_toc.yml index efd8511..b236314 100644 --- a/website/_toc.yml +++ b/website/_toc.yml @@ -12,6 +12,7 @@ parts: - file: examples/mohagpt.ipynb - file: examples/gui.ipynb - file: examples/RG.ipynb + - file: examples/molkit.ipynb - caption: API chapters: From 8c0a4d1be2f5a46e3c0d1bd51d932eece0bfcd0a Mon Sep 17 00:00:00 2001 From: = Date: Fri, 22 Aug 2025 13:31:09 -0400 Subject: [PATCH 3/4] fix style --- moha/molkit/utils/tests/__init__.py | 1 - moha/molkit/utils/tests/test_spinops.py | 0 moha/test/test_molham.py | 70 +++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) delete mode 100644 moha/molkit/utils/tests/__init__.py delete mode 100644 moha/molkit/utils/tests/test_spinops.py create mode 100644 moha/test/test_molham.py diff --git a/moha/molkit/utils/tests/__init__.py b/moha/molkit/utils/tests/__init__.py deleted file mode 100644 index 4befe01..0000000 --- a/moha/molkit/utils/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -r"""Tests Molkit Module.""" diff --git a/moha/molkit/utils/tests/test_spinops.py b/moha/molkit/utils/tests/test_spinops.py deleted file mode 100644 index e69de29..0000000 diff --git a/moha/test/test_molham.py b/moha/test/test_molham.py new file mode 100644 index 0000000..ac8f1ba --- /dev/null +++ b/moha/test/test_molham.py @@ -0,0 +1,70 @@ +"""Testing the MolHam class.""" + +import numpy as np +from numpy.testing import assert_allclose, assert_equal +from moha.molkit import utils +from moha.molkit.hamiltonians import MolHam + + +def test_antisymmetrize(): + """Test antisymmetrization of two-electron integrals.""" + one_body = np.eye(2) + two_body = np.zeros((2, 2, 2, 2)) + two_body[0, 0, 1, 1] = 1.0 + two_body[1, 1, 0, 0] = 1.0 + + mol_ham = MolHam(one_body=one_body, two_body=two_body) + mol_ham.spinize_H() + mol_ham.antisymmetrize() + + expected_two_body_aa = np.zeros((2, 2, 2, 2)) + expected_two_body_aa[0, 0, 1, 1] = 1 + expected_two_body_aa[1, 1, 0, 0] = 1 + expected_two_body_aa[0, 1, 0, 1] = 0 + expected_two_body_aa[1, 0, 1, 0] = 0 + + assert_allclose(mol_ham.two_body[:2, :2, :2, :2], expected_two_body_aa) + +def test_to_geminal(): + """Test conversion to geminal basis.""" + n_orb = 4 + two_body = np.zeros((2, 2, 2, 2)) + two_body[0, 0, 1, 1] = 1.0 + two_body[1, 1, 0, 0] = 1.0 + two_body[1, 0, 0, 1] = 1.0 + two_body[0, 1, 1, 0] = 1.0 + + geminal_true = np.array([ + [-2.0] + ]) + geminal = utils.tools.to_geminal(two_body, type='h2') + assert_equal(geminal.shape, (1, 1)) + assert_allclose(geminal, geminal_true) + + +def test_to_reduced_ham(): + """Test conversion to reduced Hamiltonian.""" + n_orb = 2 + one_body = np.eye(n_orb) + two_body = np.zeros((n_orb, n_orb, n_orb, n_orb)) + two_body[0, 0, 1, 1] = 1.0 + two_body[1, 1, 0, 0] = 1.0 + + mol_ham = MolHam(one_body=one_body, two_body=two_body) + reduced_ham = mol_ham.to_reduced(n_elec=2) + + + # sum over the spin-orbital indices + reduced_ham = reduced_ham[:2, :2, :2, :2] +\ + reduced_ham[2:, 2:, 2:, 2:] +\ + reduced_ham[:2, 2:, :2, 2:] +\ + reduced_ham[2:, :2, 2:, :2] + reduced_ham *= 0.25 + + reduced_ham_true = 0.5 * two_body + reduced_ham_true[0, 0, 0, 0] = 1 + reduced_ham_true[1, 1, 1, 1] = 1 + reduced_ham_true[0, 1, 0, 1] = 1 + reduced_ham_true[1, 0, 1, 0] = 1 + + assert_allclose(reduced_ham, reduced_ham_true) \ No newline at end of file From c93792c9c7dbfdc571e9f49c8d3d64a9d8874e1e Mon Sep 17 00:00:00 2001 From: = Date: Fri, 22 Aug 2025 13:37:56 -0400 Subject: [PATCH 4/4] fix style --- moha/molkit/hamiltonians.py | 3 ++- moha/molkit/utils/spinops.py | 3 ++- moha/test/test_molham.py | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/moha/molkit/hamiltonians.py b/moha/molkit/hamiltonians.py index 785f17f..db314eb 100644 --- a/moha/molkit/hamiltonians.py +++ b/moha/molkit/hamiltonians.py @@ -45,7 +45,8 @@ def antisymmetrize(self): if not hasattr(self, "two_body_spin"): raise RuntimeError( "Call .spinize_H() first to compute spin-orbital form.") - self.two_body_spin = antisymmetrize_two_body(self.two_body_spin, inplace=True) + self.two_body_spin = antisymmetrize_two_body(self.two_body_spin, + inplace=True) def get_spin_blocks(self): """Return the main spin blocks of the two-body spin-orbital tensor. diff --git a/moha/molkit/utils/spinops.py b/moha/molkit/utils/spinops.py index 5ecd13c..c4de044 100644 --- a/moha/molkit/utils/spinops.py +++ b/moha/molkit/utils/spinops.py @@ -49,7 +49,8 @@ def antisymmetrize_two_body( The operation applied is .. math:: - \langle i j \| k l\rangle=\langle i j \mid k l\rangle-\langle i j \mid l k\rangle + \langle ij\| kl\rangle= + \langle ij\mid kl\rangle-\langle ij\mid lk\rangle Keep in mind, that such operation produces terms of the form abba, baab, that are not present in the original tensor. diff --git a/moha/test/test_molham.py b/moha/test/test_molham.py index ac8f1ba..e65255a 100644 --- a/moha/test/test_molham.py +++ b/moha/test/test_molham.py @@ -25,6 +25,7 @@ def test_antisymmetrize(): assert_allclose(mol_ham.two_body[:2, :2, :2, :2], expected_two_body_aa) + def test_to_geminal(): """Test conversion to geminal basis.""" n_orb = 4 @@ -53,12 +54,11 @@ def test_to_reduced_ham(): mol_ham = MolHam(one_body=one_body, two_body=two_body) reduced_ham = mol_ham.to_reduced(n_elec=2) - # sum over the spin-orbital indices reduced_ham = reduced_ham[:2, :2, :2, :2] +\ - reduced_ham[2:, 2:, 2:, 2:] +\ - reduced_ham[:2, 2:, :2, 2:] +\ - reduced_ham[2:, :2, 2:, :2] + reduced_ham[2:, 2:, 2:, 2:] +\ + reduced_ham[:2, 2:, :2, 2:] +\ + reduced_ham[2:, :2, 2:, :2] reduced_ham *= 0.25 reduced_ham_true = 0.5 * two_body @@ -67,4 +67,4 @@ def test_to_reduced_ham(): reduced_ham_true[0, 1, 0, 1] = 1 reduced_ham_true[1, 0, 1, 0] = 1 - assert_allclose(reduced_ham, reduced_ham_true) \ No newline at end of file + assert_allclose(reduced_ham, reduced_ham_true)