def zeroEV(self, x): zev = [] ca = self.coords_adapter(x) cv = self.coords_adapter(np.zeros(x.shape)) translate_rigid = zeroev.zeroEV_translation(ca.posRigid) for v in translate_rigid: cv.posRigid[:] = v zev.append(cv.coords.copy()) #rotate_r = zeroev.zeroEV_rotation(ca.posRigid) #rotate_aa = transform = TransformAngleAxisCluster(self) d = 1e-5 dx = x.copy() transform.rotate(dx, rotations.aa2mx(np.array([d, 0, 0]))) self.align_path([x, dx]) dx -= x dx /= np.linalg.norm(dx) dy = x.copy() transform.rotate(dy, rotations.aa2mx(np.array([0, d, 0]))) self.align_path([x, dy]) dy -= x dy /= np.linalg.norm(dy) dz = x.copy() transform.rotate(dz, rotations.aa2mx(np.array([0, 0, d]))) self.align_path([x, dz]) dz -= x dz /= np.linalg.norm(dz) #print "Zero eigenvectors", zev return zev + [dx, dy, dz]
def test_translation_only(self): # test orthogopt with translations only natoms = 13 vec = np.random.uniform(-1, 1, natoms * 3) vec /= np.linalg.norm(vec) coords = np.random.uniform(-1, 1, natoms * 3) # orthogonalize vec vec = orthogopt_translation_only(vec, coords) zeroev = zeroEV_translation(coords) for u in zeroev: # print np.dot(u, vec) self.assertAlmostEqual(0., np.dot(u, vec), 5) rotev = zeroEV_rotation(coords) for u in rotev: # print np.dot(u, vec) self.assertNotAlmostEqual(0., np.dot(u, vec), 5)
def _zeroEV_python(self, x): """return a list of zero eigenvectors This does both translational and rotational eigenvectors """ zev = [] ca = self.coords_adapter(x) cv = self.coords_adapter(np.zeros(x.shape)) # get the zero eigenvectors corresponding to translation translate_rigid = zeroev.zeroEV_translation(ca.posRigid) for v in translate_rigid: cv.posRigid[:] = v zev.append(cv.coords.copy()) # get the zero eigenvectors corresponding to rotation #rotate_r = zeroev.zeroEV_rotation(ca.posRigid) #rotate_aa = transform = TransformAngleAxisCluster(self) d = 1e-5 dx = x.copy() transform.rotate(dx, rotations.aa2mx(np.array([d, 0, 0]))) self.align_path([x, dx]) dx -= x dx /= np.linalg.norm(dx) dy = x.copy() transform.rotate(dy, rotations.aa2mx(np.array([0, d, 0]))) self.align_path([x, dy]) dy -= x dy /= np.linalg.norm(dy) dz = x.copy() transform.rotate(dz, rotations.aa2mx(np.array([0, 0, d]))) self.align_path([x, dz]) dz -= x dz /= np.linalg.norm(dz) #print "Zero eigenvectors", zev return zev + [dx, dy, dz]