def _metric_dist(self): if self.metric == 'periodic': if not 'cell_lengths' in self.metric_args: raise ValueError('periodic metric require cell_lengths arg') periodic = self.metric_args['cell_lengths'] return lambda a, b, periodic=np.array(periodic): periodic_distance(np.array(a), np.array(b), periodic) else: raise ValueError('metric %s unsupported.' % self.metric)
def _metric_dist(self): if self.metric == 'periodic': if not 'cell_lengths' in self.metric_args: raise ValueError('periodic metric require cell_lengths arg') periodic = self.metric_args['cell_lengths'] return lambda a, b, periodic=np.array(periodic): periodic_distance( np.array(a), np.array(b), periodic) else: raise ValueError('metric %s unsupported.' % self.metric)
def test_find(): K = 100 tree = CoverTree(metric='periodic', metric_args={'cell_lengths': [10, 10, 10]}) positions = np.random.uniform(0, 10, (K, 3)) tree.insert_many(positions) check_invariant(tree) i = 0 for p in np.random.uniform(0, 10, (K * 10, 3)): ct, dist = tree.find(p) bf = periodic_distance(p, positions, np.array([10, 10, 10])).min() dr = dist - bf if dr >= 1e-10: real = np.argmin(periodic_distance(p, positions, np.array([10, 10, 10]))) print 'CoverTree', dist, ct, 'BruteForce', bf, positions[real ], real assert dr <= 1e-10
def test_find(): K = 100 tree = CoverTree(metric='periodic', metric_args={'cell_lengths': [10, 10, 10]}) positions = np.random.uniform(0, 10, (K, 3)) tree.insert_many(positions) check_invariant(tree) i = 0 for p in np.random.uniform(0, 10, (K * 10, 3)): ct, dist = tree.find(p) bf = periodic_distance(p, positions, np.array([10, 10, 10])).min() dr = dist - bf if dr >= 1e-10: real = np.argmin( periodic_distance(p, positions, np.array([10, 10, 10]))) print 'CoverTree', dist, ct, 'BruteForce', bf, positions[ real], real assert dr <= 1e-10
def test_random_box(): na = Molecule([Atom("Na", [0.0, 0.0, 0.0])]) cl = Molecule([Atom("Cl", [0.0, 0.0, 0.0])]) water = Molecule([Atom("O", [0.0, 0.0, 0.0]), Atom("H", [0.0, 0.1, 0.0]), Atom("H", [0.1, 0.0, 0.0])]) box = random_box([na, cl, water], total=200, proportions=[0.1, 0.1, 0.8], size=[3, 3, 3]) from chemlab.utils.pbc import periodic_distance for a, b in [("O", "Na"), ("O", "Cl"), ("Na", "Cl")]: asys = box.sub(atom_type=a) bsys = box.sub(atom_type=b) D = periodic_distance(asys.r_array[None, :], bsys.r_array[:, None], np.array([3, 3, 3])) ok_(D.min() > vdw_radius(a) + vdw_radius(b))
def test_query_ball(): #tree = CoverTree(distance=lambda a, b: periodic_distance(np.array(a), np.array(b), np.array([10, 10, 10]))) tree = CoverTree(metric='periodic', metric_args={'cell_lengths': [10, 10, 10]}) np.random.seed(42) random.seed(42) positions = np.random.uniform(0, 5, (5000, 3)) np.set_printoptions(precision=2) for p in positions: # print 'inserting', p node = tree.insert(p) ref = (periodic_distance([1.0, 1.0, 1.0], positions, np.array([10, 10, 10])) < 3.0).nonzero()[0] res, dist = tree.query_ball([1, 1, 1], 3.0) #tree.check_invariant() #print ref, res eq_(len(ref), len(res))
def test_query_ball(): #tree = CoverTree(distance=lambda a, b: periodic_distance(np.array(a), np.array(b), np.array([10, 10, 10]))) tree = CoverTree(metric='periodic', metric_args={'cell_lengths': [10, 10, 10]}) np.random.seed(42) random.seed(42) positions = np.random.uniform(0, 5, (5000, 3)) np.set_printoptions(precision=2) for p in positions: # print 'inserting', p node = tree.insert(p) ref = (periodic_distance([1.0, 1.0, 1.0], positions, np.array( [10, 10, 10])) < 3.0).nonzero()[0] res, dist = tree.query_ball([1, 1, 1], 3.0) #tree.check_invariant() #print ref, res eq_(len(ref), len(res))