def test_load(): print '\n[test_load]' shape = (nr,nc) # simple peps vec = np.load('data/peps_vec3by3.npy') peps0 = peps.aspeps(vec, (nr,nc), pdim, bond) ovlp,php = nAverage_fpeps3by3(peps0) print 'nAveraged=',ovlp,php,php/ovlp ovlp,etot = energy_fpeps3by3(peps0,0.0) print 'ovlp,etot=',ovlp,etot,etot/ovlp ne = 4.0 npts = 5 xts = np.array([(2.0*i-1.0)/(2*npts)*np.pi for i in range(1,npts+1)]) wts = np.array([np.pi/npts]*npts)*[np.exp(-1.j*x*ne) for x in xts] print '\nQuadrature[Chebyshev-Gauss]' print 'xts=',xts print 'wts=',wts def energy_fn2(vec, pdim, bond): P = peps.aspeps(vec, (nr,nc), pdim, bond) PP_tot = 0. PHP_tot = 0. for ipt in range(npts): PP,PHP = energy_fpeps3by3(P,xts[ipt]) PP_tot += PP*wts[ipt] PHP_tot += PHP*wts[ipt] #print ' PHP,PP',PHP,PP e = PHP_tot/PP_tot print ' PHP_tot,PP_tot=',PHP_tot,PP_tot print ' e_tot=',e return e def energy_fn(vec, pdim, bond): P = peps.aspeps(vec, (nr,nc), pdim, bond) PP,PHP = energy_fpeps3by3(P) e = PHP/PP print ' PHP,PP,PHP/PP,eav=',PHP,PP,e,e/(nr*nc) return PHP/PP def bound_energy_fn(vec): return energy_fn2(vec, pdim, bond) vec = peps.flatten(peps0) import scipy.optimize import autograd deriv = autograd.grad(bound_energy_fn) print 'nparams=',len(vec) def save_vec(vec): fname = 'peps_vec1_3by3' np.save(fname,vec) print ' --- save vec into fname=',fname return 0 # Optimize result = scipy.optimize.minimize(bound_energy_fn, jac=deriv, x0=vec,\ tol=1.e-3, callback=save_vec) P0 = peps.aspeps(result.x, (nr,nc), pdim, bond) print "final =",bound_energy_fn(peps.flatten(P0)) return 0
def test_plot(): elst = np.load('data/energy.npy') import matplotlib.pyplot as plt efci = -3.700331728271 plt.plot(np.log10(elst - efci), 'ro-') plt.savefig('data/convergence.pdf') plt.show() return 0
def test_opt(): print '\n[test_opt]' shape = (nr, nc) # simple peps vec = np.load('peps_vec1_3by3.npy') vec = vec / 5 peps0 = peps.aspeps(vec, (nr, nc), pdim, bond) bondL = bond + 1 pepsc = peps.random(peps0.shape, pdim, 1, fac=1.e-2) peps0 = peps.add(peps0, pepsc) ovlp, php = nAverage_fpeps3by3(peps0) print 'nAveraged=', ovlp, php, php / ovlp ovlp, etot = energy_fpeps3by3(peps0) print 'ovlp,etot=', ovlp, etot, etot / ovlp def energy_fn(vec, pdim, bondL): P = peps.aspeps(vec, (nr, nc), pdim, bondL) PP, PHP = energy_fpeps3by3(P) e = PHP / PP print ' PHP,PP,PHP/PP,eav=', PHP, PP, e, e / (nr * nc) return PHP / PP def bound_energy_fn(vec): return energy_fn(vec, pdim, bondL) vec = peps.flatten(peps0) import scipy.optimize import autograd deriv = autograd.grad(bound_energy_fn) print 'nparams=', len(vec) def save_vec(vec): fname = 'peps_vec2_3by3' np.save(fname, vec) print ' --- save vec into fname=', fname return 0 # Optimize result = scipy.optimize.minimize(bound_energy_fn, jac=deriv, x0=vec,\ tol=1.e-4, callback=save_vec) P0 = peps.aspeps(result.x, (nr, nc), pdim, bondL) print "final =", energy_fn(peps.flatten(P0), pdim, bondL) return 0
def test_load(): print '[test_load]' shape = (nr, nc) # simple peps vec = np.load('data/peps_vec2by2.npy') peps0 = peps.aspeps(vec, (nr, nc), pdim, bond) ovlp, etot = energy_fpeps2by2(peps0) ovlp, php = nAverage_fpeps2by2(peps0) print 'etot=', ovlp, etot, etot / ovlp print 'nAverage=', ovlp, php, php / ovlp exit() def energy_fn(vec, pdim, bond): P = peps.aspeps(vec, (nr, nc), pdim, bond) PP, PHP = energy_fpeps2by2(P) e = PHP / PP print ' PHP,PP,PHP/PP,eav=', PHP, PP, e, e / (nr * nc) return PHP / PP def bound_energy_fn(vec): return energy_fn(vec, pdim, bond) vec = peps.flatten(peps0) import scipy.optimize import autograd deriv = autograd.grad(bound_energy_fn) print 'nparams=', len(vec) elst = [] def save_vec(vec): fname = 'data/peps_vec1' np.save(fname, vec) e = bound_energy_fn(vec) elst.append(e) print ' --- save vec into fname=', fname, ' e=', e return 0 # Optimize result = scipy.optimize.minimize(bound_energy_fn, jac=deriv, x0=vec,\ tol=1.e-4, callback=save_vec) P0 = peps.aspeps(result.x, (nr, nc), pdim, bond) print "final =", energy_fn(peps.flatten(P0), pdim, bond) np.save('data/energy', elst) return 0