def test_peak_directions_nl(): def discrete_eval(sphere): return abs(sphere.vertices).sum(-1) directions, values = peak_directions_nl(discrete_eval) assert_equal(directions.shape, (4, 3)) assert_array_almost_equal(abs(directions), 1 / np.sqrt(3)) assert_array_equal(values, abs(directions).sum(-1)) # Test using a different sphere sphere = unit_icosahedron.subdivide(4) directions, values = peak_directions_nl(discrete_eval, sphere=sphere) assert_equal(directions.shape, (4, 3)) assert_array_almost_equal(abs(directions), 1 / np.sqrt(3)) assert_array_equal(values, abs(directions).sum(-1)) # Test the relative_peak_threshold def discrete_eval(sphere): A = abs(sphere.vertices).sum(-1) x, y, z = sphere.vertices.T B = 1 + (x * z > 0) + 2 * (y * z > 0) return A * B directions, values = peak_directions_nl(discrete_eval, .01) assert_equal(directions.shape, (4, 3)) directions, values = peak_directions_nl(discrete_eval, .3) assert_equal(directions.shape, (3, 3)) directions, values = peak_directions_nl(discrete_eval, .6) assert_equal(directions.shape, (2, 3)) directions, values = peak_directions_nl(discrete_eval, .8) assert_equal(directions.shape, (1, 3)) assert_almost_equal(values, 4 * 3 / np.sqrt(3)) # Test odfs with large areas of zero def discrete_eval(sphere): A = abs(sphere.vertices).sum(-1) x, y, z = sphere.vertices.T B = (x * z > 0) + 2 * (y * z > 0) return A * B directions, values = peak_directions_nl(discrete_eval, 0.) assert_equal(directions.shape, (3, 3)) directions, values = peak_directions_nl(discrete_eval, .6) assert_equal(directions.shape, (2, 3)) directions, values = peak_directions_nl(discrete_eval, .8) assert_equal(directions.shape, (1, 3)) assert_almost_equal(values, 3 * 3 / np.sqrt(3))