def test_surf_border_nonconnected_nodes(self): s = surf.generate_cube() # add empty node v = np.vstack((s.vertices, [2, 2, 2])) # remove two faces s2 = surf.Surface(v, s.faces[:-2]) is_on_border = [ False, False, False, False, True, True, True, True, False ] assert_array_equal(s2.nodes_on_border(), np.asarray(is_on_border))
def test_surf_border_nonconnected_nodes(self): s = surf.generate_cube() # add empty node v = np.vstack((s.vertices, [2, 2, 2])) # remove two faces s2 = surf.Surface(v, s.faces[:-2]) is_on_border = [False, False, False, False, True, True, True, True, False] assert_array_equal(s2.nodes_on_border(), np.asarray(is_on_border))
def test_surf(self, temp_fn): """Some simple testing with surfaces """ s = surf.generate_sphere(10) assert_true(s.nvertices == 102) assert_true(s.nfaces == 200) v = s.vertices f = s.faces assert_true(v.shape == (102, 3)) assert_true(f.shape == (200, 3)) # another surface t = s * 10 + 2 assert_true(t.same_topology(s)) assert_array_equal(f, t.faces) assert_array_equal(v * 10 + 2, t.vertices) # allow updating, but should not affect original array # CHECKME: maybe we want to throw an exception instead assert_true((v * 10 + 2 == t.vertices).all().all()) assert_true((s.vertices * 10 + 2 == t.vertices).all().all()) # a few checks on vertices and nodes v_check = { 40: (0.86511144, -0.28109175, -0.41541501), 10: (0.08706015, -0.26794358, -0.95949297) } f_check = {10: (7, 8, 1), 40: (30, 31, 21)} vf_checks = [(v_check, lambda x: x.vertices), (f_check, lambda x: x.faces)] eps = .0001 for cmap, f in vf_checks: for k, v in cmap.iteritems(): surfval = f(s)[k, :] assert_true((abs(surfval - v) < eps).all()) # make sure same topology fails with different topology u = surf.generate_cube() assert_false(u.same_topology(s)) # check that neighbours are computed correctly # even if we nuke the topology afterwards for _ in [0, 1]: nbrs = s.neighbors n_check = [(0, 96, 0.284629), (40, 39, 0.56218349), (100, 99, 0.1741202)] for i, j, k in n_check: assert_true(abs(nbrs[i][j] - k) < eps) def assign_zero(x): x.faces[:, :] = 0 return None assert_raises((ValueError, RuntimeError), assign_zero, s) # see if mapping to high res works h = surf.generate_sphere(40) low2high = s.map_to_high_resolution_surf(h, .1) partmap = {7: 141, 8: 144, 9: 148, 10: 153, 11: 157, 12: 281} for k, v in partmap.iteritems(): assert_true(low2high[k] == v) # ensure that slow implementation gives same results as fast one low2high_slow = s.map_to_high_resolution_surf(h, .1) for k, v in low2high.iteritems(): assert_true(low2high_slow[k] == v) # should fail if epsilon is too small assert_raises(ValueError, lambda x: x.map_to_high_resolution_surf(h, .01), s) n2f = s.node2faces for i in xrange(s.nvertices): nf = [10] if i < 2 else [5, 6] # number of faces expected assert_true(len(n2f[i]) in nf) # test dijkstra distances ds2 = s.dijkstra_distance(2) some_ds = { 0: 3.613173280799, 1: 0.2846296765, 2: 0., 52: 1.87458018, 53: 2.0487004817, 54: 2.222820777, 99: 3.32854360, 100: 3.328543604, 101: 3.3285436042 } eps = np.finfo('f').eps for k, v in some_ds.iteritems(): assert_true(abs(v - ds2[k]) < eps) # test I/O (through ascii files) surf.write(temp_fn, s, overwrite=True) s2 = surf.read(temp_fn) # test i/o and ensure that the loaded instance is trained if externals.exists('h5py'): h5save(temp_fn, s2) s2 = h5load(temp_fn) assert_array_almost_equal(s.vertices, s2.vertices, 4) assert_array_almost_equal(s.faces, s2.faces, 4) # test plane (new feature end of August 2012) s3 = surf.generate_plane((0, 0, 0), (2, 0, 0), (0, 1, 0), 10, 20) assert_equal(s3.nvertices, 200) assert_equal(s3.nfaces, 342) assert_array_almost_equal(s3.vertices[-1, :], np.array([18., 19, 0.])) assert_array_almost_equal(s3.faces[-1, :], np.array([199, 198, 179])) # test bar p, q = (0, 0, 0), (100, 0, 0) s4 = surf.generate_bar(p, q, 10, 12) assert_equal(s4.nvertices, 26) assert_equal(s4.nfaces, 48)
def test_surf(self, temp_fn): """Some simple testing with surfaces """ s = surf.generate_sphere(10) assert_true(s.nvertices == 102) assert_true(s.nfaces == 200) v = s.vertices f = s.faces assert_true(v.shape == (102, 3)) assert_true(f.shape == (200, 3)) # another surface t = s * 10 + 2 assert_true(t.same_topology(s)) assert_array_equal(f, t.faces) assert_array_equal(v * 10 + 2, t.vertices) # allow updating, but should not affect original array # CHECKME: maybe we want to throw an exception instead assert_true((v * 10 + 2 == t.vertices).all().all()) assert_true((s.vertices * 10 + 2 == t.vertices).all().all()) # a few checks on vertices and nodes v_check = {40:(0.86511144 , -0.28109175, -0.41541501), 10:(0.08706015, -0.26794358, -0.95949297)} f_check = {10:(7, 8, 1), 40:(30, 31, 21)} vf_checks = [(v_check, lambda x:x.vertices), (f_check, lambda x:x.faces)] eps = .0001 for cmap, f in vf_checks: for k, v in cmap.iteritems(): surfval = f(s)[k, :] assert_true((abs(surfval - v) < eps).all()) # make sure same topology fails with different topology u = surf.generate_cube() assert_false(u.same_topology(s)) # check that neighbours are computed correctly # even if we nuke the topology afterwards for _ in [0, 1]: nbrs = s.neighbors n_check = [(0, 96, 0.284629), (40, 39, 0.56218349), (100, 99, 0.1741202)] for i, j, k in n_check: assert_true(abs(nbrs[i][j] - k) < eps) def assign_zero(x): x.faces[:, :] = 0 return None assert_raises((ValueError, RuntimeError), assign_zero, s) # see if mapping to high res works h = surf.generate_sphere(40) low2high = s.map_to_high_resolution_surf(h, .1) partmap = {7: 141, 8: 144, 9: 148, 10: 153, 11: 157, 12: 281} for k, v in partmap.iteritems(): assert_true(low2high[k] == v) # ensure that slow implementation gives same results as fast one low2high_slow = s.map_to_high_resolution_surf(h, .1) for k, v in low2high.iteritems(): assert_true(low2high_slow[k] == v) # should fail if epsilon is too small assert_raises(ValueError, lambda x:x.map_to_high_resolution_surf(h, .01), s) n2f = s.node2faces for i in xrange(s.nvertices): nf = [10] if i < 2 else [5, 6] # number of faces expected assert_true(len(n2f[i]) in nf) # test dijkstra distances ds2 = s.dijkstra_distance(2) some_ds = {0: 3.613173280799, 1: 0.2846296765, 2: 0., 52: 1.87458018, 53: 2.0487004817, 54: 2.222820777, 99: 3.32854360, 100: 3.328543604, 101: 3.3285436042} eps = np.finfo('f').eps for k, v in some_ds.iteritems(): assert_true(abs(v - ds2[k]) < eps) # test I/O (through ascii files) surf.write(temp_fn, s, overwrite=True) s2 = surf.read(temp_fn) # test i/o and ensure that the loaded instance is trained if externals.exists('h5py'): h5save(temp_fn, s2) s2 = h5load(temp_fn) assert_array_almost_equal(s.vertices, s2.vertices, 4) assert_array_almost_equal(s.faces, s2.faces, 4) # test plane (new feature end of August 2012) s3 = surf.generate_plane((0, 0, 0), (2, 0, 0), (0, 1, 0), 10, 20) assert_equal(s3.nvertices, 200) assert_equal(s3.nfaces, 342) assert_array_almost_equal(s3.vertices[-1, :], np.array([18., 19, 0.])) assert_array_almost_equal(s3.faces[-1, :], np.array([199, 198, 179])) # test bar p, q = (0, 0, 0), (100, 0, 0) s4 = surf.generate_bar(p, q, 10, 12) assert_equal(s4.nvertices, 26) assert_equal(s4.nfaces, 48)