{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Wang Landau algorithm\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"The algorithm is very useful for studing the phase transition phenomena because it does not suffer from the critical slowing down and gives direct access to thermodynamic potential and its derivatives\n",
"\n",
"\n",
"\n",
"Consider the 4-site Ising model.\n",
"\n",
"\n",
"\n",
"\n",
"Many energy levels are highly degenerate.\n",
"\n",
"In case of periodic boundary conditions, the allowed energy levels of\n",
"the ising model are: $-2J N$, $-2J (N-4)$, $-2J(N-6)$,$-2J(N-8)$\n",
"... $2J N$. The number of\n",
"energy levels is of the order of $N$ while the number of all possible\n",
"states is $2^N$. Therefore many states have to be heavily\n",
"degenerate. In Markov-chain simulation at certain low temperature $T$, most of\n",
"states visited have the same energy close to $\\langle E \\rangle$ ( the\n",
"probability for a state is $e^{-E/T}$).\n",
"\n",
"\n",
"The classical MC simulation generates canonical distribution at a\n",
"given temperature $P(E) \\propto g(E)e^{-E/T}$. The idea of Wang-Landau is\n",
"to estimate the many-body density of states $g(E)$ directly. The\n",
"temperature is not required for the simulation and by analyzing $g(E)$\n",
"one can study thermodynamics at *any* temperature.\n",
"\n",
"\n",
"If the density of state $g(E)$ is known, the free energy is simply given by \n",
"\\begin{equation}\n",
" F(T) = -k_B T \\log (Z) = -k_B T\n",
" \\log{\\sum_E g(E) e^{-E/T}}\n",
"\\end{equation}\n",
"\n",
"In the Wang-Landau algorithm the random walk in energy space is\n",
"performed and the probability to visit a state with energy $E$ is\n",
"taken to be $P\\propto \\frac{1}{g(E)}$. The resulting histogram \n",
"$H(E) \\propto g(E)P(E) \\propto const$ is therefore flat in the\n",
"simulation.\n",
"\n",
"In our example above, a simple random walk would visit a state with $E=0$\n",
"six-times more often than the other two states since there are\n",
"six-times more states at $E=0$. If we assign probability for the state\n",
"at $E=-4J$ to be proportional to $1/2$, at $E=0$ to $1/12$ and at\n",
"$E=4J$ to be $1/2$, we will visit all three states on average the same\n",
"number of times. Hence the histogram of visits is flat.\n",
"\n",
"\n",
"Let us sketch of the algorithm which generates the density of states\n",
"$g(E)$.\n",
"\n",
"The transition probability is taken to be\n",
"\\begin{equation}\n",
" P(E_1\\rightarrow E_2) = min\\left[\\frac{g(E_1)}{g(E_2)},1\\right].\n",
"\\label{Ptr}\n",
"\\end{equation}\n",
"We always accept moves with smaller density of states but we often\n",
"reject moves that would bring us to the state with high density of states.\n",
"\n",
"\n",
"\n",
"\n",
"- Start with $g(E)=1$ for all energies of the model.\n",
"- Try to flip a random spin and accept the move according to\n",
" probability $P(E_1\\rightarrow E_2)$.\n",
"- Every time we accept a move, the density of states for the\n",
" current energy is updated by multiplying the existing value $g(E)$\n",
" by a modification factor $f>1$, i.e., $g(E)\\rightarrow g(E) f$. \n",
" \n",
" This modification factor serves like a temperature in the simulated\n",
" annealing algorithm. At the beginning it is taken to be relatively\n",
" large $f\\sim e^1 =2.71828$ and later it is reduced to unity. Because\n",
" of this large factor, the density of states will grow very fast for\n",
" highly degenerate states and we will quickly visit all possible\n",
" energies. However, the density of states obtained by large $f$ is\n",
" not very accurate. The error is equal to $\\log(f)$.\n",
"\n",
"- The simulation at certain modification factor $f$ is running for\n",
" so long that the histogram becomes flat, i.e., each energy level was\n",
" visited equal number of times. Here equal means that the deviation\n",
" is within certain bound, like 80-90\\%.\n",
" \n",
"- At that point, the histogram is reset to zero $H(E)=0$ and a new\n",
" random walk is started with finer modification factor (like $f_1\n",
" =\\sqrt{f_0}$).\n",
" \n",
"- The simulation is again running so long that the histogram\n",
" becomes flat. After that, the histogram is again reset and\n",
" modification factor is reduced.\n",
"\n",
"- When the modification factor $f$ becomes sufficiently close to\n",
" unity, the density of states does not change anymore. \n",
" **If we are able to obtain a flat histogram using converged $g(E)$ in\n",
" $P(E_1\\rightarrow E_2)$, the density of states $g(E)$ is obviously the true\n",
" density of states of the model.**\n",
" \n",
"\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Wang-Landau simulation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from numpy import *\n",
"from numpy import random\n",
"from numba import jit\n",
"\n",
"@jit(nopython=True)\n",
"def CEnergy(latt):\n",
" \"Energy of configuration for the 2D Ising model\"\n",
" N = shape(latt)[0]\n",
" Ene = 0\n",
" for i in range(len(latt)):\n",
" for j in range(len(latt)):\n",
" S = latt[i,j] # Spin, can be either +1 or -1\n",
" WF = latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]\n",
" Ene += -S * WF\n",
" return Ene/2.\n",
"\n",
"def RandomL(N):\n",
" \"Random lattice corresponding to infinite temperature\"\n",
" return array(sign(2*random.random((N,N))-1),dtype=int) "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def PrepareEnergies(N):\n",
" Energies = (array(4*arange(-int(N*N/2),int(N*N/2)+1),dtype=int)).tolist() # -2 N^2...2N^2 in steps of 4\n",
" #Energies = range(-2*N*N,2*N*N,4)\n",
" Energies.pop(1) # take out E[1]\n",
" Energies.pop(-2) # take out E[-2]\n",
" Energies = array(Energies) # make array of energies again\n",
" Emin, Emax = Energies[0],Energies[-1]\n",
" #index array to energies\n",
" indE = -ones(Emax+1-Emin, dtype=int) # index table to get index to particular energy g(E)~g[indE[E]]\n",
" for i,E in enumerate(Energies):\n",
" indE[E-Emin]=i\n",
" # Ising lattice at infinite T\n",
" ## g(E) we know E = -2*N^2,2*N^2 in steps of 4...\n",
" return (Energies, indE, Emin)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Emin= -200\n",
"[-200 -192 -188 -184 -180 -176 -172 -168 -164 -160 -156 -152 -148 -144\n",
" -140 -136 -132 -128 -124 -120 -116 -112 -108 -104 -100 -96 -92 -88\n",
" -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32\n",
" -28 -24 -20 -16 -12 -8 -4 0 4 8 12 16 20 24\n",
" 28 32 36 40 44 48 52 56 60 64 68 72 76 80\n",
" 84 88 92 96 100 104 108 112 116 120 124 128 132 136\n",
" 140 144 148 152 156 160 164 168 172 176 180 184 188 192\n",
" 200]\n",
"[ 0 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 2 -1 -1 -1 3 -1 -1 -1 4 -1 -1 -1\n",
" 5 -1 -1 -1 6 -1 -1 -1 7 -1 -1 -1 8 -1 -1 -1 9 -1 -1 -1 10 -1 -1 -1\n",
" 11 -1 -1 -1 12 -1 -1 -1 13 -1 -1 -1 14 -1 -1 -1 15 -1 -1 -1 16 -1 -1 -1\n",
" 17 -1 -1 -1 18 -1 -1 -1 19 -1 -1 -1 20 -1 -1 -1 21 -1 -1 -1 22 -1 -1 -1\n",
" 23 -1 -1 -1 24 -1 -1 -1 25 -1 -1 -1 26 -1 -1 -1 27 -1 -1 -1 28 -1 -1 -1\n",
" 29 -1 -1 -1 30 -1 -1 -1 31 -1 -1 -1 32 -1 -1 -1 33 -1 -1 -1 34 -1 -1 -1\n",
" 35 -1 -1 -1 36 -1 -1 -1 37 -1 -1 -1 38 -1 -1 -1 39 -1 -1 -1 40 -1 -1 -1\n",
" 41 -1 -1 -1 42 -1 -1 -1 43 -1 -1 -1 44 -1 -1 -1 45 -1 -1 -1 46 -1 -1 -1\n",
" 47 -1 -1 -1 48 -1 -1 -1 49 -1 -1 -1 50 -1 -1 -1 51 -1 -1 -1 52 -1 -1 -1\n",
" 53 -1 -1 -1 54 -1 -1 -1 55 -1 -1 -1 56 -1 -1 -1 57 -1 -1 -1 58 -1 -1 -1\n",
" 59 -1 -1 -1 60 -1 -1 -1 61 -1 -1 -1 62 -1 -1 -1 63 -1 -1 -1 64 -1 -1 -1\n",
" 65 -1 -1 -1 66 -1 -1 -1 67 -1 -1 -1 68 -1 -1 -1 69 -1 -1 -1 70 -1 -1 -1\n",
" 71 -1 -1 -1 72 -1 -1 -1 73 -1 -1 -1 74 -1 -1 -1 75 -1 -1 -1 76 -1 -1 -1\n",
" 77 -1 -1 -1 78 -1 -1 -1 79 -1 -1 -1 80 -1 -1 -1 81 -1 -1 -1 82 -1 -1 -1\n",
" 83 -1 -1 -1 84 -1 -1 -1 85 -1 -1 -1 86 -1 -1 -1 87 -1 -1 -1 88 -1 -1 -1\n",
" 89 -1 -1 -1 90 -1 -1 -1 91 -1 -1 -1 92 -1 -1 -1 93 -1 -1 -1 94 -1 -1 -1\n",
" 95 -1 -1 -1 96 -1 -1 -1 97 -1 -1 -1 -1 -1 -1 -1 98]\n"
]
}
],
"source": [
"Ene,indE,Emin = PrepareEnergies(10)\n",
"print('Emin=',Emin)\n",
"print(Ene)\n",
"print(indE)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from numpy import random\n",
"def WangLandau(Nitt, N, flatness):\n",
" \"Wang Landau in Python\"\n",
" (Energies, indE, Emin) = PrepareEnergies(N)\n",
" latt = RandomL(N)\n",
" return RunWangLandau(Nitt,Energies,latt,indE)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"@jit(nopython=True)\n",
"def RunWangLandau(Nitt,Energies,latt,indE):\n",
" N = len(latt)\n",
" Ene = int(CEnergy(latt))\n",
" #min,maximum energy\n",
" Emin, Emax = Energies[0],Energies[-1]\n",
" # Logarithm of the density of states\n",
" lngE = zeros(len(Energies))\n",
" # Histogram\n",
" Hist = zeros(len(Energies))\n",
" # modification factor\n",
" lnf = 1.0 # f = exp(lnf)=e\n",
" N2 = N*N\n",
" for itt in range(Nitt):\n",
" t = int(random.rand()*N2)\n",
" (i, j) = (int(t/N), t%N)\n",
" S = latt[i,j]\n",
" WF = latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]\n",
" Enew = Ene + int(2*S*WF) # the energy change if we flip the spin\n",
" # P = g(E)/g(Enew) = exp(log(g(E))-log(g(Enew)))\n",
" # P = exp(lngE(E)-lngE(Enew))\n",
" lgnew = lngE[indE[Enew-Emin]] # log(g(Enew))\n",
" lgold = lngE[indE[Ene-Emin]] # log(g(Eold))\n",
" P = 1.0\n",
" if lgold-lgnew < 0 : P=exp(lgold-lgnew) # P = g_old/g_new = exp(log(g_old)-log(g_new))\n",
" if P > random.rand():\n",
" # accept the step\n",
" latt[i,j] = -S\n",
" Ene = Enew\n",
" Hist[indE[Ene-Emin]] += 1\n",
" lngE[indE[Ene-Emin]] += lnf # g(E) -> g(E)*f hence log(g(E)) -> log(g(E))+log(f)\n",
" \n",
" if (itt+1) % 1000 == 0: # checking for flatness of the histogram\n",
" aH = sum(Hist)/N2 # average\n",
" mH = min(Hist)\n",
" if mH > aH*flatness: # histogram is flat\n",
" Hist[:] = 0\n",
" lnf /= 2.\n",
" print(itt, 'histogram is flat', mH, aH, 'f=', exp(lnf))\n",
" return (lngE, Hist)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"68173999 histogram is flat 60078.0 66576.171875 f= 1.6487212707001282\n",
"79598999 histogram is flat 10059.0 11157.2265625 f= 1.2840254166877414\n",
"99577999 histogram is flat 17561.0 19510.7421875 f= 1.1331484530668263\n",
"114655999 histogram is flat 13267.0 14724.609375 f= 1.0644944589178593\n",
"130326999 histogram is flat 13789.0 15303.7109375 f= 1.0317434074991028\n",
"143994999 histogram is flat 12019.0 13347.65625 f= 1.0157477085866857\n",
"160480999 histogram is flat 14495.0 16099.609375 f= 1.007843097206448\n",
"181231999 histogram is flat 18260.0 20264.6484375 f= 1.0039138893383475\n",
"198768999 histogram is flat 15433.0 17125.9765625 f= 1.0019550335910028\n",
"229439999 histogram is flat 26985.0 29952.1484375 f= 1.0009770394924165\n",
"254823999 histogram is flat 22318.0 24789.0625 f= 1.0004884004786945\n",
"295870999 histogram is flat 36091.0 40084.9609375 f= 1.0002441704297478\n",
"349000999 histogram is flat 46699.0 51884.765625 f= 1.0001220777633837\n",
"489810999 histogram is flat 123760.0 137509.765625 f= 1.0000610370189331\n",
"712426999 histogram is flat 195665.0 217398.4375 f= 1.000030518043791\n",
"910861999 histogram is flat 174411.0 193784.1796875 f= 1.0000152589054785\n",
"Done\n"
]
}
],
"source": [
"from numpy import random\n",
"\n",
"flatness = 0.9\n",
"N = 32\n",
"Nitt = int(10e8)\n",
"\n",
"#N=10\n",
"#Nitt = int(10e6)\n",
"\n",
"(lngE, Hist) = WangLandau(Nitt, N, flatness)\n",
"print('Done')"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(80508.46934509277, 80507.8903503418)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lngE[0],lngE[-1]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Proper normalization of the Density of states\n",
"# g *= 4/(g[0]+g[-1]) = 4/(g[-1]*(1+g[0]/g[-1]))\n",
"# g = g * 4/(g[-1]*(1+g[0]/g[-1]))\n",
"# log(g) = log(g) + log(4)-log(g[-1]) - log(1+g[0]/g[-1])\n",
"# log(g) += log(4)-log(g[-1])-log(1+exp(log(g[0])-log(g[-1])))\n",
"# \n",
"if lngE[-1]>lngE[0]:\n",
" lgC = log(4)-lngE[-1]-log(1+exp(lngE[0]-lngE[-1]))\n",
"else:\n",
" lgC = log(4)-lngE[0]-log(1+exp(lngE[-1]-lngE[0]))\n",
"\n",
"lngE += lgC"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3.999999999984037, 2.5633442630349297, 1.4366557369491075)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"exp(lngE[0])+exp(lngE[-1]), exp(lngE[0]), exp(lngE[-1]) # g[0]+g[-1]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"