{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9dea91b8",
   "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 13: Hybrid Monte Carlo\n",
    "\n",
    "In this chapter we discuss the Hybrid Monte Carlo (HMC) algorithm that can efficiently generate gauge configurations with dynamical fermions.  We go step-by-step and first introduce needed concepts."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2621a0c0",
   "metadata": {},
   "source": [
    "## Molecular Dynamics\n",
    "\n",
    "The Hamiltonian $H(q,p)$ with canonical coordinate $q$ and canonical momentum $p$\n",
    "is constant under time-evolution of $p$ and $q$ following the equations of motion\n",
    "$$\n",
    "\\begin{align}\n",
    "\\dot{q} &= \\frac{\\partial H}{\\partial p} \\,, & \\dot{p} &= -\\frac{\\partial H}{\\partial q} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "They can therefore be used to simulate the evolution of a microcanonical ensemble (where the energy\n",
    "is constant and specified).\n",
    "\n",
    "Now consider a simple Hamiltonian\n",
    "$$\n",
    "\\begin{align}\n",
    "H(p,q) = \\frac12 p^2 + V(q) \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "then the equations of motions are\n",
    "$$\n",
    "\\begin{align}\n",
    "\\dot{q} &= p \\,, &\n",
    "\\dot{p} &= -V'(q) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "A simple numerical scheme to perform the Molecular Dynamics (MD) integration is the **Euler integrator**\n",
    "$$\n",
    "\\begin{align}\n",
    "p(t+dt) &= p(t) - V'(q(t)) dt \\,, \\\\\n",
    "q(t+dt) &= q(t) + p(t) dt \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "A better scheme is the **Leapfrog integrator**\n",
    "$$\n",
    "\\begin{align}\n",
    "p(t+dt/2) &= p(t) - V'(q(t)) dt/2 \\,, \\\\\n",
    "q(t+dt) &= q(t) + p(t+dt/2) dt \\,, \\\\\n",
    "p(t+dt) &= p(t+dt/2) - V'(q(t+dt)) dt/2 \n",
    "\\end{align}\n",
    "$$\n",
    "which is symplectic, i.e., it preserves the $dp \\wedge dq$.  It preserves\n",
    "the energy to high accuracy and is reversible as you will show in your homework.\n",
    "\n",
    "***Homework***: Show for the Leapfrog that\n",
    "$$\n",
    "\\begin{align}\n",
    "H(p(t+dt),q(t+dt)) - H(p(t),q(t)) = O(dt^3)\n",
    "\\end{align}\n",
    "$$\n",
    "Show also that the Leapfrog is reversible, i.e., that evolving with\n",
    "$-dt$ after evolving with $dt$ returns to the same identical (p,q).\n",
    "\n",
    "Let us demonstrate these integrators in a simple example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6780e7eb",
   "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"
    },
    {
     "data": {
      "image/png": "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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": [
      "Reversibility test: 2.951175396656005e-06\n"
     ]
    }
   ],
   "source": [
    "import gpt as g\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import scipy.integrate\n",
    "\n",
    "def V(q):\n",
    "    return 1.0/2.0*q**2 + 1.0/4.0 * q**4\n",
    "\n",
    "def dV(q):\n",
    "    return q + q**3\n",
    "\n",
    "def integrator_euler(p, q, dt):\n",
    "    return p - dV(q)*dt, q + p*dt\n",
    "    \n",
    "def plot(p, q, eps, integrator):\n",
    "    x = []\n",
    "    y = []\n",
    "    t = []\n",
    "    E = []\n",
    "    for i in range(10000):\n",
    "        p, q = integrator(p, q, eps)\n",
    "        x.append(q)\n",
    "        y.append(p)\n",
    "        t.append(i*eps)\n",
    "        E.append(p**2./2.0 + V(q))\n",
    "    \n",
    "    fig, ax = plt.subplots()\n",
    "    plt.title(\"Phase diagram\")\n",
    "    plt.xlabel(\"q\")\n",
    "    plt.ylabel(\"p\")\n",
    "    ax.plot(x,y)\n",
    "    plt.show()\n",
    "\n",
    "    fig, ax = plt.subplots()\n",
    "    plt.title(\"Energy conservation\")\n",
    "    ax.ticklabel_format(style=\"sci\",useOffset=False)\n",
    "    plt.xlabel(\"t\")\n",
    "    plt.ylabel(\"E\")\n",
    "    ax.plot(t,E)\n",
    "    plt.show()\n",
    "    \n",
    "    # check reversibility\n",
    "    p, q = integrator(p, q, -eps)\n",
    "    delta = ((p - y[-2])**2. + (q - x[-2])**2.)**0.5\n",
    "    print(\"Reversibility test:\",delta)\n",
    "    \n",
    "plot(0.3, 0, 0.003, integrator_euler)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "8f274d1c",
   "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"
    },
    {
     "data": {
      "image/png": "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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": [
      "Reversibility test: 0.0\n"
     ]
    }
   ],
   "source": [
    "def integrator_leapfrog(p, q, dt):\n",
    "    p_half = p - dV(q)*dt/2.\n",
    "    q_one = q + p_half*dt\n",
    "    p_one = p_half - dV(q_one)*dt/2.\n",
    "    return p_one, q_one\n",
    "\n",
    "plot(0.3, 0, 0.003, integrator_leapfrog)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18fc2868",
   "metadata": {},
   "source": [
    "## The path integral using Molecular Dynamics\n",
    "\n",
    "Let us define a simple bosonic path integral\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle O(q) \\rangle &= \\frac{\\int dq O(q) e^{-V(q)}}{\\int dq e^{-V(q)}} = \\frac{\\int dq dp O(q) e^{-V(q)-p^2/2}}{\\int dq dp  e^{-V(q)-p^2/2}} \\\\\n",
    "&= \\frac{\\int dq dp O(q) e^{-H(p,q)}}{\\int dq dp e^{-H(p,q)}}\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "If we now randomly pick momenta $p$ following the distribution\n",
    "$$\n",
    "e^{-p^2/2}\n",
    "$$\n",
    "and use an exact MD integrator to integrate a trajectory, we do not change $H(p,q)$.  If such a process were to be ergodic, i.e.,\n",
    "any field configuration can be reached and reversible, then we can use the MD integration as a proposal step in the Metropolis algorithm of chapter 2.  Since the energy is conserved, all proposed configurations should be accepted.  Let us demonstrate this algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "dc24a68c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :   12129.165851 s : Initializing gpt.random(hmc,vectorized_ranlux24_389_64) took 0.000347853 s\n",
      "Energy changed by 4.9812149431683414e-05\n",
      "0.4693255931366978 +- 0.0026291580867840044\n",
      "0.4679199169736833\n"
     ]
    }
   ],
   "source": [
    "rng = g.random(\"hmc\")\n",
    "\n",
    "ref_val = (\n",
    "    scipy.integrate.quad(lambda q:q**2.*np.exp(-q**2./2.-q**4./4.),-np.infty,np.infty)[0] \n",
    "    / scipy.integrate.quad(lambda q:np.exp(-q**2./2.-q**4./4.),-np.infty,np.infty)[0]\n",
    ")\n",
    "\n",
    "def md_integrate(rng, f, eps, trajectory_length, trajectories, integrator, verbose):\n",
    "    q = 0.0\n",
    "    ftot = 0.0\n",
    "    dE2tot = 0.0\n",
    "    for i in range(trajectories):\n",
    "        p = rng.normal().real\n",
    "        E0 = p**2./2. + V(q)\n",
    "        for j in range(trajectory_length):\n",
    "            p, q = integrator(p, q, eps)\n",
    "        E1 = p**2./2. + V(q)\n",
    "        dE2tot += (E1-E0)**2.\n",
    "        ftot += f(q)\n",
    "    if verbose:\n",
    "        print(\"Energy changed by\",(dE2tot / trajectories)**0.5)\n",
    "    return ftot / trajectories\n",
    "    \n",
    "measurements = [md_integrate(rng, lambda q: q**2., 0.01, 100, 1000, integrator_leapfrog, j==0) for j in range(40)]\n",
    "hmc_mean = np.mean(measurements)\n",
    "hmc_err = np.std(measurements) / len(measurements)**0.5\n",
    "print(hmc_mean,\"+-\",hmc_err)\n",
    "\n",
    "print(ref_val)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38686e3c",
   "metadata": {},
   "source": [
    "\n",
    "## The Hybrid Monte Carlo algorithm\n",
    "\n",
    "We cannot make the step size in the above algorithm much larger since we have a systematic error due to the non-conservation of energy.  This is, however, readily fixed by adding an accept-reject step.  Let us demonstrate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "0188b803",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Energy changed by 0.371463895432758\n",
      "Acceptance rate 0.80436\n",
      "0.4676423573794918 +- 0.0009053735027992211\n",
      "0.4679199169736833\n"
     ]
    }
   ],
   "source": [
    "def hmc_integrate(rng, f, eps, trajectory_length, trajectories, integrator, verbose):\n",
    "    q = 0.0\n",
    "    ftot = 0.0\n",
    "    dE2tot = 0.0\n",
    "    reject = 0\n",
    "    accept = 0\n",
    "    for i in range(trajectories):\n",
    "        p = rng.normal().real\n",
    "        E0 = p**2./2. + V(q)\n",
    "        q0 = q\n",
    "        for j in range(trajectory_length):\n",
    "            p, q = integrator(p, q, eps)\n",
    "        E1 = p**2./2. + V(q)\n",
    "        if np.exp(E0-E1) < rng.uniform_real(min=0,max=1):\n",
    "            reject += 1\n",
    "            q = q0\n",
    "        else:\n",
    "            accept += 1\n",
    "            dE2tot += (E1-E0)**2.\n",
    "        ftot += f(q)\n",
    "    if verbose:\n",
    "        print(\"Energy changed by\",(dE2tot / trajectories)**0.5)\n",
    "        print(\"Acceptance rate\",accept/(accept+reject))\n",
    "    return ftot / trajectories\n",
    "    \n",
    "# can run with much larger stepsize, i.e., fewer steps within a trajectory, roughly same cost as MD above\n",
    "# smaller statistical error compared to pure MD due to more uncorrelated configurations at same cost\n",
    "measurements = [hmc_integrate(rng, lambda q: q**2., 0.8, 2, 50000, integrator_leapfrog, j==0) for j in range(40)]\n",
    "hmc_mean = np.mean(measurements)\n",
    "hmc_err = np.std(measurements) / len(measurements)**0.5\n",
    "print(hmc_mean,\"+-\",hmc_err)\n",
    "\n",
    "print(ref_val)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6908775a",
   "metadata": {},
   "source": [
    "***Homework:*** Use the HMC algorithm to compute $\\int dx x^4 e^{-x^4} / \\int dx e^{-x^4}$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16f51c98",
   "metadata": {},
   "source": [
    "## Strength of the HMC\n",
    "\n",
    "We can generate configurations that are to a large degree uncorrelated by evolving for a long time within a microcanonical ensemble.  This\n",
    "performs an update that globally reduces correlation.  At the same time, we approximately conserve the Hamiltonian, so that we have a good acceptance rate even for large global field configuration changes.  This effectively reduces the autocorrelation compared to other global update schemes.  Local updating schemes such as the Heatbath are also very effective but require a specific restricted local form of the action.  The introduction of a fermion determinant, e.g., violates the local form of the action.  The HMC on the other hand can perform global updates while only requiring knowledge of the derivative of the action with respect to the field configuration."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4fdf720",
   "metadata": {},
   "source": [
    "## HMC generation of quenched ensemble"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9e6759e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :    2335.016326 s : Initializing gpt.random(test,vectorized_ranlux24_24_64) took 4.60148e-05 s\n",
      "GPT :    2336.024092 s : HMC 0 has P = 0.7984117298395389, dS = 10379.119118396331, acceptance = 1.0\n",
      "GPT :    2357.513546 s : HMC 25 has P = 0.510195708618931, dS = 532.1766394544538, acceptance = 0.6923076923076923\n",
      "GPT :    2384.033852 s : HMC 50 has P = 0.5002854277947527, dS = 624.5210875141056, acceptance = 0.7254901960784313\n",
      "GPT :    2414.452550 s : HMC 75 has P = 0.49634571797119015, dS = 505.94901705106895, acceptance = 0.7763157894736842\n",
      "GPT :    2447.146318 s : HMC 100 has P = 0.4998291900738143, dS = -188.5970112660725, acceptance = 0.7524752475247525\n",
      "GPT :    2481.451864 s : HMC 125 has P = 0.5002291687006946, dS = 210.18674995772017, acceptance = 0.7619047619047619\n",
      "GPT :    2509.303130 s : HMC 150 has P = 0.49520164333211647, dS = 10.240288826535107, acceptance = 0.7748344370860927\n",
      "GPT :    2531.547358 s : HMC 175 has P = 0.5012029695511525, dS = 300.1770389723679, acceptance = 0.7727272727272727\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAcFUlEQVR4nO3df7BU5Z3n8fcniBIMJoDoGgFBhGgwinJjTDKJ1M5qmGhQVytiWQY2y+BUDbuxtmIKK7vhiklWJ7VJioq1CeMgkykzmJhVb9XUxtHNOFZNBcMlczVeFEHilJdiFMEfa60GMd/9o0/DoT3dfbpv3+6+pz+vqq4+fX4+5+nTn3766dOnFRGYmVlxva/TBTAzs7HloDczKzgHvZlZwTnozcwKzkFvZlZwDnozs4LLFfSSlkraKWm3pLUZ078naSi5PSfptdS0FZJ2JbcVLSy7mZnloHrn0UuaADwHXAqMANuA6yNiR5X5/xNwQUR8WdI0YBDoAwLYDiyOiFdbtwtmZlZLnhb9RcDuiNgTEYeALcCVNea/HvjbZPhzwCMRcTAJ90eApaMpsJmZNea4HPOcDryYejwCfCJrRklnAHOBX9ZY9vSM5VYDqwFOPPHExWeffXaOYpmZWdn27dtfiYgZWdPyBH0jlgP3R8S7jSwUERuBjQB9fX0xODjY4mKZmRWbpH+pNi1P181eYFbq8cxkXJblHO22aXRZMzMbA3mCfhswX9JcScdTCvOBypkknQ1MBX6VGv0wcJmkqZKmApcl48zMrE3qdt1ExGFJaygF9ARgU0QMS1oPDEZEOfSXA1sidRpPRByUdDulNwuA9RFxsLW7YGZmtdQ9vbLd3Edv1h3eeecdRkZGePvttztdFEuZNGkSM2fOZOLEiceMl7Q9Ivqylmn1l7FmVhAjIyNMmTKFOXPmIKnTxTEgIjhw4AAjIyPMnTs393K+BIKZZXr77beZPn26Q76LSGL69OkNf8py0JtZVQ757tPMc+KgNzMrOAe9mXWtD3zgA8c83rx5M2vWrAGgv78fSezevfvI9O9///tIonxCx5tvvslNN93EvHnzWLx4MUuWLOGJJ554z3a+/e1vj+FewNDQEJ/85CdZuHAh5513Hvfdd1/mfJs3b2bGjBksWrSIRYsWcffdd7dk+w56M2up/v72betjH/sYW7ZsOfL4Zz/7GQsXLjzyeNWqVUybNo1du3axfft27rnnHl555ZX3rGesg37y5Mn8+Mc/Znh4mF/84hfcfPPNvPbaa5nzXnfddQwNDTE0NMSqVatasn0HvZm11G23tW9bV111FQ899BAAzz//PB/84Ac5+eSTjzx+4okn+OY3v8n73leKurlz53L55Zcfs461a9fy1ltvsWjRIm644YYj6128eDELFy5k48aNR+ZNf8K4//77WblyZa5yLliwgPnz5wPw4Q9/mFNOOYX9+/c3t9NN8OmVZta1ygFcdvDgQZYtW3bk8UknncSsWbN4+umneeihh7juuuu45557ABgeHmbRokVMmDCh5jbuuOMOfvCDHzA0NHRk3KZNm5g2bRpvvfUWH//4x7nmmmuYPn161XXce++9fOc733nP+LPOOov777//mHG//vWvOXToEPPmzctc189//nMef/xxFixYwPe+9z1mzZqVOV8j3KI3s1Hr7wepdIOjw6Ptxnn/+99/pBtjaGiI9evXv2ee5cuXs2XLFh588EGuvvrq0W0wsWHDBs4//3wuvvhiXnzxRXbt2lVz/htuuOGYcpZvlSG/b98+brzxRu65554jnzLSvvCFL/DCCy/w1FNPcemll7JiRWv+q8ktejMbtf7+o6EuQTt/cH/FFVdwyy230NfXx0knnXRk/MKFC3nyySd5991367bq0x577DEeffRRfvWrXzF58mSWLFly5Lz19KmN6XPZ87To33jjDS6//HK+9a1vcfHFF2duO/2pYdWqVXzta1/LXe5aHPRmNq5NnjyZO++8kwULFhwzft68efT19bFu3Tpuv/12JPHCCy8wPDz8nn76iRMn8s477zBx4kRef/11pk6dyuTJk3n22WfZunXrkflOPfVUnnnmGT7ykY/wwAMPMGXKFKDUoi/372c5dOgQV199NV/60pe49tprq863b98+TjvtNAAGBgY455xzGq6PLIXvumnnGQBmBuvWtX+by5cv58ILL3zP+LvvvpuXXnqJs846i3PPPZeVK1dyyimnvGe+1atXc95553HDDTewdOlSDh8+zDnnnMPatWuPaX3fcccdXHHFFXzqU586Esh5/PSnP+Xxxx9n8+bNR06dLH8n8I1vfIOBgdK1ITds2MDChQs5//zz2bBhA5s3b26sIqoo/EXN2v0x0qwonnnmmZa1KK21sp6bWhc1K3yL3sys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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "L = [8, 8, 8, 8]\n",
    "grid = g.grid(L, g.double)\n",
    "\n",
    "rng = g.random(\"test\", \"vectorized_ranlux24_24_64\")\n",
    "U = g.qcd.gauge.random(grid, rng)\n",
    "Nd = len(U)\n",
    "\n",
    "# conjugate momenta\n",
    "mom = g.group.cartesian(U)\n",
    "\n",
    "a0 = g.qcd.scalar.action.mass_term()\n",
    "a1 = g.qcd.gauge.action.wilson(5.5)\n",
    "\n",
    "def hamiltonian():\n",
    "    a1v = a1(U)\n",
    "    return a0(mom) + a1v, a1v\n",
    "\n",
    "sympl = g.algorithms.integrator.symplectic\n",
    "\n",
    "ip = sympl.update_p(mom, lambda: a1.gradient(U, U))\n",
    "iq = sympl.update_q(U, lambda: a0.gradient(mom, mom))\n",
    "\n",
    "mdint = sympl.OMF4(5, ip, iq)\n",
    "\n",
    "metro = g.algorithms.markov.metropolis(rng)\n",
    "\n",
    "def hmc(tau, mom):\n",
    "    rng.normal_element(mom)\n",
    "    accrej = metro(U)\n",
    "    h0, s0 = hamiltonian()\n",
    "    mdint(tau)\n",
    "    h1, s1 = hamiltonian()\n",
    "    return [accrej(h1, h0), s1 - s0, h1 - h0]\n",
    "\n",
    "plaquette_hmc = []\n",
    "accept = 0\n",
    "total = 0\n",
    "for it in range(200):\n",
    "    plaq = g.qcd.gauge.plaquette(U)\n",
    "    plaquette_hmc.append(plaq)\n",
    "    a, dS, dH = hmc(1.5 if it < 10 else 2.5, mom)\n",
    "    accept += a\n",
    "    total += 1\n",
    "    if it % 25 == 0:\n",
    "        g.message(f\"HMC {it} has P = {plaq}, dS = {dS}, acceptance = {accept/total}\")\n",
    "    \n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.ylim([0.4,0.7])\n",
    "ax.plot(range(len(plaquette_hmc)), plaquette_hmc, marker='+', ls='', c='blue', label=\"HMC tau=2.5\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e145e15",
   "metadata": {},
   "source": [
    "## HMC generation of dynamical ensemble\n",
    "\n",
    "In order to generate a dynamical fermion ensemble, we would like to generate\n",
    "configurations in the path integral\n",
    "$$\n",
    "\\begin{align}\n",
    "Z = \\int d[U] d\\bar\\psi d\\psi e^{-S_G[U] - \\sum_f \\bar\\psi_f D[U,m_f] \\psi_f} \n",
    "= \\int d[U] \\left(\\prod_f\\det(D[U,m_f])\\right)e^{-S_G[U]} \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "where the sum is over fermion flavors $f$ with masses $m_f$.  The determinant can\n",
    "then be re-expressed using\n",
    "$$\n",
    "\\begin{align}\n",
    "\\det(M)=\\int d\\phi d\\phi^\\dagger e^{-\\phi^\\dagger M^{-1} \\phi} \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "which converges for positive definite $M$.  A single Dirac matrix is not positive\n",
    "definite, however, due to $\\gamma_5$-Hermiticity, one finds\n",
    "$$\n",
    "\\begin{align}\n",
    "\\det(D) = \\det(\\gamma_5 D^\\dagger \\gamma_5) = \\det(D^\\dagger)\n",
    "\\end{align}\n",
    "$$\n",
    "such that for two degenerate flavors, we find\n",
    "$$\n",
    "\\begin{align}\n",
    "\\det(D[U,m])^2 = \\det(D[U,m] D[U,m]^\\dagger) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Since the matrix $M=D[U,m] D[U,m]^\\dagger$ is positive definite,\n",
    "$$\n",
    "\\begin{align}\n",
    "Z = \\int d[U] \\det(D[U,m])^2 e^{-S_G[U]} = \\int d[U] d \\phi d\\phi^\\dagger e^{-S_G[U] - \\phi^\\dagger (D[U,m] D[U,m]^\\dagger)^{-1} \\phi } \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The bosonic fields $\\phi$ are called **pseudo-fermion** fields.\n",
    "\n",
    "If one wants to introducing a single additional flavor (such as a strange quark), one\n",
    "may use rational approximations of the inverse square root as we have studied in the last chapter.  For now, however,\n",
    "we focus on the important case of two degenerate quark flavors that in the real world,\n",
    "we identify with the up and down quarks with degenerate mass $m = m_u = m_d$.  For high-precision\n",
    "calculations, we will then later add corrections in the small $m_u - m_d$.\n",
    "\n",
    "The concrete algorithm for the two-flavor HMC proceeds as follows.  We identify\n",
    "$$\n",
    "\\begin{align}\n",
    "\\eta = D[U,m]^{-1} \\phi\n",
    "\\end{align}\n",
    "$$\n",
    "such that\n",
    "$$\n",
    "\\begin{align}\n",
    "Z = \\int d[U] d \\phi d\\phi^\\dagger e^{-S_G[U] - \\eta^\\dagger \\eta } \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "We then randomly draw a field configuration for $\\eta$ from the trivial distribution\n",
    "$$\n",
    "\\begin{align}\n",
    "e^{-\\eta^\\dagger \\eta}\n",
    "\\end{align}\n",
    "$$\n",
    "and compute\n",
    "$$\n",
    "\\begin{align}\n",
    "\\phi = D[U,m] \\eta \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "We then introduce conjugate momenta for the gauge fields, draw them randomly from a distribution\n",
    "$$\n",
    "\\begin{align}\n",
    "e^{-p^2/2}\n",
    "\\end{align}\n",
    "$$\n",
    "and perform the MD integration using the action\n",
    "$$\n",
    "\\begin{align}\n",
    "S[U,p] = S_G[U] + \\phi^\\dagger (D[U,m] D[U,m]^\\dagger)^{-1} \\phi + p^2/2 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "We complete this process with an accept-reject step.\n",
    "\n",
    "We show the implementation of an HMC for two dynamical degenerate quark flavors below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5741675b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gpt as g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "833e993e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :    3226.733732 s : Initializing gpt.random(test,vectorized_ranlux24_24_64) took 3.60012e-05 s\n",
      "GPT :    3235.798564 s : gauge force 1.7894410341122076\n",
      "GPT :    3235.801223 s : fermion force 0.17477311206344134\n",
      "GPT :    3321.598793 s : HMC 0 has P = 0.7977536349278497, dS = 14125.963963725837, dH = -0.31147062371019274, acceptance = 1.0\n",
      "GPT :    3418.014995 s : HMC 1 has P = 0.7239331849940017, dS = 8454.722610203899, dH = 0.05969532590825111, acceptance = 1.0\n",
      "GPT :    3533.763383 s : HMC 2 has P = 0.6943358474812369, dS = 5455.348705547745, dH = 0.0858488124795258, acceptance = 1.0\n",
      "GPT :    3656.958261 s : HMC 3 has P = 0.6760186855667949, dS = 3259.6686018415494, dH = 0.06032693374436349, acceptance = 1.0\n",
      "GPT :    3792.405839 s : HMC 4 has P = 0.6654805318112572, dS = 1969.0264017770533, dH = 0.05946384253911674, acceptance = 0.8\n",
      "GPT :    3932.168001 s : HMC 5 has P = 0.6654805318112572, dS = 2299.6916684884345, dH = 0.03148992813657969, acceptance = 0.8333333333333334\n",
      "GPT :    4077.065966 s : HMC 6 has P = 0.6574594684876843, dS = 704.2069775389973, dH = 0.05995966272894293, acceptance = 0.8571428571428571\n",
      "GPT :    4228.510042 s : HMC 7 has P = 0.6545793673319614, dS = 930.5410016970709, dH = 0.3986480486346409, acceptance = 0.875\n",
      "GPT :    4371.451943 s : HMC 8 has P = 0.6518778480084265, dS = 602.6918807112379, dH = 0.0027719002682715654, acceptance = 0.8888888888888888\n",
      "GPT :    4515.562474 s : HMC 9 has P = 0.6503448896522969, dS = 407.39265598147176, dH = 0.009069292107596993, acceptance = 0.9\n",
      "GPT :    4521.970773 s : gauge force 1.814392301308143\n",
      "GPT :    4521.972303 s : fermion force 0.21589526829019431\n",
      "GPT :    4658.327603 s : HMC 10 has P = 0.6489356239088632, dS = -6.288312049699016, dH = 0.2598933868575841, acceptance = 0.9090909090909091\n",
      "GPT :    4805.961386 s : HMC 11 has P = 0.6494073794538987, dS = 164.83559356234036, dH = 0.5142212266800925, acceptance = 0.8333333333333334\n",
      "GPT :    4966.673197 s : HMC 12 has P = 0.6494073794538987, dS = 114.54714150133077, dH = 0.0010217524832114577, acceptance = 0.8461538461538461\n",
      "GPT :    5122.601279 s : HMC 13 has P = 0.6486879110260968, dS = 19.57796512846835, dH = -0.28001402865629643, acceptance = 0.8571428571428571\n",
      "GPT :    5282.340239 s : HMC 14 has P = 0.6486526939960445, dS = 231.14872455596924, dH = 0.6017490805825219, acceptance = 0.8666666666666667\n",
      "GPT :    5446.001001 s : HMC 15 has P = 0.6483896283156315, dS = -82.60883781616576, dH = -0.20881832262966782, acceptance = 0.875\n",
      "GPT :    5600.534252 s : HMC 16 has P = 0.6485373676568366, dS = 361.97880395909306, dH = -0.06803504924755543, acceptance = 0.8823529411764706\n",
      "GPT :    5763.193410 s : HMC 17 has P = 0.647554757587237, dS = -92.8522675470449, dH = -0.4093259364599362, acceptance = 0.8888888888888888\n",
      "GPT :    5918.414479 s : HMC 18 has P = 0.6479524902950299, dS = -30.798952600336634, dH = -0.2993377334205434, acceptance = 0.8947368421052632\n",
      "GPT :    6067.051604 s : HMC 19 has P = 0.6477996566889651, dS = 410.621951642097, dH = 0.16502909280825406, acceptance = 0.9\n",
      "GPT :    6073.501520 s : gauge force 1.8237897700468328\n",
      "GPT :    6073.502749 s : fermion force 0.21848204317890033\n",
      "GPT :    6228.876946 s : HMC 20 has P = 0.6467007192206925, dS = -432.8139798906632, dH = -0.02418494736775756, acceptance = 0.9047619047619048\n",
      "GPT :    6383.483695 s : HMC 21 has P = 0.6483591797810356, dS = -99.07440231973305, dH = 0.4043482915731147, acceptance = 0.9090909090909091\n",
      "GPT :    6551.262866 s : HMC 22 has P = 0.6481523322089229, dS = 264.48225277871825, dH = -0.7522227831650525, acceptance = 0.9130434782608695\n",
      "GPT :    6734.099637 s : HMC 23 has P = 0.6473319358700473, dS = -451.6132031325251, dH = -0.3410511414986104, acceptance = 0.9166666666666666\n",
      "GPT :    6895.052412 s : HMC 24 has P = 0.6481366937251823, dS = 153.51149366027676, dH = -0.17425023810938, acceptance = 0.92\n",
      "GPT :    7042.484981 s : HMC 25 has P = 0.6476120721631183, dS = 114.00059209542815, dH = 0.10573470173403621, acceptance = 0.9230769230769231\n",
      "GPT :    7188.268112 s : HMC 26 has P = 0.6469252751582244, dS = -37.47324684332125, dH = 0.12481406063307077, acceptance = 0.9259259259259259\n",
      "GPT :    7348.977756 s : HMC 27 has P = 0.6474102497423976, dS = 11.777054377365857, dH = -0.27457939402665943, acceptance = 0.9285714285714286\n",
      "GPT :    7501.144125 s : HMC 28 has P = 0.6472965110551507, dS = 365.84789683669806, dH = 0.3019059435464442, acceptance = 0.896551724137931\n",
      "GPT :    7641.082958 s : HMC 29 has P = 0.6472965110551507, dS = -148.8018067954108, dH = 0.3522139305714518, acceptance = 0.9\n",
      "GPT :    7647.577584 s : gauge force 1.8179334205626891\n",
      "GPT :    7647.579137 s : fermion force 0.21865133550525476\n",
      "GPT :    7776.533566 s : HMC 30 has P = 0.6476223889322725, dS = -328.71844514412805, dH = 0.14074772945605218, acceptance = 0.9032258064516129\n",
      "GPT :    7914.734084 s : HMC 31 has P = 0.6486266153624308, dS = 596.4052893508924, dH = 0.4665072920033708, acceptance = 0.90625\n",
      "GPT :    8065.826109 s : HMC 32 has P = 0.6471191168076046, dS = 337.1160273979185, dH = -0.04654151131398976, acceptance = 0.9090909090909091\n",
      "GPT :    8210.746242 s : HMC 33 has P = 0.6458873504584405, dS = 423.938943657442, dH = 0.1153583952691406, acceptance = 0.9117647058823529\n",
      "GPT :    8355.740433 s : HMC 34 has P = 0.6453236142595575, dS = 300.71327484829817, dH = -0.10330085339955986, acceptance = 0.9142857142857143\n",
      "GPT :    8516.198655 s : HMC 35 has P = 0.6440978572818944, dS = -407.1902210016269, dH = 0.19129672774579376, acceptance = 0.9166666666666666\n",
      "GPT :    8693.174999 s : HMC 36 has P = 0.6449578954831817, dS = -31.844088866491802, dH = 0.00978290755301714, acceptance = 0.918918918918919\n",
      "GPT :    8857.137077 s : HMC 37 has P = 0.6453688570555499, dS = -449.8061942004133, dH = -0.6390336923068389, acceptance = 0.9210526315789473\n",
      "GPT :    9017.438698 s : HMC 38 has P = 0.6476854574683141, dS = 145.2229589461349, dH = 0.1784240605775267, acceptance = 0.9230769230769231\n",
      "GPT :    9176.537990 s : HMC 39 has P = 0.646992399179136, dS = 204.34257278998848, dH = 0.48368108842987567, acceptance = 0.925\n",
      "GPT :    9183.389993 s : gauge force 1.8206442419484803\n",
      "GPT :    9183.391684 s : fermion force 0.21484474071110654\n",
      "GPT :    9343.047472 s : HMC 40 has P = 0.6464738396823121, dS = -64.2523499049712, dH = -0.2582530634244904, acceptance = 0.926829268292683\n",
      "GPT :    9489.572929 s : HMC 41 has P = 0.6463921827666391, dS = -129.29299051046837, dH = -0.055380396428518, acceptance = 0.9285714285714286\n",
      "GPT :    9619.297308 s : HMC 42 has P = 0.6473024528149066, dS = -427.43147500627674, dH = 0.2026908218394965, acceptance = 0.9069767441860465\n",
      "GPT :    9755.924778 s : HMC 43 has P = 0.6473024528149066, dS = 56.265666058287024, dH = -0.15304966259282082, acceptance = 0.9090909090909091\n",
      "GPT :    9885.403553 s : HMC 44 has P = 0.6469592309616699, dS = -82.33248552470468, dH = 0.10347239428665489, acceptance = 0.9111111111111111\n",
      "GPT :   10014.447419 s : HMC 45 has P = 0.6469459876815528, dS = 42.72129428270273, dH = 0.09759782219771296, acceptance = 0.9130434782608695\n",
      "GPT :   10151.242527 s : HMC 46 has P = 0.6468259260913222, dS = 218.82877777528483, dH = 0.3625646489672363, acceptance = 0.8936170212765957\n",
      "GPT :   10288.244088 s : HMC 47 has P = 0.6468259260913222, dS = 254.30653610033914, dH = -0.22636164270807058, acceptance = 0.8958333333333334\n",
      "GPT :   10432.206801 s : HMC 48 has P = 0.6459083262779279, dS = -96.70608586398885, dH = 0.05700209201313555, acceptance = 0.8979591836734694\n",
      "GPT :   10590.198710 s : HMC 49 has P = 0.6463155079123528, dS = -506.70121625764295, dH = -0.42136163369286805, acceptance = 0.9\n"
     ]
    }
   ],
   "source": [
    "L = [8, 8, 8, 16]\n",
    "grid = g.grid(L, g.double)\n",
    "\n",
    "rng = g.random(\"test\", \"vectorized_ranlux24_24_64\")\n",
    "U = [g.project(x,\"defect\") for x in g.qcd.gauge.random(grid, rng)]\n",
    "Nd = len(U)\n",
    "\n",
    "# conjugate momenta\n",
    "U_mom = g.group.cartesian(U)\n",
    "\n",
    "rng.normal_element(U_mom)\n",
    "    \n",
    "# reproduce https://arxiv.org/pdf/hep-lat/0411006.pdf\n",
    "a0 = g.qcd.scalar.action.mass_term()\n",
    "a1 = g.qcd.gauge.action.improved_with_rectangle(0.8,-1.4069)\n",
    "D_m = g.qcd.fermion.mobius(U, M5=1.8, mass=0.04, Ls=12, b=1., c=0., \n",
    "                           boundary_phases=[1,1,1,-1])\n",
    "D_pv = g.qcd.fermion.mobius(U, M5=1.8, mass=1.0, Ls=12, b=1., c=0.,\n",
    "                            boundary_phases=[1,1,1,-1])\n",
    "\n",
    "inv = g.algorithms.inverter\n",
    "pc = g.qcd.fermion.preconditioner\n",
    "g.default.set_verbose(\"cg_convergence\", False)\n",
    "g.default.set_verbose(\"cg\", False)\n",
    "cg = inv.cg({\"eps\": 1e-8, \"maxiter\": 1000})\n",
    "\n",
    "a2 = g.qcd.pseudofermion.action.two_flavor_ratio_evenodd_schur([D_m, D_pv], cg)\n",
    "\n",
    "P = g.vspincolor(D_m.F_grid_eo)\n",
    "fields = U + [P] \n",
    "\n",
    "sympl = g.algorithms.integrator.symplectic\n",
    "\n",
    "show_force = False\n",
    "\n",
    "def total_force():\n",
    "    global show_force\n",
    "    gauge_force = a1.gradient(U,U)\n",
    "    fermion_force = a2.gradient(fields,U)\n",
    "    if show_force:\n",
    "        g.message(\"gauge force\", (sum(g.norm2(gauge_force)) / 4 / P.grid.gsites)**0.5)\n",
    "        g.message(\"fermion force\", (sum(g.norm2(fermion_force)) / 4 / P.grid.gsites)**0.5)\n",
    "        show_force = False\n",
    "    return [g(x+y) for x,y in zip(gauge_force,fermion_force)]\n",
    "\n",
    "ipU = sympl.update_p(U_mom, lambda: total_force())\n",
    "iqUM = sympl.update_q(U, lambda: a0.gradient(U_mom, U_mom))\n",
    "\n",
    "mdint = sympl.OMF4(5, ipU, iqUM)\n",
    "\n",
    "metro = g.algorithms.markov.metropolis(rng)\n",
    "\n",
    "def hamiltonian(draw):\n",
    "    if draw:\n",
    "        rng.normal_element(U_mom)\n",
    "        a0v = a0(U_mom)\n",
    "        a1v = a1(U)\n",
    "        a2v = a2.draw(fields, rng)\n",
    "    else:\n",
    "        a0v = a0(U_mom)\n",
    "        a1v = a1(U)\n",
    "        a2v = a2(fields)\n",
    "    return a0v + a1v + a2v, a1v + a2v\n",
    "\n",
    "\n",
    "def hmc(tau):\n",
    "    accrej = metro(U)\n",
    "    h0, s0 = hamiltonian(True)\n",
    "    mdint(tau)\n",
    "    h1, s1 = hamiltonian(False)\n",
    "    return [accrej(h1, h0), s1 - s0, h1 - h0]\n",
    "\n",
    "\n",
    "plaquette_hmc = []\n",
    "accept = 0\n",
    "total = 0\n",
    "for it in range(50):\n",
    "    plaq = g.qcd.gauge.plaquette(U)\n",
    "    plaquette_hmc.append(plaq)\n",
    "    show_force = it % 10 == 0\n",
    "    a, dS, dH = hmc(1.3 if it < 10 else 1.5)\n",
    "    accept += a\n",
    "    total += 1\n",
    "    if it % 1 == 0:\n",
    "        g.message(f\"HMC {it} has P = {plaq}, dS = {dS}, dH = {dH}, acceptance = {accept/total}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "038ee42d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAevUlEQVR4nO3df5RVdb3/8edLBFHT/AHeRQzqqKiA0ijDXNGWFy2Vrl7BtQqG6ptaiVbUre+9foV+yEi4yrv8Zt+MVZIpZSlj5I9J7Yu/b99cigxfSWH4giNaDHEDUfNHIALv7x9nD26GOcyemTM/9+ux1llz9md/9ud8PofDfp392efso4jAzMzyZ7+e7oCZmfUMB4CZWU45AMzMcsoBYGaWUw4AM7OccgCYmeVUpgCQNEnSGkmNkma1sv5oSU9Iek7S85L+ObVudrLdGkkXZG3TzMy6ltr6HoCkAcBa4DygCVgGTI+IhlSdBcBzEfFjSaOBhyLi2OT+XUAV8CHgUeDEZLN9tmlmZl0ryxFAFdAYEesiYjuwCJjcok4Ahyb3Pwj8Jbk/GVgUEe9GxMtAY9JeljbNzKwL7Z+hznBgfWq5CfjHFnVqgIclfQU4GPhYattnWmw7PLnfVpsASJoBzAA4+OCDx5188skZury3v/wFPvShDm1qZtanLV++/NWIGNqyPEsAZDEdWBgR/1PSBOAOSaeUouGIWAAsAKisrIz6+voOtSMVQsDMLG8k/am18iwBsAEYkVouS8rSPg9MAoiIpyUNBoa0sW1bbZqZWRfKcg5gGTBSUrmkQUA1UNeizp+BjwJIGgUMBjYn9aolHSCpHBgJPJuxzU6rqSm885cKy833a2pK/UhmZn1Pm0cAEbFD0kxgCTAAuC0iVkmaC9RHRB3wb8BPJX2dwgnhy6Lw8aJVku4GGoAdwJcjYidAa22WenA1Ne/v7CXwhU/NzN7X5sdAe5POngPoQ0M1y5333nuPpqYmtm3b1tNd6bMGDx5MWVkZAwcO3KNc0vKIqGxZv1QngXu9OXN6ugdmti9NTU0ccsghHHvssah53tYyiwi2bNlCU1MT5eXlmbbJzaUgPO9v1rtt27aNI4880jv/DpLEkUce2a4jqNwEgJn1ft75d057nz8HgJlZTjkAzMwSH/jAB/ZYXrhwITNnzgSgpqYGSTQ2Nu5e/4Mf/ABJNH845e233+bKK6/k+OOPZ9y4cUycOJGlS5d23wDayQFgZn1ad57fO/XUU1m0aNHu5V//+teMGTNm9/IXvvAFjjjiCF588UWWL1/O7bffzquvvtp9HWwnB4CZ9WnXXdd9jzVlyhTuv/9+AF566SU++MEPMmTIkN3LS5cuZd68eey3X2HXWl5ezoUXXth9HWyn3HwM1MysLVu3bqWiomL38muvvcbFF1+8e/nQQw9lxIgRrFy5kvvvv59p06Zx++23A7Bq1SoqKioYMGBAd3e7w3wEYGZ9Tldd5uXAAw9kxYoVu29z587dq051dTWLFi3ivvvu45JLLuncA/YwB4CZ9Tk1NYVv9jd/u7/5fnecD7jooou44447OProozn00EN3l48ZM4Y//vGP7Ny5s+s7USIOADOzdjjooIO44YYb+OY3v7lH+fHHH09lZSVz5syh+RI7r7zyCg8++GBPdDMTB4CZ9Wk9cZmX6upqTj/99L3Kb731Vv76179ywgkncMopp3DZZZdx1FFHdX8HM8rNxeDMrHdbvXo1o0aN6ulu9HmtPY/FLgbnIwAzs5xyAJiZ5ZQDwMwspxwAZmY55QAwM8upTAEgaZKkNZIaJc1qZf1NklYkt7WS3kjKz0mVr5C0TdKUZN1CSS+n1lWUcFxmZtaGNgNA0gBgPvBxYDQwXdLodJ2I+HpEVEREBXAzcE9S/kSq/Fzg78DDqU2vbl4fEStKMB4zsz5jxYoVPPTQQ+3ebuLEiZTiI/FZjgCqgMaIWBcR24FFwOR91J8O3NVK+SeA30XE39vfTTOz/qejAVAqWQJgOLA+tdyUlO1F0jFAOfB4K6ur2TsYrpf0fDKFdECGvpiZdZlf/vKXVFVVUVFRwZVXXsnSpUsZO3Ys27Zt45133mHMmDGsXLmSJ598krPPPpsLL7yQk046iauuuopdu3YB8PDDDzNhwgROP/10PvnJT/L2228DsGzZMs4880w+/OEPU1VVxd/+9jeuvfZaamtrqaiooLa2lnfeeYfPfe5zVFVVcdppp+2+9PTWrVuprq5m1KhRXHLJJWzdurUk4y315aCrgcURscfVkCQNA04FlqSKZwP/BQwCFgDXAHtdek/SDGAGwNFHH13i7ppZbzXtlqdL2l7tlRP2uX716tXU1tby1FNPMXDgQL70pS+xZs0aLr74Yr71rW+xdetWPvOZz3DKKafw5JNP8uyzz9LQ0MAxxxzDpEmTuOeee5g4cSLz5s3j0Ucf5eCDD+aGG27g+9//PrNmzWLatGnU1tYyfvx43nzzTQ466CDmzp1LfX09P/rRjwD4xje+wbnnnsttt93GG2+8QVVVFR/72Me45ZZbOOigg1i9ejXPP/98q5eh6IgsAbABGJFaLkvKWlMNfLmV8qnAvRHxXnNBRGxM7r4r6Xbg31trMCIWUAgIKisr+851K8ysT3nsscdYvnw548ePBwrvuo866iiuvfZaxo8fz+DBg/nhD3+4u35VVRXHHXccANOnT+cPf/gDgwcPpqGhgbPOOguA7du3M2HCBNasWcOwYcN2t52+imjaww8/TF1dHTfeeCMA27Zt489//jO///3v+epXvwrA2LFjGTt2bEnGnCUAlgEjJZVT2PFXA59qWUnSycDhQGuxPZ3CO/50/WERsVGFn7GfAqxsX9fNrD9r6x17qUUEl156Kd/97nf3KN+4cSNvv/027733Htu2bePggw8GQM0/RpCQRERw3nnncddde852v/DCC5n78Jvf/IaTTjqpEyPJrs1zABGxA5hJYfpmNXB3RKySNFfSxamq1cCiaHF1OUnHUjiC+M8WTf9K0gvAC8AQYF6HR2Fm1kkf/ehHWbx4MZs2bQIKvwb2pz/9iSuvvJLvfOc7fPrTn+aaa67ZXf/ZZ5/l5ZdfZteuXdTW1vKRj3yEM844g6eeemr3D8e/8847rF27lpNOOomNGzeybNkyAN566y127NjBIYccwltvvbW7zQsuuICbb7559+Wkn3vuOQDOPvts7rzzTgBWrlzJ888/X5IxZzoHEBEPAQ+1KLu2xXJNkW1foZWTxhFxbtZOmpl1tdGjRzNv3jzOP/98du3axcCBA5k8eTIDBw7kU5/6FDt37uTMM8/k8ccfZ7/99mP8+PHMnDmTxsZGzjnnHC655BL2228/Fi5cyPTp03n33XcBmDdvHieeeCK1tbV85StfYevWrRx44IE8+uijnHPOOXzve9+joqKC2bNn8+1vf5uvfe1rjB07ll27dlFeXs4DDzzAF7/4RS6//HJGjRrFqFGjGDduXEnG7MtBm1mv0JcuB/3kk09y44038sADD/R0V/biy0GbmVmbSv0xUDOzfm/ixIlMnDixp7vRaT4CMLNeoy9NSfdG7X3+HABm1isMHjyYLVu2OAQ6KCLYsmULgwcPzryNp4DMrFcoKyujqamJzZs393RX+qzBgwdTVlaWub4DwMx6hYEDB1JeXt7T3cgVTwGZmeWUA8DMLKccAGZmOeUAMDPLKQeAmVlOOQDMzHLKAWBmllMOADOznHIAmJnllAPAzCynHABmZjnlADAzy6lMASBpkqQ1kholzWpl/U2SViS3tZLeSK3bmVpXlyovl7Q0abNW0qCSjMjMzDJpMwAkDQDmAx8HRgPTJY1O14mIr0dERURUADcD96RWb21eFxEXp8pvAG6KiBOA14HPd24oZmbWHlmOAKqAxohYFxHbgUXA5H3Unw7cta8GJQk4F1icFP0cmJKhL2ZmViJZAmA4sD613JSU7UXSMUA58HiqeLCkeknPSJqSlB0JvBEROzK0OSPZvt4/FGFmVjql/kGYamBxROxMlR0TERskHQc8LukF4G9ZG4yIBcACgMrKSv9WnJlZiWQ5AtgAjEgtlyVlrammxfRPRGxI/q4DngROA7YAh0lqDqB9tWlmZl0gSwAsA0Ymn9oZRGEnX9eykqSTgcOBp1Nlh0s6ILk/BDgLaIjCrz4/AXwiqXopcH9nBmJmZu3TZgAk8/QzgSXAauDuiFglaa6k9Kd6qoFFyc692SigXtIfKezwvxcRDcm6a4D/LqmRwjmBn3V+OGZmlpX23F/3bpWVlVFfX9/T3TAz61MkLY+Iypbl/iawmVlOOQDMzHLKAWBmllMOADOznHIAmJnllAPAzCynHABmZjnlADAzyykHgJlZTjkAzMxyygFgZpZTDgAzs5xyAJiZ5ZQDwMwspxwAZmY55QAwM8spB4CZWU45AMzMcipTAEiaJGmNpEZJs1pZf5OkFcltraQ3kvIKSU9LWiXpeUnTUtsslPRyaruKUg3KzMza1mYASBoAzAc+DowGpksana4TEV+PiIqIqABuBu5JVv0d+GxEjAEmAT+QdFhq06ubt4uIFZ0dTEfU1PTEo5qZ9bwsRwBVQGNErIuI7cAiYPI+6k8H7gKIiLUR8WJy/y/AJmBo57pcWtdd19M9MDPrGVkCYDiwPrXclJTtRdIxQDnweCvrqoBBwEup4uuTqaGbJB1QpM0Zkuol1W/evDlDd83MLItSnwSuBhZHxM50oaRhwB3A5RGxKymeDZwMjAeOAK5prcGIWBARlRFROXRoaQ4eampAKtwK/SvcPB1kZnmSJQA2ACNSy2VJWWuqSaZ/mkk6FHgQ+GZEPNNcHhEbo+Bd4HYKU03doqYGIgq3Ql8KNweAmeVJlgBYBoyUVC5pEIWdfF3LSpJOBg4Hnk6VDQLuBX4REYtb1B+W/BUwBVjZwTGYmVkH7N9WhYjYIWkmsAQYANwWEaskzQXqI6I5DKqBRRHN76sBmAqcDRwp6bKk7LLkEz+/kjQUELACuKoE42m3OXN64lHNzHqe9txf926VlZVRX1/f090wM+tTJC2PiMqW5f4msJlZTjkAzMxyygFgZpZTDgAzs5xyAJiZ5ZQDwMwspxwAZmY55QAwM8spB4CZWU45AMzMcsoBYGaWUw4AM7OccgCYmeWUA8DMLKccAGZmOeUAMDPLKQeAmVlOOQDMzHIqUwBImiRpjaRGSbNaWX+TpBXJba2kN1LrLpX0YnK7NFU+TtILSZs/TH4c3szMukmbPwovaQAwHzgPaAKWSaqLiIbmOhHx9VT9rwCnJfePAOYAlUAAy5NtXwd+DFwBLAUeAiYBvyvRuMzMrA1ZjgCqgMaIWBcR24FFwOR91J8O3JXcvwB4JCJeS3b6jwCTJA0DDo2IZ6Lwq/S/AKZ0dBBmZtZ+WQJgOLA+tdyUlO1F0jFAOfB4G9sOT+5naXOGpHpJ9Zs3b87QXTMzy6LUJ4GrgcURsbNUDUbEgoiojIjKoUOHlqpZM7PcyxIAG4ARqeWypKw11bw//bOvbTck97O0aWZmXSBLACwDRkoqlzSIwk6+rmUlSScDhwNPp4qXAOdLOlzS4cD5wJKI2Ai8KemM5NM/nwXu7+RYSqqmpqd7YGbWtdoMgIjYAcyksDNfDdwdEaskzZV0capqNbAoOanbvO1rwHcohMgyYG5SBvAl4FagEXiJXvYJoOuu6+kemJl1LaX2171eZWVl1NfXd8tjSdCHnhozs6IkLY+Iypbl/iZwSk1NYcff/JW05vueDjKz/shHAEX4CMDM+gsfAZiZ2R4cAEXMmdPTPTAz61oOgCI8729m/Z0DwMwspxwAZmY55QAwM8spB4CZWU45AMzMcsoBYGaWUw4AM7OccgCYmeWUA8DMLKccAGZmOeUAMDPLKQeAmVlOOQDayReJM7P+IlMASJokaY2kRkmzitSZKqlB0ipJdyZl50hakbptkzQlWbdQ0supdRWlGlRX8m8Fm1l/sX9bFSQNAOYD5wFNwDJJdRHRkKozEpgNnBURr0s6CiAingAqkjpHUPgB+IdTzV8dEYtLNBYzM2uHLEcAVUBjRKyLiO3AImByizpXAPMj4nWAiNjUSjufAH4XEX/vTId7gn8r2Mz6oywBMBxYn1puSsrSTgROlPSUpGckTWqlnWrgrhZl10t6XtJNkg5o7cElzZBUL6l+8+bNGbpbejU1hd8Hbv6N4Ob7DgAz68tKdRJ4f2AkMBGYDvxU0mHNKyUNA04FlqS2mQ2cDIwHjgCuaa3hiFgQEZURUTl06NASddfMzLIEwAZgRGq5LClLawLqIuK9iHgZWEshEJpNBe6NiPeaCyJiYxS8C9xOYaqp1/NvBZtZf5ElAJYBIyWVSxpEYSqnrkWd+yi8+0fSEApTQutS66fTYvonOSpAkoApwMp2974HeNrHzPqLNj8FFBE7JM2kMH0zALgtIlZJmgvUR0Rdsu58SQ3ATgqf7tkCIOlYCkcQ/9mi6V9JGgoIWAFcVZohmZlZFormM5t9QGVlZdTX1/d0N8zM+hRJyyOismW5vwlsZpZTDgAzs5xyAJRIsZPDPmlsZr2VzwGUiPT+F8WylJuZdRefAzAzsz04ADqh2DWCJk70tYPMrPfzFFCJeArIzHorTwGZmdkeHAAlUuwaQb52kJn1Vp4CMjPr5zwF1Av5pLCZ9SQHQA/y7wubWU9yAJiZ5ZQDoJtl+X1hTw2ZWXfwSeAe5O8OmFl38ElgMzPbgwOgB6W/I+CpITPrbp4C6oU8NWRmpdSpKSBJkyStkdQoaVaROlMlNUhaJenOVPlOSSuSW12qvFzS0qTN2uQH560DfGRgZh3RZgBIGgDMBz4OjAamSxrdos5IYDZwVkSMAb6WWr01IiqS28Wp8huAmyLiBOB14POdGkk/0t6pofZ+n8A/XmNmkO0IoApojIh1EbEdWARMblHnCmB+RLwOEBGb9tWgJAHnAouTop8DU9rR736t5bx/xPtTP833s+ysi9UpFhjFytsbGL0xYErVp74Ukn2pr9ZDImKfN+ATwK2p5f8G/KhFnfuA/wCeAp4BJqXW7QDqk/IpSdkQCqHSXGcEsLLI489Itq8/+uijI8/g/ftz5jRHwZ63OXNar1+snd5QHrFnvztTXkx7+1Ss/fbWL6Yj42rvNvt6vnuT9j53pXyM7njs3gCoj9b2r60VRrQ7AB4A7gUGAuXAeuCwZN3w5O9xwCvA8e0JgPRt3Lhx3fFc9Vrt/Y+eJTD+6Z96PkhK2VZnnqPe3J/u6FNP6Ug/SxWG7X3srn6j0lX/Np0JgAnAktTybGB2izo/AS5PLT8GjG+lrYVJoAh4Fdi/tccodst7ABTTFUcG7Q2M9pa3fKF3xY64VKHXG462sm7Tmb52dTD0xjDsK28MOqtYAOyfYZZoGTBSUjmwAagGPtWizn3AdOB2SUOAE4F1kg4H/h4R7yblZwH/EREh6YkkDBYBlwL3Z+hLh0275emubL5Hjb6wjGm3NBUWhsHUnxTu3n3VBKb+pDDu1cC0W5q3mFDk+UiVF2kHYOr0zpevBsZcVEbDgyN212s+0T1k5N949cUPZi4ffeF6TvmXpk6P4de/LeM67d2f0ReuZ+pPmtpVv7X+rPxt+8Y7+sL1AO3eprW+Zvn3v/u6Cawetnf5yt+WpcbTtmL10+0Xey6K/lvupe3XcEee77YfuzTlxZ7rYvVrr5zQSt3OazMAImKHpJnAEmAAcFtErJI0l0Kq1CXrzpfUAOwEro6ILZLOBG6RtIvCCefvRURD0vQ1wCJJ84DngJ+VfHQ50Z7/nPD+jiVreVc55V+adve95Q66WZbylb8t4+6rJuyxDlr+hy5Nf7LU31d/muu0Z7wdfY7SWu4M2/McNTw4otU6xXb0xeqndeS5a2675bqWO/SOPt/FHrtY++0tL/Zcd+bfptNaOyzorTdPAbVPqQ7pu2M+tKcOuUt1sre3TAGlZelrV09vdUX7ne1TT5V35rnoLDp6DqA33RwA/VepwqRU/4FKdfKuVIHU0W1a0xU7q64499AdYdjbPjTgAHAAWCf0tk+49Lb+RHTNp8k6+46+Pf3c17q+ctTb3SfiiwWArwVkZkDhi2OtfXmsvdemKlZerP086u7nwpeDNrN9KrZDSl+aJIti9b3zf19veS4cAGa2T+0Nht6yc7O2OQDMrEO8o+/7HABmZjnlADAzyykHgJlZTjkAzMxyygFgZpZTDgAzs5xyAJiZ5ZQDwMwspxwAZmY55QAwM8spB4CZWU45AMzMcipTAEiaJGmNpEZJs4rUmSqpQdIqSXcmZRWSnk7Knpc0LVV/oaSXJa1IbhUlGZGZmWXS5o/CSxoAzAfOA5qAZZLq4v0fd0fSSGA2cFZEvC7pqGTV34HPRsSLkj4ELJe0JCLeSNZfHRGLSzgeMzPLKMsRQBXQGBHrImI7sAiY3KLOFcD8iHgdICI2JX/XRsSLyf2/AJuAoaXqvJmZdVyWABgOrE8tNyVlaScCJ0p6StIzkia1bERSFTAIeClVfH0yNXSTpAPa2XczM+uEUp0E3h8YCUwEpgM/lXRY80pJw4A7gMsjYldSPBs4GRgPHAFc01rDkmZIqpdUv3nz5hJ118zMsgTABmBEarksKUtrAuoi4r2IeBlYSyEQkHQo8CDwzYh4pnmDiNiY/GD9u8DtFKaa9hIRCyKiMiIqhw717JGZWalkCYBlwEhJ5ZIGAdVAXYs691F494+kIRSmhNYl9e8FftHyZG9yVIAkAVOAlR0ehZmZtVubnwKKiB2SZgJLgAHAbRGxStJcoD4i6pJ150tqAHZS+HTPFkmfAc4GjpR0WdLkZRGxAviVpKGAgBXAVaUdmpmZ7Ysioqf7kFllZWXU19f3dDfMzPoUScsjorJlub8JbGaWUw4AM7OccgCYmeWUA8DMLKccAGZmOeUAMDPLKQeAmVlOOQDMzHLKAWBmllMOADOznHIAmJnllAPAzCynHABmZjnlADAzyykHgJlZTjkAzMxyygFgZpZTDgAzs5xyAJiZ5VSmAJA0SdIaSY2SZhWpM1VSg6RVku5MlV8q6cXkdmmqfJykF5I2fyhJnR+OmZlltX9bFSQNAOYD5wFNwDJJdRHRkKozEpgNnBURr0s6Kik/ApgDVAIBLE+2fR34MXAFsBR4CJgE/K6UgzMzs+KyHAFUAY0RsS4itgOLgMkt6lwBzE927ETEpqT8AuCRiHgtWfcIMEnSMODQiHgmIgL4BTCl88MxM7Os2jwCAIYD61PLTcA/tqhzIoCkp4ABQE1E/O8i2w5Pbk2tlO9F0gxgRrL4tqQ1GfrcmiHAqx3ctq/ymPPBY+7/OjveY1orzBIAWewPjAQmAmXA7yWdWoqGI2IBsKCz7Uiqj4jKEnSpz/CY88Fj7v+6arxZpoA2ACNSy2VJWVoTUBcR70XEy8BaCoFQbNsNyf19tWlmZl0oSwAsA0ZKKpc0CKgG6lrUuY/Cu38kDaEwJbQOWAKcL+lwSYcD5wNLImIj8KakM5JP/3wWuL8E4zEzs4zanAKKiB2SZlLYmQ8AbouIVZLmAvURUcf7O/oGYCdwdURsAZD0HQohAjA3Il5L7n8JWAgcSOHTP139CaBOTyP1QR5zPnjM/V+XjFeFD+GYmVne+JvAZmY55QAwM8upXARAlktZ9HWSbpO0SdLKVNkRkh5JLsPxSHIivl+QNELSE6nLj/xrUt6fxzxY0rOS/piM+bqkvFzS0uT1XZt8WKNfkTRA0nOSHkiW+/WYJb2SXCpnhaT6pKzkr+1+HwCpS1l8HBgNTJc0umd71SUWUricRtos4LGIGAk8liz3FzuAf4uI0cAZwJeTf9f+POZ3gXMj4sNABYVv1Z8B3ADcFBEnAK8Dn++5LnaZfwVWp5bzMOZzIqIi9fn/kr+2+30AkO1SFn1eRPweeK1F8WTg58n9n9OPLrcRERsj4v8m99+isHMYTv8ec0TE28niwOQWwLnA4qS8X40ZQFIZcCFwa7Is+vmYiyj5azsPAVDschR58A/Jdy4A/gv4h57sTFeRdCxwGoULC/brMSdTISuATRSurfUS8EZE7Eiq9MfX9w+A/wHsSpaPpP+POYCHJS1PLocDXfDaLtWlIKyXi4iQ1O8+8yvpA8BvgK9FxJvpq4r3xzFHxE6gQtJhwL3AyT3bo64l6SJgU0QslzSxh7vTnT4SERuSKys/Iun/pVeW6rWdhyOALJey6K/+mlx5leTvpjbq9ymSBlLY+f8qIu5Jivv1mJtFxBvAE8AE4DBJzW/m+tvr+yzgYkmvUJi+PRf4X/TvMRMRG5K/mygEfRVd8NrOQwBkuZRFf1UHNP8Iz6X0o8ttJPPAPwNWR8T3U6v685iHJu/8kXQghd/oWE0hCD6RVOtXY46I2RFRFhHHUvi/+3hEfJp+PGZJB0s6pPk+hUvorKQLXtu5+CawpH+mMI/YfCmL63u2R6Un6S4K12MaAvyVwg/x3AfcDRwN/AmYmroUR58m6SPA/wFe4P254W9QOA/QX8c8lsLJvwEU3rzdHRFzJR1H4d3xEcBzwGci4t2e62nXSKaA/j0iLurPY07Gdm+yuD9wZ0RcL+lISvzazkUAmJnZ3vIwBWRmZq1wAJiZ5ZQDwMwspxwAZmY55QAwM8spB4CZWU45AMzMcur/A8pXBF4OW7+JAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.ylim([0.6,0.8])\n",
    "ax.plot(range(len(plaquette_hmc)), plaquette_hmc, marker='+', ls='', c='blue', label=\"HMC\")\n",
    "ax.hlines(0.646561,0,len(plaquette_hmc),label=\"expected\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "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
}
