def test_dask_array_creates_cache(): """Test that dask arrays create cache but turns off fusion.""" resize_dask_cache(1) assert _dask_utils._DASK_CACHE.cache.available_bytes == 1 # by default we have no dask_cache and task fusion is active original = dask.config.get("optimization.fuse.active", None) def mock_set_view_slice(): assert dask.config.get("optimization.fuse.active") is False layer = layers.Image(da.ones((100, 100))) layer._set_view_slice = mock_set_view_slice layer.set_view_slice() # adding a dask array will reate cache and turn off task fusion, # *but only* during slicing (see "mock_set_view_slice" above) assert _dask_utils._DASK_CACHE.cache.available_bytes > 100 assert not _dask_utils._DASK_CACHE.active assert dask.config.get("optimization.fuse.active", None) == original # make sure we can resize the cache resize_dask_cache(10000) assert _dask_utils._DASK_CACHE.cache.available_bytes == 10000 # This should only affect dask arrays, and not numpy data def mock_set_view_slice2(): assert dask.config.get("optimization.fuse.active", None) == original layer2 = layers.Image(np.ones((100, 100))) layer2._set_view_slice = mock_set_view_slice2 layer2.set_view_slice()
def test_link_image_layers_all_attributes(key, value): """Test linking common attributes across layers of similar types.""" l1 = layers.Image(np.random.rand(10, 10), contrast_limits=(0, 0.8)) l2 = layers.Image(np.random.rand(10, 10), contrast_limits=(0.1, 0.9)) link_layers([l1, l2]) # linking does (currently) apply to things that were unequal before linking assert l1.contrast_limits != l2.contrast_limits # once we set either... they will both be changed assert getattr(l1, key) != value setattr(l2, key, value) assert getattr(l1, key) == getattr(l2, key) == value
def iter_layer_events() -> Iterator[Ev]: basenames = base_event_names() docs = class_doc_attrs(layers.Layer) for name in basenames: yield Ev(name, layers.Layer, description=docs.get(name)) EXAMPLE_LAYERS: List[layers.Layer] = [ layers.Image(np.random.random((2, 2))), layers.Labels(np.random.randint(20, size=(10, 15))), layers.Points(10 * np.random.random((10, 2))), layers.Vectors(20 * np.random.random((10, 2, 2))), layers.Shapes(20 * np.random.random((10, 4, 2))), layers.Surface(( 20 * np.random.random((10, 3)), np.random.randint(10, size=(6, 3)), np.random.random(10), )), layers.Tracks( np.column_stack((np.ones(20), np.arange(20), 20 * np.random.random( (20, 2))))), ] for lay in EXAMPLE_LAYERS: docs = class_doc_attrs(type(lay)) for name in [i for i in lay.events.emitters if i not in basenames]: yield Ev(name, lay.__class__, description=docs.get(name))
def test_link_invalid_param(): """Test that linking non-shared attributes raises.""" l1 = layers.Image(np.random.rand(10, 10)) l2 = layers.Points(None) with pytest.raises(ValueError) as e: link_layers([l1, l2], ('rendering', )) assert "Cannot link attributes that are not shared by all layers" in str(e)
def test_dask_not_greedy(dtype): """Make sure that we don't immediately calculate dask arrays.""" FETCH_COUNT = 0 def get_plane(block_id): if isinstance(block_id, tuple): nonlocal FETCH_COUNT FETCH_COUNT += 1 return np.random.rand(1, 1, 1, 10, 10) arr = da.map_blocks( get_plane, chunks=((1, ) * 4, (1, ) * 2, (1, ) * 8, (10, ), (10, )), dtype=dtype, ) layer = layers.Image(arr) # the <= is because before dask-2021.12.0, the above code resulted in NO # fetches for uint8 data, and afterwards, results in a single fetch. # the single fetch is actually the more "expected" behavior. And all we # are really trying to assert here is that we didn't fetch all the planes # in the first index... so we allow 0-1 fetches. assert FETCH_COUNT <= 1 if dtype == 'uint8': assert tuple(layer.contrast_limits) == (0, 255)
def test_list_of_dask_arrays_doesnt_create_cache(): """Test that adding a list of dask array also creates a dask cache.""" utils.dask_cache = None # in case other tests created it original = dask.config.get("optimization.fuse.active", None) _ = layers.Image([da.ones((100, 100)), da.ones((20, 20))]) assert utils.dask_cache is None assert dask.config.get("optimization.fuse.active", None) == original
def test_list_of_dask_arrays_doesnt_create_cache(): """Test that adding a list of dask array also creates a dask cache.""" resize_dask_cache(1) # in case other tests created it assert _dask_utils._DASK_CACHE.cache.available_bytes == 1 original = dask.config.get("optimization.fuse.active", None) _ = layers.Image([da.ones((100, 100)), da.ones((20, 20))]) assert _dask_utils._DASK_CACHE.cache.available_bytes > 100 assert not _dask_utils._DASK_CACHE.active assert dask.config.get("optimization.fuse.active", None) == original
def test_link_different_type_layers_all_attributes(key, value): """Test linking common attributes across layers of different types.""" l1 = layers.Image(np.random.rand(10, 10)) l2 = layers.Points(None) link_layers([l1, l2]) # once we set either... they will both be changed assert getattr(l1, key) != value setattr(l2, key, value) assert getattr(l1, key) == getattr(l2, key) == value
def test_dask_array_creates_cache(): """Test that adding a dask array creates a dask cache and turns of fusion. """ # by default we have no dask_cache and task fusion is active original = dask.config.get("optimization.fuse.active", None) def mock_set_view_slice(): assert dask.config.get("optimization.fuse.active") is False layer = layers.Image(da.ones((100, 100))) layer._set_view_slice = mock_set_view_slice layer.set_view_slice() # adding a dask array will turn on the cache, and turn off task fusion. assert isinstance(utils.dask_cache, dask.cache.Cache) assert dask.config.get("optimization.fuse.active", None) == original # if the dask version is too low to remove task fusion, emit a warning _dask_ver = dask.__version__ dask.__version__ = '2.14.0' with pytest.warns(UserWarning) as record: _ = layers.Image(da.ones((100, 100))) assert 'upgrade Dask to v2.15.0 or later' in record[0].message.args[0] dask.__version__ = _dask_ver # make sure we can resize the cache assert utils.dask_cache.cache.total_bytes > 1000 utils.resize_dask_cache(1000) assert utils.dask_cache.cache.total_bytes <= 1000 # This should only affect dask arrays, and not numpy data def mock_set_view_slice2(): assert dask.config.get("optimization.fuse.active", None) == original layer2 = layers.Image(np.ones((100, 100))) layer2._set_view_slice = mock_set_view_slice2 layer2.set_view_slice() # clean up cache utils.dask_cache = None
def test_dask_array_doesnt_create_cache(): """Test that dask arrays don't create cache but turns off fusion.""" # by default we have no dask_cache and task fusion is active original = dask.config.get("optimization.fuse.active", None) def mock_set_view_slice(): assert dask.config.get("optimization.fuse.active") is False layer = layers.Image(da.ones((100, 100))) layer._set_view_slice = mock_set_view_slice layer.set_view_slice() # adding a dask array won't create cache, but will turn off task fusion, # *but only* during slicing (see "mock_set_view_slice" above) assert utils.dask_cache is None assert dask.config.get("optimization.fuse.active", None) == original # if the dask version is too low to remove task fusion, emit a warning _dask_ver = dask.__version__ dask.__version__ = '2.14.0' with pytest.warns(UserWarning) as record: _ = layers.Image(da.ones((100, 100))) assert 'upgrade Dask to v2.15.0 or later' in record[0].message.args[0] dask.__version__ = _dask_ver # make sure we can resize the cache utils.resize_dask_cache(10000) assert utils.dask_cache.cache.available_bytes == 10000 # This should only affect dask arrays, and not numpy data def mock_set_view_slice2(): assert dask.config.get("optimization.fuse.active", None) == original layer2 = layers.Image(np.ones((100, 100))) layer2._set_view_slice = mock_set_view_slice2 layer2.set_view_slice() # clean up cache utils.dask_cache = None
def test_list_of_dask_arrays_creates_cache(): """Test that adding a list of dask array also creates a dask cache.""" original = dask.config.get("optimization.fuse.active", None) _ = layers.Image([da.ones((100, 100)), da.ones((20, 20))]) assert isinstance(utils.dask_cache, dask.cache.Cache) assert dask.config.get("optimization.fuse.active", None) == original