{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ff8465b6",
   "metadata": {},
   "source": [
    "| [**Lattice QCD I**](https://homepages.uni-regensburg.de/~lec17310/teaching/wise2122/lqft.html) | - | [**Christoph Lehner**](https://go.ur.de/lehner) |\n",
    "|:-|--|-:|\n",
    "\n",
    "# Chapter 4: scalar field theory on a lattice"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05018930",
   "metadata": {},
   "source": [
    "## Motivation\n",
    "- So far we have considered one-particle Hamiltonians in one dimension.  More interesting systems occur, e.g., when considering possible theories of the fundamental interactions of nature.  Experimentally, we observe inelastic processes which change one set of incoming to a different set of outgoing particles.  Example: radioactive decay, pion to muon decays in the atmosphere due to cosmic rays, ...\n",
    "- We will show today that the Hilbert space of a quantum field theory is much better suited to describe such theories.\n",
    "- In the next chapter, we will then more systematically explore the space of interesting field theories by starting from a thorough discussion of symmetries.\n",
    "\n",
    "## Hamiltonian of a real scalar quantum field theory in one spatial dimension"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ece1f95",
   "metadata": {},
   "source": [
    "- Consider a real scalar quantum field theory with one spatial dimension with periodic boundary conditions on a spatial lattice\n",
    "  with $n_s$ positions defined by the Lagrangian\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    L = \\sum_{x=0}^{n_s-1} \\frac12 \\phi(x,t) \\left[\\overleftarrow{\\partial}_t \\overrightarrow{\\partial}_t + \\Delta^2 - m^2 \\right] \\phi(x,t)\n",
    "  \\end{align}\n",
    "  $$\n",
    "  with $x \\in \\{ 0, \\ldots, n_s - 1 \\}$, $t,m \\in \\mathbb{R}$, and\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\Delta^2 \\phi(x,t) \\equiv \\phi(x+1,t) + \\phi(x-1,t) - 2\\phi(x,t)\n",
    "  \\end{align}\n",
    "  $$\n",
    "  and $\\phi(-1,t)=\\phi(n_s-1,t)$, $\\phi(n_s,t)=\\phi(0,t)$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "724e1562",
   "metadata": {},
   "source": [
    "- The canonical momentum for the field is then given by the appropriate functional derivative\n",
    "$$\n",
    "  \\begin{align}\n",
    "    \\pi(x,t) = \\partial_{\\partial_t \\phi(x,t)} L = \\partial_t \\phi(x,t)\n",
    "  \\end{align}\n",
    "  $$\n",
    "  and the Euler-Lagrange equation\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\partial_{\\phi(x,t)} L = \\partial_t \\pi(x,t)\n",
    "  \\end{align}\n",
    "  $$\n",
    "  which is\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    0 &=\\partial_t^2 \\phi(x,t) - \\partial_{\\phi(x,t)}  \\sum_{x=0}^{n_s-1} \\frac12 \\phi(x,t) \\left[\\phi(x+1,t) + \\phi(x-1,t) - (2+m^2)\\phi(x,t) \\right]  \\\\\n",
    "    &=\\partial_t^2 \\phi(x,t) - \\left[\\phi(x+1,t) + \\phi(x-1,t) - (2+m^2)\\phi(x,t) \\right] \\\\\n",
    "    &=(\\partial_t^2 - \\Delta^2 + m^2) \\phi(x,t) \\,.\n",
    "  \\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f672fee",
   "metadata": {},
   "source": [
    "- Next, we consider free-field solutions by first performing a discrete Fourier transform\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\phi(x,t) = \\frac1{\\sqrt{2\\pi n_s}} \\int dE \\sum_{k=0}^{n_s-1} e^{2\\pi i x k / n_s} e^{i t E} \\tilde\\phi(k,E)\n",
    "  \\end{align}\n",
    "  $$\n",
    "  yielding\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\left(-E^2 + \\left(2\\sin\\left(\\frac{\\pi k}{n_s}\\right)\\right)^2 + m^2\\right) \\tilde\\phi(k,E) = 0 \\,.\n",
    "  \\end{align}\n",
    "  $$\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6a077d2",
   "metadata": {},
   "source": [
    "- Defining\n",
    "$$\n",
    "  \\begin{align}\n",
    "    w_k = \\sqrt{m^2 + \\left(2\\sin\\left(\\frac{\\pi k}{n_s}\\right)\\right)^2}\n",
    "  \\end{align}\n",
    "  $$\n",
    "  we can then write the free field solution\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    f_k(x,t) \\equiv \\frac1{\\sqrt{2 w_k n_s}} e^{- i w_k t + i 2\\pi x k / n_s}\n",
    "  \\end{align}\n",
    "  $$\n",
    "  with\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    (\\partial_t^2 - \\Delta^2 + m^2) f_k(x,t) = 0\n",
    "  \\end{align}\n",
    "  $$\n",
    "  and\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\sum_{x=0}^{n_s-1} f^*_k(x,t) f_{k'}(x,t) &= \\frac1{2w_k} \\delta_{k,k'} \\,, \\\\\n",
    "    \\sum_{x=0}^{n_s-1} f_k(x,t) f_{k'}(x,t) &= \\frac1{2w_k} \\delta_{k,-k'} e^{-2i w_k t} \\,.\n",
    "  \\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54daf29f",
   "metadata": {},
   "source": [
    "- To quantize the theory, we first make the ansatz for the real field\n",
    "$$\n",
    "  \\begin{align}\n",
    "    \\phi(x,t) = \\sum_{k=0}^{n_s-1} \\left[ f_k(x,t) \\hat{a}_k + f_k^*(x,t) \\hat{a}_k^\\dagger \\right]\n",
    "  \\end{align}\n",
    "  $$\n",
    "  and operators $\\hat{a}_k$ such that\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\pi(x,t) = -i\\sum_{k=0}^{n_s-1} w_k \\left[ f_k(x,t) \\hat{a}_k - f_k^*(x,t) \\hat{a}_k^\\dagger \\right] \\,.\n",
    "  \\end{align}\n",
    "  $$\n",
    "  Then\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    \\hat{a}_k &= \\sum_{x=0}^{n_s-1} f^*_k(x,t) (w_k\\phi(x,t) + i \\pi(x,t)) \\,.\n",
    "  \\end{align}\n",
    "  $$\n",
    "  We quantize the fields canonically, i.e., require\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    [ \\phi(x,t), \\pi(y,t) ] &= i \\delta_{x,y} \\,, &\n",
    "    [ \\phi(x,t), \\phi(y,t) ] &= [ \\pi(x,t), \\pi(y,t) ] = 0\n",
    "  \\end{align}\n",
    "  $$\n",
    "  yielding\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    [\\hat{a}_k,\\hat{a}_{k'} ] &= \\sum_{x,y=0}^{n_s-1} f^*_k(x,t) f^*_{k'}(y,t) [w_k\\phi(x,t) + i \\pi(x,t),w_{k'}\\phi(y,t) + i \\pi(y,t)] \\\\\n",
    "    &= \\sum_{x,y=0}^{n_s-1} f^*_k(x,t) f^*_{k'}(y,t) i\\left[ w_{k'} [\\pi(x,t),\\phi(y,t)] +  w_k [\\phi(x,t),\\pi(y,t)] \\right] \\\\\n",
    "    &= \\sum_{x=0}^{n_s-1} f^*_k(x,t) f^*_{k'}(x,t)  \\left[ w_{k'} -  w_{k} \\right] = 0\n",
    "  \\end{align}\n",
    "  $$\n",
    "  and also\n",
    "  $$\n",
    "  \\begin{align}\n",
    "    [\\hat{a}_k,\\hat{a}^\\dagger_{k'} ]\n",
    "    &= \\sum_{x,y=0}^{n_s-1} f^*_k(x,t) f_{k'}(y,t) i\\left[ w_{k'} [\\pi(x,t),\\phi(y,t)] -  w_k [\\phi(x,t),\\pi(y,t)] \\right] \\\\\n",
    "    &= \\sum_{x=0}^{n_s-1} f^*_k(x,t) f_{k'}(x,t)  \\left[ w_{k'} +  w_{k} \\right] = \\delta_{k,k'} \\,.\n",
    "  \\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06701866",
   "metadata": {},
   "source": [
    "- Then Hamiltonian is given by a Legendre transformation of the Lagrangian\n",
    "$$\n",
    "  \\begin{align}\n",
    "    H &= -L + \\sum_{x=0}^{n_s-1} \\pi(x,t) \\partial_{\\pi(x,t)} L \\\\\n",
    "    &= \\sum_{x=0}^{n_s-1} \\frac12 \\phi(x,t)\\left[ \\overleftarrow{\\partial}_t \\overrightarrow{\\partial}_t - \\Delta^2 +m^2 \\right] \\phi(x,t) \\notag\\\\\n",
    "&=\\sum_{x,k,k'=0}^{n_s-1} \\frac12 \\left[ f_k(x,t) \\hat{a}_k + f_k^*(x,t) \\hat{a}_k^\\dagger \\right]\\left[ \\overleftarrow{\\partial}_t \\overrightarrow{\\partial}_t - \\partial_t^2 \\right]\\left[ f_{k'}(x,t) \\hat{a}_{k'} + f_{k'}^*(x,t) \\hat{a}_{k'}^\\dagger \\right] \\\\\n",
    "&=\\sum_{x,k,k'=0}^{n_s-1} \\frac12 \\left[ f_k(x,t) \\hat{a}_k + f_k^*(x,t) \\hat{a}_k^\\dagger \\right] w_{k'}^2\\left[ f_{k'}(x,t) \\hat{a}_{k'} + f_{k'}^*(x,t) \\hat{a}_{k'}^\\dagger \\right] \\notag\\\\&\\quad- \\sum_{x,k,k'=0}^{n_s-1} \\frac12\\left[ f_k(x,t) \\hat{a}_k - f_k^*(x,t) \\hat{a}_k^\\dagger \\right] w_{k'} w_{k'}\\left[ f_{k'}(x,t) \\hat{a}_{k'} - f_{k'}^*(x,t) \\hat{a}_{k'}^\\dagger \\right] \\\\\n",
    "&=\n",
    "\\frac12 \\sum_{k=0}^{n_s-1} w_{k} \\left[  \\hat{a}_k \\hat{a}_{k}^\\dagger + \\hat{a}_{k}^\\dagger \\hat{a}_k    \\right] \\\\\n",
    "&=\n",
    " \\sum_{k=0}^{n_s-1} w_{k} \\left[   \\frac12 + \\hat{a}_{k}^\\dagger \\hat{a}_k    \\right] \\,.\n",
    "\\end{align}\n",
    "  $$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a78ceccb",
   "metadata": {},
   "source": [
    "- This looks like a Harmonic oscillator for each mode number $k$.  Note: we have a vacuum energy offset $E_0 = \\frac12 \\sum_{k=0}^{n_s-1} w_k$.\n",
    "\n",
    "- Beyond the vacuum energy, there is a finite contribution of energy $\\omega_k$ for each mode $k$\n",
    "multiplied by the occupation number operator\n",
    "  \\begin{align}\n",
    "    \\hat{n}_k \\equiv \\hat{a}_k^\\dagger \\hat{a}_k \\,.\n",
    "  \\end{align}\n",
    "\n",
    "- We therefore have found a theory which can describe an aribtrary number of particles in mode $k$ that each contribute energy $\\omega_k$.\n",
    "\n",
    "- We can write for small momenta\n",
    "$$\n",
    "p_k = \\frac{2\\pi}{n_s} k\n",
    "$$\n",
    "the energies as\n",
    "$$\n",
    "\\omega_k^2 \\approx m^2 + p_k^2\n",
    "$$\n",
    "which suggests that we found a theory of non-interacting particles that each obey the relativistic energy-momentum relation.  In the\n",
    "next chapter, we illustrate the origin of this phenomenon."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbf2c34e",
   "metadata": {},
   "source": [
    "## Global and local Metropolis update for scalar fields\n",
    "\n",
    "We will next discretize also time in $n_t$ steps with periodic boundary conditions, as we did for the one-dimensional Hamiltonian examples, and study the Euclidean action\n",
    "$$\n",
    "\\begin{align}\n",
    "S_E(\\phi) = \\frac12 \\sum_{x=0}^{n_s-1} \\sum_{t=0}^{n_t-1} \\phi(x,t) ( -\\Delta_t^2 - \\Delta_x^2 + m^2) \\phi(x,t)\n",
    "\\end{align}\n",
    "$$\n",
    "where we used partial integration to identify $\\overleftarrow{\\partial_t}\\overrightarrow{\\partial_t}=-\\partial_t^2$\n",
    "and\n",
    "$$\n",
    "\\begin{align}\n",
    "\\Delta_x^2 \\phi(x,t) &= \\phi(x+1,t) + \\phi(x-1,t) - 2\\phi(x,t) \\,, \\\\\n",
    "\\Delta_t^2 \\phi(x,t) &= \\phi(x,t+1) + \\phi(x,t+1) - 2\\phi(x,t) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "We demonstrate how to generate a Markov chain with probability distribution $p(\\phi) \\propto e^{-S_E(\\phi)}$\n",
    "using both global and local updates.  For this, we will use for the first time the high-performance library GPT (https://github.com/lehner/gpt)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "6ed42a91",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gpt as g\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8cd3acdd",
   "metadata": {},
   "outputs": [],
   "source": [
    "L = [32,64]\n",
    "grid = g.grid(L, g.double)\n",
    "grid_eo = g.grid(L, g.double, g.redblack)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6c536119",
   "metadata": {},
   "outputs": [],
   "source": [
    "field = g.real(grid)\n",
    "field[:] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "09061423",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :       0.806299 s : Initializing gpt.random(seed13,vectorized_ranlux24_389_64) took 0.000421047 s\n"
     ]
    }
   ],
   "source": [
    "rng = g.random(\"seed13\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "86ad1305",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "lattice(ot_real_additive_group,double)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng.element(field)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "95149b73",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(327.52809672707235+0j)\n"
     ]
    }
   ],
   "source": [
    "def S(phi, m0):\n",
    "    action = 0.5*g.norm2(phi)*m0**2\n",
    "    for mu in range(2):\n",
    "        action -= 0.5 * g.inner_product(phi, g.cshift(phi,mu,1) + g.cshift(phi,mu,-1) - 2.*phi)\n",
    "    return action\n",
    "\n",
    "print(S(field, 0.1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "1ca76a17",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(327.52809672707235+0j)\n",
      "(-0.5412363742706248+0j)\n",
      "(-0.5412363742706198+0j)\n"
     ]
    }
   ],
   "source": [
    "def S_field(phi, m0):\n",
    "    # gather in afld[x] everything that changes if phi[x] changes\n",
    "    afld = g(0.5 * g.adj(phi)*phi*(m0**2 + 4.0))\n",
    "    for mu in range(2):\n",
    "        afld -= g.adj(phi) * (g.cshift(phi,mu,1) + g.cshift(phi,mu,-1))\n",
    "    return afld\n",
    "\n",
    "print(S(field,0.1))\n",
    "\n",
    "# test change in single point\n",
    "field[12,17] = 0.5\n",
    "S0 = S(field,0.1)\n",
    "Sf0 = S_field(field,0.1)[12,17]\n",
    "field[12,17] = 0.3\n",
    "S1 = S(field,0.1)\n",
    "Sf1 = S_field(field,0.1)[12,17]\n",
    "print(S1 - S0)\n",
    "print(Sf1 - Sf0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "85953305",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 Acceptance rate: 1.0\n",
      "1000 Acceptance rate: 0.5354645354645354\n",
      "2000 Acceptance rate: 0.5417291354322838\n",
      "3000 Acceptance rate: 0.5428190603132289\n",
      "4000 Acceptance rate: 0.5546113471632091\n",
      "5000 Acceptance rate: 0.5530893821235753\n",
      "6000 Acceptance rate: 0.5504082652891185\n",
      "7000 Acceptance rate: 0.5513498071704043\n",
      "8000 Acceptance rate: 0.5504311961004874\n",
      "9000 Acceptance rate: 0.551716475947117\n",
      "10000 Acceptance rate: 0.5528447155284472\n",
      "11000 Acceptance rate: 0.5544041450777202\n",
      "12000 Acceptance rate: 0.5569535872010666\n",
      "13000 Acceptance rate: 0.5564187370202293\n",
      "14000 Acceptance rate: 0.556460252839083\n",
      "15000 Acceptance rate: 0.5568295446970202\n",
      "16000 Acceptance rate: 0.5552777951378038\n",
      "17000 Acceptance rate: 0.5561437562496324\n",
      "18000 Acceptance rate: 0.5571357146825177\n",
      "19000 Acceptance rate: 0.558549550023683\n",
      "20000 Acceptance rate: 0.559622018899055\n",
      "21000 Acceptance rate: 0.5599733346031142\n",
      "22000 Acceptance rate: 0.5607472387618745\n",
      "23000 Acceptance rate: 0.5600626059736533\n",
      "24000 Acceptance rate: 0.5603099870838715\n"
     ]
    }
   ],
   "source": [
    "def metropolis_global(phi, action, step):\n",
    "    global rng\n",
    "    tmp = g.real(grid)\n",
    "    phi_prime = g(phi + rng.element(tmp) * step)\n",
    "    S0 = action(phi)\n",
    "    S1 = action(phi_prime)\n",
    "    r = np.exp(S0 - S1)\n",
    "    l = rng.uniform_real(min=0.0, max=1.0)\n",
    "    if l < r:\n",
    "        # accept\n",
    "        phi @= phi_prime\n",
    "        return True\n",
    "    return False\n",
    "    \n",
    "field[:] = 0.0\n",
    "total = 0\n",
    "accepted = 0\n",
    "action_list_global = []\n",
    "for i in range(25000):\n",
    "    if metropolis_global(field, lambda field: S(field, 1.0),0.04):\n",
    "        accepted+=1\n",
    "    total += 1\n",
    "    action_list_global.append(S(field, 1.0).real)\n",
    "    if i % 1000 == 0:\n",
    "        print(i,\"Acceptance rate:\",accepted/total)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "886e26c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAhN0lEQVR4nO3df3RU5b3v8feXoGARQSWLKnATbFlIDCFI+FWUBH//WhdxeRWLBTwqivVqr7e9es5pF/EstbX22p6uU73VYyu9topiLa7qvb0WiciqRQLHA4r1SBFKECWiUiw/JMn3/jF7wpDMJJP5PbM/r7WysufZe/Y8z0zymWeevefZ5u6IiEg49Mt3BUREJHcU+iIiIaLQFxEJEYW+iEiIKPRFREKkf74r0JNhw4Z5ZWVlvqshIlJU1q9f/5G7l8dbV9ChX1lZSXNzc76rISJSVMxse6J1Gt4REQkRhb6ISIgo9EVEQqSgx/TjOXz4MC0tLRw8eDDfVREpKAMHDmTkyJEcc8wx+a6KFLCiC/2WlhYGDx5MZWUlZpbv6ogUBHdnz549tLS0MHr06HxXRwpY0Q3vHDx4kJNPPlmBLxLDzDj55JND/wm4sREqK0HxkFjR9fQBBb5IHGH/v+ja/MbGyE+0PNMTCg8dCnv3Zn6/2VZ0PX0Rka7ivd/dfXf3bbp+17OhAfqn0PU1iwR+MVLop+Dee+/ljDPOoKamhtraWtauXZv2Pr/yla9koGY9q6ys5KOPPkq4ftu2bVRXV/dpnwsXLmT58uVxy7/whS+wb9++zrJvfOMbmFmPdQC47777+lSHVMU+H7l4/qMSPWexHn/8cd5///0c1ag4RUO8pw84Xddt33502SuvQHt7pGzgwO5vCl33Ff3p6TEKXWhCv7ExM/t57bXX+O1vf8uGDRvYuHEjv//97xk1alTa+/3DH/6QgdoVli9/+cusWLECgI6ODl5++WVGjBjR6/0Shb6709HRkdE6RhXa86/Q71k0aLcn/N5pcvePdejQkTeFfv2O3ra3YE9mm0IRmtDv+lEvVbt27WLYsGEMGDAAgGHDhnHqqad2266hoaFzComPPvqI6BxCb731FlOmTKG2tpaamhreffddAI4//ngAmpqaaGho4Morr+T0009n3rx5RK9u9uKLL3L66aczadIkbrvtNi677LJuj7t//36uuuoqqqqqmDNnDlOnTo07lcWDDz5IdXU11dXV/OhHP+osb2trY968eYwbN44rr7yS/fv3A/BP//RPTJ48merqahYtWkQyV1ybO3cuy5Yt62zXjBkz6B/zWfqJJ57ofC5uuukm2tvbueuuuzhw4AC1tbXMmzePbdu2MXbsWObPn091dTU7duzgW9/6FtXV1YwfP/6o/c+cOZNLL72UsWPHcvPNN3e+QTz55JOMHz+e6upq7rzzzrh1jT7/u3btYubMmdTW1lJdXc2rr77abdvYTwjNzc00NDQA0NjYyNe+9jWmT5/OmDFjePTRR4HIm9Wtt97K2LFjOe+889i9e3fnvuI9r8uXL6e5uZl58+ZRW1vLgQMHWL9+PfX19UyaNIkLL7yQXbt29fr8l6JMhmtP+3GPPxxUEty9YH8mTZrkXW3evLlbWTIgpbt1s2/fPp8wYYKPGTPGFy9e7E1NTXG3q6+v93Xr1rm7e2trq1dUVLi7+6233upPPPGEu7sfOnTI9+/f7+7ugwYNcnf3VatW+QknnOA7duzw9vZ2nzZtmr/66qt+4MABHzlypG/dutXd3efOneuXXnppt8d94IEHfNGiRe7uvmnTJi8rK+usR0VFhbe2tnpzc7NXV1f7Z5995vv27fOqqirfsGGDv/feew74mjVr3N39uuuu8wceeMDd3ffs2dP5GNdee60///zz7u6+YMECf+aZZ7rVI1o+depU//jjj/2GG27wpqamzjps3rzZL7vsMv/888/d3X3x4sW+dOnSo54Ld/f33nvPzcxfe+01d3dfvny5n3feed7W1uYffPCBjxo1yt9//31ftWqVDxgwwP/85z97W1ubn3feef7MM8/4zp07fdSoUb57924/fPiwz5o1y5977rmjno/Yx/zBD37g99xzj7u7t7W1+V//+tdubYu937p167y+vt7d3ZcsWeI1NTW+f/9+b21t9ZEjR/rOnTv92Wef7azzzp07fciQIZ3PWaLnNfbv5/PPP/fp06f77t273d39qaee8uuuu65bvdxT//8oBpEoLvyfQgA0e4JcLemefvTIffQdPbqczlDP8ccfz/r163nkkUcoLy/n6quv5vHHH0/6/tOnT+e+++7j/vvvZ/v27Rx33HHdtpkyZQojR46kX79+1NbWsm3bNv70pz9x2mmndZ6Dfc0118Td/5o1a5g7dy4A1dXV1NTU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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list_global)), action_list_global, marker='+', ls='', c='blue', label=\"S using global Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "826596e8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Acceptance rate of local update: 0.654296875\n",
      "Acceptance rate of local update: 0.66748046875\n",
      "Acceptance rate of local update: 0.66943359375\n",
      "Acceptance rate of local update: 0.67138671875\n",
      "Acceptance rate of local update: 0.6787109375\n",
      "Acceptance rate of local update: 0.67333984375\n",
      "Acceptance rate of local update: 0.6689453125\n",
      "Acceptance rate of local update: 0.66162109375\n",
      "Acceptance rate of local update: 0.6552734375\n",
      "Acceptance rate of local update: 0.6611328125\n"
     ]
    }
   ],
   "source": [
    "def metropolis_step(phi, action, step):\n",
    "    global rng\n",
    "    # update even fields then odd fiels, in this way we can update\n",
    "    # half of the sites with individual accept/reject at each step\n",
    "    tmp = g.real(grid)\n",
    "    tmp_cb = g.real(grid_eo)\n",
    "    r_cb = g.real(grid_eo)\n",
    "    mask_accept = g.real(grid)\n",
    "    \n",
    "    total_accept = 0\n",
    "    total_step = 0\n",
    "    \n",
    "    for cb in [g.even, g.odd]:\n",
    "        \n",
    "        # p(x) = const * exp(-S(x)) -> p(x') / p(x) = exp(S(x) - S(x'))\n",
    "        S_field_0 = action(phi) # wasteful to compute every time, for now fine\n",
    "        \n",
    "        # create phi_prime which only has shifts on cb sites\n",
    "        tmp[:] = 0\n",
    "        tmp_cb.checkerboard(cb)\n",
    "        rng.element(tmp_cb)\n",
    "        g.set_checkerboard(tmp, tmp_cb)\n",
    "        phi_prime = g(phi + step * tmp)\n",
    "        \n",
    "        # difference of action (per site)\n",
    "        sdiff = g(S_field_0 - action(phi_prime))\n",
    "        g.pick_checkerboard(cb, tmp_cb, sdiff)\n",
    "        pdiff = g(g.component.exp(tmp_cb))\n",
    "        \n",
    "        # on same sites draw independent numbers between 0 and 1\n",
    "        rng.uniform_real(r_cb, min = 0.0, max = 1.0)\n",
    "        \n",
    "        # and locally do an accept/reject\n",
    "        mask_accept_cb = g(pdiff > r_cb)\n",
    "        mask_accept[:] = 0.0\n",
    "        mask_accept_cb.checkerboard(cb) # in future versions of gpt, this will be inferred from >\n",
    "        g.set_checkerboard(mask_accept, mask_accept_cb)\n",
    "        \n",
    "        # statistics\n",
    "        total_accept += g.norm2(mask_accept) \n",
    "        total_step += mask_accept_cb.grid.gsites\n",
    "        \n",
    "        # locally keep accepted changes\n",
    "        phi @= g.where(mask_accept, phi_prime, phi)\n",
    "\n",
    "    return total_accept / total_step\n",
    "   \n",
    "field[:] = 0.0\n",
    "action_list = []\n",
    "for s in range(100):\n",
    "    acceptance_rate = metropolis_step(field, lambda field: S_field(field, 1.0), 1.6)\n",
    "    action_list.append(S(field, 1.0).real)\n",
    "    if s % 10 == 0:\n",
    "        print(\"Acceptance rate of local update:\",acceptance_rate)\n",
    "\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2b4cbb9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "41468e7a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAo7ElEQVR4nO3de3RU5b3/8feXgAbBghUWlouJVgpCiAECwkEgqHjDVcRjLR5UsCotaq3trxc953QR+tMeW+3ldFXbg0cL1tYb1upq7a+1SKT0oBI8eAMvyEVBlACCUi4S8v39MXuGSTIzmWRmMrfPa62s7Hn27Xn2nvnOM89+9rPN3RERkeLQJdsZEBGRzqOgLyJSRBT0RUSKiIK+iEgRUdAXESkiXbOdgUT69Onj5eXl2c6GiEheWb169Q537xtrXk4H/fLycurr67OdDRGRvGJmm+PNU/OOiEgRUdAXESkiCvoiIkVEQV9EpIgo6IuIFJHCDvo1NdnOgYh0otpaKC8Hs2znJHfldJfNlD37bLZzICKdpGWgr60N/YXT0z2gcO/esGdP+rebaYVd0xeRohCrZr9gQetlWt7rWVMDXTtQ9TULBfx8VHhBv6YmdEbC74LwtJp6RApKOIgnasppOW/z5uZpzz4Lhw+H0kpLW38ptNxWdGiJt49cV3jNO3V1R6Yz9btORLIq/NHeHPe+07bXbxkWDh488qVgBk1NzfeVTH7yIdQUXk0/3IgXfabMQukiktdi1bRT2VY87rGbgwpB4QX9eBYsUOAXyWPZaEZp7y+JfGjqKZ6gP3++gr6IdKreveNfC8iW4gn6IpKX2hMwcyGwRuchmR4+nf2lYJ7DVx6qq6s9paGV8+nqikgRCl9QjQ540R/X9gbCWOuWlIR66OSKtsqXjnBlZqvdvTrWPNX0RSSrYgW+rl2TD/iTJ4cCZctgGX7d2Hhk/uTJqeW15bY7oq2afe/eHd92Mgov6Lfspw9HXqtNXyRtwsEp2eAcPURCoqBn1r6aeXQv7ZZaBudYy7qHfg20FcjDXxzh5WJ90aTDnj2Zbe4pvH76iSR6d4hIUsxC/SLCwamtZVs236RDKk02sfLT2HhkXpcurYN5SUnH9pWLCq+mX1fX+is4/FpBXyQtYg1x0PJ19E3x6RbdZNMRiZp6mpqa1+rdj3wpxNtWpmSiqafwgn6i5p1CvNNCpJOEux/GE/6YdWQsm2Sls0klXD9Mh0wF/kw09RRe806ikTUV9EU6pD1BJ1M9ZebPz8x20yVek1NJSeiXQi50J4VCrOknouYdkbyV6/0wwk1O0aKbhuL9GujVK/4vmJYXj9Oh8IL+0Ue3L11EWgk3KbTVpJMuiQJbpnrJZEqivJaVtU7bvTvx/HQrvKAf74rLwYO5X1UQyYJEbcaZHjM+Vp+LePPySbwuoJs2tb5I3HJ+ppux2gz6ZnafmW03s1ej0j5tZk+b2VvB/+OCdDOzn5nZejN72cxGRa0zO1j+LTObnZniAD17ZmzTIoUi1s1PnTkcQCHV7GNJ1NunLbW1mT0GydT0FwHntUi7GVjq7oOBpcFrgPOBwcHfXOAXEPqSAOYDpwNjgfnhL4q0O3Ag/rxFizKyS5FMiA7C6ey6F33zUyoBPpn25uiRUDLRPi3t12bQd/flwK4WydOBxcH0YuCiqPT7PeQ5oLeZfQY4F3ja3Xe5+4fA07T+IkmPgwfjz5szJyO7FEm30tLmr2N13evSzsbZdNbik7l5yf1In3fJHR1t0+/n7tuC6feBfsH0AODdqOW2BGnx0lsxs7lmVm9m9Q0NDe3PWaILuWrTlzyRqO4SfrRfsne6hm9dSZdYH7Honiuqzee2lC/kemiYzrSdYndf6O7V7l7dt2/f9m9g3LjY6bqQK3kg2dp4oi+F6O2YJb51pT3KykLBPFELqoJ97uto0P8gaLYh+L89SN8KDIpabmCQFi89/dasiT9P/fQlh7Vs0kmWWfOmnkxdiN20KTPblc7V0aD/JBDugTMbeCIq/cqgF884YE/QDPRn4BwzOy64gHtOkJZ+u3dr7B3JivDjmeMJB+bS0tCypaVHauM1NW3X3hPJxKBmYSUlus2lkCTTZfNBYCUwxMy2mNnVwO3AVDN7Czg7eA3wFLABWA/cA1wH4O67gP8LrAr+vhekpV+8sXdqajKyO5GwloOQRQf16NEmDx4MLRsd5NPVBNPRwO/ePLCHx6gvKwu11ydq0pH80ubYO+5+WZxZZ8VY1oHr42znPuC+duWuI2pqYn+CFPQlA8rLQ80eLesYuW7y5NAP3/CXEYQCe2lp8wCvJp3Co8clirRT9Nuqs25kSvd+9JEobMX1uEQ9OUsyJNbbqrO4h27PTyVY6+YogUIM+nV1uT8Gq+SUzhx+oL2iA3S4ztKRoK0LsRJWeEG/trb1FTUIfRGopl/UonvKRKfFWibWup2prWe2tlVjD/8qCP/pQqyEFWbQj1XTX7BAQT/PJAq07b0uH72tZ59tu3tl9LDC2fgFkOyAXfECv97qEo8u5ErOSnT6op+/2tSU/LZyQVkZbN7cvFzRD+Nu79u1pgZWrDjydCa93aW4LuRGU9t+3ooO0uH+7rFE92yprT0yZHCXLp3fVp/M04/cj4ypHq2pqe0mnXjq6tp+OpNIWOE9IzeafuPmnVgBOnwTU9eu8Z+/Wlra/GanbAa/8BdRe/OQyhjsIskq7KAPCvwFJNEDt1MZwqAj2grsqnFLrirs5h0F/LySS+3uiXS07V0kFxR20I/VdVNyUrYDfrI3LSnQS74r7KAvOa+zu0TGu9AanZ+ysuTXFck3hRf0wx2wo/v0aQgGoXXQjlW7b2o60rvGDHr1OvLwEJFCUPj99HO4fMUuHTX8yZOTG5ZYbwMpJon66Rd+7x3JOckG++hA3bK7Zssmmeh03ZMnEl/hNe9E081ZOadLEu+4WDcpJerD3nL0SI0kKRJfYQd9tePnlGRa28JPaopFQwOLpK6wg77kjGSbdPSkJpHMUtCXjEumSQdUgxfpDLqQKxnVkYu2IpI5hV3TV5t+1rTnpitdbxfpPOqnLxmhGr5I9hTvePqS0xTwRTpf4QV9DcOQNe15aImadESyQ807kjZq0hHJDWreERERIMWgb2ZfN7PXzOxVM3vQzErN7CQze97M1pvZw2Z2VLDs0cHr9cH88rSUIBG1IWRUuCmnvFy1fJF80eGgb2YDgBuBanevAEqAmcAPgJ+4+ynAh8DVwSpXAx8G6T8JlsssteNnRMt2+82bk1tv8uTM5EdEkpdq805XoLuZdQWOAbYBZwJLgvmLgYuC6enBa4L5Z5ll+3lJ0l4dPWPuUFeX1qyISAd0OOi7+1bgTuAdQsF+D7Aa2O3u4SGztgADgukBwLvBuo3B8sd3dP/SuTryhKvwE6jUpCOSO1Jp3jmOUO39JKA/0AM4L9UMmdlcM6s3s/qGhoZUNyftlK4WMffQ4Glq0hHJLak075wNbHT3Bnc/BPwOmAD0Dpp7AAYCW4PprcAggGB+L2Bny426+0J3r3b36r59+6aQPWkvs9Cz5KP726f6DFs16YjkllSC/jvAODM7JmibPwtYCywDLgmWmQ08EUw/GbwmmP+M5/JNAkUknQ8n13j3IrktlTb95wldkH0ReCXY1kLgO8A3zGw9oTb7e4NV7gWOD9K/AdycQr4lTdJ5KV3BXiT3FfYduZJQOgJ++Jm0Ofw2Eik6ejB6kYsO7iUloccRphLwWwZ4BXyR/KFhGApcy+B++HBqAb+kJLX8iEh2qaZfwNJ965tq9CL5TzX9AqWALyKxFHbQL8Kxd7p0SW2ohHh/IlIYCjvoL1iQ7Rx0qo72oikrU2AXKRaFHfSLQMsHhbWXWWi4BBEpDoUX9IvocYnhYRNS0dSUnryISH4o7JuzCviuofbW7MOHobQUDh4MNemohi9SmPS4xALTnh8t8+c3/947cODICJgiUnwKu59+AT4usb01/AJs1RKRFBR2Tb/AIl5Hm3RERMIKu6ZfhBToRSSRwq7pFxA9TVhE0kFBPw8kG/BVyxeRtijo57lwr1QFfBFJhoJ+jmurlq+bq0SkPRT0c1hbAV+1exFpLwX9PKWALyIdoaAvIlJEFPRzVKKmHXXfFJGOUtDPQW3dSKyLtyLSUQr6OajInv0iIp2osIN+Ho69ox47IpJJhR3086zKrLZ6Eck0DbiWI1TDF5HOUHg1/QJ8XKICvoikS0pB38x6m9kSM3vdzNaZ2Xgz+7SZPW1mbwX/jwuWNTP7mZmtN7OXzWxUeorQQm1t88FowtM5GvRTeai5iEh7pVrT/0/g/7n7UOA0YB1wM7DU3QcDS4PXAOcDg4O/ucAvUtx33ksm2KuWLyLp1OGgb2a9gEnAvQDu/om77wamA4uDxRYDFwXT04H7PeQ5oLeZfaaj+09KHj8uUSNnikgmpFLTPwloAH5lZv9rZv9tZj2Afu6+LVjmfaBfMD0AeDdq/S1BWjNmNtfM6s2svqGhIYXskbNNOqAmHRHJjlSCfldgFPALdx8J/IMjTTkAuLsD7aqvuvtCd6929+q+ffumkL3cpZ46IpItqQT9LcAWd38+eL2E0JfAB+Fmm+D/9mD+VmBQ1PoDg7SiooAvItnU4aDv7u8D75rZkCDpLGAt8CQwO0ibDTwRTD8JXBn04hkH7IlqBhJg8uRs50BECl2qN2d9FfiNmR0FbACuIvRF8oiZXQ1sBi4Nln0KuABYD+wLli0qbdXy6+o6JRsiUsRSCvruvgaojjHrrBjLOnB9KvvLV+qaKSK5ovDuyBURkbgU9LNs/nzV8kWk8yjoZ1iXNo5wDt9KICIFSEE/wxLV4vP4hmERyVMK+hnU1gVc1fJFpLMp6GeJ2vFFJBsU9DNEY+uISC5S0M+AtgK+2vJFJFv0uMROpmYdEckm1fTTqLQ0cS1fTT4ikm0K+ml08GDi+U1NnZMPEZF4FPTTpKYm8Xw164hILlDQT5Nnn812DkRE2qag3wlUyxeRXKGgnwa6QCsi+UJBP8NUyxeRXKKgLyJSRBT0U6SmHRHJJwr6KSgvTzxfTTsikmsU9FOweXP8eQr4IpKLFPQ7SM06IpKPFPQzQLV8EclVCvodoEHVRCRfKeinmQZVE5FcpqAvIlJEFPTbSc03IpLPCjvo19Z26u50AVdEcl3KQd/MSszsf83sD8Hrk8zseTNbb2YPm9lRQfrRwev1wfzyVPfdpgUL0rq5Tv4OERFJu3TU9L8GrIt6/QPgJ+5+CvAhcHWQfjXwYZD+k2C5vJLoO0S1fBHJBykFfTMbCEwD/jt4bcCZwJJgkcXARcH09OA1wfyzguXTq7Y21PAe3nR4Og3V9JKS9qWLiOSaVGv6PwW+DYQ7Kh4P7Hb3xuD1FmBAMD0AeBcgmL8nWL4ZM5trZvVmVt/Q0ND+HNXWhqrd4ap3eDrFoG8Ghw/HnhcvXUQk13Q46JvZhcB2d1+dxvzg7gvdvdrdq/v27ZvOTWeMmnZEJF90TWHdCcDnzewCoBT4FPCfQG8z6xrU5gcCW4PltwKDgC1m1hXoBexMYf9tmz8/o5sXEck3Ha7pu/st7j7Q3cuBmcAz7j4LWAZcEiw2G3gimH4yeE0w/xn3DNeR09TdRn3zRaRQZKKf/neAb5jZekJt9vcG6fcCxwfp3wBuzsC+066tgK+mHRHJJ6k070S4ex1QF0xvAMbGWOYA8IV07C9XKOCLSL4p7DtyU6RmHREpNAr6HaRavojkIwV9EZEioqAfhx6UIiKFSEE/hrZ6eupBKSKSrxT0Y9DAaiJSqBT0W1DTjYgUMgX9dlAtX0TynYK+iEgRUdCPkqhpp6ys8/IhIpIpCvqBttryN23qlGyIiGSUgn4S1JYvIoVCQV9EpIgo6KNumiJSPBT026CmHREpJAr6IiJFpOiDvpp2RKSYFH3QT0RNOyJSaBT0RUSKSFEHfTXtiEixKeqgn4iadkSkEBVt0E9Uyz/66M7Lh4hIZyraoJ/IgQPZzoGISGYo6IuIFJGiDPq9e2c7ByIi2VGUQX/PnvjzdAFXRApZUQZ9EZFi1eGgb2aDzGyZma01s9fM7GtB+qfN7Gkzeyv4f1yQbmb2MzNbb2Yvm9modBVCRESSk0pNvxH4P+4+DBgHXG9mw4CbgaXuPhhYGrwGOB8YHPzNBX6Rwr47TDdkiUgx63DQd/dt7v5iMP0xsA4YAEwHFgeLLQYuCqanA/d7yHNAbzP7TEf3nwlqzxeRQpeWNn0zKwdGAs8D/dx9WzDrfaBfMD0AeDdqtS1BWsttzTWzejOrb2hoSEf2REQkkHLQN7OewGPATe7+UfQ8d3egXfVnd1/o7tXuXt23b99UsyciIlFSCvpm1o1QwP+Nu/8uSP4g3GwT/N8epG8FBkWtPjBI6zSlpfHnlZR0Xj5ERLIlld47BtwLrHP3H0fNehKYHUzPBp6ISr8y6MUzDtgT1QzUKQ4ejD+vsbHz8iEiki1dU1h3AnAF8IqZrQnS/hW4HXjEzK4GNgOXBvOeAi4A1gP7gKtS2LeIiHRAh4O+u68A4nWAPCvG8g5c39H9iYhI6ormjtyuqfymEREpEEUT9A8fjj9P/fNFpFio/it54dChQ2zZsoUDetiBSERpaSkDBw6kW7duSa+joC95YcuWLRx77LGUl5djGktDBHdn586dbNmyhZNOOinp9YqieUcxIv8dOHCA448/XgFfJGBmHH/88e3+9VsUQT8RtefnDwV8keY68pko+qAvIlJMFPSloNXWpm9bt912G8OHD6eyspKqqiqef/75lLf5T//0T2nIWWLl5eXs2LEj7vxNmzZRUVHRrm3OmTOHJUuWxEw/5phj+PjjjyNpN910E2aWMA8A3//+99uVh46KPh6dcfzD4h2zaIsWLeK9997LaD4KPuin80Mv+WfBgvRsZ+XKlfzhD3/gxRdf5OWXX+avf/0rgwYNanvFNvzP//xPGnKXW0455RSeeCI0+kpTUxPPPPMMAwa0GlC3lXhB391pampKax7Dcu34K+inQaIPvdrzJVnbtm2jT58+HH300QD06dOH/v37t1qupqaG+vp6AHbs2EF5eTkAr732GmPHjqWqqorKykreeustAHr27AlAXV0dNTU1XHLJJQwdOpRZs2bhwRv0qaeeYujQoYwePZobb7yRCy+8sNV+9+3bx6WXXsqwYcOYMWMGp59+eiQf0X784x9TUVFBRUUFP/3pTyPpjY2NzJo1i1NPPZVLLrmEffv2AfC9732PMWPGUFFRwdy5cyN5SmTmzJk8/PDDkXJNmDCBrlF3Rz7wwAORY/HlL3+Zw4cPc/PNN7N//36qqqqYNWsWmzZtYsiQIVx55ZVUVFTw7rvv8q1vfYuKigpGjBjRbPuTJk1i2rRpDBkyhK985SuRL4gHH3yQESNGUFFRwXe+852YeQ0f/23btjFp0iSqqqqoqKjgb3/7W6tlo38h1NfXU1NTA0BtbS1XXHEF48ePZ/Dgwdxzzz1A6MvqhhtuYMiQIZx99tls3749sq1Yx3XJkiXU19cza9Ysqqqq2L9/P6tXr2by5MmMHj2ac889l23b0jBcmbvn7N/o0aM9VaHQHvtP8sfatWuTXnb+/Njne/78ju//448/9tNOO80HDx7s8+bN87q6upjLTZ482VetWuXu7g0NDV5WVubu7jfccIM/8MAD7u5+8OBB37dvn7u79+jRw93dly1b5p/61Kf83Xff9cOHD/u4ceP8b3/7m+/fv98HDhzoGzZscHf3mTNn+rRp01rt94477vC5c+e6u/srr7ziJSUlkXyUlZV5Q0OD19fXe0VFhe/du9c//vhjHzZsmL/44ou+ceNGB3zFihXu7n7VVVf5HXfc4e7uO3fujOzj8ssv9yeffNLd3WfPnu2PPvpoq3yE008//XTftWuXX3PNNV5XVxfJw9q1a/3CCy/0Tz75xN3d582b54sXL252LNzdN27c6GbmK1eudHf3JUuW+Nlnn+2NjY3+/vvv+6BBg/y9997zZcuW+dFHH+1vv/22NzY2+tlnn+2PPvqob9261QcNGuTbt2/3Q4cO+ZQpU/zxxx9vdjyi93nnnXf6rbfe6u7ujY2N/tFHH7UqW/R6q1at8smTJ7u7+/z5872ystL37dvnDQ0NPnDgQN+6das/9thjkTxv3brVe/XqFTlm8Y5r9Pvnk08+8fHjx/v27dvd3f2hhx7yq666qlW+Yn02gHqPE1cLvqYvxae29kiohyPTqTT19ezZk9WrV7Nw4UL69u3LF7/4RRYtWpT0+uPHj+f73/8+P/jBD9i8eTPdu3dvtczYsWMZOHAgXbp0oaqqik2bNvH6669z8sknR/phX3bZZTG3v2LFCmbOnAlARUUFlZWVMZeZMWMGPXr0oGfPnlx88cWRGu2gQYOYMGECAJdffjkrVqwAYNmyZZx++umMGDGCZ555htdeey2p8l588cU89NBDPP/880ycODGSvnTpUlavXs2YMWOoqqpi6dKlbNiwIeY2ysrKGDduXCTvl112GSUlJfTr14/JkyezatWqyHE7+eSTKSkp4bLLLmPFihWsWrWKmpoa+vbtS9euXZk1axbLly+Pm98xY8bwq1/9itraWl555RWOPfbYpMoZNn36dLp3706fPn2YMmUKL7zwAsuXL4/kuX///px55pmR5ZM5rm+88QavvvoqU6dOpaqqiltvvZUtW7a0K1+xFPTNWerhJ+lUUlJCTU0NNTU1jBgxgsWLFzNnzpxmy3Tt2jXSvBDdf/pf/uVfOP300/njH//IBRdcwH/91381CwJApOkovK/GThzvu2XXPzPjwIEDXHfdddTX1zNo0CBqa2uT7hP+xS9+kdGjRzN79my6dDlSt3R3Zs+ezX/8x3+0uY0ePXp0OO/tNWnSJJYvX84f//hH5syZwze+8Q2uvPLKZsvEO7ftzUOyx9XdGT58OCtXrmx3eRIp2pq+2vOLw/z56dnOG2+8EWmHB1izZg1lZWWtlisvL2f16tUAzXpqbNiwgZNPPpkbb7yR6dOn8/LLLye13yFDhrBhwwY2bdoEEGnLbmnChAk88sgjAKxdu5ZXXnml1TITJ07k97//Pfv27eMf//gHjz/+eKQW/s4770SCy29/+1vOOOOMSCDq06cPe/fubbPnSbSysjJuu+02rrvuumbpZ511FkuWLIm0b+/atYvNmzcD0K1bNw4dOhRzexMnTuThhx/m8OHDNDQ0sHz5csaOHQvACy+8wMaNG2lqauLhhx/mjDPOYOzYsTz77LPs2LGDw4cP8+CDDzJ58uS4+d28eTP9+vXj2muv5ZprruHFF19stUz0uX3ssceazXviiSc4cOAAO3fupK6ujjFjxjBp0qRInrdt28ayZcsAEh7XY489NtLzaciQITQ0NETOy6FDh5L+pZVIQdf0RdLVe2vv3r189atfZffu3XTt2pVTTjmFhQsXtlrum9/8JpdeeikLFy5k2rRpkfRHHnmEX//613Tr1o0TTjiBf/3Xf01qv927d+fuu+/mvPPOo0ePHowZMybmctdddx2zZ89m2LBhDB06lOHDh9OrV69my4waNYo5c+ZEguU111zDyJEjIxdN77rrLr70pS8xbNgw5s2bxzHHHMO1115LRUUFJ5xwQtx9x/PlL3+5VdqwYcO49dZbOeecc2hqaqJbt27cddddlJWVMXfuXCorKxk1ahS33XZbs/VmzJjBypUrOe200zAzfvjDH3LCCSfw+uuvM2bMGG644QbWr1/PlClTmDFjBl26dOH2229nypQpuDvTpk1j+vTpcfNaV1fHHXfcQbdu3ejZsyf3339/q2Xmz5/P1VdfzXe/+93IRdywyspKpkyZwo4dO/jud79L//79mTFjBs888wzDhg3jxBNPZPz48QD07t077nGdM2cOX/nKV+jevTsrV65kyZIl3HjjjezZs4fGxkZuuukmhg8f3p7T0Ip5Dld5q6urPVYPhGQl+pWXw8WWGNatW8epp56a7Wxkxd69e+nZsyfuzvXXX8/gwYP5+te/3myZw4cPc+jQIUpLS3n77bc5++yzeeONNzjqqKOylOvOUVdXx5133skf/vCHrOWhtraWnj178s1vfjMr+4/12TCz1e5eHWv5gq3pa/x8KRT33HMPixcv5pNPPmHkyJExa9D79u1jypQpHDp0CHfn7rvvLviALx1TsDV91fILSzHX9EUSaW9Nv2gv5IqIFCMFfRGRIlKQQV/980VEYivIoJ+I2vNFpJgVXdCXIpPGYVZzeWjlurq6mAOxpSJ68LiW6SeeeGKzwdcuuuiiyOBl8ezevZu77747rXmMJ5yX9957j0suuaRT9gnxj1m0n/70p5EB7bJBQV8KW5rGVtbQys317t2bv//970AomCcz+mOioJ+pISf69+/frjuJO4OCvkgeyPWhlaPt2rWLiy66iMrKSsaNGxcZ8mHv3r1cddVVjBgxgsrKyshQAvPmzaO6uprhw4czP8lxK2bOnMlDDz0EwO9+9zsuvvjiZvPvuOMOxowZQ2VlZWSbN998M2+//TZVVVV861vfoq6ujokTJ/L5z3+eYcOGceDAgUj+Ro4cGRm2YNGiRUyfPp2amhoGDx7Mgqgv8nhDRYdFPyAm3jmIFv1rZcmSJZGxlcJ3ylZXV/O5z30ucjPY/v37mTlzJqeeeiozZsxg//79kfVjHdef/exnvPfee0yZMoUpU6YA8Je//IXx48czatQovvCFL7B3796kzkGHxRt+Mxf+OjK0cqKhlHv1avfmJEe0Z2jlTIytnOtDKy9btiySfsMNN3htba27uy9dutRPO+00d3f/9re/7V/72tci6+zatcvdjwzz29jY6JMnT/aXXnqpVVlalvG5557zESNGeGNjo0+dOtU3btwYKcuf//xnv/baa72pqckPHz7s06ZN82effdY3btzow4cPb5bnY445JlK2O++8MzJ08Lp163zQoEG+f/9+/9WvfuUnnHCC79ixw/ft2+fDhw/3VatWxR0qOvq4Ru8z3jmIFj2886OPPuqzZ89299CQ0eeee64fPnzY33zzTR8wYIDv37/ff/SjH0Xy/NJLLzUb0jrecY0eormhocEnTpzoe/fudXf322+/3RcsWNAqX4loaOUEdu/Odg6kU2RgbOVcH1o52ooVK7jiiisAOPPMM9m5cycfffQRf/3rX7n++usjyx133HFAaFygUaNGMXLkSF577TXWrl3b5j5KSko444wzeOihh9i/f3/kFw2Eaq5/+ctfGDlyJKNGjeL111+PWasOlzlcthUrVnD55ZcDMHToUMrKynjzzTcBmDp1Kscffzzdu3fn4osvZsWKFQmHio4lmXOQyKWXXkqXLl0YPHgwJ598Mq+//jrLly+P5LmysrLZkNbJHNfnnnuOtWvXMmHCBKqqqli8eHFkALpM6fSgb2bnmdkbZrbezG7u7P2LdFR4aOUFCxbw85//vNVIi5B4aOUnn3yS7t27c8EFF/DMM8+0WjcbQytv3LiRO++8k6VLl/Lyyy8zbdq0pIdPnjlzJjfeeCOXXnpps3R355ZbbmHNmjWsWbOG9evXc/XVV8fcRmcOn5zMOYjebirDJyd7XN2dqVOnRo7V2rVruffee9tbtHbp1KBvZiXAXcD5wDDgMjMb1pl5kCKTprGVc31o5WgTJ07kN7/5DRC6VtCnTx8+9alPMXXqVO66667Ich9++CEfffQRPXr0oFevXnzwwQf86U9/Sipf4f3ccsstrX59nHvuudx3332RtumtW7eyffv2ZsMGt5XvN998k3feeYchQ4YA8PTTT7Nr1y7279/P73//eyZMmJBwqOhYkjkH/fr1Y926dTQ1NfH44483m/foo4/S1NTE22+/zYYNGxgyZAiTJk3it7/9LQCvvvpqZJuJjmv0cRg3bhx///vfWb9+PQD/+Mc/Ir9uMqWzhyUbC6x39w0AZvYQMB1o+/ekSEekqctmrg+tHK22tpYvfelLVFZWcswx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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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c2fLt81oLvQPHjyY1fLVOe2001iyZElOpp0phb5IK7Bz5066dOnCscceC0CXLl047bTTjhgusab3zjvv0Lt3bwBeeeUVRowYwZAhQygvL2fTpk3A4RrpihUrGDduHJdffjn9+/fnK1/5Sn1N+vHHH6d///4MHz6ca665psUa/bvvvsvkyZMpLy9n5MiRrF27FoB9+/YxY8YMzj77bMrLy/njH/8IwOzZs4nFYgwcOJCKioqU1se0adN44IEHAHjooYeYMmVKg/d//vOfc84551BeXl4/zblz5/L6668zZMgQfvCDH7BixQrGjBnD5z//ec466yw++uij+vINHTqU5cuXA7BgwQImTZrEuHHj6Nu3L/MSfshvvvlmBg0axKBBg7jllluOKOfWrVsZNGhQs9sgUeLeypIlS7jqqqsAuOqqq/j2t79NLBbjzDPP5LHHHgPgwIEDTJs2jQEDBnDZZZdx4MCB+vGbWq+33norb775Jueffz7nn38+AE888QSjRo1i2LBhfPGLX2Tfvn0pbYNmuXvRPoYPH+4iLVm/fn3qA1dUuMORj4qKjOe/d+9eHzx4sPft29dnz57tK1asaHK4sWPH+osvvuju7rW1td6rVy93d7/66qv93nvvdXf3jz/+2Pfv3+/u7h06dHB39+XLl/uJJ57o27dv908//dRHjhzpzz33nB84cMC7d+/umzdvdnf3adOm+cSJE4+Y7/Lly+v7X3311V5ZWenu7suWLfPBgwe7u/sPf/hDv/baa+vHeffdd93dfffu3e7ufvDgQR87dqy//PLLRyxL42VctWqVn3322X7w4EEfP368b9mypX5Z/vKXv/g3v/lNP3TokH/66ac+ceJEf+aZZ3zLli0+cODABmU+7rjj6pftpptu8hkzZri7+4YNG7xHjx5+4MABv/vuu/2UU07xd955x/fv3+8DBw70F1980auqqnzQoEG+b98+37t3r5911ln+0ksvNVivifNMtg0S1Y3n7r548WKfPn26u7tPnz7dL7roIv/000/9tdde827duvmBAwf8F7/4RX2ZX375ZW/Tpk39Oku2Xnv16uW1tbXuHv+MjBkzxvft2+fu7jfccIPPmzfviHI19fkHqjxJrqqmL9FSWXk46uFwd4j2/eOPP57Vq1czf/58ysrK+NKXvsSCBQtSHn/UqFH87Gc/48Ybb2Tb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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list_global)), action_list_global, marker='+', ls='', c='blue', label=\"S using global Metropolis update\")\n",
    "ax.plot(range(len(action_list)), action_list, marker='+', ls='', c='red', label=\"S using local Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list)), action_list, marker='+', ls='', c='red', label=\"S using local Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "803d5da4",
   "metadata": {},
   "source": [
    "## Momentum eigenstates and two-point correlators\n",
    "\n",
    "Since the Hamiltonian for non-interacting real scalar fields in one spatial dimension is\n",
    "$$\n",
    "  \\begin{align}\n",
    "    H &= \\sum_{k=0}^{n_s-1} w_{k} \\left[   \\frac12 + \\hat{n}_k \\right]\n",
    "\\end{align}\n",
    "$$\n",
    "with occupation number operator\n",
    "$$\n",
    "  \\begin{align}\n",
    "  \\hat{n}_k = \\hat{a}_{k}^\\dagger \\hat{a}_k \\,,\n",
    "  \\end{align}\n",
    "$$\n",
    "we know that the eigenstates can be classified with quantum numbers $n_1,\\ldots,n_{n_s-1}$\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    " \\hat{n}_k \\vert n_1,\\ldots,n_{n_s-1} \\rangle = n_k \\vert n_1,\\ldots,n_{n_s-1} \\rangle \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "We call the special state with lowest energy the vaccum state\n",
    "$$\n",
    "\\begin{align}\n",
    " \\vert 0 \\rangle = \\vert 0, \\ldots, 0 \\rangle\n",
    "\\end{align}\n",
    "$$\n",
    "with vacuum energy $E_0$ already defined above.  We can then study the operator\n",
    "$$\n",
    "\\begin{align}\n",
    "\\phi^\\dagger_k &=\\frac1{\\sqrt{2 w_k n_s}} \\sum_{x=0}^{n_s-1} e^{i p_k x} \\phi(x,0) \\\\\n",
    "&= \\sum_{x=0}^{n_s-1} f_k(x,0) \\phi(x,0) \\\\\n",
    "&=\\frac1{2\\omega_k} (a^\\dagger_k + a_{-k})\n",
    "\\end{align}\n",
    "$$\n",
    "such that\n",
    "$$\n",
    "\\begin{align}\n",
    "\\phi^\\dagger_k \\vert 0 \\rangle = \\frac1{2\\omega_k} \\vert 0,\\ldots,0,n_k=1,0,\\ldots 0 \\rangle\n",
    "\\end{align}\n",
    "$$\n",
    "where we used $a_k \\vert 0 \\rangle = 0$.\n",
    "\n",
    "We can therefore study\n",
    "$$\n",
    "\\begin{align}\n",
    "C(t) &= \\langle \\phi_k(t) \\phi^\\dagger_k(0) \\rangle \\\\\n",
    "&=\\frac1Z \\sum_{n,m} \\langle n \\vert \\phi_k \\vert m \\rangle\n",
    "\\langle m \\vert \\phi_k^\\dagger \\vert n \\rangle e^{-t E_m - (T-t)E_n} \\\\\n",
    "&\\approx \\sum_{m} \\langle 0 \\vert \\phi_k \\vert m \\rangle\n",
    "\\langle m \\vert \\phi_k^\\dagger \\vert 0 \\rangle e^{-t (E_m - E_0)} \\\\\n",
    "&\\approx \\sum_{m} \\langle 0 \\vert \\phi_k \\vert m \\rangle\n",
    "\\langle m \\vert \\phi_k^\\dagger \\vert 0 \\rangle e^{-t (E_m - E_0)} \\\\\n",
    "&\\approx \\vert \\langle \\phi_k \\vert \\phi_k \\rangle \\vert^2\n",
    " e^{-t (E_{n_k=1} - E_0)} \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "where we considered the limits $1 \\ll t \\ll T$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a14a8bc4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :      62.218938 s : Initializing gpt.random(seed13,vectorized_ranlux24_389_64) took 0.000290871 s\n",
      "Acceptance rate of local update: 0.60791015625\n",
      "Acceptance rate of local update: 0.62109375\n",
      "Acceptance rate of local update: 0.64208984375\n",
      "Acceptance rate of local update: 0.62255859375\n",
      "Acceptance rate of local update: 0.64453125\n",
      "Acceptance rate of local update: 0.6376953125\n",
      "Acceptance rate of local update: 0.63525390625\n",
      "Acceptance rate of local update: 0.62744140625\n",
      "Acceptance rate of local update: 0.6220703125\n",
      "Acceptance rate of local update: 0.6357421875\n"
     ]
    },
    {
     "data": {
      "image/png": "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DdixYwfdunXj6KOPBqBbt26ccsoph02XWtN799136dOnDwCvvPIKI0eOZOjQoZSXl/P6668Dh2qkK1euZPz48Vx22WUMGDCAr33ta/U16UcffZQBAwYwYsQIrr766hZr9O+99x5TpkyhvLycUaNGsXbtWgD27t3LrFmzOOussygvL+cvf/kLAHPnziWRSDBo0CAqKioy2h7Tp0/nvvvuA+CBBx5g6tSpDV7/xS9+wdlnn015eXn9POfPn88bb7zB0KFD+eEPf8jKlSsZO3YsX/ziFznzzDP5+OOP68s3bNgwVqxYAcCiRYuYPHky48ePp1+/fixI+SK/6aabGDx4MIMHD+bmm28+rJxbtmxh8ODBze6DVKlHK/fffz9XXnklAFdeeSXf+c53SCQSnHHGGTzyyCMA7N+/n+nTpzNw4EAuvfRS9u/fX//+prbrLbfcwltvvcW5557LueeeC8Djjz/O6NGjGT58OF/+8pfZu3dvRvugWe5etI8RI0a4SEvWr1+f+cQVFe5w+KOiIufl79mzx4cMGeL9+vXzuXPn+sqVK5ucbty4cf7iiy+6u3ttba337t3b3d2vuuoqv+eee9zd/ZNPPvF9+/a5u3unTp3c3X3FihV+/PHH+7Zt2/yzzz7zUaNG+bPPPuv79+/3nj17+qZNm9zdffr06T5p0qTDlrtixYr68VdddZVXVla6u/vy5ct9yJAh7u7+ox/9yK+55pr697z33nvu7r5r1y53dz9w4ICPGzfOX3755cPWpfE6Pv/8837WWWf5gQMHfMKECb558+b6dXnsscf8W9/6lh88eNA/++wznzRpkj/99NO+efNmHzRoUIMyH3PMMfXrduONN/qsWbPc3X3Dhg3eq1cv379/v991111+0kkn+bvvvuv79u3zQYMG+YsvvuhVVVU+ePBg37t3r+/Zs8fPPPNMf+mllxps19RlptsHqere5+6+dOlSnzlzpru7z5w50y+88EL/7LPP/LXXXvMePXr4/v37/Ze//GV9mV9++WVv165d/TZLt1179+7ttbW17p78jIwdO9b37t3r7u7XX3+9L1iw4LByNfX5B6o8Ta6qpi/xUll5KOrh0HCI9v1jjz2W1atXs3DhQsrKyvjKV77CokWLMn7/6NGj+fnPf84NN9zA1q1b6dix42HTjBw5kp49e3LEEUcwdOhQtmzZwsaNGznttNPq+2jPmDGjxWWtWrWKr3/96wCcd9557Nq1iw8//JAnn3ySefMOXQS3S5cuACxZsoThw4czbNgwXnnlFdavX9/iMtq1a8cXvvAF7rvvPvbv319/RAPJmuvjjz/OsGHDGD58OBs3bmyyVl23znXrtmrVKi6//HIABgwYQO/evXnttdcAmDBhAl27dqVjx45MnTqVVatWsWrVKi699FI6derEsccey9SpU3n22WfTljmTfdCcadOmccQRR9CvXz9OO+00Nm7cyDPPPFNf5vLycsrLy+unz2S7Pv/886xfv54xY8YwdOhQFi9ezNatW7MqV1NKO/QjPFEn0px27doxfvx4FixYwG9+85v65pFU7du35+DBgwAN+lZ/9atfZdmyZXTs2JGJEyfy1FNPHfbeuqajumXlq5071ebNm7nxxhtZvnw5a9euZdKkSRn3CZ8+fTpXX30106ZNazDe3bnuuutYs2YNa9asobq6mtmzZzc5j06dOmW0rMbdFnPpxpjJPkidb+PtkE0ZMt2u7s6ECRPqt9X69eu54447sl21w5R26Ed0ok5KVIZt1C159dVXG9RW16xZQ+/evQ+brk+fPqxevRqgwQnETZs2cdppp3H11VczefLk+nb2lvTv359NmzaxZcsWAP785z+3+J6xY8fyxz/+EUieK+jWrRvHH388EyZM4NZbb62f7v333+fDDz+kU6dOnHDCCbzzzjv89a9/zahcdcu57rrrDjv6uPDCC7nzzjvr26a3b9/Ozp07Oe6449izZ09G5X7ttdd488036d+/PwBPPPEE7733Hvv37+ehhx5izJgxjB07loceeoh9+/bx0Ucf8eCDDzJ27Ni0889kH3Tv3p0NGzZw8OBBHnzwwQavLV26lIMHD/LGG2+wadMm+vfvzznnnMOf/vQnANatW1c/z+a2a+p2GDVqFM899xzV1dUAfPTRR/VHN2HoMgwSXxEdCe7du5fvfe97fPDBB7Rv357TTz+dhQsXHjbdtddey7Rp01i4cCGTJk2qH79kyRL+8Ic/cOSRR3LSSSfx4x//OKPlduzYkdtuu42LLrqITp06cfbZZ7f4nsrKSr7xjW9QXl7OMcccw+LFiwH4yU9+wrx58xg8eDDt2rWjoqKCqVOnMmzYMAYMGECvXr0YM2ZMhlskWdO99tprDxt/wQUXsGHDBkaPHg0k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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "rng = g.random(\"seed13\")\n",
    "field[:] = 0.0\n",
    "action_list = []\n",
    "m0 = 0.2\n",
    "\n",
    "# first thermalize theory for new m0\n",
    "for s in range(100):\n",
    "    acceptance_rate = metropolis_step(field, lambda field: S_field(field, m0), 2.0)\n",
    "    action_list.append(S(field, m0).real)\n",
    "    if s % 10 == 0:\n",
    "        print(\"Acceptance rate of local update:\",acceptance_rate)\n",
    "    \n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list)), action_list, marker='+', ls='', c='red', label=\"S using local Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7ad3444e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1000\n",
      "2000\n",
      "3000\n",
      "4000\n"
     ]
    }
   ],
   "source": [
    "configurations = []\n",
    "\n",
    "for s in range(5000):\n",
    "    for sub_steps in range(5):\n",
    "        acceptance_rate = metropolis_step(field, lambda field: S_field(field, m0), 2.0)\n",
    "    configurations.append(g.copy(field))\n",
    "    if s % 1000 == 0:\n",
    "        print(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d80e4be9",
   "metadata": {},
   "outputs": [],
   "source": [
    "def correlate(field):\n",
    "    phit = g.slice(field,1)\n",
    "    Nt=len(phit)\n",
    "    return np.array([ sum([ phit[s].conjugate()*phit[(s+t)%Nt] for s in range(Nt) ])/Nt for t in range(Nt) ])\n",
    "\n",
    "def two_point_for_momentum(p):\n",
    "    mom_phase = g.exp_ixp(np.array([p,0]))\n",
    "    correlators = [ correlate(g(mom_phase*conf)) for conf in configurations ]\n",
    "    return correlators\n",
    "\n",
    "c0 = two_point_for_momentum(0)\n",
    "c1 = two_point_for_momentum(2.*np.pi/L[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "468caaac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAcgElEQVR4nO3df5RcZZ3n8ffHDvkxgCwTwllJh6QhEUlgDKRJMosSnEQTzJ4OsIy2IwKrmNWTCKMrK64sCVGPUfa4sxzCyg9ZBhdsGBildZGAQnIY9gDpSK/YYSOdEEwHPGQaBHXyg4Tv/lG3Q3WnO307XdX3cuvzOqdO6t773FvfqnR/+qnn3npKEYGZmRXXu7IuwMzMqstBb2ZWcA56M7OCc9CbmRWcg97MrOAc9GZmBZcq6CUtkrRZUqekqw/R7t9JCkmNZeu+muy3WdLCShRtZmbpjRqsgaQ6YA3wYaAL2CCpNSI29Wl3NHAl8FTZuulAMzADOAH4uaT3RsT+yj0FMzM7lDQ9+tlAZ0RsjYi9QAuwpJ92Xwe+DewuW7cEaImIPRHxAtCZHM/MzEbIoD16YCKwvWy5C5hT3kDSmcCkiPjfkq7qs++Tffad2PcBJC0FlgIceeSRs973vvelq97MzADYuHHjP0fEhP62pQn6Q5L0LuC7wGWHe4yIuAW4BaCxsTHa2tqGW5aZWU2R9OJA29IE/Q5gUtlyfbKux9HAacA6SQD/GmiV1JRiXzMzq7I0Y/QbgGmSGiSNpnRytbVnY0S8HhHHRcSUiJhCaaimKSLaknbNksZIagCmAU9X/FmYmdmABu3RR8Q+ScuBtUAdcHtEdEhaBbRFROsh9u2QdC+wCdgHLPMVN2ZmI0t5m6bYY/Rmlffmm2/S1dXF7t27B29suTZ27Fjq6+s54ogjeq2XtDEiGvvbZ9gnY80s/7q6ujj66KOZMmUKybk0eweKCLq7u+nq6qKhoSH1fp4CwawG7N69m/Hjxzvk3+EkMX78+CG/M3PQm9UIh3wxHM7/o4PezPp37rmlm73jOejNzArOQW9mA9u2rWKHqqurY+bMmQduq1evPrDtoosuYuvWrcN+jG9961tMnTqVU045hbVr1wKwd+9ezjnnHPbt2zekY61bt45jjjmmV80///nPB2z/0EMPccoppzB16tRezy0PfNWNmQ3sxQE/VT9k48aNo729/aD1HR0d7N+/n5NOOmlYx9+0aRMtLS10dHTw0ksvsWDBAn7zm98wevRo5s+fzz333MMnP/nJIR3zgx/8ID/96U8Hbbd//36WLVvGI488Qn19PWeddRZNTU1Mnz79cJ9ORblHb2aZuuuuu1iy5O0JcY866ii++MUvMmPGDObPn8/OnTtTHeeBBx6gubmZMWPG0NDQwNSpU3n66dIH8c8//3zuuuuuqtQP8PTTTzN16lROOukkRo8eTXNzMw888EDVHm+oHPRm1tvKlSDB+vWlZal0W7lyWIfdtWtXr2GQe+65B4AnnniCWbNmHWj3pz/9icbGRjo6Opg3bx7XXXcdANdff32v/XtuV1xxBQA7duxg0qS3p9aqr69nx47S1FqnnXYaGzZsGHLNjz/+eK/H2rJlS7/tDvXYeeChGzPrbeXK0u3cc0thX6FPzw80dPPyyy8zYcLbs+u+613v4uMf/zgAF198MRdeeCEAV111FVddddVB+6dRV1fH6NGj+cMf/sDRRx+der+0Qzd556A3s0yNGzfukB8A6rlu/Prrr+93+OWcc87hhhtuYOLEiWzf/vZXZ3R1dTFx4ttff7Fnzx7Gjh3ba981a9Zw6623AvDggw9ywgknHNZzGOyxs+ahGzMb2OTJVX+IU089lc7OzgPLb731Fvfddx8Ad999Nx/4wAeAUo++vb39oNsNN9wAQFNTEy0tLezZs4cXXniB559/ntmzS19o193dzXHHHXfQ/DDLli07cJzDDXmAs846i+eff54XXniBvXv30tLSQlNT02Efr9LcozezgU2ZUrFD9YzR91i0aBGrV69m8eLFrFu3jgULFgBw5JFH8vTTT/ONb3yD448//sBY/mBmzJjBxz72MaZPn86oUaNYs2YNdXV1ADz22GMsXrx4yDX3jNH3uOaaa7jooosOajdq1ChuvPFGFi5cyP79+/n0pz/NjBkzhvx41eLZK81qwHPPPcepp56adRn92rVrFx/60Id44oknqKur46ijjuKPf/xjRR/jwgsvZPXq1bz3ve+t6HGz0t//56Fmr/TQjZllaty4cVx33XVVu0pl7969nH/++YUJ+cPhoRszy9zChQsP3K90b3706NFccsklFTlWd3c38+fPP2j9L37xC8aPH1+Rx6gGB72ZWUrjx4/v9xLRvPPQjZlZwaUKekmLJG2W1Cnp6n62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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def jackknife_variance_estimator(f, x):\n",
    "    N = len(x)\n",
    "    X = sum(x) / N\n",
    "    mean = f(X)\n",
    "    return sum([(f((N*X - x[j])/(N-1)) - mean)**2 for j in range(N)])*(N-1)/N\n",
    "\n",
    "def bin_data(res, bin_size):\n",
    "    assert len(res) % bin_size == 0\n",
    "    n = len(res) // bin_size\n",
    "    return [ sum(res[bin_size*i:bin_size*(i+1)])/bin_size for i in range(n) ]\n",
    "\n",
    "def time_parity_average(C):\n",
    "    return [0.5*np.roll(x[::-1],1) + 0.5*x for x in C]\n",
    "\n",
    "bc0 = time_parity_average(bin_data(c0, 100))\n",
    "bc1 = time_parity_average(bin_data(c1, 100))\n",
    "\n",
    "def emp(C):\n",
    "    return np.array([np.log(C[t].real/C[t+1].real) for t in range(10)])\n",
    "\n",
    "c0_mean = np.mean(bc0, axis=0)\n",
    "emp0_mean = emp(c0_mean)\n",
    "emp0_err = jackknife_variance_estimator(emp, bc0)**0.5\n",
    "\n",
    "c1_mean = np.mean(bc1, axis=0)\n",
    "emp1_mean = emp(c1_mean)\n",
    "emp1_err = jackknife_variance_estimator(emp, bc1)**0.5\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.ylim([0,0.4])\n",
    "ax.errorbar(range(len(emp0_mean)), emp0_mean, emp0_err, marker='+', ls='', c='red', label=\"E(p=0) - E_0\")\n",
    "ax.errorbar(range(len(emp1_mean)), emp1_mean, emp1_err, marker='+', ls='', c='blue', label=\"E(p=2pi/L) - E_0\")\n",
    "\n",
    "plt.axhline(y=m0, color='red', linestyle='-')\n",
    "plt.axhline(y=(0.2**2. + (2.*np.sin(np.pi/L[0]))**2.)**0.5, color='blue', linestyle='-')\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46914932",
   "metadata": {},
   "source": [
    "We can also create two particles, say, in the $k=0$ state by studying\n",
    "$$\n",
    "\\begin{align}\n",
    "C(t) &= \\langle (\\phi_k(t))^2 (\\phi^\\dagger_k(0))^2 \\rangle - \\langle (\\phi_k(t))^2 \\rangle^2 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "***Homework***: Show how one can extract a state with occupation number two from this correlator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8582413b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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+1umT5/ea22J5lXfv38/X/ziFwGYN28e8+bN67Wd7nz84x/nwIEDnHPOORw4cICzzz67z22JDBSRCPQ0zp7brVyZD93dmTNnDmPHjuWb3/xml+cTtdne888/z3e/+91ea33zzTe57rrrOqwbMWJE2v6z0YwZM1izZg1LlizRvOoiScr5QE/3HFatY+itpk+fzooVK9rmQ7/88sv7vY+LL76YP//5zxw5coTi4mJWrVrFtGnTePXVVzvcbdI6H/rx48d55JFHkmp769atPPbYY223BwL88Ic/bJtOt6c233vvPQoKCjpcsN21axfFxR9N03PffffxpS99iT179jBp0qSUv/fq6mry8vIAOP/883n00UcTbrdkyRKuv/56Vq1aRUlJCU8++WTK+xIZcNw9kEd5ebl39vrrr3dZFxbvv/++V1RUeHNzc8b2ccUVV7R9XVlZ6Tt27Ehr+721+dhjj/mPfvSjXtv59a9/7XfffXc6S+uzMP/OSLhU/qrSK39VGXQZ/a6D+Cy3CXM153vo2RKF+dB7c/PNNye1XXNzM9/61rcyXI2IpEqBnoJcnw89XW12HjvvjwULFnS5/XHRokVpnbtdZKBQoEugHnrooaBLEImMnP1gkYiIdJTzgV61uoqq1VVBlyEiEricD3QREYmLRKDXH6wPugQRkcBFItD3HUrfhOiZng+9rq6Oiy66iPHjx3P++ee3Tf6VTps2beK8886jtLS0Q/01NTXs3r075fZ6Oiad7d27l4qKCkpLS7nhhhs4duxYn74HEUmd7nLpJNPzoZ966qk8+uijjBkzhrfffpvy8nKmTZtGYWFhv9ptdeLECRYsWMCzzz5LcXExkydPZsaMGYwbN4758+dzzz33tM0Mmazujkkid955J4sXL6ampoZ58+axatUq5s+f34fvRERSlbM99FhtDFtmbNkXnxDdlhm2zIjVxjKyv3TNh/6pT32KMWPGAPCJT3yCs88+m/fee6/Ldn2dD3379u2UlpYyevRoBg0aRE1NDU8//TQQn3Lgueeea5tILN3cnc2bN7dNFax5zEWyK3cDvSqGL3UqS+ITovtSx5c6sapYv9rN5nzo27dv59ixY3zyk59MWEtf5kNvbGxkxIgRbW0UFxe3/YOLk046idLSUl555ZW0HJPOmpqaKCwsJD8/v8u+RSTzNOTSSbbmQz9w4AC33HILa9as4aSTEp9X+zMfenda5zFvf3LqTSpDLiISnEgEesnQzE+Ins750A8fPszVV1/ND37wA6ZMmdLtPvsyH3pRURH79+9vW9/Q0EBRUVHbcqJ5zLdt28Ydd9wBwPLlyzvM+JiKYcOGcfDgQZqbm8nPz++ybxHJrEgE+sjCkRnfR7rmQz927BgzZ87kq1/9apdhmHTMhz558mR2797N3r17KSoqYt26dTz++ONtz7/55ptMmDChw2sqKirS0gM3M6qrq1m/fj01NTWax1wky3I+0Gtn16a1vUzPh/7kk0/yu9/9jqamJlavXg3E/0lzWVlZWuZDz8/P58EHH2TatGmcOHGC22+/nfHjxwPx/9M5ePBghg8fnlLN3R2TRFauXElNTQ133303F1xwAXPmzElpXyLSdxafXjf7Jk2a5Dt37uyw7o033mDs2LGB1NObDz74gOrqarZu3dr2DxrSbdq0aW1T6FZVVfGTn/ykT/9Eojv33XcfZ5xxRqRCNsy/MxIurVOEpLsTmO06zOwld08YDDl7l0u2tZ8PPVMyPR96YWEht956a0b3ISLByfkhl2zK9fnQ0znH+MyZM9m7d2+HdStXrszqMRKRjkIX6O7e5e4OCZ+nnnoq6BIIarhQJKxCNeRSUFBAU1OT3qjSK3enqamJgoKCoEsRCY1Q9dCLi4tpaGhI+FF4kc4KCgooLi4OugyR0AhVoJ988smMGjUq6DJERHJSUkMuZjbdzHaZ2R4zW5Lg+VPM7ImW57eZ2ci0VyoiIj3qNdDNLA94CLgSGAfcaGbjOm02B/ibu5cC9wEr012oiIj0LJke+oXAHnd/y92PAeuAzp/nvgZY0/L1euAy060qIiJZlcwYehGwv91yA1DR3Tbu3mxmh4BhwH+238jM5gJzWxaPmNmuvhQNnNm57QFOx6MjHY+P6Fh0dKbdZqE4HnZbn/u83c5GmNWLou7+MPBwf9sxs53dffR1INLx6EjH4yM6Fh1F/XgkM+TSCIxot1zcsi7hNmaWDwwFmtJRoIiIJCeZQN8BjDGzUWY2CKgBNnTaZgPQOknILGCz69NBIiJZ1euQS8uY+ELgGSAPeMTdXzOz5cBOd98ArAIeM7M9wF+Jh34m9XvYJmJ0PDrS8fiIjkVHkT4egU2fKyIi6RWquVxERKTvFOgiIhGRc4He2zQEA4WZjTCzF8zsdTN7zcwWBV1TGJhZnpm9bGb/K+hagmZmhWa23sz+bGZvmNlFQdcUFDNb3PI++X9m9q9mFslpOnMq0JOchmCgaAa+5e7jgCnAggF8LNpbBLwRdBEh8QCwyd0/DXyWAXpczKwI+AYwyd0nEL+5I9M3bgQipwKd5KYhGBDc/YC7/6nl678Tf7MWBVtVsMysGLga+GXQtQTNzIYClxC/Aw13P+buBwMtKlj5wOCWz8mcCrwdcD0ZkWuBnmgaggEdYgAts1teAGwLuJSg3Q98F/hnwHWEwSjgPeBXLUNQvzSz04IuKgju3gj8BPgLcAA45O7/J9iqMiPXAl06MbPTgX8H/sXdDwddT1DM7AvAf7j7S0HXEhL5wETgv7v7BcA/gAF5zcnMPkb8L/lRwCeA08zs5mCryoxcC/RkpiEYMMzsZOJhvtbdfx10PQH7PDDDzOqJD8Vdamb/I9iSAtUANLh7619t64kH/EB0ObDX3d9z9+PAr4HPBVxTRuRaoCczDcGA0DI98SrgDXe/N+h6gubud7l7sbuPJP57sdndI9kLS4a7vwPsN7PzWlZdBrweYElB+gswxcxObXnfXEZELxCH6l/Q9aa7aQgCLisonwduAV41s7qWdf/N3TcGV5KEzNeBtS2dn7eA2wKuJxDuvs3M1gN/In532MtEdAoAffRfRCQicm3IRUREuqFAFxGJCAW6iEhEKNBFRCJCgS4iEhEKdBGRiFCgi4hExP8HbpUs/DOiDUsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def correlate2(field):\n",
    "    phit = g.slice(field,1)\n",
    "    Nt=len(phit)\n",
    "    return np.array([ sum([ phit[s].conjugate()**2*phit[(s+t)%Nt]**2 for s in range(Nt) ])/Nt for t in range(Nt) ])\n",
    "\n",
    "def two_point_for_momentum2(p):\n",
    "    mom_phase = g.exp_ixp(np.array([p,0]))\n",
    "    correlators = [ correlate2(g(mom_phase*conf)) for conf in configurations ]\n",
    "    return correlators\n",
    "\n",
    "c2 = two_point_for_momentum2(0)\n",
    "\n",
    "bc2 = time_parity_average(bin_data(c2, 100))\n",
    "\n",
    "# variance of this is negligible, so treat it as a constant\n",
    "c_const = np.ones(len(c0_mean))*c0_mean[0]**2. \n",
    "\n",
    "c2_mean = np.mean(bc2, axis=0)\n",
    "emp2_mean = emp(c2_mean - c_const)\n",
    "emp2_err = jackknife_variance_estimator(lambda c2: emp(c2 - c_const), bc2)**0.5\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.ylim([0,0.5])\n",
    "ax.errorbar(range(len(emp0_mean)), emp0_mean, emp0_err, marker='+', ls='', c='red', label=\"E(n=1,p=0) - E_0\")\n",
    "ax.errorbar(range(len(emp1_mean)), emp1_mean, emp1_err, marker='+', ls='', c='blue', label=\"E(n=1,p=2pi/L) - E_0\")\n",
    "ax.errorbar(range(len(emp2_mean)), emp2_mean, emp2_err, marker='+', ls='', c='green', label=\"E(n=2,p=0) - E_0\")\n",
    "\n",
    "plt.axhline(y=m0, color='red', linestyle='-')\n",
    "plt.axhline(y=(0.2**2. + (2.*np.sin(np.pi/32))**2.)**0.5, color='blue', linestyle='-')\n",
    "plt.axhline(y=2*0.2, color='green', linestyle='-')\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aaafdbe7",
   "metadata": {},
   "source": [
    "Next, we can add a small interaction term and observe how the states shift.  Note that even the one-particle state can shift and $m_0$ is in general no longer its energy!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "1cba0ce4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :     442.801170 s : Initializing gpt.random(seed13,vectorized_ranlux24_389_64) took 0.000324965 s\n",
      "(-0.543908374270643+0j)\n",
      "(-0.5439083742706198+0j)\n",
      "Acceptance rate of local update: 0.4384765625\n",
      "Acceptance rate of local update: 0.48779296875\n",
      "Acceptance rate of local update: 0.49755859375\n",
      "Acceptance rate of local update: 0.4951171875\n",
      "Acceptance rate of local update: 0.49609375\n",
      "Acceptance rate of local update: 0.5126953125\n",
      "Acceptance rate of local update: 0.49462890625\n",
      "Acceptance rate of local update: 0.49365234375\n",
      "Acceptance rate of local update: 0.494140625\n",
      "Acceptance rate of local update: 0.4970703125\n"
     ]
    },
    {
     "data": {
      "image/png": "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a9euHHzwwQB07dqVY489dr/+Mrf03n77bXr37g3Aiy++yMiRIxk6dCiDBw/mlVdeAfZukS5fvpzx48dz4YUX0r9/f77yla80bkk/8MAD9O/fnxEjRnDZZZe1ukX/zjvvcP755zN48GBGjRrFqlWrANixYwfTp0/n5JNPZvDgwfzlL38BYNasWaRSKQYOHMjcuXNDLY+pU6dyxx13AHD33XczefLkfT7/xS9+wSmnnMLgwYMbxzlnzhxeffVVhg4dyg9+8AOWL1/O2LFj+fznP89JJ53ERx991Fi/YcOGsWzZMgAWLFjApEmTGD9+PH379mVexg/5tddey6BBgxg0aBDXXXfdfvV87bXXGDRoUIvrIFPm3srixYu55JJLALjkkkv49re/TSqV4sQTT+T+++8HYNeuXUydOpUBAwZwwQUXsGvXrsbhm1uu119/PW+88Qann346p59+OgAPPfQQo0ePZvjw4Xzxi19kx44dodZBi9y9bF8jRoxwkdasWbMmfM9z57rD/q+5c/Oe/vbt233IkCHet29fnzVrli9fvrzZ/saNG+fPPfecu7vX19d7r1693N390ksv9dtuu83d3T/++GPfuXOnu7t36tTJ3d2XLVvmhx9+uG/atMk//fRTHzVqlD/xxBO+a9cu79Gjh69fv97d3adOneoTJ07cb7rLli1rLL/00ku9urra3d2XLl3qQ4YMcXf3H/7wh3755Zc3DvPOO++4u/u2bdvc3X337t0+btw4f+GFF/abl6bz+Mwzz/jJJ5/su3fv9gkTJviGDRsa5+XBBx/0b37zm75nzx7/9NNPfeLEif7YY4/5hg0bfODAgfvU+ZBDDmmct2uuucanT5/u7u5r1671nj17+q5du/zWW2/1o48+2t9++23fuXOnDxw40J977jmvqanxQYMG+Y4dO3z79u1+0kkn+fPPP7/Pcs2cZrZ1kKlhOHf3RYsW+bRp09zdfdq0aX7WWWf5p59+6i+//LJ3797dd+3a5b/85S8b6/zCCy94u3btGpdZtuXaq1cvr6+vd/f0d2Ts2LG+Y8cOd3e/6qqrfN68efvVq7nvP1DjWXJVW/qSLNXVe6Me9nZHaN8/9NBDWbFiBfPnz6eqqoovfelLLFiwIPTwo0eP5uc//zlXX301GzdupGPHjvv1M3LkSHr06MEBBxzA0KFDee2111i3bh3HH3984znaF110UavTevLJJ/nqV78KwBlnnMG2bdv44IMPeOSRR5g9e++D7Tp37gzAXXfdxfDhwxk2bBgvvvgia9asaXUa7dq149RTT+WOO+5g165djXs0kN5yfeihhxg2bBjDhw9n3bp1zW5VN8xzw7w9+eSTXHzxxQD079+fXr168fLLLwMwYcIEunTpQseOHZk8eTJPPvkkTz75JBdccAGdOnXi0EMPZfLkyTzxxBNZ6xxmHbRkypQpHHDAAfTt25fjjz+edevW8fjjjzfWefDgwQwePLix/zDL9ZlnnmHNmjWMGTOGoUOHsnDhQjZu3JhTvZpT2aEf44E6kZa0a9eO8ePHM2/ePH7zm980No9kat++PXv27AHY59zqL3/5yyxZsoSOHTty7rnn8uijj+43bEPTUcO0CtXOnWnDhg1cc801LF26lFWrVjFx4sTQ54RPnTqVyy67jClTpuxT7u5ceeWVrFy5kpUrV1JbW8uMGTOaHUenTp1CTavpaYv5nMYYZh1kjrfpcsilDmGXq7szYcKExmW1Zs0abr755lxnbT+VHfoxHaiTChWyjbo1L7300j5bqytXrqRXr1779de7d29WrFgBsM8BxPXr13P88cdz2WWXMWnSpMZ29tb069eP9evX89prrwFw5513tjrM2LFj+dOf/gSkjxV07dqVww8/nAkTJnDDDTc09vfuu+/ywQcf0KlTJ4444gjeeust/vrXv4aqV8N0rrzyyv32Ps466yxuueWWxrbpzZs3s3XrVg477DC2b98eqt4vv/wyr7/+Ov369QPg4Ycf5p133mHXrl3ce++9jBkzhrFjx3Lvvfeyc+dOPvzwQ+655x7Gjh2bdfxh1kG3bt1Yu3Yte/bs4Z577tnns0WLFrFnzx5effVV1q9fT79+/TjttNP485//DMDq1asbx9nScs1cDqNGjeKpp56itrYWgA8//LBx7yYK3YZBkiumPcEdO3bw3e9+l/fee4/27dtzwgknMH/+/P36u+KKK5gyZQrz589n4sSJjeV33XUXf/zjHznwwAM5+uij+fGPfxxquh07duTGG2/k7LPPplOnTpxyyimtDlNdXc3Xv/51Bg8ezCGHHMLChQsB+MlPfsLs2bMZNGgQ7dq1Y+7cuUyePJlhw4bRv39/evbsyZgxY0IukfSW7hVXXLFf+ec+9znWrl3L6NGj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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1000\n",
      "2000\n",
      "3000\n",
      "4000\n"
     ]
    }
   ],
   "source": [
    "rng = g.random(\"seed13\")\n",
    "action_list = []\n",
    "m0 = 0.2\n",
    "lam = 0.005\n",
    "\n",
    "def S_ia(phi, m0, lam):\n",
    "    action = 0.5*g.norm2(phi)*m0**2 + lam * g.sum(g.adj(phi)*phi*g.adj(phi)*phi)\n",
    "    for mu in range(2):\n",
    "        action -= 0.5 * g.inner_product(phi, g.cshift(phi,mu,1) + g.cshift(phi,mu,-1) - 2.*phi)\n",
    "    return action\n",
    "\n",
    "def S_field_ia(phi, m0, lam):\n",
    "    # gather in afld[x] everything that changes if phi[x] changes\n",
    "    afld = g(0.5 * g.adj(phi)*phi*(m0**2 + 4.0))\n",
    "    afld += lam * g.adj(phi)*phi*g.adj(phi)*phi\n",
    "    for mu in range(2):\n",
    "        afld -= g.adj(phi) * (g.cshift(phi,mu,1) + g.cshift(phi,mu,-1))\n",
    "    return afld\n",
    "\n",
    "# test change in single point\n",
    "rng.element(field)\n",
    "field[12,17] = 0.5\n",
    "S0 = S_ia(field,m0,lam)\n",
    "Sf0 = S_field_ia(field,m0,lam)[12,17]\n",
    "field[12,17] = 0.3\n",
    "S1 = S_ia(field,m0,lam)\n",
    "Sf1 = S_field_ia(field,m0,lam)[12,17]\n",
    "print(S1 - S0)\n",
    "print(Sf1 - Sf0)\n",
    "\n",
    "\n",
    "\n",
    "# first thermalize theory for new m0\n",
    "field[:] = 0.0\n",
    "for s in range(100):\n",
    "    acceptance_rate = metropolis_step(field, lambda field: S_field_ia(field, m0, lam), 3.0)\n",
    "    action_list.append(S_ia(field, m0, lam).real)\n",
    "    if s % 10 == 0:\n",
    "        print(\"Acceptance rate of local update:\",acceptance_rate)\n",
    "    \n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list)), action_list, marker='+', ls='', c='red', label=\"S using local Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n",
    "\n",
    "configurations_ia = []\n",
    "\n",
    "for s in range(5000):\n",
    "    for sub_steps in range(5):\n",
    "        acceptance_rate = metropolis_step(field, lambda field: S_field_ia(field, m0, lam), 3.0)\n",
    "    configurations_ia.append(g.copy(field))\n",
    "    if s % 1000 == 0:\n",
    "        print(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "80189574",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def two_point_for_momentum_ia(p):\n",
    "    mom_phase = g.exp_ixp(np.array([p,0]))\n",
    "    correlators = [ correlate(g(mom_phase*conf)) for conf in configurations_ia ]\n",
    "    return correlators\n",
    "\n",
    "c0_ia = two_point_for_momentum_ia(0)\n",
    "bc0_ia = time_parity_average(bin_data(c0_ia, 100))\n",
    "\n",
    "c0_ia_mean = np.mean(bc0_ia, axis=0)\n",
    "emp0_ia_mean = emp(c0_ia_mean)\n",
    "emp0_ia_err = jackknife_variance_estimator(emp, bc0_ia)**0.5\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.ylim([0,0.5])\n",
    "ax.errorbar(range(len(emp0_ia_mean)), emp0_ia_mean, emp0_ia_err, marker='+', ls='', c='red', label=\"E(p=0,IA) - E_0\")\n",
    "\n",
    "plt.axhline(y=m0, color='red', linestyle='-')\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf2fdb43",
   "metadata": {},
   "source": [
    "One can then also measure the energy of two particles in the interacting theory.  They will no longer be twice as energetic as a single particle due to the interaction energy.  By studying these interaction energies at different volumes, one can learn about scattering amplitudes of particles (see the Lüscher formalism https://doi.org/10.1016/0550-3213(91)90366-6 )."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f03962c",
   "metadata": {},
   "source": [
    "## Field theories in higher dimensions\n",
    "\n",
    "It is straightforward to modify the presented code to simulations in higher dimensions.  Below for a 3+1d interacting real scalar field theory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6b5b31e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "262144\n",
      "GPT :     667.002744 s : Initializing gpt.random(seed13,vectorized_ranlux24_389_64) took 0.000406027 s\n",
      "Acceptance rate of local update: 0.4446144104003906\n",
      "Acceptance rate of local update: 0.5132102966308594\n",
      "Acceptance rate of local update: 0.5131492614746094\n",
      "Acceptance rate of local update: 0.5140342712402344\n",
      "Acceptance rate of local update: 0.5136299133300781\n",
      "Acceptance rate of local update: 0.5135154724121094\n",
      "Acceptance rate of local update: 0.512176513671875\n",
      "Acceptance rate of local update: 0.5137062072753906\n",
      "Acceptance rate of local update: 0.5137748718261719\n",
      "Acceptance rate of local update: 0.5127792358398438\n"
     ]
    },
    {
     "data": {
      "image/png": "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ZnYWsBkYT+IS1jwzmwBsBcaEss8D1wNlwIFQlpAMfgCsDOW+7+6VYfh2YDbQAnghvETS9uGHHypBSJNjZlxwwQWkclk+rSTh7quBwhomXVtDWQcmx8xnFjCrhngp0DOdNorEUYKQpijV972+cS0iIrGUJERSUVKSsVn96Ec/okePHhQUFNC7d29WrFhRe6VafPrTn85Ay2Dp0qXccMMNGZlXlcGDB1NaWlpj/OKLLyZxsSFh1KhRnHvuuSed3549e3jooYcy2sY4VW35xz/+wU033dQgy4T4bRb1wAMPcODAgXprg5KESCqmTcvIbP785z/z3HPP8dprr7FmzRpeeuklOnToUHvFWvzpT3/KQOsaXqtWrfjjH/8IJA7+O3bsqKXGyZPEoUOHMtq+KhdddBHz58+vl3nXlZKESBbasWMHbdu25eyzzwagbdu2XHTRRSeUi36SfO+99+jUqRMA69ato3///vTu3ZuCggI2bdoEHPvEu3TpUgYPHsxNN91E165d+dKXvnT0k/rzzz9P165d6devH3feeWetZwyVlZWMGjWKgoICBgwYwJo1awDYv38/48eP5/LLL6egoIDf/va3AEyaNInCwkJ69OhBcXFxUttj7NixzJ07F4Df/e53jB49+rjpP/nJT/jkJz9JQUHB0XlOmTKFt956i969e/Ptb3+bpUuXMmjQIG688Ua6d+/Ohx9+eLR9ffr0YcmSJQDMnj2bkSNHMnjwYPLz85kWSfz33XcfPXv2pGfPnjzwwAMntPPtt9+mZ8+eJ90HUdGzofnz53PrrbcCcOutt/L1r3+dwsJCLrvsMp577jkADh48yNixY+nWrRuf/exnOXjw4NH6NW3X6dOn849//IOrr76aq6++GoAXX3yRK664gr59+/L5z3+e/fv3J7UPYrl7Vr369evnIrVZv3598oWLi93hxFdxcZ2Xv2/fPu/Vq5fn5+f7pEmTfOnSpTWWu+qqq3zlypXu7l5RUeEdO3Z0d/c77rjDH3/8cXd3/+ijj/zAgQPu7t6yZUt3d1+yZImfd955vm3bNj98+LAPGDDAX331VT948KDn5eX55s2b3d197NixPmLEiBOWu2TJkqPxO+64w0tKStzdffHixd6rVy93d//Od77j3/zmN4/WqaysdHf3Xbt2ubv7oUOH/KqrrvK//vWvJ6xL9XVcvny5X3755X7o0CEfMmSIb9my5ei6LFy40G+77TY/cuSIHz582EeMGOF/+MMffMuWLd6jR4/j2nzOOeccXbd7773Xx48f7+7uGzZs8A4dOvjBgwf9kUce8Y9//OP+3nvv+YEDB7xHjx6+cuVKLy0t9Z49e/r+/ft937593r17d3/ttdeO267RZcbtg6iqeu7uTz31lBcVFbm7e1FRkQ8dOtQPHz7sb775prdv394PHjzoP/3pT4+2+a9//as3a9bs6DaL264dO3b0iooKd0+8RwYNGuT79+93d/e7777bp02bdkK7anr/A6VewzFVZxIitSkpOZYa4NhwGv0T5557LqtWrWLGjBnk5ubyhS98gdmzZydd/4orruDHP/4x99xzD1u3bqVFixYnlOnfvz95eXmcccYZ9O7dm7fffpuNGzdyySWXHL1Hfty4cbUua9myZXz5y18G4JprrmHXrl3s3buXl156icmTj92w2Lp14qtO8+bNo2/fvvTp04d169axfv36WpfRrFkzPvOZzzB37lwOHjx49IwJEp+MX3zxRfr06UPfvn3ZuHFjjZ/aq9a5at2WLVvGzTffDEDXrl3p2LEjb775JgBDhgzhggsuoEWLFowePZply5axbNkyPvvZz9KyZUvOPfdcRo8ezauvvhrb5mT2wcmMGTOGM844g/z8fC655BI2btzIK6+8crTNBQUFFBQUHC2fzHZdvnw569evZ+DAgfTu3Zs5c+awdevWlNpVnZJEVAY7JUVq06xZMwYPHsy0adP42c9+dvRyTVROTg5HjhwBOO7b4V/84hdZsGABLVq04Prrr+fll18+oW7VpayqZdXXdfqoLVu2cO+997J48WLWrFnDiBEjkv5W+9ixY7nzzjsZM2bMcXF3Z+rUqaxevZrVq1dTVlbGhAkTapxHy5Ytk1pW9dtA63I7dDL7IDrf6tshlTYku13dnSFDhhzdVuvXr2fmzJmprtpxlCSiMtQpKVksyWvstXnjjTeO+zS8evVqOnbseEK5Tp06sWrVKoDjOkw3b97MJZdcwp133snIkSOP9hPUpkuXLmzevJm3334bgCeffLLWOoMGDeLXv/41kOjraNu2Leeddx5DhgzhwQcfPFpu9+7d7N27l5YtW3L++efz7rvv8sILyX//ddCgQUydOvWEs5uhQ4cya9aso9fWt2/fzs6dO/nYxz7Gvn37kmr3m2++yd///ne6dOkCwKJFi6isrOTgwYM888wzDBw4kEGDBvHMM89w4MABPvjgA55++mkGDRoUO/9k9kG7du3YsGEDR44c4emnnz5u2lNPPcWRI0d466232Lx5M126dOHKK6/kN7/5DQBr1649Os+TbdfodhgwYAB//OMfKSsrA+CDDz44evZUV+l+41qkacnQ2eb+/fv5xje+wZ49e8jJyeHSSy9lxowZJ5S76667GDNmDDNmzGDEiBFH4/PmzeOxxx7jzDPP5OMf/zjf/e53k1puixYteOihhxg2bBgtW7bkk5/8ZK11SkpK+MpXvkJBQQHnnHMOc+YkngTwve99j8mTJ9OzZ0+aNWtGcXExo0ePpk+fPnTt2pUOHTowcODAJLdI4pP0XXfddUL8uuuuY8OGDVxxxRVA4lLd448/zic+8QkGDhxIz549GT58+HHbB+D2229n0qRJXH755eTk5DB79uyjZ1f9+/fnc5/7HOXl5dx8880UFia+E3zrrbfSv39/AL761a/Sp0+f2PYmsw/uvvtubrjhBnJzcyksLDyuE/niiy+mf//+7N27l5///Oc0b96cSZMmMX78eLp160a3bt3o168fAL169YrdrhMnTmTYsGFcdNFFLFmyhNmzZzNu3Dg++ugjAH74wx9y2WWX1b4D4tTUUXE6v1LuuK6HTkk59aXUcZ1l9u3b5+7uR44c8UmTJvl9993XyC1qWI888ohPnjy5UdtQVFTkTz31VKMtXx3XqaiHTkmRU9kvf/lLevfuTY8ePXj//ff52te+1thNklOYuXvtpU4jhYWFXts3FGOZHUsWktU2bNhAt27dGrsZIo2ipve/ma1y9xN+i09nElEZ6pSU00O2fUASSUaq73sliShdYmoymjdvzq5du5QopElxTzxPonnz5knX0d1N0iTl5eVRXl6e0u/qi2SDqifTJUtJQpqkM888M+knc4k0ZbrcJCIisZQkREQklpKEiIjEyrrvSZhZBVDXnz1sC7yXweacLpriejfFdYamud5NcZ0h9fXu6O651YNZlyTSYWalNX2ZJNs1xfVuiusMTXO9m+I6Q+bWW5ebREQklpKEiIjEUpI43om/1dw0NMX1borrDE1zvZviOkOG1lt9EiIiEktnEiIiEktJQkREYilJBGY2zMzeMLMyM5vS2O2pD2bWwcyWmNl6M1tnZt8M8TZmtsjMNoW/rRu7rZlmZs3M7HUzey6MdzazFWF/P2lmZzV2GzPNzFqZ2Xwz22hmG8zsimzf12b2H+G9vdbMnjCz5tm4r81slpntNLO1kViN+9YSpof1X2NmfVNZlpIEiQMI8CAwHOgOjDOz7o3bqnpxCPg/7t4dGABMDus5BVjs7vnA4jCebb4JbIiM3wPc7+6XAruBCY3Sqvr138Dv3b0r0IvE+mftvjaz9sCdQKG79wSaAWPJzn09GxhWLRa3b4cD+eE1EXg4lQUpSST0B8rcfbO7/xOYC4xs5DZlnLvvcPfXwvA+EgeN9iTWdU4oNgcY1SgNrCdmlgeMAH4Vxg24BpgfimTjOp8PXAnMBHD3f7r7HrJ8X5P4ZesWZpYDnAPsIAv3tbu/AlRWC8ft25HAo+FR1suBVmZ2YbLLUpJIaA9si4yXh1jWMrNOQB9gBdDO3XeESe8A7RqrXfXkAeA7wJEwfgGwx90PhfFs3N+dgQrgkXCZ7Vdm1pIs3tfuvh24F/g7ieTwPrCK7N/XVeL2bVrHNyWJJsjMzgV+C3zL3fdGp3ninuisuS/azG4Adrr7qsZuSwPLAfoCD7t7H+ADql1aysJ93ZrEp+bOwEVAS068JNMkZHLfKkkkbAc6RMbzQizrmNmZJBLEr939dyH8btXpZ/i7s7HaVw8GAjea2dskLiNeQ+JafatwSQKyc3+XA+XuviKMzyeRNLJ5X/87sMXdK9z9X8DvSOz/bN/XVeL2bVrHNyWJhJVAfrgL4iwSnV0LGrlNGReuxc8ENrj7fZFJC4CiMFwEPNvQbasv7j7V3fPcvROJ/fqyu38JWALcFIpl1ToDuPs7wDYz6xJC1wLryeJ9TeIy0wAzOye816vWOav3dUTcvl0A3BLuchoAvB+5LFUrfeM6MLPrSVy7bgbMcvcfNW6LMs/MPgO8CvyNY9fnv0uiX2IecDGJn1kf4+7VO8VOe2Y2GLjL3W8ws0tInFm0AV4Hbnb3jxqxeRlnZr1JdNafBWwGxpP4YJi1+9rMpgFfIHEn3+vAV0lcf8+qfW1mTwCDSfwc+LtAMfAMNezbkDB/RuLS2wFgvLuXJr0sJQkREYmjy00iIhJLSUJERGIpSYiISCwlCRERiaUkISIisZQkREQklpKEiIjE+v+D09tGW7VojwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "L = [16,16,16,64]\n",
    "print(L[0]*L[1]*L[2]*L[3])\n",
    "grid = g.grid(L, g.double)\n",
    "grid_eo = g.grid(L, g.double, g.redblack)\n",
    "\n",
    "field = g.real(grid)\n",
    "field[:] = 0\n",
    "\n",
    "rng = g.random(\"seed13\")\n",
    "field[:] = 0.0\n",
    "action_list = []\n",
    "m0 = 0.2\n",
    "lam = 0.005\n",
    "\n",
    "def S_4d(phi, m0, lam):\n",
    "    action = 0.5*g.norm2(phi)*m0**2 + lam * g.sum(g.adj(phi)*phi*g.adj(phi)*phi)\n",
    "    for mu in range(4):\n",
    "        action -= 0.5 * g.inner_product(phi, g.cshift(phi,mu,1) + g.cshift(phi,mu,-1) - 2.*phi)\n",
    "    return action\n",
    "\n",
    "def S_field_4d(phi, m0, lam):\n",
    "    # gather in afld[x] everything that changes if phi[x] changes\n",
    "    afld = g(0.5 * g.adj(phi)*phi*(m0**2 + 8.0))\n",
    "    afld += lam * g.adj(phi)*phi*g.adj(phi)*phi\n",
    "    for mu in range(4):\n",
    "        afld -= g.adj(phi) * (g.cshift(phi,mu,1) + g.cshift(phi,mu,-1))\n",
    "    return afld\n",
    "\n",
    "# first thermalize theory for new m0\n",
    "for s in range(100):\n",
    "    acceptance_rate = metropolis_step(field, lambda field: S_field_4d(field, m0, lam), 2.0)\n",
    "    action_list.append(S_4d(field, m0, lam).real)\n",
    "    if s % 10 == 0:\n",
    "        print(\"Acceptance rate of local update:\",acceptance_rate)\n",
    "    \n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "ax.plot(range(len(action_list)), action_list, marker='+', ls='', c='red', label=\"S using local Metropolis update\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
