def test(natoms=40, boxl=4.0): import pele.potentials.ljpshiftfast as ljpshift from pele.optimize import mylbfgs from pele.utils.neighbor_list import makeBLJNeighborListPot ntypeA = int(natoms * 0.8) ntypeB = natoms - ntypeA rcut = 2.5 freezelist = range(ntypeA / 2) + range(ntypeA, ntypeA + ntypeB / 2) nfrozen = len(freezelist) print "nfrozen", nfrozen coords = np.random.uniform(-1, 1, natoms * 3) * (natoms) ** (1.0 / 3) / 2 NLblj = ljpshift.LJpshift(natoms, ntypeA, rcut=rcut, boxl=boxl) blj = FreezePot(NLblj, freezelist, natoms) pot = makeBLJNeighborListPotFreeze(natoms, freezelist, ntypeA=ntypeA, rcut=rcut, boxl=boxl) # pot = FreezePot(NLpot, freezelist) eblj = blj.getEnergy(coords) print "blj energy", eblj epot = pot.getEnergy(coords) print "mcpot energy", epot print "difference", (epot - eblj) / eblj pot.test_potential(coords) print "\n" ret1 = mylbfgs(coords, blj, iprint=-11) np.savetxt("out.coords", ret1.coords) print "energy from quench1", ret1.energy ret2 = mylbfgs(coords, pot, iprint=-1) print "energy from quench2", ret2.energy print "ret1 evaluated in both potentials", pot.getEnergy(ret1.coords), blj.getEnergy(ret1.coords) print "ret2 evaluated in both potentials", pot.getEnergy(ret2.coords), blj.getEnergy(ret2.coords) coords = ret1.coords e1, g1 = blj.getEnergyGradient(coords) e2, g2 = pot.getEnergyGradient(coords) print "energy difference from getEnergyGradient", (e2 - e1) print "largest gradient difference", np.max(np.abs(g2 - g1)) print "rms gradients", np.linalg.norm(g1) / np.sqrt(len(g1)), np.linalg.norm(g2) / np.sqrt(len(g1)) if True: for subpot in pot.pot.potentials: nl = subpot print "number of times neighbor list was remade:", nl.buildcount, "out of", nl.count if False: try: import pele.utils.pymolwrapper as pym pym.start() pym.draw_spheres(np.reshape(coords, [-1, 3]), "A", 1) pym.draw_spheres(np.reshape(ret1.coords, [-1, 3]), "A", 2) pym.draw_spheres(np.reshape(ret2.coords, [-1, 3]), "A", 3) except ImportError: print "Could not draw using pymol, skipping this step"
def test_align_improvement(self, verbose = True): np.random.seed(6) max_step = 10000 fail_counter = 0 ave = 0 ave_inc = 0 for i in range(max_step): if (i%100 == 0): print(i) self.x1 = self.get_random_configuration() self.x2diff = self.get_random_configuration() dist = self.measure.get_dist(self.x1, self.x2diff) dist2, x1, x2 = self.mindist(self.x1, self.x2diff) if(dist2 > dist): # if(i==10): fail_counter += 1 ave_inc += dist2 - dist if(verbose): print("x1", x1) print("old x2", self.x2diff) print("new x2", x2) # print "atomistic x1", self.topology.to_atomistic(x1).flatten() # print "atomistic x2", self.topology.to_atomistic(self.x2diff) # print "new atomistic x2", self.topology.to_atomistic(x2) print("dist", dist) print("dist2", dist2) print("i", i) try: import pele.utils.pymolwrapper as pym pym.start() x1 = self.topology.to_atomistic(x1) x2 = self.topology.to_atomistic(x2) self.x2diff = self.topology.to_atomistic(self.x2diff) pym.draw_rigid(x1, "A", 0.1, (1,0,0), self.system.draw_bonds) pym.draw_rigid(self.x2diff, "B", 0.1, (0,1,0), self.system.draw_bonds) pym.draw_rigid(x2, "C", 0.1, (0,0,1), self.system.draw_bonds) pym.draw_box(self.boxl, "D", 0.1) # pym.draw_rigid(x1[:self.nrigid*3], "A", 0.1, (1,0,0)) # pym.draw_rigid(self.x2diff[:self.nrigid*3], "B", 0.1, (0,1,0)) # pym.draw_rigid(x2[:self.nrigid*3], "C", 0.1, (0,0,1)) # pym.draw_box(self.boxl, "D", 0.1) except: print("Could not draw using pymol, skipping this step") else: ave += dist - dist2 ave = old_div(ave,max_step) if (fail_counter>0): ave_inc = old_div(ave_inc, fail_counter) print("average decrease in distance", ave) print("average increase in distance", ave_inc) self.assertFalse(fail_counter, "alignment failed %d times" % fail_counter)
def test_align_improvement(self, verbose = True): np.random.seed(6) max_step = 10000 fail_counter = 0 ave = 0 ave_inc = 0 for i in range(max_step): if (i%100 == 0): print(i) self.x1 = self.get_random_configuration() self.x2diff = self.get_random_configuration() dist = self.measure.get_dist(self.x1, self.x2diff) dist2, x1, x2 = self.mindist(self.x1, self.x2diff) if(dist2 > dist): # if(i==10): fail_counter += 1 ave_inc += dist2 - dist if(verbose): print("x1", x1) print("old x2", self.x2diff) print("new x2", x2) # print "atomistic x1", self.topology.to_atomistic(x1).flatten() # print "atomistic x2", self.topology.to_atomistic(self.x2diff) # print "new atomistic x2", self.topology.to_atomistic(x2) print("dist", dist) print("dist2", dist2) print("i", i) try: import pele.utils.pymolwrapper as pym pym.start() x1 = self.topology.to_atomistic(x1) x2 = self.topology.to_atomistic(x2) self.x2diff = self.topology.to_atomistic(self.x2diff) pym.draw_rigid(x1, "A", 0.1, (1,0,0), self.system.draw_bonds) pym.draw_rigid(self.x2diff, "B", 0.1, (0,1,0), self.system.draw_bonds) pym.draw_rigid(x2, "C", 0.1, (0,0,1), self.system.draw_bonds) pym.draw_box(self.boxl, "D", 0.1) # pym.draw_rigid(x1[:self.nrigid*3], "A", 0.1, (1,0,0)) # pym.draw_rigid(self.x2diff[:self.nrigid*3], "B", 0.1, (0,1,0)) # pym.draw_rigid(x2[:self.nrigid*3], "C", 0.1, (0,0,1)) # pym.draw_box(self.boxl, "D", 0.1) except: print("Could not draw using pymol, skipping this step") else: ave += dist - dist2 ave = ave/max_step if (fail_counter>0): ave_inc = ave_inc / fail_counter print("average decrease in distance", ave) print("average increase in distance", ave_inc) self.assertFalse(fail_counter, "alignment failed %d times" % fail_counter)
def runtest(X, pot, natoms = 100, iprint=-1): from _lbfgs_py import PrintEvent tol = 1e-5 maxstep = 0.005 Xinit = np.copy(X) e, g = pot.getEnergyGradient(X) print "energy", e lbfgs = LBFGS(X, pot, maxstep = 0.1, nsteps=10000, tol=tol, iprint=iprint, H0=2.) printevent = PrintEvent( "debugout.xyz") lbfgs.attachEvent(printevent) ret = lbfgs.run() print ret print "" print "now do the same with scipy lbfgs" from pele.optimize import lbfgs_scipy as quench ret = quench(Xinit, pot, tol = tol) print ret #print ret[1], ret[2], ret[3] if False: print "now do the same with scipy bfgs" from pele.optimize import bfgs as oldbfgs ret = oldbfgs(Xinit, pot, tol = tol) print ret if False: print "now do the same with gradient + linesearch" import _bfgs gpl = _bfgs.GradientPlusLinesearch(Xinit, pot, maxstep = 0.1) ret = gpl.run(1000, tol = 1e-6) print ret if False: print "calling from wrapper function" from pele.optimize import lbfgs_py ret = lbfgs_py(Xinit, pot, tol = tol) print ret if True: print "" print "now do the same with lbfgs_py" from pele.optimize import lbfgs_py ret = lbfgs_py(Xinit, pot, tol = tol) print ret try: import pele.utils.pymolwrapper as pym pym.start() for n, coords in enumerate(printevent.coordslist): coords=coords.reshape(natoms, 3) pym.draw_spheres(coords, "A", n) except ImportError: print "error loading pymol"
def test(natoms=40, boxl=4.): # pragma: no cover import pele.potentials.ljpshiftfast as ljpshift from pele.optimize import mylbfgs from pele.utils.neighbor_list import makeBLJNeighborListPot ntypeA = int(natoms * 0.8) ntypeB = natoms - ntypeA rcut = 2.5 freezelist = list(range(old_div(ntypeA, 2))) + list(range(ntypeA, ntypeA + old_div(ntypeB, 2))) nfrozen = len(freezelist) print("nfrozen", nfrozen) coords = old_div(np.random.uniform(-1, 1, natoms * 3) * natoms ** (1. / 3), 2) NLblj = ljpshift.LJpshift(natoms, ntypeA, rcut=rcut, boxl=boxl) blj = FreezePot(NLblj, freezelist, natoms) pot = makeBLJNeighborListPotFreeze(natoms, freezelist, ntypeA=ntypeA, rcut=rcut, boxl=boxl) eblj = blj.getEnergy(coords) print("blj energy", eblj) epot = pot.getEnergy(coords) print("mcpot energy", epot) print("difference", old_div((epot - eblj), eblj)) pot.test_potential(coords) print("\n") ret1 = mylbfgs(coords, blj, iprint=-11) np.savetxt("out.coords", ret1.coords) print("energy from quench1", ret1.energy) ret2 = mylbfgs(coords, pot, iprint=-1) print("energy from quench2", ret2.energy) print("ret1 evaluated in both potentials", pot.getEnergy(ret1.coords), blj.getEnergy(ret1.coords)) print("ret2 evaluated in both potentials", pot.getEnergy(ret2.coords), blj.getEnergy(ret2.coords)) coords = ret1.coords e1, g1 = blj.getEnergyGradient(coords) e2, g2 = pot.getEnergyGradient(coords) print("energy difference from getEnergyGradient", (e2 - e1)) print("largest gradient difference", np.max(np.abs(g2 - g1))) print("rms gradients", old_div(np.linalg.norm(g1), np.sqrt(len(g1))), old_div(np.linalg.norm(g2), np.sqrt(len(g1)))) if True: for subpot in pot.pot.potentials: nl = subpot print("number of times neighbor list was remade:", nl.buildcount, "out of", nl.count) if False: try: import pele.utils.pymolwrapper as pym pym.start() pym.draw_spheres(np.reshape(coords, [-1, 3]), "A", 1) pym.draw_spheres(np.reshape(ret1.coords, [-1, 3]), "A", 2) pym.draw_spheres(np.reshape(ret2.coords, [-1, 3]), "A", 3) except ImportError: print("Could not draw using pymol, skipping this step")
def takeStep(self, coords, **kwargs): # make a new monte carlo class mc = MonteCarlo(coords, self.potential, self.mcstep, temperature=self.T, outstream=None) mc.run(self.nsteps) coords[:] = mc.coords[:] def updateStep(self, acc, **kwargs): pass natoms = 12 # random initial coordinates coords = np.random.random(3 * natoms) potential = lj.LJ() step = TakeStepMonteCarlo(potential) opt = bh.BasinHopping(coords, potential, takeStep=step) opt.run(100) # some visualization try: import pele.utils.pymolwrapper as pym pym.start() pym.draw_spheres(opt.coords, "A", 1) except: print("Could not draw using pymol, skipping this step")
def takeStep(self, coords, **kwargs): # make a new monte carlo class mc = MonteCarlo(coords, self.potential, self.mcstep, temperature=self.T, outstream=None) mc.run(self.nsteps) coords[:] = mc.coords[:] def updateStep(self, acc, **kwargs): pass natoms = 12 # random initial coordinates coords = np.random.random(3 * natoms) potential = lj.LJ() step = TakeStepMonteCarlo(potential) opt = bh.BasinHopping(coords, potential, takeStep=step) opt.run(100) # some visualization try: import pele.utils.pymolwrapper as pym pym.start() pym.draw_spheres(opt.coords, "A", 1) except: print "Could not draw using pymol, skipping this step"
def draw_pymol(coords): import pele.utils.pymolwrapper as pym pym.start() pym.draw_spheres(coords, "A", 1)