{ "cells": [ { "cell_type": "markdown", "id": "85fb40ae", "metadata": {}, "source": [ "# `np.einsum` in physics: the classical Heisenberg model\n", "\n", "\n", "We consider classical unit spins\n", "\n", "$$\n", "\\mathbf S_i=(S_{ix},S_{iy},S_{iz})\n", "$$\n", "\n", "with Hamiltonian\n", "\n", "$$\n", "E=-\\frac12\\sum_{ij}J_{ij}\\,\\mathbf S_i\\cdot\\mathbf S_j.\n", "$$\n", "\n", "Written with Cartesian index $\\alpha$,\n", "\n", "$$\n", "E=-\\frac12\\sum_{ij\\alpha}\n", "J_{ij}S_{i\\alpha}S_{j\\alpha}.\n", "$$\n", "\n", "That is almost a direct `einsum` expression:\n", "\n", "```python\n", "E = -0.5*np.einsum(\"ij,ia,ja->\", J, S, S)\n", "```\n", "\n", "We will also batch many spin configurations,\n", "\n", "$$\n", "S_{cia},\n", "$$\n", "\n", "where $c$ labels the configuration, and compare:\n", "\n", "- explicit Python loops,\n", "- dense `einsum`,\n", "- matrix multiplication,\n", "- a nearest-neighbor $O(N)$ implementation.\n", "\n", "The main lesson is:\n", "\n", "> `einsum` can make a tensor contraction compact and fast, but exploiting physical structure can matter even more than vectorization.\n" ] }, { "cell_type": "code", "execution_count": 39, "id": "7cbf47c2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NumPy version: 2.5.2\n" ] } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import time\n", "\n", "rng = np.random.default_rng(12345)\n", "\n", "print(\"NumPy version:\", np.__version__)\n" ] }, { "cell_type": "markdown", "id": "3077b803", "metadata": {}, "source": [ "## 1. Random classical spins\n", "\n", "Generate random three-dimensional unit vectors.\n", "\n", "For each spin,\n", "\n", "$$\n", "|\\mathbf S_i|=1.\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 40, "id": "e8ccd0b8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape: (4, 8, 3)\n", "first configuration:\n", "[[-0.68014832 0.60367164 -0.41590722]\n", " [-0.32868482 -0.09555077 -0.93959371]\n", " [-0.87883624 0.41692759 0.23198761]\n", " [-0.60961542 0.73277904 0.3023308 ]\n", " [-0.5987272 0.71132442 -0.36816208]\n", " [-0.04086884 0.53121453 -0.84625107]\n", " [ 0.28659822 0.69625712 0.65809383]\n", " [-0.1594093 0.48026177 -0.86251801]]\n", "\n", "spin lengths:\n", "[1. 1. 1. 1. 1. 1. 1. 1.]\n" ] } ], "source": [ "def random_spins(nconf, N, rng):\n", " S = rng.normal(size=(nconf, N, 3))\n", " S /= np.linalg.norm(S, axis=2, keepdims=True)\n", " return S\n", "\n", "nconf = 4\n", "N = 8\n", "\n", "S = random_spins(nconf, N, rng)\n", "\n", "print(\"shape:\", S.shape)\n", "print(\"first configuration:\")\n", "print(S[0])\n", "\n", "print(\"\\nspin lengths:\")\n", "print(np.linalg.norm(S[0], axis=1))\n" ] }, { "cell_type": "markdown", "id": "dce848fd", "metadata": {}, "source": [ "The array shape is\n", "\n", "```text\n", "(nconf, N, 3)\n", "```\n", "\n", "which we can think of as\n", "\n", "$$\n", "S_{cia},\n", "$$\n", "\n", "with\n", "\n", "- $c$: configuration,\n", "- $i$: lattice site,\n", "- $a$: Cartesian component.\n" ] }, { "cell_type": "markdown", "id": "9702113d", "metadata": {}, "source": [ "## 2. Coupling matrix for a 1D periodic chain\n", "\n", "For a ferromagnetic nearest-neighbor Heisenberg chain ($J>0$) \n", "\n", "$$\n", "E=-J\\sum_i \\mathbf S_i\\cdot\\mathbf S_{i+1}.\n", "$$\n", "\n", "We can represent the same model with a symmetric coupling matrix $J_{ij}$.\n", "\n", "Each site couples to its two neighbors.\n" ] }, { "cell_type": "code", "execution_count": 41, "id": "00c5f229", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 1. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 1. 0. 0. 0. 0. 0.]\n", " [0. 1. 0. 1. 0. 0. 0. 0.]\n", " [0. 0. 1. 0. 1. 0. 0. 0.]\n", " [0. 0. 0. 1. 0. 1. 0. 0.]\n", " [0. 0. 0. 0. 1. 0. 1. 0.]\n", " [0. 0. 0. 0. 0. 1. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 1. 0.]]\n" ] } ], "source": [ "def coupling_matrix_1d(N, Jcoupling=1.0):\n", " Jmat = np.zeros((N, N))\n", "\n", " i = np.arange(N)\n", " Jmat[i, (i+1) % N] = Jcoupling\n", " Jmat[i, (i-1) % N] = Jcoupling\n", "\n", " return Jmat\n", "\n", "Jmat = coupling_matrix_1d(N)\n", "\n", "print(Jmat)\n" ] }, { "cell_type": "markdown", "id": "b95ba2a0", "metadata": {}, "source": [ "Because the matrix contains both $i\\to j$ and $j\\to i$, the Hamiltonian needs the factor $1/2$:\n", "\n", "$$\n", "E=-\\frac12\\sum_{ij}J_{ij}\\mathbf S_i\\cdot\\mathbf S_j.\n", "$$\n" ] }, { "cell_type": "markdown", "id": "570395cc", "metadata": {}, "source": [ "## 3. One configuration: direct `einsum`\n", "\n", "For one spin configuration `S[0]`,\n", "\n", "$$\n", "E=-\\frac12 J_{ij}S_{ia}S_{ja}.\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 42, "id": "ae1f5a1d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Energy = -3.267320767640373\n" ] } ], "source": [ "S0 = S[0]\n", "\n", "E0 = -0.5*np.einsum(\"ij,ia,ja->\", Jmat, S0, S0)\n", "\n", "print(\"Energy =\", E0)\n" ] }, { "cell_type": "markdown", "id": "241a0fcf", "metadata": {}, "source": [ "The subscript string\n", "\n", "```python\n", "\"ij,ia,ja->\"\n", "```\n", "\n", "means:\n", "\n", "- `Jmat` carries indices $i,j$,\n", "- the first spin array carries $i,a$,\n", "- the second carries $j,a$,\n", "- every index is repeated,\n", "- therefore all indices are summed,\n", "- the result is a scalar.\n" ] }, { "cell_type": "markdown", "id": "9fd81086", "metadata": {}, "source": [ "## 4. Check against the nearest-neighbor formula\n", "\n", "For the 1D chain the same energy is\n", "\n", "$$\n", "E=-J\\sum_i\\mathbf S_i\\cdot\\mathbf S_{i+1}.\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 43, "id": "83b6f99f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dense coupling matrix : -3.267320767640373\n", "nearest-neighbor form : -3.267320767640374\n", "difference : 1.3322676295501878e-15\n" ] } ], "source": [ "E_nn = -np.sum(S0 * np.roll(S0, -1, axis=0))\n", "\n", "print(\"dense coupling matrix :\", E0)\n", "print(\"nearest-neighbor form :\", E_nn)\n", "print(\"difference :\", E0-E_nn)\n" ] }, { "cell_type": "markdown", "id": "7eaa399a", "metadata": {}, "source": [ "## 5. Batch many configurations\n", "\n", "Now let\n", "\n", "$$\n", "S_{cia}\n", "$$\n", "\n", "contain many independent configurations.\n", "\n", "We want one energy per configuration:\n", "\n", "$$\n", "E_c=-\\frac12\n", "\\sum_{ija}\n", "J_{ij}S_{cia}S_{cja}.\n", "$$\n", "\n", "With `einsum`:\n", "\n", "```python\n", "E = -0.5*np.einsum(\"ij,cia,cja->c\", J, S, S)\n", "```\n" ] }, { "cell_type": "code", "execution_count": 44, "id": "08765257", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(20000,)\n", "[ 2.081494 2.67751369 -0.71217381 1.52763877 -2.31261718 1.40221317\n", " -3.83751225 1.8045518 1.79218141 -4.5771562 ]\n" ] } ], "source": [ "nconf = 20_000\n", "N = 32\n", "\n", "S = random_spins(nconf, N, rng)\n", "Jmat = coupling_matrix_1d(N)\n", "\n", "E_einsum = -0.5*np.einsum(\n", " \"ij,cia,cja->c\",\n", " Jmat, S, S,\n", " optimize=True\n", ")\n", "\n", "print(E_einsum.shape)\n", "print(E_einsum[:10])\n" ] }, { "cell_type": "markdown", "id": "01048e24", "metadata": {}, "source": [ "## 6. Energy distribution of random spin configurations\n", "\n", "For completely random spins, neighboring dot products fluctuate around zero.\n", "\n", "The total energy therefore fluctuates around zero as well.\n" ] }, { "cell_type": "code", "execution_count": 45, "id": "341261f5", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAHFCAYAAAA0SmdSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQE5JREFUeJzt3QeUFFW6wPFvkBwHUAmSoyBZgiQBQdJIEBWQIIIoCKuAYQUMLCssKAZ8C4rA4hJEMqiIgiCCBBFQRCQIApJzzqne+e473a+7p2emu6t6Qvf/d06fma66XXXrVnXV1/feuhVjWZYlAAAACFm60D8KAAAAAioAAAAHUEMFAABgEwEVAACATQRUAAAANhFQAQAA2ERABQAAYBMBFQAAgE0EVIinQ4cOcvfdd3tNq1evnjRr1izZSsvf+ipUqCCPPPJIsuUhoXykRh9//LHZZ5kzZ5b8+fNLWjzGIllqOo5S4nuUWpw8eVLSp08v//M//yOR4MqVK/Lcc89JoUKFJEOGDPLUU0/JwYMHzTZ++OGHktadTGP7K2oDKj3YdEcl9Bo/frxEq5s3b8qNGze8pul7nR6s6tWrS1xcXNCf87e+UPNgJ4/hWqeTfvrpJ+ndu7e88MILcubMGXNCTYvHWErTYyA2NjbB+TovlGM5tR1HqSkvyU0fDKLbfuvWLYkE7733nkyePFm+/vpruXz5skyYMCHNbePBRALAtLYt6SVK6Q7SHbV06VJp0KBBvPm33XZbiuQrtVq9erXExMQk28k71PWFIrE8Jmc+QvX999+bv126dDE1VAhPkGcnEEkLx1E0uP322+X69esRc37/9ttvzQ/CihUruqdpbVVa2kYrkaApre2vqA2oXHRHaXSMpMspOaWWL1BqyUdijh8/bv5mzZo1pbOCNHwcRYtIOt8fPXpUSpQoEdHbmD4NbUvUNvkF45VXXjG//F3t1XfeeafkyZNHOnfuLKdPn46XfteuXfLEE0/IXXfdZS5y5cuXN1Wzns+hdi3z0qVL0qdPH9PvpVixYmaeRurDhw83X5QcOXJIw4YNZfPmzfH6nWg/iIIFC5oI3pfm7Y477jB5ToiuZ8SIEfHWE2gfkJUrV0rTpk1N3vPmzSv169eX2bNne/26+PXXX2XJkiXuptRSpUrF68uxbds2ad68ueTKlUv69u2b4PpctmzZIo0aNZKcOXOavP/rX/+K9+tGm2f69esX77O6Pl1voHlMKB9atV6tWjXJnj27Ked27dqZfHlybd/OnTvN9ml+ixYtaso8UEmtR/P77rvvuv/X15AhQxJcXmJlrtNdy8iUKZM5tjp27GiO51C3K5hjLNhy/f333+WBBx4w21C5cmX57rvvzPzffvtNmjRpYvKl+3LmzJkSTtrc0rhxY8mdO7fZRq3xXrZsme3vTzDLD+VYC+R7FOz6/R1XetHX86F+1/TVo0cPOX/+vNnHL774YpLlO3bsWKlatar5ThcpUkQeffRRs49d/vzzT3PMTpo0SaZPny7lypUzy65Ro4Z88803SfbJ8fz8ggULTG1PtmzZzHGoLRiB0NpL/R5qPrWM9Fzeq1cvOXLkiDvNuXPnzPZqWet1oXjx4jJgwAA5e/Zs0HlZtGiRSafl7frf9+XbhBboflixYoX5vJ4Tfek1S69d/vI7e/Zs8z3MkiWLyZMrvSs/us1lypSRQYMGmeueq+bWdd3T87UrrevcnVAfKifLMtDjLCBWlPr3v/+t0Y21fPnyJNO++OKL1m233Wb17t3bmj17tnXy5ElryZIlVmxsrNW1a1evtFu2bLFy5cplNWnSxPr555+t06dPW3PnzrVy585tPf/88/GW2a1bN2vmzJnWsWPHrHHjxpl5mi5jxozWxx9/bB0/ftwsp2XLllaDBg2skiVLupexePFisw2fffaZVx6OHj1qPt+3b99Et2vAgAEm3YcffmjWs3HjRqtp06bx1qNq1aplNW7c2P3+zz//tLJkyWLWsX//fuvs2bPWmjVrrPbt21u7du0yaW7cuGFVrlzZLPP69evmpdNcypYta9WvX99q1qyZ9dNPP1kHDhywZsyY4Xd9rvT16tUz6Tds2GDyrGWm26Db4ilbtmx+t79NmzZmOS5J5dFfPgYOHGj23dtvv20dOXLE7PMHHnjArPPXX3/1yu/9999vtW3b1uRXj5u33nrL7DPd50kJZD2a3xdeeMEs05X/mzdvJrjMxMpcP+daxsWLF02eGzVqZJUoUcI6f/58SNsVzDEWTLnqNuj6dbp+d3r27GllzZrVWrdundW8eXPrl19+MdN79epllrlz584ky1vLRNeVEJ2naTx99NFHVkxMjDVo0CBrz5491uHDh60hQ4aYdX799de2vj/BLD+YfRLM9yiY9fs7ri5fvmzdc889VvHixa3vv//e5Gv+/PnmvJkpUyarX79+ie6T8ePHWxkyZLCmTZtmnTp1yhwX+vkOHTq40+i+1e18+OGHzf7WfOqre/fuJp96rnbRbdW077//frzPd+zY0ewP/azuk7i4OHNM6XGUGP3e6PlZz/sTJ060Dh06ZO3bt8+aMGGC9frrr5s0V65csapXr27ly5fP+uqrr0w5fPPNN1aBAgWsqlWrmnIKJi+3bt0y31Mtd12363urr71795pl6DXOJZj9oNdE/bzn/nXR8tRrl2/ZtWvXznr66afNca3H1OrVq818PZe68qX774svvrDy589v9o2LK78ffPBBvHOYv/3ldFkGepwFIuoDqnTp0pmDxPe1fft2dyHpAaQ7Rr8snl555RWT1vNioxeAQoUKWRcuXPBKqxcUXdfu3bu9lul50Cv9Imo6z4PWNV13uOdFSL9UpUuXNicyT8OGDTPL1kAsIXpgad59T6Cav/Tp0ycZUOmBp+twbU9CNFjxvQi56MlAt9XzApLQ+lzpNc/6pfWkAYUu56+//go6oEoqj775cJWbXsA96QVRA+wWLVp45VcvUrrvPFWoUMEcJ4kJZj2uYykQiZW5P3oS0mXrj4JgtyuYYyyUctXPuOgPF/1+5MmTx+s40M/rBWPw4MFJbqseA7qt/s4H+tJ5nsfJiRMnzInZ90eV0otcxYoVbX1/gll+MMdaoN+jYNfv77jSH4X+frjqBUynJxVQ6cWwfPnyiaZxXTgrVarkNV0vynfffbdVpUqVgAIqvUj7O/bfe++9RNc/ffp0k27q1KkJptHgStMsWLDAa7oGBDp97NixIeVFy10DBE/6vfC9tgSzH0IJqPQ4C5TmS48VV+DjL7+J7a9wlGUgx1kgor7JT6s1tVnM91W2bNl4tXmtWrXyel+pUiXTme6vv/4y77X6VDsI651AWrXo6cEHHzTV6T/88IPX9LZt23q91+pWTde6dWuv6YULF5YqVap4TdNOrs8++6xZpjZ/KP2s3qGoVZf6SojmU/Puu36tOvVdjz/33HOPWf8zzzxjqk8Ta1pMjFbDlixZMuD0Wua+fQa0WUi3e/ny5RJurnLzve1cm020SUebnTybTbQKXPed7zbv3r3b0fU4Ueb79u0zt13rMaDV9p7Nn77NfoFsVzDHWCjlqp1vXbSavkCBAqaZS6vrPT+vTe9a/R8I/d76Ox/oy/c7rce9Nl20b98+3nL0+67NBdpkEer3J9jlB3OsBfI9Cnb9/o4r3W+upl5Pbdq0kUDoMrdu3SovvfSSaZr37Dbhy3eZ6dKlM8fepk2bEtwPiZ3ftSlK857Ud3XhwoXmu6LN4wnRssyYMWO8dbRs2dIcV75NUKHmJSF290NSElrOd999Z7YxX758ZvtdzXl6nIW6LeEoy2COs8REfUDl6pTu+4pXUOnSmb5TnvRkrfRWdXXs2DFzoPznP/8xbcfaD0VfuvO1XV+dOHHC/Xk9oepFwJNrvh6AvvxN6969u2lDdrWX65fbdWFMTGLrCWQcI70gzpo1y5yotB+I9pnQ/hgzZsyQYOjFLhiJ5dezbBMS6hfFxXVi9t1vrnxcvXrVBNYu/tLpceM6Zpxaj90yv3jxounn8/PPP8vUqVPl8OHD5jZs1xAM165d80ofyHYFc4w5Ua56kkxoumffiqQkNJSKL1f/GA0CXd93/a7ry9UnJaELeSDfn2CXH8yxFsj3KNj1+zuudFn+1qX94/ScmhS9wL322mumH5yWmfY108BFL3qhbFNiQv2u6nlf151Y52ktJ71++NtmzaPrxhK7eUmI3f2QFH/7/ocffnD3EdQfTNrfWH84aD9Jf+eUQIWjLIM5zhIT9QFVoBK75dl1kdaO6ppOI/ALFy6Yi5S+9FeeXpy087h2nHMXfrp08e7+0WW4vqS+/E3TX+aPP/64uQjqOj/66CNz8uvUqVOi25PYerTzYiC0055egHUZenHQwE7zoh1DA6WD0QUjsfzql8BFL1BaHr4OHTokdrjKzV8Z6TS92OgFPKnjJqnALtj1BMNfmesvyf3798s777xjAis9rjTdgQMH/C4jkO0K5hhzqlxDLe9QuI437bTt+r7rd11fGgDq91074Yb6/Ql2+cFseyDfo2DX7++40v3qb116gQ+khlX3+5tvvmmOTe1w/9Zbb8nGjRvNMeo73lqg54aEhHrsaFCi605sSA0tB73Q+1uW5tE3f04fx8HsBz13Kt/zp+YzoW30t++nTZtmrkUaQGmFgtYeadCp+9KOcJRlMMdZYgioHKR3wdSpU8fUEumB5+9XblJj0egdNBpo6UnMNxDQqmt/9G4a/fX+z3/+UxYvXmyq7jUvgaxH8+pJD6iE1pMQvWNEq3w///xzs43abOmiX6JQf4n4o3eIaQ2cpy+++MKUq+d4Ytqc4Xt3mG6bv7s2gsmjq9x0Wz3pxUbHhHHNtyu51uN7ctGmPk8aqIcqmGMsubfXCXonodbazJ8/P+BarWC+P04tP9TvkRPr11o3vSNL7+by9NVXXwWdZ21+fvrpp+X99983F3sNRj35Hmd6TH/55ZfmDkQt43DRpiYNLufMmZNoOWgQ6nvXoTZP6bbo3arhFMx+0CYxPQ58z5/B7jPLskyg4llpoMGb7w9uV1N6oOfgcJdlUsdZYlLXGSoCjBkzxjSXPPzww/LLL7+YHa9Rs+78hx56KMkaEu0Dov0qRo8ebSJ8vaDs2LHD9JWqWbOm389oX6n77rtPRo0aZQ7ipJr7XOvR23r1dtQpU6aYA0dvwdURt2vVqpXk57Um7OWXXzYXRv3FqgGdTtPbh/X2b8++IhrE+J68Q6VloMNMaHu35lkv+B988IHZFu2b49KzZ0/zC2PcuHEmf3pyeP75582t1L6CyaP2z9GhM/RXlzazalOStsXrkBaaH7313AnJtR4X/SGgQbgOuaC/yLQ6XI8NOzV6wRxjyb29TtDmhbffftvkV5sLtC+lXlg139rsr0OX2Pn+2Fm+E98jJ9bfrVs30x9Vz0nr1683NfXab1WHXdBgLSl6a7+Wi/aB07LRY1Pz6rr93ZMO86EtAHq+1ZceT9q3NNzHjtYqavCp5fnpp5+api2t+dHzt9Z6uMpBAzstX23+0nLQJjE9T+mwOvo3nILZD3oe0GZeLfe1a9ea41ODbf0/mPHUHnroIVMW//jHP8x1bO/evWbwYT3f+q5Pm+W0756mC2RbnC7LYI6zxER9QKXjq/j75RXI+Cj+aPurXsi1Glh/uWg1vgY8GmjpF85fe66vf//73+YxItquqwebHkCvv/66+T+hk5BrzBc9GWoEHwhdj65DxxXRalRdj15Q/bW1+9KTqZ7A9Auq26odhPWXh55E9Evj8sYbb5gOf/pl9h3jKRS6Lv2Cat8xzbNelHRfafl60vFW9CKg69fmKy17PbH6q/oPNo/6y0UvNFp+ujzt4KtfwlWrVplRi52SXOtR+gtef+HrhV07FpcuXdp0RNeTjB3BHGPJub1O0SBdf7mvW7fOPc6NdqLXxwHp8Wf3+xPq8p36Htldv57/9KKtn9UO0breTz75xARvum+TCqoGDx7sHttKl6UXNw3qtBbPt9+O1vLpxVqDdZ2nF9u5c+fG65TsNA0y9LujXT2GDh1qtlGPXa0xefLJJ901v5pnvSZo3xwtR23y1T5GOj3cg/IGux90TKa6deua2h4NrLX2VNMGo3Xr1mY5GpjotUu3VW9m8HeTw8SJE835RpsbPceh8iccZRnMcZaYGL3VT6KQa7j7hGjzgquJQaspNb1vdO5aRihV7wktMzG6k/XA9B1UT+lJT38R6C8iOyfahPKm26nVwHaaXVzl7VpuYsv0N8+JPCRV7sHkMSkJfTaUfZ8YXZ6+AjkOQ9kePeFqXl3N1U5sl50ySGj9wU4PNk/hOBacEsw+CUdegl2m1nzqhUoHPPbsVxoKvRDrDwCt3QykdsL3eE5oWnLst0Dzl1BeEspfQsuwux/8rS/QdQV63dTleV5/g12+77KSc7+mnTHdHaaFGWgglFChB7OMQJeZEK2K1H4PWlPlj96doHlx/SKyw1/enLj4+y4jsWX6m+dEHpIq92DymJSEPuv0l9jz5BNqnhLje4w7sV12yiCh9Qc7Pdg8heNYcEow+yQceQl2mfPmzTN/77//fklu/s7ZCZ3HU+KRQcHkJaH8BXpdCnY/+FtfsNfAmCSum77z7PQVTO79GrUBVWqmHdI1eNKqUW0i1H4W2odKm0H0ry9tYtRh/7t27eo1Ng8ApDR9jJY2p2tXBL2Q6WNJ9Ieh1qjfe++9KZ29qMF+CL+o70OVGuldNnpHhrbn6q3iLVq0MP1a9A4Nz7GwtAOfRuDa1q2dIrXaFgBSE+3nonfAab8i7aunz3LTu6h0qAiwHyJJ1PahihTaRpyWnsYNAE6z088GcAoBFQAAgE00+QEAANhEW1EQ9BZkvc1U+zVRtQwAQNpgWZYZZ0/HfwvXMBgEVEHQYMr3ae4AACBt0EdfhetueAKqILgezqo7RJ9WDQAAUj+9c14rREJ9qHwgCKiC4Grm02CKgAoAgLQlJox3gtIpHQAAwCYCKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmAioAAACbCKgAAABsIqACAACwiYAKAADAJgIqAAAAmwioAAAAbCKgAgAAsImACgAAwCYCKgAAAJsIqAAAAGxKb3cBABApig38KsF5e0fGJWteAKQtBFQAokZiAVM4l00wBkQ+mvwAAAAiIaA6ffq0bNq0SS5cuJBgmpMnT8r27dvlypUrYU8DAACQZgKq3377TZ588kkpXbq0VK1aVTZs2BAvzfXr16Vbt25SsGBBefDBB+XOO++USZMmhSUNAABAmutDtWbNGmnQoIG8+uqrUqZMGb9phg8fLkuWLJEdO3ZIsWLFZPr06dK1a1cTgOnLyTQAkBL9rwCkfSlaQ9WrVy/p3r27ZMmSJcE0EyZMkJ49e5ogSHXq1EnKli0rEydOdDwNAABAmu1DlZDDhw/LoUOHpGbNml7T77vvPvn5558dTQMAABCRwyZoB3KVN29er+n6/sSJE46m8efq1avm5XLu3DmbWwQAACJRqq6hypAhg/nrGdS43rvmOZXGnxEjRkiuXLncr8KFCzuyXQAAILKk6oDqrrvukpiYGNNk50mb71zBjVNp/Bk0aJCcPXvW/dq/f7+DWwcAACJFqg6osmfPbvo9LVq0yD1Nx49atmyZNG7c2NE0/mTKlEly5szp9QIAAEhVfahOnTol+/btk2PHjpn3u3btktjYWMmfP795qX/+858SFxcn5cqVk9q1a8vo0aMlR44c5g5BF6fSAAAApLkaqlWrVpmBPf/+979L5cqVZcyYMeb9ggUL3GmaNm1qapbWrVtnmuB0QE79nPZpcjoNAABAKGIsy7JC+mQU0rv8NADT/lQ0/wFpT0oNzsnDkYHIv36n6j5UAAAAaQEBFQAAgE0EVAAAADYRUAEAANhEQAUAABDJz/IDgLRyJx+A6EYNFQAAgE0EVAAAADYRUAEAANhEQAUAAGATARUAAIBNBFQAAAA2MWwCAKTwUA48PBlI+6ihAgAAsImACgAAwCYCKgAAAJsIqAAAAGyiUzoApOJO63RYB9IGaqgAAABsIqACAACwiYAKAADAJgIqAAAAmwioAAAAbCKgAgAAsImACgAAwCYCKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmnuUHIGKeewcAKYUaKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmOqUDSHXoeA4graGGCgAAwCYCKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmAioAAACbCKgAAABsIqACAACwiYAKAADAJgIqAAAAmwioAAAAbCKgAgAAsImACgAAwCYCKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmAioAAACbCKgAAABsIqACAACwiYAKAADApvR2FwAAwSo28CsKDUBESRMB1a5du2TJkiVy+vRpKVKkiDz88MOSPXt2rzQ6b86cOXL06FGpWLGitG7dWmJiYoJOAwBpKfjcOzIu2fICIA03+U2ZMkXuueceWb16tVy6dEk+/PBDKVWqlOzevdud5q+//jIBkqY9efKkPPfcc9KmTRu5detWUGkAAABCEWNZliWpWPny5aVRo0YyduxY8/769esmoOrcubP861//MtM6dOgg+/btkx9++EHSp08vf/75p9x9990ydepU6dixY8BpknLu3DnJlSuXnD17VnLmzBnGrQYiG01+zqGGCkgd1+9U3+QXGxvrVYuk8Z++z507t3l/48YN+fLLL+Wdd94xgZIqWbKk3H///TJv3jwTLAWSBgAiLTgl2AKST6oPqCZOnCi9evWSxx57TIoWLSpr1qyR5s2by9/+9jczX2udLl++bGqtPJUuXVrWrl0bcBp/rl69al6eES4AAIBjfai02szl+PHjMm7cOPn222/FadqB/ODBg5IuXTrJmDGj3Lx5U/bu3SsXLlww8y9evGj++lbhadWea14gafwZMWKESeN6FS5c2PHtAwAAURpQTZ48WQYMGGD+1+a0Bg0ayJAhQ6RVq1Yyfvx4xzKn/aW071PXrl1l5syZps+U1ihpp/JXXnnFpHHd7ecZ4KkzZ8645wWSxp9BgwaZz7he+/fvd2zbAABAlAdUo0aNcgc0K1asMM1iGmwsXLhQRo8e7Vjmjhw5Ymq/6tat+/8ZTpdOatWqJb/++qt5r8MoZM2aVf744w+vz+p77XQeaBp/MmXKZGq1PF8AAACOBFQ6ZIH2Z1LfffedtG3b1jTH1atXzzTHOaVgwYKSI0cOE7S5aI2Y9qNyBUK33XabGf5Ah0PQGi21Y8cOczffo48+GnAaAACAZO2Urn2JtL9U06ZNZfbs2fLBBx+Y6RpMuQItJ2ggNGbMGHnmmWfk999/lxIlSpgA7sSJE/Lmm2+607311ltSv359U5NVvXp1WbBggQnyHnnkkaDSAAAAJNs4VJMmTTJBjjaj6Z1z69atkwwZMsjgwYNNs9jAgQPFSToo5/Lly03fKQ3Y4uLiJEuWLF5pzp8/L/Pnz3ePgt6sWbN4o6AHkiYxjEMFOINxqJIHwyYAyXf9Dnlgz+3bt5vhCLSZTwMrNWvWLNMx3TfYiRQEVIAzCKiSBwEVkAYG9tQ+TL4dutu3b+9EngAAANKUkAMq7Siuz9c7depUvHk6IjkAAEC0CCmgGj58uLzxxhumc7frETAAAADRKqSASh9UrGNOtWjRwvkcAQAARMM4VFeuXDGjowMAACDEgKpOnTpeg20CAABEs5Ca/CpVqiQdO3aU3r17m3GofMdy6tmzp1P5AwAAiMyAavr06aYzuj6w2B8CKgAAEE1CCqicfF4fAABAVPahAgAAgAMDe+pz8SZPnizbtm0TfXpN+fLlpVu3bpIjR45QFwkAABA9AdXmzZuladOmcvPmTalcubLplD579mwZNmyYLFmyxHRaBwAAiBYhNfn1799f4uLiZP/+/bJ06VL59ttvzf86TecBAABEk5BqqNauXWvu8MucObN7mv4/YsQIKVq0qJP5AwAAiMwaqixZsvh9KPLJkyfNPAAAgGgSUkDVpk0b6dSpk/z4449y/fp189Jaq86dO5t5AAAA0SSkgGr06NGmaa927dqmqU9f+jiaYsWKmXkAAADRJKQ+VLly5ZJ58+bJzp07ZevWreYuv3Llyknp0qWdzyGANKnYwK9SOgsAkPrHoVIaQBFEAQCAaBdwQOVqytNhEZJq1mPoBAAAEE0CDqgmTpzoDpZc/yeEgAoAAESTgAOqLVu2uP/ftGmTpE/v/6M3btxwJmcAAACRfJdfhgwZQpoHAAAQiWx1Svd19epVyZQpk5OLBACE6U7LvSPjKFsgJQKqMWPG+P1f3bp1S3766ScpX768U3kDAACIroBKm/p0YM/x48c7lzsAAIBIC6i2b99u/tarV09WrVoVrjwBAABEfqd0gikAAACHOqVfunRJ9u3bF2+ohAoVKthZLAAAQOQHVEePHpUePXrIokWL/M63LMtuvgAAACK7yW/AgAFmYM9t27aZ93v27JGZM2dK4cKF5YMPPnA6jwAAAJFXQ7Vs2TJZv369FClSxLzXQErv8CtYsKD07t1bnn/+eafzCQAAEFk1VMeOHTNBlIqNjZUTJ06Y/6tVqyY7d+50NocAAACRGFCpmJgY87dSpUoyadIkuXnzpkybNk3uuusuJ/MHAAAQmU1+jRs3dv8/dOhQadWqlbz22muSLl06+eSTT5zMHwAAQGQGVEuXLnX/37BhQ9m7d6/89ttvUqpUKSlUqJCT+QMAAIjMJr+ePXt6vc+bN68JrAimAABANAopoJo+fbpcuXLF+dwAAABES0BVt25dWbx4sfO5AQAAiJY+VDVq1JDOnTvLk08+KeXLl5eMGTMm2iQIAAAQyWKsEJ4To4N4JkY7qUeic+fOSa5cueTs2bOSM2fOlM4OkKoVG/hVSmcBSdg7Mo4yQlQ4lwzX75BqqCI1YAIQOAImAHBgYE8AAADYqKEaOXJkovMHDhwYymIBAACiJ6CaM2eO1/tbt26ZZsDTp09LlSpVCKgAAEBUCSmg2rBhQ7xp169fl759+7ofmgwASLv94OiwDqRQH6oMGTLIsGHDZPLkyU4tEgAAIPo6pWst1bFjx5xcJAAAQGQ2+S1YsCDeNO0/NW7cOKlfv74T+QIAAIjsgKpLly7xpuXOndsEU++++64T+QIAAIjsgOrChQvO5wQAACCNYmBPAACA1DawZ6ZMmaREiRLStGlTyZIli528AQAARPbAnhs3bpTMmTObByXHxMTI7t275erVq3LPPffIX3/9ZR5CuHLlShNcAQAARLKQmvy09qlDhw5y6NAh2bZtm2zdutX8/9hjj0nr1q3lyJEjUq9ePRkwYIDzOQYAAEhlYizLsoL9kNZKrVu3TvLly+c1XQOp2rVry549e0wtVY0aNSJqXKpz586ZmrezZ89Kzpw5Uzo7QKodZRtpHyOlI5KcS4brd0g1VEePHpWLFy/Gm67TdJ7SDKdLR593AAAQ+UKKeB588EHp2rWr/PLLL+bByPrS/3V8Kp2nvv76a2nWrJkjmdSI8o033jDNiNrc6PtwZvXNN99IXFycVK9eXbp3724e1hxKGgAAgGQJqCZMmCA5cuSQatWqmbv69KX/a3Xa+PHjTRoNst577z2xS0dgv++++0wH9yFDhpjX3LlzZc2aNV6BUqtWrdwDi545c8YEX/o3mDQAAADJ1ofKZceOHaZTut7ld/fdd0vZsmXFac8//7x51M327dsla9asXs8N1Acyq1q1akmZMmVk6tSp5r3ebZg/f3555ZVXZODAgQGnSQp9qID/Rx+qyEYfKkSSc6m1D5WLBlBt27aVNm3ahCWYUp999plpXvQMppQrmNJR29evXy8tW7Z0z9MasyZNmsjy5csDTgMAABD2caimTZtm/mo/Kdf/wTzrLxTHjx+XEydOSPHixaV3795m7KuCBQtKt27dpF27dibNwYMHRSvZChQo4PVZff/7778HnMYfrcXSl2eECwAAEHJA9dJLL7mDJa0x8h0yIRwB1bVr19zr1k7pPXr0MMM1PP744zJ27Fjp2bOn3Lhxw6TJmDGj12e1BkqbBVUgafwZMWKEDB061JFtAQAAkSvggEr7MMXGxnqNORVuefLkMf2zdLDQF154wUyrWbOmbN68WT766CMTUOXNm9dMP3nypNdn9f3tt99u/g8kjT+DBg1yr9dVQ1W4cGEHtxAAAESCgPtQ5c6dW5KbPguwQoUK7oDIRYOg8+fPm/+1Y7k2A2rNlae1a9fKvffeG3Aaf7QGSzuveb4AAABCDqiyZcuWIkMM9OnTR2bNmmVGXlcHDhyQ6dOnS4sWLdxpevXqJRMnTjTPE1RTpkyRP/74w9RgBZMGAAAgrE1+DzzwgNStW9fUGKmOHTsmmHbGjBniFA2E9FE2ut477rhDDh8+bJ4ZqP2bXAYPHmwG6dShG7T26tKlSzJp0iSpUqVKUGkAAADCOg6VNrHpoJ07d+6Ujz/+WJ566qkE02pNkNN06APtt1WoUCHJnDlzgoOA6l2BRYoUMc11oaZJCONQIZowzlR0YxwqRJJzyTAOVUgDe2qtzqZNmyTaEFAhmhBQRTcCKkSSc6l1YM9oDKYAAABs96HytWLFClm9erWcOnUq3rx33nkn1MUCAABER0A1fPhwM9Bm9erVU2Q4BQAAgDQfUOko5QsXLvQaugAAACBahdSH6sqVK9KgQQPncwMAAJAGhRRQ1alTx/ShAgAAQIhNfpUqVTIDe/bu3VtKlSplnrfnidHHAQBANAkpoNJHv2hn9JkzZ/qdT0AFAACiSUgBlT7CBQAAADb6UAEAAMCBgT312X6TJ0+Wbdu2iT69pnz58tKtWzfJkSNHqIsEAACInoBq8+bN0rRpU7l586ZUrlzZdEqfPXu2DBs2TJYsWWI6rQMAAESLkAKq/v37S1xcnBngM3PmzO6xqfr27Wvmfffdd07nE0AY8ABkAEjBgGrt2rXmDj9XMKX0/xEjRkjRokUdyhoAAEAEd0rPkiWL34cinzx50swDAACIJiHVULVp00Y6depkmvzuvfdeM23Dhg2myU/nAQAiuzl478i4ZMsLELE1VKNHjzZNe7Vr1zZNffrSx9EUK1bMzAMAAIgmIdVQ5cqVS+bNmyc7d+6UrVu3mrv8ypUrJ6VLl3Y+hwAAAJE6DpXSAIogCgAARLuQmvy0VurVV1+NN33w4MFmoE8AAIBoElJA9dxzz0njxo3jTW/SpIn069fPiXwBAABEdkCl41DVrFkz3vQaNWrImjVrnMgXAABAZAdUefPmlU2bNsWb/ssvv0hsbKwT+QIAAIjsgKpz587So0cP84iZa9euydWrV2XZsmVmmo5PBQAAEE1Custv6NChsmfPHtOPKl26/4vJbt26Je3bt5c333zT6TwCAABEXkCVKVMm8yw/DZ60mU/HoapatSpDKAAAgKhkaxyqMmXKmBcAAEA0C6kPFQAAAByqoQIARKfEHp7Mg5MRjQKuoTpz5kx4cwIAABDpAVXu3Lnd/zdv3jxc+QEAAIjcgCp79uzuWqrFixeHM08AAACR2YeqYcOGUrduXalQoYJ537FjxwTTzpgxw5ncAQAARFJANW3aNJkwYYLs2rXLXWMFAACAIAKqXLlyyUsvvWT+//HHH2XixImUHwAAQKjjUPl7MDIAAEC0CnkcqvPnz8vkyZNl27ZtYlmWlC9fXrp16yY5cuRwNocAAACRGFBt3rxZmjZtKjdv3pTKlSubZ/nNnj1bhg0bJkuWLJFKlSo5n1MAAIBIavLr37+/xMXFyf79+2Xp0qXy7bffmv91ms4DAACIJiHVUK1du1ZmzpwpmTNndk/T/0eMGCFFixZ1Mn8AAACRWUOVJUsWOXXqVLzpJ0+eNPMAAACiSUgBVZs2baRTp05m+ITr16+bl9Zade7c2cwDAACIJiEFVKNHjzZNe7Vr1zZNffqqU6eOFCtWzMwDAACIJiH1odJBPufNmyc7d+6UrVu3mrv8ypUrJ6VLl3Y+hwAAAJE6DpXSAIogCgAARLuQmvwAAADw/wioAAAAbCKgAgAASImAqmfPnnbXCwAAEN0B1fTp0+XKlSvO5wYAACBaAqq6devK4sWLnc8NAABAtAybUKNGDTMq+pNPPinly5eXjBkzes2nSRAAAESTGMuyrGA/pCOiJ2bv3r0Sic6dO2cGNT179qzkzJkzpbMD2FZs4FeUIhy3d2QcpYqou36HVEMVqQETAABAKBg2AQAAIKUCqnXr1smzzz4rzZo1c0+bNGmSXLhwwW6eAAAA0pSQmvy+/PJL6dChgzz66KOyZMkS9/RDhw7Je++9J2+88YaEgw7VcODAAYmNjZXbb7893vyLFy/K6dOnpUCBAnLbbbf5XUYgaQAA4eubRx8rRKKQaqiGDBki06ZNkylTpnhNb9++vamlChe9e1Afxjxs2DCv6Tdv3pS+fftKnjx5pFKlSpI/f36ZMWNG0GkAAACSLaDavn27NG/e3PwfExPjnl6wYEFTSxUO//3vf2X37t1SoUKFePPefvttmTVrlmzatElOnTolw4cPly5dusiWLVuCSgMAAJBsAVXu3Lll37598QKqVatWSeHChcVpO3bskMGDB5taMX/NdB999JGpvSpXrpx5/8wzz0iJEiVk/PjxQaUBAABItoBKB/Xs06ePe/iEy5cvy+eff24Clq5duzq6J65evSodO3aUESNGmADI19GjR2X//v1Su3bteKO5b9iwIeA0AAAAyRpQvfnmm6ZTd/HixeXWrVuSPXt2adu2rTRs2FBeffVVcdJLL71k+k1169bN7/wTJ06Yv3nz5vWarp3WXfMCSZNQMKeDgXm+AAAAHLnLL1OmTPLpp5+awGrjxo0mqKpataqUKVNGnLR06VLTzKd3Eu7atctMu3btmhnpVN+XKlVK0qX7v5jw+vXrXp/VdK7mwUDS+KO1YkOHDnV0mwAAQOQJKaBy0SY4f81wTjly5IipVXr88cfd07TpTju+//DDD6ZvVaFChdxpfT/rmhdIGn8GDRokL7zwgvu91lCFo48YAACI0oE9FyxYIA0aNJA777zTvLS574svvnA0c3oXntZEeb60U7k+lFn/19qlHDlyyL333iuLFy/2qnnS2i3NkwokTUI1cfrMH88XAACAIzVUOnin9pXSfk1PPPGEmbZ+/Xoz2Kc2k/Xv31+Sk46L1a5dO6lSpYrpeK75y5gxo/Tu3TuoNAAAAMlWQzVq1CjTt2ncuHHy1FNPmZf+P3XqVDPeUzgVKVJE7rjjDq9prVq1ktmzZ5s7Dbt3726mrVy50qsTeiBpAAAAQhFjWZYV7If00S86DpVvE5j2MSpatKh5tEsk0u3LlSuX6RRP8x+i4REhQDjw6BlE4vU7pBqqWrVq+e0vpdNq1qzpRL4AAAAirw/VxIkT3f/rEAk9evSQRYsWSY0aNUQruXSAzDlz5siLL74YrrwCAACk7Sa/YsWKBbxQ1wjqkYYmP0QamvyQEmjyQyRev9NHe5AEAACQYuNQAQAAwOZI6Xon3+bNm/3e0afP9QMAAIgWIQVU8+fPN4N6XrhwQbJmzRpvvk4HAACIFiEFVHon3+uvvy79+vUzo40DSJ0dy+n8CwCpuA/V4cOHpU+fPgRTAAAAodZQ6cCeP/30kzRq1IhCBAAEhVpVRKKQAqoxY8bIww8/LJ07d5aSJUtKTEyM1/wuXbo4lT8AAIDIDKi++eYb2bVrl3kQsr8BsgioAABANAkpoBo1apSMHTtWnn322Xi1UwAAANEmpIDq6tWrZtgEgikgdePRMgCQiu/yq1atmqxatcr53AAAAERLDVWlSpWkQ4cO0qtXLylVqlS8mqqePXs6lT8AAIDIDKgWLFggsbGxMnPmTL/zCagAAEA0CSmg2rt3r/M5AQAAiKY+VAAAALBZQzVy5MhE5w8cODCUxQIAAERPQDVnzhyv97du3TLNgKdPn5YqVaoQUAEAgKgSUkC1YcOGeNOuX78uffv2lcKFCzuRLwAAgOjrQ5UhQwYZNmyYTJ482alFAgAARF+ndK2lOnbsmJOLBAAAiNxxqHxp/6lx48ZJ/fr1ncgXAABAZAdUXbp0iTctd+7cJph69913ncgXAABAZAdUFy5ccD4nAAAAaRQDewIAAKREDZVasWKFrF69Wk6dOhVv3jvvvGM3XwAAAJEdUA0fPlzeeOMNqV69uuk7BQAAEM1CCqjGjh0rCxculBYtWjifIwAAgGjoQ3XlyhVp0KCB87kBAACIloCqTp06pg8VAAAAQmzyq1SpknTs2FF69+4tpUqVkpiYGK/5PXv2pGwBAEDUCCmgmj59uumMPnPmTL/zCaiA4BQb+FWC8/aOjKM4ASASA6q9e/c6nxMAQNRL7MeFuf7wAwOpFAN7AgAA2ERABQAAYBMBFQAAgE0EVAAAADYRUAEAANhEQAUAAGATARUAAEBKjEMFIPWMywMASHnUUAEAANhEQAUAAGATARUAAAABFQAAQMqihgoAAMAmAioAAACbCKgAAABsYhwqAEBEjMu2d2RcsuYF8EQNFQAAgE0EVAAAADYRUAEAANhEQAUAAGATARUAAEA03OW3ZcsWWbt2raRPn17q1KkjZcuWjZfmwoUL8uWXX8rRo0elYsWK0rhx45DSAAAARFQNlWVZ0qJFC+nUqZOsX79eli1bJlWrVpWhQ4d6pTt48KBUqlRJ3nnnHfn999+lc+fO0rFjR/P5YNIAAABEXA2VBjv9+vWT5s2bu6fNnTtXHn30URMMuWqqBg4cKLlz5za1WBkzZpStW7ea4Kl9+/bSrl27gNMAAABEXA1VunTpvIIpVa9ePfN39+7d5u/Nmzdl/vz50q1bNxMoqfLly5t0s2fPDjgNAABARNZQ+TNnzhzJkCGDafpT+/btk4sXL8brV6Xv161bF3Aaf65evWpeLufOnXN4awAAQCRI1TVUvn7++Wd55ZVX5LXXXpP8+fO7O5qrXLlyeaWNjY11zwskjT8jRowwn3G9Chcu7Pg2AQCAtC/NBFTakVyb/7Qz+euvv+6eni1bNr+1R2fPnnXPCySNP4MGDTJpXK/9+/c7uk0AACAypImASjuQP/DAA9KmTRsZN26cxMTEuOcVKVJEMmfOLLt27fL6jL4vU6ZMwGn8yZQpk+TMmdPrBQAAkOYCqm3btplgqnXr1jJ+/HivYErp2FQPPfSQTJs2zXQ+d3VYX7FihfvuvUDSAAAAhCrGSsUDMV26dElKlSplgqD+/ft7BVMtW7Y0wx6oPXv2uAf8rFmzpsyaNcvcxbdw4UJzp2CgaZKiTYbal0qb/6itgpOKDfyKAgVs2jsyjjJEil2/U/1dfk888YT5q4XgyfPuu+LFi5vR1GfOnGlGQdfBO7XmyTNQCiQNACByf5gQcCFqa6hSG2qoECpqoICUR0AVvc4lQw0V1TMAAAA2EVABAADYREAFAABgEwEVAACATQRUAAAANhFQAQAA2ERABQAAYBMBFQAAgE0EVAAAADYRUAEAANhEQAUAABDpD0cG0gqe1wcA0YsaKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmAioAAACbCKgAAABsIqACAACwiXGoAAAS7WPF7R0Zl6x5QeShhgoAAMAmAioAAACbCKgAAABsIqACAACwiU7pQIB4+DEAICHUUAEAANhEQAUAAGATTX4AgKiXVJM+41QhKdRQAQAA2ERABQAAYBMBFQAAgE0EVAAAADYRUAEAANhEQAUAAGATwyYAHhgNHQAQCmqoAAAAbKKGCgAAG7XXDPoJRQ0VAACATQRUAAAANtHkBwCADTwHEIoaKgAAAJsIqAAAAGyiyQ9RhXGmAADhQA0VAACATQRUAAAANtHkh4hDsx4AILlRQwUAAGATARUAAIBNBFQAAAA20YcKaQ59pACkJTxYOTpQQwUAAGATNVQAAKQQngMYOaihAgAAsImACgAAwCaa/AAASKXo0J52EFAhVeJOPgCwd57cOzKOIkxGNPkBAADYFFU1VCtXrpSxY8fK0aNHpWLFijJ48GApUKBASmcrKlEDBQCIJFFTQ7V8+XJp3LixlC5dWl5++WXZuXOn1K1bV86fP5/SWQMAAGlc1NRQvfbaa/LII4/IsGHDzPtGjRqZ2qnx48fLiy++mNLZi0jUQgFA6kT/K+fFWJZlSYS7dOmS5MiRQ6ZMmSKdO3d2T9cAS+d9/fXXAS3n3LlzkitXLjl79qzkzJlToh0BEwBEp7TW4f1cMly/o6KGav/+/XLr1i0pWLCg13R9v2zZsgQ/d/XqVfNy0R3h2jGpSYUhixOdv2Vos7B89tbVSwHkDgAQaYoMmB3yZ7ckcl0JF9d1O5x1SFERUF2/ft38zZQpk9f0LFmyuOf5M2LECBk6dGi86YULF5a0JNfolPksAACp6bqi/aa1piocoiKgypMnj/l76tQpr+knT56UvHnzJvi5QYMGyQsvvOB+r7Vcugz9TExMTBhzHBn0F4EGn1pDSBMpZZyWcSxTxpEgmo9jy7JMMOXbUuWkqAiotADz588v69evl4ceesg9fd26dVK/fv0EP6c1Wr61WrGxsWHNayTSL260fXmTG2VMOUcKjmXKOFzCVTMVdcMm9OjRQyZOnCgHDx407+fOnStbt2410wEAAOyIihoq9cYbb5ixp0qVKmWqPA8cOCBjxoyRGjVqpHTWAABAGhc1AZU23c2aNUsOHTpkRkrXwEqHUkB4y3zIkCHxmk1BGac1HMuUcSTgOA6vqBiHCgAAIJyipg8VAABAuBBQAQAA2ERABQAAYBMBFcJGbwDQkebr1Kkj7777rt80R44ckeeff14aNmwo7du3l++//549YoOW83333ef16tixI2Uaol27dknPnj2lQYMG8sQTT8imTZsoSwdt37493vGqr99//51ytuHnn3+Wp59+2pTlypUr/ab56aefzLNt9dju3bu3/PXXX5S5TVFzlx+Slw6i+uijj5qL0JkzZ2TPnj3x0ly4cEHq1asnJUuWlJdfftkMtPrggw/KN998I40bN2aXhUDLWe/keeutt7wesYTg6dAqekFq1qyZDBw4UL744gtzvOpxes8991CkDtBzgJbnt99+K9mzZ3dPL1q0KOUbolGjRslnn31mzr069qLvE0LUhg0b5P7775c+ffpIly5dZMKECVK7dm359ddf5Y477qDsQ8RdfgiLS5cuScaMGSV9+vTmolS9enUz7pen999/3wyroLVUWbNmNdO0NkV/Ka1du5Y9E4K//e1vJhBYsGAB5WdTv379THC/bds2SZfu/yrz9aJTrFgxc8GCfXph17EAT58+zVMoHHL27FkzIrgGqzo00Pz586Vt27ZeaeLi4uTmzZvm+Fb6TFsNYp966il58803ncpK1KHJD2GhAZIGU4lZtmyZqYlyBVOqTZs25herPnMJodm4caM88MAD8vDDD5smwKtXr1KUIdDjs2XLlu5gSrVu3drUpsBZjz/+uDRp0kSee+4508yK8D1eRZ9Ju3z5cmnVqpV7WoYMGaRFixaydOlSit4GAiqkGK2J8n1Qpb7XodH04Z0InjbvaRW+NlFpcDpu3DjTR+LGjRsUp0PHpz5UXWtg4Qy9kHfv3l0GDBggJ06ckAoVKpiaK4TH8ePH5fLly36PbfpR2UMfKgRk9erV8uKLLyaapm/fvtK1a9eAS1SrmX1HUXf199F5EBkxYoR8/vnniRbFzJkz3X1Ohg0b5lWmGkyVKVNGZsyYYQItBI7jM/wqVqwoixYt8mqK0poq/UFAbUl4uM6t/s69nHftIaBCQLQT7ujRoxNNU6RIkaBKM0+ePPE6TOqvf5U3b172jIh06NBBGjVqlGhZ5MuXz/2/70myePHiptO/djYloBJHjk9tHuGxVc7w91gqDagSuisY9uXOnVtiYmL8Htucd+0hoEJAYmNjTedyJ1WrVs205XvS/lN6l8ldd93FnhGREiVKmFeotOOpVvFny5aN8gzh+NS7VX2Pz8qVK3v1q4Kz9CYVjtfw0bLVWms9tj1/ZOmxXbVq1TCuOfJxVkCK6dGjh7mDas6cOe5xq/Q2X52uv6AQfPCkTYSuTuj6fvDgwXLu3DkzhAWCo3c8abPTmjVrzPstW7bI3LlzzXQ447///a/8+eef7vd6d6+eAxg7Lbz0GP7000/dZa83WmjZc2zbpA9HBpx26dIlq1atWuaVPXt2K1++fOb/Tp06eaUbN26clTVrVqtUqVJW5syZrXbt2lmXL19mh4RoyJAh1u23325VqFDByps3r1WiRAlr4cKFlGeIXn/9dStTpkxWmTJlrIwZM1p9+vSxbt26RXk6ZPny5eZYLVasmPsc8PLLL1vXrl2jjEO0YsUKc66tUaOGpZd4PXb1/fvvv+9Oc+PGDevJJ590H9ta7iNHjqTMbWIcKoSF3pqrI/H60iESKlWq5DVNx0vZuXOn3HnnnTT1OUA7lv7xxx+mmVbv3KG2zx4dI2nv3r1SqFAhBj0ME72r9+LFi6bPn79+VQjueN2xY0e86QUKFIg3YOrRo0dNy4B2K0hquAUkjYAKAADAJvpQAQAA2ERABQAAYBMBFQAAgE0EVAAAADYRUAEAANhEQAUAAGATARUAAIBNPMsPAJLBjz/+aAYI9few2mbNmrEPgDSOgAoAksGYMWPMswEbNmzoNb1YsWIEVEAEIKACkCrt2rXLPJA4X758Uq1aNa9Hkuh0fWxG/fr15ddff5Xjx4/Lvffea9KGspx69eqZhyCfOHFCHnvsMTNPHyr9ww8/SM6cOaVq1ary22+/SYYMGaR69eqyefNmOXLkiDRt2tRrXZs2bTJ5efDBB/1uU4UKFWTGjBkOlhKA1IKACkCqcuPGDenZs6csWrRIatWqJQcOHDDPefv888+lXLlyJs2cOXNk6tSpJtjJmzevXLp0yQQ8X331ldx///1BLydbtmzmOX358+c3AdUvv/xigiV9vqQ+D3H37t2SPXt2qV27tgmojh07Jq1atZKDBw/K7bff7s579+7dzecSCqgARC4CKgCpyqhRo0yt059//ik5cuQw0wYMGCBPP/20rFq1yp1uz549smzZMmnUqJE7mBk6dKiZFsxyNFj68ssv5aGHHnJP+9vf/maWq7VJ6dKlM011GiRpQKUaN25sHpY8bdo06d+/v7t2Sl+J1UBpbZjv/FKlSpkgDUDaRkAFIFX55JNPpE6dOrJ48WKxLMu8tBZq7dq1cuXKFcmcObNJd/fdd7uDKaV9k1599dWgl1O8eHGvYOrw4cOm+U87kWswpZo0aSJVqlRxp4mJiZEePXqYdbgCqv/85z9St25dKVu2bILbps2BCxYs8JqmgRoBFZD2EVABSFX0TjhtRtPmOE/aFKdNe65AKE+ePF7ztW+UBkrBLqdAgQJe8/fv3+/uLO7J973WiA0ZMkQ2bNggFStWlOnTp5tascTQhwqIXARUAFIV7RfVtm1b+fvf/54sy9HaJk+uQO3MmTNendxPnz7t9V77VrVs2VImTZokDRo0kGvXrkn79u1t5RlA2sXAngBSlebNm5sgRQMUT9oBPDmWozVRGixp53XPvk/r1q2Ll1Y7vX/22Wfy0UcfmWBKO64DiE7UUAFIVd566y0zHILemdetWzdJnz696UR++fJlryAnXMvRdMOGDZPevXubWirtfD5u3DjJmjVrvNqsuLg4M33FihUyfPjwJPPkr1N6xowZpV27dgFvF4DUiYAKQKpy1113mbvzpkyZIhs3bjR36D3yyCPm5dkXyVfRokW9ApNQl+PqH6XNe/PmzTP9skaPHi0jRoxw3y3octttt5kO7RpQaYf0xOgdgjqUg2+ndB2ygYAKSPtiLL31BQDg1V8qNjbWXSN18uRJKVmypHz88cfSoUMHd7pbt26Z6X379pWXXnqJEgSiGAEVAPhYuXKl/OMf/zA1R1qrpIGU9o/SJkPXSOta06QDiX7xxReyc+dO0wkeQPQioAIAP/SxMxo06RALOgaVjjulj55x0T5W6tlnn5XKlStThkCUI6ACAACwiWETAAAAbCKgAgAAsImACgAAwCYCKgAAAJsIqAAAAGwioAIAALCJgAoAAMAmAioAAACbCKgAAADEnv8FOYHnCQmCjNAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "\n", "ax.hist(E_einsum, bins=60)\n", "\n", "ax.set_xlabel(\"energy E\")\n", "ax.set_ylabel(\"number of configurations\")\n", "ax.set_title(\"Energy distribution of random Heisenberg spin configurations\")\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "f4fab33d", "metadata": {}, "source": [ "## 7. Magnetization\n", "\n", "The magnetization of configuration $c$ is\n", "\n", "$$\n", "\\mathbf M_c = \\frac1N\\sum_i \\mathbf S_{ci}.\n", "$$\n", "\n", "This is a simple contraction over the site index.\n" ] }, { "cell_type": "code", "execution_count": 46, "id": "466b0ec2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(20000, 3)\n", "[0.09937857 0.10547356 0.18490853 0.1374546 0.29679261 0.15693527\n", " 0.11871806 0.23074697 0.21903425 0.24481183]\n" ] } ], "source": [ "Mvec = np.einsum(\"cia->ca\", S) / N\n", "Mabs = np.linalg.norm(Mvec, axis=1)\n", "\n", "print(Mvec.shape)\n", "print(Mabs[:10])\n" ] }, { "cell_type": "code", "execution_count": 47, "id": "6131f2b8", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "\n", "ax.hist(Mabs, bins=60)\n", "\n", "ax.set_xlabel(r\"$|\\mathbf{M}|$\")\n", "ax.set_ylabel(\"number of configurations\")\n", "ax.set_title(\"Magnetization of random configurations\")\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "db7a3773", "metadata": {}, "source": [ "## 8. Python-loop implementation\n", "\n", "To see the performance benefit, first write the Hamiltonian almost literally.\n" ] }, { "cell_type": "code", "execution_count": 48, "id": "924ad503", "metadata": {}, "outputs": [], "source": [ "def energy_python(S, Jmat):\n", " nconf, N, dim = S.shape\n", " E = np.zeros(nconf)\n", "\n", " for c in range(nconf):\n", " for i in range(N):\n", " for j in range(N):\n", " dot = 0.0\n", "\n", " for a in range(dim):\n", " dot += S[c, i, a] * S[c, j, a]\n", "\n", " E[c] -= 0.5 * Jmat[i, j] * dot\n", "\n", " return E\n" ] }, { "cell_type": "markdown", "id": "e0bbad2f", "metadata": {}, "source": [ "This code directly evaluates\n", "\n", "$$\n", "-\\frac12\\sum_{ija}J_{ij}S_{cia}S_{cja},\n", "$$\n", "\n", "but the loops run at Python level.\n" ] }, { "cell_type": "markdown", "id": "bb2cc962", "metadata": {}, "source": [ "## 9. Dense `einsum` implementation\n" ] }, { "cell_type": "code", "execution_count": 49, "id": "629f9f31", "metadata": {}, "outputs": [], "source": [ "def energy_einsum(S, Jmat):\n", " return -0.5*np.einsum(\n", " \"ij,cia,cja->c\",\n", " Jmat, S, S,\n", " optimize=True\n", " )\n" ] }, { "cell_type": "markdown", "id": "41d2fbb5", "metadata": {}, "source": [ "## 10. Matrix-multiplication implementation\n", "\n", "For each Cartesian component,\n", "\n", "$$\n", "S_{ci}J_{ij}S_{cj}\n", "$$\n", "\n", "is also a quadratic form.\n", "\n", "A convenient implementation is\n" ] }, { "cell_type": "code", "execution_count": 50, "id": "a679bb4a", "metadata": {}, "outputs": [], "source": [ "def energy_matmul(S, Jmat):\n", " # S @ J acts on the lattice-site index after transposing axes\n", " X = np.transpose(S, (0, 2, 1)) # (c,a,i)\n", " Y = X @ Jmat # (c,a,j)\n", " return -0.5*np.sum(Y * X, axis=(1,2))\n" ] }, { "cell_type": "markdown", "id": "b4539764", "metadata": {}, "source": [ "## 11. Exploit the physical structure: nearest neighbors only\n", "\n", "The coupling matrix is mostly zero.\n", "\n", "For this 1D model,\n", "\n", "$$\n", "E_c=-J\\sum_{ia}S_{cia}S_{c,i+1,a}.\n", "$$\n", "\n", "We therefore do not need an $N\\times N$ dense contraction at all.\n" ] }, { "cell_type": "code", "execution_count": 51, "id": "d99849f0", "metadata": {}, "outputs": [], "source": [ "def energy_nearest_neighbor(S, Jcoupling=1.0):\n", " return -Jcoupling*np.einsum(\n", " \"cia,cia->c\",\n", " S,\n", " np.roll(S, -1, axis=1)\n", " )\n" ] }, { "cell_type": "markdown", "id": "bb4eadff", "metadata": {}, "source": [ "This is still an `einsum`, but now the algorithm uses the physics of the interaction.\n", "\n", "Dense contraction:\n", "\n", "$$\n", "O(n_{\\rm conf}N^2)\n", "$$\n", "\n", "Nearest-neighbor contraction:\n", "\n", "$$\n", "O(n_{\\rm conf}N).\n", "$$\n" ] }, { "cell_type": "markdown", "id": "c28002a5", "metadata": {}, "source": [ "## 12. Correctness check\n" ] }, { "cell_type": "code", "execution_count": 52, "id": "b6a00de5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "einsum vs matmul: 8.881784197001252e-16\n", "einsum vs NN : 4.440892098500626e-16\n" ] } ], "source": [ "S_test = random_spins(10, 12, rng)\n", "J_test = coupling_matrix_1d(12)\n", "\n", "E1 = energy_einsum(S_test, J_test)\n", "E2 = energy_matmul(S_test, J_test)\n", "E3 = energy_nearest_neighbor(S_test)\n", "\n", "print(\"einsum vs matmul:\", np.max(np.abs(E1-E2)))\n", "print(\"einsum vs NN :\", np.max(np.abs(E1-E3)))\n" ] }, { "cell_type": "markdown", "id": "41aefb56", "metadata": {}, "source": [ "## 13. Timing helper\n" ] }, { "cell_type": "code", "execution_count": 53, "id": "45537a07", "metadata": {}, "outputs": [], "source": [ "def median_time(func, nrep=5):\n", " times = []\n", "\n", " for _ in range(nrep):\n", " t0 = time.perf_counter()\n", " result = func()\n", " times.append(time.perf_counter() - t0)\n", "\n", " return np.median(times), result\n" ] }, { "cell_type": "markdown", "id": "755f6fdd", "metadata": {}, "source": [ "## 14. Python loop vs vectorized methods\n" ] }, { "cell_type": "code", "execution_count": 54, "id": "effb577e", "metadata": {}, "outputs": [], "source": [ "N = 24\n", "Jmat = coupling_matrix_1d(N)\n", "\n", "sizes = np.array([10, 30, 100, 300, 1000, 3000, 10_000])\n", "\n", "t_python = []\n", "t_einsum = []\n", "t_matmul = []\n", "t_nn = []\n", "\n", "for nconf in sizes:\n", " SS = random_spins(nconf, N, rng)\n", "\n", " if nconf <= 300:\n", " tp, _ = median_time(lambda SS=SS: energy_python(SS, Jmat), 3)\n", " else:\n", " tp = np.nan\n", "\n", " te, _ = median_time(lambda SS=SS: energy_einsum(SS, Jmat), 5)\n", " tm, _ = median_time(lambda SS=SS: energy_matmul(SS, Jmat), 5)\n", " tn, _ = median_time(lambda SS=SS: energy_nearest_neighbor(SS), 5)\n", "\n", " t_python.append(tp)\n", " t_einsum.append(te)\n", " t_matmul.append(tm)\n", " t_nn.append(tn)\n", "\n", "t_python = np.array(t_python)\n", "t_einsum = np.array(t_einsum)\n", "t_matmul = np.array(t_matmul)\n", "t_nn = np.array(t_nn)\n" ] }, { "cell_type": "code", "execution_count": 55, "id": "d59c732a", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "\n", "mask = np.isfinite(t_python)\n", "\n", "ax.loglog(sizes[mask], t_python[mask], \"o-\", label=\"Python loops\")\n", "ax.loglog(sizes, t_einsum, \"o-\", label=\"dense einsum\")\n", "ax.loglog(sizes, t_matmul, \"o-\", label=\"matmul\")\n", "ax.loglog(sizes, t_nn, \"o-\", label=\"nearest-neighbor einsum\")\n", "\n", "ax.set_xlabel(\"number of configurations\")\n", "ax.set_ylabel(\"time [s]\")\n", "ax.legend()\n", "ax.grid(True)\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "3ad58c2f", "metadata": {}, "source": [ "There are two distinct speedups here:\n", "\n", "1. **Python loops → vectorized contraction** \n", " removes interpreter overhead.\n", "\n", "2. **Dense $N^2$ contraction → nearest-neighbor $N$ contraction** \n", " changes the algorithm by using physical structure.\n", "\n", "The second type of improvement becomes increasingly important as $N$ grows.\n" ] }, { "cell_type": "markdown", "id": "9ff9ff88", "metadata": {}, "source": [ "## 15. Scaling with system size $N$\n", "\n", "Keep the number of configurations fixed and increase the number of spins.\n" ] }, { "cell_type": "code", "execution_count": 56, "id": "1ab71144", "metadata": {}, "outputs": [], "source": [ "nconf = 2000\n", "Ns = np.array([8, 12, 16, 24, 32, 48, 64, 96, 128])\n", "\n", "t_dense = []\n", "t_nn = []\n", "\n", "for N in Ns:\n", " SS = random_spins(nconf, N, rng)\n", " JJ = coupling_matrix_1d(N)\n", "\n", " td, _ = median_time(lambda SS=SS, JJ=JJ:\n", " energy_einsum(SS, JJ), 3)\n", "\n", " tn, _ = median_time(lambda SS=SS:\n", " energy_nearest_neighbor(SS), 5)\n", "\n", " t_dense.append(td)\n", " t_nn.append(tn)\n", "\n", "t_dense = np.array(t_dense)\n", "t_nn = np.array(t_nn)\n" ] }, { "cell_type": "code", "execution_count": 57, "id": "784edf2b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "\n", "ax.loglog(Ns, t_dense, \"o-\", label=\"dense einsum\")\n", "ax.loglog(Ns, t_nn, \"o-\", label=\"nearest-neighbor einsum\")\n", "\n", "# Reference curves normalized to the first point\n", "ref_N2 = t_dense[0]*(Ns/Ns[0])**2\n", "ref_N1 = t_nn[0]*(Ns/Ns[0])\n", "\n", "ax.loglog(Ns, ref_N2, \"--\", label=r\"$N^2$ reference\")\n", "ax.loglog(Ns, ref_N1, \"--\", label=r\"$N$ reference\")\n", "\n", "ax.set_xlabel(\"number of spins N\")\n", "ax.set_ylabel(\"time [s]\")\n", "ax.legend()\n", "ax.grid(True)\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "5b9f77a9", "metadata": {}, "source": [ "## 16. Local effective field with `einsum`\n", "\n", "The exchange field acting on spin $i$ is\n", "\n", "$$\n", "\\mathbf h_i\n", "=\n", "\\sum_j J_{ij}\\mathbf S_j.\n", "$$\n", "\n", "For many configurations,\n", "\n", "$$\n", "h_{cia}=J_{ij}S_{cja}.\n", "$$\n", "\n", "This is another natural tensor contraction:\n" ] }, { "cell_type": "code", "execution_count": 58, "id": "3a0953b0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "S shape: (1000, 32, 3)\n", "h shape: (1000, 32, 3)\n" ] } ], "source": [ "N = 32\n", "nconf = 1000\n", "\n", "S = random_spins(nconf, N, rng)\n", "Jmat = coupling_matrix_1d(N)\n", "\n", "h = np.einsum(\n", " \"ij,cja->cia\",\n", " Jmat, S,\n", " optimize=True\n", ")\n", "\n", "print(\"S shape:\", S.shape)\n", "print(\"h shape:\", h.shape)\n" ] }, { "cell_type": "markdown", "id": "39724043", "metadata": {}, "source": [ "For the nearest-neighbor chain the same field can again be written without a dense coupling matrix:\n", "\n", "$$\n", "\\mathbf h_i\n", "=\n", "\\mathbf S_{i-1}+\\mathbf S_{i+1}.\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 59, "id": "81dd7caf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max difference: 0.0\n" ] } ], "source": [ "h_nn = (\n", " np.roll(S, 1, axis=1)\n", " + np.roll(S, -1, axis=1)\n", ")\n", "\n", "print(\"max difference:\",\n", " np.max(np.abs(h-h_nn)))\n" ] }, { "cell_type": "markdown", "id": "a4043894", "metadata": {}, "source": [ "## 17. Spin correlation function\n", "\n", "A standard observable is\n", "\n", "$$\n", "C(r)\n", "=\n", "\\frac1N\\sum_i\n", "\\mathbf S_i\\cdot\\mathbf S_{i+r}.\n", "$$\n", "\n", "For many configurations,\n", "\n", "$$\n", "C_c(r)\n", "=\n", "\\frac1N\\sum_{ia}\n", "S_{cia}S_{c,i+r,a}.\n", "$$\n", "\n", "Again `einsum` expresses the contraction directly.\n" ] }, { "cell_type": "code", "execution_count": 60, "id": "67c6864f", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def correlation(S, r):\n", " return np.einsum(\n", " \"cia,cia->c\",\n", " S,\n", " np.roll(S, -r, axis=1)\n", " ) / S.shape[1]\n", "\n", "rs = np.arange(0, 11)\n", "\n", "Cmean = np.array([\n", " correlation(S, r).mean()\n", " for r in rs\n", "])\n", "\n", "fig, ax = plt.subplots()\n", "\n", "ax.plot(rs, Cmean, \"o-\")\n", "ax.set_xlabel(\"separation r\")\n", "ax.set_ylabel(r\"$\\langle C(r)\\rangle$\")\n", "ax.grid(True)\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "ccca53b5", "metadata": {}, "source": [ "For independent random spins,\n", "\n", "$$\n", "C(0)=1\n", "$$\n", "\n", "while the average correlation for $r>0$ should be close to zero.\n" ] }, { "cell_type": "markdown", "id": "ba5b0f55", "metadata": {}, "source": [ "## 18. Main lessons\n", "\n", "### Physics notation maps naturally to `einsum`\n", "\n", "The Heisenberg Hamiltonian\n", "\n", "$$\n", "E_c=-\\frac12J_{ij}S_{cia}S_{cja}\n", "$$\n", "\n", "becomes\n", "\n", "```python\n", "np.einsum(\"ij,cia,cja->c\", J, S, S)\n", "```\n", "\n", "and the local field\n", "\n", "$$\n", "h_{cia}=J_{ij}S_{cja}\n", "$$\n", "\n", "becomes\n", "\n", "```python\n", "np.einsum(\"ij,cja->cia\", J, S)\n", "```\n", "\n", "### `einsum` removes Python loops\n", "\n", "Batching many configurations lets NumPy execute the contraction in compiled code.\n", "\n", "### But physical structure matters even more\n", "\n", "For nearest-neighbor interactions, a dense coupling matrix performs unnecessary work.\n", "\n", "Dense formulation:\n", "\n", "$$\n", "O(N^2)\n", "$$\n", "\n", "Nearest-neighbor formulation:\n", "\n", "$$\n", "O(N)\n", "$$\n", "\n", "Thus the broader optimization lesson is\n", "\n", "$$\n", "\\boxed{\n", "\\text{better notation}\n", "\\rightarrow\n", "\\text{vectorization}\n", "\\rightarrow\n", "\\text{exploit physical structure}\n", "}\n", "$$\n" ] } ], "metadata": { "kernelspec": { "display_name": "python_env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.15" } }, "nbformat": 4, "nbformat_minor": 5 }