Represents a value to be computed by dask. Equivalent to the output from a single key in a dask graph.
| 671 | |
| 672 | |
| 673 | class Delayed(DaskMethodsMixin, OperatorMethodMixin): |
| 674 | """Represents a value to be computed by dask. |
| 675 | |
| 676 | Equivalent to the output from a single key in a dask graph. |
| 677 | """ |
| 678 | |
| 679 | __slots__ = ("_key", "_dask", "_length", "_layer") |
| 680 | |
| 681 | def __init__(self, key, dsk, length=None, layer=None): |
| 682 | self._key = key |
| 683 | self._dask = dsk |
| 684 | self._length = length |
| 685 | |
| 686 | # NOTE: Layer is used by `to_delayed` in other collections, but not in normal Delayed use |
| 687 | self._layer = layer or key |
| 688 | if isinstance(dsk, HighLevelGraph) and self._layer not in dsk.layers: |
| 689 | raise ValueError( |
| 690 | f"Layer {self._layer} not in the HighLevelGraph's layers: {list(dsk.layers)}" |
| 691 | ) |
| 692 | |
| 693 | @property |
| 694 | def key(self): |
| 695 | return self._key |
| 696 | |
| 697 | @property |
| 698 | def dask(self): |
| 699 | return self._dask |
| 700 | |
| 701 | def __dask_graph__(self) -> Graph: |
| 702 | return self.dask |
| 703 | |
| 704 | def __dask_keys__(self) -> NestedKeys: |
| 705 | return [self.key] |
| 706 | |
| 707 | def __dask_layers__(self) -> Sequence[str]: |
| 708 | return (self._layer,) |
| 709 | |
| 710 | def __dask_tokenize__(self): |
| 711 | return self.key |
| 712 | |
| 713 | __dask_scheduler__ = staticmethod(DEFAULT_GET) |
| 714 | __dask_optimize__ = globalmethod(optimize, key="delayed_optimize") |
| 715 | |
| 716 | def __dask_postcompute__(self): |
| 717 | return single_key, () |
| 718 | |
| 719 | def __dask_postpersist__(self): |
| 720 | return self._rebuild, () |
| 721 | |
| 722 | def _rebuild(self, dsk, *, rename=None): |
| 723 | key = replace_name_in_key(self.key, rename) if rename else self.key |
| 724 | if isinstance(dsk, HighLevelGraph) and len(dsk.layers) == 1: |
| 725 | # FIXME Delayed is currently the only collection type that supports both high- and low-level graphs. |
| 726 | # The HLG output of `optimize` will have a layer name that doesn't match `key`. |
| 727 | # Remove this when Delayed is HLG-only (because `optimize` will only be passed HLGs, so it won't have |
| 728 | # to generate random layer names). |
| 729 | layer = next(iter(dsk.layers)) |
| 730 | else: |
searching dependent graphs…