lsst-pipe-base 29.2025.4500__py3-none-any.whl → 29.2025.4600__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. lsst/pipe/base/_status.py +156 -11
  2. lsst/pipe/base/log_capture.py +98 -7
  3. lsst/pipe/base/pipeline_graph/expressions.py +3 -3
  4. lsst/pipe/base/quantum_graph/_common.py +6 -0
  5. lsst/pipe/base/quantum_graph/_predicted.py +13 -17
  6. lsst/pipe/base/quantum_graph/_provenance.py +322 -106
  7. lsst/pipe/base/quantum_graph/aggregator/_communicators.py +9 -9
  8. lsst/pipe/base/quantum_graph/aggregator/_progress.py +77 -84
  9. lsst/pipe/base/quantum_graph/aggregator/_scanner.py +154 -53
  10. lsst/pipe/base/quantum_graph/aggregator/_structs.py +27 -34
  11. lsst/pipe/base/quantum_graph/aggregator/_supervisor.py +8 -7
  12. lsst/pipe/base/quantum_graph/aggregator/_writer.py +5 -8
  13. lsst/pipe/base/quantum_provenance_graph.py +2 -44
  14. lsst/pipe/base/single_quantum_executor.py +43 -9
  15. lsst/pipe/base/tests/mocks/_data_id_match.py +1 -1
  16. lsst/pipe/base/tests/mocks/_pipeline_task.py +1 -1
  17. lsst/pipe/base/version.py +1 -1
  18. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/METADATA +1 -1
  19. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/RECORD +27 -27
  20. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/WHEEL +0 -0
  21. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/entry_points.txt +0 -0
  22. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/licenses/COPYRIGHT +0 -0
  23. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/licenses/LICENSE +0 -0
  24. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/licenses/bsd_license.txt +0 -0
  25. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/licenses/gpl-v3.0.txt +0 -0
  26. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/top_level.txt +0 -0
  27. {lsst_pipe_base-29.2025.4500.dist-info → lsst_pipe_base-29.2025.4600.dist-info}/zip-safe +0 -0
@@ -107,9 +107,10 @@ class Supervisor:
107
107
  """Scan the outputs of the quantum graph to gather provenance and
108
108
  ingest outputs.
109
109
  """
110
- self.comms.progress.set_n_quanta(
111
- self.predicted.header.n_quanta + len(self.predicted.init_quanta.root)
112
- )
110
+ n_quanta = self.predicted.header.n_quanta + len(self.predicted.init_quanta.root)
111
+ self.comms.progress.scans.total = n_quanta
112
+ self.comms.progress.writes.total = n_quanta
113
+ self.comms.progress.quantum_ingests.total = n_quanta
113
114
  ready_set: set[uuid.UUID] = set()
114
115
  for ready_quanta in self.walker:
115
116
  self.comms.log.debug("Sending %d new quanta to scan queue.", len(ready_quanta))
@@ -137,8 +138,8 @@ class Supervisor:
137
138
  for blocked_quantum_id in blocked_quanta:
138
139
  if self.comms.config.output_path is not None:
139
140
  self.comms.request_write(ScanResult(blocked_quantum_id, status=ScanStatus.BLOCKED))
140
- self.comms.progress.report_scan()
141
- self.comms.progress.report_ingests(len(blocked_quanta))
141
+ self.comms.progress.scans.update(1)
142
+ self.comms.progress.quantum_ingests.update(len(blocked_quanta))
142
143
  case ScanStatus.ABANDONED:
143
144
  self.comms.log.debug("Abandoning scan for %s: quantum has not succeeded (yet).")
144
145
  self.walker.fail(scan_report.quantum_id)
@@ -147,7 +148,7 @@ class Supervisor:
147
148
  raise AssertionError(
148
149
  f"Unexpected status {unexpected!r} in scanner loop for {scan_report.quantum_id}."
149
150
  )
150
- self.comms.progress.report_scan()
151
+ self.comms.progress.scans.update(1)
151
152
 
152
153
 
153
154
  def aggregate_graph(predicted_path: str, butler_path: str, config: AggregatorConfig) -> None:
@@ -159,7 +160,7 @@ def aggregate_graph(predicted_path: str, butler_path: str, config: AggregatorCon
159
160
  Path to the predicted quantum graph.
160
161
  butler_path : `str`
161
162
  Path or alias to the central butler repository.
162
- config: `AggregatorConfig`
163
+ config : `AggregatorConfig`
163
164
  Configuration for the aggregator.
164
165
  """
165
166
  log = getLogger("lsst.pipe.base.quantum_graph.aggregator")
@@ -464,7 +464,7 @@ class Writer:
464
464
  producer=self.indices[predicted_init_quantum.quantum_id],
465
465
  consumers=self.xgraph.successors(dataset_index),
466
466
  )
467
- provenance_output.exists = predicted_output.dataset_id in existing_outputs
467
+ provenance_output.produced = predicted_output.dataset_id in existing_outputs
468
468
  data_writers.datasets.write_model(
469
469
  provenance_output.dataset_id, provenance_output, data_writers.compressor
470
470
  )
@@ -551,16 +551,13 @@ class Writer:
551
551
  producer=quantum_index,
552
552
  consumers=self.xgraph.successors(dataset_index),
553
553
  )
554
- provenance_output.exists = provenance_output.dataset_id in request.existing_outputs
554
+ provenance_output.produced = provenance_output.dataset_id in request.existing_outputs
555
555
  data.datasets[provenance_output.dataset_id] = provenance_output.model_dump_json().encode()
556
556
  provenance_quantum = ProvenanceQuantumModel.from_predicted(predicted_quantum, self.indices)
557
- provenance_quantum.status = request.get_run_status()
558
- provenance_quantum.caveats = request.caveats
559
- provenance_quantum.exception = request.exception
560
- provenance_quantum.resource_usage = request.resource_usage
557
+ provenance_quantum.attempts = [a.remap_uuids(self.indices) for a in request.attempts]
561
558
  data.quantum = provenance_quantum.model_dump_json().encode()
562
- data.metadata = request.metadata
563
- data.log = request.log
559
+ data.metadata = request.metadata_content
560
+ data.log = request.log_content
564
561
  return [data]
565
562
 
566
563
  def write_scan_data(self, scan_data: _ScanData, data_writers: _DataWriters) -> None:
@@ -49,7 +49,7 @@ import threading
49
49
  import uuid
50
50
  from collections.abc import Callable, Iterator, Mapping, Sequence, Set
51
51
  from enum import Enum
52
- from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypedDict, cast
52
+ from typing import Any, ClassVar, Literal, TypedDict, cast
53
53
 
54
54
  import astropy.table
55
55
  import networkx
@@ -72,7 +72,7 @@ from lsst.daf.butler import (
72
72
  from lsst.resources import ResourcePathExpression
73
73
  from lsst.utils.logging import PeriodicLogger, getLogger
74
74
 
75
- from ._status import QuantumSuccessCaveats
75
+ from ._status import ExceptionInfo, QuantumSuccessCaveats
76
76
  from .automatic_connection_constants import (
77
77
  LOG_OUTPUT_CONNECTION_NAME,
78
78
  LOG_OUTPUT_TEMPLATE,
@@ -82,9 +82,6 @@ from .automatic_connection_constants import (
82
82
  )
83
83
  from .graph import QuantumGraph, QuantumNode
84
84
 
85
- if TYPE_CHECKING:
86
- from ._task_metadata import TaskMetadata
87
-
88
85
  _LOG = getLogger(__name__)
89
86
 
90
87
 
@@ -188,45 +185,6 @@ class QuantumRunStatus(Enum):
188
185
  SUCCESSFUL = 1
189
186
 
190
187
 
191
- class ExceptionInfo(pydantic.BaseModel):
192
- """Information about an exception that was raised."""
193
-
194
- type_name: str
195
- """Fully-qualified Python type name for the exception raised."""
196
-
197
- message: str
198
- """String message included in the exception."""
199
-
200
- metadata: dict[str, float | int | str | bool | None]
201
- """Additional metadata included in the exception."""
202
-
203
- @classmethod
204
- def _from_metadata(cls, md: TaskMetadata) -> ExceptionInfo:
205
- """Construct from task metadata.
206
-
207
- Parameters
208
- ----------
209
- md : `TaskMetadata`
210
- Metadata about the error, as written by
211
- `AnnotatedPartialOutputsError`.
212
-
213
- Returns
214
- -------
215
- info : `ExceptionInfo`
216
- Information about the exception.
217
- """
218
- result = cls(type_name=md["type"], message=md["message"], metadata={})
219
- if "metadata" in md:
220
- raw_err_metadata = md["metadata"].to_dict()
221
- for k, v in raw_err_metadata.items():
222
- # Guard against error metadata we couldn't serialize later
223
- # via Pydantic; don't want one weird value bringing down our
224
- # ability to report on an entire run.
225
- if isinstance(v, float | int | str | bool):
226
- result.metadata[k] = v
227
- return result
228
-
229
-
230
188
  class QuantumRun(pydantic.BaseModel):
231
189
  """Information about a quantum in a given run collection."""
232
190
 
@@ -44,12 +44,19 @@ from lsst.daf.butler import (
44
44
  NamedKeyDict,
45
45
  Quantum,
46
46
  )
47
+ from lsst.utils.introspection import get_full_type_name
47
48
  from lsst.utils.timer import logInfo
48
49
 
49
50
  from ._quantumContext import ExecutionResources, QuantumContext
50
- from ._status import AnnotatedPartialOutputsError, InvalidQuantumError, NoWorkFound, QuantumSuccessCaveats
51
+ from ._status import (
52
+ AnnotatedPartialOutputsError,
53
+ ExceptionInfo,
54
+ InvalidQuantumError,
55
+ NoWorkFound,
56
+ QuantumSuccessCaveats,
57
+ )
51
58
  from .connections import AdjustQuantumHelper
52
- from .log_capture import LogCapture
59
+ from .log_capture import LogCapture, _ExecutionLogRecordsExtra
53
60
  from .pipeline_graph import TaskNode
54
61
  from .pipelineTask import PipelineTask
55
62
  from .quantum_graph_executor import QuantumExecutor
@@ -147,6 +154,7 @@ class SingleQuantumExecutor(QuantumExecutor):
147
154
  self._skip_existing = self._butler.run in self._butler.collections.query(
148
155
  skip_existing_in, flatten_chains=True
149
156
  )
157
+ self._previous_process_quanta: list[uuid.UUID] = []
150
158
 
151
159
  def execute(
152
160
  self, task_node: TaskNode, /, quantum: Quantum, quantum_id: uuid.UUID | None = None
@@ -196,7 +204,7 @@ class SingleQuantumExecutor(QuantumExecutor):
196
204
  # or raises an exception do not try to store logs, as they may be
197
205
  # already in butler.
198
206
  captureLog.store = False
199
- if self._check_existing_outputs(quantum, task_node, limited_butler):
207
+ if self._check_existing_outputs(quantum, task_node, limited_butler, captureLog.extra):
200
208
  _LOG.info(
201
209
  "Skipping already-successful quantum for label=%s dataId=%s.",
202
210
  task_node.label,
@@ -205,6 +213,9 @@ class SingleQuantumExecutor(QuantumExecutor):
205
213
  return quantum
206
214
  captureLog.store = True
207
215
 
216
+ captureLog.extra.previous_process_quanta.extend(self._previous_process_quanta)
217
+ if quantum_id is not None:
218
+ self._previous_process_quanta.append(quantum_id)
208
219
  try:
209
220
  quantum = self._updated_quantum_inputs(quantum, task_node, limited_butler)
210
221
  except NoWorkFound as exc:
@@ -261,6 +272,11 @@ class SingleQuantumExecutor(QuantumExecutor):
261
272
  e.__class__.__name__,
262
273
  str(e),
263
274
  )
275
+ captureLog.extra.exception = ExceptionInfo(
276
+ type_name=get_full_type_name(e),
277
+ message=str(e),
278
+ metadata={},
279
+ )
264
280
  raise
265
281
  else:
266
282
  quantumMetadata["butler_metrics"] = butler_metrics.model_dump()
@@ -268,11 +284,13 @@ class SingleQuantumExecutor(QuantumExecutor):
268
284
  # Stringify the UUID for easier compatibility with
269
285
  # PropertyList.
270
286
  quantumMetadata["outputs"] = [str(output) for output in outputsPut]
271
- logInfo(None, "end", metadata=quantumMetadata) # type: ignore[arg-type]
272
- fullMetadata = task.getFullMetadata()
273
- fullMetadata["quantum"] = quantumMetadata
274
- if self._job_metadata is not None:
275
- fullMetadata["job"] = self._job_metadata
287
+ finally:
288
+ logInfo(None, "end", metadata=quantumMetadata) # type: ignore[arg-type]
289
+ fullMetadata = task.getFullMetadata()
290
+ fullMetadata["quantum"] = quantumMetadata
291
+ if self._job_metadata is not None:
292
+ fullMetadata["job"] = self._job_metadata
293
+ captureLog.extra.metadata = fullMetadata
276
294
  self._write_metadata(quantum, fullMetadata, task_node, limited_butler)
277
295
  stopTime = time.time()
278
296
  _LOG.info(
@@ -284,7 +302,12 @@ class SingleQuantumExecutor(QuantumExecutor):
284
302
  return quantum
285
303
 
286
304
  def _check_existing_outputs(
287
- self, quantum: Quantum, task_node: TaskNode, /, limited_butler: LimitedButler
305
+ self,
306
+ quantum: Quantum,
307
+ task_node: TaskNode,
308
+ /,
309
+ limited_butler: LimitedButler,
310
+ log_extra: _ExecutionLogRecordsExtra,
288
311
  ) -> bool:
289
312
  """Decide whether this quantum needs to be executed.
290
313
 
@@ -302,6 +325,8 @@ class SingleQuantumExecutor(QuantumExecutor):
302
325
  Task definition structure.
303
326
  limited_butler : `~lsst.daf.butler.LimitedButler`
304
327
  Butler to use for querying and clobbering.
328
+ log_extra : `.log_capture.TaskLogRecordsExtra`
329
+ Extra information to attach to log records.
305
330
 
306
331
  Returns
307
332
  -------
@@ -337,6 +362,15 @@ class SingleQuantumExecutor(QuantumExecutor):
337
362
  "Looking for existing outputs in the way for label=%s dataId=%s.", task_node.label, quantum.dataId
338
363
  )
339
364
  ref_dict = limited_butler.stored_many(chain.from_iterable(quantum.outputs.values()))
365
+ if task_node.log_output is not None:
366
+ (log_ref,) = quantum.outputs[task_node.log_output.dataset_type_name]
367
+ if ref_dict[log_ref]:
368
+ _LOG.debug(
369
+ "Attaching logs from previous attempt on label=%s dataId=%s.",
370
+ task_node.label,
371
+ quantum.dataId,
372
+ )
373
+ log_extra.attach_previous_attempt(limited_butler.get(log_ref))
340
374
  existingRefs = [ref for ref, exists in ref_dict.items() if exists]
341
375
  missingRefs = [ref for ref, exists in ref_dict.items() if not exists]
342
376
  if existingRefs:
@@ -37,7 +37,7 @@ from uuid import UUID
37
37
  import astropy.time
38
38
 
39
39
  from lsst.daf.butler import DataId
40
- from lsst.daf.butler.registry.queries.expressions.parser import Node, TreeVisitor, parse_expression
40
+ from lsst.daf.butler.queries.expressions.parser import Node, TreeVisitor, parse_expression
41
41
 
42
42
 
43
43
  class _DataIdMatchTreeVisitor(TreeVisitor):
@@ -95,7 +95,7 @@ class ForcedFailure:
95
95
 
96
96
  memory_required: Quantity | None = None
97
97
  """If not `None`, this failure simulates an out-of-memory failure by
98
- raising only if this value exceeds `ExecutionResources.max_mem`.f
98
+ raising only if this value exceeds `ExecutionResources.max_mem`.
99
99
  """
100
100
 
101
101
  def set_config(self, config: MockPipelineTaskConfig) -> None:
lsst/pipe/base/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "29.2025.4500"
2
+ __version__ = "29.2025.4600"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.4500
3
+ Version: 29.2025.4600
4
4
  Summary: Pipeline infrastructure for the Rubin Science Pipelines.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License-Expression: BSD-3-Clause OR GPL-3.0-or-later
@@ -6,7 +6,7 @@ lsst/pipe/base/_dataset_handle.py,sha256=ft_ke1LbhLLndDPARsHSQJUA05LgUFnfWOq2vbw
6
6
  lsst/pipe/base/_instrument.py,sha256=I9UTaj81krR1zkTZ1owfOPBzHN29PY3Egg7fIE5obxQ,30057
7
7
  lsst/pipe/base/_observation_dimension_packer.py,sha256=78Jg2OVFOdXIK62TS2Y3X4095xqCzmiIx9o4TXyADYA,8027
8
8
  lsst/pipe/base/_quantumContext.py,sha256=gb60mTHbgOIEptYvJ64SaChvViXyeKJlG6kEHq4nYVw,19345
9
- lsst/pipe/base/_status.py,sha256=AoCyee9zS1c3SOi38fO8BCQ28fn3JhwDSjYHhQY_ANA,15740
9
+ lsst/pipe/base/_status.py,sha256=7gJPrqt03t1fO5tREc_sfQaN7XmDBvruihORXPnRqUE,21216
10
10
  lsst/pipe/base/_task_metadata.py,sha256=Y4rjrYWvYxYCJwy86VvzxKMkNxEJbYVgLVuXo6KiXac,25638
11
11
  lsst/pipe/base/all_dimensions_quantum_graph_builder.py,sha256=nazY74jrdSCr6CFfPp78JecM_-udW95EYP7grLPO2hg,70830
12
12
  lsst/pipe/base/automatic_connection_constants.py,sha256=H5uuh1rYRpjndgPdb0dh1L_-OyLKdT6VWOZTAb__xCU,3298
@@ -20,7 +20,7 @@ lsst/pipe/base/exec_fixup_data_id.py,sha256=9OjOcH-6AHZ1JnD_CemieI0wWX90J_VdaY9v
20
20
  lsst/pipe/base/execution_graph_fixup.py,sha256=ND0x4hlpeEW-gudo-i2K7HT7MoM5sp_mcoqRMCopSqQ,3815
21
21
  lsst/pipe/base/execution_reports.py,sha256=jYtWCD4PkEAeVUpKIxuiJJVgsCm7qiwCorWVgNHkVgU,17270
22
22
  lsst/pipe/base/graph_walker.py,sha256=Ij7JfYF0srA29VgM_DhbNBxUBeOHDOnujrTQPjVNha0,4694
23
- lsst/pipe/base/log_capture.py,sha256=LylLrxPJyMxU90uSQ15PqFhObDSLWQWGKX6NuXOuwXA,9504
23
+ lsst/pipe/base/log_capture.py,sha256=5r99_Ek2A75vYOMo-z52ltWLdfYfWExm55UU9a4nqmM,12909
24
24
  lsst/pipe/base/mermaid_tools.py,sha256=cdlDJQ1x8k7-VvCLEUqvSC3GR1zCsB-aUTxOjYejNWc,5216
25
25
  lsst/pipe/base/mp_graph_executor.py,sha256=FKlFxjtU2-6SFzX_wsdtMMAj5P09ZE8V65-Sg585g2Y,35501
26
26
  lsst/pipe/base/pipeline.py,sha256=FVaiLhgw9Pzo-nzXKS0dLNafegP0AMZKLtPlSvOSkRU,37563
@@ -31,18 +31,18 @@ lsst/pipe/base/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  lsst/pipe/base/quantum_graph_builder.py,sha256=SwfZny05lJLZQHG69550GoafKWWZhX5Glgu345-VAsE,67981
32
32
  lsst/pipe/base/quantum_graph_executor.py,sha256=WP41iQmihy1jfgaHV6eu2aSrqQx_Fydq3mbEF6CLQ-s,4419
33
33
  lsst/pipe/base/quantum_graph_skeleton.py,sha256=GhSQjRHaErneGY4A4E0tERqg9QPEeYrlpmdLzqFXy6E,28586
34
- lsst/pipe/base/quantum_provenance_graph.py,sha256=SChke6lcSzQQQMbVN_mCZ-RxDj7chehjJrSMvXRuhAI,93372
34
+ lsst/pipe/base/quantum_provenance_graph.py,sha256=33S5iCVxD9Co4oJSU_N8AJXL14Nw0UwGzPEc3gpQiqk,91981
35
35
  lsst/pipe/base/quantum_reports.py,sha256=ut235L88v7SXaeVUvMA9qFl7tpeMwGnzob3X0QoOI_s,14210
36
36
  lsst/pipe/base/resource_usage.py,sha256=LfH7Qf6taI3lxw0aB90riRMn1UxUTMBSqtBjKPJ-XuY,6759
37
37
  lsst/pipe/base/separable_pipeline_executor.py,sha256=vXqJrRI5GNezzGV9QsiaRHEhioDF2Y_W7JQYQCzHR7A,16720
38
38
  lsst/pipe/base/simple_pipeline_executor.py,sha256=QjgX5seueopxPpnJz7H2hBNx-8ucxeT-3BXj6ET_vww,29543
39
- lsst/pipe/base/single_quantum_executor.py,sha256=YWzLJDTRlvMwmtjsIW7XXZEUlLlv7ize-Oxb_0eKTrI,26667
39
+ lsst/pipe/base/single_quantum_executor.py,sha256=pLvmYMUHsK56RXs61Hec76BxZjOGcpJs17ims2fiHhA,27992
40
40
  lsst/pipe/base/struct.py,sha256=Fa-UkpuXOxdzKWbHrMUkJYOszZuBXCm2NesXNR0IOPQ,5048
41
41
  lsst/pipe/base/task.py,sha256=XHBd-7m1a4-6LgobBYA1DgY4H7EV-_RWKfxbhZbMmD4,15145
42
42
  lsst/pipe/base/taskFactory.py,sha256=MsDGECJqZLSZk8SGhpuVhNaP32UWuNvxZiDcZExPFG8,3412
43
43
  lsst/pipe/base/testUtils.py,sha256=lSBKMhoKflbi8JkMNYfEqqHNl-rtFI8UYT3QneDYpLo,18477
44
44
  lsst/pipe/base/utils.py,sha256=JmEt3l0xrh9uayKrSXuQEq12aXOhDr2YXmbYduaxCko,1940
45
- lsst/pipe/base/version.py,sha256=ec8d6sw9aRuINU5Qs4LjOV9LhqSISytoOfEoRYO2XzU,55
45
+ lsst/pipe/base/version.py,sha256=vB8XwkFrtPN40DIouI1mFlxm5jpAZvcGwleFGT1yZhI,55
46
46
  lsst/pipe/base/cli/__init__.py,sha256=861tXIAW7SqtqNUYkjbeEdfg8lDswXsjJQca0gVCFz4,54
47
47
  lsst/pipe/base/cli/_get_cli_subcommands.py,sha256=g_af64klRybBGKAg7fmBSZBdw2LYBAsFON_yQIMZON0,1289
48
48
  lsst/pipe/base/cli/cmd/__init__.py,sha256=3UF2IQEEBor4YMGRNPdcZAVCAI5yFyeHp5nGul4IoyM,1557
@@ -69,7 +69,7 @@ lsst/pipe/base/pipeline_graph/_nodes.py,sha256=GGXfzXvrjNbwPt-0w8cC0l_I6CCNskoDN
69
69
  lsst/pipe/base/pipeline_graph/_pipeline_graph.py,sha256=V5xvlH0VxPsSctWYD5kDT-HybfZqYjMtnZi6n48GEM4,122536
70
70
  lsst/pipe/base/pipeline_graph/_task_subsets.py,sha256=lLvcndSGcZigteWd4eeAM8LxQ1lHPBoysY8PjJTxx1c,13244
71
71
  lsst/pipe/base/pipeline_graph/_tasks.py,sha256=jTLpm5dZMXRNrGi3L45-3DtF95PGwhmejWLZ-zcSTzo,42802
72
- lsst/pipe/base/pipeline_graph/expressions.py,sha256=MZ0qxGA4ctu_WqVjdjjezZF8Jd5174PWbio7EF2wdl0,7717
72
+ lsst/pipe/base/pipeline_graph/expressions.py,sha256=wNNVSWVMDZs_dp4Xd30rt1Xj8PfzWikJKo-amaJ-leM,7690
73
73
  lsst/pipe/base/pipeline_graph/io.py,sha256=zVIybq5JyR1u1FwqF60wG0bIhz_SkgzzQiw2A7a1oNk,30943
74
74
  lsst/pipe/base/pipeline_graph/visualization/__init__.py,sha256=qQctfWuFpcmgRdgu8Y6OsJ_pXpLKrCK-alqfVtIecls,1551
75
75
  lsst/pipe/base/pipeline_graph/visualization/_dot.py,sha256=hgy5Wk4GXptb9GbjPn8-0D9EjWsXKBEEVs1ocHLh_MA,13535
@@ -82,20 +82,20 @@ lsst/pipe/base/pipeline_graph/visualization/_printer.py,sha256=yJMRJ-aXd3nYDgs1F
82
82
  lsst/pipe/base/pipeline_graph/visualization/_show.py,sha256=lPRjO1To2n5r3f_Wgcwy-7TmyJ7UszGGFXAlOtN1wDs,10510
83
83
  lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py,sha256=dp7PXl9Cu7GfWjBi5g8KjXZgnF1KGg_idKKxtICL53Q,8679
84
84
  lsst/pipe/base/quantum_graph/__init__.py,sha256=-Gp3LihB0AXCvhG387wKAEpHRM-NrHGSXMti8cHee90,1437
85
- lsst/pipe/base/quantum_graph/_common.py,sha256=8WnQ5OD4LCz9i5xEWBlo3D3P7gfVRTYAxOkn0mbRvjE,22167
85
+ lsst/pipe/base/quantum_graph/_common.py,sha256=W9T6RIAY7ouLDmlBhNzDegWSicrIvBc5IZBb0dMiiTc,22415
86
86
  lsst/pipe/base/quantum_graph/_multiblock.py,sha256=FQa8lafbuS4sD1rZE_ivQb-WTiHZkOol0OGCHNbTpq8,29125
87
- lsst/pipe/base/quantum_graph/_predicted.py,sha256=FHLqcEBBuJmIf_3eEUMdBNm70t9DvDWaxGp8bHTWJSA,88056
88
- lsst/pipe/base/quantum_graph/_provenance.py,sha256=zb7YXiIYnLPYaej9f9tl8aW8wtxow3YT79yk1vdErQg,48554
87
+ lsst/pipe/base/quantum_graph/_predicted.py,sha256=bump280npUkcYBUu9blJp8-e-Xrp-3LVE0Pb_0ZeNMo,87845
88
+ lsst/pipe/base/quantum_graph/_provenance.py,sha256=5CseVwuTXEwz6pw9uX4LFbtHVehS0hqG1CLUcU3TKA0,58607
89
89
  lsst/pipe/base/quantum_graph/visualization.py,sha256=EbTWhk9aPq7sX6bcHmnEIsr2xuuR6d1SxspQbRe8D0Q,12235
90
90
  lsst/pipe/base/quantum_graph/aggregator/__init__.py,sha256=4CK8sP_ZjUKmxKS3LnCH1zG7XSk9IEwijrluRBHhEMU,7436
91
- lsst/pipe/base/quantum_graph/aggregator/_communicators.py,sha256=QERfDavbc_3dcRizrTtKtDha647aMBhFt74bH6N36QA,36375
91
+ lsst/pipe/base/quantum_graph/aggregator/_communicators.py,sha256=uuA97jMEzpKX1hkhYbvnRa4-lASfPEC9cEZByFNuWAY,36404
92
92
  lsst/pipe/base/quantum_graph/aggregator/_config.py,sha256=iV1Ejfk-UnFoQ8TkpJE_jMZYHsmZcdLm5R-FnQEqO7s,5167
93
93
  lsst/pipe/base/quantum_graph/aggregator/_ingester.py,sha256=ohZOfQi9VL7fHEn_P84NOaSYvbzeDZIvk71UWL7ZHnY,13746
94
- lsst/pipe/base/quantum_graph/aggregator/_progress.py,sha256=D0PrjwdJTuPvgQwLeD90nocMgrNnSzkeQmXcvPFV7jc,7155
95
- lsst/pipe/base/quantum_graph/aggregator/_scanner.py,sha256=EcglaQBMjVxEJyikBAfCOvoqta6fMjKmtZGAOtgjNJE,15412
96
- lsst/pipe/base/quantum_graph/aggregator/_structs.py,sha256=nn7CVzYPFLZmCOeZhf47H8CIszUL0x3dNgUbGHazpl4,5475
97
- lsst/pipe/base/quantum_graph/aggregator/_supervisor.py,sha256=HoBAm1ojovpoIvl4KZKCOzSp1BF4YFZLtU8skUFX4O4,9287
98
- lsst/pipe/base/quantum_graph/aggregator/_writer.py,sha256=u6YubtNiLjFkvH5grQ94Y9ZU9rKUAtK77y07qh5EIo8,24679
94
+ lsst/pipe/base/quantum_graph/aggregator/_progress.py,sha256=jiz9Np73uUQ03CtH7pI6TXxXrwFUChh5hSj_gbMGHr0,7207
95
+ lsst/pipe/base/quantum_graph/aggregator/_scanner.py,sha256=-KhVNc9fgLCl3gIzHuAh8xaXk0fNUA_DUGsKCmKhegU,21428
96
+ lsst/pipe/base/quantum_graph/aggregator/_structs.py,sha256=Wbzc_set7qtWE41UHc93XL2FshbxuUL0Ulov_CN9WoY,5133
97
+ lsst/pipe/base/quantum_graph/aggregator/_supervisor.py,sha256=wBgFE55e6Oc5JPLe8S2gndVbVQwFwDHnmtEOBy5QwIk,9419
98
+ lsst/pipe/base/quantum_graph/aggregator/_writer.py,sha256=DpVkKEJVSiHJh21b0iip8_joKLrOYkUvDylhj7DUyxo,24555
99
99
  lsst/pipe/base/script/__init__.py,sha256=cLEXE7aq5UZ0juL_ScmRw0weFgp4tDgwEX_ts-NEYic,1522
100
100
  lsst/pipe/base/script/register_instrument.py,sha256=TRC2r2tSoYBNWNVQya01ELxAtGH8WVk9Ya-uNgCIL5U,2426
101
101
  lsst/pipe/base/script/retrieve_artifacts_for_quanta.py,sha256=pYI0wNl5PU8ImgzWfGEDrRz3PSKSg2szWLEIVKdm7Og,3939
@@ -109,17 +109,17 @@ lsst/pipe/base/tests/pipelineStepTester.py,sha256=KGxdB8gdVpSey2RUGURDIzIfPL-4qv
109
109
  lsst/pipe/base/tests/simpleQGraph.py,sha256=WHphpVvOA9eSbVtUp884wjk4g6ppFLM7gnddDYSwnTc,19862
110
110
  lsst/pipe/base/tests/util.py,sha256=IXpZOC58fdRnurB5lPcNX-xRgKEV-cPNkWKJDFIr1gs,4772
111
111
  lsst/pipe/base/tests/mocks/__init__.py,sha256=fDy9H9vRAIBpKDJEXNZuDWJMzWZfpcBT4TmyOw4o-RY,1572
112
- lsst/pipe/base/tests/mocks/_data_id_match.py,sha256=v33QZhZm-srXZAXZ8NbNKGN-_ql4AzaArBUk1lxhyss,7474
113
- lsst/pipe/base/tests/mocks/_pipeline_task.py,sha256=_n16lDsk3ItWi2J28Qheuqphr4aaCK6CN9acmJ1hAqI,30692
112
+ lsst/pipe/base/tests/mocks/_data_id_match.py,sha256=jVekStcrItC0tqOCc01VjYaiE9exYm3MRkwB0Gh_3J0,7465
113
+ lsst/pipe/base/tests/mocks/_pipeline_task.py,sha256=N3fC4OMAMWWnYtyLkVdMfb9ZiFse39HniRDvlAOofOY,30691
114
114
  lsst/pipe/base/tests/mocks/_repo.py,sha256=OTJw_fi37w7bkZbbLa7z51W-45zxySAnLbV7Qv_aSB4,27423
115
115
  lsst/pipe/base/tests/mocks/_storage_class.py,sha256=12IFfJMbZ5GkYlMX6ZMWiG8pMZc2Jlxke3qQW-bljdU,27434
116
- lsst_pipe_base-29.2025.4500.dist-info/licenses/COPYRIGHT,sha256=kB3Z9_f6a6uFLGpEmNJT_n186CE65H6wHu4F6BNt_zA,368
117
- lsst_pipe_base-29.2025.4500.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
118
- lsst_pipe_base-29.2025.4500.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
119
- lsst_pipe_base-29.2025.4500.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
120
- lsst_pipe_base-29.2025.4500.dist-info/METADATA,sha256=BHl-Qpb1hJmoF9KL7Hio_E2xmHzaSwKbl6RI5lolrA4,2257
121
- lsst_pipe_base-29.2025.4500.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
- lsst_pipe_base-29.2025.4500.dist-info/entry_points.txt,sha256=bnmUhJBsChxMdqST9VmFBYYKxLQoToOfqW1wjW7khjk,64
123
- lsst_pipe_base-29.2025.4500.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
124
- lsst_pipe_base-29.2025.4500.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
125
- lsst_pipe_base-29.2025.4500.dist-info/RECORD,,
116
+ lsst_pipe_base-29.2025.4600.dist-info/licenses/COPYRIGHT,sha256=kB3Z9_f6a6uFLGpEmNJT_n186CE65H6wHu4F6BNt_zA,368
117
+ lsst_pipe_base-29.2025.4600.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
118
+ lsst_pipe_base-29.2025.4600.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
119
+ lsst_pipe_base-29.2025.4600.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
120
+ lsst_pipe_base-29.2025.4600.dist-info/METADATA,sha256=Ni9gwJOKJi1MoBd8EFnh7Z20hmqWTS5IxxEXtnf3M54,2257
121
+ lsst_pipe_base-29.2025.4600.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
+ lsst_pipe_base-29.2025.4600.dist-info/entry_points.txt,sha256=bnmUhJBsChxMdqST9VmFBYYKxLQoToOfqW1wjW7khjk,64
123
+ lsst_pipe_base-29.2025.4600.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
124
+ lsst_pipe_base-29.2025.4600.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
125
+ lsst_pipe_base-29.2025.4600.dist-info/RECORD,,