def test_simple_cubic(self): """Test with an easy structure""" # Make sure direction-dependent fingerprints are zero agni = AGNIFingerprints(directions=['x', 'y', 'z']) features = agni.featurize(self.sc, 0) self.assertEqual(8 * 3, len(features)) self.assertEqual(8 * 3, len(set(agni.feature_labels()))) self.assertArrayAlmostEqual([ 0, ] * 24, features) # Compute the "atomic fingerprints" agni.directions = [None] agni.cutoff = 3.75 # To only get 6 neighbors to deal with features = agni.featurize(self.sc, 0) self.assertEqual(8, len(features)) self.assertEqual(8, len(set(agni.feature_labels()))) self.assertEqual(0.8, agni.etas[0]) self.assertAlmostEqual( 6 * np.exp(-(3.52 / 0.8)**2) * 0.5 * (np.cos(np.pi * 3.52 / 3.75) + 1), features[0]) self.assertAlmostEqual( 6 * np.exp(-(3.52 / 16)**2) * 0.5 * (np.cos(np.pi * 3.52 / 3.75) + 1), features[-1]) # Test that passing etas to constructor works new_etas = np.logspace(-4, 2, 6) agni = AGNIFingerprints(directions=['x', 'y', 'z'], etas=new_etas) self.assertArrayAlmostEqual(new_etas, agni.etas)
def test_simple_cubic(self): """Test with an easy structure""" # Make sure direction-dependent fingerprints are zero agni = AGNIFingerprints(directions=['x', 'y', 'z']) features = agni.featurize(self.sc, 0) self.assertEqual(8 * 3, len(features)) self.assertEqual(8 * 3, len(set(agni.feature_labels()))) self.assertArrayAlmostEqual([0, ] * 24, features) # Compute the "atomic fingerprints" agni.directions = [None] agni.cutoff = 3.75 # To only get 6 neighbors to deal with features = agni.featurize(self.sc, 0) self.assertEqual(8, len(features)) self.assertEqual(8, len(set(agni.feature_labels()))) self.assertEqual(0.8, agni.etas[0]) self.assertAlmostEqual(6 * np.exp(-(3.52 / 0.8) ** 2) * 0.5 * (np.cos(np.pi * 3.52 / 3.75) + 1), features[0]) self.assertAlmostEqual(6 * np.exp(-(3.52 / 16) ** 2) * 0.5 * (np.cos(np.pi * 3.52 / 3.75) + 1), features[-1]) # Test that passing etas to constructor works new_etas = np.logspace(-4, 2, 6) agni = AGNIFingerprints(directions=['x', 'y', 'z'], etas=new_etas) self.assertArrayAlmostEqual(new_etas, agni.etas)
def test_off_center_cscl(self): agni = AGNIFingerprints(directions=[None, 'x', 'y', 'z'], cutoff=4) # Compute the features on both sites site1 = agni.featurize(self.cscl, 0) site2 = agni.featurize(self.cscl, 1) # The atomic attributes should be equal self.assertArrayAlmostEqual(site1[:8], site2[:8]) # The direction-dependent ones should be equal and opposite in sign self.assertArrayAlmostEqual(-1 * site1[8:], site2[8:]) # Make sure the site-ones are as expected. right_dist = 4.209 * np.sqrt(0.45 ** 2 + 2 * 0.5 ** 2) right_xdist = 4.209 * 0.45 left_dist = 4.209 * np.sqrt(0.55 ** 2 + 2 * 0.5 ** 2) left_xdist = 4.209 * 0.55 self.assertAlmostEqual(4 * ( right_xdist / right_dist * np.exp(-(right_dist / 0.8) ** 2) * 0.5 * (np.cos(np.pi * right_dist / 4) + 1) - left_xdist / left_dist * np.exp(-(left_dist / 0.8) ** 2) * 0.5 * (np.cos(np.pi * left_dist / 4) + 1)), site1[8])