{
 "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 12: chiral symmetry on a lattice"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8f82647",
   "metadata": {},
   "source": [
    "## Chiral symmetry in the continuum\n",
    "\n",
    "For the massless Euclidean continuum Dirac operator\n",
    "$$\n",
    "\\begin{align}\n",
    "D = \\gamma_\\mu D_\\mu\n",
    "\\end{align}\n",
    "$$\n",
    "we have\n",
    "$$\n",
    "\\begin{align}\n",
    "D \\gamma_5 + \\gamma_5 D = 0\n",
    "\\end{align}\n",
    "$$\n",
    "and therefore\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= \\exp\\left(i \\alpha \\gamma_5 \\right) \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha \\gamma_5 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "transforms the fermion Lagrangian\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar\\psi D \\psi\n",
    "\\end{align}\n",
    "$$\n",
    "to\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar\\psi \\exp\\left(i \\alpha \\gamma_5 \\right) D \\exp\\left(i \\alpha \\gamma_5 \\right) \\psi\n",
    "=\\bar\\psi \\exp\\left(i \\alpha \\gamma_5 \\right) \\exp\\left(-i \\alpha \\gamma_5 \\right)D \\psi\n",
    "=\\bar\\psi D \\psi\\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Therefore the transformation leaves the action invariant.\n",
    "\n",
    "If we added a mass term to the action it would\n",
    "break this symmetry.  We therefore also call the $m\\to 0$ limit\n",
    "the **chiral limit** of the theory.\n",
    "\n",
    "Consider now a theory with $N_f$ quark flavors described by Lagrangian\n",
    "$$\n",
    "\\begin{align}\n",
    "\\sum_f \\bar\\psi_f (D + m_f) \\psi_f \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "which we can write simply as\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar\\psi (D + M) \\psi\n",
    "\\end{align}\n",
    "$$\n",
    "by considering a mass matrix $M$ and the fields $\\psi$ to live\n",
    "in internal spin, color, and flavor space.\n",
    "\n",
    "We can then consider unitary rotations in flavor space\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= U_V \\psi = e^{i\\alpha_i T_i} \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi U_V^\\dagger = \\bar \\psi e^{-i\\alpha_i T_i}\n",
    "\\end{align}\n",
    "$$\n",
    "with $U_V\\in \\text{U}(N_f)$ and Hermitian generators $T_i$.\n",
    "In the massless case, this is a symmetry of the Lagrangian.\n",
    "In the massive case, a symmetry can be preserved if some masses are degenerate\n",
    "since then a sub-space of the algebra commutes with $M$.  \n",
    "\n",
    "In addition, chiral versions of this transformation also leave the\n",
    "massless theory invariant, i.e.,\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= U_A \\psi = e^{i\\alpha_i T_i \\gamma_5} \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\psi^\\dagger U_A^\\dagger \\gamma_3 = \\bar \\psi e^{i\\alpha_i T_i \\gamma_5} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The algebra of this transformation of $\\psi$ is just a direct product of $\\gamma_5$\n",
    "and the generators of U($N_f)$ such that the symmetry group is written as $U_A(N_f)$.\n",
    "\n",
    "The total flavor symmetry group for $N_f$ massless quarks is then\n",
    "$$\n",
    "\\begin{align}\n",
    "U_V(N_f) \\otimes U_A(N_f)\n",
    "\\end{align}\n",
    "$$\n",
    "where the $V$ and $A$ stand for **vector** and **axial vector** symmetry groups.\n",
    "\n",
    "This can be re-written as\n",
    "$$\n",
    "\\begin{align}\n",
    "U_V(N_f) \\otimes U_A(N_f) = U_V(1) \\otimes U_A(1) \\otimes SU_V(N_f) \\otimes SU_A(N_f)\n",
    "\\end{align}\n",
    "$$\n",
    "since the global $U(1)$ rotations require special attention.  The $U_V(1)$\n",
    "is responsible for the charge conservation as we will demonstrate below.  The $U_A(1)$\n",
    "is broken by the integration measure, i.e., it is a symmetry of the action but not\n",
    "of the quantized theory.  We also say the axial symmetry is **anomalous** and refer\n",
    "to it as the **axial anomaly** of QCD.  We demonstrate this explicitly below.\n",
    "\n",
    "While the mass terms break the $SU_V(N_f)$ and $SU_A(N_f)$ symmetries in general,\n",
    "in reality, the **up** and **down** quarks have almost the same mass ($\\approx 5$ MeV), leaving an approximate\n",
    "$SU_V(2)$ flavor symmetry of the theory.  To a much poorer degree, the three light\n",
    "quark flavors **up**, **down**, and **strange** ($\\approx 100$ MeV) are also approximately degenerate\n",
    "yielding a $SU_V(3)$ flavor symmetry of the theory.  This has to be understood with respect to typical\n",
    "QCD scales of several hundred MeV.\n",
    "Because of this QCD with realistic values for the quark masses has an approximate\n",
    "flavor SU(2) symmetry.\n",
    "\n",
    "It turns out, however, that $SU_A(2)$ is spontaneously broken, i.e., the vacuum state\n",
    "does not respect the symmetry.  The corresponding **order parameter** is the **chiral condensate**\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\bar\\psi \\psi \\rangle \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "By **Goldstone's theorem** we therefore expect\n",
    "massless **Nambu-Goldstone** (NG) bosons to exist in the theory.  Since the SU(2) flavor\n",
    "symmetry is only approximate, these bosons are also not exactly massless but only very\n",
    "light and are more appropriately referred to as **pseudo** NG bosons.  For SU(2) flavor,\n",
    "these are the three light pion states ($\\pi^\\pm, \\pi^0$).  These states have mass of $\\approx 140$ MeV\n",
    "and are therefore indeed much lighter than other mesons or the proton/neutron at $\\approx 1000$ MeV.\n",
    "\n",
    "Finally, we remark that by promoting the mass matrix $M$ in the above equation to a field that transforms non-trivially under flavor rotations, one can then construct an effective theory that captures the leading degree of chiral symmetry breaking.\n",
    "This theory is called **chiral perturbation theory** and in the SU(2) case is a theory of pions.  The details of this construction are beyond the scope of this chapter.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f00896d6",
   "metadata": {},
   "source": [
    "## Ginsparg-Wilson relation on the lattice\n",
    "\n",
    "**Nielsen-Ninomiya theorem**: Cannot have continuum chiral symmetry on the lattice\n",
    "and at the same time avoid fermion doublers.\n",
    "\n",
    "**Ginsparg-Wilson**: By studying renormalization group transformations find that the Ginsparg-Wilson (GW) relation\n",
    "$$\n",
    "\\begin{align}\n",
    "D \\gamma_5 + \\gamma_5 D = a D \\gamma_5 D\n",
    "\\end{align}\n",
    "$$\n",
    "is instead consistent with doubler-removal and allows to define an exact\n",
    "chiral symmetry also at finite lattice spacing $a$ through\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= \\exp\\left(i \\alpha \\gamma_5 \\left( \\mathbb{1} - \\frac{a}{2} D \\right) \\right) \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha \\left( \\mathbb{1} - \\frac{a}{2} D \\right) \\gamma_5 \\right) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "***Homework:*** Show that this transformation is a symmetry of the massless Lagrangian\n",
    "$\\bar\\psi D \\psi$ at non-zero $a$ if $D$ satisfies the Ginsparg-Wilson relation.\n",
    "\n",
    "While Wilson fermions do not satisfy this symmetry at finite $a$, we will study actions\n",
    "in this chapter that do."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d7e034e",
   "metadata": {},
   "source": [
    "## The spectrum of the Dirac operator\n",
    "\n",
    "We now study the right-eigenvalues $\\lambda$ of $D$, i.e., solutions\n",
    "to\n",
    "$$\n",
    "\\begin{align}\n",
    "D v_\\lambda = \\lambda v_\\lambda\n",
    "\\end{align}\n",
    "$$\n",
    "with $v_\\lambda^\\dagger v_\\lambda=1$ without loss of generality.\n",
    "\n",
    "If $(\\gamma_5 D)^\\dagger = \\gamma_5 D$, then\n",
    "the characteristic polynomial\n",
    "$$\n",
    "\\begin{align}\n",
    "P(\\lambda) &= \\det(D - \\lambda \\mathbb{1}) = \\det(\\gamma_5(D - \\lambda \\mathbb{1})\\gamma_5) =\n",
    "\\det(D^\\dagger - \\lambda \\mathbb{1}) \\\\\n",
    "&=\\det(D - \\lambda^* \\mathbb{1})^* = P(\\lambda^*)^* \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Therefore $\\gamma_5$-Hermiticity implies that if $\\lambda$ is an eigenvalue $(P(\\lambda)=0)$, then so is $\\lambda^*$.\n",
    "So eigenvalues come in complex pairs.\n",
    "\n",
    "Additionally, we find\n",
    "$$\n",
    "\\begin{align}\n",
    "\\lambda v_\\lambda^\\dagger \\gamma_5 v_\\lambda &=  v_\\lambda^\\dagger \\gamma_5 D v_\\lambda \n",
    "=v_\\lambda^\\dagger  D^\\dagger \\gamma_5 v_\\lambda = \n",
    "(Dv_\\lambda)^\\dagger  \\gamma_5 v_\\lambda = \\lambda^* v_\\lambda^\\dagger \\gamma_5 v_\\lambda \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "This can be re-expressed as\n",
    "$$\n",
    "\\begin{align}\n",
    "\\text{Im}(\\lambda) v_\\lambda^\\dagger \\gamma_5 v_\\lambda = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Therefore only real eigenvalues can have $v_\\lambda^\\dagger \\gamma_5 v_\\lambda\\neq 0$\n",
    "and all imaginary eigenvalues have $v_\\lambda^\\dagger \\gamma_5 v_\\lambda= 0$.\n",
    "\n",
    "\n",
    "Using $\\gamma_5$-Hermiticity we can re-write the GW relation\n",
    "as\n",
    "$$\n",
    "\\begin{align}\n",
    " D + D^\\dagger = a D^\\dagger D\n",
    "\\end{align}\n",
    "$$\n",
    "or alternatively\n",
    "$$\n",
    "\\begin{align}\n",
    " D^\\dagger + D = a D D^\\dagger \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "From this it follows that for such operators $[D,D^\\dagger]=0$, i.e., the operator is normal\n",
    "and its eigenvectors are orthogonal.\n",
    "\n",
    "In addition it follows that\n",
    "$$\n",
    "\\begin{align}\n",
    "(\\lambda + \\lambda^*) &= (\\lambda + \\lambda^*) v_\\lambda^\\dagger v_\\lambda = v_\\lambda^\\dagger (D + D^\\dagger) v_\\lambda = v_\\lambda^\\dagger a D^\\dagger D v_\\lambda \\\\\n",
    "&=a \\lambda \\lambda^* \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "If we write this explicitly in terms of real and imaginary parts $\\lambda=x + i y$, we find\n",
    "$$\n",
    "\\begin{align}\n",
    "2x = a (x^2 + y^2)\n",
    "\\end{align}\n",
    "$$\n",
    "or\n",
    "$$\n",
    "\\begin{align}\n",
    "\\left(x - \\frac1a \\right)^2 + y^2 = \\frac1{a^2} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The eigenvalues therefore live on a circle with center $1/a$ and radius $1/a$\n",
    "in the complex plane.  We refer to this as the **Ginsparg-Wilson** circle.\n",
    "\n",
    "This circle touches the real axis on two points, for $x=0$ and $x=2/a$.  In both\n",
    "cases $v_\\lambda^\\dagger \\gamma_5 v_\\lambda\\neq 0$ is possible.\n",
    "\n",
    "One conveniently parametrizes\n",
    "$$\n",
    "\\begin{align}\n",
    "\\lambda = \\frac1a(1- e^{i\\phi})\n",
    "\\end{align}\n",
    "$$\n",
    "such that\n",
    "$$\n",
    "\\begin{align}\n",
    "\\lambda^{-1} = \\frac{a}2 + i \\frac{a}2 \\frac{\\sin(\\phi)}{1- \\cos(\\phi)} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The eigenvalues of $D^{-1}$ therefore are all on a line parallel to the imaginary axis\n",
    "with distance $a/2$.\n",
    "\n",
    "Finally, we observe that for the **zero modes**\n",
    "$$\n",
    "\\begin{align}\n",
    "D v_0 = 0\n",
    "\\end{align}\n",
    "$$\n",
    "we have\n",
    "$$\n",
    "\\begin{align}\n",
    "\\gamma_5 D v_0 &= 0 \\,, \\\\\n",
    "D \\gamma_5 v_0 &= ( -\\gamma_5 D + a D \\gamma_5 D) v_0 = 0 \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "such that \n",
    "$$\n",
    "[\\gamma_5,D]v_0 = 0\n",
    "$$\n",
    "and therefore\n",
    "$v_0$ are also eigenstates of $\\gamma_5$ with\n",
    "$$\n",
    "\\begin{align}\n",
    "\\gamma_5 v_0 = \\pm v_0\n",
    "\\end{align}\n",
    "$$\n",
    "since $\\gamma_5^2=\\mathbb{1}$.  We call the $+1$ eigenvectors ($\\gamma_5 v_0 = v_0$)\n",
    "**right-handed** and the $-1$ eigenvectors ($\\gamma_5 v_0 = -v_0$) **left-handed**.\n",
    "\n",
    "\n",
    "\n",
    "In the following, we take a look at the eigenvalues of the free Wilson Dirac operator.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "468328d1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  828077.260959 s : Initializing gpt.random(evecs,vectorized_ranlux24_389_64) took 0.00035882 s\n"
     ]
    }
   ],
   "source": [
    "import gpt as g\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "grid = g.grid([8,8,8,16], g.double)\n",
    "\n",
    "U = g.qcd.gauge.unit(grid)\n",
    "\n",
    "w = g.qcd.fermion.wilson_clover(U, mass=0.0, csw_r=0.0, csw_t=0.0, nu=1.0, xi_0=1.0,\n",
    "                                isAnisotropic=False,\n",
    "                                boundary_phases=[1,1,1,-1])\n",
    "\n",
    "start = g.vspincolor(w.F_grid)\n",
    "rng = g.random(\"evecs\")\n",
    "rng.normal(start)\n",
    "\n",
    "g.default.set_verbose(\"arnoldi\", False)\n",
    "a = g.algorithms.eigen.arnoldi(Nmin=700, Nmax=1400, Nstep=100, Nstop=500, resid=1e-6, implicit_restart=True)\n",
    "\n",
    "evec, evals = a(w, start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "520a679d",
   "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": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim()\n",
    "ax.scatter([e.real for e in evals], [e.imag for e in evals], label=\"Wilson EV (m=0, U=1)\")\n",
    "\n",
    "ax.plot([1 - np.cos(phi) for phi in np.arange(0,2*np.pi,0.1)], \n",
    "           [np.sin(phi) for phi in np.arange(0,2*np.pi,0.1)], c=\"red\", label=\"GW circle\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17c91131",
   "metadata": {},
   "source": [
    "The Wilson operator has eigenvalues beyond the GW circle.  The corresponding eigenmodes\n",
    "are associated with chiral symmetry breaking, which can only be restored in the continuum\n",
    "for Wilson quarks.  We discuss lattice fermions that explicitly preserve chiral symmetry in the next lecture.\n",
    "\n",
    "***Homework:*** repeat this study for one of the quenched gauge configurations that we previously generated."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb44894f",
   "metadata": {},
   "source": [
    "## Topological charge\n",
    "\n",
    "The GW circle also allows for heavy real modes with\n",
    "$$\n",
    "\\begin{align}\n",
    "D v_0 = \\frac{2}{a} v_0\n",
    "\\end{align}\n",
    "$$\n",
    "for which we also have\n",
    "$$\n",
    "\\begin{align}\n",
    "\\gamma_5 D v_0 &= \\frac{2}{a} \\gamma_5 v_0 \\,, \\\\\n",
    "D \\gamma_5 v_0 &= (2 D \\gamma_5 - D \\gamma_5) v_0 = \n",
    "(2 D \\gamma_5 + \\gamma_5 D - a D \\gamma_5 D) v_0 = (2 D \\gamma_5 + \\gamma_5 \\frac{2}{a} - 2 D \\gamma_5) v_0 =  \\frac{2}{a} \\gamma_5 v_0 \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "such that again\n",
    "$$\n",
    "[D,\\gamma_5] v_0 = 0\n",
    "$$\n",
    "and therefore $v_0$ are also eigenstates of $\\gamma_5$ with\n",
    "$$\n",
    "\\begin{align}\n",
    "\\gamma_5 v_0 = \\pm v_0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "We therefore have both light and heavy chiral modes with heavy modes decoupling in the $a\\to 0$ limit.\n",
    "Interestingly, we can define the **topological charge**\n",
    "$$\n",
    "\\begin{align}\n",
    "Q &= \\frac{a}{2} \\text{Tr}[ \\gamma_5 D ] = \\sum_{n} \\frac{a}{2} v_{\\lambda_n}^\\dagger \\gamma_5 D v_{\\lambda_n} \\\\\n",
    "&=\\sum_{\\lambda_n = \\frac{2}{a}} v_{\\lambda_n}^\\dagger \\gamma_5 v_{\\lambda_n} = n^\\prime_+ - n^\\prime_-\n",
    "\\end{align}\n",
    "$$\n",
    "with $n^\\prime_\\pm$ counting the number of right (+) and left (-) chiral modes with $\\lambda=\\frac{2}{a}$.\n",
    "We used that $D$ is normal and that therefore the eigenvectors $v_\\lambda$ form a complete basis.\n",
    "Since $\\text{Tr} \\gamma_5 = 0$, we can also write\n",
    "$$\n",
    "\\begin{align}\n",
    "Q &= \\frac{a}{2} \\text{Tr}[ \\gamma_5 D ]= \\frac{a}{2} \\text{Tr}[ \\gamma_5 (D - 2/a) ] \\\\\n",
    "&=-\\sum_{\\lambda_n = 0} v_{\\lambda_n}^\\dagger \\gamma_5 v_{\\lambda_n} = n_- - n_+\n",
    "\\end{align}\n",
    "$$\n",
    "with $n_\\pm$ counting the number of right (+) and left (-) chiral modes with $\\lambda=0$.\n",
    "We find that $n_- - n_+ = n^\\prime_+ - n^\\prime_-$.\n",
    "\n",
    "We can also define the **topological charge density** $q(x)$ via\n",
    "$$\n",
    "\\begin{align}\n",
    "Q = a^4 \\sum_x q(x)\n",
    "\\end{align}\n",
    "$$\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    "q(x) = \\frac{1}{2a^3} \\text{Tr}_{\\text{spin,color}}[ \\gamma_5 D_{x,x} ] \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "This is a lattice version of the **Atiyah–Singer index theorem**, relating a property of the\n",
    "gauge field to the integer number $Q=n_- - n_+$.  In typical gauge configurations, one finds\n",
    "either $n_- \\neq 0 \\land n_+ = 0$ or $n_+ \\neq 0 \\land n_- = 0$.  One contribution to $Q$\n",
    "originates in field configurations describing local minima of the gauge action,\n",
    "called **instantons**.  A detailed description is beyond the scope of this chapter.\n",
    "\n",
    "In the continuum the Atiyah-Singer index theorem states\n",
    "$$\n",
    "\\begin{align}\n",
    "Q^{\\text{cont}} = \\frac1{32\\pi^2} \\varepsilon_{\\mu\\nu\\rho\\sigma} \\int dx \\text{Tr}_{\\text{color}}[ F_{\\mu\\nu}(x)F_{\\rho\\sigma}(x)] \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "We can also use a lattice definition of the field-strength tensor and compute a similar object\n",
    "on the lattice.  At finite lattice spacing, however, topology is not uniquely defined \n",
    "with ambiguities vanishing as $a\\to 0$.  In practice, one often performs continuous smoothing\n",
    "operations (c.f. Wilson flow) of the gauge fields that due to their continuous nature cannot\n",
    "change the topological charge, however, they can remove high-frequency modes and hasten convergence\n",
    "for $a\\to 0$.\n",
    "\n",
    "**Witten-Veneziano formula**: Witten and Veneziano showed that the\n",
    "topological susceptibility \n",
    "$$\n",
    "\\chi_Q = \\frac1{V} \\langle Q^2 \\rangle\n",
    "$$\n",
    "in quenched QCD is proportional to the squared mass of $\\eta^\\prime$ particle in the chiral limit of QCD.\n",
    "This provides an explanation for the relatively large $\\eta^\\prime$ mass that we will observe in a subsequent\n",
    "chapter."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77e5ce6c",
   "metadata": {},
   "source": [
    "## Axial anomaly on the lattice\n",
    "\n",
    "Let us now re-visit the field transformations that define the chiral symmetry on the lattice.\n",
    "If we consider such a transformation also with generator $T$ in flavor space,\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= \\exp\\left(i \\alpha \\gamma_5 T \\left( \\mathbb{1} - \\frac{a}{2} D \\right) \\right) \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha \\left( \\mathbb{1} - \\frac{a}{2} D \\right) \\gamma_5 T \\right) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "For infinitesimal $\\alpha$, the measure then transforms as\n",
    "$$\n",
    "\\begin{align}\n",
    "d\\psi d\\bar\\psi &= d\\psi' d\\bar\\psi' \\det\\left(\\mathbb{1} + i \\alpha \\gamma_5T \\left( \\mathbb{1} - \\frac{a}{2} D \\right)\\right) \\det\\left(\\mathbb{1} + i \\alpha  \\left( \\mathbb{1} - \\frac{a}{2} D \\right)\\gamma_5 T\\right) \\\\\n",
    "&= d\\psi' d\\bar\\psi' \\left(1 + i \\alpha \\text{Tr}\\gamma_5T \\left( \\mathbb{1} - \\frac{a}{2} D \\right)\\right) \n",
    "\\left(1 + i \\alpha  \\text{Tr}\\left( \\mathbb{1} - \\frac{a}{2} D \\right)\\gamma_5 T\\right) \\\\\n",
    "&= d\\psi' d\\bar\\psi' \\left(1 + i \\alpha \\text{Tr}\\left(\\gamma_5 T \\left( \\mathbb{1} - \\frac{a}{2} D \\right)+\\left( \\mathbb{1} - \\frac{a}{2} D \\right)\\gamma_5 T\\right) \\right) \\\\\n",
    "&= d\\psi' d\\bar\\psi' \\left(1 - i \\alpha a \\text{Tr}_{\\text{flavor}}[T] \\text{Tr}_{\\text{spin,color,spacetime}}(\\gamma_5 D)  \\right) \\\\\n",
    "&= d\\psi' d\\bar\\psi' \\left(1 - i \\alpha 2 \\text{Tr}_{\\text{flavor}}[T] Q  \\right) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "Therefore $SU_A(N_f)$ is a symmetry also of the quantized theory since its generators are traceless.\n",
    "$U(1)_A$ is anomalous, as already anticipated, i.e., it is only a symmetry of the action but not of\n",
    "the full quantized theory.  For this reason, only the three pions are light due to being pseudo-NG\n",
    "bosons of $SU_A(2)$ being spontaneously broken.  If $U(1)_A$ was not anomalous, one would expect also the $\\eta$ meson to be light.  We note that the anomaly is created by non-trivial topological gauge configurations with $Q \\neq 0$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a9cf564",
   "metadata": {},
   "source": [
    "## Chiral condensate\n",
    "\n",
    "As discussed above, the chiral condensate (in this sub-section in continuum notation)\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\bar\\psi \\psi \\rangle = -\\langle \\text{Tr} D^{-1} \\rangle\n",
    "\\end{align}\n",
    "$$\n",
    "is an order parameter of chiral symmetry breaking.  In the operator language\n",
    "it is already evident that the chiral condensate is real, however, we can\n",
    "also show this explicitly using $\\gamma_5$-Hermiticity,\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\bar\\psi \\psi \\rangle = -\\langle \\text{Tr} D^{-1} \\rangle \n",
    "= -\\langle \\text{Tr} \\gamma_5 \\gamma_5 D^{-1} \\rangle\n",
    "= -\\langle \\text{Tr} \\gamma_5 D^{-1}\\gamma_5  \\rangle\n",
    "= -\\langle \\text{Tr} (D^{-1})^\\dagger  \\rangle\n",
    "= - \\langle \\text{Tr} D^{-1} \\rangle^* = \\langle \\bar\\psi \\psi \\rangle^* \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "**Banks-Casher relation**: Banks and Casher showed that by first going to infinite volume\n",
    "and then going to zero quark mass, one finds\n",
    "$$\n",
    "\\begin{align}\n",
    "\\Sigma \\equiv -\\langle \\bar\\psi \\psi \\rangle = \\pi \\rho(0) \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "where $\\rho(\\lambda)$ is the eigenvalue density of $D$.\n",
    "\n",
    "As an exercise, we now compute the chiral condensate for domain-wall fermions,\n",
    "a type of GW fermion that we will discuss in detail at the end of this chapter.\n",
    "Domain-wall fermions satisfy the GW relation when taking a parameter $L_s\\to\\infty$.\n",
    "This limit is approached exponentially in $L_s$.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "4815844b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :   32286.519887 s : 0.05\n",
      "GPT :   32425.447545 s : 0.1\n",
      "GPT :   32513.509650 s : 0.15\n",
      "GPT :   32604.220338 s : 0.2\n",
      "GPT :   32659.508438 s : 0.05\n",
      "GPT :   32858.499714 s : 0.1\n",
      "GPT :   32985.510480 s : 0.15\n",
      "GPT :   33117.060066 s : 0.2\n"
     ]
    }
   ],
   "source": [
    "def chiral_condensate(conf, mass, Ls):\n",
    "    g.default.push_verbose(\"io\",False)\n",
    "    U = g.load(conf)\n",
    "    g.default.pop_verbose()\n",
    "    grid = U[0].grid \n",
    "    \n",
    "    w = g.qcd.fermion.mobius(U, M5=1.8, mass=mass, Ls=Ls, b=1.5, c=0.5, \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-6, \"maxiter\": 1000})\n",
    "    invD = w.propagator(inv.preconditioned(pc.eo1_ne(), cg))\n",
    "\n",
    "    src = g.mspincolor(grid)\n",
    "    g.create.point(src, [0,0,0,0])\n",
    "    dst2 = g(invD * src)\n",
    "    return g.trace(dst2[0,0,0,0]).real\n",
    "\n",
    "def average(x):\n",
    "    return np.mean(x), np.std(x) / len(x)**0.5\n",
    "\n",
    "masses = [0.05, 0.1, 0.15, 0.2]\n",
    "chiral_condensate_beta_5p9_Ls8 = []\n",
    "for m in masses:\n",
    "    g.message(m)\n",
    "    chiral_condensate_beta_5p9_Ls8.append(\n",
    "        average([chiral_condensate(f\"8c8_5.9/su3.{nr}\",m,8) for nr in range(100,300,40)])\n",
    "    )\n",
    "    \n",
    "chiral_condensate_beta_5p9_Ls12 = []\n",
    "for m in masses:\n",
    "    g.message(m)\n",
    "    chiral_condensate_beta_5p9_Ls12.append(\n",
    "        average([chiral_condensate(f\"8c8_5.9/su3.{nr}\",m,12) for nr in range(100,300,40)])\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "c9b96785",
   "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": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim()\n",
    "plt.xlabel(\"mass\")\n",
    "plt.ylabel(\"-<psibar psi> / V\")\n",
    "plt.xlim(0,0.25)\n",
    "plt.ylim(0,0.25)\n",
    "\n",
    "x = np.arange(0,0.2,0.01)\n",
    "\n",
    "ax.plot(x, [chiral_condensate_beta_5p9_Ls12[0][0] \n",
    "         + (chiral_condensate_beta_5p9_Ls12[2][0] \n",
    "            - chiral_condensate_beta_5p9_Ls12[0][0])*(xx-0.05)/0.1 for xx in x\n",
    "        ], \"g--\")\n",
    "\n",
    "ax.errorbar(masses, \n",
    "             [x[0] for x in chiral_condensate_beta_5p9_Ls8],\n",
    "             [x[1] for x in chiral_condensate_beta_5p9_Ls8], label=\"Ls=8\", c=\"blue\", marker=\"x\")\n",
    "ax.errorbar(masses, \n",
    "             [x[0] for x in chiral_condensate_beta_5p9_Ls12],\n",
    "             [x[1] for x in chiral_condensate_beta_5p9_Ls12], label=\"Ls=12\", c=\"red\")\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81143c75",
   "metadata": {},
   "source": [
    "We note that chiral symmetry is clearly broken in our gauge ensemble for $\\beta=5.9$\n",
    "as the vacuum expectation value of $\\langle \\bar\\psi \\psi \\rangle$ is not consistent \n",
    "with zero.  We extrapolate the GW fermion to the massless limit and find a non-vanishing condensate.\n",
    "So even in the absence of explicit chiral symmetry breaking due to the\n",
    "quark mass, the vacuum spontaneously breaks the symmetry."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5bc6e8ff",
   "metadata": {},
   "source": [
    "## Overlap fermion operator\n",
    "\n",
    "In this section we discuss the **overlap** fermion, defined by the Dirac matrix\n",
    "$$\n",
    "\\begin{align}\n",
    "D_{\\rm ov} = \\frac1a \\left(\\mathbb{1} + \\gamma_5 \\text{Sign}[H] \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "with a given Hermitian kernel operator $H$.  The $\\text{Sign}$ function applied to\n",
    "the Hermitian operator acts by replacing all its eigenvalues by their sign.  Since $H$ is Hermitian\n",
    "and therefore the operator is diagonalizable with eigenvalues are real, this is a well-defined procedure.\n",
    "It is straightforward to show that any operator of this form satisfies the GW\n",
    "relation since\n",
    "$$\n",
    "\\begin{align}\n",
    "a D_{\\rm ov} \\gamma_5 D_{\\rm ov} &= \\frac1a  \\left(\\mathbb{1} + \\gamma_5 \\text{Sign}[H] \\right) \\gamma_5 \n",
    " \\left(\\mathbb{1} + \\gamma_5 \\text{Sign}[H] \\right) \\\\\n",
    " &= \\frac1a  \\left(\\gamma_5 + \\gamma_5 \\text{Sign}[H] \\gamma_5 + \\text{Sign}[H] + \\gamma_5 \\text{Sign}[H]^2 \\right) \\\\\n",
    " &= \\frac1a  \\left(2\\gamma_5 + \\gamma_5 \\text{Sign}[H] \\gamma_5 + \\text{Sign}[H]  \\right) \\\\\n",
    " &= D_{\\rm ov} \\gamma_5 + \\gamma_5 D_{\\rm ov} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "In practice one often uses $H = \\gamma_5 D_{\\rm wilson}(m=-M_5)$, where the negative mass parameter is also\n",
    "often expressed as $M_5=1+s$.  This overlap operator is then explicitly gauge covariant and\n",
    "chirally symmetric in addition to having no fermion doublers.  It is important to note that the mass $M_5$\n",
    "does not correspond to the mass of the resulting fermion.  The overlap operator $D_{\\rm ov}$ corresponds to a **massless** quark for any $M_5$.\n",
    "\n",
    "The fermion operators we have studied so far were all **ultralocal**, i.e., they only coupled a small finite number\n",
    "of spatially separated lattice sites to each other.  Concretely, the Wilson fermions only include nearest-neighbor\n",
    "connections through the covariant shift operators.\n",
    "\n",
    "Due to the sign function the locality properties of the overlap operator are less clear.  [One can show](https://arxiv.org/pdf/hep-lat/9808010.pdf), however,\n",
    "that the operator is still local in the sense\n",
    "$$\n",
    "\\begin{align}\n",
    "\\vert (D_{\\rm ov})_{x,y} \\vert \\leq \\kappa  e^{-\\gamma \\vert x - y \\vert } \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "where both $\\kappa$ and $\\gamma$ are functions of the chosen kernel $H$ and in particular of $M_5$ in the standard choice given above.  It is important to note that this bound is fixed in lattice units, i.e., the non-locality vanishes in the continuum limit."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1666ef1b",
   "metadata": {},
   "source": [
    "Finally a note is in order how to evaluate the sign function.  As a first step, we re-write the sign function as\n",
    "$$\n",
    "\\begin{align}\n",
    "\\text{Sign}[H] = \\frac{H}{\\vert H \\vert} = \\frac{H}{\\sqrt{H^2}} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Since the operators in the numerator and denominator commute, we do not write them in a particular order.\n",
    "\n",
    "The challenging task is therefore to apply\n",
    "$$\n",
    "(X)^{-1/2}\n",
    "$$\n",
    "for a positive-definite Hermitian $X$ to a given vector.\n",
    "\n",
    "To this end, let us first study the spectrum of $X$.  We pick $M_5=1.8$ for concreteness, which is a popular choice."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "55e7ed3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "grid = g.grid([8,8,8,16], g.double)\n",
    "\n",
    "U = g.qcd.gauge.unit(grid)\n",
    "\n",
    "w = g.qcd.fermion.wilson_clover(U, mass=-1.8, csw_r=0.0, csw_t=0.0, nu=1.0, xi_0=1.0,\n",
    "                                isAnisotropic=False,\n",
    "                                boundary_phases=[1,1,1,-1])\n",
    "\n",
    "def H2(dst, src):\n",
    "    dst @= g.gamma[5] * w * g.gamma[5] * w * src\n",
    "\n",
    "g.default.set_verbose(\"arnoldi\", False)\n",
    "a = g.algorithms.eigen.arnoldi(Nmin=700, Nmax=1400, Nstep=100, Nstop=500, resid=1e-6, implicit_restart=True)\n",
    "\n",
    "evecH2, evalsH2 = a(H2, start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "24023775",
   "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": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim()\n",
    "plt.xlabel(\"number of eigenmode\")\n",
    "plt.ylabel(\"eigenvalue of H^2\")\n",
    "ax.plot(list(range(len(evalsH2))), sorted([e.real for e in evalsH2]))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "6c03595e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  828657.505389 s : [0.07074355135481224, 0.07074355135481682, 0.0707435513548206, 0.07074355135482324, 0.07074355135484864, 0.08611532703223132, 0.08611532703225581, 0.08611532703225734, 0.08611532703226288, 0.08611532703228077]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEKCAYAAADuEgmxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAew0lEQVR4nO3deZRcdZ3+8feTjZAVQhZCEvZACBAgxAADIptMQLYRjxJlUfmJqLgxzhwcFRXUc8CRGXFQBEUQkUVHMYFEQBZ1UDAhZA8hTdiykAQCWQgJWT6/P+4tKIqu6pvuvrV0P69z+nTdpW49dVOpT9/7/d7vVURgZmaWRZdaBzAzs8bhomFmZpm5aJiZWWYuGmZmlpmLhpmZZeaiYWZmmeVWNCTdJGmlpLlllkvStZKaJM2WNDavLGZm1j7yPNK4GZhQYfkpwMj05yLgJzlmMTOzdpBb0YiIvwCrK6xyJvDLSDwG7CRpaF55zMys7brV8LWHAS8WTS9J5y0vXVHSRSRHI/Tu3fvwUaNGVSWgmVlH8cQTT7wcEYPaup1aFo3MIuIG4AaAcePGxfTp02ucyMyssUh6vj22U8veU0uBEUXTw9N5ZmZWp2pZNCYB56e9qI4E1kTEu05NmZlZ/cjt9JSk24HjgIGSlgDfBLoDRMT1wBTgVKAJ2AB8Iq8sZmbWPnIrGhExsYXlAXwur9c3M7P25yvCzcwsMxcNMzPLzEXDzMwyc9EwM7PMXDTMzCwzFw0zM8vMRcPMzDJz0TAzs8xcNMzMLDMXDTMzy8xFw8zMMnPRMDOzzFw0zMwsMxcNMzPLzEXDzMwyc9EwM7PMXDTMzCwzFw0zM8vMRcPMzDJz0TAzs8xcNMzMLDMXDTMzy8xFw8zMMnPRMDOzzFw0zMwsMxcNMzPLzEXDzMwyc9EwM7PMXDTMzCwzFw0zM8vMRcPMzDJz0TAzs8xcNMzMLDMXDTMzy8xFw8zMMsu1aEiaIGmhpCZJlzWzfHdJD0t6UtJsSafmmcfMzNomt6IhqStwHXAKMBqYKGl0yWpfB+6KiMOAc4Af55XHzMzaLs8jjfFAU0Qsjog3gTuAM0vWCaBf+rg/sCzHPGZm1kZ5Fo1hwItF00vSecW+BZwraQkwBfh8cxuSdJGk6ZKmr1q1Ko+sZmaWQa0bwicCN0fEcOBU4FZJ78oUETdExLiIGDdo0KCqhzQzs0SeRWMpMKJoeng6r9iFwF0AEfF3oCcwMMdMZmbWBnkWjWnASEl7SepB0tA9qWSdF4ATASQdQFI0fP7JzKxO5VY0ImILcAlwH7CApJfUPElXSDojXe1fgU9JmgXcDnw8IiKvTGZm1jbd8tx4REwhaeAunnd50eP5wNF5ZjAzs/ZT64ZwMzNrIC4aZmaWmYuGmZll5qJhZmaZuWiYmVlmLhpmZpaZi4aZmWXmomFmZpm5aJiZWWYuGmZmlpmLhpmZZeaiYWZmmblomJlZZi4aZmaWmYuGmZllVrFoSBol6URJfUrmT8g3lpmZ1aOyRUPSF4A/AJ8H5ko6s2jx9/IOZmZm9afSnfs+BRweEesl7Qn8VtKeEfFDQFVJZ2ZmdaVS0egSEesBIuI5SceRFI49cNEwM+uUKrVprJB0aGEiLSCnAQOBg3POZWZmdahS0TgfeKl4RkRsiYjzgWNzTWVmZnWp7OmpiFhSYdmj+cQxM7N61uJ1GpK+VYUcZmbWACp1ue0i6efADlXMY2ZmdazSkcY9wOqI+Gq1wpiZWX2rVDQOB35XrSBmZlb/KhWN44EbJB1RrTBmZlbfyhaNiJgP/DPw/erFMTOzelax91RELAM+UKUsZmZW51rschsR66oRxMzM6l/Zi/skTQai3PKIOCOXRGZmVrcqDVj4n+lvATcC/y//OGZmVs8qDSPy58JjSeuLp83MrHPKervXsqepzMys86g0jMiAwg/QVdLOJfNaJGmCpIWSmiRdVmadD0uaL2mepF+38n2YmVkVVGrTeILkCKNww6UZRcsC2LvShiV1Ba4D3g8sAaZJmpRe/1FYZyTwVeDoiHhV0uDtfwtmZlYtldo09mrjtscDTRGxGEDSHcCZwPyidT4FXBcRr6avubKNr2lmZjnK2qbRGsOAF4uml6Tziu0H7CfpUUmPSZrQ3IYkXSRpuqTpq1atyimumZm1JM+ikUU3YCRwHDARuFHSTqUrRcQNETEuIsYNGjSougnNzOwtlRrC23p6aikwomh6eDqv2BJgUkRsjohngadJioiZmdWhSkcavwWQ9GArtz0NGClpL0k9gHOASSXr3E1ylIGkgSSnqxa38vXMzCxnlXpPdZH0HyRtDpeWLoyIayptOCK2SLoEuA/oCtwUEfMkXQFMj4hJ6bKTJc0HtgL/FhGvtPbNmJlZvioVjXOAs9J1+rZm4xExBZhSMu/yoscBXJr+mJlZnavU5XYhcJWk2RExtYqZzMysTmXpPfU3SdcUurxK+oGk/rknMzOzupOlaNwErAM+nP6sBX6RZygzM6tPldo0CvaJiLOLpr8taWZOeczMrI5lOdJ4Q9IxhQlJRwNv5BfJzMzqVZYjjYuBXxa1Y7wKXJBfJDMzK4gIlr72BlEnN6hosWhExCzgEEn90um1uacyMzO2bQsuunU6f1pQP2O5ZjnSAFwszMyq7YcPLuJPC1by6fftzb6D+rRpWx++qn0yZS4aZmZWPQ8vXMm1Dy3i7LHDuWzCKCS1/KQqqPUot2ZmVuLF1Rv40h0zGbVrP75z1kF1UzAgQ9GQ1EvSNyTdmE6PlHRa/tHMzDqfjZu38pnbnmBbBNefO5Yde3StdaR3yHKk8QtgE3BUOr0U+E5uiczMOrFv/mEec5eu5b8/cih77NK71nHeJUvR2CcirgY2A0TEBt6+b7iZmbWTO6e9wJ3TX+SS4/flxAOG1DpOs7IUjTcl7QgEgKR9SI48zMysncxZsoZv/GEe7x05kC+/f79axykrS++pbwJ/BEZIug04Gvh4nqHMzDqTV19/k8/c9gQDe/fgh+ccRtcu9XsyJ8vFfQ9ImgEcSXJa6osR8XLuyczMOoGt24Iv3TmTlWs3cdfFRzGgd49aR6qoxaIh6dj04br092hJRMRf8otlZtY5XPvgIv789Cq+c9ZBHDpip1rHaVGW01P/VvS4JzAeeAI4IZdEZmadROECvg+OHcbHjti91nEyyXJ66vTiaUkjgP/OK5CZWWdQuIBv/yF9+e5ZB9fVBXyVtOaK8CXAAe0dxMyssyi+gO+n5x1edxfwVZKlTeNHpN1tSYrMocCMHDOZmXVohQv4fnb+uLq8gK+SLG0a04sebwFuj4hHc8pjZtahFS7g+9zx+3DS6Pq8gK+SLG0at1QjiJlZR1e4gO+YfQdy6fv3r3WcVilbNCTN4e3TUu9YBEREjMktlZlZB/PahuIL+A6t6wv4Kql0pOGRbM3M2sG29AK+FWs3ctenj2KXPjvUOlKrlS0aEfF8NYOYmXVU1z60iEcWruLKsw7isN13rnWcNslyP40jJU2TtF7Sm5K2SvKtX83MMnhk4Up++OAiPnjYMM5tkAv4KsnSe+p/gHOA3wDjgPOB+h2C0cwa3rxla/j14y+wrblW1QYzZc7y5AK+f2mcC/gqyXSP8IhoktQ1IrYCv5D0JPDVfKOZWWe0actWPvOrGaxct5G+PbvXOk6bDe3fk+vPbawL+CrJUjQ2SOoBzJR0NbAc31vczHLyi0ef44XVG7j1wvG8d+SgWsexElm+/M9L17sEeB0YAZydZygz65xWrdvE/zzUxEkHDHbBqFNZjjQOB+6NiLXAt3POY2ad2DUPLGTj5q38x6ke3q5eZTnSOB14WtKtkk6TlKkdxMxse8xbtoY7pr3IBf+0J3sP6lPrOFZGi0UjIj4B7EvSe2oi8Iykn+UdzMw6j4jgynvms9OO3fnCCSNrHccqyNSgHRGbganAHSQ3YDorx0xm1sncN28Fjy1ezaUn70//Xo3fY6ojy3Jx3ymSbgYWkTSA/wzYNcvGJU2QtFBSk6TLKqx3tqSQNC5jbjPrIDZt2cr3pixgvyF9mPieEbWOYy3I0j5xPnAn8OmI2JR1w5K6AtcB7ye5cdM0SZMiYn7Jen2BLwKPZ05tZh3GzUVdbLt1dW/+epelTWNiRNy9PQUjNR5oiojFEfEmyamtM5tZ70rgKmDjdm7fzBrcqnWb+NFDTZw4yl1sG0WW01MflLRI0hpJayWtyzj21DDgxaLpJem84m2PBUZExL0tZLhI0nRJ01etWpXhpc2sEVzzwNNJF9sPuItto8hyLHg1cEZE9I+IfhHRNyL6tfWFJXUBrgH+taV1I+KGiBgXEeMGDfJfI2Ydwfxla7lz2gucf9Se7OMutg0jS9FYERELWrHtpSRXjxcMT+cV9AUOAh6R9BxwJDDJjeFmHV9EcMU98+i/Y3e+eKK72DaSTPcIl3QncDfwVrtGRPyuhedNA0ZK2oukWJwDfLTo+WuAgYVpSY8AX4mI6ZhZh3b//KSL7ZVnHugutg0mS9HoB2wATi6aF0DFohERWyRdAtwHdAVuioh5kq4ApkfEpFZmNrMGVuhiO3JwHyaOb/z7S3Q2LRaN9IrwVomIKcCUknmXl1n3uNa+jpk1jlv+9hzPv7KBX37SXWwbUZbeU/tJelDS3HR6jKSv5x/NzDqal9dv4kcPNnHCqMEcu587tTSiLGX+RpIbLm0GiIjZJO0TZmbb5Qf3P80bHsW2oWUpGr0i4h8l87bkEcbMOq5CF9vzjtqDfQe7i22jylI0Xpa0D0njN5I+RHL3PjOzTAqj2PbbsTtfOnG/WsexNsjSe+pzwA3AKElLgWeBc3NNZWYdygPzV/D3xa9whbvYNrwsvacWAydJ6g10iYh1+ccys45i05atfDftYvtRd7FteC0WDUmXlkwDrAGeiIiZ+cQys46i0MX2Fnex7RCy/AuOAy4mGWxwGPBpYAJwo6R/zzGbmTW4Qhfb4/cfxPvcxbZDyNKmMRwYGxHrASR9E7gXOJbkLn5X5xfPzBrZNQ8kXWy/9oHRtY5i7STLkcZgisacIrleY0hEvFEy38zsLQuWr+WOf7iLbUeT5UjjNuBxSX9Ip08Hfp02jM8v/zQz66wigu/cm3Sx9Si2HUuW3lNXSpoKHJ3OurhoJNqP5ZbMzBrWnxas5NGmV/j2GQeyU68etY5j7ahs0ZDULyLWShoALE5/CssGRMTqagQ0awQRwePPrmbj5q21jlIXvnvvfPYd3IePHuEuth1NpSONXwOnkTR2B6CS33vnns6sQdw37yUu/tWMWseoGxLc/InxdHcX2w6nbNGIiNPS33tVL45ZY7r7yWUM7LMDPz3vcJJLmTq3XXr3YI9detc6huUgy8V9Imm72Ctt39gd2LWZQQzNOqV1Gzfz0MKVfHT87hy+x861jmOWqyzHjj8GjuLtW7WuA67LLZFZg3lg/gre3LKN0w/ZrdZRzHKXpcvtERExVtKTABHxqiR3hzBLTZ61jGE77cjY3XeqdRSz3GU50tgsqStvD40+CNiWayqzBvHq62/y10Uvc9ohQwvjspl1aFmKxrXA74HBkr4L/B/wvVxTmTWIqXNfYsu24PQxPjVlnUOWi/tuk/QEcCJJd9uzImJB7snMGsDkWcvYe2BvDtytX62jmFVFljYNIuIp4Kmcs5g1lJVrN/LYs6/w+RNG+tSUdRq+8sasle6ds5wIOOOQobWOYlY1LhpmrTR51jIOGNqPfQf3rXUUs6px0TBrhRdXb2DGC69xuo8yrJNx0TBrhXtmLwdwrynrdFw0zFph8qxlHDpiJ0YM6FXrKGZV5aJhtp2aVq5n/vK1HjbEOiUXDbPtdM/sZUhw2hi3Z1jn46Jhth0igsmzlnHEXgMY0q9nreOYVZ2Lhtl2mL98Lc+set2npqzTctEw2w6TZy2naxdxykE+NWWdk4uGWUaFU1PH7DuQAb19dwDrnFw0zDJ68sXXWPraGz41ZZ1arkVD0gRJCyU1SbqsmeWXSpovabakByXtkWces7aYPGsZPbp14eQDh9Q6ilnN5FY00hs3XQecAowGJkoaXbLak8C4iBgD/Ba4Oq88Zm2xdVtwz+zlHL//IPr17F7rOGY1k+eRxnigKSIWR8SbwB3AmcUrRMTDEbEhnXwMGJ5jHrNWe/zZV1i1bpNPTVmnl2fRGAa8WDS9JJ1XzoXA1OYWSLpI0nRJ01etWtWOEc2ymTxrOb16dOWEUYNrHcWspuqiIVzSucA44PvNLY+IGyJiXESMGzRoUHXDWae3ees2ps5dzkkHDKFXj0z3LTPrsPL8H7AUGFE0PTyd9w6STgK+BrwvIjblmMesVf6v6WVe27DZp6bMyPdIYxowUtJeknoA5wCTileQdBjwU+CMiFiZYxazVps8axn9enbj2P0G1jqKWc3lVjQiYgtwCXAfsAC4KyLmSbpC0hnpat8H+gC/kTRT0qQymzOriY2bt3L/vBVMOGhXdujWtdZxzGou1xO0ETEFmFIy7/Kixyfl+fpmbfXIwpWs37TFp6bMUnXREG5WrybPWs4uvXtw1N671DqKWV1w0TArY/2mLTz41ApOPXgo3br6v4oZuGiYlfXgghVs3LzNp6bMirhomJUxedYyhvbvybg9dq51FLO64aJh1ozXNrzJn59exWljhtKli2odx6xuuGiYNeO+eS+xeWv41JRZCRcNs2ZMnrWcPXbpxcHD+tc6illdcdEwK7Fq3Sb+9szLnD5mNySfmjIr5qJhVmLq3OVsC3xqyqwZLhpmJSbNXMb+Q/qy/659ax3FrO64aJgVWfraG0x//lVOP2RoraOY1SUXDbMi985eBsBpY3xqyqw5LhpmRSbPWs6Y4f3Zc2DvWkcxq0suGmapZ19+nTlL13C6jzLMynLRMEvdMys5NfWBMW7PMCvHRcMMiAgmzVrG+D0HsNtOO9Y6jlndctEwAxauWMeilevda8qsBS4aZiQj2nYRnHKwi4ZZJbne7tXqz+ubtjBv2VrmLF3DvGVr2LBpa60j1YV/PLeao/cdyMA+O9Q6illdc9HowNZv2sK8pWuYs3QNc9Pfi19+nYhk+eC+O7Bzrx61DVknBvfdgQuP2avWMczqnotGB9FSgdi1X08OGtafMw4ZxsHD+3HQsP4M7tuztqHNrOE0XNFY88Zm7p29vNYxai4IXlqzkTlpgXi2TIEYM7w/Bw3rz6C+Pu1iZm3XcEXjhdUb+NyvZ9Q6Rt3YtV9PDh7en7MOHcbBw1wgzCxfDVc0Rg7uy+++fGytY9SFnXv1cIEws6pquKLRs3sX9hviIavNzGrB12mYmVlmLhpmZpaZi4aZmWXmomFmZpm5aJiZWWYuGmZmlpmLhpmZZeaiYWZmmblomJlZZi4aZmaWWa5FQ9IESQslNUm6rJnlO0i6M13+uKQ988xjZmZtk1vRkNQVuA44BRgNTJQ0umS1C4FXI2Jf4L+Aq/LKY2ZmbZfnkcZ4oCkiFkfEm8AdwJkl65wJ3JI+/i1woiTlmMnMzNogz1FuhwEvFk0vAY4ot05EbJG0BtgFeLl4JUkXARelk5skzc0lcfsaSMn7qFPO2X4aISM4Z3trlJz7t8dGGmJo9Ii4AbgBQNL0iBhX40gtcs721Qg5GyEjOGd7a6Sc7bGdPE9PLQVGFE0PT+c1u46kbkB/4JUcM5mZWRvkWTSmASMl7SWpB3AOMKlknUnABenjDwEPRRTudG1mZvUmt9NTaRvFJcB9QFfgpoiYJ+kKYHpETAJ+DtwqqQlYTVJYWnJDXpnbmXO2r0bI2QgZwTnbW6fKKf9hb2ZmWfmKcDMzy8xFw8zMMqvbotEIQ5BIGiHpYUnzJc2T9MVm1jlO0hpJM9Ofy6udM83xnKQ5aYZ3db1T4tp0f86WNLbK+fYv2kczJa2V9KWSdWq2LyXdJGll8TVCkgZIekDSovT3zmWee0G6ziJJFzS3To4Zvy/pqfTf9PeSdirz3Iqfjyrk/JakpUX/tqeWeW7F74Uq5LyzKONzkmaWeW4192ez30O5fT4jou5+SBrOnwH2BnoAs4DRJet8Frg+fXwOcGcNcg4FxqaP+wJPN5PzOOCeOtinzwEDKyw/FZgKCDgSeLzG//4vAXvUy74EjgXGAnOL5l0NXJY+vgy4qpnnDQAWp793Th/vXMWMJwPd0sdXNZcxy+ejCjm/BXwlw+ei4vdC3jlLlv8AuLwO9mez30N5fT7r9UijIYYgiYjlETEjfbwOWEBylXsjOhP4ZSQeA3aSNLRGWU4EnomI52v0+u8SEX8h6eFXrPgzeAtwVjNP/WfggYhYHRGvAg8AE6qVMSLuj4gt6eRjJNdL1VSZfZlFlu+FdlMpZ/pd82Hg9rxeP6sK30O5fD7rtWg0NwRJ6ZfxO4YgAQpDkNREenrsMODxZhYfJWmWpKmSDqxusrcEcL+kJ5QMy1Iqyz6vlnMo/5+xHvZlwZCIWJ4+fgkY0sw69bRfP0lyNNmclj4f1XBJehrtpjKnUuppX74XWBERi8osr8n+LPkeyuXzWa9Fo6FI6gP8L/CliFhbsngGyWmWQ4AfAXdXOV7BMRExlmTU4c9JOrZGOSpSciHoGcBvmllcL/vyXSI51q/b/uuSvgZsAW4rs0qtPx8/AfYBDgWWk5z6qWcTqXyUUfX9Wel7qD0/n/VaNBpmCBJJ3Un+oW6LiN+VLo+ItRGxPn08BeguaWCVYxIRS9PfK4HfkxzqF8uyz6vhFGBGRKwoXVAv+7LIisIpvPT3ymbWqfl+lfRx4DTgY+mXx7tk+HzkKiJWRMTWiNgG3Fjm9Wu+L+Gt75sPAneWW6fa+7PM91Aun896LRoNMQRJel7z58CCiLimzDq7FtpaJI0n2edVLW6SekvqW3hM0jhaOlLwJOB8JY4E1hQd2lZT2b/g6mFflij+DF4A/KGZde4DTpa0c3rK5eR0XlVImgD8O3BGRGwos06Wz0euStrP/qXM62f5XqiGk4CnImJJcwurvT8rfA/l8/msRut+K3sEnErSC+AZ4GvpvCtIPvwAPUlOYTQB/wD2rkHGY0gO+WYDM9OfU4GLgYvTdS4B5pH09HgM+Kca5Nw7ff1ZaZbC/izOKZKbZj0DzAHG1SBnb5Ii0L9oXl3sS5JCthzYTHLe90KSNrQHgUXAn4AB6brjgJ8VPfeT6ee0CfhElTM2kZyzLnw+Cz0OdwOmVPp8VDnnrennbjbJl93Q0pzp9Lu+F6qZM51/c+EzWbRuLfdnue+hXD6fHkbEzMwyq9fTU2ZmVodcNMzMLDMXDTMzy8xFw8zMMnPRMDOzzFw0rMOQ9IikcVV4nS9IWiCp3NXVpevvJum3eedqCyUjCN9T6xxW/3K73atZI5HULd4e2K8lnwVOijIXd5WKiGUkF6CaNTwfaVhVSdoz/Sv9xnTs//sl7Zgue+tIQdJASc+ljz8u6e70ngDPSbpE0qWSnpT0mKQBRS9xXnoPg7npVeOFK3RvkvSP9DlnFm13kqSHSC6CKs16abqduUrv7SHpepKLt6ZK+nLJ+l2V3L9iWjrw3qeL3vPc9HEvSXcpuffB75XcC6bwnk+W9HdJMyT9Jh1LqHBvhm+n8+dIGpXO/5akWyT9VdLzkj4o6ep0nT+mQ0sg6cT0fc9J98MO6fwJSu61MYNkWIzC+2h2f5mBi4bVxkjguog4EHgNODvDcw4i+WJ7D/BdYENEHAb8HTi/aL1eEXEoydHATem8r5EMMzMeOB74fjq8AyT3S/hQRLyv+MUkHQ58AjiC5P4in5J0WERcDCwDjo+I/yrJeCHJ8CvvSXN+StJeJet8Fng1IkYD3wAOT19vIPB1kiOYscB04NKi572czv8J8JWi+fsAJ5AM8vgr4OGIOBh4A/iApJ4kVzB/JJ3fDfhMOv9G4PQ0w65F26y0v6yTc9GwWng2Imamj58A9szwnIcjYl1ErCIZBn9yOn9OyfNvh7fuhdBPyZ3qTgYuU3KXtUdIhqDZPV3/gYho7p4JxwC/j4jXIxkk8Xckw2FXcjLJ+F0zSYam3oWkQJZu944041ySoR8gKUyjgUfT518A7FH0vMIgdKX7a2pEbCbZD12BP6bzC/tlf5L9/XQ6/xaSmwuNSucvimRYiF+VvI9y+8s6ObdpWC1sKnq8FdgxfbyFt/+Q6VnhOduKprfxzs9x6bg4QTKu1tkRsbB4gaQjgNe3K3llAj4fEe8Y8E3ZbkUskgI2sczywvvdyjvf7yaAiNgmaXO8PS5Q6X7ZHs3uLzPwkYbVl+dIT9fQ+objjwBIOobkVNEaklE7P5+OBoqkwzJs56/AWWkbRG+SkVf/2sJz7iM59VNoS9ivmdM6j5Lc8Q1Jo4GD0/mPAUdL2jdd1lvSfhlytmQhsGdhu8B5wJ+Bp9L5+6Tzi4tVa/aXdRIuGlZP/pPkS/dJoLX3ydiYPv96kjYGgCuB7sBsSfPS6YoiuX3mzSQjKD9OMiroky087WfAfGBG2vD9U9791/6PgUGS5gPfIRkFdU162u3jwO2SZpO01YxqKWeG97GRpG3mN5LmkByBXJ/Ovwi4N20IL77XwnbvL+s8PMqtWRVJ6gp0j4iN6V/5fwL2j+Se12Z1z20aZtXVC3g4PYUl4LMuGNZIfKRhZmaZuU3DzMwyc9EwM7PMXDTMzCwzFw0zM8vMRcPMzDL7/4ZMsaChadoLAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "g.message(sorted([e.real for e in evalsH2])[0:10])\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim(0,20)\n",
    "plt.ylim(0,1)\n",
    "plt.xlabel(\"number of eigenmode\")\n",
    "plt.ylabel(\"eigenvalue of H^2\")\n",
    "ax.plot(list(range(len(evalsH2))), sorted([e.real for e in evalsH2]))\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b332209c",
   "metadata": {},
   "source": [
    "In the next lecture, we study how calculate the sign function. \n",
    "\n",
    "It is clear that there may be particularly small eigenvalues, which one then may treat\n",
    "separately, e.g., by computing them and the corresponding eigenvectors as we have demonstrated here.  One can then\n",
    "define a subtracted function\n",
    "$$\n",
    "\\begin{align}\n",
    "H^2_{\\rm deflated} = H^2 - \\sum_{n} \\lambda^2_n \\vert n \\rangle \\langle n \\vert\n",
    "\\end{align}\n",
    "$$\n",
    "with eigenvalues $\\lambda_n$ and eigenvectors $\\vert n \\rangle$ of H that are orthogonalized to each other and the sum being over \n",
    "the smallest eigenvalues up to a given threshold.\n",
    "\n",
    "Let us demonstrate the combination of such a small-eigenspace-subtraction with a polynomial approximation using Chebyshev polynomials.  These are readily available in GPT."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "943c77d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  829101.817192 s : 38.24016691619401\n"
     ]
    },
    {
     "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": [
      "GPT :  829101.984571 s : 38.24016691619401\n"
     ]
    },
    {
     "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": [
    "c = g.algorithms.polynomial.chebyshev(low=0.5,\n",
    "                                      high=40,\n",
    "                                      order=30, \n",
    "                                      func=lambda x: x**-0.5)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "g.message(sorted([e.real for e in evalsH2])[-1])\n",
    "\n",
    "lambdas = np.arange(0.07074355135481224,38.24016691619401,0.1)\n",
    "ax.plot(lambdas,[1.0 / l**0.5 for l in lambdas], c=\"red\")\n",
    "ax.plot(lambdas,[c(float(l)) for l in lambdas], c=\"blue\")\n",
    "\n",
    "plt.show()\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "g.message(sorted([e.real for e in evalsH2])[-1])\n",
    "\n",
    "lambdas = np.arange(0.5,40,0.1)\n",
    "ax.plot(lambdas,[c(float(l)) * l**0.5 - 1.0 for l in lambdas], c=\"red\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "763b8beb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  829240.009220 s : First 20 eigenvalues: [0.07074355 0.07074355 0.07074355 0.07074355 0.07074355 0.08611533\n",
      "                       :  0.08611533 0.08611533 0.08611533 0.08611533 0.30964862 0.30964862\n",
      "                       :  0.30964862 0.30964862 0.30964862 0.44447293 0.44447293 0.44447293\n",
      "                       :  0.44447293 0.54348875]\n",
      "GPT :  829240.010607 s : Spectral inner products (evecs are not orthogonal, so need to orthogonalize on the fly):\n",
      "GPT :  829240.011791 s : <0|0> = (1-7.878245644268528e-20j)\n",
      "GPT :  829240.012920 s : <0|1> = (-0.0050086681752263724+0.00407796094889292j)\n",
      "GPT :  829240.013934 s : <0|2> = (-0.0074348126494220845-0.013755244561823952j)\n",
      "GPT :  829240.015989 s : <0|3> = (0.004518939728875274+0.005267604957907369j)\n",
      "GPT :  829240.017321 s : <1|0> = (-0.0050086681752263724-0.004077960948892921j)\n",
      "GPT :  829240.019287 s : <1|1> = (0.9999999999999976+2.91000937579722e-20j)\n",
      "GPT :  829240.020428 s : <1|2> = (-0.05697888813808714+0.021121600764340595j)\n",
      "GPT :  829240.021904 s : <1|3> = (0.0005929652585921154-0.02159080824829708j)\n",
      "GPT :  829240.023064 s : <2|0> = (-0.0074348126494220845+0.013755244561823953j)\n",
      "GPT :  829240.024130 s : <2|1> = (-0.05697888813808714-0.021121600764340595j)\n",
      "GPT :  829240.025087 s : <2|2> = (0.9999999999999966-2.185349044232908e-22j)\n",
      "GPT :  829240.026183 s : <2|3> = (-0.006796081156609586+0.0036320547491189123j)\n",
      "GPT :  829240.027754 s : <3|0> = (0.004518939728875274-0.005267604957907369j)\n",
      "GPT :  829240.029328 s : <3|1> = (0.0005929652585921154+0.021590808248297073j)\n",
      "GPT :  829240.030507 s : <3|2> = (-0.006796081156609586-0.003632054749118913j)\n",
      "GPT :  829240.033083 s : <3|3> = (0.9999999999999956+1.099955426343752e-19j)\n"
     ]
    }
   ],
   "source": [
    "idx = evalsH2.real.argsort()\n",
    "g.message(\"First 20 eigenvalues:\", evalsH2[idx][0:20].real)\n",
    "\n",
    "g.message(\"Spectral inner products (evecs are not orthogonal, so need to orthogonalize on the fly):\")\n",
    "for i in range(4):\n",
    "    for j in range(4):\n",
    "        g.message(f\"<{i}|{j}> = {g.inner_product(evecH2[idx[i]],evecH2[idx[j]])}\")\n",
    "\n",
    "def Hm0p5(dst, src):\n",
    "    deflated_src = g.copy(src)\n",
    "    dst[:] = 0\n",
    "    for i in range(20):\n",
    "        v = g.inner_product(evecH2[idx[i]], deflated_src)\n",
    "        dst += evalsH2[idx[i]]**-0.5 * evecH2[idx[i]] * v\n",
    "        deflated_src -= evecH2[idx[i]] * v\n",
    "    dst += c(H2) * deflated_src\n",
    "        \n",
    "# test\n",
    "for i in range(len(evalsH2)):\n",
    "    dst = g.copy(evecH2[i])\n",
    "    Hm0p5(dst, evecH2[i])\n",
    "    vvv = g.inner_product(evecH2[i], dst)\n",
    "    vvv_expected = evalsH2[i] ** -0.5\n",
    "    eps = abs(vvv - vvv_expected) / abs(vvv + vvv_expected)\n",
    "    assert eps < 1e-3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "1b979e92",
   "metadata": {},
   "outputs": [],
   "source": [
    "def Overlap(dst, src):\n",
    "    Hm0p5(dst, src)\n",
    "    dst @= w * dst + src"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "ff276164",
   "metadata": {},
   "outputs": [],
   "source": [
    "g.default.set_verbose(\"arnoldi\", False)\n",
    "a = g.algorithms.eigen.arnoldi(Nmin=300, Nmax=1400, Nstep=100, Nstop=200, resid=1e-6, implicit_restart=True)\n",
    "\n",
    "evecOv, evalsOv = a(Overlap, start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "5fa7bb53",
   "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": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim()\n",
    "ax.scatter([e.real for e in evalsOv], [e.imag for e in evalsOv], label=\"Overlap (M5=-1.8, U=1)\")\n",
    "\n",
    "ax.plot([1 - np.cos(phi) for phi in np.arange(0,2*np.pi,0.01)], \n",
    "           [np.sin(phi) for phi in np.arange(0,2*np.pi,0.01)], c=\"red\", label=\"GW circle\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "faf77dfd",
   "metadata": {},
   "source": [
    "In practice, one often also uses a rational approximation to the sign function.  A complete discussion of optimal algorithms to compute the sign function is, however, beyond the scope of this lecture.\n",
    "\n",
    "***Homework:*** Compute the eigenvalues for the massless overlap on one of our previous quenched configurations."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea04ae28",
   "metadata": {},
   "source": [
    "## Massive overlap fermions\n",
    "\n",
    "We now consider how to define massive overlap fermions.  To this end we first clean up the notation.\n",
    "We begin by defining\n",
    "$$\n",
    "\\begin{align}\n",
    "\\hat{\\gamma}_5 = \\gamma_5(\\mathbb{1}- D) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "We can then show that the GW relation yields\n",
    "$$\n",
    "\\begin{align}\n",
    "\\hat{\\gamma}_5^2 &= \\gamma_5(1- D)\\gamma_5(1- D) = \\mathbb{1} - \\gamma_5 D \\gamma_5 +  \\gamma_5 D \\gamma_5 D -  D  \\\\\n",
    "&=\\mathbb{1} - \\gamma_5 D \\gamma_5 -  D +  \\gamma_5 (D \\gamma_5 + \\gamma_5 D) = \\mathbb{1} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Similarly, one can define\n",
    "$$\n",
    "\\begin{align}\n",
    "\\tilde{\\gamma}_5 = (\\mathbb{1}- D)\\gamma_5 = \\gamma_5 \\hat{\\gamma}_5 \\gamma_5\n",
    "\\end{align}\n",
    "$$\n",
    "with $\\tilde{\\gamma}_5^2=\\mathbb{1}$.\n",
    "\n",
    "Using the GW relation, we then find\n",
    "$$\n",
    "\\begin{align}\n",
    "\\gamma_5 D + D \\hat{\\gamma}_5 = \\gamma_5 D + D\\gamma_5 -  D \\gamma_5 D = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "but also\n",
    "$$\n",
    "\\begin{align}\n",
    "\\tilde{\\gamma}_5 D + D \\gamma_5 = (1- D)\\gamma_5 D + D \\gamma_5 = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "So to summarize, we have\n",
    "$$\n",
    "\\begin{align}\\label{eqn:main}\n",
    "\\gamma_5 D + D \\hat{\\gamma}_5 &= 0 \\,, \\\\\n",
    "\\tilde{\\gamma_5} D + D \\gamma_5 &= 0 \\,, \\\\\n",
    "\\gamma_5\\tilde{\\gamma}_5 -  \\hat{\\gamma}_5 \\gamma_5 &= 0 \\,, \\\\\n",
    "\\tilde{\\gamma}_5 \\gamma_5 -  \\gamma_5\\hat{\\gamma}_5 &= 0 \\,, \\\\\n",
    "\\hat{\\gamma}_5^2 &= \\mathbb{1} \\,, \\\\\n",
    "\\tilde{\\gamma}_5^2 &= \\mathbb{1} \\,, \\\\\n",
    "\\gamma_5^2 &= \\mathbb{1} \\,.\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93fbe622",
   "metadata": {},
   "source": [
    "The chiral rotations we have studied so far are then expressed as\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= \\exp\\left(i \\alpha T \\gamma_5 \\left( \\mathbb{1} - \\frac{1}{2} D \\right) \\right) \\psi \n",
    "= \\exp\\left(i \\alpha T \\frac{\\gamma_5 + \\hat{\\gamma}_5}{2}\\right)\\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha \\left( \\mathbb{1} - \\frac{1}{2} D \\right) \\gamma_5 T \\right)\n",
    "=\\bar\\psi \\exp\\left(i \\alpha T \\frac{\\gamma_5 + \\tilde{\\gamma}_5}{2} \\right)\\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "It is easy to show that both\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &=  \\exp\\left(i \\alpha T \\hat{\\gamma}_5 \\right)\\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha T \\gamma_5 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "and\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &=  \\exp\\left(i \\alpha T \\gamma_5 \\right)\\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi \\exp\\left(i \\alpha T \\tilde{\\gamma}_5 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "define chiral symmetries as well.  (They differ only by quantum versions of the equations of motion.)\n",
    "\n",
    "Using these new operators, we can define chiral projectors\n",
    "$$\n",
    "\\begin{align}\n",
    "P_\\pm &= \\frac12 \\left(\\mathbb{1} \\pm \\gamma_5 \\right) \\,, \\\\\n",
    "\\hat{P}_\\pm &= \\frac12 \\left(\\mathbb{1} \\pm \\hat{\\gamma}_5 \\right) \\,, \\\\\n",
    "\\tilde{P}_\\pm &= \\frac12 \\left(\\mathbb{1} \\pm \\tilde{\\gamma}_5 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "satisfying\n",
    "$$\n",
    "\\begin{align}\n",
    "P_\\pm^2 &= P_\\pm \\,, \\\\\n",
    "\\hat{P}_\\pm^2 &= \\hat{P}_\\pm \\,, \\\\\n",
    "\\tilde{P}_\\pm^2 &= \\tilde{P}_\\pm \\,, \\\\\n",
    "P_+ P_- &= \\hat{P}_+ \\hat{P}_- = \\tilde{P}_+ \\tilde{P}_- = 0 \\,, \\\\\n",
    "P_+ + P_- &= \\hat{P}_+ + \\hat{P}_- = \\tilde{P}_+ + \\tilde{P}_- = \\mathbb{1} \\,, \\\\\n",
    "D \\hat{P}_\\pm &= P_\\mp D \\,, \\\\\n",
    "D P_\\pm &= \\tilde{P}_\\mp D \\,.\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b865e805",
   "metadata": {},
   "source": [
    "This now allows for the definition of chiral fields.  Two definitions immediately seem sensible.\n",
    "  First,\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi_\\pm &= \\hat{P}_\\pm \\psi \\,, & \\bar\\psi_\\pm &= \\bar \\psi P_\\mp \n",
    "\\end{align}\n",
    "$$\n",
    "for which\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar\\psi_\\pm D \\psi_\\mp = \\bar \\psi P_\\mp D \\hat{P}_\\mp \\psi = \\bar \\psi P_\\mp P_\\pm D \\psi = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The Dirac operator therefore has the expected chiral structure from chapter 5.  Alternatively we define\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi_\\pm &= P_\\pm \\psi \\,, & \\bar\\psi_\\pm &= \\bar \\psi \\tilde{P}_\\mp \n",
    "\\end{align}\n",
    "$$\n",
    "for which\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar\\psi_\\pm D \\psi_\\mp = \\bar \\psi \\tilde{P}_\\mp D P_\\mp \\psi = \\bar \\psi \\tilde{P}_\\mp \\tilde{P}_\\pm D \\psi = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "So also in this definition, we find the right chiral structure."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8897a9a",
   "metadata": {},
   "source": [
    "Writing down the mass term now is trivial.  We start by using the first definition of projectors,\n",
    "$$\n",
    "\\begin{align}\n",
    " m (\\bar\\psi_+ \\psi_- + \\bar\\psi_- \\psi_+) &= \\frac{m}{4} \\bar\\psi (1 - \\gamma_5 )(1 - \\hat{\\gamma}_5) \\psi + \\frac{m}{4} \\bar\\psi (1 + \\gamma_5 )(1 + \\hat{\\gamma}_5) \\psi \\\\\n",
    " &= \\frac{m}{4} \\bar\\psi (1 - \\gamma_5 )(1 - \\gamma_5 + \\gamma_5 D) \\psi + \\frac{m}{4} \\bar\\psi (1 + \\gamma_5 )(1 + \\gamma_5 - \\gamma_5 D) \\psi \\\\\n",
    "  &= \\frac{m}{4} \\bar\\psi (1 - \\gamma_5 )(2 - D) \\psi + \\frac{m}{4} \\bar\\psi (1 + \\gamma_5 )(2 -  D) \\psi \\\\\n",
    "   &=  m \\bar\\psi \\left(\\mathbb{1} - \\frac12   D \\right) \\psi \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The second definition yields a consistent mass term since\n",
    "$$\n",
    "\\begin{align}\n",
    "P_s \\hat{P}_r = \\tilde{P}_r P_s\n",
    "\\end{align}\n",
    "$$\n",
    "which follows from Eq. \\eqref{eqn:main} and following.\n",
    "\n",
    "If we now add this to the massless operator, the massive overlap fermion is\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "D_{\\rm ov}(m) = \\mathbb{1}\\left(1 + \\frac{m}{2}\\right) + \\left(1 - \\frac{m}{2}\\right)\\gamma_5 \\text{Sign}[H] \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Sometimes, one also uses the more symmetric definition\n",
    "$$\n",
    "\\begin{align}\n",
    "D_{\\rm ov'}(m) = \\mathbb{1}\\frac{1 +m}{2} + \\frac{1 - m}{2}\\gamma_5 \\text{Sign}[H]\n",
    "\\end{align}\n",
    "$$\n",
    "for which the modified GW relation $\\gamma_5 D_{\\rm ov'}(0) + D_{\\rm ov'}(0) \\gamma_5 = 2 D_{\\rm ov'}(0) \\gamma_5 D_{\\rm ov'}(0)$ holds.  We simply have $D_{\\rm ov'}(0)=D_{\\rm ov}(0)/2$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d4ff792",
   "metadata": {},
   "source": [
    "## Mobius Domain Wall Fermions\n",
    "\n",
    "The overlap kernel defined above is just one of many possible choices.  We noticed\n",
    "that it has a large ratio of largest to smallest eigenvalues (condition number), which increases\n",
    "the numerical cost to obtain a precise approximation of the sign function.\n",
    "The general Mobius kernel defined by\n",
    "$$\n",
    "\\begin{align}\n",
    "H &= \\gamma_5 D_{\\rm mobius} \\,, \\\\\n",
    "D_{\\rm mobius} &= \\frac{(b + c)D_{\\rm wilson}(m=-M_5)}{2 + (b-c)D_{\\rm wilson}(m=-M_5)} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "with parameters $b$ and $c$ allows for a substantial reduction of this condition number.\n",
    "It is therefore often used in practice.\n",
    "\n",
    "Let us demonstrate this for the popular $b=1.5$ and $c=0.5$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "id": "fe88b8f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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i+XLl3Pqqady7rnnlguzUgUFBfzsZz9jwYIFrFq1ipdeeimiGnJzc+na9eB4iF26dCE395DxEAFYsGABKSkpTJw4kU2bDo6KnpqaWha24d54440q/2xKvfzyy2RnZ/PJJ58wd+5cli9fDvj7Sa677jrmz59PZmYm06ZN4ze/+U3ZfkVFRaxYsYKHH36Yu+66C/C/cbz44osA5OXlkZeXR2pqKieffDJvv/02H3/8MTNnzuTXv/51zQc85NNPP+WFF17g3XffZeXKlTRt2pTnnnuuVn9fIxV/XTfqtonMww8H9tUpKSlkZ2fz/PPPM378+HLr3nnnnbKQPOuss9i6dSs7d+4E4MILLyQpKYmkpCRGjx7NihUrGDBgQI3f17NnT7788kuuu+46zjvvPMaMGVPpdnfffTfDhg1j1qxZgA+TN954g4ED/YCru3fvZv369Zxwwgl069aN4cOHl+3bo0ePsloGDx5MdnY2u3fv5r333uOSSy4p2+67776jOnl5efTp06fcstLfeEaOHMnOnTvZvn07o0ePZuXKlTX+7DUZNGgQX331FUceeSSLFi1iwoQJrF+/vtw277//PiNHjiy7brv0t4Ro1XDBBRcwefJkWrZsyZNPPsmUKVNYunQpAB07dqz0P/Sq/mxGjhxZts0777zDJZdcQpMmTTjuuOMYPXo0AOvWrWPNmjWcc845gO9i6hQ2rPlFF10EHPxzBLj00ksZM2YMd911Fy+++GLZeaEdO3YwZcoU1q9fj5lx4MCBiH/uN998k8zMTIYMGQLA3r176dixIxdccEFEf19rI76CXuPcNBppaWn84he/ID09na1bt0a0T8XLyiq+b9asGSUlJWXvS681btu2LatWreL111/niSee4MUXX2T27NmHfP6QIUPIzMyksLCQdu3a4Zzj1ltv5corryy3XXZ2Nq1bty63rGXLlmWvmzZtyt69eykpKeGYY46pVRgmJSUdco10ZT/3smXLuOmmmw7Z/4gjjqhVH/XRRx9d9nr8+PFcc801bNmyhQ4dOtS4b001dO7cuVzrPCcnp9LzMe3DhhT/6U9/ys0331z2ft++fSQlJR2yT1V/NpFwznHKKaeUtfArKv2zbNq0KUVFRQB07tyZ9u3bk5WVxQsvvMATTzwB+G6+0aNH88orr5Cdnc2oUaMO+byq/l4655gyZQr33nvv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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": [
      "28.163265306122444\n"
     ]
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.xlim()\n",
    "\n",
    "lr=np.arange(0.07, 40, 0.1)\n",
    "ax.plot(lr, [(2*l)/(2+l) for l in lr] , c=\"red\", label=\"Mobius kernel (b=1.5,c=0.5) eigenvalues\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()\n",
    "\n",
    "lmin=(2*0.07)/(2+0.07)\n",
    "lmax=(2*40)/(2+40)\n",
    "print(lmax / lmin)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40578a6a",
   "metadata": {},
   "source": [
    "The original condition number of approximately 600 is reduced to 28.\n",
    "\n",
    "One can show that an approximation to the overlap operator with a general\n",
    "Mobius kernel can be obtained by studying four-dimensional projections of\n",
    "a five-dimensional theory.\n",
    "\n",
    "We first define\n",
    "$$\n",
    "\\begin{align}\n",
    "D_+ &= b D_{\\rm wilson}(-M_5) + 1 \\,, \\\\\n",
    "D_- &= c D_{\\rm wilson}(-M_5) - 1 \\,, \\\\\n",
    "D_{\\rm mobius} &= \\frac{D_+ + D_-}{D_+ - D_-} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "and a five-dimensional operator $D_{\\rm dw5d}$,\n",
    "$$\n",
    "\\begin{align}\n",
    "\\bar \\psi D_{\\rm dw5d}(m) \\psi = \\sum_{s=1}^{L_s} \\bar\\psi_s D_+ \\psi_s + \\sum_{s=2}^{L_s} \\bar\\psi_s D_- P_+ \\psi_{s-1} + \\sum_{s=1}^{L_s-1} \\bar\\psi_s D_- P_- \\psi_{s+1} - m (\\bar\\psi_1 D_- P_+ \\psi_{L_s} + \\bar\\psi_{L_s} D_- P_- \\psi_1) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "Then the Lagrange density\n",
    "$$\n",
    "\\begin{align}\n",
    "{\\cal L} = \\bar \\psi D_{\\rm dw5d}(m) \\psi + \\bar \\phi_{\\rm pv} D_{\\rm dw5d}(1) \\phi_{\\rm pv}\n",
    "\\end{align}\n",
    "$$\n",
    "generates the proper five-dimensional theory.  We need two five-dimensional fields, $\\psi$ and the Pauli-Villars fields $\\phi_{\\rm pv}$ which are responsible for the operator triviality at $m=1$, see definition of $D_{\\rm ov'}(m)$.  The $\\psi$ field is Grassmannian and the $\\phi_{\\rm pv}$ field is a bosonic complex field.  They generate the determinant ratio\n",
    "$$\n",
    "\\begin{align}\n",
    "\\frac{\\det(D_{\\rm dw5d}(m))}{\\det(D_{\\rm dw5d}(m=1)} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "We then define four-dimensional projections\n",
    "$$\n",
    "\\begin{align}\n",
    "q_L &= P_- \\psi_1 \\,, & q_R &= P_+ \\psi_{L_s} \\,, & q &= q_L + q_R \\\\\n",
    "\\bar q_L &= \\bar\\psi_{L_s} (-D_-) P_+ \\,, & \\bar q_R &= \\bar\\psi_{1} (-D_-) P_- & \\bar q &= \\bar{q}_L + \\bar{q}_R \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "for which we find\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle q \\bar q \\rangle_q = \\frac1{1-m}\\left( (D^{L_s}_{\\rm ov'})^{-1} - 1 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    "T &= \\frac{1-H}{1+H} \\,, \\\\\n",
    "D^{L_s}_{\\rm ov'} &= \\frac{1+m}{2} + \\frac{1-m}{2} \\gamma_5 \\frac{1-T^{L_s}}{1 + T^{L_s}} \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "For $L_s \\to \\infty$ the rational function of $H$ converges to the sign function.  Let us demonstrate this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "d2a61c26",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAv5klEQVR4nO3de3yU1Z348c83CUmEJJAAYiByUVGpoggBa3HVFQUEV6xaxdZddHX52Wpba+ttqdvW1V3rXnR326oU72W9a0WLIAJeQEESxRBQJMAiCQghARLIBcJ8f3+cZ2CSzOTCPJnJJN/36zXOPOe5zNcnw3znnPM854iqYowxpvtKincAxhhj4ssSgTHGdHOWCIwxppuzRGCMMd2cJQJjjOnmUuIdwNHo16+fDh06NN5hGGNMQiksLNylqv2blidkIhg6dCgFBQXxDsMYYxKKiGwJV25NQ8YY081ZIjDGmG7OEoExxnRzCdlHEM7BgwcpLS2lrq4u3qF0Wunp6eTl5dGjR494h2KM6US6TCIoLS0lMzOToUOHIiLxDqfTUVUqKiooLS1l2LBh8Q7HGNOJ+NI0JCJPishOESmOsF5E5L9FpEREikRkdMi6GSKywXvMONoY6urq6Nu3ryWBCESEvn37Wo3JGNOMX30ETwOTW1h/CTDce8wEHgUQkRzgV8DZwDjgVyKSfbRBWBJomZ0fY0w4vjQNqeoHIjK0hU2mAc+qG/N6hYj0EZFc4AJgkapWAojIIlxCed6PuIxJJJWVlWzdupWysjJ27NhBXV0dBw4c4MCBAxw8eJCGhoZG2weHkD94EKqrob4e6uqUAwfgwAFXHggogQCoQiAQfOjh5ZZGoW+2ThUCh+BQ6CNAozdQPfzQgDZaBu+A2sKbtHe5G3r8+X9kxPhTfT1mrPoIBgFbQ5ZLvbJI5c2IyExcbYLBgwd3TJRRysjIYN++fR36HqtXr+bmm2+mrq6OlJQU/vCHPzBu3LgOfU/TcXbs2MHDDz/M66+/zldffRXDd7baYaLaXPy3CZsIoqaqs4HZAPn5+d32Z8Gdd97Jr371Ky655BLmz5/PnXfeyXvvvRfvsMxRmDt3Lv/wD/9AfX09EydO5MYbb+SEE05g0KBBHHfccfTs2ZPU1FT27OnBk0+m8qc/JfN//+e+wPv0gfx8OOkkIS8PBg6E7GzIzITMTCEzE445BlJSIDnZPQ6/rt1H8rL3SV61guTCT5CCVbB3T0hkArm5MGAA0r8f9O/vHtnZkJEBvXq5R0YGktHLvVGPHu6RknLkdegjORlE/HkY38UqEZQBx4cs53llZbjmodDy92IUU0y8/PLL/OY3vyE5OZnevXvzwQcfRHU8EaGqqgqAvXv3MnDgQD/CNDH2+OOPc/PNN3P++ecze/ZsTj755GbbHDwI//EfcN99UFsLEyfCL38J558PJ57Yzu/E8nJ4di68+SZ8+KE7eEoKjBwJ13wPTjvNHfTEE2HoUEhP9+3/1XR+sUoE84BbReQFXMfwXlXdLiILgX8J6SCeCNwT9bvddhusXh31YRoZNQoeeaTdu913330sXLiQQYMGsWfPnmbrq6ur+au/+quw+/7v//4v3/rWtxqVPfLII0yaNIlf/OIXBAIBPvroo3bHZOJr/fr13HrrrVxyySW89tprpIf50v3mG7jsMli1Cq64Au6/H0aMaOcbqcKSJfD44/DnP7sv/9NPd/8+LrkEzjnHvvAN4FMiEJHncb/s+4lIKe5KoB4AqvoYMB+YApQANcAN3rpKEflnYJV3qPuCHcddxfjx47n++uu5+uqrueKKK5qtz8zMZHU7ktajjz7Kww8/zJVXXslLL73EjTfeyLvvvutjxKaj/fznP+eYY47hqaeeCpsENm6ECy+EXbvg5ZfhqquO4k1WroS77oL334e+feHWW+HGG90vf2OaUtWEe4wZM0abWrduXbOyWOvVq1fY8hUrVui9996rQ4YM0V27djVaV1VVpWeeeWbYx9q1a5sdKysrSwOBgKqqBgIBzczMbFeMneE8dWeLFy9WQB966KGw6ysqVE85RTUnR7Ww8CjeoKxM9aqr3HU6xx6r+j//o1pXF13QpssACjTMd2rCdBYnqo0bN3L22Wdz9tln8/bbb7N161b69u17eH17awQDBw7k/fff54ILLmDJkiUMHz68A6I2HeW5556jd+/e/OQnP2m2ThW+/33YvBnefRdGjw5zgJa88grMnOk6FH79a/j5z13nrjGtsETgo5qaGvLy8g4v33777SxbtowNGzagqkyYMIEzzzwzqvf44x//yE9/+lMaGhpIT09n9uzZ0YZtYqShoYE333yTSy+9lLS0tGbrn3kGFi6E3/0OInQbhXfoENx9N/z7v8O4cfDccxCm89mYSCwR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64nvAu6LYVxDVLVMRE4AlojIGtyX3VHz+Xw9B8xQ1YBXfNTnqysSkeuAfOD8kOJmf1NV3Rj+CL57E3heVetF5P/halMXxui922I68IqqHgopi+f56hAJnQhU9aIoD1EGHB+ynOeVVeCqXSner7pgedRxicgOEclV1e3eF9fOFg51NfC6qh4MOXbw13G9iDwF/CKWcalqmfe8SUTeA84CXiXO50tEsoC/4H4ErAg59lGfrzAifV7CbVMqIilAb9znqS37dmRciMhFuOR6vqrWB8sj/E39+GJrNS5VrQhZnIPrEwrue0GTfd/zIaY2xRViOnBLaEEHnq/WRIo76nPV3ZuGVgHDxV3xkor7o89T1wOzFNc+DzAD8KuGMc87XluO26xt0vsyDLbLXw6EvcKgI+ISkexg04qI9APGA+vifb68v93ruPbTV5qs8/N8hf28tBDvVcAS7/zMA6aLu6poGDAc+CSKWNoVl4icBTwOXKaqO0PKw/5NYxhXbsjiZbh5zcHVgid68WUDE2lcM+7QuLzYTsV1vn4cUtaR56s184C/864e+jaw1/uhE/256oje787wAL6LayurB3YAC73ygcD8kO2mAF/hMvqskPITcP9QS4CXgTSf4uoLLAY2AO8COV55PjAnZLuhuEyf1GT/JcAa3Bfan4CMWMUFfMd778+95xs7w/kCrgMOAqtDHqM64nyF+7zgmpou816ne///Jd75OCFk31nefuuBS3z+vLcW17vev4Pg+ZnX2t80RnH9K7DWe/+lwKkh+/69dx5LgBtiGZe3/GvgwSb7ddj5wv3o2+59lktxfTk3Azd76wX4vRfzGkKuhoz2XNkQE8YY081196YhY4zp9iwRGGNMN2eJwBhjujlLBMYY081ZIjDGmG7OEoExxnRzlgiMMaab+/90MMQR6eiOmQAAAABJRU5ErkJggg==\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.xlim()\n",
    "\n",
    "def sgn(x, Ls):\n",
    "    t = (1-x)/(1+x)\n",
    "    return (1-t**(Ls)) / (1 + t**(Ls))\n",
    "\n",
    "xr=np.arange(-1.005,1,0.01)\n",
    "ax.plot(xr, [sgn(x,8) for x in xr] , c=\"red\", label=\"Ls = 8\")\n",
    "ax.plot(xr, [sgn(x,16) for x in xr] , c=\"blue\", label=\"Ls = 16\")\n",
    "ax.plot(xr, [sgn(x,32) for x in xr] , c=\"black\", label=\"Ls = 32\")\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9472b9c4",
   "metadata": {},
   "source": [
    "It may seem odd that we define four-dimensional fields $q$ such that\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle q \\bar q \\rangle_q = \\frac1{1-m}\\left( (D^{L_s}_{\\rm ov'})^{-1} - 1 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "does not correspond just to $(D^{L_s}_{\\rm ov'})^{-1}$, however, this definition\n",
    "has significant advantages.  It corresponds to a field re-definition that\n",
    "has properties closer to the continuum fields.\n",
    "\n",
    "One such property is that in the continuum one expects\n",
    "$$\n",
    "\\begin{align}\n",
    "\\partial_m (\\langle \\psi \\bar \\psi \\rangle_\\psi)^{-1} = \\mathbb{1}\n",
    "\\end{align}\n",
    "$$\n",
    "since we expect $(\\langle \\psi \\bar \\psi \\rangle_\\psi)^{-1} = \\gamma_\\mu D_\\mu + m$ in the continuum.\n",
    "Indeed our definition satisfies this, as\n",
    "$$\n",
    "\\begin{align}\n",
    "D_{\\rm ov'}(m) &= D_{\\rm ov'}(0) + m (1-D_{\\rm ov'}(0)) = (D_{\\rm ov'}(0) - 1)(1-m) + 1 \\,, \\\\\n",
    "(D_{\\rm ov'}(m))^{-1} &= [(D_{\\rm ov'}(0) - 1)(1-m) + 1]^{-1} \\,, \\\\\n",
    "(D_{\\rm ov'}(m))^{-1} - 1 &= [(D_{\\rm ov'}(0) - 1)(1-m) + 1]^{-1} [1 - ((D_{\\rm ov'}(0) - 1)(1-m) + 1)] \\\\\n",
    "&=- [(D_{\\rm ov'}(0) - 1)(1-m) + 1]^{-1} (D_{\\rm ov'}(0) - 1)(1-m) \\,, \\\\\n",
    "\\langle q \\bar q \\rangle_q^{-1} &= (1-m)(D_{\\rm ov'}(m))^{-1} - 1)^{-1} \\\\\n",
    "&= - [(1-m) + (D_{\\rm ov'}(0) - 1)^{-1}] \\\\\n",
    "&=m \\mathbb{1} - (D_{\\rm ov'}(0) - 1)^{-1} - 1 \\\\\n",
    "&=m \\mathbb{1} + D_{\\rm ov'}(0) + D_{\\rm ov'}(0)^2 + D_{\\rm ov'}(0)^3 + \\ldots \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "With this definition, we also obtain the natural definition of the chiral condensate as being the\n",
    "maximally chirally violating term (see discussion of the mass above)\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\bar\\psi_+ \\psi_- + \\bar\\psi_- \\psi_+ \\rangle &= \\langle \\bar\\psi(1-D_{\\rm ov'}) \\psi \\rangle = -\\text{Tr}[D^{-1}_{\\rm ov'}(1-D_{\\rm ov'})] \\\\\n",
    "&=-\\text{Tr}[D^{-1}_{\\rm ov'}-1] = (1-m) \\langle \\bar q q \\rangle \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b3a8d6d",
   "metadata": {},
   "source": [
    "### Test five-dimensional domain wall operator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "72892cb0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  344952.716639 s : Initializing gpt.random(test,vectorized_ranlux24_389_64) took 0.000365019 s\n",
      "GPT :  344952.921818 s : 1.760513745315208e-16\n"
     ]
    }
   ],
   "source": [
    "grid = g.grid([8,8,8,16], g.double)\n",
    "\n",
    "b_test = 1.5\n",
    "c_test = 0.5\n",
    "Ls_test = 12\n",
    "mass_test = 0.1\n",
    "\n",
    "D_W = g.qcd.fermion.wilson_clover(U, mass=-1.8, csw_r=0.0, csw_t=0.0, nu=1.0, xi_0=1.0,\n",
    "                                isAnisotropic=False,\n",
    "                                boundary_phases=[1,1,1,-1])\n",
    "\n",
    "def D_DWF(dst, src):\n",
    "    b = b_test\n",
    "    c = c_test\n",
    "    mass = mass_test\n",
    "    src_s = g.separate(src, 0)\n",
    "    dst_s = [g.lattice(s) for s in src_s]\n",
    "    \n",
    "    Ls = len(src_s)\n",
    "    \n",
    "    src_plus_s = []\n",
    "    src_minus_s = []\n",
    "    for s in range(Ls):\n",
    "        src_plus_s.append(g(0.5 * src_s[s] + 0.5 * g.gamma[5]*src_s[s]))\n",
    "        src_minus_s.append(g(0.5 * src_s[s] - 0.5 * g.gamma[5]*src_s[s]))\n",
    "    for d in dst_s:\n",
    "        d[:] = 0\n",
    "    for s in range(Ls):\n",
    "        dst_s[s] += b*D_W* src_s[s] + src_s[s]\n",
    "    for s in range(1,Ls):\n",
    "        dst_s[s] += c*D_W * src_plus_s[s-1] - src_plus_s[s-1]\n",
    "    for s in range(0,Ls-1):\n",
    "        dst_s[s] += c*D_W * src_minus_s[s+1] - src_minus_s[s+1]\n",
    "    dst_s[0] -= mass*(c*D_W * src_plus_s[Ls-1] - src_plus_s[Ls-1])\n",
    "    dst_s[Ls-1] -= mass*(c*D_W * src_minus_s[0] - src_minus_s[0])\n",
    "    dst @= g.merge(dst_s, 0)\n",
    "\n",
    "D_dwf = g.qcd.fermion.mobius(U, M5=1.8, mass=mass_test, Ls=Ls_test, b=b_test, c=c_test, \n",
    "                             boundary_phases=[1,1,1,-1])\n",
    "        \n",
    "rng = g.random(\"test\")\n",
    "src_test = rng.cnormal(g.vspincolor(D_dwf.F_grid))\n",
    "dst_test = g(D_dwf * src_test)\n",
    "\n",
    "dst_test2 = g.vspincolor(D_dwf.F_grid)\n",
    "D_DWF(dst_test2, src_test)\n",
    "\n",
    "eps = (g.norm2(dst_test2 - dst_test) / g.norm2(dst_test)) ** 0.5\n",
    "g.message(eps)\n",
    "assert eps < 1e-13"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3ab6e57",
   "metadata": {},
   "source": [
    "### Test overlap propagator\n",
    "\n",
    "We now test\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle q \\bar q \\rangle_q = \\frac1{1-m}\\left( (D^{L_s}_{\\rm ov'})^{-1} - 1 \\right)\n",
    "\\end{align}\n",
    "$$\n",
    "by checking\n",
    "$$\n",
    "\\begin{align}\n",
    "(D^{L_s}_{\\rm ov'}) ((1-m)\\langle q \\bar q \\rangle_q + 1) v = v\n",
    "\\end{align}\n",
    "$$\n",
    "for $b=c=1$ which corresponds to the overlap operator with the simple\n",
    "Wilson kernel that we implemented above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "90b4c27a",
   "metadata": {},
   "outputs": [],
   "source": [
    "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",
    "D_dwf = g.qcd.fermion.mobius(U, M5=1.8, mass=mass_test, Ls=Ls_test, b=1, c=1, \n",
    "                             boundary_phases=[1,1,1,-1])\n",
    "\n",
    "qqbar = D_dwf.propagator(inv.preconditioned(pc.eo1_ne(), cg))\n",
    "\n",
    "src = g.mspincolor(grid)\n",
    "rng.cnormal(src)\n",
    "\n",
    "qqbar_src = g(qqbar * src)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "id": "78772552",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :  354151.708624 s : 2.1304647219726924e-05\n"
     ]
    }
   ],
   "source": [
    "def _Overlap2(dst, src):\n",
    "    # D_ov'(m) = D_ov'(0) + m(1-D_ov'(0))\n",
    "    #          = D_ov(0)/2 + m(1-D_ov(0)/2)\n",
    "    #          = D_ov(0)*(1 - m)/2 / 2 + m\n",
    "    Overlap(dst, src)\n",
    "    dst *= 0.5*(1-mass_test)\n",
    "    dst += mass_test * src\n",
    "    \n",
    "Overlap2 = g.matrix_operator(otype=g.ot_vector_spin_color(4, 3), mat=_Overlap2)\n",
    "    \n",
    "#\n",
    "one_minus_m_qqbar_src = g((1.0 - mass_test) * qqbar_src)\n",
    "dst = g(one_minus_m_qqbar_src + src)\n",
    "dst2 = g.lattice(dst)\n",
    "Overlap2(dst2, dst)\n",
    "\n",
    "g.message(g.norm2(dst2-src)/g.norm2(src))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f68a694",
   "metadata": {},
   "source": [
    "## Ward–Takahashi identities"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a95711a3",
   "metadata": {},
   "source": [
    "Consider the effect of field transformations\n",
    "$$\n",
    "\\begin{align}\n",
    "\\psi \\to \\psi' &= \\psi + \\delta \\psi \\,, \\\\\n",
    "\\bar\\psi \\to \\bar\\psi' &= \\bar\\psi + \\delta \\bar\\psi \\,,\n",
    "\\end{align}\n",
    "$$\n",
    "on an observable $O(\\bar\\psi,\\psi)$.  We define\n",
    "$$\n",
    "\\begin{align}\n",
    "O(\\bar\\psi',\\psi') &= O(\\bar\\psi,\\psi) + \\delta O(\\bar\\psi,\\psi) \\,, \\\\\n",
    "S(\\bar\\psi',\\psi') &= S(\\bar\\psi,\\psi) + \\delta S(\\bar\\psi,\\psi) \\,, \\\\\n",
    "d\\bar\\psi'd\\psi' &= d\\bar\\psi d\\psi - \\delta M(\\bar\\psi,\\psi) d\\bar\\psi d\\psi \\\\\n",
    "&= d\\bar\\psi d\\psi(1 - \\delta M(\\bar\\psi,\\psi)) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "Then we write the path\n",
    "integral in two identical ways with different names for the integration\n",
    "variables, and compute the difference\n",
    "$$\n",
    "\\begin{align}\n",
    "0 &= \\int d\\bar\\psi' d\\psi' O(\\bar\\psi',\\psi') e^{-S(\\bar\\psi',\\psi')} - \\int d\\bar\\psi d\\psi O(\\bar\\psi,\\psi) e^{-S(\\bar\\psi,\\psi)} \\\\\n",
    "&= \\int d\\bar\\psi d\\psi \\left((1 - \\delta M(\\bar\\psi,\\psi)) O(\\bar\\psi',\\psi') e^{-S(\\bar\\psi',\\psi')} - O(\\bar\\psi,\\psi) e^{-S(\\bar\\psi,\\psi)}\\right) \\\\\n",
    "&=\\int d\\bar\\psi d\\psi \\left[\\delta O(\\bar\\psi,\\psi) - O(\\bar\\psi,\\psi)(\\delta S(\\bar\\psi,\\psi) + \\delta M(\\bar\\psi,\\psi))\\right] e^{-S(\\bar\\psi,\\psi)} + O(\\delta^2) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "This can be conveniently written as the **Schwinger–Dyson equations**\n",
    "$$\n",
    "\\langle \\delta O(\\bar\\psi,\\psi) \\rangle_\\psi = \\langle O(\\bar\\psi,\\psi)(\\delta S(\\bar\\psi,\\psi) + \\delta M(\\bar\\psi,\\psi)) \\rangle_\\psi \\,.\n",
    "$$\n",
    "\n",
    "It follows that for non-anomalous symmetries of the theory ($\\delta S = \\delta M = 0$) we find $\\langle\\delta O\\rangle_\\psi =0$.  This can be used, e.g., to relate correlation functions after space-time-symmetry transformations to one another.\n",
    "\n",
    "Other choices will yield quantum analogs to equations of motion or Noether conservation laws.  The latter are called **Ward–Takahashi** identities and will be studied next."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de97b37b",
   "metadata": {},
   "source": [
    "As a first step we consider non-anomalous transformations ($\\delta M=0$) of the type\n",
    "$$\n",
    "\\begin{align}\n",
    "\\delta \\psi(x) &= i\\varepsilon(x) \\lambda \\psi(x) \\,, \\\\\n",
    "\\delta \\bar\\psi(x) &= i\\varepsilon(x)  \\bar\\psi(x) \\bar{\\lambda}\n",
    "\\end{align}\n",
    "$$\n",
    "with $\\lambda,\\bar\\lambda$ acting on internal indices of the fields.  For a lattice theory\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    "S = \\sum_{x,y} \\bar\\psi(x) D(x,y) \\psi(y)\n",
    "\\end{align}\n",
    "$$\n",
    "we have\n",
    "$$\n",
    "\\begin{align}\n",
    "\\delta S(\\bar\\psi,\\psi) &= i\\sum_{x,y} ( \\varepsilon(x) \\bar\\psi(x) \\bar{\\lambda} D(x,y) \\psi(y) +  \\varepsilon(y) \\bar\\psi(x) D(x,y) \\lambda \\psi(y))\n",
    "\\end{align}\n",
    "$$\n",
    "and therefore\n",
    "$$\n",
    "\\begin{align}\n",
    "\\partial_{\\varepsilon(x)} \\delta S(\\bar\\psi,\\psi) &= i\\sum_{y} ( \\bar\\psi(x) \\bar{\\lambda} D(x,y) \\psi(y) +  \\bar\\psi(y) D(y,x) \\lambda \\psi(x)) \n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "\n",
    "For the Wilson Dirac matrix in $n_d$ space-time dimensions with mass matrix $M$\n",
    "$$\n",
    "\\begin{align}\n",
    "D(x,y) = \\sum_\\mu\\frac{\\gamma_\\mu-\\mathbb{1}}{2}  U_\\mu(x)\\delta_{y,x+\\hat{\\mu}} - \\sum_\\mu\\frac{\\gamma_\\mu+\\mathbb{1}}{2} U^\\dagger_\\mu(x - \\hat{\\mu})\\delta_{y,x-\\hat{\\mu}} + n_d\\mathbb{1} + M\n",
    "\\end{align}\n",
    "$$\n",
    "and\n",
    "$$\n",
    "\\begin{align}\n",
    "\\lambda &= \\tau_b \\,, \\\\\n",
    "\\bar{\\lambda} &= - \\tau_b\n",
    "\\end{align}\n",
    "$$\n",
    "with flavor matrices $\\tau_b$ we find\n",
    "$$\n",
    "\\begin{align}\n",
    "-i\\partial_{\\varepsilon(x)} \\delta S(\\bar\\psi,\\psi) &= \\sum_{y} ( \\bar\\psi(y)  D(y,x) \\tau_b\\psi(x) -  \\bar\\psi(x)\\tau_b  D(x,y)  \\psi(y)) \\\\\n",
    "&= \\sum_\\mu  \\bar\\psi(x- \\hat{\\mu})  \\frac{\\gamma_\\mu-\\mathbb{1}}{2}  U_\\mu(x- \\hat{\\mu})  \\tau_b \\psi(x) -\\sum_\\mu  \\bar\\psi(x)  \\frac{\\gamma_\\mu-\\mathbb{1}}{2}  U_\\mu(x) \\tau_b\\psi(x + \\hat{\\mu}) \\notag\\\\\n",
    "&\\quad -\\sum_\\mu  \\bar\\psi(x+\\hat{\\mu})  \\frac{\\gamma_\\mu+\\mathbb{1}}{2}  U^\\dagger_\\mu(x) \\tau_b\\psi(x) + \\sum_\\mu  \\bar\\psi(x)  \\frac{\\gamma_\\mu+\\mathbb{1}}{2}  U^\\dagger_\\mu(x - \\hat{\\mu}) \\tau_b\\psi(x - \\hat{\\mu}) \\notag\\\\\n",
    "&\\quad + \\bar\\psi(x)[M,\\tau^b] \\psi(x) \\\\\n",
    "&=\\bar\\psi(x)[M,\\tau^b] \\psi(x) -\\sum_\\mu (J^b_\\mu(x) - J^b_\\mu(x-\\hat{\\mu})) \\\\\n",
    "&=\\bar\\psi(x)[M,\\tau^b] \\psi(x) - \\sum_\\mu \\overleftarrow{\\partial_\\mu} J^b_\\mu(x) \n",
    "\\end{align}\n",
    "$$\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    "J_\\mu^b(x) = \\bar\\psi(x)  \\frac{\\gamma_\\mu-\\mathbb{1}}{2}  U_\\mu(x) \\tau_b\\psi(x+\\hat{\\mu})  +   \\bar\\psi(x+\\hat{\\mu})  \\frac{\\gamma_\\mu+\\mathbb{1}}{2}  U^\\dagger_\\mu(x) \\tau_b\\psi(x) \\,.\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2db53283",
   "metadata": {},
   "source": [
    "For $O=1$ we then have the equation\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\sum_\\mu \\overleftarrow{\\partial_\\mu} J^b_\\mu(x) \\rangle_\\psi &= \\langle \\bar\\psi(x)[M,\\tau^b] \\psi(x) \\rangle_\\psi \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "For a $\\tau^b$ diagonal in flavor space the right-hand term vanishes and the current $J_\\mu$ is conserved.\n",
    "Let us identify the case $\\tau^b=\\mathbb{1}$ with $J_\\mu$, i.e., suppressing the $b$ index.  We can define the charge\n",
    "$$\n",
    "\\begin{align}\n",
    "Q(x_4) = \\sum_{x_1,x_2,x_3} J_4(x)\n",
    "\\end{align}\n",
    "$$\n",
    "for which\n",
    "$$\n",
    "\\begin{align}\n",
    "Q(x_4) - Q(x_4-1) &= \\sum_{x_1,x_2,x_3} \\overleftarrow{\\partial_4} J_4(x) \\\\\n",
    "&= -\\sum_{i=1,2,3} \\sum_{x_1,x_2,x_3} \\overleftarrow{\\partial_i} J_i(x) = 0\n",
    "\\end{align}\n",
    "$$\n",
    "due to periodic boundary conditions of $J_i$, i.e., the charge $Q$ is time-independent.\n",
    "\n",
    "In the case $O\\neq 1$ we can use our formalism again and find current conservation with additional **contact terms**.  We leave this discussion for subsequent lectures.\n",
    "\n",
    "We first test the vector current conservation numerically."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "eea067f0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :     513.889909 s : Initializing gpt.random(t,vectorized_ranlux24_389_64) took 0.00026083 s\n"
     ]
    }
   ],
   "source": [
    "import gpt as g\n",
    "import numpy as np\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",
    "\n",
    "grid = g.grid([8,8,8,16],g.double)\n",
    "rng = g.random(\"t\")\n",
    "U_rnd = g.qcd.gauge.random(grid, rng)\n",
    "\n",
    "w = g.qcd.fermion.wilson_clover(U_rnd, mass=-0.5, csw_r=0.0, csw_t=0.0, nu=1.0, xi_0=1.0,\n",
    "                                isAnisotropic=False,\n",
    "                                boundary_phases=[1,1,1,-1])\n",
    "\n",
    "cg = inv.cg({\"eps\": 1e-8, \"maxiter\": 1000})\n",
    "invD = w.propagator(inv.preconditioned(pc.eo1_ne(), cg))\n",
    "\n",
    "src = g.mspincolor(U_rnd[0].grid)\n",
    "g.create.point(src, [1,0,0,0])\n",
    "prop = g(invD * src)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e1494dd5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :     516.032148 s : div(J_local) 0.4504373871226864\n"
     ]
    }
   ],
   "source": [
    "def divergence(f, current):\n",
    "    resN = g.lattice(f)\n",
    "    resN[:] = 0\n",
    "    \n",
    "    b = g(g.gamma[5] * g.adj(f) * g.gamma[5])\n",
    "    for mu in range(4):\n",
    "        c_mu = current(f, b, mu)\n",
    "        resN += c_mu - g.cshift(c_mu,mu,-1)\n",
    "\n",
    "    return g.norm2(resN)\n",
    "\n",
    "def local_current(f, b, mu):\n",
    "    return g(g.gamma[mu] * f * b)\n",
    "\n",
    "g.message(\"div(J_local)\",\n",
    "          divergence(prop, local_current))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "33bdb1b3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :     594.806758 s : div(J_conserved) 3.0420761637370467e-19\n",
      "GPT :     594.972310 s : div(J_conserved_gpt) 3.0420761637370467e-19\n"
     ]
    }
   ],
   "source": [
    "def conserved_current(psi, bar_psi, mu):\n",
    "    s = g.covariant.shift(U_rnd, boundary_phases=w.params[\"boundary_phases\"])\n",
    "    return g(\n",
    "        + 0.5 * bar_psi * (g.gamma[mu].tensor() - g.gamma[\"I\"].tensor()) * s.forward[mu] * psi\n",
    "        + 0.5 * g.adj(s.forward[mu](g.adj(bar_psi))) * (g.gamma[mu].tensor() + g.gamma[\"I\"].tensor()) * psi\n",
    "    )\n",
    "\n",
    "g.message(\"div(J_conserved)\",\n",
    "          divergence(prop, conserved_current))\n",
    "\n",
    "g.message(\"div(J_conserved_gpt)\",\n",
    "          divergence(prop, w.conserved_vector_current))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "327b6bb5",
   "metadata": {},
   "source": [
    "For domain-wall fermions, the construction of the four-dimensional conserved currents proceeds in the same manner.  One first finds a five-dimensional conserved current\n",
    "$$\n",
    "j_\\mu^{\\rm DWF}(x,s)\n",
    "$$\n",
    "with space-time position $x$ and fifth-dimension coordinate $s$ that satisfies\n",
    "$$\n",
    "\\sum_{\\mu=1,2,3,4} \\overleftarrow{\\partial_\\mu} j_\\mu^{\\rm DWF}(x,s) + \\overleftarrow{\\partial_5} j_5^{\\rm DWF}(x,s) = 0 \\,.\n",
    "$$\n",
    "One then defines a four-dimensional conserved current by summing over the fifth dimension.  This is similar to the construction of the conserved charge above, where we reduced the dimension of the conserved quantity from four to one by summing over the orthogonal dimensions.  Concretely, we have\n",
    "$$\n",
    "J_\\mu^{\\rm DWF, 4d}(x) = \\sum_s j_\\mu^{\\rm DWF}(x,s)\n",
    "$$\n",
    "with\n",
    "$$\n",
    "\\begin{align}\n",
    "\\sum_{\\mu=1,2,3,4}\\overleftarrow{\\partial_\\mu}  J_\\mu^{\\rm DWF, 4d}(x) = -\\sum_s \\overleftarrow{\\partial_5} j_5^{\\rm DWF}(x,s) = 0 \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "Finally for domain-wall fermions the left and right modes are located at different parts of the fifth dimension.  One can then define left- and right-handed 4d currents by\n",
    "$$\n",
    "\\begin{align}\n",
    "J_\\mu^{\\rm DWF, 4d, left}(x) &= \\sum_{s=1}^{L_s/2} j_\\mu^{\\rm DWF}(x,s) \\,, \\\\\n",
    "J_\\mu^{\\rm DWF, 4d, right}(x) &= \\sum_{s=L_s/2}^{L_s} j_\\mu^{\\rm DWF}(x,s) \\,, \\\\\n",
    "J_\\mu^{\\rm DWF, 4d, 5}(x) &=J_\\mu^{\\rm DWF, 4d, left}(x) -  J_\\mu^{\\rm DWF, 4d, right}(x)\\,.\n",
    "\\end{align}\n",
    "$$\n",
    "From this follows the domain-wall axial ward identity\n",
    "$$\n",
    "\\begin{align}\n",
    "\\overleftarrow{\\partial_\\mu} J_\\mu^{\\rm DWF, 4d, 5}(x) &= -2 j_5^{\\rm DWF}(x,L_s) + 2 j_5^{\\rm DWF}(x,L_s/2) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "The first current on the right-hand side corresponds to\n",
    "$$\n",
    "\\begin{align}\n",
    "j_5^{\\rm DWF}(x,L_s) &= - m \\bar{q}(x) \\gamma_5 q(x) \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "The second current measures the residual chiral symmetry breaking for finite $L_s$.  This corresponds to the\n",
    " **residual mass** of domain-wall fermions.  For modern calculations these residual masses are of order $10^{-4}$ or $10^{-5}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "424750e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "D_w = g.qcd.fermion.wilson_clover(U_rnd, mass=-1.8, csw_r=0.0, csw_t=0.0, nu=1.0, xi_0=1.0,\n",
    "                                isAnisotropic=False,\n",
    "                                boundary_phases=[1,1,1,-1])\n",
    "\n",
    "D_dwf = g.qcd.fermion.mobius(U_rnd, M5=1.8, mass=0.1, Ls=12, b=1.5, c=0.5, \n",
    "                             boundary_phases=[1,1,1,-1])\n",
    "\n",
    "src = g.mspincolor(U_rnd[0].grid)\n",
    "g.create.point(src, [1,0,0,0])\n",
    "cg = inv.cg({\"eps\": 1e-9, \"maxiter\": 1000})\n",
    "invD = D_dwf.bulk_propagator(inv.preconditioned(pc.eo1_ne(), cg))\n",
    "\n",
    "prop = g(invD * src)\n",
    "#prop = g(invD * D_dwf.ImportPhysicalFermionSource * src)\n",
    "#inv.preconditioned(pc.eo1_ne(), cg)\n",
    "# TODO: first discuss 5d Gamma-5 hermiticity"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b22f3562",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{align}\n",
    "q_L &= P_- \\psi_1 \\,, & q_R &= P_+ \\psi_{L_s} \\,, & q &= q_L + q_R \\\\\n",
    "\\bar q_L &= \\bar\\psi_{L_s} (-D_-) P_+ \\,, & \\bar q_R &= \\bar\\psi_{1} (-D_-) P_- & \\bar q &= \\bar{q}_L + \\bar{q}_R \\,.\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "\\langle \\psi\\bar{q}\\Gamma q\\bar{\\psi} \\rangle =\n",
    "\\langle \\psi\\bar{\\psi}\\rangle (-D_-) \\bar{P} \\Gamma P \\langle \\psi\\bar{\\psi} \\rangle \n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "b53debdd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :   58211.897432 s : cg: iteration 0: 2.202411e+07 / 1.418691e-10\n",
      "GPT :   58211.923757 s : cg: iteration 1: 5.312684e+06 / 1.418691e-10\n",
      "GPT :   58211.956349 s : cg: iteration 2: 1.726483e+06 / 1.418691e-10\n",
      "GPT :   58211.988393 s : cg: iteration 3: 6.888980e+05 / 1.418691e-10\n",
      "GPT :   58212.024988 s : cg: iteration 4: 2.804072e+05 / 1.418691e-10\n",
      "GPT :   58212.062706 s : cg: iteration 5: 1.315746e+05 / 1.418691e-10\n",
      "GPT :   58212.098438 s : cg: iteration 6: 5.991755e+04 / 1.418691e-10\n",
      "GPT :   58212.137956 s : cg: iteration 7: 3.040094e+04 / 1.418691e-10\n",
      "GPT :   58212.173858 s : cg: iteration 8: 1.577698e+04 / 1.418691e-10\n",
      "GPT :   58212.210679 s : cg: iteration 9: 8.833351e+03 / 1.418691e-10\n",
      "GPT :   58212.248622 s : cg: iteration 10: 4.913932e+03 / 1.418691e-10\n",
      "GPT :   58212.286033 s : cg: iteration 11: 2.788112e+03 / 1.418691e-10\n",
      "GPT :   58212.322470 s : cg: iteration 12: 1.645698e+03 / 1.418691e-10\n",
      "GPT :   58212.358847 s : cg: iteration 13: 9.688578e+02 / 1.418691e-10\n",
      "GPT :   58212.394665 s : cg: iteration 14: 5.970286e+02 / 1.418691e-10\n",
      "GPT :   58212.432387 s : cg: iteration 15: 4.113252e+02 / 1.418691e-10\n",
      "GPT :   58212.471221 s : cg: iteration 16: 2.813187e+02 / 1.418691e-10\n",
      "GPT :   58212.506407 s : cg: iteration 17: 1.913160e+02 / 1.418691e-10\n",
      "GPT :   58212.545371 s : cg: iteration 18: 1.249638e+02 / 1.418691e-10\n",
      "GPT :   58212.580200 s : cg: iteration 19: 8.633711e+01 / 1.418691e-10\n",
      "GPT :   58212.616595 s : cg: iteration 20: 6.557036e+01 / 1.418691e-10\n",
      "GPT :   58212.652321 s : cg: iteration 21: 5.542382e+01 / 1.418691e-10\n",
      "GPT :   58212.688536 s : cg: iteration 22: 4.706772e+01 / 1.418691e-10\n",
      "GPT :   58212.724626 s : cg: iteration 23: 3.916843e+01 / 1.418691e-10\n",
      "GPT :   58212.760521 s : cg: iteration 24: 3.544855e+01 / 1.418691e-10\n",
      "GPT :   58212.795659 s : cg: iteration 25: 3.510840e+01 / 1.418691e-10\n",
      "GPT :   58212.832404 s : cg: iteration 26: 3.331810e+01 / 1.418691e-10\n",
      "GPT :   58212.869145 s : cg: iteration 27: 3.017491e+01 / 1.418691e-10\n",
      "GPT :   58212.906480 s : cg: iteration 28: 2.920309e+01 / 1.418691e-10\n",
      "GPT :   58212.947149 s : cg: iteration 29: 2.815355e+01 / 1.418691e-10\n",
      "GPT :   58212.983665 s : cg: iteration 30: 2.315154e+01 / 1.418691e-10\n",
      "GPT :   58213.023056 s : cg: iteration 31: 1.924410e+01 / 1.418691e-10\n",
      "GPT :   58213.057017 s : cg: iteration 32: 1.557772e+01 / 1.418691e-10\n",
      "GPT :   58213.097012 s : cg: iteration 33: 1.184432e+01 / 1.418691e-10\n",
      "GPT :   58213.131327 s : cg: iteration 34: 9.021179e+00 / 1.418691e-10\n",
      "GPT :   58213.167859 s : cg: iteration 35: 7.013720e+00 / 1.418691e-10\n",
      "GPT :   58213.203530 s : cg: iteration 36: 5.270697e+00 / 1.418691e-10\n",
      "GPT :   58213.238931 s : cg: iteration 37: 4.038425e+00 / 1.418691e-10\n",
      "GPT :   58213.275632 s : cg: iteration 38: 3.243681e+00 / 1.418691e-10\n",
      "GPT :   58213.309869 s : cg: iteration 39: 2.309687e+00 / 1.418691e-10\n",
      "GPT :   58213.346049 s : cg: iteration 40: 1.699295e+00 / 1.418691e-10\n",
      "GPT :   58213.382716 s : cg: iteration 41: 1.304594e+00 / 1.418691e-10\n",
      "GPT :   58213.417793 s : cg: iteration 42: 9.469796e-01 / 1.418691e-10\n",
      "GPT :   58213.452606 s : cg: iteration 43: 7.012050e-01 / 1.418691e-10\n",
      "GPT :   58213.486875 s : cg: iteration 44: 5.095387e-01 / 1.418691e-10\n",
      "GPT :   58213.525305 s : cg: iteration 45: 3.952718e-01 / 1.418691e-10\n",
      "GPT :   58213.560326 s : cg: iteration 46: 3.267909e-01 / 1.418691e-10\n",
      "GPT :   58213.599509 s : cg: iteration 47: 2.670515e-01 / 1.418691e-10\n",
      "GPT :   58213.638362 s : cg: iteration 48: 2.283742e-01 / 1.418691e-10\n",
      "GPT :   58213.674204 s : cg: iteration 49: 2.116531e-01 / 1.418691e-10\n",
      "GPT :   58213.710890 s : cg: iteration 50: 2.217771e-01 / 1.418691e-10\n",
      "GPT :   58213.743966 s : cg: iteration 51: 2.421812e-01 / 1.418691e-10\n",
      "GPT :   58213.781328 s : cg: iteration 52: 2.255819e-01 / 1.418691e-10\n",
      "GPT :   58213.814368 s : cg: iteration 53: 2.087119e-01 / 1.418691e-10\n",
      "GPT :   58213.847386 s : cg: iteration 54: 1.844820e-01 / 1.418691e-10\n",
      "GPT :   58213.882616 s : cg: iteration 55: 1.516327e-01 / 1.418691e-10\n",
      "GPT :   58213.918145 s : cg: iteration 56: 1.219690e-01 / 1.418691e-10\n",
      "GPT :   58213.955135 s : cg: iteration 57: 9.449011e-02 / 1.418691e-10\n",
      "GPT :   58213.991276 s : cg: iteration 58: 6.964766e-02 / 1.418691e-10\n",
      "GPT :   58214.029355 s : cg: iteration 59: 4.827851e-02 / 1.418691e-10\n",
      "GPT :   58214.063642 s : cg: iteration 60: 3.277311e-02 / 1.418691e-10\n",
      "GPT :   58214.098110 s : cg: iteration 61: 2.301075e-02 / 1.418691e-10\n",
      "GPT :   58214.135938 s : cg: iteration 62: 1.598068e-02 / 1.418691e-10\n",
      "GPT :   58214.169653 s : cg: iteration 63: 1.114899e-02 / 1.418691e-10\n",
      "GPT :   58214.208316 s : cg: iteration 64: 8.167370e-03 / 1.418691e-10\n",
      "GPT :   58214.242803 s : cg: iteration 65: 6.024267e-03 / 1.418691e-10\n",
      "GPT :   58214.281762 s : cg: iteration 66: 4.578524e-03 / 1.418691e-10\n",
      "GPT :   58214.316637 s : cg: iteration 67: 3.487379e-03 / 1.418691e-10\n",
      "GPT :   58214.352724 s : cg: iteration 68: 2.699488e-03 / 1.418691e-10\n",
      "GPT :   58214.388757 s : cg: iteration 69: 2.284561e-03 / 1.418691e-10\n",
      "GPT :   58214.422407 s : cg: iteration 70: 2.134252e-03 / 1.418691e-10\n",
      "GPT :   58214.459761 s : cg: iteration 71: 2.091098e-03 / 1.418691e-10\n",
      "GPT :   58214.491021 s : cg: iteration 72: 2.136099e-03 / 1.418691e-10\n",
      "GPT :   58214.529751 s : cg: iteration 73: 2.174970e-03 / 1.418691e-10\n",
      "GPT :   58214.563128 s : cg: iteration 74: 1.965991e-03 / 1.418691e-10\n",
      "GPT :   58214.596433 s : cg: iteration 75: 1.787866e-03 / 1.418691e-10\n",
      "GPT :   58214.632552 s : cg: iteration 76: 1.668386e-03 / 1.418691e-10\n",
      "GPT :   58214.666049 s : cg: iteration 77: 1.340445e-03 / 1.418691e-10\n",
      "GPT :   58214.704940 s : cg: iteration 78: 1.058356e-03 / 1.418691e-10\n",
      "GPT :   58214.740962 s : cg: iteration 79: 8.534024e-04 / 1.418691e-10\n",
      "GPT :   58214.777667 s : cg: iteration 80: 6.117287e-04 / 1.418691e-10\n",
      "GPT :   58214.815179 s : cg: iteration 81: 4.414577e-04 / 1.418691e-10\n",
      "GPT :   58214.849175 s : cg: iteration 82: 3.333651e-04 / 1.418691e-10\n",
      "GPT :   58214.886008 s : cg: iteration 83: 2.422032e-04 / 1.418691e-10\n",
      "GPT :   58214.919892 s : cg: iteration 84: 1.717283e-04 / 1.418691e-10\n",
      "GPT :   58214.959015 s : cg: iteration 85: 1.242395e-04 / 1.418691e-10\n",
      "GPT :   58214.993537 s : cg: iteration 86: 9.372097e-05 / 1.418691e-10\n",
      "GPT :   58215.034999 s : cg: iteration 87: 7.330767e-05 / 1.418691e-10\n",
      "GPT :   58215.076451 s : cg: iteration 88: 5.821452e-05 / 1.418691e-10\n",
      "GPT :   58215.112985 s : cg: iteration 89: 4.362652e-05 / 1.418691e-10\n",
      "GPT :   58215.154050 s : cg: iteration 90: 3.145243e-05 / 1.418691e-10\n",
      "GPT :   58215.196569 s : cg: iteration 91: 2.513932e-05 / 1.418691e-10\n",
      "GPT :   58215.230340 s : cg: iteration 92: 2.203589e-05 / 1.418691e-10\n",
      "GPT :   58215.271288 s : cg: iteration 93: 1.903159e-05 / 1.418691e-10\n",
      "GPT :   58215.317139 s : cg: iteration 94: 1.660660e-05 / 1.418691e-10\n",
      "GPT :   58215.357441 s : cg: iteration 95: 1.496033e-05 / 1.418691e-10\n",
      "GPT :   58215.391757 s : cg: iteration 96: 1.444024e-05 / 1.418691e-10\n",
      "GPT :   58215.426384 s : cg: iteration 97: 1.450029e-05 / 1.418691e-10\n",
      "GPT :   58215.463675 s : cg: iteration 98: 1.341707e-05 / 1.418691e-10\n",
      "GPT :   58215.496824 s : cg: iteration 99: 1.219021e-05 / 1.418691e-10\n",
      "GPT :   58215.531658 s : cg: iteration 100: 1.134627e-05 / 1.418691e-10\n",
      "GPT :   58215.568427 s : cg: iteration 101: 1.036746e-05 / 1.418691e-10\n",
      "GPT :   58215.600954 s : cg: iteration 102: 8.374553e-06 / 1.418691e-10\n",
      "GPT :   58215.636285 s : cg: iteration 103: 6.139290e-06 / 1.418691e-10\n",
      "GPT :   58215.672240 s : cg: iteration 104: 4.503940e-06 / 1.418691e-10\n",
      "GPT :   58215.707880 s : cg: iteration 105: 3.242411e-06 / 1.418691e-10\n",
      "GPT :   58215.744595 s : cg: iteration 106: 2.181438e-06 / 1.418691e-10\n",
      "GPT :   58215.778360 s : cg: iteration 107: 1.460245e-06 / 1.418691e-10\n",
      "GPT :   58215.815683 s : cg: iteration 108: 1.059289e-06 / 1.418691e-10\n",
      "GPT :   58215.849074 s : cg: iteration 109: 7.567011e-07 / 1.418691e-10\n",
      "GPT :   58215.885919 s : cg: iteration 110: 4.922791e-07 / 1.418691e-10\n",
      "GPT :   58215.921771 s : cg: iteration 111: 3.507766e-07 / 1.418691e-10\n",
      "GPT :   58215.956850 s : cg: iteration 112: 2.731455e-07 / 1.418691e-10\n",
      "GPT :   58215.995727 s : cg: iteration 113: 2.185314e-07 / 1.418691e-10\n",
      "GPT :   58216.038138 s : cg: iteration 114: 1.865807e-07 / 1.418691e-10\n",
      "GPT :   58216.078073 s : cg: iteration 115: 1.582089e-07 / 1.418691e-10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPT :   58216.121324 s : cg: iteration 116: 1.437802e-07 / 1.418691e-10\n",
      "GPT :   58216.163979 s : cg: iteration 117: 1.461678e-07 / 1.418691e-10\n",
      "GPT :   58216.197931 s : cg: iteration 118: 1.446564e-07 / 1.418691e-10\n",
      "GPT :   58216.230854 s : cg: iteration 119: 1.357581e-07 / 1.418691e-10\n",
      "GPT :   58216.264952 s : cg: iteration 120: 1.277107e-07 / 1.418691e-10\n",
      "GPT :   58216.300345 s : cg: iteration 121: 1.171745e-07 / 1.418691e-10\n",
      "GPT :   58216.332755 s : cg: iteration 122: 1.042156e-07 / 1.418691e-10\n",
      "GPT :   58216.365923 s : cg: iteration 123: 9.019872e-08 / 1.418691e-10\n",
      "GPT :   58216.398912 s : cg: iteration 124: 7.122664e-08 / 1.418691e-10\n",
      "GPT :   58216.431416 s : cg: iteration 125: 5.169487e-08 / 1.418691e-10\n",
      "GPT :   58216.465844 s : cg: iteration 126: 3.785981e-08 / 1.418691e-10\n",
      "GPT :   58216.498837 s : cg: iteration 127: 2.789881e-08 / 1.418691e-10\n",
      "GPT :   58216.532891 s : cg: iteration 128: 2.000441e-08 / 1.418691e-10\n",
      "GPT :   58216.565243 s : cg: iteration 129: 1.497193e-08 / 1.418691e-10\n",
      "GPT :   58216.600145 s : cg: iteration 130: 1.113561e-08 / 1.418691e-10\n",
      "GPT :   58216.632918 s : cg: iteration 131: 7.661028e-09 / 1.418691e-10\n",
      "GPT :   58216.665907 s : cg: iteration 132: 5.563641e-09 / 1.418691e-10\n",
      "GPT :   58216.698311 s : cg: iteration 133: 4.356843e-09 / 1.418691e-10\n",
      "GPT :   58216.733328 s : cg: iteration 134: 3.356765e-09 / 1.418691e-10\n",
      "GPT :   58216.771571 s : cg: iteration 135: 2.584895e-09 / 1.418691e-10\n",
      "GPT :   58216.809073 s : cg: iteration 136: 2.066487e-09 / 1.418691e-10\n",
      "GPT :   58216.853396 s : cg: iteration 137: 1.795182e-09 / 1.418691e-10\n",
      "GPT :   58216.892171 s : cg: iteration 138: 1.618207e-09 / 1.418691e-10\n",
      "GPT :   58216.935180 s : cg: iteration 139: 1.327603e-09 / 1.418691e-10\n",
      "GPT :   58216.977170 s : cg: iteration 140: 1.159867e-09 / 1.418691e-10\n",
      "GPT :   58217.015602 s : cg: iteration 141: 1.058597e-09 / 1.418691e-10\n",
      "GPT :   58217.058742 s : cg: iteration 142: 9.784659e-10 / 1.418691e-10\n",
      "GPT :   58217.103906 s : cg: iteration 143: 9.714124e-10 / 1.418691e-10\n",
      "GPT :   58217.149447 s : cg: iteration 144: 9.651181e-10 / 1.418691e-10\n",
      "GPT :   58217.187425 s : cg: iteration 145: 8.291485e-10 / 1.418691e-10\n",
      "GPT :   58217.228496 s : cg: iteration 146: 7.115612e-10 / 1.418691e-10\n",
      "GPT :   58217.265219 s : cg: iteration 147: 6.191710e-10 / 1.418691e-10\n",
      "GPT :   58217.304433 s : cg: iteration 148: 5.079246e-10 / 1.418691e-10\n",
      "GPT :   58217.348382 s : cg: iteration 149: 3.895019e-10 / 1.418691e-10\n",
      "GPT :   58217.381376 s : cg: iteration 150: 3.022021e-10 / 1.418691e-10\n",
      "GPT :   58217.416667 s : cg: iteration 151: 2.275574e-10 / 1.418691e-10\n",
      "GPT :   58217.449164 s : cg: iteration 152: 1.576711e-10 / 1.418691e-10\n",
      "GPT :   58217.484652 s : cg: iteration 153: 1.067313e-10 / 1.418691e-10\n",
      "GPT :   58217.630415 s : (-7.891172705659715e-09+2.657322559449351e-09j)\n"
     ]
    }
   ],
   "source": [
    "rhs = g.vspincolor(D_dwf.F_grid)\n",
    "lhs = g.vspincolor(D_dwf.F_grid)\n",
    "rng.cnormal([rhs,lhs]);\n",
    "\n",
    "g.default.set_verbose(\"cg_convergence\", True)\n",
    "inverter = inv.cg({\"eps\": 1e-9, \"maxiter\": 1000})\n",
    "\n",
    "def _Gamma5(dst, src):\n",
    "    dst @= g.gamma[5] * g.merge(list(reversed(g.separate(inverter(g.adj(D_dwf.Dminus)*D_dwf.Dminus) * g.adj(D_dwf.Dminus) * src, 0))),0)\n",
    "\n",
    "def _Gamma5_inv(dst, src):\n",
    "    dst @= D_dwf.Dminus * g.merge(list(reversed(g.separate(g.gamma[5] * src, 0))),0)\n",
    "    \n",
    "Gamma5 = g.matrix_operator(mat=_Gamma5, inv_mat=_Gamma5_inv)\n",
    "\n",
    "a = g.inner_product(rhs, D_dwf * lhs)\n",
    "b = g.inner_product(lhs, Gamma5 * D_dwf * g.inv(Gamma5) * rhs)\n",
    "\n",
    "# Gamma5^-1 D^dag = D Gamma5^-1\n",
    "\n",
    "# D = Gamma5^-1^dag D^dag Gamma5^dag\n",
    "\n",
    "# Gamma5^dag D Gamma5^dag^-1 = D^dag\n",
    "\n",
    "# ⟨𝜓𝜓¯⟩(−𝐷−)\n",
    "# ⟨𝜓𝜓¯⟩^dag = Gamma5 ⟨𝜓𝜓¯⟩(−𝐷−) inv(−𝐷−) inv(Gamma5)\n",
    "\n",
    "g.message((a - b.conjugate())/(a + b.conjugate()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "33a3ed23",
   "metadata": {},
   "outputs": [],
   "source": [
    "def conserved_current_mobius(psi, bar_psi, mu):\n",
    "    psi_s = g.separate(psi, 0)\n",
    "    bar_psi_s = g.separate(bar_psi, 0)\n",
    "    Ls = len(psi_s)\n",
    "    b = D_dwf.params[\"b\"]\n",
    "    c = D_dwf.params[\"c\"]\n",
    "    m = D_dwf.params[\"mass\"]\n",
    "    Pp = (g.gamma[\"I\"].tensor() + g.gamma[5].tensor()) * 0.5\n",
    "    Pm = (g.gamma[\"I\"].tensor() - g.gamma[5].tensor()) * 0.5\n",
    "    dst = g.lattice(psi_s[0])\n",
    "    dst[:] = 0\n",
    "    for s in range(Ls):\n",
    "        dst += b*D_w.conserved_vector_current(psi_s[s], bar_psi_s[s], mu)\n",
    "    for s in range(1, Ls):\n",
    "        dst += c*D_w.conserved_vector_current(g(Pp*psi_s[s-1]), bar_psi_s[s], mu)\n",
    "    for s in range(Ls-1):\n",
    "        dst += c*D_w.conserved_vector_current(g(Pm*psi_s[s+1]), bar_psi_s[s], mu)\n",
    "    dst -= m*c*(\n",
    "        D_w.conserved_vector_current(g(Pp*psi_s[Ls-1]), bar_psi_s[0], mu)\n",
    "        + D_w.conserved_vector_current(g(Pm*psi_s[0]), bar_psi_s[Ls-1], mu)\n",
    "    )\n",
    "    return dst\n",
    "\n",
    "def divergence(f, b, current):\n",
    "    resN = None\n",
    "    \n",
    "    for mu in range(4):\n",
    "        c_mu = current(f, b, mu)\n",
    "        res = g(c_mu - g.cshift(c_mu,mu,-1))\n",
    "        if resN is None:\n",
    "            resN = res\n",
    "        else:\n",
    "            resN += res\n",
    "\n",
    "    g.message(g.norm2(resN[1,0,0,0]))\n",
    "    g.message(g.norm2(resN[1,0,0,3]))\n",
    "    return g.norm2(resN)\n",
    "\n",
    "g.message(\"div(J_conserved)\",\n",
    "          divergence(prop, prop_bar, conserved_current_mobius))"
   ]
  }
 ],
 "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
}
