From d5918a59d1a73bf6431e01a05f99bc9fc208a229 Mon Sep 17 00:00:00 2001 From: William Benoit Date: Thu, 24 Sep 2026 11:35:40 -0400 Subject: [PATCH 1/4] Change for resources are defined --- Snakefile | 1 + pipeline/README.md | 3 +- pipeline/config/config.yaml | 40 +- pipeline/envs/snakemake.conda-lock.yml | 996 +++++++++++++------------ pipeline/envs/snakemake.yaml | 2 +- pipeline/profiles/delta/config.yaml | 46 +- pipeline/profiles/ldg/config.yaml | 40 +- pipeline/resources.smk | 46 ++ projects/data/data.smk | 20 + projects/export/export.smk | 4 +- projects/infer/infer.smk | 16 +- projects/plots/plots.smk | 3 + projects/train/train.smk | 4 +- 13 files changed, 635 insertions(+), 586 deletions(-) create mode 100644 pipeline/resources.smk diff --git a/Snakefile b/Snakefile index f18df15f6..b25287cab 100644 --- a/Snakefile +++ b/Snakefile @@ -32,6 +32,7 @@ run_dir = Path(config["run_dir"]) log_dir = Path(config["log_dir"]) +include: "pipeline/resources.smk" include: "projects/data/data.smk" include: "projects/train/train.smk" include: "projects/export/export.smk" diff --git a/pipeline/README.md b/pipeline/README.md index 3dd2f3d32..93f651052 100644 --- a/pipeline/README.md +++ b/pipeline/README.md @@ -81,7 +81,8 @@ Profiles determine snakemake configuration: - **`local`**: run everything as a subprocess on the local node for testing. - **`condor`**: the LDG profile (name changed in PR #504). - Per-rule resources are set with `set-resources`. Two LDG + Per-rule memory and walltime come from the run config's + `resources` block (see `pipeline/resources.smk`). Two LDG specifics worth knowing: - SciTokens: every job receives `+OAuthServicesNeeded = scitokens` and accounting group attributes from `$ENV(LIGO_GROUP)` / diff --git a/pipeline/config/config.yaml b/pipeline/config/config.yaml index cc4210254..348f839c0 100644 --- a/pipeline/config/config.yaml +++ b/pipeline/config/config.yaml @@ -88,17 +88,49 @@ max_num_samples: 3000 # max waveforms generated per rejection-sampling batch # Number of condor jobs that validation waveforms are split across num_validation_jobs: 200 -# --- Slurm ------------------------------------------------------------------- -# GPU partition for training. +# --- Resources --------------------------------------------------------------- +# Memory (MB) and walltime (minutes) for rules submitted as batch jobs, +# under slurm or condor. Rules and keys not listed here use the profile's +# default-resources. +resources: + fetch_train_background: {mem_mb: 6144, runtime: 480} + fetch_test_background: {mem_mb: 6144, runtime: 480} + testing_waveforms_branch: {mem_mb: 8192, runtime: 60} + aggregate_testing_waveforms: {mem_mb: 2048, runtime: 10} + val_waveforms_branch: {mem_mb: 6144, runtime: 60} + aggregate_val_waveforms: {mem_mb: 2048, runtime: 10} + training_waveforms_branch: {mem_mb: 2048, runtime: 30} + aggregate_training_waveforms: {mem_mb: 2048, runtime: 10} + train: {mem_mb: 32000, runtime: 2880} + export: {mem_mb: 32000, runtime: 10} + compile_model: {mem_mb: 32000, runtime: 10} + # scale runtime with branches_per_job + infer_group: {mem_mb: 8192, runtime: 20} + aggregate_infer: {mem_mb: 4096, runtime: 15} + sensitive_volume: {mem_mb: 16384, runtime: 15} + +# --- GPUs -------------------------------------------------------------------- +# Slurm GPU partition for training. train_partition: gpuA40x4 # Number of GPUs to request for training. Must match trainer.devices in # your train.yaml. train_num_gpus: 1 -# GPU partition for export and inference. +# Slurm GPU partition for export and inference. inference_partition: gpuA40x4 +# Condor GPU matchmaking for in-process inference. +# gpu_min_memory_mb: null sets no memory minimum. +gpu_min_capability: 7.0 +gpu_min_memory_mb: null + +# An AOTI package only runs on the architecture it was compiled for, so +# with inference_backend: aoti, compile_model and infer_group are pinned +# to exactly this capability. +# 8.6 is the A10. +aoti_gpu_capability: 8.6 + # --- Training ---------------------------------------------------------------- # Lightning CLI YAML config for `train fit`. train_config: projects/train/train.yaml @@ -134,7 +166,7 @@ inference_mode: triton # on clusters with heterogeneous GPU pools like OSG. inference_backend: export -# Number of (file, shift) branches each job processes +# Maximum number of (file, shift) branches each job processes. branches_per_job: 1 # Preprocessor class compiled into the served model. Its init_args are diff --git a/pipeline/envs/snakemake.conda-lock.yml b/pipeline/envs/snakemake.conda-lock.yml index a45b0dc92..4e881c7f1 100644 --- a/pipeline/envs/snakemake.conda-lock.yml +++ b/pipeline/envs/snakemake.conda-lock.yml @@ -13,7 +13,7 @@ version: 1 metadata: content_hash: - linux-64: 550d6bbd4fb8b628495a66e37a6d689363c520bfd4624a78e350a95557298957 + linux-64: 612775933b808fdb87c8243fc51e361870e182da7a54945ff12a616b70c87786 channels: - url: conda-forge used_env_vars: [] @@ -38,42 +38,42 @@ package: category: main optional: false - name: amply - version: 0.1.6 + version: 0.1.7 manager: conda platform: linux-64 dependencies: docutils: '>=0.3' pyparsing: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.6-pyhd8ed1ab_1.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/amply-0.1.7-pyhd8ed1ab_0.conda hash: - md5: 5a81866192811f3a0827f5f93e589f02 - sha256: e8d87cb66bcc62bc8d8168037b776de962ebf659e45acb1a813debde558f7339 + md5: 69a01a9927733014f3955861e2969a7b + sha256: a21c69c91d735faaf7b74dc2b3d013b14016951b66354461fc1d796caab9b1c4 category: main optional: false - name: annotated-doc - version: 0.0.4 + version: 0.0.5 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.5-pyhcf101f3_0.conda hash: - md5: 52be5139047efadaeeb19c6a5103f92a - sha256: cc9fbc50d4ee7ee04e49ee119243e6f1765750f0fd0b4d270d5ef35461b643b1 + md5: d68ec17cb915cab4642357417ec0a104 + sha256: a0a320c709fded9b5178108dedebf81a1f5a5d9c7720e3af50c1ab058dadd296 category: main optional: false - name: annotated-types - version: 0.7.0 + version: 0.8.0 manager: conda platform: linux-64 dependencies: - python: '>=3.9' + python: '>=3.10' typing-extensions: '>=4.0.0' - url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.8.0-pyhd8ed1ab_0.conda hash: - md5: 2934f256a8acfe48f6ebb4fce6cde29c - sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 + md5: 108c928d2a8551832dbc762b535e90bb + sha256: b8fcb994134d3918d1c64a9d62f4168ff85d5bfb89e698102fe4ed679fe0df24 category: main optional: false - name: argparse-dataclass @@ -93,7 +93,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda hash: md5: c6b0543676ecb1fb2d7643941fe375f2 @@ -101,15 +101,15 @@ package: category: main optional: false - name: backports.zstd - version: 1.6.0 + version: 1.7.0 manager: conda platform: linux-64 dependencies: python: '>=3.14' - url: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.7.0-py314h680f03e_1.conda hash: - md5: 40d89d8546ad6e139e73ec8f6d56068b - sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 + md5: 67924260a851b5273e39f9b28b6b5e24 + sha256: ad0f78582ee64ec1c66a3daac32986e81b400d3ac719e5a3cbdb22e55065760e category: main optional: false - name: brotli-python @@ -118,14 +118,14 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' + libgcc: '>=15' + libstdcxx: '>=15' python: '>=3.14,<3.15.0a0' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hcd2bdb6_4.conda hash: - md5: 8910d2c46f7e7b519129f486e0fe927a - sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 + md5: d9aabceecc99b3b8b0eb7090c5776af4 + sha256: e9cc0891a0dc5c3fa8c71dd2224491b6658c069af7a49ce4443158730990b6fd category: main optional: false - name: bzip2 @@ -135,59 +135,59 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda hash: - md5: d2ffd7602c02f2b316fd921d39876885 - sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: e675fabcf81499adc7edf58124fb1e01 + sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 category: main optional: false - name: c-ares - version: 1.34.6 + version: 1.34.8 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda hash: - md5: 920bb03579f15389b9e512095ad995b7 - sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 3ad2b403be8fc5612b9159e2ce621f69 + sha256: 9c37cc233238adf366ea75b0e845662a5be07ceadf62e458183516369340274b category: main optional: false - name: ca-certificates - version: 2026.6.17 + version: 2026.7.22 manager: conda platform: linux-64 dependencies: __unix: '' - url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda hash: - md5: a9965dd99f683c5f444428f896635716 - sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: 0f51e2391ade309db462a55611263e9c + sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 category: main optional: false - name: certifi - version: 2026.6.17 + version: 2026.7.22 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda hash: - md5: c13824fedced67005d3832c152fe9c2f - sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f + md5: 37e13edbe3b48f1095a9d085ef9cd83b + sha256: fb167de4388e64e52aa3907ed099afab944c1fa6e5f74b281a312dae1bcf7f3b category: main optional: false - name: charset-normalizer - version: 3.4.7 + version: 3.5.1 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda hash: - md5: a9167b9571f3baa9d448faa2139d1089 - sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 + md5: e0ac3accc64e23e40969d660e5f58ac8 + sha256: cb60ef3e0631c8bacb4f7057196dee4496091a22baa3bb4b9bccb12c7e1c921b category: main optional: false - name: coin-or-cbc @@ -347,16 +347,16 @@ package: category: main optional: false - name: configargparse - version: 1.7.5 + version: 1.7.7 manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.11' toml: '' - url: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.5-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7.7-pyh5ded981_0.conda hash: - md5: 12389a21e7f69704b0ae77f44355e30b - sha256: 7f8ea42a8411b433ec7244dfd30637d90564256c13a114dbe42455fe032ae89c + md5: 7a74be255ce9f2f8a79d99fd67f144f3 + sha256: ed025680bbb12e5079cbc390481e613310dbf81e56db05ca07061e90af485de9 category: main optional: false - name: connection_pool @@ -396,7 +396,7 @@ package: category: main optional: false - name: eido - version: 0.2.5 + version: 0.2.6 manager: conda platform: linux-64 dependencies: @@ -405,10 +405,10 @@ package: peppy: '>=0.40.6' python: '>=3.8' ubiquerg: '>=0.6.2' - url: https://conda.anaconda.org/conda-forge/noarch/eido-0.2.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/eido-0.2.6-pyhd8ed1ab_0.conda hash: - md5: 679c2b63523ef75652e5690a39e0f0a2 - sha256: 6972edd5d9dffccd0afcbec077ef2f3a51abc6cc70060bcc818d02988b70983d + md5: e2253e1bb76e005d0264797163e8330a + sha256: d81e5b6903e0e47c8bc1f4a57bc8ba857f73490e829cc46b1e152d7c0b877a29 category: main optional: false - name: gitdb @@ -425,74 +425,74 @@ package: category: main optional: false - name: gitpython - version: 3.1.50 + version: 3.1.62 manager: conda platform: linux-64 dependencies: gitdb: '>=4.0.1,<5' - python: '>=3.10' + python: '>=3.11' typing_extensions: '>=3.10.0.2' - url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.50-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.62-pyh5ded981_0.conda hash: - md5: 98958318a01373a615f119b1040b3027 - sha256: 718c9d0cc287ffda978996c4105ddd2863dd7bad7fb5794cdd365bd809ef2fa5 + md5: bc66034cae0ff9168c130766eb2b33d1 + sha256: c70321228e3b7e200791629bf2d598fa6a334407b77001511697b749e8ae171a category: main optional: false - name: greenlet - version: 3.5.2 + version: 3.5.6 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' + libgcc: '>=15' + libstdcxx: '>=15' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.2-py314h42812f9_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.6-py314hf3b331d_0.conda hash: - md5: 5fef7ee7545d98388c129de1a47537bb - sha256: 4aa1f8147701b5ab71a71aa208ec1a4d0c8cfcaa68f1fff9ad5d2015abb8ddde + md5: 501b5df81de2e56a1aca324fe81038fe + sha256: 69e7ac58e9763c67519156ceec6445a3ca421ad072a655a7288e3ffe2b182621 category: main optional: false - name: h2 - version: 4.3.0 + version: 4.4.1 manager: conda platform: linux-64 dependencies: - hpack: '>=4.1,<5' + hpack: '>=4.2,<5' hyperframe: '>=6.1,<7' - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda hash: - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 - sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: e652ac7756069c456d0da2a922cd7df5 + sha256: 307dd6ec90140c3cf4171071b0e5e870abec314f4565c1edd5bc433e942cdcc0 category: main optional: false - name: hpack - version: 4.1.0 + version: 4.2.0 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda hash: - md5: 0a802cb9888dd14eeefc611f05c40b6e - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba + md5: b395909221b9bd1df066e5930e18855b + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 category: main optional: false - name: htcondor-classads - version: 24.12.21 + version: 24.12.23 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' + libgcc: '>=15' + libstdcxx: '>=15' pcre2: '>=10.47,<10.48.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/htcondor-classads-24.12.21-h793e66c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/htcondor-classads-24.12.23-h85684ab_0.conda hash: - md5: 25cb00d33ce81596b17196a25f4810c2 - sha256: 32e8551969836d2090edae88d569a12219be6d02eeb84f130a8882ad0e2ee426 + md5: b044cb6e7e62b009c2ca1e5999aa7087 + sha256: db5ca98631ac1ac9a10ce4b7586b5ce144d96f0f836dfab17af9e2d567a7eeaa category: main optional: false - name: humanfriendly @@ -528,22 +528,22 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda hash: - md5: c80d8a3b84358cb967fa81e7075fbc8a - sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: 72a381cbad04f24b1c2a43ef707f45b4 + sha256: 9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432 category: main optional: false - name: idna - version: '3.18' + version: '3.20' manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.20-pyh5ded981_0.conda hash: - md5: 577b04680ae422adb86fc60d7b940659 - sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 + md5: ee73be987f9de9ea5c2fdaeefa7b6491 + sha256: e044b1ec829e2e24f971fa3f3408eb26f1db836e521a58f08b0fd9a03fee47be category: main optional: false - name: immutables @@ -552,13 +552,13 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - python: '>=3.14.0rc2,<3.15.0a0' + libgcc: '>=15' + python: '>=3.14,<3.15.0a0' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py314h5bd0f2a_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/immutables-0.21-py314h89acca1_3.conda hash: - md5: d4d65cfb5c2569d5dbd344039471a534 - sha256: 1c9163fd77943c55fe727f5399545141df54f696422bf101089a32526aea3234 + md5: 926b23c378c307e8bac1b8d2e560bbfa + sha256: 2b5d0b3fcba0458e836a86ce17cab9c5b6cae15ba994e77a9544849beab1cedf category: main optional: false - name: jinja2 @@ -567,7 +567,7 @@ package: platform: linux-64 dependencies: markupsafe: '>=2.0' - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda hash: md5: 04558c96691bed63104678757beb4f8d @@ -581,13 +581,13 @@ package: dependencies: attrs: '>=22.2.0' jsonschema-specifications: '>=2023.3.6' - python: '' + python: '>=3.10' referencing: '>=0.28.4' rpds-py: '>=0.25.0' - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_1.conda hash: - md5: ada41c863af263cc4c5fcbaff7c3e4dc - sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 + md5: 204b5ca91eba7738790ecc333facbbbe + sha256: 328756a4555941d57af4a5f553e5d8598e9f3b37db028f557e30f9f0b3086db6 category: main optional: false - name: jsonschema-specifications @@ -595,7 +595,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' referencing: '>=0.31.0' url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda hash: @@ -624,11 +624,11 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda hash: - md5: b38117a3c920364aff79f870c984b4a3 - sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: ba55d1b89fd7775e67de8291029b4059 + sha256: dd053c96dcb0dcfd59422aefea9d2fe937a190167f34fba7893ec1e10a7e8963 category: main optional: false - name: krb5 @@ -638,27 +638,27 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' keyutils: '>=1.6.3,<2.0a0' - libedit: '>=3.1.20250104,<4.0a0' - libgcc: '>=14' - libstdcxx: '>=14' + libedit: '>=3.1.20250104,<3.2.0a0,>=3.1.20250104,<4.0a0' + libgcc: '>=15' + libstdcxx: '>=15' openssl: '>=3.5.7,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda hash: - md5: 54157a1c8c0bb70f62dd0b17fba7e7f2 - sha256: 9b07046870772f28740e3f6149f09ff222843733087a33c5540b169c6289652d + md5: 53318d715316929a574f83591308b1f8 + sha256: 2a5c38c85e63df84c4e69ee71439841ce570d259ae3060627bb9a49a938d66f4 category: main optional: false - name: ld_impl_linux-64 - version: 2.45.1 + version: 2.46.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda hash: - md5: 18335a698559cdbcd86150a48bf54ba6 - sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 449500f2c089da11c40f5c21312e3e07 + sha256: 27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec category: main optional: false - name: libblas @@ -666,48 +666,48 @@ package: manager: conda platform: linux-64 dependencies: - libopenblas: '>=0.3.33,<1.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda + libopenblas: '>=0.3.34,<0.3.35.0a0,>=0.3.34,<1.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-11_h4a7cf45_openblas.conda hash: - md5: 00fc660ab1b2f5ca07e92b4900d10c79 - sha256: b2da6bfd72a1c9cb143ccf64bf5b28790cb4eb58bd1cb978f6537b2322f7d48b + md5: b8cce1486f3c62f33291d6318c193d0d + sha256: d942e0c820d60a613a6f786d074f0820fb6343e3f1ccfb110b1d98b44fb75968 category: main optional: false - name: libboost - version: 1.88.0 + version: 1.90.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' bzip2: '>=1.0.8,<2.0a0' - icu: '>=78.1,<79.0a0' - libgcc: '>=14' - liblzma: '>=5.8.1,<6.0a0' - libstdcxx: '>=14' - libzlib: '>=1.3.1,<2.0a0' + icu: '>=78.3,<79.0a0' + libgcc: '>=15' + liblzma: '>=5.8.3,<6.0a0' + libstdcxx: '>=15' + libzlib: '>=1.3.2,<2.0a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.88.0-hd24cca6_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.90.0-h1101c1b_3.conda hash: - md5: d70e4dc6a847d437387d45462fe60cf9 - sha256: dd489228e1916c7720c925248d0ba12803d1dc8b9898be0c51f4ab37bab6ffa5 + md5: bcabb17507a7c82f12e9a0cc67fd57c7 + sha256: 868cae2463765495b59ebc1146bd4089f2983439a1ac469eec36b09575b47162 category: main optional: false - name: libboost-python - version: 1.88.0 + version: 1.90.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libboost: 1.88.0 - libgcc: '>=14' - libstdcxx: '>=14' - numpy: '>=1.23,<3' + libboost: 1.90.0 + libgcc: '>=15' + libstdcxx: '>=15' + numpy: '>=1.25,<3' python: '>=3.14,<3.15.0a0' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.88.0-py314h3a4f467_7.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-python-1.90.0-py314haf67600_3.conda hash: - md5: ed299171ab3525d8f4ed400083105743 - sha256: a701f2a6afa984b52cfffe51abb5aaf8e6e534082f71e36078f0f4cf54d2e7fe + md5: f24fa7b59c7643712d063ffc81f92337 + sha256: b5126190f88db7fa3a5e8047c424bb1654e78ed5c67e7a4c6a3c9546c1307056 category: main optional: false - name: libcblas @@ -716,51 +716,52 @@ package: platform: linux-64 dependencies: libblas: 3.11.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-11_h0358290_openblas.conda hash: - md5: 33a413f1095f8325e5c30fde3b0d2445 - sha256: 1a2bc77bb26520255904a3d9b1f40e6bf0bf9d8d3405c7709dd162282820915a + md5: 73a248c30811075059b5aeda766c2624 + sha256: f7d1bbdea61cf94ba219d17b2cb571a29830f8025385af799bff5a7ad1ef45e6 category: main optional: false - name: libcondor_utils - version: 24.12.21 + version: 24.12.23 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - htcondor-classads: 24.12.21 + htcondor-classads: 24.12.23 krb5: '>=1.22.2,<1.23.0a0' - libgcc: '>=14' - libstdcxx: '>=14' + libgcc: '>=15' + libstdcxx: '>=15' libuuid: '>=2.42.2,<3.0a0' munge: '' openssl: '>=3.5.7,<4.0a0' pcre2: '>=10.47,<10.48.0a0' - scitokens-cpp: '>=1.4.0,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcondor_utils-24.12.21-h4effbbe_0.conda + scitokens-cpp: '>=0.5.0,>=1.4.0,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcondor_utils-24.12.23-hc252264_0.conda hash: - md5: 4199ea6a2c5d370e9f0b15b0786c1260 - sha256: 5429d1cc7cf81a16e0ef89ddf87f5c1ad7bf30304dacce5dcc5503851a7a0553 + md5: a0df099ba276c7abda3b0d894c05f679 + sha256: 769eb4e800e27997ae0a17cf5bf1570c9dc9aa2caf35196ae620376709b94685 category: main optional: false - name: libcurl - version: 8.20.0 + version: 8.22.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' krb5: '>=1.22.2,<1.23.0a0' - libgcc: '>=14' + libgcc: '>=15' libnghttp2: '>=1.68.1,<2.0a0' + libpsl: '>=0.23.1,<0.24.0a0' libssh2: '>=1.11.1,<2.0a0' libzlib: '>=1.3.2,<2.0a0' - openssl: '>=3.5.6,<4.0a0' + openssl: '>=3.5.8,<4.0a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda hash: - md5: c3cc2864f82a944bc90a7beb4d3b0e88 - sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb + md5: e617deee7af8eb0c04f6296d12b54157 + sha256: 483b7eb97f56fbb3a9cb7190d33012dfa0a5aaed99ede61465563cd97dd82504 category: main optional: false - name: libedit @@ -769,12 +770,12 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - ncurses: '>=6.5,<7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + libgcc: '>=14' + ncurses: '>=6.6,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda hash: - md5: c277e0a4d549b03ac1e9d6cbbe3d017b - sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: 50708d3b951d0f8e2d7f2df5b5edc040 + sha256: 6473eb8caf2aae830f37caa93db9b26dddf7ac84b63229e8bf7fc0e5c3ab95b0 category: main optional: false - name: libev @@ -782,99 +783,100 @@ package: manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda hash: - md5: 172bf1cd1ff8629f2b1179945ed45055 - sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 7bc31538d6e3fb349e897353969237ec + sha256: e4418f68d01a6307c4431b585c71b584f40189877364e542ee87deb777f5e85b category: main optional: false - name: libexpat - version: 2.8.1 + version: 2.8.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.4-hd2095e1_0.conda hash: - md5: b24d3c612f71e7aa74158d92106318b2 - sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: a77b44d6cbaad97f3ad050ab35fad55a + sha256: 2f5e90b621f7bf64c35d5c972bd85a645555d82404130569149a129dcbc8b8dd category: main optional: false - name: libffi - version: 3.5.2 + version: 3.7.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda hash: - md5: a360c33a5abe61c07959e449fa1453eb - sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: 6525a0b06aa4fd390795f0740636a9dd + sha256: c8c7583ef063bc3c430f1d48298e5ad24f796a35c22ed5b14183325825a61106 category: main optional: false - name: libgcc - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_5.conda hash: - md5: 57736f29cc2b0ec0b6c2952d3f101b6a - sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 3b62b92f0f082b67c59618ebf07617a7 + sha256: 33d1b5d57c5a55a474330c5ec41fe7001a5aa600d9639389e8ce5edafae216a4 category: main optional: false - name: libgcc-ng - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: - libgcc: 15.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + libgcc: 16.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_5.conda hash: - md5: 331ee9b72b9dff570d56b1302c5ab37d - sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: e7c34906139296448e3554fafa3dbec2 + sha256: d298972e17697a5e96806d5f2c151c53efd0afa0ef10db5d6757a5b186817219 category: main optional: false - name: libgfortran - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: - libgfortran5: 15.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + libgfortran5: 16.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_5.conda hash: - md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 - sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 34ddf93e56ee44924ce76a614e5fb379 + sha256: 7e694578cbabd46251d7a069d89da6479c5edd962d78bbc66a847c1b722a8365 category: main optional: false - name: libgfortran5 - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=15.2.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + libgcc: '>=16.2.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_5.conda hash: - md5: 85072b0ad177c966294f129b7c04a2d5 - sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: a7eb3f9540094247ec8a2fa800cf9bbf + sha256: cc767363e3148a18d3a3015eeaed722bbf8ca0acc3a29157df2965e97caa9803 category: main optional: false - name: libgomp - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_5.conda hash: - md5: faac990cb7aedc7f3a2224f2c9b0c26c - sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: af44890f8a2beefd3a83805a59a65014 + sha256: 224a5a09e258a1a257089a9af310e9336e1d36834959718a9fab8679742dd822 category: main optional: false - name: liblapack @@ -883,10 +885,10 @@ package: platform: linux-64 dependencies: libblas: 3.11.0 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-11_h47877c9_openblas.conda hash: - md5: 809be8ba8712c77bc7d44c2d99390dc4 - sha256: 168e327d737059553e15cc6ec36d76b9bbb3931c2a7721555fd68b4c9348b247 + md5: 5622a13917855ce4b953b9e655cf9262 + sha256: 1ad3f43c9319ef398a8ef45989f4903a06e3965b51e77fc669a4c894168a8411 category: main optional: false - name: liblapacke @@ -897,10 +899,10 @@ package: libblas: 3.11.0 libcblas: 3.11.0 liblapack: 3.11.0 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-8_h6ae95b6_openblas.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-11_h6ae95b6_openblas.conda hash: - md5: da17457f689df5c0f246d2f0b3798fd2 - sha256: 0b982865888a73fe7c2e7d8e8ee3738ac378b83012a7da1a12264a473cb2382b + md5: ed0f7f54d1fc2e6db0d93d6e81497331 + sha256: 912a8a4d152781f932b2afebf2c9d0c3537060998407bc306c4dd971adc4c0ad category: main optional: false - name: liblzma @@ -910,10 +912,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda hash: - md5: b88d90cad08e6bc8ad540cb310a761fb - sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: 1390b7c5ac0b1d8e447bc5efa6d3c8c2 + sha256: 9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab category: main optional: false - name: libmpdec @@ -923,10 +925,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda hash: - md5: 2c21e66f50753a083cbe6b80f38268fa - sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 + md5: fcfed1dc5053eb1901b66e7b1fc32588 + sha256: 46820b4a835e175940ae20bec00fdddaff804cda27a1408ab1b95e77a2196437 category: main optional: false - name: libnghttp2 @@ -935,45 +937,75 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - c-ares: '>=1.34.6,<2.0a0' - libev: '>=4.33,<5.0a0' - libgcc: '>=14' - libstdcxx: '>=14' - libzlib: '>=1.3.1,<2.0a0' - openssl: '>=3.5.5,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + c-ares: '>=1.34.8,<2.0a0' + libev: '>=4.33,<4.34.0a0,>=4.33,<5.0a0' + libgcc: '>=15' + libstdcxx: '>=15' + libzlib: '>=1.3.2,<2.0a0' + openssl: '>=3.5.7,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda hash: - md5: 2a45e7f8af083626f009645a6481f12d - sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 75d211f04ac87506f1f43420712a69fe + sha256: 11a2f54a6f391e25738bce0023e6ef499600147bbcf21c1fa69d2e251b03cc6a category: main optional: false - name: libopenblas - version: 0.3.33 + version: 0.3.34 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + libgcc: '>=15' libgfortran: '' - libgfortran5: '>=14.3.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + libgfortran5: '>=15.3.0' + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.34-pthreads_hf13c14d_2.conda + hash: + md5: 7e19fcd73d7f0997d3cb3326d2586a86 + sha256: 69a722751e14eab2eb3bfdcb9acb1187afbd962b0c49b48d829341e0f6787f60 + category: main + optional: false +- name: libpsl + version: 0.23.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=78.3,<79.0a0' + libgcc: '>=15' + libstdcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + hash: + md5: 77be60417aa572afcb48cbe0f967401d + sha256: 09e8effdc89bc5d021349318d32b85594f5b8d8e3ab8f90a85b81f8fe695a566 + category: main + optional: false +- name: libpython + version: 3.14.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=15' + libstdcxx: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.14.7-hdc7f604_106_cp314.conda hash: - md5: 2d3278b721e40468295ca755c3b84070 - sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 + md5: 28af2158bb8dbb62e55b0af3b44f9d4a + sha256: 5f879892bd439c3d94f4a97b06c214b9a19c4b92f74d84f0305c6ca1b2b239b2 category: main optional: false - name: libsqlite - version: 3.53.2 + version: 3.53.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + icu: '>=78.3,<79.0a0' + libgcc: '>=15' libzlib: '>=1.3.2,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda hash: - md5: 062b0ac602fb0adf250e3dfa86f221c4 - sha256: 1ab603b6ec93933e76027e1f23b21b22b858ba1b56f1e1695ef6fe5e80cb7358 + md5: e72bbec309c2b0f37823ee7d4fabfcd3 + sha256: f20d70da54e5b31dd4a51fb1efeaafafd5ab6dd8d7ac9d1438eaa2526ac4ed3d category: main optional: false - name: libssh2 @@ -982,39 +1014,39 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libzlib: '>=1.3.1,<2.0a0' - openssl: '>=3.5.0,<4.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + libgcc: '>=14' + libzlib: '>=1.3.2,<2.0a0' + openssl: '>=3.5.7,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda hash: - md5: eecce068c7e4eddeb169591baac20ac4 - sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: 5c526561e1d2a2e071941174eae84557 + sha256: 7e463000fa1cba3f3a6597b776f6ab301d425a96e3bc20d0d9d76a3b9f237aa3 category: main optional: false - name: libstdcxx - version: 15.2.0 + version: 16.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: 15.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + libgcc: 16.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_5.conda hash: - md5: 5794b3bdc38177caf969dabd3af08549 - sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 75b43a2912a0354204696708e4f34b8d + sha256: 38cadde30fad8f7c101f9eec79f60bf03fc99310c7195d23f8b30832516d666f category: main optional: false - name: libuuid - version: 2.42.2 + version: 2.42.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.4-hcfc3c73_0.conda hash: - md5: 01bb81d12c957de066ea7362007df642 - sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f + md5: 54a948337e66706380ff24d6b5fde63f + sha256: f34b8d1de9a2bf62476d8608057d9b8a918d97444236dc53a47128f2fae79041 category: main optional: false - name: libzlib @@ -1023,10 +1055,10 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda hash: - md5: d87ff7921124eccd67248aa483c23fec - sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: 0de0122d9570a8ab637c6b73db268389 + sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 category: main optional: false - name: logmuse @@ -1034,7 +1066,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/logmuse-0.3.0-pyhcf101f3_0.conda hash: md5: 789b0a3d1b8e7d69733894ac32eb8b69 @@ -1098,19 +1130,19 @@ package: category: main optional: false - name: nbformat - version: 5.10.4 + version: 5.11.1 manager: conda platform: linux-64 dependencies: jsonschema: '>=2.6' jupyter_core: '>=4.12,!=5.0.*' - python: '>=3.9' + python: '>=3.10' python-fastjsonschema: '>=2.15' traitlets: '>=5.1' - url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda hash: - md5: bbe1963f1e47f594070ffe87cdf612ea - sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: 2fbbf92e1173ae024f0b12759c1e64a1 + sha256: d85d76827ff732e1639f50f45e4d7d3387a27abd857b194dcbb5bb4166c2a7c2 category: main optional: false - name: ncurses @@ -1120,43 +1152,43 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda hash: - md5: fc21868a1a5aacc937e7a18747acb8a5 - sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: ee6c0cd80a60961a1f48aa3e0b91f986 + sha256: 5d46557214ed184381dafe835b7c94a474a1c3b307a08a250b1ea4779b44ffb3 category: main optional: false - name: numpy - version: 2.4.6 + version: 2.5.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' - libgcc: '>=14' + libgcc: '>=15' liblapack: '>=3.9.0,<4.0a0' - libstdcxx: '>=14' + libstdcxx: '>=15' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.3-py314hd3a7d6b_0.conda hash: - md5: f49b5f950379e0b97c35ca97682f7c6a - sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 + md5: d1ae35d69e57534c8713ff0368b9fdb9 + sha256: 2aeb4c5a0869a84e69b4e57bfd04911cd148070d667bc598f3bb85366ee40607 category: main optional: false - name: openssl - version: 3.6.3 + version: 3.6.4 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' ca-certificates: '' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda hash: - md5: 79dd2074b5cd5c5c6b2930514a11e22d - sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b + md5: 16e3034a330cc625f2c685edec60cf4e + sha256: 4747b2d6a8336f52343bceb8a1ebf41a9e6e665b9d2e3f989972de53a310599e category: main optional: false - name: packaging @@ -1164,7 +1196,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.8' url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda hash: md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -1179,7 +1211,7 @@ package: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' libstdcxx: '>=14' - numpy: '>=1.23,<3' + numpy: '>=1.22.4,>=1.23,<3' python: '>=3.14,<3.15.0a0' python-dateutil: '>=2.8.2' python-tzdata: '>=2022.7' @@ -1198,16 +1230,16 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' bzip2: '>=1.0.8,<2.0a0' - libgcc: '>=14' - libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + libgcc: '>=15' + libzlib: '>=1.3.2,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda hash: - md5: 7a3bff861a6583f1889021facefc08b1 - sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff + md5: 06f6113cf1ff4a54b65f87ead132a5f1 + sha256: 9ebb10a4eb3be51ae67d85c679f5a7a50cb040ed25c783e6331a225ea09991d4 category: main optional: false - name: pephubclient - version: 0.4.4 + version: 0.6.0 manager: conda platform: linux-64 dependencies: @@ -1215,14 +1247,15 @@ package: pandas: '>=2.0.0' peppy: '>=0.40.5' pydantic: '>=2.5.0' - python: '>=3.9' + python: '>=3.10' requests: '>=2.28.2' + toml: '>=0.10.2' typer: '>=0.7.0' ubiquerg: '>=0.6.3' - url: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.4.4-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.6.0-pyhd8ed1ab_0.conda hash: - md5: 08d92912686d87b05d53ce04f00142c8 - sha256: fe53097b62d73a991a9233659d47aac28e973e055d931ae5bfbcce4d824c03ee + md5: 597251588fcfcb101c55d15dfb50df14 + sha256: cdf0a400cb25ea638aaedc794003bad52e46a717edcda7b64b7a207028b177c1 category: main optional: false - name: peppy @@ -1243,28 +1276,16 @@ package: sha256: e05978b7e71202052e0a06ac31a59ff5456e5af87877436a508b7cdf21f96004 category: main optional: false -- name: pip - version: 26.1.2 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.13.0a0' - url: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.2-pyh145f28c_0.conda - hash: - md5: 733cc07ed34162ac50b936464b163366 - sha256: 9e673d3c6003f416df11670a14b026a04e3a45ebec55357987e15b860f138f2a - category: main - optional: false - name: platformdirs - version: 4.10.0 + version: 4.11.12 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.12-pyh5ded981_0.conda hash: - md5: 2c5ef45db85d34799771629bd5860fd7 - sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 99714207349966378c112c2b8db785f5 + sha256: 5d440bd9ccb80abc1c6d40022a4a54d007a133b2dd73a62762e7c18c470895cd category: main optional: false - name: psutil @@ -1273,13 +1294,13 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + libgcc: '>=15' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314hfe1a184_3.conda hash: - md5: 4f225a966cfee267a79c5cb6382bd121 - sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5 + md5: 23189243badc4f63a0f05c429aba161d + sha256: 38961e7991c6493dfd3768759731681e0e71895bb6c18a445ab05c2433b03a64 category: main optional: false - name: pulp @@ -1298,59 +1319,59 @@ package: category: main optional: false - name: pydantic - version: 2.13.4 + version: 2.13.5 manager: conda platform: linux-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.46.4 - python: '' + pydantic-core: 2.46.5 + python: '>=3.10' typing-inspection: '>=0.4.2' typing_extensions: '>=4.14.1' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.5-pyhcf101f3_0.conda hash: - md5: 729843edafc0899b3348bd3f19525b9d - sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f + md5: 2d0f9304fc1cb1e3e94e7b37c14cd70a + sha256: 701ed8122021f62e1c9a46bdf4932ada911c10afa56ba0459f56da940bcbe5a7 category: main optional: false - name: pydantic-core - version: 2.46.4 + version: 2.46.5 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + libgcc: '>=15' python: '' python_abi: 3.14.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.5-py314h7e8cd81_2.conda hash: - md5: 0c96993dbeadf3a277cf757b9f1c9412 - sha256: 802e216c39f1359aed60823b6e11d8ccd812b0ae1c81ae5ac1c81f99446409ab + md5: 76d65459d9ac0eb2ecb48d6650c5ced1 + sha256: 7887472515d5d2d3b57bd38d3b055ae24f98c399b9a9387ac441e97bda775884 category: main optional: false - name: pygments - version: 2.20.0 + version: 2.21.0 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda hash: - md5: 16c18772b340887160c79a6acc022db0 - sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 2882dee445dfa45b0c5afce3ffb7730a + sha256: f5f015ff1bc3e1b7fc08eee096b1865234189ae0b82bebdb86a5369116e42fa0 category: main optional: false - name: pyparsing - version: 3.3.2 + version: 3.3.3 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.3-pyh5ded981_0.conda hash: - md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 - sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 8bf43ae1312e9b966063459e04c20fa7 + sha256: dc10d64d4b9a1310083b2f563416ab45560ee2a04fd6baab40f223f2b1ab37bc category: main optional: false - name: pysocks @@ -1367,7 +1388,7 @@ package: category: main optional: false - name: python - version: 3.14.6 + version: 3.14.7 manager: conda platform: linux-64 dependencies: @@ -1375,25 +1396,25 @@ package: bzip2: '>=1.0.8,<2.0a0' ld_impl_linux-64: '>=2.36.1' libexpat: '>=2.8.1,<3.0a0' - libffi: '>=3.5.2,<3.6.0a0' - libgcc: '>=14' + libffi: '>=3.7.0,<3.8.0a0' + libgcc: '>=15' liblzma: '>=5.8.3,<6.0a0' libmpdec: '>=4.0.0,<5.0a0' - libsqlite: '>=3.53.2,<4.0a0' - libuuid: '>=2.42.1,<3.0a0' + libpython: 3.14.7 + libsqlite: '>=3.53.4,<4.0a0' + libuuid: '>=2.42.3,<3.0a0' libzlib: '>=1.3.2,<2.0a0' ncurses: '>=6.6,<7.0a0' - openssl: '>=3.5.7,<4.0a0' - pip: '' + openssl: '>=3.5.8,<4.0a0' python_abi: 3.14.* readline: '>=8.3,<9.0a0' tk: '>=8.6.13,<8.7.0a0' tzdata: '' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.7-hcd007b5_106_cp314.conda hash: - md5: 0b9b2f83b5b600e1ac38becde8d0dd44 - sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 + md5: 56ee91e118243e46bfc0c41e4030d354 + sha256: 4cd05407d6b07d00fd5b6cc78bd2f60ae5e21f777eb26ead82be2e3751c610a1 category: main optional: false - name: python-dateutil @@ -1401,7 +1422,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' six: '>=1.5' url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda hash: @@ -1410,46 +1431,46 @@ package: category: main optional: false - name: python-fastjsonschema - version: 2.21.2 + version: 2.22.2 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda hash: - md5: 23029aae904a2ba587daba708208012f - sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 + md5: aa75b7f096d17621bc307b3025b29461 + sha256: fc4a704822df22defce49d0fb811fdc036a1fd3b579aeaa601228e9cfd198b3d category: main optional: false - name: python-htcondor - version: 24.12.21 + version: 24.12.23 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - htcondor-classads: 24.12.21 - libboost-python: '>=1.88.0,<1.89.0a0' - libcondor_utils: 24.12.21 - libgcc: '>=14' - libstdcxx: '>=14' + htcondor-classads: 24.12.23 + libboost-python: '>=1.90.0,<1.91.0a0' + libcondor_utils: 24.12.23 + libgcc: '>=15' + libstdcxx: '>=15' python: '>=3.14,<3.15.0a0' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/python-htcondor-24.12.21-py314h08818d4_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-htcondor-24.12.23-py314hd5fcc5e_0.conda hash: - md5: 61106bf11705302db03e918316da1373 - sha256: 5ec96b1e1cb644659b0f55f2221387abdbd4d578fc21c7b8a12308b2cebc3756 + md5: dbd59dde17850a633a1f35b1eb508ead + sha256: 6c5d8349b9c959126c689f64f5e7163160d2d478ab222ae3b86c40e1cc829d8f category: main optional: false - name: python-tzdata - version: '2026.2' + version: '2026.4' manager: conda platform: linux-64 dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.2-pyhd8ed1ab_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.4-pyh5ded981_0.conda hash: - md5: f6ad7450fc21e00ecc23812baed6d2e4 - sha256: e943f9c15a6bdba2e1b9f423ab913b3f6b02197b0ef9f8e6b7464d78b59965b9 + md5: 6fc085ba8fa446b73bff580281b21ce3 + sha256: 4a66a09c6c18e6488000b1a848ed557669d12f673feac682d58208e7e8b66434 category: main optional: false - name: python_abi @@ -1457,22 +1478,22 @@ package: manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-9_cp314.conda hash: - md5: 0539938c55b6b1a59b560e843ad864a4 - sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 350d89b50d7de805abf2e63e29dee451 + sha256: e7f8e965bbfb98e08feb2365cacdad8bb218fa5b5a0a2752f747287f425f213c category: main optional: false - name: pytz - version: '2026.2' + version: 2026.3.post1 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.2-pyhcf101f3_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2026.3.post1-pyhcf101f3_0.conda hash: - md5: 03cb60f505ad3ada0a95277af5faeb1a - sha256: 5020863d629f584b5c057333a67a7aed43e3ed013ba15dd70f353501ccb5aff6 + md5: eb2fb9070c0232e96ae5515d8b28e4f9 + sha256: ad774abda71c759baef515983bfedbba34d56d6227974c23715c04612f812a90 category: main optional: false - name: pyyaml @@ -1497,12 +1518,12 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - ncurses: '>=6.5,<7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + libgcc: '>=15' + ncurses: '>=6.6,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda hash: - md5: d7d95fc8287ea7bf33e0e7116d2b95ec - sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: 69c01c781e7c8190bbdaf79e3848c5ca + sha256: 01b3fe073a66e321970d09e04b388708f8cbdca5cdfbfcb7c9eeb470ad10383d category: main optional: false - name: referencing @@ -1511,7 +1532,7 @@ package: platform: linux-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.10' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -1528,7 +1549,7 @@ package: certifi: '>=2023.5.7' charset-normalizer: '>=2,<4' idna: '>=2.5,<4' - python: '' + python: '>=3.10' urllib3: '>=1.26,<3' url: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda hash: @@ -1543,7 +1564,7 @@ package: dependencies: markdown-it-py: '>=2.2.0' pygments: '>=2.13.0,<3.0.0' - python: '' + python: '>=3.10' typing_extensions: '>=4.0.0,<5.0.0' url: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda hash: @@ -1552,18 +1573,18 @@ package: category: main optional: false - name: rpds-py - version: 2026.5.1 + version: 2026.6.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + libgcc: '>=15' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.5.1-py314h1bee95f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py314h7e8cd81_2.conda hash: - md5: fb5b4fc759b225d4f32730cc8380ec8e - sha256: 79d753848377c415578f42285f5f87be711503b887c99e8890fd51d3fae1d6a5 + md5: 6b01f779e23cf522e46a7803b3445a88 + sha256: 480c7e299308442363715ff54381ad9d0c9df9b6a7da4db8eb358ae7f8ba0e81 category: main optional: false - name: scitokens-cpp @@ -1601,7 +1622,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda hash: md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -1609,41 +1630,41 @@ package: category: main optional: false - name: slack-sdk - version: 3.42.0 + version: 3.44.1 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/slack-sdk-3.42.0-pyhcf101f3_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/slack-sdk-3.44.1-pyh5ded981_0.conda hash: - md5: 40776b66bfe5a63227dc1b38cb4f07dc - sha256: e9de7e7352cd4f8f0ee1c471ae00b6412131315b2d95f59c12ce0a470da3d621 + md5: dd6c07e961962e8c3cb1a939e9add411 + sha256: 26448db693047ed09e097fd52b7c32b4a01bf4df1311602872a3f13a7dcd7fe7 category: main optional: false - name: slack_sdk - version: 3.42.0 + version: 3.44.1 manager: conda platform: linux-64 dependencies: - python: '' - slack-sdk: ==3.42.0 - url: https://conda.anaconda.org/conda-forge/noarch/slack_sdk-3.42.0-pyh8a74712_0.conda + python: '>=3.11' + slack-sdk: ==3.44.1 + url: https://conda.anaconda.org/conda-forge/noarch/slack_sdk-3.44.1-pyh79c2f5f_0.conda hash: - md5: 0cae39737699e3361a9d15f48c8a0c85 - sha256: 54729aa82b3ff80efda05842051f547b6037d9ae0ef43b74e26fbb7e0f4b75f8 + md5: b71e4b469e17c98622c0e409e4c8ad08 + sha256: 095d5dc1a4f263f033c238d13055b6ef9df60184a30319b7ca1606949676e849 category: main optional: false - name: smart_open - version: 7.6.1 + version: 7.7.1 manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' wrapt: '' - url: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.6.1-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/smart_open-7.7.1-pyhcf101f3_0.conda hash: - md5: 8e4971d25d53f168dfb64d6f5ee1316d - sha256: 58185ed2290aa6ef0a5de7012c2a581d75a3577b7e93de455c19fa10d344570a + md5: fd2e276dbbd1a2ae15ffdbdbabd908f1 + sha256: d0abe2d97b67d42aca30fcd34b3db6cd5de57b4a9ffcf4e04091dd9f4a0cf1e6 category: main optional: false - name: smmap @@ -1651,7 +1672,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhcf101f3_1.conda hash: md5: b899f1195be56d8215ed1973a8f409c3 @@ -1659,7 +1680,7 @@ package: category: main optional: false - name: snakemake - version: 9.23.1 + version: 9.27.0 manager: conda platform: linux-64 dependencies: @@ -1668,63 +1689,64 @@ package: peppy: '' pygments: '' slack_sdk: '' - snakemake-minimal: 9.23.1.* - url: https://conda.anaconda.org/bioconda/noarch/snakemake-9.23.1-hdfd78af_1.conda + snakemake-minimal: 9.27.0.* + url: https://conda.anaconda.org/bioconda/noarch/snakemake-9.27.0-hdfd78af_0.conda hash: - md5: 1f680b0e0c887ddc54ead077e51512d2 - sha256: 9dbbb17d231f341e45560a12fe0a52d75c86f71f4d4d6adb7ca97a9b8115edcc + md5: d964fa440897240fd3767b238a79b870 + sha256: c50b9f65505eeeca4b7467780f31fb30de25e22edd72c2aa8726eec5ef6b591a category: main optional: false - name: snakemake-executor-plugin-htcondor - version: 0.2.1 + version: 0.3.0 manager: conda platform: linux-64 dependencies: + packaging: '>=24.0,<26.0' python: '>=3.11' python-htcondor: '>=24.5.1,<25.0.0' snakemake-interface-common: '>=1.17.1,<2.0.0' snakemake-interface-executor-plugins: '>=9.0.0,<10.0.0' - url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-htcondor-0.2.1-pyhdfd78af_0.conda + url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-htcondor-0.3.0-pyhdfd78af_0.conda hash: - md5: 196348bc2599e29dcd2e0368bd1d5497 - sha256: 78f1df23673093a9fdbb3931139fb72f0e3659c0a04a6766f9fa447f79893c7a + md5: bf39a8c480a723dbd3544a197cd1f1c9 + sha256: 4ca4a9c42ffca359e2b0a1dc71097742adfd7673b012fd36fae9d19a12cac8c0 category: main optional: false - name: snakemake-executor-plugin-slurm - version: 2.7.1 + version: 2.8.0 manager: conda platform: linux-64 dependencies: - numpy: '>=1.26.4,<3.0' - pandas: '>=2.2.3,<3.0' + numpy: '>=2.4.5,<3.0' + pandas: '>=2.3.3,<4' python: '>=3.11.0,<4.0.0' - pyyaml: '' - snakemake-executor-plugin-slurm-jobstep: '>=0.4.0,<0.5.0' - snakemake-interface-common: '>=1.21.0,<2.0.0' - snakemake-interface-executor-plugins: '>=9.3.9,<10.0.0' + pyyaml: '>=6.0.3,<7' + snakemake-executor-plugin-slurm-jobstep: '>=0.6.0,<1' + snakemake-interface-common: '>=1.23.0,<2.0.0' + snakemake-interface-executor-plugins: '>=9.4.0,<10.0.0' throttler: '>=1.2.2,<2.0.0' - url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-2.7.1-pyhdfd78af_0.conda + url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-2.8.0-pyhdfd78af_0.conda hash: - md5: d11d20e557970783b9dbc68d36d3c37a - sha256: 68962051fc8f68c8fb3e6a57635c92226ff95841e4649e5acdd3fca770dff16f + md5: f9a172b956e049e181d3fcc6f47cde95 + sha256: b8c8cf8facf17b94f7a1a578c90a2b735df74f5d6831653e3cb335dc3598b77e category: main optional: false - name: snakemake-executor-plugin-slurm-jobstep - version: 0.4.0 + version: 0.6.1 manager: conda platform: linux-64 dependencies: python: '>=3.11.0,<4.0.0' snakemake-interface-common: '>=1.13.0,<2.0.0' snakemake-interface-executor-plugins: '>=9.0.0,<10.0.0' - url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-jobstep-0.4.0-pyhdfd78af_0.conda + url: https://conda.anaconda.org/bioconda/noarch/snakemake-executor-plugin-slurm-jobstep-0.6.1-pyhdfd78af_0.conda hash: - md5: 7d4f2bf739967798eb4d8c02d59cf36c - sha256: 82ad84bf106e0fbab62f6c001311aff53faefe323254c8b2b3540f310bb48dfe + md5: a69ecf8f00a9d1780a2a8c4f57492e90 + sha256: c81ef180b5965fe707c8ff63e738a9aa37bd08e2b7c1ff45b447f0a3ef6dc7df category: main optional: false - name: snakemake-interface-common - version: 1.23.0 + version: 1.23.1 manager: conda platform: linux-64 dependencies: @@ -1732,10 +1754,10 @@ package: configargparse: '>=1.7' packaging: '>=24.0' python: '>=3.8' - url: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.0-pyhdfd78af_1.conda + url: https://conda.anaconda.org/bioconda/noarch/snakemake-interface-common-1.23.1-pyhdfd78af_0.conda hash: - md5: a5ec344abd4b0cdda5a52e870e4d25a3 - sha256: 1e8393a8ef060c62ef963fa9e0b3cc8f69b1dec4bdb51599c0dfcdeb9b8c7d12 + md5: 3d6d8846f3e486d2c39882b1ea912020 + sha256: 6c00ad64aba26fa72a49a4e8f1664dba53f75fe5852425c4a5f1bd676960ccfa category: main optional: false - name: snakemake-interface-executor-plugins @@ -1810,7 +1832,7 @@ package: category: main optional: false - name: snakemake-minimal - version: 9.23.1 + version: 9.27.0 manager: conda platform: linux-64 dependencies: @@ -1839,34 +1861,34 @@ package: snakemake-interface-logger-plugins: '>=1.1.0,<3.0.0' snakemake-interface-report-plugins: '>=1.2.0,<2.0.0' snakemake-interface-scheduler-plugins: '>=2.0.0,<3.0.0' - snakemake-interface-storage-plugins: '>=4.3.2,<5.0' + snakemake-interface-storage-plugins: '>=4.4.1,<5.0' sqlmodel: '>=0.0.37,<0.0.38' tabulate: '' tenacity: '>=9.1.4,<10.0' throttler: '' wrapt: '' yte: '>=1.5.5,<2.0' - url: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.23.1-pyhdfd78af_1.conda + url: https://conda.anaconda.org/bioconda/noarch/snakemake-minimal-9.27.0-pyhdfd78af_0.conda hash: - md5: ff39f8e27137655553f9fbb842ee1aa2 - sha256: 6d7a1d2e308506e867121edb6d258dbbb359ce3287631e54601e33edb110485d + md5: ef7be2b45f827b930836cd91db64e769 + sha256: 2c80dd4dce15bf6eb1806ccab28f12a47d81e623d50e8543f58f6eac9090498b category: main optional: false - name: sqlalchemy - version: 2.0.51 + version: 2.0.54 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - greenlet: '!=0.4.17' - libgcc: '>=14' + greenlet: '>=1' + libgcc: '>=15' python: '' python_abi: 3.14.* - typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.51-py314h0f05182_0.conda + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.54-py314hfe1a184_1.conda hash: - md5: aeb7447f3ea37b2bb32167267dcf0bfe - sha256: 3c46e9af535a376c7269b61563f84c601235b00d50fc97f87ffbf3b68a51fe17 + md5: 54afc229ce8a98637a6dd6356c5c7a5b + sha256: 683ffb3545d05ee8b493eb0ecfc44682fa29dc1c8995439bb66310d66c545928 category: main optional: false - name: sqlmodel @@ -1875,7 +1897,7 @@ package: platform: linux-64 dependencies: pydantic: '>=2.11.0' - python: '' + python: '>=3.10' sqlalchemy: '>=2.0.14,<2.1.0' url: https://conda.anaconda.org/conda-forge/noarch/sqlmodel-0.0.37-pyhcf101f3_0.conda hash: @@ -1888,7 +1910,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda hash: md5: 3b887b7b3468b0f494b4fad40178b043 @@ -1900,7 +1922,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/tenacity-9.1.4-pyhcf101f3_0.conda hash: md5: 043f0599dc8aa023369deacdb5ac24eb @@ -1925,12 +1947,12 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + libgcc: '>=15' + libzlib: '>=1.3.2,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda hash: - md5: cffd3bdd58090148f4cfcd831f4b26ab - sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: 676a2f9b1c4fcf57b70aa5c65f6c60d0 + sha256: a1a241d172c1ccab067ba245206dd048bc3c2d1b84504b53c9468e99adfc16a1 category: main optional: false - name: toml @@ -1938,7 +1960,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.10' url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda hash: md5: d0fc809fa4c4d85e959ce4ab6e1de800 @@ -1946,79 +1968,79 @@ package: category: main optional: false - name: traitlets - version: 5.15.1 + version: 5.16.1 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda hash: - md5: 37e3be7b6e2977d37b8fa5da229f5dc0 - sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 + md5: a79bf97561232a31447b6246c2153ab5 + sha256: 03dba5917f944c6684ab44c81daacac1624cd148e4b2cae215dcec594a210c48 category: main optional: false - name: typer - version: 0.26.7 + version: 0.27.2 manager: conda platform: linux-64 dependencies: annotated-doc: '>=0.0.2' colorama: '' - python: '' + python: '>=3.10' rich: '>=13.8.0' shellingham: '>=1.3.0' - url: https://conda.anaconda.org/conda-forge/noarch/typer-0.26.7-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.27.2-pyhcf101f3_0.conda hash: - md5: 71d2c80673511fab927bd15592994030 - sha256: 15dce0fa9d2a5077755c0ae98b3b521a9409b9468a0597ce697940fb035e5b67 + md5: d076f2370a590b3698399256b9b135e3 + sha256: 5809840f0ae1330d0cfa785f573ff53fd3725578a01997ca36c7f0e2da1ef4d0 category: main optional: false - name: typing-extensions - version: 4.15.0 + version: 4.16.0 manager: conda platform: linux-64 dependencies: - typing_extensions: ==4.15.0 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda + typing_extensions: ==4.16.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda hash: - md5: edd329d7d3a4ab45dcf905899a7a6115 - sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c + md5: c680b5747e8c4c8f23dca0bb7042a8fc + sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c category: main optional: false - name: typing-inspection - version: 0.4.2 + version: 0.4.4 manager: conda platform: linux-64 dependencies: - python: '' - typing_extensions: '>=4.12.0' - url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda + python: '>=3.10' + typing_extensions: '>=4.15.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.4-pyhcf101f3_0.conda hash: - md5: 53f5409c5cfd6c5a66417d68e3f0a864 - sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a + md5: 880e91eac5d926568ef278e20554148e + sha256: 293c66b208468d186a94ff486c2ffbf67859a2bde8c88e965fc9d06c517191b2 category: main optional: false - name: typing_extensions - version: 4.15.0 + version: 4.16.0 manager: conda platform: linux-64 dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda hash: - md5: 0caa1af407ecff61170c9437a808404d - sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 + md5: c70ad746c22219b9700931707482992c + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 category: main optional: false - name: tzdata - version: 2025c + version: 2026c manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda hash: - md5: ad659d0a2b3e47e38d829aa8cad2d610 - sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: fcb489df604d100968b737f2cb6076c6 + sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 category: main optional: false - name: ubiquerg @@ -2034,7 +2056,7 @@ package: category: main optional: false - name: urllib3 - version: 2.7.0 + version: 2.8.0 manager: conda platform: linux-64 dependencies: @@ -2042,25 +2064,27 @@ package: brotli-python: '>=1.2.0' h2: '>=4,<5' pysocks: '>=1.5.6,<2.0,!=1.5.7' - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + python: '>=3.11' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.8.0-pyhd8ed1ab_0.conda hash: - md5: cbb88288f74dbe6ada1c6c7d0a97223e - sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: 407a3d3778570bae8e8fcf554e803e43 + sha256: c5511c190ab55168ca412f3c54592fbf677ae6250784cb72b227a7cf3f538f7d category: main optional: false - name: uv - version: 0.11.22 + version: 0.12.18 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.11.22-h26efc2c_0.conda + libgcc: '>=15' + liblzma: '>=5.8.3,<6.0a0' + libstdcxx: '>=15' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.18-h841d291_0.conda hash: - md5: 853d95620154f47148ed41a2bf732019 - sha256: 219429d3cc0aeb4ee746c84192a7e336e9b1c7187d081981ed3893a62d078998 + md5: cc21ebd3202257969230912e3c24b799 + sha256: b8443546fda374d709a2721a403ed7db44b6cbb1332b0619740f1d4ef8fb6c64 category: main optional: false - name: wrapt @@ -2084,11 +2108,11 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + libgcc: '>=15' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda hash: - md5: a77f85f77be52ff59391544bfe73390a - sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: e741576fb8f89821ac7c1c537322a33d + sha256: d164dfa75ecd538f6fd68765defcc06aa875bc697b9b215362d79a2a73125dd0 category: main optional: false - name: yte @@ -2112,10 +2136,10 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + libzlib: '>=1.3.2,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda hash: - md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 - sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: aa459086047c0e5e27023ab19f8cb86a + sha256: 47d682b9f6d6ec9eb1a6e6c3e75ea6273e899e78fb7fc59f81d39745009fbc60 category: main optional: false diff --git a/pipeline/envs/snakemake.yaml b/pipeline/envs/snakemake.yaml index 581d3030c..b4fad0106 100644 --- a/pipeline/envs/snakemake.yaml +++ b/pipeline/envs/snakemake.yaml @@ -27,5 +27,5 @@ dependencies: - python>=3.11 - uv - snakemake>=9.0 - - snakemake-executor-plugin-htcondor + - snakemake-executor-plugin-htcondor>=0.3.0 - snakemake-executor-plugin-slurm diff --git a/pipeline/profiles/delta/config.yaml b/pipeline/profiles/delta/config.yaml index e3e503b5a..4f25e1d50 100644 --- a/pipeline/profiles/delta/config.yaml +++ b/pipeline/profiles/delta/config.yaml @@ -42,7 +42,8 @@ default-resources: mem_mb: 8000 runtime: 60 # minutes -# GPU rules override the CPU default account with the Delta GPU allocation. +# Per-rule memory and runtime live in the run config's `resources` block. +# GPU rules override the CPU default account with the Delta GPU allocation. # The GPU partition/count can be changed in the run config. set-resources: train: @@ -51,52 +52,9 @@ set-resources: slurm_account: bcse-delta-gpu compile_model: slurm_account: bcse-delta-gpu - generate_train_segments: - mem_mb: 512 - runtime: 10 - generate_test_segments: - mem_mb: 512 - runtime: 10 - fetch_train_background: - mem_mb: 6144 - runtime: 480 - fetch_test_background: - mem_mb: 6144 - runtime: 480 - testing_waveforms_branch: - mem_mb: 8192 - runtime: 60 - val_waveforms_branch: - mem_mb: 6144 - runtime: 60 - aggregate_testing_waveforms: - mem_mb: 2048 - runtime: 10 - aggregate_val_waveforms: - mem_mb: 2048 - runtime: 10 - training_waveforms_branch: - mem_mb: 2048 - runtime: 30 - aggregate_training_waveforms: - mem_mb: 2048 - runtime: 10 - # On Delta this is the in-process GPU job (model loaded locally); it needs the - # GPU memory headroom. The GPU itself comes from the rule (gpu=1 + - # inference_partition). Scale runtime up if branches_per_job is large. infer_group: slurm_account: bcse-delta-gpu - mem_mb: 8192 - runtime: 20 - aggregate_infer: - mem_mb: 4096 - runtime: 15 - sensitive_volume: - mem_mb: 16384 - runtime: 15 set-threads: - fetch_train_background: 4 - fetch_test_background: 4 train: 16 compile_model: 16 diff --git a/pipeline/profiles/ldg/config.yaml b/pipeline/profiles/ldg/config.yaml index 68b699858..fbd6e730d 100644 --- a/pipeline/profiles/ldg/config.yaml +++ b/pipeline/profiles/ldg/config.yaml @@ -80,40 +80,8 @@ default-resources: classad_AcctGroup: $ENV(LIGO_GROUP) classad_AcctGroupUser: $ENV(LIGO_USERNAME) - # Static defaults, can be overridden per rule. - request_memory: 8GB + # Defaults for rules the run config's `resources` block doesn't cover. + # htcondor_request_mem_mb rather than request_memory because that's the key + # rules set and having both makes the plugin warn on every job. + htcondor_request_mem_mb: 8192 request_disk: 1GB - -# Per-rule memory based on observed values -set-resources: - generate_train_segments: - request_memory: 512MB - generate_test_segments: - request_memory: 512MB - fetch_train_background: - request_memory: 6GB - fetch_test_background: - request_memory: 6GB - testing_waveforms_branch: - request_memory: 8GB - val_waveforms_branch: - request_memory: 6GB - aggregate_testing_waveforms: - request_memory: 2GB - aggregate_val_waveforms: - request_memory: 2GB - training_waveforms_branch: - request_memory: 2GB - aggregate_training_waveforms: - request_memory: 2GB - infer_group: - request_memory: 8GB - aggregate_infer: - request_memory: 4GB - sensitive_volume: - request_memory: 16GB - -# `fetch` downloads with nproc=3, so give the fetch rules a few cores. -set-threads: - fetch_train_background: 4 - fetch_test_background: 4 diff --git a/pipeline/resources.smk b/pipeline/resources.smk new file mode 100644 index 000000000..2cc092f44 --- /dev/null +++ b/pipeline/resources.smk @@ -0,0 +1,46 @@ +"""Resource helpers shared by all rules. + +The slurm and htcondor executor plugins read different resource keys. +Slurm uses `mem_mb`, `runtime` and `gpu`, while htcondor ignores those +and reads `htcondor_request_mem_mb`, `allowed_execute_duration`, and +`request_gpus` plus its GPU matchmaking keys. Each helper returns both +slurm and htcondor sets. +""" + + +def rule_resources(name): + """Memory and walltime for rule `name`, from the config's `resources`. + + Anything a rule doesn't set there fall back to the profile's + default-resources. + """ + res = config.get("resources", {}).get(name, {}) + out = {} + if "mem_mb" in res: + out["mem_mb"] = out["htcondor_request_mem_mb"] = res["mem_mb"] + if "runtime" in res: + out["runtime"] = res["runtime"] # minutes + out["allowed_execute_duration"] = int(res["runtime"] * 60) # seconds + return out + + +def gpu_resources(): + """One GPU for an in-process inference rule, under slurm or condor. + + On condor, match any GPU above the configured floors. An AOTI package + only runs on the architecture it was compiled for, so with the aoti + backend pin compile_model and infer_group to one exact capability + instead. + """ + res = { + "slurm_partition": config.get("inference_partition", "gpuA40x4"), + "gpu": 1, + "request_gpus": 1, + } + if config.get("inference_backend", "export") == "aoti": + res["require_gpus"] = f"Capability == {config['aoti_gpu_capability']}" + else: + res["gpus_minimum_capability"] = config["gpu_min_capability"] + if config.get("gpu_min_memory_mb"): + res["gpus_minimum_memory"] = config["gpu_min_memory_mb"] + return res diff --git a/projects/data/data.smk b/projects/data/data.smk index a5b044996..acaa2c17d 100644 --- a/projects/data/data.smk +++ b/projects/data/data.smk @@ -215,6 +215,10 @@ rule fetch_train_background: str(data_log_dir / "fetch_train_background-{start}-{duration}.log"), container: DATA_CONTAINER + # `fetch` downloads with nproc=3 + threads: 4 + resources: + **rule_resources("fetch_train_background"), params: channels=_fmt_list(config["channels"]), sample_rate=config["sample_rate"], @@ -239,6 +243,10 @@ rule fetch_test_background: str(data_log_dir / "fetch_test_background-{start}-{duration}.log"), container: DATA_CONTAINER + # `fetch` downloads with nproc=3 + threads: 4 + resources: + **rule_resources("fetch_test_background"), params: channels=_fmt_list(config["channels"]), sample_rate=config["sample_rate"], @@ -336,6 +344,8 @@ the rejected parameters for this branch. str(data_log_dir / "testing_waveforms_branch-{wbranch_id}.log"), container: DATA_CONTAINER + resources: + **rule_resources("testing_waveforms_branch"), params: branch=_branch_params, ifos=_fmt_list(config["ifos"]), @@ -391,6 +401,8 @@ rule aggregate_testing_waveforms: localrule: config.get("aggregate_rules_local", False) container: DATA_CONTAINER + resources: + **rule_resources("aggregate_testing_waveforms"), params: ifos=config["ifos"], script: @@ -411,6 +423,8 @@ The PSD reference is the last fetched train-background chunk. str(data_log_dir / "val_waveforms_branch-{vbranch_id}.log"), container: DATA_CONTAINER + resources: + **rule_resources("val_waveforms_branch"), params: num_signals=math.ceil(config["num_validation_signals"] / num_validation_jobs), ifos=_fmt_list(config["ifos"]), @@ -459,6 +473,8 @@ rule aggregate_val_waveforms: localrule: config.get("aggregate_rules_local", False) container: DATA_CONTAINER + resources: + **rule_resources("aggregate_val_waveforms"), params: ifos=config["ifos"], script: @@ -478,6 +494,8 @@ if config.get("pregenerate_training_waveforms", False): str(data_log_dir / "training_waveforms_branch-{tbranch_id}.log"), container: DATA_CONTAINER + resources: + **rule_resources("training_waveforms_branch"), params: num_signals=math.ceil( config["num_training_signals"] / num_train_waveform_jobs @@ -516,5 +534,7 @@ if config.get("pregenerate_training_waveforms", False): localrule: config.get("aggregate_rules_local", False) container: DATA_CONTAINER + resources: + **rule_resources("aggregate_training_waveforms"), script: "scripts/aggregate_training_waveforms.py" diff --git a/projects/export/export.smk b/projects/export/export.smk index f51c28d06..a43cc2d44 100644 --- a/projects/export/export.smk +++ b/projects/export/export.smk @@ -35,11 +35,11 @@ snakemake is invoked. localrule: config.get("gpu_rules_local", True) container: EXPORT_CONTAINER + # never reaches condor, so slurm GPU keys only resources: + **rule_resources("export"), slurm_partition=config.get("inference_partition", "gpuA40x4"), gpu=1, - mem_mb=config.get("export_mem_mb", 32000), - runtime=10, params: preprocessor=config["export_preprocessor"], num_ifos=len(config["ifos"]), diff --git a/projects/infer/infer.smk b/projects/infer/infer.smk index 8ad358642..2fee50c83 100644 --- a/projects/infer/infer.smk +++ b/projects/infer/infer.smk @@ -337,11 +337,8 @@ else: container: INFER_CONTAINER resources: - slurm_partition=config.get("inference_partition", "gpuA40x4"), - gpu=1, # slurm - request_gpus=1, # condor - mem_mb=config.get("compile_mem_mb", 32000), - runtime=10, + **rule_resources("compile_model"), + **gpu_resources(), params: num_ifos=len(config["ifos"]), sample_rate=config["sample_rate"], @@ -366,11 +363,8 @@ else: container: INFER_CONTAINER resources: - slurm_partition=config.get("inference_partition", "gpuA40x4"), - gpu=1, # slurm - request_gpus=1, # condor - mem_mb=config.get("infer_mem_mb", 32000), - runtime=config.get("infer_runtime", 60), + **rule_resources("infer_group"), + **gpu_resources(), params: **_group_common_params, weights=_artifact, @@ -409,6 +403,8 @@ rule aggregate_infer: str(infer_log_dir / "aggregate_infer.log"), container: INFER_CONTAINER + resources: + **rule_resources("aggregate_infer"), params: analysis_type=ANALYSIS_TYPE, script: diff --git a/projects/plots/plots.smk b/projects/plots/plots.smk index 41061057c..8e4815dac 100644 --- a/projects/plots/plots.smk +++ b/projects/plots/plots.smk @@ -50,6 +50,7 @@ rule fetch_veto_segments: params: vetos=VETOS, ifos=config["ifos"], + segment_server=config["segment_server"], script: "scripts/fetch_veto_segments.py" @@ -70,6 +71,8 @@ rule sensitive_volume: str(plots_log_dir / "sensitive_volume.log"), container: PLOTS_CONTAINER + resources: + **rule_resources("sensitive_volume"), params: ifos=_fmt_list(config["ifos"]), mass_combos=json.dumps(config["mass_combos"]), diff --git a/projects/train/train.smk b/projects/train/train.smk index 8732a42e9..c418ebad2 100644 --- a/projects/train/train.smk +++ b/projects/train/train.smk @@ -112,11 +112,11 @@ else: localrule: config.get("gpu_rules_local", True) container: TRAIN_CONTAINER + # never reaches condor, so slurm GPU keys only resources: + **rule_resources("train"), slurm_partition=config.get("train_partition", "gpuA40x4"), gpu=config.get("train_num_gpus", 1), - mem_mb=config.get("train_mem_mb", 32000), - runtime=2880, params: **train_data_params, background_dir=str(train_bg), From dc5b051da252c263361780c449acda7074aaaf14 Mon Sep 17 00:00:00 2001 From: William Benoit Date: Thu, 24 Sep 2026 11:42:17 -0400 Subject: [PATCH 2/4] Pass explicit DQSegDB server --- pipeline/config/config.yaml | 2 ++ projects/data/data.smk | 4 +++ projects/data/data/segments/segments.py | 31 ++++++++++++++++--- projects/plots/plots/vetos/__init__.py | 2 ++ projects/plots/plots/vetos/masks.py | 4 ++- projects/plots/plots/vetos/vetos.py | 10 +++++- projects/plots/scripts/fetch_veto_segments.py | 1 + 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/pipeline/config/config.yaml b/pipeline/config/config.yaml index 348f839c0..23a8fdd44 100644 --- a/pipeline/config/config.yaml +++ b/pipeline/config/config.yaml @@ -47,6 +47,8 @@ flags: - H1_DATA - L1_DATA +# DQSegDB server for non-open flags and vetoes. Needs HTTPS and a SciToken. +segment_server: https://segments.igwn.org train_min_duration: 1024.0 # minimum train segment length (seconds) test_min_duration: 128.0 # minimum test segment length (seconds) max_duration: 20000.0 # maximum chunk length when splitting segments diff --git a/projects/data/data.smk b/projects/data/data.smk index acaa2c17d..9c2967f28 100644 --- a/projects/data/data.smk +++ b/projects/data/data.smk @@ -172,12 +172,14 @@ checkpoint generate_train_segments: start=config["train_start"], end=config["train_end"], min_duration=config["train_min_duration"], + segment_server=config["segment_server"], shell: "generate-segments" " --flags '{params.flags}'" " --start {params.start}" " --end {params.end}" " --min_duration {params.min_duration}" + " --segment_server {params.segment_server}" " --output_file {output}" " &> {log}" @@ -195,12 +197,14 @@ checkpoint generate_test_segments: start=config["test_start"], end=config["test_end"], min_duration=config["test_min_duration"], + segment_server=config["segment_server"], shell: "generate-segments" " --flags '{params.flags}'" " --start {params.start}" " --end {params.end}" " --min_duration {params.min_duration}" + " --segment_server {params.segment_server}" " --output_file {output}" " &> {log}" diff --git a/projects/data/data/segments/segments.py b/projects/data/data/segments/segments.py index f7ef0013c..3fbb96091 100644 --- a/projects/data/data/segments/segments.py +++ b/projects/data/data/segments/segments.py @@ -4,6 +4,9 @@ from gwpy.segments import DataQualityDict, DataQualityFlag, SegmentList OPEN_DATA_FLAGS = ["H1_DATA", "L1_DATA", "V1_DATA"] +# Passed explicitly: without $DEFAULT_SEGMENT_SERVER, dqsegdb2 falls back +# to segments.ligo.org, which was shut down on 2026-09-10. +DEFAULT_SEGMENT_SERVER = "https://segments.igwn.org" O3A_END = 1253977218 O3B_START = 1256655618 @@ -65,6 +68,7 @@ def _query_segments( start: float, end: float, min_duration: float | None = None, + segment_server: str = DEFAULT_SEGMENT_SERVER, **kwargs, ) -> SegmentList: flags = set(flags) @@ -77,7 +81,13 @@ def _query_segments( if flags: # Authenticate only if we need to query non-open flags authenticate() - segments.update(cls.query_non_open(flags, start, end, **kwargs)) + # Only `query_non_open` needs host passed. `query_open` reads + # from the GWOSC host. + segments.update( + cls.query_non_open( + flags, start, end, host=segment_server, **kwargs + ) + ) if open_data_flags: segments.update( cls.query_open(open_data_flags, start, end, **kwargs) @@ -96,6 +106,7 @@ def query_segments( start: float, end: float, min_duration: float | None = None, + segment_server: str = DEFAULT_SEGMENT_SERVER, **kwargs, ) -> SegmentList: # if the requested time period @@ -105,14 +116,26 @@ def query_segments( segments = SegmentList() segments.extend( cls._query_segments( - flags, start, O3A_END, min_duration, **kwargs + flags, + start, + O3A_END, + min_duration, + segment_server, + **kwargs, ) ) segments.extend( cls._query_segments( - flags, O3B_START, end, min_duration, **kwargs + flags, + O3B_START, + end, + min_duration, + segment_server, + **kwargs, ) ) return segments # otherwise, just query the whole period - return cls._query_segments(flags, start, end, min_duration, **kwargs) + return cls._query_segments( + flags, start, end, min_duration, segment_server, **kwargs + ) diff --git a/projects/plots/plots/vetos/__init__.py b/projects/plots/plots/vetos/__init__.py index a88a86d18..db38abd12 100644 --- a/projects/plots/plots/vetos/__init__.py +++ b/projects/plots/plots/vetos/__init__.py @@ -2,6 +2,7 @@ from pathlib import Path from .vetos import ( + DEFAULT_SEGMENT_SERVER, VETO_CATEGORIES, VetoParser, gates_to_veto_segments, @@ -71,6 +72,7 @@ def get_epoch(start: float, stop: float) -> Epoch: GATE_PATHS = EPOCHS["O3"].gate_paths __all__ = [ + "DEFAULT_SEGMENT_SERVER", "EPOCHS", "GATE_PATHS", "VETO_CATEGORIES", diff --git a/projects/plots/plots/vetos/masks.py b/projects/plots/plots/vetos/masks.py index 78c6b868f..4db9655b8 100644 --- a/projects/plots/plots/vetos/masks.py +++ b/projects/plots/plots/vetos/masks.py @@ -10,6 +10,7 @@ from ledger.events import veto_mask from plots.vetos import ( + DEFAULT_SEGMENT_SERVER, VETO_CATEGORIES, VetoParser, get_catalog_vetos, @@ -82,6 +83,7 @@ def load_or_fetch_segments( cache: Path = DEFAULT_SEGMENTS_CACHE, veto_definer_file: Path | None = None, gate_paths: dict[str, Path] | None = None, + segment_server: str = DEFAULT_SEGMENT_SERVER, ) -> dict[str, dict[str, np.ndarray]]: """Segment lookup for `categories`, cached to `cache` on disk. @@ -114,7 +116,7 @@ def load_or_fetch_segments( parser_categories = [c for c in categories if c != "CATALOG"] if parser_categories: veto_parser = VetoParser( - veto_definer_file, gate_paths, start, stop, ifos + veto_definer_file, gate_paths, start, stop, ifos, segment_server ) for cat in parser_categories: segments[cat] = veto_parser.get_vetos(cat) diff --git a/projects/plots/plots/vetos/vetos.py b/projects/plots/plots/vetos/vetos.py index 9a433a1db..a93984afa 100644 --- a/projects/plots/plots/vetos/vetos.py +++ b/projects/plots/plots/vetos/vetos.py @@ -31,6 +31,11 @@ def gates_to_veto_segments(path: Path): return vetos +# Without $DEFAULT_SEGMENT_SERVER, dqsegdb2 falls back +# to segments.ligo.org, which was shut down on 2026-09-10. +DEFAULT_SEGMENT_SERVER = "https://segments.igwn.org" + + def get_catalog_vetos(start: float, stop: float, delta: float = 1.0): events = datasets.query_events( select=[f"gps-time >= {start}", f"gps-time <= {stop}"] @@ -48,6 +53,7 @@ def __init__( start: float, stop: float, ifos: list[str], + segment_server: str = DEFAULT_SEGMENT_SERVER, ): self.logger = logging.getLogger("vizapp") self.veto_definer_file = Path(veto_definer_file) @@ -59,7 +65,9 @@ def __init__( f"Populating {len(self.vetos)} vetos from " f"{self.veto_definer_file.name} over [{start:.0f}, {stop:.0f})" ) - self.vetos.populate(segments=[[start, stop]], verbose=True) + self.vetos.populate( + source=segment_server, segments=[[start, stop]], verbose=True + ) self.logger.info("Vetos populated") self.gate_paths = gate_paths self.ifos = ifos diff --git a/projects/plots/scripts/fetch_veto_segments.py b/projects/plots/scripts/fetch_veto_segments.py index b5af8436d..2cdafb289 100644 --- a/projects/plots/scripts/fetch_veto_segments.py +++ b/projects/plots/scripts/fetch_veto_segments.py @@ -23,4 +23,5 @@ start, stop, cache=Path(snakemake.output[0]), + segment_server=snakemake.params.segment_server, ) From 6fb6bf3ddc33444088a6e0d98879c3077d9e5521 Mon Sep 17 00:00:00 2001 From: William Benoit Date: Thu, 24 Sep 2026 12:19:10 -0400 Subject: [PATCH 3/4] Make triton clients run locally --- projects/infer/infer.smk | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/projects/infer/infer.smk b/projects/infer/infer.smk index 2fee50c83..58fd14c92 100644 --- a/projects/infer/infer.smk +++ b/projects/infer/infer.smk @@ -5,9 +5,10 @@ Both run branches in groups of size `branches_per_job` via `infer-triton` / `infer-local`, and both write the same outputs. The `compute_branch_map` and `aggregate_infer` rules are shared. - triton: A Triton server hosts the model, and each group job is a CPU client - that streams its branches to it. Best when GPUs are scarce but - multiple exist on a node. Realistically, only used on LDG. + triton: A Triton server on the submit node hosts the model, and each group + job is a CPU client, also on the submit node, that streams its + branches to it. Best when GPUs are scarce but multiple exist on + the submit node. Realistically, only used on LDG. inprocess: Each group job is one GPU job that loads the model locally. Best when there are many GPUs available and jobs can be @@ -255,9 +256,12 @@ if INFERENCE_MODE == "triton": rate_per_gpu = config.get("rate_per_gpu") infer_rate = 2 * rate_per_gpu / streams_per_gpu if rate_per_gpu else "null" + # The clients run where the server does because we can't + # guarantee that the EP can reach the submit node. localrules: compute_branch_map, start_triton, + infer_group, stop_triton, rule start_triton: @@ -283,12 +287,11 @@ if INFERENCE_MODE == "triton": "scripts/start_triton.py" rule infer_group: - """Stream a group of branches to the Triton server from one CPU client.""" + """Stream a group of branches to the Triton server from a local client.""" input: unpack(get_infer_group_inputs), branch_map=str(infer_dir / "branch_map.json"), triton_started=str(triton_dir / "triton.started"), - ip_file=str(triton_dir / "triton.ip"), output: **_group_outputs, log: @@ -304,7 +307,8 @@ if INFERENCE_MODE == "triton": rate=infer_rate, shell: "infer-triton" - " --address $(cat {input.ip_file}):8001" + # a localrule, so the server is on this node + " --address localhost:8001" " --model_name {params.model_name}" " --model_version {params.model_version}" " --rate {params.rate}" + _GROUP_SHELL_SUFFIX From e1592a374f8f67cca12cac0dfa7d01782c9aaed6 Mon Sep 17 00:00:00 2001 From: William Benoit Date: Thu, 24 Sep 2026 12:49:22 -0400 Subject: [PATCH 4/4] Split up groups so that each background files aren't transferred more than necessary --- projects/infer/infer.smk | 31 ++++++++++++++++++++++++------- projects/infer/infer/cli.py | 6 ++---- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/projects/infer/infer.smk b/projects/infer/infer.smk index 58fd14c92..c3cd96ba9 100644 --- a/projects/infer/infer.smk +++ b/projects/infer/infer.smk @@ -1,7 +1,7 @@ """Snakemake rules for batch inference. Two inference modes, selected by `inference_mode` in the run config. -Both run branches in groups of size `branches_per_job` via +Both run branches in groups of at most `branches_per_job` via `infer-triton` / `infer-local`, and both write the same outputs. The `compute_branch_map` and `aggregate_infer` rules are shared. @@ -19,7 +19,6 @@ At very large branch counts the DAG construction can be batched: """ import json -import math import os from pathlib import Path @@ -56,6 +55,7 @@ AOTI_PKG = str(export_out / "model_aoti.pt2") BRANCHES_PER_JOB = config.get("branches_per_job", 1) + if ANALYSIS_TYPE == "rnp": FRAME_DIR = config["rnp_frame_dir"] CHANNEL = config["rnp_channel"] @@ -84,9 +84,25 @@ def _load_branch_map(): return json.load(f) +def _assign_groups(branch_map, split_at_file_changes): + """Number the branches, in order, into groups of at most branches_per_job. + + With `split_at_file_changes`, a group never spans two strain files, so + a file is transferred to a job once for all of its shifts in that group. + """ + group, size, last = -1, BRANCHES_PER_JOB, None + for branch in branch_map.values(): + if size == BRANCHES_PER_JOB or ( + split_at_file_changes and branch["fname"] != last + ): + group, size = group + 1, 0 + branch["group"] = group + size += 1 + last = branch["fname"] + + def _group_branches(branch_map, group_id): - ids = list(branch_map)[group_id * BRANCHES_PER_JOB :][:BRANCHES_PER_JOB] - return [branch_map[i] for i in ids] + return [b for b in branch_map.values() if b["group"] == group_id] def get_infer_group_inputs(wildcards): @@ -100,7 +116,7 @@ def get_infer_group_inputs(wildcards): def get_infer_group_outputs(wildcards): """Every group's outputs, keyed by output name.""" - num_groups = math.ceil(len(_load_branch_map()) / BRANCHES_PER_JOB) + num_groups = 1 + max(b["group"] for b in _load_branch_map().values()) return { name: expand(fname, group_id=range(num_groups)) for name, fname in _group_outputs.items() @@ -121,6 +137,8 @@ if ANALYSIS_TYPE == "rnp": branch_map = { str(i): {"fname": f, "shifts": shifts} for i, f in enumerate(files) } + # one frame per branch, so there's nothing to share within a group + _assign_groups(branch_map, split_at_file_changes=False) Path(output[0]).parent.mkdir(parents=True, exist_ok=True) with open(output[0], "w") as f: json.dump(branch_map, f, indent=2) @@ -209,13 +227,13 @@ else: f"Testing waveform branches {sorted(unmatched, key=int)} " "match no inference branch" ) + _assign_groups(branch_map, split_at_file_changes=True) Path(output[0]).parent.mkdir(parents=True, exist_ok=True) with open(output[0], "w") as f: json.dump(branch_map, f, indent=2) _group_common_params = dict( - branches_per_job=BRANCHES_PER_JOB, analysis_type=ANALYSIS_TYPE, ifos="[" + ",".join(config["ifos"]) + "]", inference_sampling_rate=config["inference_sampling_rate"], @@ -229,7 +247,6 @@ _group_common_params = dict( _GROUP_SHELL_SUFFIX = ( " --branch_map {input.branch_map}" " --group_id {wildcards.group_id}" - " --branches_per_job {params.branches_per_job}" " --analysis_type {params.analysis_type}" " --background_out {output.background}" " --foreground_out {output.foreground}" diff --git a/projects/infer/infer/cli.py b/projects/infer/infer/cli.py index 8f3d36a7a..4f47888ba 100644 --- a/projects/infer/infer/cli.py +++ b/projects/infer/infer/cli.py @@ -130,9 +130,8 @@ def _merge_group(cfg, branch_map, group, scratch): def _run_group(client, cfg, rate=None, reset=None): with open(cfg.branch_map) as f: branch_map = json.load(f) - ids = list(branch_map.keys()) - start = cfg.group_id * cfg.branches_per_job - group = ids[start : start + cfg.branches_per_job] + # groups are assigned by compute_branch_map in infer.smk + group = [i for i, b in branch_map.items() if b["group"] == cfg.group_id] # Per-branch outputs only exist until they're merged. Keep them next # to the group's outputs rather than in /tmp, which may be small. @@ -161,7 +160,6 @@ def _shared_args(p): p.add_argument("--logfile", type=str, default=None) p.add_argument("--branch_map", type=str) p.add_argument("--group_id", type=int) - p.add_argument("--branches_per_job", type=int) p.add_argument("--analysis_type", type=str, default="hdf5") p.add_argument("--background_out", type=str) p.add_argument("--foreground_out", type=str)