Esempio n. 1
0
    def __init__(self,
                 coords,
                 pot,
                 eigenvec0=None,
                 orthogZeroEigs=0,
                 dx=1e-6,
                 first_order=True,
                 gradient=None,
                 **minimizer_kwargs):

        self.minimizer_kwargs = minimizer_kwargs

        if eigenvec0 is None:
            # this random vector should be distributed uniformly on a hypersphere.
            eigenvec0 = rotations.vec_random_ndim(coords.shape)
        eigenvec0 = eigenvec0 / np.linalg.norm(eigenvec0)

        # change some default in the minimizer unless manually set
        if "nsteps" not in minimizer_kwargs:
            minimizer_kwargs["nsteps"] = 500
        if "logger" not in minimizer_kwargs:
            minimizer_kwargs["logger"] = logging.getLogger(
                "pele.connect.findTS.leig_quench")

        self.eigpot = LowestEigPot(coords,
                                   pot,
                                   orthogZeroEigs=orthogZeroEigs,
                                   dx=dx,
                                   gradient=gradient,
                                   first_order=first_order)
        self.minimizer = MYLBFGS(eigenvec0,
                                 self.eigpot,
                                 rel_energy=True,
                                 **self.minimizer_kwargs)
Esempio n. 2
0
    def setUp1(self, verbose=False, **kwargs):
        np.random.seed(0)
        natoms = 18
        self.system = LJCluster(natoms)
        self.pot = self.system.get_potential()
        x = self.system.get_random_configuration()
        ret = lbfgs_py(x, self.pot, tol=10)
        self.x = ret.coords

        self.kwargs = kwargs
        self.verbose = verbose

        self.M = 4
        if self.verbose: iprint = 1
        else: iprint = -1
        self.myo = MYLBFGS(self.x,
                           self.pot,
                           iprint=iprint,
                           debug=True,
                           M=self.M)
        self.o = LBFGS(self.x,
                       self.pot,
                       iprint=iprint,
                       debug=True,
                       M=self.M,
                       **self.kwargs)
Esempio n. 3
0
    def test_state(self):
        # do several minimization iterations
        for i in range(10):
            self.minimizer.one_iteration()

        # get the state and save it
        ret = self.minimizer.get_result()
        state = self.minimizer.get_state()
        x1 = ret.coords.copy()

        # do several more iteration steps
        for i in range(10):
            self.minimizer.one_iteration()

        # now make a new minimizer and do several iterations
        minimizer2 = MYLBFGS(x1, self.pot)
        minimizer2.set_state(state)
        for i in range(10):
            minimizer2.one_iteration()

        # test that the two minimizers are in the same state
        ret1 = self.minimizer.get_result()
        ret2 = minimizer2.get_result()
        self.assertEqual(ret1.energy, ret2.energy)
        self.assertTrue((ret1.coords == ret2.coords).all())

        state1 = self.minimizer.get_state()
        state2 = minimizer2.get_state()

        self.assertTrue((state1.W == state2.W).all())
        self.assertTrue((state1.dXold == state2.dXold).all())
        self.assertTrue((state1.dGold == state2.dGold).all())
        self.assertEqual(state1.H0, state2.H0)
        self.assertEqual(state1.point, state2.point)
        self.assertEqual(state1.iter, state2.iter)
Esempio n. 4
0
 def update_coords(self, coords, energy=None, gradient=None):
     """update the position at which to compute the eigenvector"""
     self.eigpot.update_coords(coords, gradient=gradient)
     state = self.minimizer.get_state()
     ret = self.get_result()
     self.minimizer = MYLBFGS(ret.eigenvec,
                              self.eigpot,
                              rel_energy=True,
                              **self.minimizer_kwargs)
     self.minimizer.set_state(state)
Esempio n. 5
0
    def _minimize_transverse(self,
                             nsteps,
                             transverse_energy=None,
                             transverse_gradient=None):
        # must update
        minimizer = MYLBFGS(self.coords,
                            self.transverse_potential,
                            nsteps=self.nsteps_tangent,
                            energy=transverse_energy,
                            gradient=transverse_gradient,
                            **self.transverse_kwargs)

        if self._transverse_walker_state is not None:
            minimizer.set_state(self._transverse_walker_state)
        ret = minimizer.run()
        self._transverse_walker_state = minimizer.get_state()
        self._stop_criterion_satisfied = minimizer.stop_criterion_satisfied()

        return ret
Esempio n. 6
0
def mylbfgs(coords, pot, **kwargs):
    lbfgs = MYLBFGS(coords, pot, **kwargs)
    return lbfgs.run()
Esempio n. 7
0
 def setUp(self):
     self.system = LJCluster(13)
     self.x = self.system.get_random_configuration()
     self.pot = self.system.get_potential()
     self.minimizer = MYLBFGS(self.x, self.pot)