def run(self): """ the main loop of the algorithm """ res = Result() res.message = [] tol = self.tol iprint = self.iprint nsteps = self.nsteps #iprint =40 X = self.X sqrtN = np.sqrt(self.N) i = 1 self.funcalls += 1 e, G = self.pot.getEnergyGradient(X) res.success = False while i < nsteps: stp = self.getStep(X, G) try: X, e, G = self.adjustStepSize(X, e, G, stp) except LineSearchError: print "Warning: problem with adjustStepSize, ending quench" rms = np.linalg.norm(G) / sqrtN print " on failure: quench step", i, e, rms, self.funcalls res.message.append( "problem with adjustStepSize" ) break #e, G = self.pot.getEnergyGradient(X) rms = np.linalg.norm(G) / sqrtN if iprint > 0: if i % iprint == 0: print "lbfgs:", i, e, rms, self.funcalls, self.stepsize for event in self.events: event(coords=X, energy=e, rms=rms) if self.alternate_stop_criterion is None: i_am_done = rms < self.tol else: i_am_done = self.alternate_stop_criterion(energy=e, gradient=G, tol=self.tol) if i_am_done: res.success = True break i += 1 res.nsteps = i res.nfev = self.funcalls res.coords = X res.energy = e res.rms = rms res.grad = G res.H0 = self.H0 return res
def run(self): """ the main loop of the algorithm """ res = Result() res.message = [] tol = self.tol iprint = self.iprint nsteps = self.nsteps #iprint =40 X = self.X sqrtN = np.sqrt(self.N) i = 1 self.funcalls += 1 e, G = self.pot.getEnergyGradient(X) rms = np.linalg.norm(G) / sqrtN res.success = False while i < nsteps: stp = self.getStep(X, G) try: X, e, G = self.adjustStepSize(X, e, G, stp) except LineSearchError: self.logger.error("problem with adjustStepSize, ending quench") rms = np.linalg.norm(G) / sqrtN self.logger.error(" on failure: quench step %s %s %s %s", i, e, rms, self.funcalls) res.message.append( "problem with adjustStepSize" ) break #e, G = self.pot.getEnergyGradient(X) rms = np.linalg.norm(G) / sqrtN if iprint > 0: if i % iprint == 0: self.logger.info("lbfgs: %s %s %s %s %s %s %s %s %s", i, "E", e, "rms", rms, "funcalls", self.funcalls, "stepsize", self.stepsize) for event in self.events: event(coords=X, energy=e, rms=rms) if self.alternate_stop_criterion is None: i_am_done = rms < self.tol else: i_am_done = self.alternate_stop_criterion(energy=e, gradient=G, tol=self.tol) if i_am_done: res.success = True break i += 1 res.nsteps = i res.nfev = self.funcalls res.coords = X res.energy = e res.rms = rms res.grad = G res.H0 = self.H0 return res