# generate all spin states for 4x4 Ising model

import time
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

def ex_Ising(N,m):
    TS=[]
    for n in range(m):
        S=[]; 
        if(n<20): print('\n','n=',n,'S=\n',end='')
        for i in range(N):
            ni=int(n/2**i)%2
            if(n<20):
                if(i%4 != 3): print(ni,end=' ')
                else:  print(ni,end='\n')
            nii=ni*2-1
            S.append(nii)
        TS.append(S)
    print('N=',N,m,' len(TS)=',len(TS))
    return TS


# bond store the 2 sites connected by a bond; nnb stores 4 n.n.b. of a site
def SQL(L):
    N=L*L; nbo=N*2; bond=[[0,0] for i in range(nbo)]
    nn=0
    for j in range(L):
        for i in range(L):
            I=L*j+i; J=I+1; K=I+L
            bond[nn][0]=I; bond[nn][1]=J
            bond[N+nn][0]=I; bond[N+nn][1]=K
            if(i==L-1): J=L*j; bond[nn][0]=I; bond[nn][1]=J
            if(j==L-1): bond[N+nn][1]=bond[N+nn][1]-N
            nn+=1
    for i in range(nbo): print('i=',i,' bond=',bond[i][:])
    nnb=[[0,0,0,0] for i in range(N)];
    for i in range(N): nnb[i][0]=bond[i][1]; nnb[i][1]=bond[N+i][1]
    for i in range(N): i1=nnb[i][0]; i2=nnb[i][1]; nnb[i1][2]=i; nnb[i2][3]=i;
    for i in range(N): print('i=',i,' nnb=',nnb[i])
    return bond,nnb

L=4; N=L*L; m=2**N; nbo=N*2; 
print('L,N,nbo,m=',L,N,nbo,m)
TS=ex_Ising(N,m)
bond,nnb=SQL(L)
