lsst-ctrl-mpexec 29.2025.1100__py3-none-any.whl → 29.2025.1300__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.
- lsst/ctrl/mpexec/cli/cmd/commands.py +26 -1
- lsst/ctrl/mpexec/cli/script/report.py +67 -64
- lsst/ctrl/mpexec/version.py +1 -1
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/METADATA +3 -2
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/RECORD +13 -13
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/WHEEL +1 -1
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/entry_points.txt +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses}/COPYRIGHT +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses}/LICENSE +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses}/bsd_license.txt +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses}/gpl-v3.0.txt +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/top_level.txt +0 -0
- {lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/zip-safe +0 -0
|
@@ -382,6 +382,18 @@ def update_graph_run(
|
|
|
382
382
|
"even when there is only one qgraph. Otherwise, the `QuantumGraphExecutionReport` "
|
|
383
383
|
"will run on one graph by default.",
|
|
384
384
|
)
|
|
385
|
+
@click.option(
|
|
386
|
+
"--read-caveats",
|
|
387
|
+
type=click.Choice(["exhaustive", "lazy", "none"], case_sensitive=False),
|
|
388
|
+
default="lazy",
|
|
389
|
+
)
|
|
390
|
+
@click.option(
|
|
391
|
+
"--use-qbb/--no-use-qbb",
|
|
392
|
+
is_flag=True,
|
|
393
|
+
default=True,
|
|
394
|
+
help="Whether to use a quantum-backed butler for metadata and log reads.",
|
|
395
|
+
)
|
|
396
|
+
@processes_option()
|
|
385
397
|
def report(
|
|
386
398
|
repo: str,
|
|
387
399
|
qgraphs: Sequence[str],
|
|
@@ -392,6 +404,9 @@ def report(
|
|
|
392
404
|
brief: bool = False,
|
|
393
405
|
curse_failed_logs: bool = False,
|
|
394
406
|
force_v2: bool = False,
|
|
407
|
+
read_caveats: str = "lazy",
|
|
408
|
+
use_qbb: bool = True,
|
|
409
|
+
processes: int = 1,
|
|
395
410
|
) -> None:
|
|
396
411
|
"""Summarize the state of executed quantum graph(s), with counts of failed,
|
|
397
412
|
successful and expected quanta, as well as counts of output datasets and
|
|
@@ -417,7 +432,17 @@ def report(
|
|
|
417
432
|
"""
|
|
418
433
|
if any([force_v2, len(qgraphs) > 1, collections, where, curse_failed_logs]):
|
|
419
434
|
script.report_v2(
|
|
420
|
-
repo,
|
|
435
|
+
repo,
|
|
436
|
+
qgraphs,
|
|
437
|
+
collections,
|
|
438
|
+
where,
|
|
439
|
+
full_output_filename,
|
|
440
|
+
logs,
|
|
441
|
+
brief,
|
|
442
|
+
curse_failed_logs,
|
|
443
|
+
read_caveats=(read_caveats if read_caveats != "none" else None), # type: ignore[arg-type]
|
|
444
|
+
use_qbb=use_qbb,
|
|
445
|
+
n_cores=processes,
|
|
421
446
|
)
|
|
422
447
|
else:
|
|
423
448
|
assert len(qgraphs) == 1, "Cannot make a report without a quantum graph."
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
27
27
|
import pprint
|
|
28
28
|
from collections.abc import Sequence
|
|
29
|
+
from typing import Literal
|
|
29
30
|
|
|
30
31
|
from astropy.table import Table
|
|
31
32
|
|
|
@@ -48,23 +49,22 @@ def report(
|
|
|
48
49
|
|
|
49
50
|
Parameters
|
|
50
51
|
----------
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
option is good for those who just want to see totals.
|
|
52
|
+
butler_config : `str`
|
|
53
|
+
The Butler used for this report. This should match the Butler used for
|
|
54
|
+
the run associated with the executed quantum graph.
|
|
55
|
+
qgraph_uri : `str`
|
|
56
|
+
The uri of the location of said quantum graph.
|
|
57
|
+
full_output_filename : `str`
|
|
58
|
+
Output the full summary report to a yaml file (named herein). Each data
|
|
59
|
+
id and error message is keyed to a quantum graph node id. A convenient
|
|
60
|
+
output format for error-matching and cataloguing tools such as the ones
|
|
61
|
+
in the Campaign Management database. If this is not included, quanta
|
|
62
|
+
and dataset information will be printed to the command-line instead.
|
|
63
|
+
logs : `bool`
|
|
64
|
+
Get butler log datasets for extra information (error messages).
|
|
65
|
+
brief : `bool`
|
|
66
|
+
List only the counts (or data_ids if number of failures < 5). This
|
|
67
|
+
option is good for those who just want to see totals.
|
|
68
68
|
"""
|
|
69
69
|
butler = Butler.from_config(butler_config, writeable=False)
|
|
70
70
|
qgraph = QuantumGraph.loadUri(qgraph_uri)
|
|
@@ -125,6 +125,9 @@ def report_v2(
|
|
|
125
125
|
logs: bool = True,
|
|
126
126
|
brief: bool = False,
|
|
127
127
|
curse_failed_logs: bool = False,
|
|
128
|
+
read_caveats: Literal["lazy", "exhaustive"] | None = "lazy",
|
|
129
|
+
use_qbb: bool = True,
|
|
130
|
+
n_cores: int = 1,
|
|
128
131
|
) -> None:
|
|
129
132
|
"""Summarize the state of executed quantum graph(s), with counts of failed,
|
|
130
133
|
successful and expected quanta, as well as counts of output datasets and
|
|
@@ -135,62 +138,62 @@ def report_v2(
|
|
|
135
138
|
Parameters
|
|
136
139
|
----------
|
|
137
140
|
butler_config : `str`
|
|
138
|
-
|
|
139
|
-
|
|
141
|
+
The Butler used for this report. This should match the Butler used for
|
|
142
|
+
the run associated with the executed quantum graph.
|
|
140
143
|
qgraph_uris : `Sequence` [`str`]
|
|
141
|
-
|
|
144
|
+
One or more uris to the serialized Quantum Graph(s).
|
|
142
145
|
collections : `Sequence` [`str`] | None`
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
+
Collection(s) associated with said graphs/processing. For use in
|
|
147
|
+
`lsst.daf.butler.registry.queryDatasets` if paring down the query would
|
|
148
|
+
be useful.
|
|
146
149
|
where : `str`
|
|
147
|
-
|
|
150
|
+
A "where" string to use to constrain the collections, if passed.
|
|
148
151
|
full_output_filename : `str`
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
(counts-only) summary to stdout.
|
|
152
|
+
Output the full pydantic model `QuantumProvenanceGraph.Summary` object
|
|
153
|
+
into a JSON file. This is ideal for error-matching and cataloguing
|
|
154
|
+
tools such as the ones used by Campaign Management software and pilots,
|
|
155
|
+
and for searching and counting specific kinds or instances of failures.
|
|
156
|
+
This option will also print a "brief" (counts-only) summary to stdout.
|
|
155
157
|
logs : `bool`
|
|
156
|
-
|
|
157
|
-
|
|
158
|
+
Store error messages from Butler logs associated with failed quanta if
|
|
159
|
+
`True`.
|
|
158
160
|
brief : `bool`
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
quanta.
|
|
161
|
+
Only display short (counts-only) summary on stdout. This includes
|
|
162
|
+
counts and not error messages or data_ids (similar to BPS report). This
|
|
163
|
+
option will still report all `cursed` datasets and `wonky` quanta.
|
|
163
164
|
curse_failed_logs : `bool`
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
Mark log datasets as `cursed` if they are published in the final output
|
|
166
|
+
collection. Note that a campaign-level collection must be used here for
|
|
167
|
+
`collections` if `curse_failed_logs` is `True`; if
|
|
168
|
+
`lsst.pipe.base.QuantumProvenanceGraph.__resolve_duplicates` is run on
|
|
169
|
+
a list of group-level collections, then each will only show log
|
|
170
|
+
datasets from their own failures as visible and datasets from others
|
|
171
|
+
will be marked as cursed.
|
|
172
|
+
read_caveats : `str`, optional
|
|
173
|
+
Whether and how to read success caveats from metadata datasets:
|
|
174
|
+
|
|
175
|
+
- "exhaustive": read all metadata datasets;
|
|
176
|
+
- "lazy": read metadata datasets only for quanta that had predicted
|
|
177
|
+
outputs that were not produced (will not pick up exceptions raised
|
|
178
|
+
after all datasets were written);
|
|
179
|
+
- `None`: do not read metadata datasets at all.
|
|
180
|
+
use_qbb : `bool`, optional
|
|
181
|
+
Whether to use a quantum-backed butler for metadata and log reads.
|
|
182
|
+
This should reduce the number of database operations.
|
|
183
|
+
n_cores : `int`, optional
|
|
184
|
+
Number of cores for metadata and log reads.
|
|
171
185
|
"""
|
|
172
186
|
butler = Butler.from_config(butler_config, writeable=False)
|
|
173
|
-
qpg = QuantumProvenanceGraph(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
previous_graph = qgraphs[count - 1]
|
|
184
|
-
if count > 0 and qgraph.metadata["time"] < previous_graph.metadata["time"]:
|
|
185
|
-
raise RuntimeError(
|
|
186
|
-
f"""add_new_graph may only be called on graphs
|
|
187
|
-
which are passed in the order they were
|
|
188
|
-
created. Please call again, passing your
|
|
189
|
-
graphs in order. Time of second graph:
|
|
190
|
-
{qgraph.metadata["time"]} >
|
|
191
|
-
time of first graph: {previous_graph.metadata["time"]}"""
|
|
192
|
-
)
|
|
193
|
-
qpg.assemble_quantum_provenance_graph(butler, qgraphs, collections, where, curse_failed_logs)
|
|
187
|
+
qpg = QuantumProvenanceGraph(
|
|
188
|
+
butler,
|
|
189
|
+
qgraph_uris,
|
|
190
|
+
collections=collections,
|
|
191
|
+
where=where,
|
|
192
|
+
curse_failed_logs=curse_failed_logs,
|
|
193
|
+
read_caveats=read_caveats,
|
|
194
|
+
use_qbb=use_qbb,
|
|
195
|
+
n_cores=n_cores,
|
|
196
|
+
)
|
|
194
197
|
summary = qpg.to_summary(butler, do_store_logs=logs)
|
|
195
198
|
print_summary(summary, full_output_filename, brief)
|
|
196
199
|
|
lsst/ctrl/mpexec/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["__version__"]
|
|
2
|
-
__version__ = "29.2025.
|
|
2
|
+
__version__ = "29.2025.1300"
|
{lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-ctrl-mpexec
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.1300
|
|
4
4
|
Summary: Pipeline execution infrastructure for the Rubin Observatory LSST Science Pipelines.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -33,6 +33,7 @@ Provides-Extra: coverage
|
|
|
33
33
|
Requires-Dist: coverage; extra == "coverage"
|
|
34
34
|
Provides-Extra: test
|
|
35
35
|
Requires-Dist: pytest>=3.2; extra == "test"
|
|
36
|
+
Dynamic: license-file
|
|
36
37
|
|
|
37
38
|
################
|
|
38
39
|
lsst-ctrl-mpexec
|
|
@@ -17,12 +17,12 @@ lsst/ctrl/mpexec/simple_pipeline_executor.py,sha256=scqQ1MDS6FcZvFTwxtCkmTSg0zJm
|
|
|
17
17
|
lsst/ctrl/mpexec/singleQuantumExecutor.py,sha256=mlv3nF29N1meiHie3r072Ynz5k6XTpFO8jfhq7BufF8,28036
|
|
18
18
|
lsst/ctrl/mpexec/taskFactory.py,sha256=c4xj8cR_Ts5uzzGovh87ZKdVeeXy5E3lIjCwJnDuOqg,2720
|
|
19
19
|
lsst/ctrl/mpexec/util.py,sha256=y2Rw5PL40_EuLtVxiqSVX0JfPV4IrFl1LfOMUWx2u30,4236
|
|
20
|
-
lsst/ctrl/mpexec/version.py,sha256=
|
|
20
|
+
lsst/ctrl/mpexec/version.py,sha256=tryL-NT2fHNIinBXQOOXxLFsVaDOMR53wZgDt_5tYb0,55
|
|
21
21
|
lsst/ctrl/mpexec/cli/__init__.py,sha256=6dpDHNBzyicVpFi1fsaiYVbYEMeoL57IHKkPaej24gs,1301
|
|
22
22
|
lsst/ctrl/mpexec/cli/pipetask.py,sha256=4HnhX9dCizCihVbpHVJX5WXO9TEli9oL6wA-tPh1_vA,2209
|
|
23
23
|
lsst/ctrl/mpexec/cli/utils.py,sha256=5iOrlj5jJTWtZS0BMLsuiCGAvxbfrjd1MSyXxBthWcc,6503
|
|
24
24
|
lsst/ctrl/mpexec/cli/cmd/__init__.py,sha256=nRmwwW5d55gAEkyE7NpSK8mxa56HcfEta2r-Y9I07F8,1661
|
|
25
|
-
lsst/ctrl/mpexec/cli/cmd/commands.py,sha256=
|
|
25
|
+
lsst/ctrl/mpexec/cli/cmd/commands.py,sha256=7ohYuNeUhnnyNvWYWYBdHLkNm5VWsOQiOh6HjzBBYXc,17539
|
|
26
26
|
lsst/ctrl/mpexec/cli/opt/__init__.py,sha256=IzUInuJj9igiaNcEqMx0adelgJtQC5_XMYnaiizBn0A,1378
|
|
27
27
|
lsst/ctrl/mpexec/cli/opt/arguments.py,sha256=vjUw0ZN_4HStp-_3ne6AT5S_eH7sly3OVfL07tgrJnY,1572
|
|
28
28
|
lsst/ctrl/mpexec/cli/opt/optionGroups.py,sha256=z1vrRsNlk11cGulbD9qsBOuPhZgryPrka_IxIeVW9TM,8031
|
|
@@ -34,17 +34,17 @@ lsst/ctrl/mpexec/cli/script/confirmable.py,sha256=Bo1GSTZQn44d_TRj6N3YfpYcZiuHEY
|
|
|
34
34
|
lsst/ctrl/mpexec/cli/script/pre_exec_init_qbb.py,sha256=DGNseiavrI1VxR_o6vCelbPvr9kCQZzroZHHSQe-RTE,2479
|
|
35
35
|
lsst/ctrl/mpexec/cli/script/purge.py,sha256=gYwSsZfTBP6oDcDp_YdqQEKGvAStvsj5hwNw42S8ptE,10637
|
|
36
36
|
lsst/ctrl/mpexec/cli/script/qgraph.py,sha256=p5z84bmRBbZXIEql76nXYnRQcLau-VNTUVkfOhdqjfU,9805
|
|
37
|
-
lsst/ctrl/mpexec/cli/script/report.py,sha256=
|
|
37
|
+
lsst/ctrl/mpexec/cli/script/report.py,sha256=AssS4S99LFrPZtATsu7lsXVdxk7mOwfrdM9LXmUxgZ0,11427
|
|
38
38
|
lsst/ctrl/mpexec/cli/script/run.py,sha256=22g7vBhGDGsFSQq7CtruTf-bivo3t53decBAV0wAg1g,9767
|
|
39
39
|
lsst/ctrl/mpexec/cli/script/run_qbb.py,sha256=oCEydg13zNAtci8XB0IwXx_D5PPsHbjCPATWoBlhcPk,5294
|
|
40
40
|
lsst/ctrl/mpexec/cli/script/update_graph_run.py,sha256=v_EdOaD6jR_vSlgm_5-pwUjoNEFMrAuYFM1xIaHVU3Q,2597
|
|
41
|
-
lsst_ctrl_mpexec-29.2025.
|
|
42
|
-
lsst_ctrl_mpexec-29.2025.
|
|
43
|
-
lsst_ctrl_mpexec-29.2025.
|
|
44
|
-
lsst_ctrl_mpexec-29.2025.
|
|
45
|
-
lsst_ctrl_mpexec-29.2025.
|
|
46
|
-
lsst_ctrl_mpexec-29.2025.
|
|
47
|
-
lsst_ctrl_mpexec-29.2025.
|
|
48
|
-
lsst_ctrl_mpexec-29.2025.
|
|
49
|
-
lsst_ctrl_mpexec-29.2025.
|
|
50
|
-
lsst_ctrl_mpexec-29.2025.
|
|
41
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses/COPYRIGHT,sha256=pGCjnRAnyt02a6_9PLzXQikpvYmvMmK9fCdOKlRSV6k,369
|
|
42
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
|
|
43
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
|
|
44
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
45
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/METADATA,sha256=FlKQIJZKX8EfRF1yM6xXCbtIAHE5XfFB2ULaqZSw4dE,2302
|
|
46
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
47
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/entry_points.txt,sha256=aYE38yqZU8qvpLUUkXzgmUxDJYYknEqPxgxYkowrL4s,64
|
|
48
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
|
|
49
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
50
|
+
lsst_ctrl_mpexec-29.2025.1300.dist-info/RECORD,,
|
{lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info/licenses}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/top_level.txt
RENAMED
|
File without changes
|
{lsst_ctrl_mpexec-29.2025.1100.dist-info → lsst_ctrl_mpexec-29.2025.1300.dist-info}/zip-safe
RENAMED
|
File without changes
|