{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "VS Code: start as \n",
    "code . \n",
    "in directory dmc_project \n",
    "\n",
    "Timings:\n",
    "17s\n",
    "\n",
    "added free-slots\\\n",
    "18s\n",
    "\n",
    "passing eta\\\n",
    "17.6s\n",
    "\n",
    "F=Drift(r) -> Drift!(F,R)\\\n",
    "11.6s\n",
    "\n",
    "Rold to MMatrix\\\n",
    "12s\n",
    "\n",
    "major StaticArray use\\\n",
    "6.8s;\n",
    "\n",
    "internal timing:\\\n",
    "@time main 4.0s\n",
    "\n",
    "replacing global Ntry ... with ::VMCStats\\\n",
    "3.5s\n",
    "\n",
    "empty!(free_slots)\\\n",
    "3.3s\n",
    "\n",
    "Original: QMC course 2018\n",
    "Improved: FYSS5120 2026\n",
    "\n",
    "\n",
    " JULIA\n",
    "DMC on a helium atom with trial wave function\n",
    "$$\n",
    " \\varphi_T = e^{-\\alpha r_1}e^{-\\alpha r_2} \n",
    " $$  \n",
    " $r_1,r_2$ distance of els from proton\\\n",
    " electrons in spin-up and in spin-down states \n",
    "\n",
    "Measures only total energy\n",
    "Hamiltonian in a.u. (Z=2) :\n",
    "\n",
    "$$H = -\\frac{1}{2} (\\nabla_1^2 + \\nabla_2^2) - \\frac{2}{r_1} - \\frac{2}{r_2}+ \\frac{1}{r_{12}}$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "# Activate dmc_project and set project paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Executable: /home/vap/.julia/juliaup/julia-1.12.7+0.x64.linux.gnu/bin\n",
      "Active Environment: /home/vap/texst/opetus/FYSS5120_Efficient_Numerical_Programming/juliacodes/dmc_project/Project.toml\n",
      "Julia Version: 1.12.7\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m\u001b[1m  Activating\u001b[22m\u001b[39m project at `~/texst/opetus/FYSS5120_Efficient_Numerical_Programming/juliacodes/dmc_project`\n",
      "\u001b[32m\u001b[1m  Activating\u001b[22m\u001b[39m project at `~/texst/opetus/FYSS5120_Efficient_Numerical_Programming/juliacodes/dmc_project`\n"
     ]
    }
   ],
   "source": [
    "using Pkg\n",
    "# project is one up from this src file\n",
    "Pkg.activate(joinpath(@__DIR__, \"..\"))\n",
    "\n",
    "# just for checking:\n",
    "# 1. Get the path to the active Julia executable (should be juliaup global executable)\n",
    "println(\"Executable: \", Sys.BINDIR)\n",
    "\n",
    "# 2. Get the active environment/project path\n",
    "import Pkg\n",
    "println(\"Active Environment: \", Pkg.project().path)\n",
    "\n",
    "# 3. Get the exact Julia version\n",
    "println(\"Julia Version: \", VERSION)\n",
    "\n",
    "# make project runnable from anywhere, saving results to path RUNS_DIR \n",
    "const PROJECT_ROOT = normpath(joinpath(@__DIR__, \"..\"))\n",
    "const RUNS_DIR = joinpath(PROJECT_ROOT, \"runs\")\n",
    "\n",
    "Pkg.activate(PROJECT_ROOT)\n",
    "# install packages in Project.toml if not done yet\n",
    "Pkg.instantiate()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "using Printf\n",
    "using Distributions\n",
    "import LinearAlgebra: norm\n",
    "using Statistics\n",
    "using Random\n",
    "using StaticArrays\n",
    "using BenchmarkTools\n",
    "#using LoopVectorization # don't use this package, it is not compatible with the current version of Julia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "using Printf\n",
    "using Distributions\n",
    "import LinearAlgebra: norm\n",
    "using Statistics\n",
    "using Random\n",
    "using StaticArrays\n",
    "using BenchmarkTools\n",
    "using LoopVectorization\n",
    "\n",
    "#Random.seed!(1234)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "He atom DMC using algorithm of order 2\n"
     ]
    }
   ],
   "source": [
    "const order = 2   # 1 or 2\n",
    "println(\"He atom DMC using algorithm of order \",order)\n",
    "\n",
    "const lambda = 0.5       # hbar^2/(2m) in au\n",
    "const alpha = 27/16      # trial wafe function parameter\n",
    "const tau = 0.01        # imaginary time step\n",
    "const blocksize = 1000   # DMC data block size\n",
    "\n",
    "\n",
    "const NVMC = 1000        # number of VMC steps\n",
    "const NDMC = 10000       # number of DMC steps\n",
    "const Nwx = 20000        # max number of walkers\n",
    "const Nw_target = 1000   # on average this many walkers\n",
    "const kappa = 0.1        # how zealously DMC tries to keep Nw_target walkers\n",
    "const N = 2              # number of electrons\n",
    "const D = 3              # dimension\n",
    "const Eexact = -2.903724377  # accurate ground state energy, for comparison\n",
    "\n",
    "const DEAD  = 0\n",
    "const ALIVE = 1\n",
    "const CHILD = 2\n",
    "\n",
    "const minstep = 1e-5\n",
    "const maxstep = 10.0\n",
    "\n",
    "const Coord = MMatrix{D,N,Float64,D*N}\n",
    "\n",
    "mutable struct Walker\n",
    "    R     ::Coord\n",
    "    alive ::Int\n",
    "    psi   ::Float64\n",
    "    E     ::Float64\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "analytical energy in the trial wave function, for checking"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Eexpec (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "function Eexpec(alpha)\n",
    "    return alpha^2-27/8*alpha\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "local energy = $\\frac{H\\varphi_T}{\\varphi_T}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "@inline function Elocal(R::Coord)\n",
    "    x1, y1, z1 = R[1,1], R[2,1], R[3,1]\n",
    "    x2, y2, z2 = R[1,2], R[2,2], R[3,2]\n",
    "\n",
    "    r1  = sqrt(x1*x1 + y1*y1 + z1*z1)\n",
    "    r2  = sqrt(x2*x2 + y2*y2 + z2*z2)\n",
    "\n",
    "    dx  = x1 - x2\n",
    "    dy  = y1 - y2\n",
    "    dz  = z1 - z2\n",
    "    r12 = sqrt(dx*dx + dy*dy + dz*dz)\n",
    "\n",
    "    return -alpha^2 - (2-alpha)/r1 - (2-alpha)/r2 + 1/r12\n",
    "end\n",
    "\n",
    "mutable struct VMCStats\n",
    "    step::Float64\n",
    "    Naccept::Int\n",
    "    Ntry::Int\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Walker initialization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "init (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# initialization \n",
    "function init()\n",
    "    println(\"init\")\n",
    "    # \n",
    "    # Generate Nwx walker\n",
    "    #\n",
    "    walker = [Walker(zero(Coord),0,0.0,0.0) for i in 1:Nwx] # R, alive=0, psi=0, E=0\n",
    "    println(\"generating $Nw_target walkers\")\n",
    "    # set Nw_target walkers\n",
    "    for iw in 1:Nw_target\n",
    "        walker[iw].alive = 1\n",
    "        R = Coord(rand(D, N))        # coordinates\n",
    "        walker[iw].R = copy(R)\n",
    "        walker[iw].psi = ln_psi2(R)  # wave function (ln(psi^2))\n",
    "        walker[iw].E   = Elocal(R)        \n",
    "    end\n",
    "    vmcstat = VMCStats(3.1,0,0)\n",
    "    println(\"init done\")\n",
    "    walker, vmcstat\n",
    "end\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$ln(\\varphi_T^2) = 2\\ln(\\varphi_T)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "metro (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@inline function ln_psi2(R::Coord)\n",
    "    x1, y1, z1 = R[1,1], R[2,1], R[3,1]\n",
    "    x2, y2, z2 = R[1,2], R[2,2], R[3,2]\n",
    "\n",
    "    r1 = sqrt(x1*x1 + y1*y1 + z1*z1)\n",
    "    r2 = sqrt(x2*x2 + y2*y2 + z2*z2)\n",
    "\n",
    "    return -2*alpha*(r1+r2)\n",
    "end\n",
    "\n",
    "@inline function metro(Wold ::Float64, Wnew ::Float64)\n",
    "    if Wnew>Wold\n",
    "        return true\n",
    "    end\n",
    "    if rand()<exp(Wnew-Wold)\n",
    "        return true\n",
    "    else\n",
    "        return false\n",
    "    end\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One VMC step"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "vmc_step! (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "function vmc_step!(R::Coord, vmcstat::VMCStats)\n",
    "\n",
    "\n",
    "    psi = ln_psi2(R)\n",
    "    E   = Elocal(R)\n",
    "    step = vmcstat.step\n",
    "\n",
    "    @inbounds for i in 1:N\n",
    "        d1 = step*(rand() - 0.5)\n",
    "        d2 = step*(rand() - 0.5)\n",
    "        d3 = step*(rand() - 0.5)\n",
    "\n",
    "        R[1,i] += d1\n",
    "        R[2,i] += d2\n",
    "        R[3,i] += d3\n",
    "\n",
    "        psi_new = ln_psi2(R)\n",
    "        diff = psi_new - psi\n",
    "\n",
    "        vmcstat.Ntry += 1\n",
    "        accept = diff >= 0.0 || exp(diff) > rand()\n",
    "\n",
    "        if accept\n",
    "            vmcstat.Naccept += 1\n",
    "            psi = psi_new\n",
    "            E = Elocal(R)\n",
    "        else\n",
    "            R[1,i] -= d1\n",
    "            R[2,i] -= d2\n",
    "            R[3,i] -= d3\n",
    "        end\n",
    "    end\n",
    "\n",
    "    return psi, E\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adjust step to keep VMC acceptance 40-60 %"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "save_r (generic function with 2 methods)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "function adjust_step(vmcstat::VMCStats)\n",
    "    acceptance = vmcstat.Naccept/vmcstat.Ntry*100.0\n",
    "    if acceptance<40.0\n",
    "        vmcstat.step *= 0.9\n",
    "    end\n",
    "    if acceptance>60.0\n",
    "        vmcstat.step *= 1.1\n",
    "    end\n",
    "    vmcstat.step = max(minstep,vmcstat.step)\n",
    "    vmcstat.step = min(maxstep,vmcstat.step)\n",
    "end\n",
    "\n",
    "function save_R(R::Array{Float64,2},mode=\"w\")\n",
    "    open(\"R\",mode) do f\n",
    "        @inbounds for i in 1: size(R,2)\n",
    "            for k in 1:size(R,1)\n",
    "                print(f,R[k,i],\" \")\n",
    "            end\n",
    "            println(f,\" \")\n",
    "        end\n",
    "    end\n",
    "end\n",
    "\n",
    "function save_r(R::Array{Float64,2},mode=\"w\")\n",
    "    open(\"r\",mode) do f\n",
    "        rmin::Float64 = 1.e5\n",
    "        rr::Float64 = 0.0\n",
    "        @inbounds for i in 1: size(R,2)\n",
    "            rr = norm(R[:,i])\n",
    "            rmin  = min(rmin,rr)\n",
    "        end\n",
    "        println(f,rmin)\n",
    "    end\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DMC drift, for ith electron $F_i = 2\\nabla_i \\varphi_T /\\varphi_T$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Drift! (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@inline function Drift!(F::Coord, R::Coord)\n",
    "    x1, y1, z1 = R[1,1], R[2,1], R[3,1]\n",
    "    x2, y2, z2 = R[1,2], R[2,2], R[3,2]\n",
    "\n",
    "    r1 = sqrt(x1*x1 + y1*y1 + z1*z1)\n",
    "    r2 = sqrt(x2*x2 + y2*y2 + z2*z2)\n",
    "\n",
    "    c = -2*alpha\n",
    "\n",
    "    F[1,1] = c*x1/r1\n",
    "    F[2,1] = c*y1/r1\n",
    "    F[3,1] = c*z1/r1\n",
    "\n",
    "    F[1,2] = c*x2/r2\n",
    "    F[2,2] = c*y2/r2\n",
    "    F[3,2] = c*z2/r2\n",
    "\n",
    "    return nothing\n",
    "end"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "one diffusion+drift step in DMC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "lnG (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@inline function diffusion_drift_step!(R::Coord, F::Coord, R1::Coord, R2::Coord, eta::Coord)\n",
    "    if order == 1\n",
    "        randn!(eta)\n",
    "        Drift!(F, R)\n",
    "        @inbounds for j in 1:N, i in 1:D\n",
    "            R[i,j] += lambda*tau*F[i,j] + sqrt(2*lambda*tau)*eta[i,j]\n",
    "        end\n",
    "\n",
    "    elseif order == 2\n",
    "        randn!(eta)\n",
    "        @inbounds for j in 1:N, i in 1:D\n",
    "            R1[i,j] = R[i,j] + sqrt(lambda*tau)*eta[i,j]\n",
    "        end\n",
    "        Drift!(F, R1)\n",
    "        @inbounds for j in 1:N, i in 1:D\n",
    "            R2[i,j] = R1[i,j] + 0.5*lambda*tau*F[i,j]\n",
    "        end\n",
    "\n",
    "        Drift!(F, R2)\n",
    "        @inbounds for j in 1:N, i in 1:D\n",
    "            R[i,j] = R1[i,j] + lambda*tau*F[i,j]\n",
    "        end\n",
    "\n",
    "        randn!(eta)\n",
    "        @inbounds for j in 1:N, i in 1:D\n",
    "            R[i,j] += sqrt(lambda*tau)*eta[i,j]\n",
    "        end\n",
    "    end\n",
    "\n",
    "    return nothing\n",
    "end\n",
    "\n",
    "\n",
    "function lnG(Rnew::Coord, Rold::Coord, Fold::Coord)\n",
    "    if order != 1\n",
    "        println(\"lnG only for 1st order code\")\n",
    "        exit(1)\n",
    "    end\n",
    "\n",
    "    Drift!(Fold, Rold)\n",
    "\n",
    "    s = 0.0\n",
    "    @inbounds for j in 1:N, i in 1:D\n",
    "        x = Rnew[i,j] - Rold[i,j] - lambda*tau*Fold[i,j]\n",
    "        s += x*x\n",
    "    end\n",
    "\n",
    "    return -s / (4*lambda*tau)\n",
    "end\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "main (generic function with 1 method)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "\n",
    "function main()\n",
    "    #\n",
    "    # Main program \n",
    "    # \n",
    "    # initialize\n",
    "    walker, vmcstat = init()   \n",
    "    # thermalization\n",
    "    println(\"thermalizing\")\n",
    "    Nw = Nw_target # for VMC\n",
    "    @inbounds for i in 1:10\n",
    "       @inbounds for iw in 1:Nw         \n",
    "            psi,E = vmc_step!(walker[iw].R, vmcstat)\n",
    "            walker[iw].psi = psi\n",
    "            walker[iw].E   = E\n",
    "        end\n",
    "    end\n",
    "\n",
    "    println(\"thermalization done\")\n",
    "\n",
    "    filename = string(\"../runs/E_heatom_\",order,\"_tau=\",tau)\n",
    "    println(\"output: \",filename)\n",
    "    # init file output\n",
    "    open(filename,\"w\") do f\n",
    "        println(f,\" \")\n",
    "    end\n",
    "    #\n",
    "    # VMC\n",
    "    #\n",
    "    E_ave::Float64 = 0.0\n",
    "    nE::Int  = 0\n",
    "    @inbounds for ivmc in 1:NVMC\n",
    "        E = 0.0 \n",
    "        @inbounds for iw in 1:Nw         \n",
    "            psiw ,Ew = vmc_step!(walker[iw].R, vmcstat)\n",
    "            walker[iw].psi = psiw\n",
    "            walker[iw].E   = Ew\n",
    "            E += Ew \n",
    "        end\n",
    "        E_ave += E/Nw        \n",
    "        nE +=1\n",
    "        \n",
    "        if ivmc%10 == 0            \n",
    "            #println(\"VMC Elocal=$(E/Nw)  <E>=$(E_ave/nE)  <E>_analytical=$(Eexpec(alpha))\")\n",
    "            @printf(\"VMC  E = %.10f <E> = %.10f  <E>_analytical = %.10f\\n\",E/Nw,E_ave/nE, Eexpec(alpha))            \n",
    "        end\n",
    "        adjust_step(vmcstat)\n",
    "    end\n",
    "    \n",
    "    #\n",
    "    # DMC\n",
    "    #\n",
    "    ET::Float64 = E_ave/nE  # trial energy, to be updated\n",
    "    println(\"ET = $ET\")\n",
    "    \n",
    "    Ntherm = floor(Int,1.0/tau) # start DMC measurement after excitations have died out; system specific !\n",
    "    idmc::Int = -Ntherm\n",
    "\n",
    "    E_ave = 0.0\n",
    "    nE = 0\n",
    "    \n",
    "    Edat::Float64  = 0.0   # single block E \n",
    "    E2dat::Float64 = 0.0   # single block E^2\n",
    "    Ndat::Int = 0  \n",
    "\n",
    "    # block data\n",
    "    Eb = Array{Float64,1}() # block data E\n",
    "    E2b = Array{Float64,1}() # block data E^2\n",
    "    sizehint!(Eb, 1000)\n",
    "    sizehint!(E2b, 1000)\n",
    "\n",
    "    \n",
    "    idat::Int = 0 \n",
    "    copies = zeros(Int,Nwx)\n",
    "    Ntry::Int  = 0 \n",
    "    Nacc::Int  = 0 \n",
    "\n",
    "    Rold = zero(Coord)\n",
    "    F    = zero(Coord)\n",
    "    R1   = zero(Coord)\n",
    "    R2   = zero(Coord)\n",
    "    eta  = zero(Coord)\n",
    "    \n",
    "    free_slots = Int[]\n",
    "    sizehint!(free_slots, Nwx)\n",
    "\n",
    "    while idmc<NDMC\n",
    "        #\n",
    "        # take a DMC step in each walker\n",
    "        #\n",
    "        \n",
    "        E::Float64 = 0.0  \n",
    "        n::Int = 0\n",
    "        @inbounds for iw in 1:Nwx\n",
    "            copies[iw] = 0\n",
    "            if walker[iw].alive==0; continue; end  # not alive, skip\n",
    "            ELold = walker[iw].E\n",
    "            Rnew = walker[iw].R # alias\n",
    "            @inbounds Rold  .= Rnew\n",
    "            \n",
    "            #\n",
    "            diffusion_drift_step!(Rnew, F, R1, R2, eta)\n",
    "            # \n",
    "            EL = Elocal(Rnew)    \n",
    "\n",
    "            if order==1\n",
    "                # Metropolis accept/reject\n",
    "                Wnew = lnG(Rold, Rnew, F)+ln_psi2(Rnew)  # lnG(new->old) + lnpsi2(new)\n",
    "                Wold = lnG(Rnew, Rold, F)+ln_psi2(Rold)          # lnG(old->new) + lnpsi2(old)\n",
    "                accept = metro(Wold, Wnew)\n",
    "            else\n",
    "                accept = true\n",
    "            end\n",
    "            Ntry +=1\n",
    "            if accept\n",
    "                Nacc +=1\n",
    "                walker[iw].E = EL\n",
    "            else\n",
    "                EL = ELold\n",
    "                walker[iw].E = ELold\n",
    "                Rnew .= Rold                \n",
    "            end\n",
    "\n",
    "            E  += EL\n",
    "            n  += 1\n",
    "            if idat>0\n",
    "                Edat  += EL\n",
    "                E2dat += EL^2\n",
    "                Ndat  +=1  \n",
    "            end\n",
    "            \n",
    "            weight  = exp(-tau*(0.5*(ELold+EL)-ET))  # symmetric under R<->R'\n",
    "            copies[iw] = floor(Int,weight + rand()) \n",
    "        end\n",
    "\n",
    "        empty!(free_slots)\n",
    "        @inbounds for i in 1:Nwx\n",
    "            if walker[i].alive == 0\n",
    "                push!(free_slots, i)\n",
    "            end\n",
    "        end\n",
    "        \n",
    "        next_free = 1\n",
    "        # Branching\n",
    "        @inbounds for iw in 1:Nwx\n",
    "            if walker[iw].alive != 1; continue; end            \n",
    "            if copies[iw] == 1\n",
    "                continue\n",
    "            elseif copies[iw] == 0\n",
    "                walker[iw].alive = 0\n",
    "                continue\n",
    "            end\n",
    "            srcR = walker[iw].R\n",
    "            srcE = walker[iw].E\n",
    "            srcpsi = walker[iw].psi\n",
    "\n",
    "            for _ in 1:copies[iw]-1\n",
    "                if next_free > length(free_slots)\n",
    "                    break\n",
    "                end\n",
    "               \n",
    "                \n",
    "                inew = free_slots[next_free]\n",
    "                next_free += 1\n",
    "\n",
    "                walker[inew].R = copy(srcR)\n",
    "                walker[inew].E = srcE\n",
    "                walker[inew].psi = srcpsi\n",
    "                walker[inew].alive = 2\n",
    "            end\n",
    "        end\n",
    "        \n",
    "        @inbounds for iw in 1:Nwx\n",
    "            if walker[iw].alive == 2\n",
    "                walker[iw].alive =1\n",
    "            end\n",
    "        end\n",
    "\n",
    "        Nw = sum([walker[i].alive for i in 1:Nwx])\n",
    "        E_ave += E/n # don't use Nw as energy counter, it's not correct\n",
    "        nE += 1\n",
    "\n",
    "        idmc +=1\n",
    "        \n",
    "       \n",
    "        \n",
    "        if Nw==Nwx\n",
    "            println(\"hit max number of walkers\")\n",
    "            exit(1)\n",
    "        end\n",
    "\n",
    "        # update local energy; on average Nw_target walkers\n",
    "        # A too large factor kappa will cause a bad feedback, a too small will let number of walkers get too large\n",
    "        ET = E_ave/nE + kappa* log(Nw_target/Nw)\n",
    "\n",
    "        if idmc<=0\n",
    "            @printf(\"DMC %10d  E = %.10f <E> = %.10f ET = %.10f <E>_exact = %.10f  %6d Walkers \\n\",\n",
    "                    idmc, E/Nw, E_ave/nE, ET, Eexact, Nw)\n",
    "            if order==1;@printf(\"DMC acceptance = %.5f %%\\n\",Nacc*100.0/Ntry);end\n",
    "        end\n",
    "\n",
    "        # block data\n",
    "        # ==========\n",
    "        # screen and file output\n",
    "        if idat== blocksize            \n",
    "            push!(Eb,Edat/Ndat)\n",
    "            push!(E2b,E2dat/Ndat)\n",
    "            Eave::Float64 = mean(Eb)\n",
    "            EStdError::Float64 =  0.0 \n",
    "            if size(Eb,1)>1\n",
    "                EStdError  = std(Eb)/sqrt(size(Eb,1)) # sigma/sqrt(N) for N data points\n",
    "            end\n",
    "            @printf(\"DMC %10d E %.10f <E> = %.10f +/- %.10f ET = %.10f <E>_exact = %.10f  %6d Walkers \\n\",\n",
    "                    idmc, Edat/Ndat ,Eave, EStdError, ET, Eexact, Nw)\n",
    "            open(filename,\"a\") do f\n",
    "                println(f,tau,\" \",Eave,\" \",EStdError,\" \",Eexact)\n",
    "            end\n",
    "            \n",
    "            Edat  = 0\n",
    "            E2dat = 0\n",
    "            Ndat = 0\n",
    "            idat = 0\n",
    "            \n",
    "        end\n",
    "        \n",
    "        # \n",
    "        if idmc==0\n",
    "            println(\"THERMALIZATION ENDS\")\n",
    "            E_ave = 0\n",
    "            nE = 0\n",
    "            idat = 1\n",
    "        end\n",
    "        if idmc>0\n",
    "            idat += 1\n",
    "        end\n",
    "        \n",
    "    end\n",
    "end\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init\n",
      "generating 1000 walkers\n",
      "init done\n",
      "thermalizing\n",
      "thermalization done\n",
      "output: ../runs/E_heatom_2_tau=0.01\n",
      "VMC  E = -2.8271461737 <E> = -2.7989350800  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8383850895 <E> = -2.8077780476  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8525705009 <E> = -2.8166238477  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8598080681 <E> = -2.8225661382  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8538934399 <E> = -2.8284213535  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8395614220 <E> = -2.8338045684  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8544775688 <E> = -2.8361222928  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8782582433 <E> = -2.8397932024  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9044423892 <E> = -2.8403822288  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8829587528 <E> = -2.8439995022  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8645690730 <E> = -2.8463886465  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8284365856 <E> = -2.8474983281  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8763233929 <E> = -2.8476280974  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8302850914 <E> = -2.8473575695  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8275990885 <E> = -2.8437219945  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8085688292 <E> = -2.8418002832  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9007119878 <E> = -2.8432603110  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9236205975 <E> = -2.8462088166  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8074872120 <E> = -2.8467971589  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8520219887 <E> = -2.8460261694  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8545693551 <E> = -2.8462918782  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8619960652 <E> = -2.8465323938  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8585935318 <E> = -2.8465641525  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8745142669 <E> = -2.8471700179  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8541669406 <E> = -2.8470063433  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8402672385 <E> = -2.8459561508  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8348512562 <E> = -2.8458674630  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8682512198 <E> = -2.8448457902  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8138553519 <E> = -2.8445679826  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8519567280 <E> = -2.8453231994  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8358563018 <E> = -2.8460325317  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8550765207 <E> = -2.8449551426  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8525076852 <E> = -2.8445896707  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8327446753 <E> = -2.8452806105  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.7798754793 <E> = -2.8444825578  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8717510067 <E> = -2.8448342186  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8371197889 <E> = -2.8447998134  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8098321296 <E> = -2.8446420217  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8606193660 <E> = -2.8444391907  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8537797350 <E> = -2.8442329739  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8401811534 <E> = -2.8444631410  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9000848086 <E> = -2.8449354306  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8459843592 <E> = -2.8454700884  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8906630270 <E> = -2.8463930854  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.7968509228 <E> = -2.8465605299  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.7942528465 <E> = -2.8462725993  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8607013438 <E> = -2.8466567412  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8823526898 <E> = -2.8471476968  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8112747551 <E> = -2.8470969255  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8359567590 <E> = -2.8465557584  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8407789092 <E> = -2.8464112194  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8730470264 <E> = -2.8463671354  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8362858320 <E> = -2.8465636359  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8068979054 <E> = -2.8464470638  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8434821096 <E> = -2.8461637607  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8433920063 <E> = -2.8457513354  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8131876208 <E> = -2.8456085543  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8500609642 <E> = -2.8454646080  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8263536360 <E> = -2.8454341566  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8259626961 <E> = -2.8449001772  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8269611642 <E> = -2.8439522524  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8523777588 <E> = -2.8440733072  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8382226800 <E> = -2.8441896517  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8372433839 <E> = -2.8439554897  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8696764600 <E> = -2.8440137052  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8724319943 <E> = -2.8445086425  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8527859536 <E> = -2.8448492311  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8830340148 <E> = -2.8446080513  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8356574205 <E> = -2.8445176206  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8459247467 <E> = -2.8446728311  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8905162450 <E> = -2.8444983895  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8860247974 <E> = -2.8446308956  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8534636173 <E> = -2.8448380443  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8186491981 <E> = -2.8445991567  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9011420295 <E> = -2.8441992382  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8114946047 <E> = -2.8441648272  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8556242812 <E> = -2.8442804832  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8541169353 <E> = -2.8443064082  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8651648182 <E> = -2.8442514779  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8157358915 <E> = -2.8441562512  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8466200726 <E> = -2.8440540084  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8249586205 <E> = -2.8439676933  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8307088296 <E> = -2.8440047021  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8295121779 <E> = -2.8440189205  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8279937441 <E> = -2.8441700894  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8600991859 <E> = -2.8440116573  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8562944997 <E> = -2.8441934900  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8570683782 <E> = -2.8441737078  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8353658893 <E> = -2.8444490239  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8430467982 <E> = -2.8444777906  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8466304851 <E> = -2.8444355567  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.7965263275 <E> = -2.8443478344  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8278013069 <E> = -2.8440473823  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8167102740 <E> = -2.8439442576  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8190484169 <E> = -2.8437254497  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8552143998 <E> = -2.8437819565  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.9107176846 <E> = -2.8440288487  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8393354681 <E> = -2.8444142374  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.8466594057 <E> = -2.8441969817  <E>_analytical = -2.8476562500\n",
      "VMC  E = -2.7921117695 <E> = -2.8441927376  <E>_analytical = -2.8476562500\n",
      "ET = -2.8441927376249696\n",
      "DMC        -99  E = -2.8407078647 <E> = -2.8350264489 ET = -2.8348262487 <E>_exact = -2.9037243770     998 Walkers \n",
      "DMC        -98  E = -2.8727375790 <E> = -2.8538820140 ET = -2.8536818137 <E>_exact = -2.9037243770     998 Walkers \n",
      "DMC        -97  E = -2.8610732067 <E> = -2.8524566691 ET = -2.8518548619 <E>_exact = -2.9037243770     994 Walkers \n",
      "DMC        -96  E = -2.8360773275 <E> = -2.8490751329 ET = -2.8485738787 <E>_exact = -2.9037243770     995 Walkers \n",
      "DMC        -95  E = -2.8448088588 <E> = -2.8499373407 ET = -2.8497371404 <E>_exact = -2.9037243770     998 Walkers \n",
      "DMC        -94  E = -2.8666104491 <E> = -2.8536736438 ET = -2.8536736438 <E>_exact = -2.9037243770    1000 Walkers \n",
      "DMC        -93  E = -2.9078523534 <E> = -2.8601672370 ET = -2.8598667861 <E>_exact = -2.9037243770     997 Walkers \n",
      "DMC        -92  E = -2.8869310855 <E> = -2.8635127181 ET = -2.8632122672 <E>_exact = -2.9037243770     997 Walkers \n",
      "DMC        -91  E = -2.8194969730 <E> = -2.8595647400 ET = -2.8595647400 <E>_exact = -2.9037243770    1000 Walkers \n",
      "DMC        -90  E = -2.8527417197 <E> = -2.8585971638 ET = -2.8584971138 <E>_exact = -2.9037243770     999 Walkers \n",
      "DMC        -89  E = -2.8252775959 <E> = -2.8547968106 ET = -2.8543960085 <E>_exact = -2.9037243770     996 Walkers \n",
      "DMC        -88  E = -2.8302640151 <E> = -2.8541732263 ET = -2.8543730266 <E>_exact = -2.9037243770    1002 Walkers \n",
      "DMC        -87  E = -2.8382579486 <E> = -2.8527310824 ET = -2.8528310324 <E>_exact = -2.9037243770    1001 Walkers \n",
      "DMC        -86  E = -2.8668131200 <E> = -2.8529186710 ET = -2.8526182201 <E>_exact = -2.9037243770     997 Walkers \n",
      "DMC        -85  E = -2.8712498233 <E> = -2.8537567626 ET = -2.8532555084 <E>_exact = -2.9037243770     995 Walkers \n",
      "DMC        -84  E = -2.8838255391 <E> = -2.8558172060 ET = -2.8554164038 <E>_exact = -2.9037243770     996 Walkers \n",
      "DMC        -83  E = -2.9032387685 <E> = -2.8582637804 ET = -2.8576619732 <E>_exact = -2.9037243770     994 Walkers \n",
      "DMC        -82  E = -2.8873519531 <E> = -2.8595570366 ET = -2.8587538194 <E>_exact = -2.9037243770     992 Walkers \n",
      "DMC        -81  E = -2.8734456195 <E> = -2.8605929219 ET = -2.8599911146 <E>_exact = -2.9037243770     994 Walkers \n",
      "DMC        -80  E = -2.8902179177 <E> = -2.8619287885 ET = -2.8612263270 <E>_exact = -2.9037243770     993 Walkers \n",
      "DMC        -79  E = -2.9018985356 <E> = -2.8639712695 ET = -2.8633694623 <E>_exact = -2.9037243770     994 Walkers \n",
      "DMC        -78  E = -2.9151012138 <E> = -2.8664286623 ET = -2.8659274081 <E>_exact = -2.9037243770     995 Walkers \n",
      "DMC        -77  E = -2.9243344078 <E> = -2.8688185195 ET = -2.8682167123 <E>_exact = -2.9037243770     994 Walkers \n",
      "DMC        -76  E = -2.9569661713 <E> = -2.8727392396 ET = -2.8723384375 <E>_exact = -2.9037243770     996 Walkers \n",
      "DMC        -75  E = -2.9170620471 <E> = -2.8747464541 ET = -2.8745462538 <E>_exact = -2.9037243770     998 Walkers \n",
      "DMC        -74  E = -2.9214333957 <E> = -2.8768798697 ET = -2.8769798197 <E>_exact = -2.9037243770    1001 Walkers \n",
      "DMC        -73  E = -2.9076992327 <E> = -2.8781289125 ET = -2.8783287128 <E>_exact = -2.9037243770    1002 Walkers \n",
      "DMC        -72  E = -2.8896335220 <E> = -2.8787457819 ET = -2.8791449840 <E>_exact = -2.9037243770    1004 Walkers \n",
      "DMC        -71  E = -2.8380382833 <E> = -2.8773420750 ET = -2.8777412772 <E>_exact = -2.9037243770    1004 Walkers \n",
      "DMC        -70  E = -2.9235614510 <E> = -2.8788827209 ET = -2.8792819230 <E>_exact = -2.9037243770    1004 Walkers \n",
      "DMC        -69  E = -2.9323953127 <E> = -2.8807031501 ET = -2.8812019042 <E>_exact = -2.9037243770    1005 Walkers \n",
      "DMC        -68  E = -2.9502815097 <E> = -2.8827857362 ET = -2.8831849383 <E>_exact = -2.9037243770    1004 Walkers \n",
      "DMC        -67  E = -2.9264063955 <E> = -2.8841959000 ET = -2.8846946542 <E>_exact = -2.9037243770    1005 Walkers \n",
      "DMC        -66  E = -2.9076057617 <E> = -2.8849695177 ET = -2.8855677249 <E>_exact = -2.9037243770    1006 Walkers \n",
      "DMC        -65  E = -2.9033774088 <E> = -2.8854954575 ET = -2.8860936646 <E>_exact = -2.9037243770    1006 Walkers \n",
      "DMC        -64  E = -2.8618763581 <E> = -2.8851554611 ET = -2.8861504942 <E>_exact = -2.9037243770    1010 Walkers \n",
      "DMC        -63  E = -2.8580809099 <E> = -2.8848061196 ET = -2.8862949808 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -62  E = -2.8843878387 <E> = -2.8846455458 ET = -2.8859371683 <E>_exact = -2.9037243770    1013 Walkers \n",
      "DMC        -61  E = -2.8863274137 <E> = -2.8846886706 ET = -2.8859802932 <E>_exact = -2.9037243770    1013 Walkers \n",
      "DMC        -60  E = -2.9012104888 <E> = -2.8851733156 ET = -2.8865636061 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC        -59  E = -2.8902294741 <E> = -2.8855051969 ET = -2.8871909086 <E>_exact = -2.9037243770    1017 Walkers \n",
      "DMC        -58  E = -2.8923064386 <E> = -2.8855994179 ET = -2.8871867528 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC        -57  E = -2.8960444608 <E> = -2.8858423258 ET = -2.8874296608 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC        -56  E = -2.8322005758 <E> = -2.8848766133 ET = -2.8868568760 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -55  E = -2.8897342286 <E> = -2.8849845603 ET = -2.8869648230 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -54  E = -2.8595138234 <E> = -2.8843699041 ET = -2.8862520796 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -53  E = -2.9081093050 <E> = -2.8848749978 ET = -2.8867571732 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -52  E = -2.8611978746 <E> = -2.8843232275 ET = -2.8861072193 <E>_exact = -2.9037243770    1018 Walkers \n",
      "DMC        -51  E = -2.8795351800 <E> = -2.8844564200 ET = -2.8866325692 <E>_exact = -2.9037243770    1022 Walkers \n",
      "DMC        -50  E = -2.8848938420 <E> = -2.8843522568 ET = -2.8863325195 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -49  E = -2.8827616600 <E> = -2.8842656522 ET = -2.8861478276 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -48  E = -2.8651696466 <E> = -2.8838443493 ET = -2.8856283411 <E>_exact = -2.9037243770    1018 Walkers \n",
      "DMC        -47  E = -2.8645622528 <E> = -2.8834274434 ET = -2.8851131551 <E>_exact = -2.9037243770    1017 Walkers \n",
      "DMC        -46  E = -2.8419984298 <E> = -2.8826602395 ET = -2.8843459512 <E>_exact = -2.9037243770    1017 Walkers \n",
      "DMC        -45  E = -2.8957624022 <E> = -2.8827431502 ET = -2.8841334407 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC        -44  E = -2.8980407556 <E> = -2.8831183942 ET = -2.8847057291 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC        -43  E = -2.9065654779 <E> = -2.8833791785 ET = -2.8846708010 <E>_exact = -2.9037243770    1013 Walkers \n",
      "DMC        -42  E = -2.8815091995 <E> = -2.8833959811 ET = -2.8847862716 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC        -41  E = -2.8788436945 <E> = -2.8834631845 ET = -2.8851488962 <E>_exact = -2.9037243770    1017 Walkers \n",
      "DMC        -40  E = -2.8682050736 <E> = -2.8833969001 ET = -2.8854751540 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -39  E = -2.8584302303 <E> = -2.8828958190 ET = -2.8847779944 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -38  E = -2.8650553144 <E> = -2.8826080689 ET = -2.8844902443 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -37  E = -2.8497595090 <E> = -2.8820866632 ET = -2.8839688386 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -36  E = -2.8633361984 <E> = -2.8817936872 ET = -2.8836758626 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -35  E = -2.8393442239 <E> = -2.8812263540 ET = -2.8833046079 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -34  E = -2.8702544058 <E> = -2.8810601123 ET = -2.8831383663 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -33  E = -2.8688907392 <E> = -2.8808784799 ET = -2.8829567338 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -32  E = -2.8739098740 <E> = -2.8807346063 ET = -2.8827148690 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -31  E = -2.8709205408 <E> = -2.8805515818 ET = -2.8824337572 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -30  E = -2.8587173477 <E> = -2.8801995868 ET = -2.8819835786 <E>_exact = -2.9037243770    1018 Walkers \n",
      "DMC        -29  E = -2.8650295829 <E> = -2.8799859248 ET = -2.8817699166 <E>_exact = -2.9037243770    1018 Walkers \n",
      "DMC        -28  E = -2.8770915299 <E> = -2.8798279657 ET = -2.8813168269 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -27  E = -2.8887652669 <E> = -2.8798724198 ET = -2.8811640424 <E>_exact = -2.9037243770    1013 Walkers \n",
      "DMC        -26  E = -2.8937088067 <E> = -2.8799821933 ET = -2.8810761874 <E>_exact = -2.9037243770    1011 Walkers \n",
      "DMC        -25  E = -2.8952173946 <E> = -2.8803380609 ET = -2.8818269222 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -24  E = -2.8626110205 <E> = -2.8800677011 ET = -2.8814579916 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC        -23  E = -2.8939734454 <E> = -2.8802853603 ET = -2.8817742216 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -22  E = -2.8849496432 <E> = -2.8804180387 ET = -2.8821037504 <E>_exact = -2.9037243770    1017 Walkers \n",
      "DMC        -21  E = -2.9049918533 <E> = -2.8806567849 ET = -2.8821456461 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -20  E = -2.9230231149 <E> = -2.8811503662 ET = -2.8825406567 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC        -19  E = -2.8908277510 <E> = -2.8813050366 ET = -2.8827938978 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -18  E = -2.9118030914 <E> = -2.8816769641 ET = -2.8831658253 <E>_exact = -2.9037243770    1015 Walkers \n",
      "DMC        -17  E = -2.9411776420 <E> = -2.8824287519 ET = -2.8840160868 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC        -16  E = -2.9266318825 <E> = -2.8830921484 ET = -2.8850724111 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -15  E = -2.9405953711 <E> = -2.8837347400 ET = -2.8856169154 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -14  E = -2.9028998748 <E> = -2.8839575904 ET = -2.8858397658 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC        -13  E = -2.9432295919 <E> = -2.8847052766 ET = -2.8867835305 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -12  E = -2.8957357671 <E> = -2.8847983938 ET = -2.8867786565 <E>_exact = -2.9037243770    1020 Walkers \n",
      "DMC        -11  E = -2.9121085785 <E> = -2.8851373286 ET = -2.8872155825 <E>_exact = -2.9037243770    1021 Walkers \n",
      "DMC        -10  E = -2.9593989972 <E> = -2.8858980464 ET = -2.8877802219 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC         -9  E = -2.8923637759 <E> = -2.8859690984 ET = -2.8878512738 <E>_exact = -2.9037243770    1019 Walkers \n",
      "DMC         -8  E = -2.8711682168 <E> = -2.8857163399 ET = -2.8873036748 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC         -7  E = -2.9184505084 <E> = -2.8860683202 ET = -2.8876556552 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC         -6  E = -2.9261952415 <E> = -2.8864952024 ET = -2.8880825373 <E>_exact = -2.9037243770    1016 Walkers \n",
      "DMC         -5  E = -2.9050083854 <E> = -2.8867502729 ET = -2.8885342648 <E>_exact = -2.9037243770    1018 Walkers \n",
      "DMC         -4  E = -2.9009683748 <E> = -2.8867796417 ET = -2.8881699323 <E>_exact = -2.9037243770    1014 Walkers \n",
      "DMC         -3  E = -2.8843194034 <E> = -2.8866663043 ET = -2.8877602983 <E>_exact = -2.9037243770    1011 Walkers \n",
      "DMC         -2  E = -2.8836922080 <E> = -2.8866359564 ET = -2.8877299504 <E>_exact = -2.9037243770    1011 Walkers \n",
      "DMC         -1  E = -2.8949998424 <E> = -2.8866336674 ET = -2.8874304843 <E>_exact = -2.9037243770    1008 Walkers \n",
      "DMC          0  E = -2.8539971255 <E> = -2.8863073019 ET = -2.8871041189 <E>_exact = -2.9037243770    1008 Walkers \n",
      "THERMALIZATION ENDS\n",
      "DMC       1000 E -2.8956161693 <E> = -2.8956161693 +/- 0.0000000000 ET = -2.8910236480 <E>_exact = -2.9037243770     956 Walkers \n",
      "DMC       2000 E -2.8971913616 <E> = -2.8964037654 +/- 0.0007875962 ET = -2.9016003061 <E>_exact = -2.9037243770    1054 Walkers \n",
      "DMC       3000 E -2.8969027180 <E> = -2.8965700830 +/- 0.0004841805 ET = -2.8936907188 <E>_exact = -2.9037243770     972 Walkers \n",
      "DMC       4000 E -2.9001893349 <E> = -2.8974748959 +/- 0.0009674202 ET = -2.9006960107 <E>_exact = -2.9037243770    1033 Walkers \n",
      "DMC       5000 E -2.8921053402 <E> = -2.8964009848 +/- 0.0013095138 ET = -2.8997352725 <E>_exact = -2.9037243770    1034 Walkers \n",
      "DMC       6000 E -2.8957611892 <E> = -2.8962943522 +/- 0.0010745176 ET = -2.9052710795 <E>_exact = -2.9037243770    1094 Walkers \n",
      "DMC       7000 E -2.8938412421 <E> = -2.8959439079 +/- 0.0009734048 ET = -2.8958261608 <E>_exact = -2.9037243770     999 Walkers \n",
      "DMC       8000 E -2.8991620698 <E> = -2.8963461781 +/- 0.0009340552 ET = -2.9040995109 <E>_exact = -2.9037243770    1081 Walkers \n",
      "DMC       9000 E -2.8995416412 <E> = -2.8967012296 +/- 0.0008970177 ET = -2.9031510590 <E>_exact = -2.9037243770    1067 Walkers \n",
      "DMC      10000 E -2.8998603123 <E> = -2.8970171379 +/- 0.0008622707 ET = -2.9060570882 <E>_exact = -2.9037243770    1095 Walkers \n",
      "  3.311359 seconds (109.67 k allocations: 1.510 GiB, 4.56% gc time)\n"
     ]
    }
   ],
   "source": [
    "@time main()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.12.7",
   "language": "julia",
   "name": "julia-1.12"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 3
}
