| 1084 | |
| 1085 | |
| 1086 | class _HLGExprSequence(Expr): |
| 1087 | |
| 1088 | def __getitem__(self, other): |
| 1089 | return self.operands[other] |
| 1090 | |
| 1091 | def _operands_for_repr(self): |
| 1092 | return [ |
| 1093 | f"name={self.operand('name')!r}", |
| 1094 | f"dsk={self.operand('dsk')!r}", |
| 1095 | ] |
| 1096 | |
| 1097 | def _tree_repr_lines(self, indent=0, recursive=True): |
| 1098 | return self._operands_for_repr() |
| 1099 | |
| 1100 | def finalize_compute(self): |
| 1101 | return _HLGExprSequence(*[op.finalize_compute() for op in self.operands]) |
| 1102 | |
| 1103 | def _tune_down(self): |
| 1104 | if len(self.operands) == 1: |
| 1105 | return None |
| 1106 | from dask.highlevelgraph import HighLevelGraph |
| 1107 | |
| 1108 | groups = toolz.groupby( |
| 1109 | lambda x: x.low_level_optimizer if isinstance(x, HLGExpr) else None, |
| 1110 | self.operands, |
| 1111 | ) |
| 1112 | exprs = [] |
| 1113 | changed = False |
| 1114 | for optimizer, group in groups.items(): |
| 1115 | if len(group) > 1: |
| 1116 | graphs = [expr.hlg for expr in group] |
| 1117 | |
| 1118 | changed = True |
| 1119 | dsk = HighLevelGraph.merge(*graphs) |
| 1120 | hlg_group = _HLGExprGroup( |
| 1121 | dsk=dsk, |
| 1122 | low_level_optimizer=optimizer, |
| 1123 | output_keys=[v.__dask_keys__() for v in group], |
| 1124 | postcompute=[g.postcompute for g in group], |
| 1125 | ) |
| 1126 | exprs.append(hlg_group) |
| 1127 | else: |
| 1128 | exprs.append(group[0]) |
| 1129 | if not changed: |
| 1130 | return None |
| 1131 | return _HLGExprSequence(*exprs) |
| 1132 | |
| 1133 | @functools.cached_property |
| 1134 | def _optimized_dsk(self) -> HighLevelGraph: |
| 1135 | from dask.highlevelgraph import HighLevelGraph |
| 1136 | |
| 1137 | hlgexpr: HLGExpr |
| 1138 | graphs = [] |
| 1139 | # simplify_down ensure there are only one HLGExpr per optimizer/finalizer |
| 1140 | for hlgexpr in self.operands: |
| 1141 | keys = hlgexpr.__dask_keys__() |
| 1142 | dsk = hlgexpr.hlg |
| 1143 | if (optimizer := hlgexpr.low_level_optimizer) is not None: |
no outgoing calls
no test coverage detected
searching dependent graphs…