def test_uniform_stride(): minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 3) stride = (0.5, 0, 3) grid = uniform_grid(minpt, maxpt, shape) assert all_equal(grid.stride, stride)
def test_uniform_mid_pt(): minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 3) mid_pt = (1, 0, -2) grid = uniform_grid(minpt, maxpt, shape) assert all_equal(grid.mid_pt, mid_pt)
def test_uniform_init(): minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 3) # Check correct initialization of coord_vectors grid = uniform_grid(minpt, maxpt, shape) vec1 = (0.75, 1.25) vec2 = (0, ) vec3 = (-5, -2, 1) assert all_equal(grid.coord_vectors, (vec1, vec2, vec3))
def test_uniform_insert(): minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 3) minpt2 = (1, 1) maxpt2 = (3, 1) shape2 = (5, 1) grid = uniform_grid(minpt, maxpt, shape) grid2 = uniform_grid(minpt2, maxpt2, shape2) # Test all positions ins_grid = grid.insert(0, grid2) ins_minpt = minpt2 + minpt ins_maxpt = maxpt2 + maxpt ins_shape = shape2 + shape assert ins_grid == uniform_grid(ins_minpt, ins_maxpt, ins_shape) ins_grid = grid.insert(1, grid2) ins_minpt = minpt[:1] + minpt2 + minpt[1:] ins_maxpt = maxpt[:1] + maxpt2 + maxpt[1:] ins_shape = shape[:1] + shape2 + shape[1:] assert ins_grid == uniform_grid(ins_minpt, ins_maxpt, ins_shape) ins_grid = grid.insert(2, grid2) ins_minpt = minpt[:2] + minpt2 + minpt[2:] ins_maxpt = maxpt[:2] + maxpt2 + maxpt[2:] ins_shape = shape[:2] + shape2 + shape[2:] assert ins_grid == uniform_grid(ins_minpt, ins_maxpt, ins_shape) ins_grid = grid.insert(-1, grid2) assert ins_grid == uniform_grid(ins_minpt, ins_maxpt, ins_shape) ins_grid = grid.insert(3, grid2) ins_minpt = minpt + minpt2 ins_maxpt = maxpt + maxpt2 ins_shape = shape + shape2 assert ins_grid == uniform_grid(ins_minpt, ins_maxpt, ins_shape) # Insert a RectGrid vec = [-1, 0, 3] tgrid = RectGrid(vec) ins_tgrid = grid.insert(3, tgrid) assert isinstance(ins_tgrid, RectGrid) assert ins_tgrid == RectGrid(*(grid.coord_vectors + (vec, ))) with pytest.raises(IndexError): grid.insert(4, grid2) with pytest.raises(IndexError): grid.insert(-5, grid2) with pytest.raises(TypeError): grid.insert(0, [1, 2])
def test_empty_grid(): """Check if empty grids behave as expected and all methods work.""" grid = RectGrid() assert grid.ndim == grid.size == len(grid) == 0 assert grid.shape == () assert grid.coord_vectors == () assert grid.nondegen_byaxis == () assert np.array_equal(grid.min_pt, []) assert np.array_equal(grid.max_pt, []) assert np.array_equal(grid.mid_pt, []) assert np.array_equal(grid.stride, []) assert np.array_equal(grid.extent, []) out = np.array([]) grid.min(out=out) grid.max(out=out) assert grid.is_uniform assert grid.convex_hull() == odl.IntervalProd([], []) same = RectGrid() assert grid == same assert hash(grid) == hash(same) other = RectGrid([0, 2, 3]) assert grid != other assert grid.is_subgrid(other) assert [] in grid assert 1.0 not in grid assert grid.insert(0, other) == other assert other.insert(0, grid) == other assert other.insert(1, grid) == other assert grid.squeeze() == grid assert np.array_equal(grid.points(), np.array([]).reshape((0, 0))) assert grid.corner_grid() == grid assert np.array_equal(grid.corners(), np.array([]).reshape((0, 0))) assert grid.meshgrid == () assert grid[[]] == grid assert np.array_equal(np.asarray(grid), np.array([]).reshape((0, 0))) assert grid == uniform_grid([], [], ()) repr(grid)
def test_uniform_getitem(): minpt = (0.75, 0, -5, 4) maxpt = (1.25, 0, 1, 13) shape = (2, 1, 5, 4) grid = uniform_grid(minpt, maxpt, shape) # Single indices yield points as an array indices = [1, 0, 1, 1] values = [vec[i] for i, vec in zip(indices, grid.coord_vectors)] assert all_equal(grid[1, 0, 1, 1], values) indices = [0, 0, 4, 3] values = [vec[i] for i, vec in zip(indices, grid.coord_vectors)] assert all_equal(grid[0, 0, 4, 3], values) with pytest.raises(IndexError): grid[1, 0, 1, 2, 0] with pytest.raises(IndexError): grid[1, 1, 6, 2] with pytest.raises(IndexError): grid[1, 0, 4, 6] # Slices return uniform grids assert grid == grid[...] # Use RectGrid implementation as reference here tensor_grid = RectGrid(*grid.coord_vectors) test_slice = np.s_[1, :, ::2, ::3] assert all_equal(grid[test_slice].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[1:2, :, ::2, ::3].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[1:2, :, ::2, ..., ::3].coord_vectors, tensor_grid[test_slice].coord_vectors) test_slice = np.s_[0:1, :, :, 2:4] assert all_equal(grid[test_slice].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[:1, :, :, 2:].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[:-1, ..., 2:].coord_vectors, tensor_grid[test_slice].coord_vectors) test_slice = np.s_[:, 0, :, :] assert all_equal(grid[test_slice].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[:, 0, ...].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[0:2, :, ...].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[...].coord_vectors, tensor_grid[test_slice].coord_vectors) test_slice = np.s_[:, :, 0::2, :] assert all_equal(grid[test_slice].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[..., 0::2, :].coord_vectors, tensor_grid[test_slice].coord_vectors) test_slice = np.s_[..., 1, :] assert all_equal(grid[test_slice].coord_vectors, tensor_grid[test_slice].coord_vectors) assert all_equal(grid[:, :, 1, :].coord_vectors, tensor_grid[test_slice].coord_vectors) # Fewer indices assert grid[1:] == grid[1:, :, :, :] assert grid[1:, 0] == grid[1:, 0, :, :] assert grid[1:, 0, :-1] == grid[1:, 0, :-1, :] # Two ellipses not allowed with pytest.raises(ValueError): grid[1, ..., ..., 0] # Too many axes with pytest.raises(IndexError): grid[1, 0, 1:2, 0, :] # New axes not supported with pytest.raises(ValueError): grid[1, 0, None, 1, 0] # Empty axes not allowed with pytest.raises(ValueError): grid[1, 0, 0:0, 1] with pytest.raises(ValueError): grid[1, 1:, 0, 1] # One-dimensional grid grid = uniform_grid(1, 5, 5) assert grid == grid[...] sub_grid = uniform_grid(1, 5, 3) assert grid[::2], sub_grid
def test_uniform_is_subgrid(): minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 5) # Optimized cases grid = uniform_grid(minpt, maxpt, shape) assert grid.is_subgrid(grid) smaller_shape = (1, 1, 5) not_sup_grid = uniform_grid(minpt, maxpt, smaller_shape) assert not grid.is_subgrid(not_sup_grid) larger_minpt = (0.85, 0, -4) not_sup_grid = uniform_grid(larger_minpt, maxpt, shape) assert not grid.is_subgrid(not_sup_grid) smaller_maxpt = (1.15, 0, 0) not_sup_grid = uniform_grid(minpt, smaller_maxpt, shape) assert not grid.is_subgrid(not_sup_grid) # Real checks minpt_sup1 = (-0.25, -2, -5) maxpt_sup1 = (1.25, 2, 1) shape_sup1 = (4, 3, 9) sup_grid = uniform_grid(minpt_sup1, maxpt_sup1, shape_sup1) assert grid.is_subgrid(sup_grid) assert not sup_grid.is_subgrid(grid) minpt_sup2 = (0.5, 0, -5) maxpt_sup2 = (1.5, 0, 1) shape_sup2 = (5, 1, 9) sup_grid = uniform_grid(minpt_sup2, maxpt_sup2, shape_sup2) assert grid.is_subgrid(sup_grid) assert not sup_grid.is_subgrid(grid) shape_not_sup1 = (4, 3, 10) not_sup_grid = uniform_grid(minpt_sup1, maxpt_sup1, shape_not_sup1) assert not grid.is_subgrid(not_sup_grid) assert not not_sup_grid.is_subgrid(grid) minpt_not_sup1 = (-0.25, -2.5, -5) not_sup_grid = uniform_grid(minpt_not_sup1, maxpt_sup1, shape_sup1) assert not grid.is_subgrid(not_sup_grid) assert not not_sup_grid.is_subgrid(grid) maxpt_not_sup1 = (1.35, 2.0001, 1) not_sup_grid = uniform_grid(minpt_sup1, maxpt_not_sup1, shape_sup1) assert not grid.is_subgrid(not_sup_grid) assert not not_sup_grid.is_subgrid(grid) # Should also work for RectGrid's vec1_sup = (0.75, 1, 1.25, 7) vec2_sup = (0, ) vec3_sup = (-5, -3.5, -3, -2, -0.5, 0, 1, 9.5) tensor_sup_grid = RectGrid(vec1_sup, vec2_sup, vec3_sup) assert grid.is_subgrid(tensor_sup_grid) vec1_not_sup = (1, 1.25, 7) vec2_not_sup = (0, ) vec3_not_sup = (-4, -2, 1) tensor_not_sup_grid = RectGrid(vec1_not_sup, vec2_not_sup, vec3_not_sup) assert not grid.is_subgrid(tensor_not_sup_grid) # Fuzzy check shape_sup = (4, 3, 9) minpt_fuzzy_sup1 = (-0.24, -2, -5.01) minpt_fuzzy_sup2 = (-0.24, -2, -5) maxpt_fuzzy_sup1 = (1.24, 2, 1) maxpt_fuzzy_sup2 = (1.25, 2, 1.01) fuzzy_sup_grid = uniform_grid(minpt_fuzzy_sup1, maxpt_fuzzy_sup1, shape_sup) assert grid.is_subgrid(fuzzy_sup_grid, atol=0.015) assert not grid.is_subgrid(fuzzy_sup_grid, atol=0.005) fuzzy_sup_grid = uniform_grid(minpt_fuzzy_sup2, maxpt_fuzzy_sup2, shape_sup) assert grid.is_subgrid(fuzzy_sup_grid, atol=0.015) assert not grid.is_subgrid(fuzzy_sup_grid, atol=0.005)
def test_uniform_init_raise(): # Check different error scenarios minpt = (0.75, 0, -5) maxpt = (1.25, 0, 1) shape = (2, 1, 3) nonpos_shape1 = (2, 0, 3) nonpos_shape2 = (-2, 1, 3) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, nonpos_shape1) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, nonpos_shape2) minpt_with_nan = (0.75, 0, np.nan) minpt_with_inf = (0.75, 0, np.inf) maxpt_with_nan = (1.25, np.nan, 1) maxpt_with_inf = (1.25, np.inf, 1) shape_with_nan = (2, np.nan, 3) shape_with_inf = (2, np.inf, 3) with pytest.raises(ValueError): uniform_grid(minpt_with_nan, maxpt, shape) with pytest.raises(ValueError): uniform_grid(minpt_with_inf, maxpt, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt_with_nan, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt_with_inf, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, shape_with_nan) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, shape_with_inf) maxpt_smaller_minpt1 = (0.7, 0, 1) maxpt_smaller_minpt2 = (1.25, -1, 1) with pytest.raises(ValueError): uniform_grid(minpt, maxpt_smaller_minpt1, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt_smaller_minpt2, shape) too_short_minpt = (0.75, 0) too_long_minpt = (0.75, 0, -5, 2) too_short_maxpt = (0, 1) too_long_maxpt = (1.25, 0, 1, 25) too_short_shape = (2, 3) too_long_shape = (2, 1, 4, 3) bad_dim_shape = ((1, 2), (3, 4)) with pytest.raises(ValueError): uniform_grid(too_short_minpt, maxpt, shape) with pytest.raises(ValueError): uniform_grid(too_long_minpt, maxpt, shape) with pytest.raises(ValueError): uniform_grid(minpt, too_short_maxpt, shape) with pytest.raises(ValueError): uniform_grid(minpt, too_long_maxpt, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, too_short_shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, too_long_shape) maxpt_eq_minpt_at_shape_larger_than_1 = (0.75, 0, 1) with pytest.raises(ValueError): uniform_grid(minpt, maxpt_eq_minpt_at_shape_larger_than_1, shape) with pytest.raises(ValueError): uniform_grid(minpt, maxpt, bad_dim_shape)