From 929f8067b456f728a8d4e75a1249325bc06c8b88 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 13 Feb 2026 13:25:19 -0800 Subject: [PATCH 01/28] Add pandas to requirements --- .../py-3.12-linux-64-dev.conda.lock.yml | 4 +- environments/py-3.12-linux-64.conda.lock.yml | 4 +- .../py-3.12-win-64-dev.conda.lock.yml | 4 +- environments/py-3.12-win-64.conda.lock.yml | 4 +- .../py-3.13-linux-64-dev.conda.lock.yml | 4 +- environments/py-3.13-linux-64.conda.lock.yml | 4 +- .../py-3.13-win-64-dev.conda.lock.yml | 4 +- environments/py-3.13-win-64.conda.lock.yml | 4 +- .../py-3.14-linux-64-dev.conda.lock.yml | 4 +- environments/py-3.14-linux-64.conda.lock.yml | 4 +- .../py-3.14-win-64-dev.conda.lock.yml | 4 +- environments/py-3.14-win-64.conda.lock.yml | 4 +- py-3.12.conda-lock.yml | 60 ++++++++++++++++++- py-3.13.conda-lock.yml | 60 ++++++++++++++++++- py-3.14.conda-lock.yml | 60 ++++++++++++++++++- pyproject.toml | 6 +- 16 files changed, 214 insertions(+), 20 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index 1075ac4c..4b79e23e 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 5bd1997f80c6e23a223778e0b084eda8978a936df1ad468eae12139bf07cac3a +# input_hash: f29f7ea792a9ca909f9ece6f72b30bf16f7bc38fe205880a4a963929f56d2938 channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py312hf890105_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h7900ff3_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -184,6 +185,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index 4a592b1f..c02552c2 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 5bd1997f80c6e23a223778e0b084eda8978a936df1ad468eae12139bf07cac3a +# input_hash: f29f7ea792a9ca909f9ece6f72b30bf16f7bc38fe205880a4a963929f56d2938 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py312hf890105_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h8a5da7c_0 - freetype=2.14.1=ha770c72_0 @@ -105,6 +106,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h8ecdadd_0 diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 925432bd..22532cf1 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 10d8ace21865f29d537b611e38f88febdd43f8b7c93f838dc55ca62e1821ef72 +# input_hash: a61b0a7890e3136e0996ebf4b77bc31b161107f13b8ee15672f713d313131462 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py312h9b46583_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h2e8e312_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index 5465315e..5957dc2e 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 10d8ace21865f29d537b611e38f88febdd43f8b7c93f838dc55ca62e1821ef72 +# input_hash: a61b0a7890e3136e0996ebf4b77bc31b161107f13b8ee15672f713d313131462 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py312h9b46583_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h05f76fc_0 - freetype=2.14.1=h57928b3_0 @@ -89,6 +90,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h95189c4_0 diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index e0dd4f1d..12f26b8b 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 06fb1fb8c972bc4139434c04db9ef9c1724f79dacbdd239baf797fb346e55d91 +# input_hash: ec1dcd9f18b21077fb9d8aa34caf57c7f2bf89a6ab015e5372bc17f87b82f4ec channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py313hfaae9d9_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313h78bf25f_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -183,6 +184,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index ce1130a5..ceda55b3 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 06fb1fb8c972bc4139434c04db9ef9c1724f79dacbdd239baf797fb346e55d91 +# input_hash: ec1dcd9f18b21077fb9d8aa34caf57c7f2bf89a6ab015e5372bc17f87b82f4ec channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py313hfaae9d9_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313h3dea7bd_0 - freetype=2.14.1=ha770c72_0 @@ -104,6 +105,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313hbfd7664_0 diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index fe0d0866..1b8d120f 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: ae20244d3b512165e354afb5a4f7d4bb9ada0412a9f56b384cc4f4fd5f4ec82e +# input_hash: c8459f555fe55b2cdd69d516010a839eed341cee9a9ba2748cf03bd4b4e5c31c channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py313h7084e01_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313hfa70ccb_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -167,6 +168,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index 7ba38023..443501d2 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: ae20244d3b512165e354afb5a4f7d4bb9ada0412a9f56b384cc4f4fd5f4ec82e +# input_hash: c8459f555fe55b2cdd69d516010a839eed341cee9a9ba2748cf03bd4b4e5c31c channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py313h7084e01_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313hd650c13_0 - freetype=2.14.1=h57928b3_0 @@ -90,6 +91,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313h26f5e95_0 diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index 2eac157f..6aa85fb0 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: a3989ca05d39740b7af7d3eced57f60123978d87a0e5020567be38459df0476d +# input_hash: d457ce1b5fb0c2c3f8fb5adc7cf882ff083528fde96fe0007bd775fd812140ae channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py314h3a4f467_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314hdafbbf9_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -183,6 +184,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index 7528e8f4..1e8b1ea5 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: a3989ca05d39740b7af7d3eced57f60123978d87a0e5020567be38459df0476d +# input_hash: d457ce1b5fb0c2c3f8fb5adc7cf882ff083528fde96fe0007bd775fd812140ae channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py314h3a4f467_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=ha770c72_0 @@ -104,6 +105,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hb4ffadd_0 diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index fbc4ef4e..24b920fe 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: d16ce4bd012e0c3dc21454a8c17a2d35521ff27ba4732b5664f22765498556d8 +# input_hash: 568c471fb611e26f5d7ca05cad5c1f96cd213a0837c7159dafc9c64df99c058d channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py314hbac2fa4_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314h86ab7b2_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -167,6 +168,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 6e688b49..991632ef 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: d16ce4bd012e0c3dc21454a8c17a2d35521ff27ba4732b5664f22765498556d8 +# input_hash: 568c471fb611e26f5d7ca05cad5c1f96cd213a0837c7159dafc9c64df99c058d channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py314hbac2fa4_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=h57928b3_0 @@ -90,6 +91,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hf700ef7_0 diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 15e11281..53c6cfd9 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 10d8ace21865f29d537b611e38f88febdd43f8b7c93f838dc55ca62e1821ef72 - linux-64: 5bd1997f80c6e23a223778e0b084eda8978a936df1ad468eae12139bf07cac3a + win-64: a61b0a7890e3136e0996ebf4b77bc31b161107f13b8ee15672f713d313131462 + linux-64: f29f7ea792a9ca909f9ece6f72b30bf16f7bc38fe205880a4a963929f56d2938 channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: 517fe814fbfe570978369bc6dd9f951739293cf90905213204f30b2c29df7946 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -5031,6 +5055,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda + hash: + md5: 04ab345ef65b88bcbb8ac3d083427bfc + sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda + hash: + md5: ff342a314798173eaaf2753a22f044fa + sha256: 824eeb546a08c990eb461706280d3064c0437f67eb320018986fa439f468e43a + category: main + optional: false - name: openssl version: 3.6.1 manager: conda diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index 5b34a0c0..76a5ac9e 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: ae20244d3b512165e354afb5a4f7d4bb9ada0412a9f56b384cc4f4fd5f4ec82e - linux-64: 06fb1fb8c972bc4139434c04db9ef9c1724f79dacbdd239baf797fb346e55d91 + win-64: c8459f555fe55b2cdd69d516010a839eed341cee9a9ba2748cf03bd4b4e5c31c + linux-64: ec1dcd9f18b21077fb9d8aa34caf57c7f2bf89a6ab015e5372bc17f87b82f4ec channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: d1d7886cd56fa84eeec860ca5761ba7d1167f0ce0e9f9093810c0f35bdeaf994 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -5031,6 +5055,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda + hash: + md5: 993d27015ca7aa1de3f4a471a9b5309e + sha256: ee3e071cbc0be5600747631b41da17349be6fd25c982c9a9644cda3953bbf8b5 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py313hc624790_3.conda + hash: + md5: 57d8fccec9481a008b363bfbbef86d1f + sha256: e5e86bc7ac493fcee526434a79f51c6a24e7c71cf4e50044d0c410079bf44af8 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index 506c53c3..7d3b7e26 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: d16ce4bd012e0c3dc21454a8c17a2d35521ff27ba4732b5664f22765498556d8 - linux-64: a3989ca05d39740b7af7d3eced57f60123978d87a0e5020567be38459df0476d + win-64: 568c471fb611e26f5d7ca05cad5c1f96cd213a0837c7159dafc9c64df99c058d + linux-64: d457ce1b5fb0c2c3f8fb5adc7cf882ff083528fde96fe0007bd775fd812140ae channels: - url: conda-forge used_env_vars: [] @@ -1372,6 +1372,30 @@ package: sha256: ca1d41146115afd54590dad17af0a8c41359c454797d44e290fb3e5bff51034e category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -5010,6 +5034,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda + hash: + md5: bc90b1901f01e0772c74e24b6f931137 + sha256: 7a6c2355af80e8d1e9a851347dc4f5e737a21da8ebeb7f6e4b9889eb8a0186a2 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py314hccc76fc_3.conda + hash: + md5: 864cdb786a1bb977ed1f96eab705a6d1 + sha256: 82ad3a066acc770f0945c1ffa9b1ad1878ad9b6c3625bab940804909ce94d484 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda diff --git a/pyproject.toml b/pyproject.toml index 6f76bb40..9f63c2c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,6 +82,7 @@ pydantic = "^2.12.0" # also in geoh5py, curve-apps, geoapps-utils tqdm = "^4.66.1" trimesh = "~4.1.3" mkl-service = "~2.6.1" # for Windows crash in IDE +openpyxl = "^3.1.2" ## Pip dependencies from Git repositories @@ -139,12 +140,13 @@ zarr = ">=2.14.2, 2.14.*" # from simpeg[dask] matplotlib-base = ">=3.10.0, <3.11.dev" # from geoapps-utils Pillow = ">=12.1.0, <13.0.dev" # from geoh5py h5py = ">=3.15.1, <4.0.dev" # from geoh5py -python_abi = ">=3.*" numpy = ">=2.0.0" -scipy = ">=1.17.0" rtree = ">=1.4.0" +scipy = ">=1.17.0" scikit-learn = ">=1.8.0" +pandas = ">=3.0.*" pydiso = ">=0.2.*" +python_abi = ">=3.*" python-mumps = ">=0.0.6.*" [tool.poetry.requires-plugins] From b80d1e4a38a26801e9ce68e163d5679fa93b40cc Mon Sep 17 00:00:00 2001 From: dominiquef Date: Sun, 15 Feb 2026 20:24:48 -0800 Subject: [PATCH 02/28] relock with openpyxl --- .../py-3.12-linux-64-dev.conda.lock.yml | 6 +- environments/py-3.12-linux-64.conda.lock.yml | 4 +- .../py-3.12-win-64-dev.conda.lock.yml | 6 +- environments/py-3.12-win-64.conda.lock.yml | 4 +- .../py-3.13-linux-64-dev.conda.lock.yml | 6 +- environments/py-3.13-linux-64.conda.lock.yml | 4 +- .../py-3.13-win-64-dev.conda.lock.yml | 6 +- environments/py-3.13-win-64.conda.lock.yml | 4 +- .../py-3.14-linux-64-dev.conda.lock.yml | 6 +- environments/py-3.14-linux-64.conda.lock.yml | 4 +- .../py-3.14-win-64-dev.conda.lock.yml | 6 +- environments/py-3.14-win-64.conda.lock.yml | 4 +- py-3.12.conda-lock.yml | 76 ++++++++++++++++--- py-3.13.conda-lock.yml | 76 ++++++++++++++++--- py-3.14.conda-lock.yml | 76 ++++++++++++++++--- pyproject.toml | 8 +- 16 files changed, 245 insertions(+), 51 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index e86c81eb..79e54931 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 8e323951c273b57b2e693c63cd5efff6356e54fb0a7ba21701cafc8d99fe3026 +# input_hash: 9b21254b00a5b307853ff80e84541f3d396cccab218930a231b89f3c09c61fd8 channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py312hf890105_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h7900ff3_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -182,6 +183,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -193,7 +195,7 @@ dependencies: - pexpect=4.9.0=pyhd8ed1ab_1 - pillow=12.1.1=py312h50c33e8_0 - pip=26.0.1=pyh8b19718_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index 895fc941..e39119ef 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 8e323951c273b57b2e693c63cd5efff6356e54fb0a7ba21701cafc8d99fe3026 +# input_hash: 9b21254b00a5b307853ff80e84541f3d396cccab218930a231b89f3c09c61fd8 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py312hf890105_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h8a5da7c_0 - freetype=2.14.1=ha770c72_0 @@ -103,6 +104,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h8ecdadd_0 diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 7eb2bbae..496176f9 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: be6d3ca6e70781760474b5bf4b3c7d39e46d78f3eb9203327a9d6f7653abeaa8 +# input_hash: 746a78954fe6d0b93421f9e15c59d92cb0e59e8ab44fa917a0f5509ae36e0081 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py312h9b46583_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h2e8e312_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -165,6 +166,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -175,7 +177,7 @@ dependencies: - partd=1.4.2=pyhd8ed1ab_0 - pillow=12.1.1=py312h31f0997_0 - pip=26.0.1=pyh8b19718_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index ac4af38c..fa5a14a4 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: be6d3ca6e70781760474b5bf4b3c7d39e46d78f3eb9203327a9d6f7653abeaa8 +# input_hash: 746a78954fe6d0b93421f9e15c59d92cb0e59e8ab44fa917a0f5509ae36e0081 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py312h9b46583_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h05f76fc_0 - freetype=2.14.1=h57928b3_0 @@ -88,6 +89,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h95189c4_0 diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index cacf4fc0..147edc25 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 68a2de28a7756311781112fab6cbffa52cbb4983a656c81226e008959a0a8f1c +# input_hash: e6785fac81a58cfe9359e9c74263fa7c01272d4b77f1b56e5652aed9a2de3a84 channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py313hfaae9d9_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313h78bf25f_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -192,7 +194,7 @@ dependencies: - pexpect=4.9.0=pyhd8ed1ab_1 - pillow=12.1.1=py313h80991f8_0 - pip=26.0.1=pyh145f28c_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index 679147d0..3f4f923d 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 68a2de28a7756311781112fab6cbffa52cbb4983a656c81226e008959a0a8f1c +# input_hash: e6785fac81a58cfe9359e9c74263fa7c01272d4b77f1b56e5652aed9a2de3a84 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py313hfaae9d9_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313h3dea7bd_0 - freetype=2.14.1=ha770c72_0 @@ -102,6 +103,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313hbfd7664_0 diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index c84f3f83..d3419f4f 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 8ca542f72e16509b794b6267b11c23e801ee9c5ac5d42e59c2f4e3f616c3f59a +# input_hash: 68d19d0729be3c99867a9cfea1e5f5ff7e0e0907ceb18c82a9a4c2919be97f49 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py313h7084e01_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313hfa70ccb_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -176,7 +178,7 @@ dependencies: - partd=1.4.2=pyhd8ed1ab_0 - pillow=12.1.1=py313h38f99e1_0 - pip=26.0.1=pyh145f28c_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index 7abbac6a..bf193145 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 8ca542f72e16509b794b6267b11c23e801ee9c5ac5d42e59c2f4e3f616c3f59a +# input_hash: 68d19d0729be3c99867a9cfea1e5f5ff7e0e0907ceb18c82a9a4c2919be97f49 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py313h7084e01_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313hd650c13_0 - freetype=2.14.1=h57928b3_0 @@ -89,6 +90,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313h26f5e95_0 diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index 086b77d3..51922362 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4b04cf01d39e1a6360f541dc2c531da1e022fafd393d5a175f6f5f12c5417209 +# input_hash: 663080c0251ff41112cf3c0dca4b376f079290ae53294e7bfa056d44d5ff0d28 channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.11.3=py314h3a4f467_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314hdafbbf9_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -192,7 +194,7 @@ dependencies: - pexpect=4.9.0=pyhd8ed1ab_1 - pillow=12.1.1=py314h8ec4b1a_0 - pip=26.0.1=pyh145f28c_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index 76435e90..ab67e0a7 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4b04cf01d39e1a6360f541dc2c531da1e022fafd393d5a175f6f5f12c5417209 +# input_hash: 663080c0251ff41112cf3c0dca4b376f079290ae53294e7bfa056d44d5ff0d28 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py314h3a4f467_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=ha770c72_0 @@ -102,6 +103,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hb4ffadd_0 diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index e9a07ded..4f91b4c0 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: eeaf0450c9adf776c0be6ef2cbdb0a09f4b7d3433670e5e8ded6200675b37145 +# input_hash: 569d7c9bc538227673bbb9c00e4d578c0aeab69c65919878bf85f903126bb756 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.11.3=py314hbac2fa4_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314h86ab7b2_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -176,7 +178,7 @@ dependencies: - partd=1.4.2=pyhd8ed1ab_0 - pillow=12.1.1=py314h61b30b5_0 - pip=26.0.1=pyh145f28c_0 - - platformdirs=4.8.0=pyhcf101f3_0 + - platformdirs=4.9.1=pyhcf101f3_0 - pluggy=1.6.0=pyhf9edf01_1 - prometheus_client=0.24.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.52=pyha770c72_0 diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 6f160ae7..61d53751 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: eeaf0450c9adf776c0be6ef2cbdb0a09f4b7d3433670e5e8ded6200675b37145 +# input_hash: 569d7c9bc538227673bbb9c00e4d578c0aeab69c65919878bf85f903126bb756 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.11.3=py314hbac2fa4_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=h57928b3_0 @@ -89,6 +90,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hf700ef7_0 diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index a5fdf305..d5d668a6 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: be6d3ca6e70781760474b5bf4b3c7d39e46d78f3eb9203327a9d6f7653abeaa8 - linux-64: 8e323951c273b57b2e693c63cd5efff6356e54fb0a7ba21701cafc8d99fe3026 + win-64: 746a78954fe6d0b93421f9e15c59d92cb0e59e8ab44fa917a0f5509ae36e0081 + linux-64: 9b21254b00a5b307853ff80e84541f3d396cccab218930a231b89f3c09c61fd8 channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: 517fe814fbfe570978369bc6dd9f951739293cf90905213204f30b2c29df7946 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda + hash: + md5: 04ab345ef65b88bcbb8ac3d083427bfc + sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda + hash: + md5: ff342a314798173eaaf2753a22f044fa + sha256: 824eeb546a08c990eb461706280d3064c0437f67eb320018986fa439f468e43a + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5288,27 +5344,27 @@ package: category: main optional: false - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: linux-64 dependencies: python: '' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: pluggy diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index e394fc42..c9fd7d74 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 8ca542f72e16509b794b6267b11c23e801ee9c5ac5d42e59c2f4e3f616c3f59a - linux-64: 68a2de28a7756311781112fab6cbffa52cbb4983a656c81226e008959a0a8f1c + win-64: 68d19d0729be3c99867a9cfea1e5f5ff7e0e0907ceb18c82a9a4c2919be97f49 + linux-64: e6785fac81a58cfe9359e9c74263fa7c01272d4b77f1b56e5652aed9a2de3a84 channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: d1d7886cd56fa84eeec860ca5761ba7d1167f0ce0e9f9093810c0f35bdeaf994 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda + hash: + md5: 993d27015ca7aa1de3f4a471a9b5309e + sha256: ee3e071cbc0be5600747631b41da17349be6fd25c982c9a9644cda3953bbf8b5 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py313hc624790_3.conda + hash: + md5: 57d8fccec9481a008b363bfbbef86d1f + sha256: e5e86bc7ac493fcee526434a79f51c6a24e7c71cf4e50044d0c410079bf44af8 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5284,27 +5340,27 @@ package: category: main optional: false - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: pluggy diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index f77b6a0c..ad9fae48 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: eeaf0450c9adf776c0be6ef2cbdb0a09f4b7d3433670e5e8ded6200675b37145 - linux-64: 4b04cf01d39e1a6360f541dc2c531da1e022fafd393d5a175f6f5f12c5417209 + win-64: 569d7c9bc538227673bbb9c00e4d578c0aeab69c65919878bf85f903126bb756 + linux-64: 663080c0251ff41112cf3c0dca4b376f079290ae53294e7bfa056d44d5ff0d28 channels: - url: conda-forge used_env_vars: [] @@ -1372,6 +1372,30 @@ package: sha256: ca1d41146115afd54590dad17af0a8c41359c454797d44e290fb3e5bff51034e category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4960,6 +4984,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda + hash: + md5: bc90b1901f01e0772c74e24b6f931137 + sha256: 7a6c2355af80e8d1e9a851347dc4f5e737a21da8ebeb7f6e4b9889eb8a0186a2 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py314hccc76fc_3.conda + hash: + md5: 864cdb786a1bb977ed1f96eab705a6d1 + sha256: 82ad3a066acc770f0945c1ffa9b1ad1878ad9b6c3625bab940804909ce94d484 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5263,27 +5319,27 @@ package: category: main optional: false - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: platformdirs - version: 4.8.0 + version: 4.9.1 manager: conda platform: win-64 dependencies: python: '>=3.10' - url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.8.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/platformdirs-4.9.1-pyhcf101f3_0.conda hash: - md5: 8afb83f9f16ace9092cb025ed30711ce - sha256: b07015c9105be63f48762986978d88e10a65847a3d3dd2a996918178297a79d9 + md5: 9402ece5651f956de34cf0dc20dfc3a5 + sha256: 40326e409d73630a7c4122e618885dfe5f53d22693884b59af31b9ebd9d1d41c category: dev optional: true - name: pluggy diff --git a/pyproject.toml b/pyproject.toml index 99aeec05..9c535fbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -123,6 +123,7 @@ readthedocs-sphinx-ext = "*" sphinx = "^5.0" nbconvert = "~7.16.4" + [tool.conda-lock] platforms = ['win-64', 'linux-64'] channels = ['conda-forge'] @@ -137,12 +138,13 @@ fsspec = ">=2022.0" # from simpeg[dask] geoana = "0.7.*" # from simpeg h5py = ">=3.15.1, <4.0.dev" # from geoh5py matplotlib-base = ">=3.10.0, <3.11.dev" # from geoapps-utils +openpyxl = ">=3.1.2" Pillow = ">=12.1.0, <13.0.dev" # from geoh5py -pydiso = "~0.2.0" +pydiso = ">=0.2.0" pymatsolver = "0.3.*" # from simpeg python_abi = ">=3.*" -python-mumps = "~0.0.6.0" -rtree = "~1.4.0" +python-mumps = ">=0.0.6.0" +rtree = ">=1.4.0" zarr = ">=2.14.2, 2.14.*" # from simpeg[dask] [tool.poetry.requires-plugins] From 4fbefbe9e83eab344df80af6a79243e8efba307c Mon Sep 17 00:00:00 2001 From: dominiquef Date: Sun, 15 Feb 2026 20:35:21 -0800 Subject: [PATCH 03/28] Add generate_sweep option. Extract options and write to xls --- .../uijson/plate_sweep.ui.json | 8 ++ .../plate_simulation/sweep/driver.py | 73 +++++++++++++++++-- .../plate_simulation/sweep/options.py | 3 +- .../plate_simulation/sweep/uijson.py | 9 ++- 4 files changed, 83 insertions(+), 10 deletions(-) diff --git a/simpeg_drivers-assets/uijson/plate_sweep.ui.json b/simpeg_drivers-assets/uijson/plate_sweep.ui.json index 2112815e..363c46be 100644 --- a/simpeg_drivers-assets/uijson/plate_sweep.ui.json +++ b/simpeg_drivers-assets/uijson/plate_sweep.ui.json @@ -31,6 +31,14 @@ "tootip": "Directory to store simulation results, relative to the working geoh5.", "value": "./simulations" }, + "generate_summary": { + "main": true, + "group": "Base", + "label": "Generate summary file (.xlsx)", + "enabled": true, + "tootip": "Create and xlsx file summarizing the parameters of all simulation found in the 'Output directory'.", + "value": true + }, "background_start": { "main": true, "group": "Background", diff --git a/simpeg_drivers/plate_simulation/sweep/driver.py b/simpeg_drivers/plate_simulation/sweep/driver.py index 2ca7921c..90ea089e 100644 --- a/simpeg_drivers/plate_simulation/sweep/driver.py +++ b/simpeg_drivers/plate_simulation/sweep/driver.py @@ -12,6 +12,7 @@ import shutil import sys +from numbers import Number from pathlib import Path import numpy as np @@ -21,10 +22,12 @@ from geoh5py.groups import SimPEGGroup, UIJsonGroup from geoh5py.shared.utils import ( dict_to_json_str, - fetch_active_workspace, + str_json_to_dict, uuid_from_values, ) from geoh5py.ui_json.utils import flatten +from h5py import File +from pandas import DataFrame from typing_extensions import Self from simpeg_drivers.driver import BaseDriver @@ -55,18 +58,18 @@ def start(cls, filepath: str | Path, mode="r", **_) -> Self: filepath = Path(filepath).resolve() uijson = PlateSweepUIJson.read(filepath) - with Workspace(uijson.geoh5, mode=mode) as workspace: - try: + try: + with Workspace(uijson.geoh5, mode=mode) as workspace: options = SweepOptions.build(uijson.to_params(workspace=workspace)) logger.info("Initializing application . . .") driver = cls(options) logger.info("Running application . . .") - driver.run() - logger.info("Results saved to %s", options.geoh5.h5file) + driver.run() + logger.info("Results saved to %s", options.geoh5.h5file) - except GeoAppsError as error: - logger.warning("\n\nApplicationError: %s\n\n", error) - sys.exit(1) + except GeoAppsError as error: + logger.warning("\n\nApplicationError: %s\n\n", error) + sys.exit(1) return driver @@ -111,6 +114,13 @@ def run(self): if use_futures: self.client.gather(futures) + if self.params.generate_summary: + summary = generate_summary(self.params.workdir.iterdir()) + out_file = self.params.geoh5.h5file.parent / "summary.xlsx" + summary.to_excel(out_file, index=False) + with self.params.geoh5.open(mode="r+"): + self.out_group.add_file(out_file) + @staticmethod def run_trial( data: dict, h5file: Path, workdir: str, worker: tuple[str] | None = None @@ -163,6 +173,53 @@ def run_trial( return None +def forms_to_values(data: dict) -> dict: + """ + Convert a dictionary of forms to a dictionary of values, where the value is a number. + + :param data: Dictionary of forms. + + :return: Dictionary of key and numeric values + """ + fields = {} + for name, form in data.items(): + if isinstance(form, dict) and isinstance(form.get("value"), Number): + fields[name] = form.get("value") + + return fields + + +def generate_summary(directory: list[Path]) -> DataFrame: + """ + Generate a summary of the trials and save it to the geoh5 file. + + :param directory: List of paths to geoh5 files to summarize. + + :return: Dataframe of trial names and options. + """ + summary = [] + for simulation in directory: + if Path(simulation).resolve().suffix != ".geoh5": + continue + + with File(simulation, mode="r") as geoh5: + for group in geoh5["GEOSCIENCE"]["Groups"].values(): + if group.get("options", None): + options = str_json_to_dict(np.r_[group["options"]][0]) + + if ( + options["title"] == "Plate Simulation" + and len(group["Objects"]) > 0 + ): + options = forms_to_values(options) + output = {"file": simulation.stem} + output.update(options) + summary.append(output) + break + + return DataFrame(summary) + + def run_block( trials: list[dict], h5file: Path, diff --git a/simpeg_drivers/plate_simulation/sweep/options.py b/simpeg_drivers/plate_simulation/sweep/options.py index 52d3c2a8..36192887 100644 --- a/simpeg_drivers/plate_simulation/sweep/options.py +++ b/simpeg_drivers/plate_simulation/sweep/options.py @@ -63,8 +63,9 @@ class SweepOptions(Options): forward_only: bool = True inversion_type: str = "plate sweep" template: SimPEGGroup | UIJsonGroup + generate_summary: bool = True sweeps: list[ParamSweep] - workdir: str = "./simulations" + workdir: Path = Path("./simulations") @field_serializer("sweeps") def sweeps_to_params(self, sweeps): diff --git a/simpeg_drivers/plate_simulation/sweep/uijson.py b/simpeg_drivers/plate_simulation/sweep/uijson.py index d82c9cdf..8a74ff32 100644 --- a/simpeg_drivers/plate_simulation/sweep/uijson.py +++ b/simpeg_drivers/plate_simulation/sweep/uijson.py @@ -8,7 +8,13 @@ # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -from geoh5py.ui_json.forms import FloatForm, GroupForm, IntegerForm, StringForm +from geoh5py.ui_json.forms import ( + BoolForm, + FloatForm, + GroupForm, + IntegerForm, + StringForm, +) from geoh5py.ui_json.ui_json import BaseUIJson from pydantic import ConfigDict @@ -46,3 +52,4 @@ class PlateSweepUIJson(BaseUIJson): dip_direction_count: IntegerForm out_group: GroupForm | None workdir: StringForm | None + generate_summary: BoolForm From 7f05ab1c3b87f582e3623eae89ab659d0c6efe83 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Tue, 17 Feb 2026 11:09:48 -0800 Subject: [PATCH 04/28] Skip sweeping if empty set --- simpeg_drivers/plate_simulation/sweep/driver.py | 2 +- simpeg_drivers/plate_simulation/sweep/options.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/simpeg_drivers/plate_simulation/sweep/driver.py b/simpeg_drivers/plate_simulation/sweep/driver.py index 90ea089e..91f1c751 100644 --- a/simpeg_drivers/plate_simulation/sweep/driver.py +++ b/simpeg_drivers/plate_simulation/sweep/driver.py @@ -85,7 +85,7 @@ def run(self): use_futures = self.client - if use_futures: + if use_futures and trials: blocks = np.array_split(trials, len(self.workers)) else: blocks = trials diff --git a/simpeg_drivers/plate_simulation/sweep/options.py b/simpeg_drivers/plate_simulation/sweep/options.py index 36192887..dc372499 100644 --- a/simpeg_drivers/plate_simulation/sweep/options.py +++ b/simpeg_drivers/plate_simulation/sweep/options.py @@ -113,6 +113,9 @@ def collect_sweep(param: str) -> dict: @property def trials(self) -> list[dict]: """Returns a list of parameter combinations to run for each trial.""" + if not self.sweeps: + return [] + names = [s.name for s in self.sweeps] iterations = itertools.product(*[np.linspace(*s()) for s in self.sweeps]) options_dict = self.template_options.copy() From 7588aec9da61efe4ebcf02ef640d583300ffeb3c Mon Sep 17 00:00:00 2001 From: dominiquef Date: Tue, 17 Feb 2026 12:35:08 -0800 Subject: [PATCH 05/28] Add openpyxl to the requirements --- .../py-3.12-linux-64-dev.conda.lock.yml | 20 +- environments/py-3.12-linux-64.conda.lock.yml | 20 +- .../py-3.12-win-64-dev.conda.lock.yml | 14 +- environments/py-3.12-win-64.conda.lock.yml | 14 +- .../py-3.13-linux-64-dev.conda.lock.yml | 20 +- environments/py-3.13-linux-64.conda.lock.yml | 20 +- .../py-3.13-win-64-dev.conda.lock.yml | 14 +- environments/py-3.13-win-64.conda.lock.yml | 14 +- .../py-3.14-linux-64-dev.conda.lock.yml | 20 +- environments/py-3.14-linux-64.conda.lock.yml | 20 +- .../py-3.14-win-64-dev.conda.lock.yml | 14 +- environments/py-3.14-win-64.conda.lock.yml | 14 +- py-3.12.conda-lock.yml | 180 +++++++++++------ py-3.13.conda-lock.yml | 182 ++++++++++++------ py-3.14.conda-lock.yml | 182 ++++++++++++------ pyproject.toml | 1 + recipe.yaml | 1 + 17 files changed, 472 insertions(+), 278 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index eafe2e38..b2649724 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 6793690b16c5a3cfe004fcc8c0e7124a7465b37b9453989be2c9d9c7bf248288 +# input_hash: 0dfbe4d91e95a66d6bdd1809ef434130c7bfe22c963ec5bfe054e946b33ba8e9 channels: - conda-forge @@ -28,7 +28,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py312hdb49522_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py312h2a48985_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h7900ff3_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -137,7 +138,7 @@ dependencies: - libnghttp2=1.67.0=had1ee68_0 - libnsl=2.0.1=hb9d3cd8_1 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -166,8 +167,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py312hd9148b4_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -182,6 +183,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -217,7 +219,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.12.12=hd8ed1ab_2 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_hf5ef983 + - python-mumps=0.0.6=nompi_h4762de1 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pytz=2025.2=pyhd8ed1ab_0 @@ -290,9 +292,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index f0b2c384..3b7de373 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 6793690b16c5a3cfe004fcc8c0e7124a7465b37b9453989be2c9d9c7bf248288 +# input_hash: 0dfbe4d91e95a66d6bdd1809ef434130c7bfe22c963ec5bfe054e946b33ba8e9 channels: - conda-forge @@ -14,7 +14,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py312hdb49522_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h2a48985_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h8a5da7c_0 - freetype=2.14.1=ha770c72_0 @@ -75,7 +76,7 @@ dependencies: - libnghttp2=1.67.0=had1ee68_0 - libnsl=2.0.1=hb9d3cd8_1 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -96,13 +97,14 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py312hd9148b4_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h8ecdadd_0 @@ -119,7 +121,7 @@ dependencies: - pysocks=1.7.1=pyha55dd90_7 - python=3.12.12=hd63d673_2_cpython - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_hf5ef983 + - python-mumps=0.0.6=nompi_h4762de1 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pyyaml=6.0.3=py312h8a5da7c_1 @@ -157,9 +159,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 89bfbc8c..c29901f4 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: cf32723a98f275c54bf9d72aff483b8966c549a89f0f7d16dbef8714d2400a91 +# input_hash: b9ee1f72d5a02a4e6e69d20431c4aa6226c9decdf3809c94eb5f5effd791b1bb channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py312h7c90ba1_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h2e8e312_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -151,7 +152,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py312hf90b1b7_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -165,6 +166,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -198,7 +200,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.12.12=hd8ed1ab_2 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_h368aa49 + - python-mumps=0.0.6=nompi_hd0d704b - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pytz=2025.2=pyhd8ed1ab_0 @@ -277,9 +279,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index 84617df8..b8f18b56 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: cf32723a98f275c54bf9d72aff483b8966c549a89f0f7d16dbef8714d2400a91 +# input_hash: b9ee1f72d5a02a4e6e69d20431c4aa6226c9decdf3809c94eb5f5effd791b1bb channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h7c90ba1_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h05f76fc_0 - freetype=2.14.1=h57928b3_0 @@ -83,11 +84,12 @@ dependencies: - matplotlib-base=3.10.8=py312h0ebf65c_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py312hf90b1b7_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py312h95189c4_0 @@ -104,7 +106,7 @@ dependencies: - pysocks=1.7.1=pyh09c184e_7 - python=3.12.12=h0159041_2_cpython - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_h368aa49 + - python-mumps=0.0.6=nompi_hd0d704b - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.12=8_cp312 - pyyaml=6.0.3=py312h05f76fc_1 @@ -146,9 +148,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index d96f20bc..0fd64807 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 02fccaeb9f140d6fa5c291e193dd760d20c6cc7871b7ac6de2fa2186a01d2b83 +# input_hash: 8076793c180ad36dc495caeada8908cde79f177bd7aac74d73bf501f227eeee7 channels: - conda-forge @@ -28,7 +28,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py313hf159716_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py313h0f78c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313h78bf25f_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -137,7 +138,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -165,8 +166,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py313h7037e92_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -216,7 +218,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.13.12=h4df99d1_100 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_he344ac6 + - python-mumps=0.0.6=nompi_h2980587 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pytz=2025.2=pyhd8ed1ab_0 @@ -287,9 +289,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index b8005fd0..743fe135 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 02fccaeb9f140d6fa5c291e193dd760d20c6cc7871b7ac6de2fa2186a01d2b83 +# input_hash: 8076793c180ad36dc495caeada8908cde79f177bd7aac74d73bf501f227eeee7 channels: - conda-forge @@ -14,7 +14,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py313hf159716_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313h0f78c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313h3dea7bd_0 - freetype=2.14.1=ha770c72_0 @@ -75,7 +76,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -95,13 +96,14 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py313h7037e92_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313hbfd7664_0 @@ -118,7 +120,7 @@ dependencies: - pysocks=1.7.1=pyha55dd90_7 - python=3.13.12=hc97d973_100_cp313 - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_he344ac6 + - python-mumps=0.0.6=nompi_h2980587 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pyyaml=6.0.3=py313h3dea7bd_1 @@ -154,9 +156,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index 106e3692..84aabd83 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: ad6d8619709e80f4ad7f25c1f01e2e02dd20d0f18b56b430395460527d2a51d4 +# input_hash: dbd303a809e213556bed6c33cc0053779eb409983bf92f7d30e2f475ec963a88 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py313hedd11bf_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313hfa70ccb_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -152,7 +153,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py313hf069bd2_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -199,7 +201,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.13.12=h4df99d1_100 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_h892cc54 + - python-mumps=0.0.6=nompi_h88661b0 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pytz=2025.2=pyhd8ed1ab_0 @@ -276,9 +278,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index 854fb94d..79bd88ef 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: ad6d8619709e80f4ad7f25c1f01e2e02dd20d0f18b56b430395460527d2a51d4 +# input_hash: dbd303a809e213556bed6c33cc0053779eb409983bf92f7d30e2f475ec963a88 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313hedd11bf_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313hd650c13_0 - freetype=2.14.1=h57928b3_0 @@ -84,11 +85,12 @@ dependencies: - matplotlib-base=3.10.8=py313he1ded55_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py313hf069bd2_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py313h26f5e95_0 @@ -105,7 +107,7 @@ dependencies: - pysocks=1.7.1=pyh09c184e_7 - python=3.13.12=h09917c8_100_cp313 - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_h892cc54 + - python-mumps=0.0.6=nompi_h88661b0 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.13=8_cp313 - pyyaml=6.0.3=py313hd650c13_1 @@ -145,9 +147,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index b6336314..fc72a767 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e80d14f736f4a1c27302cf84cc39f9ecbbbe712f76172854800aba09c8eed659 +# input_hash: f5eecd8ae732fd2f39936b48bf277795f52f10c67fc76096eb317d2ab7b40126 channels: - conda-forge @@ -28,7 +28,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py314h3de4e8d_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py314hb287c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314hdafbbf9_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -137,7 +138,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -165,8 +166,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py314h9891dd4_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -216,7 +218,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.14.3=h4df99d1_101 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_h8c06994 + - python-mumps=0.0.6=nompi_hd9a44b4 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pytz=2025.2=pyhd8ed1ab_0 @@ -288,9 +290,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index 4a749abb..e03adb41 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e80d14f736f4a1c27302cf84cc39f9ecbbbe712f76172854800aba09c8eed659 +# input_hash: f5eecd8ae732fd2f39936b48bf277795f52f10c67fc76096eb317d2ab7b40126 channels: - conda-forge @@ -14,7 +14,7 @@ dependencies: - brotli=1.2.0=hed03a55_1 - brotli-bin=1.2.0=hb03c661_1 - brotli-python=1.2.0=py314h3de4e8d_1 - - bzip2=1.0.8=hda65f42_8 + - bzip2=1.0.8=hda65f42_9 - c-ares=1.34.6=hb03c661_0 - ca-certificates=2026.1.4=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314hb287c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=ha770c72_0 @@ -75,7 +76,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.10=int32_h8512f2c_2 + - libscotch=7.0.11=int32_h865694f_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -95,13 +96,14 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py314h9891dd4_1 - - mumps-include=5.8.1=h1795ed4_4 - - mumps-seq=5.8.1=h4374b6a_4 + - mumps-include=5.8.2=h1795ed4_1 + - mumps-seq=5.8.2=h31f7764_1 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hb4ffadd_0 @@ -118,7 +120,7 @@ dependencies: - pysocks=1.7.1=pyha55dd90_7 - python=3.14.3=h32b2ec7_101_cp314 - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_h8c06994 + - python-mumps=0.0.6=nompi_hd9a44b4 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pyyaml=6.0.3=py314h67df5f8_1 @@ -155,9 +157,9 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index b009a7d3..dc0e428f 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: b576b9f4c120525d34a4f54ceaa14600c5f0d0b70fb176cfc64c339ffc23e7a8 +# input_hash: de1510e9c0dc2f4f2934740a273cf6bb10fb82aa1a4f4c633dbb92df076a1e9f channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py314h1495373_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314h86ab7b2_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -152,7 +153,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py314h909e829_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -199,7 +201,7 @@ dependencies: - python-fastjsonschema=2.21.2=pyhe01879c_0 - python-gil=3.14.3=h4df99d1_101 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-mumps=0.0.6=nompi_haa1430b + - python-mumps=0.0.6=nompi_h3182675 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pytz=2025.2=pyhd8ed1ab_0 @@ -277,9 +279,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 629d2839..c7bdf23b 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: b576b9f4c120525d34a4f54ceaa14600c5f0d0b70fb176cfc64c339ffc23e7a8 +# input_hash: de1510e9c0dc2f4f2934740a273cf6bb10fb82aa1a4f4c633dbb92df076a1e9f channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314h1495373_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=h57928b3_0 @@ -84,11 +85,12 @@ dependencies: - matplotlib-base=3.10.8=py314hfa45d96_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py314h909e829_1 - - mumps-seq=5.8.1=hd297af6_4 + - mumps-seq=5.8.2=h607cc0b_1 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.0=py314hf700ef7_0 @@ -105,7 +107,7 @@ dependencies: - pysocks=1.7.1=pyh09c184e_7 - python=3.14.3=h4b44e0e_101_cp314 - python-dateutil=2.9.0.post0=pyhe01879c_2 - - python-mumps=0.0.6=nompi_haa1430b + - python-mumps=0.0.6=nompi_h3182675 - python-tzdata=2025.3=pyhd8ed1ab_0 - python_abi=3.14=8_cp314 - pyyaml=6.0.3=py314h2359020_1 @@ -146,9 +148,9 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c variables: diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 5826ca3f..b78b94a5 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: cf32723a98f275c54bf9d72aff483b8966c549a89f0f7d16dbef8714d2400a91 - linux-64: 6793690b16c5a3cfe004fcc8c0e7124a7465b37b9453989be2c9d9c7bf248288 + win-64: b9ee1f72d5a02a4e6e69d20431c4aa6226c9decdf3809c94eb5f5effd791b1bb + linux-64: 0dfbe4d91e95a66d6bdd1809ef434130c7bfe22c963ec5bfe054e946b33ba8e9 channels: - url: conda-forge used_env_vars: [] @@ -657,10 +657,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda hash: - md5: 51a19bba1b8ebfb60df25cde030b7ebc - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: d2ffd7602c02f2b316fd921d39876885 + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 category: main optional: false - name: bzip2 @@ -1381,6 +1381,30 @@ package: sha256: 517fe814fbfe570978369bc6dd9f951739293cf90905213204f30b2c29df7946 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -3721,7 +3745,7 @@ package: category: main optional: false - name: libscotch - version: 7.0.10 + version: 7.0.11 manager: conda platform: linux-64 dependencies: @@ -3730,12 +3754,12 @@ package: libgcc: '>=14' libgfortran: '' libgfortran5: '>=14.3.0' - liblzma: '>=5.8.1,<6.0a0' + liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.10-int32_h8512f2c_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda hash: - md5: dc1519e1ad20cda94f6c0fd4719d3413 - sha256: cc071fb48c78d26b2ebc583809d62a8e9fb8bd04db3fd96361ffac9127fd6245 + md5: 1dcc0addf04df4ab0227624e3c503737 + sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 category: main optional: false - name: libsodium @@ -4498,18 +4522,18 @@ package: category: main optional: false - name: mumps-include - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.1-h1795ed4_4.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda hash: - md5: ea5ef10a7cab2db49b594285e135ab96 - sha256: 0abe54874dc8b4751e599b7310abbafbe35cd6c49eab80287fcbbefb8d2a2ff1 + md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d + sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: @@ -4522,28 +4546,28 @@ package: liblapack: '>=3.9.0,<4.0a0' libscotch: '*' metis: '>=5.1.0,<5.1.1.0a0' - mumps-include: ==5.8.1 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.1-h4374b6a_4.conda + mumps-include: ==5.8.2 + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda hash: - md5: fe5cc261c431673f2cd35f78a5b43d95 - sha256: 5fb7c097e21948bfe0935e82ded7c8617d305420fe59270f4409f90289193768 + md5: 2d0153a02087c7e9b4fbfbacd312f1e3 + sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: win-64 dependencies: libblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - llvm-openmp: '>=21.1.2' + llvm-openmp: '>=21.1.8' ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.1-hd297af6_4.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda hash: - md5: 69feddba6b736c7ef62f7384a0aeeadc - sha256: 963dd511d87c00b7ec0b386e227aa6233a1866f43b12547642dd21fdb2c9baeb + md5: 6bdd3a1f02ad45955526b4a22cfcfc4a + sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 category: main optional: false - name: munkres @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda + hash: + md5: 04ab345ef65b88bcbb8ac3d083427bfc + sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda + hash: + md5: ff342a314798173eaaf2753a22f044fa + sha256: 824eeb546a08c990eb461706280d3064c0437f67eb320018986fa439f468e43a + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5982,15 +6038,15 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.12.* scipy: '>=1.13' - url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_hf5ef983.conda + url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_h4762de1.conda hash: - md5: 4f2756e84c9b971b26786465a09e1b67 - sha256: fc1de7aabc677d09476ca80c981d2c21c110f762d666a3687c8371b10ba5fdff + md5: c766330e307e879c8e4a1300ea3f5d9a + sha256: b8a23610b561fe63313dfd271e920f3e6a6cdf5cd3baaa19e2874a249d36cf31 category: main optional: false - name: python-mumps @@ -5998,7 +6054,7 @@ package: manager: conda platform: win-64 dependencies: - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.12.* @@ -6006,10 +6062,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_h368aa49.conda + url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_hd0d704b.conda hash: - md5: 6a1e0cbf6e45eb254a4c5e46f724fe48 - sha256: bdd71d074af97545b6dad82e4d560bd0562aa247b879953a665077a4a4234744 + md5: d0181bbf18cf66d05f95186c440bd623 + sha256: 14ec4ee1d95c0f7e25456b2f9817a1e9fdd9efb757b8ff94093b097c3fdf9f60 category: main optional: false - name: python-tzdata @@ -8035,43 +8091,43 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: linux-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: win-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: linux-64 dependencies: @@ -8079,16 +8135,16 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: win-64 dependencies: @@ -8096,50 +8152,50 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: mira-simpeg diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index 63be0aee..3a7427b5 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: ad6d8619709e80f4ad7f25c1f01e2e02dd20d0f18b56b430395460527d2a51d4 - linux-64: 02fccaeb9f140d6fa5c291e193dd760d20c6cc7871b7ac6de2fa2186a01d2b83 + win-64: dbd303a809e213556bed6c33cc0053779eb409983bf92f7d30e2f475ec963a88 + linux-64: 8076793c180ad36dc495caeada8908cde79f177bd7aac74d73bf501f227eeee7 channels: - url: conda-forge used_env_vars: [] @@ -657,10 +657,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda hash: - md5: 51a19bba1b8ebfb60df25cde030b7ebc - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: d2ffd7602c02f2b316fd921d39876885 + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 category: main optional: false - name: bzip2 @@ -1381,6 +1381,30 @@ package: sha256: d1d7886cd56fa84eeec860ca5761ba7d1167f0ce0e9f9093810c0f35bdeaf994 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -3733,7 +3757,7 @@ package: category: main optional: false - name: libscotch - version: 7.0.10 + version: 7.0.11 manager: conda platform: linux-64 dependencies: @@ -3742,12 +3766,12 @@ package: libgcc: '>=14' libgfortran: '' libgfortran5: '>=14.3.0' - liblzma: '>=5.8.1,<6.0a0' + liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.10-int32_h8512f2c_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda hash: - md5: dc1519e1ad20cda94f6c0fd4719d3413 - sha256: cc071fb48c78d26b2ebc583809d62a8e9fb8bd04db3fd96361ffac9127fd6245 + md5: 1dcc0addf04df4ab0227624e3c503737 + sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 category: main optional: false - name: libsodium @@ -4498,18 +4522,18 @@ package: category: main optional: false - name: mumps-include - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.1-h1795ed4_4.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda hash: - md5: ea5ef10a7cab2db49b594285e135ab96 - sha256: 0abe54874dc8b4751e599b7310abbafbe35cd6c49eab80287fcbbefb8d2a2ff1 + md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d + sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: @@ -4520,30 +4544,30 @@ package: libgfortran: '' libgfortran5: '>=14.3.0' liblapack: '>=3.9.0,<4.0a0' - libscotch: '>=7.0.10,<7.0.11.0a0' + libscotch: '>=7.0.11,<7.0.12.0a0' metis: '>=5.1.0,<5.1.1.0a0' - mumps-include: ==5.8.1 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.1-h4374b6a_4.conda + mumps-include: ==5.8.2 + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda hash: - md5: fe5cc261c431673f2cd35f78a5b43d95 - sha256: 5fb7c097e21948bfe0935e82ded7c8617d305420fe59270f4409f90289193768 + md5: 2d0153a02087c7e9b4fbfbacd312f1e3 + sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: win-64 dependencies: libblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - llvm-openmp: '>=21.1.2' + llvm-openmp: '>=21.1.8' ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.1-hd297af6_4.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda hash: - md5: 69feddba6b736c7ef62f7384a0aeeadc - sha256: 963dd511d87c00b7ec0b386e227aa6233a1866f43b12547642dd21fdb2c9baeb + md5: 6bdd3a1f02ad45955526b4a22cfcfc4a + sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 category: main optional: false - name: munkres @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda + hash: + md5: 993d27015ca7aa1de3f4a471a9b5309e + sha256: ee3e071cbc0be5600747631b41da17349be6fd25c982c9a9644cda3953bbf8b5 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py313hc624790_3.conda + hash: + md5: 57d8fccec9481a008b363bfbbef86d1f + sha256: e5e86bc7ac493fcee526434a79f51c6a24e7c71cf4e50044d0c410079bf44af8 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5980,15 +6036,15 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.13.* scipy: '>=1.13' - url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_he344ac6.conda + url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_h2980587.conda hash: - md5: 5f908b8e257ffb38d33ad1b63ba716f8 - sha256: 9764299da1bc92216e86eb8f48a9541966d3480eeb82d161de854151ee02c8c5 + md5: 3384a9db4609aee18e4921ba700a2ea9 + sha256: 220d5646005b1fe2d57d2f6024624c0a9c13bffacabe459cc21c9a90406492a3 category: main optional: false - name: python-mumps @@ -5996,7 +6052,7 @@ package: manager: conda platform: win-64 dependencies: - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.13.* @@ -6004,10 +6060,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_h892cc54.conda + url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_h88661b0.conda hash: - md5: 1b9357e668f4770ab8a413f353e7968c - sha256: 541569f6148569ad52aee8e72d0659f23f7defcf337eee93e69a7f23d95b100a + md5: 388be9accb40ae0f3a546f8c50883814 + sha256: e33582726c0ca08c7258c64c26de661964fb841b81d72a317c6ce681a55093a2 category: main optional: false - name: python-tzdata @@ -7976,43 +8032,43 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: linux-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: win-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: linux-64 dependencies: @@ -8020,16 +8076,16 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: win-64 dependencies: @@ -8037,50 +8093,50 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: mira-simpeg diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index ad0e5126..88386243 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: b576b9f4c120525d34a4f54ceaa14600c5f0d0b70fb176cfc64c339ffc23e7a8 - linux-64: e80d14f736f4a1c27302cf84cc39f9ecbbbe712f76172854800aba09c8eed659 + win-64: de1510e9c0dc2f4f2934740a273cf6bb10fb82aa1a4f4c633dbb92df076a1e9f + linux-64: f5eecd8ae732fd2f39936b48bf277795f52f10c67fc76096eb317d2ab7b40126 channels: - url: conda-forge used_env_vars: [] @@ -648,10 +648,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + url: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda hash: - md5: 51a19bba1b8ebfb60df25cde030b7ebc - sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: d2ffd7602c02f2b316fd921d39876885 + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 category: main optional: false - name: bzip2 @@ -1372,6 +1372,30 @@ package: sha256: ca1d41146115afd54590dad17af0a8c41359c454797d44e290fb3e5bff51034e category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -3719,7 +3743,7 @@ package: category: main optional: false - name: libscotch - version: 7.0.10 + version: 7.0.11 manager: conda platform: linux-64 dependencies: @@ -3728,12 +3752,12 @@ package: libgcc: '>=14' libgfortran: '' libgfortran5: '>=14.3.0' - liblzma: '>=5.8.1,<6.0a0' + liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.10-int32_h8512f2c_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda hash: - md5: dc1519e1ad20cda94f6c0fd4719d3413 - sha256: cc071fb48c78d26b2ebc583809d62a8e9fb8bd04db3fd96361ffac9127fd6245 + md5: 1dcc0addf04df4ab0227624e3c503737 + sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 category: main optional: false - name: libsodium @@ -4477,18 +4501,18 @@ package: category: main optional: false - name: mumps-include - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.1-h1795ed4_4.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda hash: - md5: ea5ef10a7cab2db49b594285e135ab96 - sha256: 0abe54874dc8b4751e599b7310abbafbe35cd6c49eab80287fcbbefb8d2a2ff1 + md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d + sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: linux-64 dependencies: @@ -4499,30 +4523,30 @@ package: libgfortran: '' libgfortran5: '>=14.3.0' liblapack: '>=3.9.0,<4.0a0' - libscotch: '>=7.0.10,<7.0.11.0a0' + libscotch: '>=7.0.11,<7.0.12.0a0' metis: '>=5.1.0,<5.1.1.0a0' - mumps-include: ==5.8.1 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.1-h4374b6a_4.conda + mumps-include: ==5.8.2 + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda hash: - md5: fe5cc261c431673f2cd35f78a5b43d95 - sha256: 5fb7c097e21948bfe0935e82ded7c8617d305420fe59270f4409f90289193768 + md5: 2d0153a02087c7e9b4fbfbacd312f1e3 + sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 category: main optional: false - name: mumps-seq - version: 5.8.1 + version: 5.8.2 manager: conda platform: win-64 dependencies: libblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - llvm-openmp: '>=21.1.2' + llvm-openmp: '>=21.1.8' ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.1-hd297af6_4.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda hash: - md5: 69feddba6b736c7ef62f7384a0aeeadc - sha256: 963dd511d87c00b7ec0b386e227aa6233a1866f43b12547642dd21fdb2c9baeb + md5: 6bdd3a1f02ad45955526b4a22cfcfc4a + sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 category: main optional: false - name: munkres @@ -4960,6 +4984,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda + hash: + md5: bc90b1901f01e0772c74e24b6f931137 + sha256: 7a6c2355af80e8d1e9a851347dc4f5e737a21da8ebeb7f6e4b9889eb8a0186a2 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py314hccc76fc_3.conda + hash: + md5: 864cdb786a1bb977ed1f96eab705a6d1 + sha256: 82ad3a066acc770f0945c1ffa9b1ad1878ad9b6c3625bab940804909ce94d484 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -5961,15 +6017,15 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.14.* scipy: '>=1.13' - url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_h8c06994.conda + url: https://repo.prefix.dev/conda-forge/linux-64/python-mumps-0.0.6-nompi_hd9a44b4.conda hash: - md5: 8fa83f6e3fc167c771c017214f11fc28 - sha256: fb2befc46e1559743a4b9bd3fe9834963504cdd5ce73336e6a2d75b981d58b66 + md5: f384e4c5209eb54398b806d63ee001be + sha256: 74186c7679ddf4ba2a09648eac343b0efcc69e1a5f7676a5aca0a27a6ab6644e category: main optional: false - name: python-mumps @@ -5977,7 +6033,7 @@ package: manager: conda platform: win-64 dependencies: - mumps-seq: '>=5.8.1,<5.8.2.0a0' + mumps-seq: '>=5.8.2,<5.8.3.0a0' numpy: '>=1.23,<3' python: '' python_abi: 3.14.* @@ -5985,10 +6041,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_haa1430b.conda + url: https://repo.prefix.dev/conda-forge/win-64/python-mumps-0.0.6-nompi_h3182675.conda hash: - md5: c8af08024a1095594daeed4c0cdff4f2 - sha256: 7c7b648783b93e043bfb9864404e85977a45e85fb62f1358fce6308b5433622a + md5: 87eb7acb29aee35f125de481b589e471 + sha256: 337493fff7169792df9854ab37d80b086207b2886ba25b7f339eb50af532f903 category: main optional: false - name: python-tzdata @@ -7988,43 +8044,43 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: linux-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev23+56a2518 + version: 0.7.0a2.dev24+bf35f94 manager: pip platform: win-64 dependencies: - geoh5py: 0.13.0a2.dev144+c177431c + geoh5py: 0.13.0a2.dev149+a5bcf4b5 matplotlib: '>=3.10.0,<3.11.0' numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 hash: - sha256: 56a2518edd539f1e3c9468640a643bd1cd9c3850 + sha256: bf35f9467398d3c7ede653b9de545c846caf1ac1 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@56a2518edd539f1e3c9468640a643bd1cd9c3850 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@bf35f9467398d3c7ede653b9de545c846caf1ac1 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: linux-64 dependencies: @@ -8032,16 +8088,16 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: geoh5py - version: 0.13.0a2.dev144+c177431c + version: 0.13.0a2.dev149+a5bcf4b5 manager: pip platform: win-64 dependencies: @@ -8049,50 +8105,50 @@ package: numpy: '>=2.4.0,<2.5.0' pillow: '>=12.1.0,<12.2.0' pydantic: '>=2.12.0,<2.13.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 hash: - sha256: c177431c791a5f5dd280985ddaf3615790e655fa + sha256: a5bcf4b50c50d712c463baeb15bea768a4b76c39 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@c177431c791a5f5dd280985ddaf3615790e655fa + url: git+https://github.com/MiraGeoscience/geoh5py.git@a5bcf4b50c50d712c463baeb15bea768a4b76c39 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: grid-apps - version: 0.2.0a2.dev9+019ef68 + version: 0.2.0a2.dev10+f098150 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.dev' - geoapps-utils: 0.7.0a2.dev23+56a2518 - geoh5py: 0.13.0a2.dev144+c177431c + geoapps-utils: 0.7.0a2.dev24+bf35f94 + geoh5py: 0.13.0a2.dev149+a5bcf4b5 numpy: '>=2.4.0,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc hash: - sha256: 019ef68933e72528f45902ac32c783d00bb51992 + sha256: f0981503f4172e264f74e929607a3e91a0c7d0fc source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@019ef68933e72528f45902ac32c783d00bb51992 + url: git+https://github.com/MiraGeoscience/grid-apps.git@f0981503f4172e264f74e929607a3e91a0c7d0fc category: main optional: false - name: mira-simpeg diff --git a/pyproject.toml b/pyproject.toml index 6e73b293..60a50d61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,6 +79,7 @@ dask = "2025.3.*" # also in simpeg[dask] discretize = "0.12.*" # also in simpeg, grid-apps distributed = "2025.3.*" # for dask[distributed] numpy = "~2.4.2" +openpyxl = ">=3.1.2" pydantic = "~2.12.0" # also in geoh5py, curve-apps, geoapps-utils scikit-learn = "~1.8.0" scipy = "~1.17.0" diff --git a/recipe.yaml b/recipe.yaml index 0b0ecc2b..2d8c5d79 100644 --- a/recipe.yaml +++ b/recipe.yaml @@ -38,6 +38,7 @@ requirements: - discretize 0.12.* - distributed 2025.3.* - numpy 2.4.* + - openpyxl >=3.1.5, 3.1.* - pydantic >=2.12.0, 2.* - pydiso 0.2.* - python-mumps >=0.0.6, 0.0.6.* From 68b45f35328389d7e5654c597cc4a8f9c6431f29 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 20 Feb 2026 11:56:34 -0800 Subject: [PATCH 06/28] Re-lock with pandas and openpyxl --- .../py-3.12-linux-64-dev.conda.lock.yml | 12 +- environments/py-3.12-linux-64.conda.lock.yml | 10 +- .../py-3.12-win-64-dev.conda.lock.yml | 12 +- environments/py-3.12-win-64.conda.lock.yml | 10 +- .../py-3.13-linux-64-dev.conda.lock.yml | 12 +- environments/py-3.13-linux-64.conda.lock.yml | 10 +- .../py-3.13-win-64-dev.conda.lock.yml | 12 +- environments/py-3.13-win-64.conda.lock.yml | 10 +- .../py-3.14-linux-64-dev.conda.lock.yml | 12 +- environments/py-3.14-linux-64.conda.lock.yml | 10 +- .../py-3.14-win-64-dev.conda.lock.yml | 12 +- environments/py-3.14-win-64.conda.lock.yml | 10 +- py-3.12.conda-lock.yml | 128 +++++++++++++----- py-3.13.conda-lock.yml | 128 +++++++++++++----- py-3.14.conda-lock.yml | 128 +++++++++++++----- pyproject.toml | 2 + 16 files changed, 356 insertions(+), 162 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index 444a2606..1868569d 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: b650972838f330e6f6ff8085b1b9f2d62dc60aa14a8c4e08de2c9a72ca866d3c +# input_hash: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py312h2a48985_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h7900ff3_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -182,6 +183,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -222,7 +224,7 @@ dependencies: - python_abi=3.12=8_cp312 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py312h8a5da7c_1 - - pyzmq=27.1.0=py312hfb55c3c_0 + - pyzmq=27.1.0=py312hda471dd_1 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 @@ -290,10 +292,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index a8c3bb4a..e778dc9a 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: b650972838f330e6f6ff8085b1b9f2d62dc60aa14a8c4e08de2c9a72ca866d3c +# input_hash: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed channels: - conda-forge @@ -29,6 +29,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h2a48985_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h8a5da7c_0 - freetype=2.14.1=ha770c72_0 @@ -104,6 +105,7 @@ dependencies: - numcodecs=0.15.1=py312hf79963d_1 - numpy=2.4.2=py312h33ff503_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py312h7f6eeab_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py312h8ecdadd_0 @@ -158,10 +160,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 031acaaf..9c68fc73 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 5f0f60749c127e0916070a45b3988ee6501ef40eee92cff0dec0018df64097ea +# input_hash: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py312h7c90ba1_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py312h2e8e312_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -165,6 +166,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -205,7 +207,7 @@ dependencies: - pywin32=311=py312h829343e_1 - pywinpty=2.0.15=py312h275cf98_1 - pyyaml=6.0.3=py312h05f76fc_1 - - pyzmq=27.1.0=py312hbb5da91_0 + - pyzmq=27.1.0=py312h343a6d4_1 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 @@ -277,10 +279,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index f433f2ab..958707c7 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 5f0f60749c127e0916070a45b3988ee6501ef40eee92cff0dec0018df64097ea +# input_hash: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h7c90ba1_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py312h05f76fc_0 - freetype=2.14.1=h57928b3_0 @@ -88,6 +89,7 @@ dependencies: - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py312h83acffa_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py312h95189c4_0 @@ -146,10 +148,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index b6df47a3..d9b2e1dd 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 767f0c2ff0207f15d12137bcb23a172e29fab1376ec6bf52c019c5732dad756c +# input_hash: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py313h0f78c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313h78bf25f_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -221,7 +223,7 @@ dependencies: - python_abi=3.13=8_cp313 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py313h3dea7bd_1 - - pyzmq=27.1.0=py312hfb55c3c_0 + - pyzmq=27.1.0=py312hda471dd_1 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 @@ -287,10 +289,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index 6dc52946..fb16d6e3 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 767f0c2ff0207f15d12137bcb23a172e29fab1376ec6bf52c019c5732dad756c +# input_hash: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 channels: - conda-forge @@ -29,6 +29,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313h0f78c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313h3dea7bd_0 - freetype=2.14.1=ha770c72_0 @@ -103,6 +104,7 @@ dependencies: - numcodecs=0.15.1=py313h08cd8bf_1 - numpy=2.4.2=py313hf6604e3_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py313ha4be090_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py313hbfd7664_0 @@ -155,10 +157,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index db84b6a9..88bc0594 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 73bc8573f1d855df3d9d5c8219cbd5642f2bbad32708c54003cb0701e05ab28f +# input_hash: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py313hedd11bf_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py313hfa70ccb_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -206,7 +208,7 @@ dependencies: - pywin32=311=py313h40c08fc_1 - pywinpty=2.0.15=py313h5813708_1 - pyyaml=6.0.3=py313hd650c13_1 - - pyzmq=27.1.0=py312hbb5da91_0 + - pyzmq=27.1.0=py312h343a6d4_1 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 @@ -276,10 +278,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index a1e93505..55d34d0d 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 73bc8573f1d855df3d9d5c8219cbd5642f2bbad32708c54003cb0701e05ab28f +# input_hash: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313hedd11bf_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=py313hd650c13_0 - freetype=2.14.1=h57928b3_0 @@ -89,6 +90,7 @@ dependencies: - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py313hc624790_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py313h26f5e95_0 @@ -145,10 +147,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index 189191ca..aba61632 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 85bbcb2ba2d9c14aa597df8e5af50cdf564565403e7fd1d5660ec1e7406fd4c1 +# input_hash: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd channels: - conda-forge @@ -54,6 +54,7 @@ dependencies: - discretize=0.12.0=np2py314hb287c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314hdafbbf9_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -181,6 +182,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -221,7 +223,7 @@ dependencies: - python_abi=3.14=8_cp314 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py314h67df5f8_1 - - pyzmq=27.1.0=py312hfb55c3c_0 + - pyzmq=27.1.0=py312hda471dd_1 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 @@ -288,10 +290,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index df5ae351..382b8c45 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 85bbcb2ba2d9c14aa597df8e5af50cdf564565403e7fd1d5660ec1e7406fd4c1 +# input_hash: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd channels: - conda-forge @@ -29,6 +29,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314hb287c12_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=ha770c72_0 @@ -103,6 +104,7 @@ dependencies: - numcodecs=0.15.1=py314ha0b5721_1 - numpy=2.4.2=py314h2b28147_1 - openjpeg=2.5.4=h55fea9a_0 + - openpyxl=3.1.5=py314hf3b76af_3 - openssl=3.6.1=h35e630c_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py314hb4ffadd_0 @@ -156,10 +158,10 @@ dependencies: - zlib-ng=2.3.3=hceb46e0_1 - zstd=1.5.7=hb78ec9c_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index ca7b96df..e932c27f 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 17aeca2c68019766a93e226a6f5c9b6ea02007d78e4e2c692c4083f592ae7eac +# input_hash: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab channels: - conda-forge @@ -53,6 +53,7 @@ dependencies: - discretize=0.12.0=np2py314h1495373_1 - distributed=2025.3.1=pyhd8ed1ab_0 - docutils=0.18.1=py314h86ab7b2_1 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - exceptiongroup=1.3.1=pyhd8ed1ab_0 - executing=2.2.1=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 @@ -166,6 +167,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=26.0=pyhcf101f3_0 @@ -206,7 +208,7 @@ dependencies: - pywin32=311=py314h8f8f202_1 - pywinpty=2.0.15=py314h51f0985_1 - pyyaml=6.0.3=py314h2359020_1 - - pyzmq=27.1.0=py312hbb5da91_0 + - pyzmq=27.1.0=py312h343a6d4_1 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 @@ -277,10 +279,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 1983ac92..693b6518 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 17aeca2c68019766a93e226a6f5c9b6ea02007d78e4e2c692c4083f592ae7eac +# input_hash: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab channels: - conda-forge @@ -28,6 +28,7 @@ dependencies: - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314h1495373_1 - distributed=2025.3.1=pyhd8ed1ab_0 + - et_xmlfile=2.0.0=pyhd8ed1ab_1 - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.61.1=pyh7db6752_0 - freetype=2.14.1=h57928b3_0 @@ -89,6 +90,7 @@ dependencies: - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 - openjpeg=2.5.4=h24db6dd_0 + - openpyxl=3.1.5=py314hccc76fc_3 - openssl=3.6.1=hf411b9b_1 - packaging=26.0=pyhcf101f3_0 - pandas=3.0.1=py314hf700ef7_0 @@ -146,10 +148,10 @@ dependencies: - zlib-ng=2.3.3=h0261ad2_1 - zstd=1.5.7=h534d264_6 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@9e0a86e5afadfe9c55e9811317827a4f6c2c70c4 - - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff variables: KMP_WARNINGS: 0 diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index c399dfc2..39f8d52d 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 5f0f60749c127e0916070a45b3988ee6501ef40eee92cff0dec0018df64097ea - linux-64: b650972838f330e6f6ff8085b1b9f2d62dc60aa14a8c4e08de2c9a72ca866d3c + win-64: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 + linux-64: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: 517fe814fbfe570978369bc6dd9f951739293cf90905213204f30b2c29df7946 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda + hash: + md5: 04ab345ef65b88bcbb8ac3d083427bfc + sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.12,<3.13.0a0' + python_abi: 3.12.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda + hash: + md5: ff342a314798173eaaf2753a22f044fa + sha256: 824eeb546a08c990eb461706280d3064c0437f67eb320018986fa439f468e43a + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -6160,10 +6216,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda hash: - md5: 3399d43f564c905250c1aea268ebb935 - sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 + md5: ae8647787fcb4dcc6967095211dda391 + sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 category: dev optional: true - name: pyzmq @@ -6178,10 +6234,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda hash: - md5: 808d263ec97bbd93b41ca01552b5fbd4 - sha256: fd46b30e6a1e4c129045e3174446de3ca90da917a595037d28595532ab915c5d + md5: 878fd168c196cc65ab1079fb52ff25bb + sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 category: dev optional: true - name: qhull @@ -8034,7 +8090,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: linux-64 dependencies: @@ -8043,16 +8099,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: win-64 dependencies: @@ -8061,12 +8117,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoh5py @@ -8104,84 +8160,84 @@ package: category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: linux-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' typing-extensions: '*' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: win-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' typing-extensions: '*' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index fcc5df10..0402436a 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 73bc8573f1d855df3d9d5c8219cbd5642f2bbad32708c54003cb0701e05ab28f - linux-64: 767f0c2ff0207f15d12137bcb23a172e29fab1376ec6bf52c019c5732dad756c + win-64: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 + linux-64: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 channels: - url: conda-forge used_env_vars: [] @@ -1381,6 +1381,30 @@ package: sha256: d1d7886cd56fa84eeec860ca5761ba7d1167f0ce0e9f9093810c0f35bdeaf994 category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4981,6 +5005,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py313ha4be090_3.conda + hash: + md5: 993d27015ca7aa1de3f4a471a9b5309e + sha256: ee3e071cbc0be5600747631b41da17349be6fd25c982c9a9644cda3953bbf8b5 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.13,<3.14.0a0' + python_abi: 3.13.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py313hc624790_3.conda + hash: + md5: 57d8fccec9481a008b363bfbbef86d1f + sha256: e5e86bc7ac493fcee526434a79f51c6a24e7c71cf4e50044d0c410079bf44af8 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -6158,10 +6214,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda hash: - md5: 3399d43f564c905250c1aea268ebb935 - sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 + md5: ae8647787fcb4dcc6967095211dda391 + sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 category: dev optional: true - name: pyzmq @@ -6176,10 +6232,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda hash: - md5: 808d263ec97bbd93b41ca01552b5fbd4 - sha256: fd46b30e6a1e4c129045e3174446de3ca90da917a595037d28595532ab915c5d + md5: 878fd168c196cc65ab1079fb52ff25bb + sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 category: dev optional: true - name: qhull @@ -7975,7 +8031,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: linux-64 dependencies: @@ -7984,16 +8040,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: win-64 dependencies: @@ -8002,12 +8058,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoh5py @@ -8045,82 +8101,82 @@ package: category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: linux-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: win-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index a19149b9..ce922bc9 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 17aeca2c68019766a93e226a6f5c9b6ea02007d78e4e2c692c4083f592ae7eac - linux-64: 85bbcb2ba2d9c14aa597df8e5af50cdf564565403e7fd1d5660ec1e7406fd4c1 + win-64: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab + linux-64: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd channels: - url: conda-forge used_env_vars: [] @@ -1372,6 +1372,30 @@ package: sha256: ca1d41146115afd54590dad17af0a8c41359c454797d44e290fb3e5bff51034e category: dev optional: true +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false +- name: et_xmlfile + version: 2.0.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + url: https://repo.prefix.dev/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 71bf9646cbfabf3022c8da4b6b4da737 + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + category: main + optional: false - name: exceptiongroup version: 1.3.1 manager: conda @@ -4960,6 +4984,38 @@ package: sha256: 226c270a7e3644448954c47959c00a9bf7845f6d600c2a643db187118d028eee category: main optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: linux-64 + dependencies: + et_xmlfile: '' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://repo.prefix.dev/conda-forge/linux-64/openpyxl-3.1.5-py314hf3b76af_3.conda + hash: + md5: bc90b1901f01e0772c74e24b6f931137 + sha256: 7a6c2355af80e8d1e9a851347dc4f5e737a21da8ebeb7f6e4b9889eb8a0186a2 + category: main + optional: false +- name: openpyxl + version: 3.1.5 + manager: conda + platform: win-64 + dependencies: + et_xmlfile: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + ucrt: '>=10.0.20348.0' + vc: '>=14.3,<15' + vc14_runtime: '>=14.44.35208' + url: https://repo.prefix.dev/conda-forge/win-64/openpyxl-3.1.5-py314hccc76fc_3.conda + hash: + md5: 864cdb786a1bb977ed1f96eab705a6d1 + sha256: 82ad3a066acc770f0945c1ffa9b1ad1878ad9b6c3625bab940804909ce94d484 + category: main + optional: false - name: openssl version: 3.6.1 manager: conda @@ -6139,10 +6195,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda hash: - md5: 3399d43f564c905250c1aea268ebb935 - sha256: a00a41b66c12d9c60e66b391e9a4832b7e28743348cf4b48b410b91927cd7819 + md5: ae8647787fcb4dcc6967095211dda391 + sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 category: dev optional: true - name: pyzmq @@ -6157,10 +6213,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda hash: - md5: 808d263ec97bbd93b41ca01552b5fbd4 - sha256: fd46b30e6a1e4c129045e3174446de3ca90da917a595037d28595532ab915c5d + md5: 878fd168c196cc65ab1079fb52ff25bb + sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 category: dev optional: true - name: qhull @@ -7987,7 +8043,7 @@ package: category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: linux-64 dependencies: @@ -7996,16 +8052,16 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoapps-utils - version: 0.7.0a2.dev37+668a9e0 + version: 0.7.0a2 manager: pip platform: win-64 dependencies: @@ -8014,12 +8070,12 @@ package: numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 hash: - sha256: 668a9e0da5214e4a3bce466321cd910f1bb00b02 + sha256: fb86adf72fb82ea23c8904a39585982ca8793c52 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@668a9e0da5214e4a3bce466321cd910f1bb00b02 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@fb86adf72fb82ea23c8904a39585982ca8793c52 category: main optional: false - name: geoh5py @@ -8057,82 +8113,82 @@ package: category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: linux-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: grid-apps - version: 0.2.0a2.dev18+5a6de92 + version: 0.2.0a2 manager: pip platform: win-64 dependencies: discretize: '>=0.12.0,<0.13.0' - geoapps-utils: 0.7.0a2.dev37+668a9e0 + geoapps-utils: 0.7.0a2 geoh5py: 0.13.0a3.dev5+9e0a86e5 numpy: '>=2.4.2,<2.5.0' pydantic: '>=2.12.0,<2.13.0' scipy: '>=1.17.0,<1.18.0' - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 hash: - sha256: 5a6de92816acb737499a8e188eb5b97acb966f37 + sha256: cdbbb07e623a260f0834df7261e06daa254e6b79 source: type: url - url: git+https://github.com/MiraGeoscience/grid-apps.git@5a6de92816acb737499a8e188eb5b97acb966f37 + url: git+https://github.com/MiraGeoscience/grid-apps.git@cdbbb07e623a260f0834df7261e06daa254e6b79 category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: linux-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false - name: mira-simpeg - version: 0.23.0.3a1.dev114+gef94a62a2 + version: 0.25.0.1a1 manager: pip platform: win-64 dependencies: discretize: '>=0.11' geoana: '>=0.7.0' - geoh5py: '>=0.12.0rc,<0.14.dev' + geoh5py: '>=0.13.0a2,<0.14.0' libdlf: '*' matplotlib: '*' numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff hash: - sha256: ef94a62a27ecf9713377801f6632861a07e2a65c + sha256: 5944609b7decc673b510b7052eff0e6ecc46d1ff source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@ef94a62a27ecf9713377801f6632861a07e2a65c + url: git+https://github.com/MiraGeoscience/simpeg.git@5944609b7decc673b510b7052eff0e6ecc46d1ff category: main optional: false diff --git a/pyproject.toml b/pyproject.toml index 09494e4f..a7bd2824 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,8 @@ discretize = "~0.12.0" # also in simpeg, grid-apps distributed = "~2025.3.0" # for dask[distributed] matplotlib-base = ">=3.10.0, <3.11.dev" # from geoapps-utils numpy = "~2.4.2" +openpyxl = ">=3.1.2" +pandas = ">=3.0.*" pydantic = "~2.12.0" # also in geoh5py, curve-apps, geoapps-utils pydiso = "~0.2.0" python-mumps = "~0.0.6.0" From e154d7695fb1ee2ee66863f99bee9ebdd18276de Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 20 Feb 2026 11:59:24 -0800 Subject: [PATCH 07/28] Add unitest --- tests/plate_simulation/runtest/sweep_test.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/plate_simulation/runtest/sweep_test.py b/tests/plate_simulation/runtest/sweep_test.py index 08d44003..2a765c78 100644 --- a/tests/plate_simulation/runtest/sweep_test.py +++ b/tests/plate_simulation/runtest/sweep_test.py @@ -7,11 +7,12 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - +from io import BytesIO from geoh5py import Workspace from geoh5py.groups import SimPEGGroup from geoh5py.ui_json import InputFile +from pandas import read_excel from simpeg_drivers import assets_path from simpeg_drivers.plate_simulation.options import PlateSimulationOptions @@ -103,3 +104,11 @@ def test_sweep(tmp_path): n = len(list(workdir.glob("*.geoh5"))) assert n == 6 + + # Check that the summary file was created and has the expected number of rows + with Workspace(tmp_path / "test.geoh5") as ws: + file_data = ws.get_entity("summary.xlsx")[0] + blob = BytesIO(file_data.file_bytes) + xls = read_excel(blob) + + assert len(xls) == 6 From 725fc6f100b1e3713e4fbc61f66626c46b8c47c0 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Mon, 23 Feb 2026 14:27:05 -0800 Subject: [PATCH 08/28] Re-lock --- .../py-3.12-linux-64-dev.conda.lock.yml | 18 +-- environments/py-3.12-linux-64.conda.lock.yml | 10 +- .../py-3.12-win-64-dev.conda.lock.yml | 14 +-- environments/py-3.12-win-64.conda.lock.yml | 6 +- .../py-3.13-linux-64-dev.conda.lock.yml | 18 +-- environments/py-3.13-linux-64.conda.lock.yml | 10 +- .../py-3.13-win-64-dev.conda.lock.yml | 14 +-- environments/py-3.13-win-64.conda.lock.yml | 6 +- .../py-3.14-linux-64-dev.conda.lock.yml | 18 +-- environments/py-3.14-linux-64.conda.lock.yml | 10 +- .../py-3.14-win-64-dev.conda.lock.yml | 14 +-- environments/py-3.14-win-64.conda.lock.yml | 6 +- py-3.12.conda-lock.yml | 112 +++++++++--------- py-3.13.conda-lock.yml | 112 +++++++++--------- py-3.14.conda-lock.yml | 112 +++++++++--------- 15 files changed, 240 insertions(+), 240 deletions(-) diff --git a/environments/py-3.12-linux-64-dev.conda.lock.yml b/environments/py-3.12-linux-64-dev.conda.lock.yml index 1868569d..a11a2c98 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed +# input_hash: 0c97238376147d9045f365096c2d35ce3991ba29283647b95acd5f5fb3b03408 channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py312h7900ff3_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py312h90b7ffd_0 @@ -44,7 +44,7 @@ dependencies: - coverage=7.13.4=py312h8a5da7c_0 - cpython=3.12.12=py312hd8ed1ab_2 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py312h4c3975b_1 + - cytoolz=1.1.0=py312h4c3975b_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py312h8285ef7_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -83,7 +83,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -138,7 +138,7 @@ dependencies: - libnghttp2=1.67.0=had1ee68_0 - libnsl=2.0.1=hb9d3cd8_1 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -167,8 +167,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py312hd9148b4_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -208,7 +208,7 @@ dependencies: - pydantic-core=2.41.5=py312h868fb18_1 - pydiso=0.2.0=np2py312h1cfd70e_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -224,7 +224,7 @@ dependencies: - python_abi=3.12=8_cp312 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py312h8a5da7c_1 - - pyzmq=27.1.0=py312hda471dd_1 + - pyzmq=27.1.0=py312hda471dd_2 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index e778dc9a..7a39eddd 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed +# input_hash: 0c97238376147d9045f365096c2d35ce3991ba29283647b95acd5f5fb3b03408 channels: - conda-forge @@ -24,7 +24,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py312h0a2e395_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py312h4c3975b_1 + - cytoolz=1.1.0=py312h4c3975b_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h2a48985_1 @@ -77,7 +77,7 @@ dependencies: - libnghttp2=1.67.0=had1ee68_0 - libnsl=2.0.1=hb9d3cd8_1 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -98,8 +98,8 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py312hd9148b4_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py312hf79963d_1 diff --git a/environments/py-3.12-win-64-dev.conda.lock.yml b/environments/py-3.12-win-64-dev.conda.lock.yml index 9c68fc73..0a72e1ed 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 +# input_hash: 1c261ceeec9d275bf2d03d0a37fb53b8980eee2cee09dd4953e319fac0680a00 channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py312h2e8e312_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py312h06d0912_0 @@ -43,7 +43,7 @@ dependencies: - coverage=7.13.4=py312h05f76fc_0 - cpython=3.12.12=py312hd8ed1ab_2 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py312he06e257_1 + - cytoolz=1.1.0=py312he06e257_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py312ha1a9051_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -82,7 +82,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -152,7 +152,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py312hf90b1b7_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -189,7 +189,7 @@ dependencies: - pydantic-core=2.41.5=py312hdabe01f_1 - pydiso=0.2.0=np2py312hd8dafd6_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -207,7 +207,7 @@ dependencies: - pywin32=311=py312h829343e_1 - pywinpty=2.0.15=py312h275cf98_1 - pyyaml=6.0.3=py312h05f76fc_1 - - pyzmq=27.1.0=py312h343a6d4_1 + - pyzmq=27.1.0=py312h343a6d4_2 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index 958707c7..6d2c3b46 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 +# input_hash: 1c261ceeec9d275bf2d03d0a37fb53b8980eee2cee09dd4953e319fac0680a00 channels: - conda-forge @@ -23,7 +23,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py312h78d62e6_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py312he06e257_1 + - cytoolz=1.1.0=py312he06e257_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py312h7c90ba1_1 @@ -84,7 +84,7 @@ dependencies: - matplotlib-base=3.10.8=py312h0ebf65c_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py312hf90b1b7_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py312hc128f0a_1 - numpy=2.4.2=py312ha72d056_1 diff --git a/environments/py-3.13-linux-64-dev.conda.lock.yml b/environments/py-3.13-linux-64-dev.conda.lock.yml index d9b2e1dd..d5cfe800 100644 --- a/environments/py-3.13-linux-64-dev.conda.lock.yml +++ b/environments/py-3.13-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 +# input_hash: b60b5bd9d24ca0cd27e642708e860753b5d342a02cf76af8af6878c75842cabc channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py313h78bf25f_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py313h18e8e13_0 @@ -44,7 +44,7 @@ dependencies: - coverage=7.13.4=py313h3dea7bd_0 - cpython=3.13.12=py313hd8ed1ab_100 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py313h07c4f96_1 + - cytoolz=1.1.0=py313h07c4f96_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py313h5d5ffb9_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -83,7 +83,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -138,7 +138,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -166,8 +166,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py313h7037e92_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -207,7 +207,7 @@ dependencies: - pydantic-core=2.41.5=py313h843e2db_1 - pydiso=0.2.0=np2py313h5fc5e36_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -223,7 +223,7 @@ dependencies: - python_abi=3.13=8_cp313 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py313h3dea7bd_1 - - pyzmq=27.1.0=py312hda471dd_1 + - pyzmq=27.1.0=py312hda471dd_2 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 diff --git a/environments/py-3.13-linux-64.conda.lock.yml b/environments/py-3.13-linux-64.conda.lock.yml index fb16d6e3..a632aecf 100644 --- a/environments/py-3.13-linux-64.conda.lock.yml +++ b/environments/py-3.13-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 +# input_hash: b60b5bd9d24ca0cd27e642708e860753b5d342a02cf76af8af6878c75842cabc channels: - conda-forge @@ -24,7 +24,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py313hc8edb43_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py313h07c4f96_1 + - cytoolz=1.1.0=py313h07c4f96_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313h0f78c12_1 @@ -77,7 +77,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -97,8 +97,8 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py313h7037e92_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py313h08cd8bf_1 diff --git a/environments/py-3.13-win-64-dev.conda.lock.yml b/environments/py-3.13-win-64-dev.conda.lock.yml index 88bc0594..99e72296 100644 --- a/environments/py-3.13-win-64-dev.conda.lock.yml +++ b/environments/py-3.13-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 +# input_hash: d7f642a4ecc357b04e702c4ea1f8bea75d7159faf57696548de2147a0a55eac9 channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py313hfa70ccb_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py313h2a31948_0 @@ -43,7 +43,7 @@ dependencies: - coverage=7.13.4=py313hd650c13_0 - cpython=3.13.12=py313hd8ed1ab_100 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py313h5ea7bf4_1 + - cytoolz=1.1.0=py313h5ea7bf4_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py313h927ade5_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -82,7 +82,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -153,7 +153,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py313hf069bd2_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -190,7 +190,7 @@ dependencies: - pydantic-core=2.41.5=py313hfbe8231_1 - pydiso=0.2.0=np2py313h16cfc55_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -208,7 +208,7 @@ dependencies: - pywin32=311=py313h40c08fc_1 - pywinpty=2.0.15=py313h5813708_1 - pyyaml=6.0.3=py313hd650c13_1 - - pyzmq=27.1.0=py312h343a6d4_1 + - pyzmq=27.1.0=py312h343a6d4_2 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 diff --git a/environments/py-3.13-win-64.conda.lock.yml b/environments/py-3.13-win-64.conda.lock.yml index 55d34d0d..489fdae3 100644 --- a/environments/py-3.13-win-64.conda.lock.yml +++ b/environments/py-3.13-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 +# input_hash: d7f642a4ecc357b04e702c4ea1f8bea75d7159faf57696548de2147a0a55eac9 channels: - conda-forge @@ -23,7 +23,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py313h1a38498_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py313h5ea7bf4_1 + - cytoolz=1.1.0=py313h5ea7bf4_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py313hedd11bf_1 @@ -85,7 +85,7 @@ dependencies: - matplotlib-base=3.10.8=py313he1ded55_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py313hf069bd2_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py313hc90dcd4_1 - numpy=2.4.2=py313hce7ae62_1 diff --git a/environments/py-3.14-linux-64-dev.conda.lock.yml b/environments/py-3.14-linux-64-dev.conda.lock.yml index aba61632..e96508d4 100644 --- a/environments/py-3.14-linux-64-dev.conda.lock.yml +++ b/environments/py-3.14-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd +# input_hash: 21497fc87324bc5ac08806cd584260cdb34714418d761bf9935baf9dbd207d35 channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py314hdafbbf9_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py314h680f03e_0 @@ -44,7 +44,7 @@ dependencies: - coverage=7.13.4=py314h67df5f8_0 - cpython=3.14.3=py314hd8ed1ab_101 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py314h5bd0f2a_1 + - cytoolz=1.1.0=py314h5bd0f2a_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py314h42812f9_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -83,7 +83,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -138,7 +138,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libsodium=1.0.20=h4ab18f5_0 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 @@ -166,8 +166,8 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py314h9891dd4_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -207,7 +207,7 @@ dependencies: - pydantic-core=2.41.5=py314h2e6c369_1 - pydiso=0.2.0=np2py314h7d8def5_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -223,7 +223,7 @@ dependencies: - python_abi=3.14=8_cp314 - pytz=2025.2=pyhd8ed1ab_0 - pyyaml=6.0.3=py314h67df5f8_1 - - pyzmq=27.1.0=py312hda471dd_1 + - pyzmq=27.1.0=py312hda471dd_2 - qhull=2020.2=h434a139_5 - readline=8.3=h853b02a_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 diff --git a/environments/py-3.14-linux-64.conda.lock.yml b/environments/py-3.14-linux-64.conda.lock.yml index 382b8c45..84ea7884 100644 --- a/environments/py-3.14-linux-64.conda.lock.yml +++ b/environments/py-3.14-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd +# input_hash: 21497fc87324bc5ac08806cd584260cdb34714418d761bf9935baf9dbd207d35 channels: - conda-forge @@ -24,7 +24,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py314h97ea11e_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py314h5bd0f2a_1 + - cytoolz=1.1.0=py314h5bd0f2a_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314hb287c12_1 @@ -77,7 +77,7 @@ dependencies: - libmpdec=4.0.0=hb03c661_1 - libnghttp2=1.67.0=had1ee68_0 - libpng=1.6.55=h421ea60_0 - - libscotch=7.0.11=int32_h865694f_0 + - libscotch=7.0.11=int64_hfcc3fd4_2 - libspatialindex=2.1.0=he57a185_0 - libsqlite=3.51.2=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 @@ -97,8 +97,8 @@ dependencies: - metis=5.1.0=hd0bcaf9_1007 - mkl=2025.3.0=h0e700b2_463 - msgpack-python=1.1.2=py314h9891dd4_1 - - mumps-include=5.8.2=h1795ed4_1 - - mumps-seq=5.8.2=h31f7764_1 + - mumps-include=5.8.2=h5a610fb_2 + - mumps-seq=5.8.2=hc1b3267_2 - munkres=1.1.4=pyhd8ed1ab_1 - ncurses=6.5=h2d0b736_3 - numcodecs=0.15.1=py314ha0b5721_1 diff --git a/environments/py-3.14-win-64-dev.conda.lock.yml b/environments/py-3.14-win-64-dev.conda.lock.yml index e932c27f..eeb0a931 100644 --- a/environments/py-3.14-win-64-dev.conda.lock.yml +++ b/environments/py-3.14-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab +# input_hash: 3d9e9eb1d2dfb17d1d7970b4cbc3c1ad4d9a0f35e2679e5172c8973a9e72895d channels: - conda-forge @@ -17,7 +17,7 @@ dependencies: - asciitree=0.3.3=py_2 - astroid=4.0.4=py314h86ab7b2_0 - asttokens=3.0.1=pyhd8ed1ab_0 - - async-lru=2.1.0=pyhcf101f3_0 + - async-lru=2.2.0=pyhcf101f3_0 - attrs=25.4.0=pyhcf101f3_1 - babel=2.18.0=pyhcf101f3_0 - backports.zstd=1.3.0=py314h680f03e_0 @@ -43,7 +43,7 @@ dependencies: - coverage=7.13.4=py314h2359020_0 - cpython=3.14.3=py314hd8ed1ab_101 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py314h5a2d7ad_1 + - cytoolz=1.1.0=py314h5a2d7ad_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - debugpy=1.8.20=py314hb98de8c_0 - decorator=5.2.1=pyhd8ed1ab_0 @@ -82,7 +82,7 @@ dependencies: - ipython_pygments_lexers=1.1.1=pyhd8ed1ab_0 - ipywidgets=7.8.5=pyhd8ed1ab_0 - isoduration=20.11.0=pyhd8ed1ab_1 - - isort=7.0.0=pyhd8ed1ab_0 + - isort=8.0.0=pyhd8ed1ab_0 - jedi=0.19.2=pyhd8ed1ab_1 - jinja2=3.1.6=pyhcf101f3_1 - joblib=1.5.3=pyhd8ed1ab_0 @@ -153,7 +153,7 @@ dependencies: - mistune=3.2.0=pyhcf101f3_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py314h909e829_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - nbclient=0.10.4=pyhd8ed1ab_0 - nbconvert=7.16.6=hc388f54_1 @@ -190,7 +190,7 @@ dependencies: - pydantic-core=2.41.5=py314h9f07db2_1 - pydiso=0.2.0=np2py314h2b9c9a4_1 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=4.0.4=pyhcf101f3_0 + - pylint=4.0.5=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.3.2=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -208,7 +208,7 @@ dependencies: - pywin32=311=py314h8f8f202_1 - pywinpty=2.0.15=py314h51f0985_1 - pyyaml=6.0.3=py314h2359020_1 - - pyzmq=27.1.0=py312h343a6d4_1 + - pyzmq=27.1.0=py312h343a6d4_2 - qhull=2020.2=hc790b64_5 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.37.0=pyhcf101f3_0 diff --git a/environments/py-3.14-win-64.conda.lock.yml b/environments/py-3.14-win-64.conda.lock.yml index 693b6518..3f6bc59e 100644 --- a/environments/py-3.14-win-64.conda.lock.yml +++ b/environments/py-3.14-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab +# input_hash: 3d9e9eb1d2dfb17d1d7970b4cbc3c1ad4d9a0f35e2679e5172c8973a9e72895d channels: - conda-forge @@ -23,7 +23,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - contourpy=1.3.3=py314hf309875_4 - cycler=0.12.1=pyhcf101f3_2 - - cytoolz=1.1.0=py314h5a2d7ad_1 + - cytoolz=1.1.0=py314h5a2d7ad_2 - dask-core=2025.3.1=pyhd8ed1ab_0 - deprecated=1.3.1=pyhd8ed1ab_1 - discretize=0.12.0=np2py314h1495373_1 @@ -85,7 +85,7 @@ dependencies: - matplotlib-base=3.10.8=py314hfa45d96_0 - mkl=2025.3.0=hac47afa_455 - msgpack-python=1.1.2=py314h909e829_1 - - mumps-seq=5.8.2=h607cc0b_1 + - mumps-seq=5.8.2=h607cc0b_2 - munkres=1.1.4=pyhd8ed1ab_1 - numcodecs=0.15.1=py314hd8fd7ce_1 - numpy=2.4.2=py314h06c3c77_1 diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 39f8d52d..9ee897cb 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: f711e35e1952fc73c939482c0e33ede87c9a6552057a3ec7003a4fab66572160 - linux-64: 4df81a7646d4b5095b92e7a69e723572bcfcb4427068d9947f1dd70ba5c5b7ed + win-64: 1c261ceeec9d275bf2d03d0a37fb53b8980eee2cee09dd4953e319fac0680a00 + linux-64: 0c97238376147d9045f365096c2d35ce3991ba29283647b95acd5f5fb3b03408 channels: - url: conda-forge used_env_vars: [] @@ -324,29 +324,29 @@ package: category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: linux-64 dependencies: python: '' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: win-64 dependencies: python: '>=3.10' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: attrs @@ -1070,10 +1070,10 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* toolz: '>=0.10.0' - url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py312h4c3975b_2.conda hash: - md5: 693cda60b9223f55d0836c885621611b - sha256: 299e5ed0d2dfb5b33006505da09e80e753ba514434332fb6fa0b8b6b91a1079a + md5: 29fd0bdf551881ab3d2801f7deaba528 + sha256: 75b3d3c9497cded41e029b7a0ce4cc157334bbc864d6701221b59bb76af4396d category: main optional: false - name: cytoolz @@ -1087,10 +1087,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py312he06e257_2.conda hash: - md5: cd9ca1f73cd732a47b6166f6e57b0025 - sha256: 6cb9fe37c851eff1c06f5ce27655e44f554a75266d71d2b4e7a6904debc0fde7 + md5: 978c009bc3f0add939e44aff97bfaee1 + sha256: e817c9154c917f562e378cf2898a1ff82f20c87ef465b75b2bcba94235604814 category: main optional: false - name: dask-core @@ -2234,29 +2234,29 @@ package: category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: jedi @@ -3756,10 +3756,10 @@ package: libgfortran5: '>=14.3.0' liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int64_hfcc3fd4_2.conda hash: - md5: 1dcc0addf04df4ab0227624e3c503737 - sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 + md5: 263641cd867b74db096f6f30752bd502 + sha256: 2c2030d8dc2a4af1bbeac2c25de74fd3269afaf72d3ba666b6bd5af6f4b534ba category: main optional: false - name: libsodium @@ -4526,10 +4526,10 @@ package: manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h5a610fb_2.conda hash: - md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d - sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa + md5: 8ae8d5b0f9d76a386d74adce53e6a81d + sha256: 0e7bde047934c87b8f7e663ee0c06d679d0347d84228ca83cb9fd09abc722156 category: main optional: false - name: mumps-seq @@ -4547,10 +4547,10 @@ package: libscotch: '*' metis: '>=5.1.0,<5.1.1.0a0' mumps-include: ==5.8.2 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-hc1b3267_2.conda hash: - md5: 2d0153a02087c7e9b4fbfbacd312f1e3 - sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 + md5: d4f0602b1cd00d94e1467cdb60ba7750 + sha256: ce6c9495defd9a45ead27701e76fc8405571c9cfa305cbfa1f407b773d8e5e41 category: main optional: false - name: mumps-seq @@ -4564,10 +4564,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_2.conda hash: - md5: 6bdd3a1f02ad45955526b4a22cfcfc4a - sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 + md5: 4f9dd2756fd47f390197cdc0a984e08e + sha256: cbb4eb8fdd61ce372f036ea2b45608929bcbdc38ec9abc8102d64ba297bfc862 category: main optional: false - name: munkres @@ -5688,43 +5688,43 @@ package: category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: linux-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: win-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '>=3.10' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pymatsolver @@ -6216,10 +6216,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda hash: - md5: ae8647787fcb4dcc6967095211dda391 - sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 + md5: 082985717303dab433c976986c674b35 + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 category: dev optional: true - name: pyzmq @@ -6234,10 +6234,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda hash: - md5: 878fd168c196cc65ab1079fb52ff25bb - sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 + md5: eb1ec67a70b4d479f7dd76e6c8fe7575 + sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df category: dev optional: true - name: qhull diff --git a/py-3.13.conda-lock.yml b/py-3.13.conda-lock.yml index 0402436a..9d1a8ca2 100644 --- a/py-3.13.conda-lock.yml +++ b/py-3.13.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 2e01a55d4b0f8b1d443622f89277d25fb0f1085c530cd3f9dc62c75f698cb009 - linux-64: 711ca0485eede02cbc938b1fff6088745a6c6accd98cb3060ceb4afa64b90c77 + win-64: d7f642a4ecc357b04e702c4ea1f8bea75d7159faf57696548de2147a0a55eac9 + linux-64: b60b5bd9d24ca0cd27e642708e860753b5d342a02cf76af8af6878c75842cabc channels: - url: conda-forge used_env_vars: [] @@ -324,29 +324,29 @@ package: category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: linux-64 dependencies: python: '>=3.10' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: win-64 dependencies: python: '>=3.10' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: attrs @@ -1070,10 +1070,10 @@ package: python: '>=3.13,<3.14.0a0' python_abi: 3.13.* toolz: '>=0.10.0' - url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py313h07c4f96_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py313h07c4f96_2.conda hash: - md5: bcca9afd203fe05d9582249ac12762da - sha256: a8ffc7cf31a698a57a46bf7977185ed1e644c5e35d4e166d8f260dca93af6ffb + md5: 7e7e3c5a8a28c6b8eb430183e0554adf + sha256: fd33f531288fb08afef72a65414d29caefbba31cb398533534794475af35b1b3 category: main optional: false - name: cytoolz @@ -1087,10 +1087,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py313h5ea7bf4_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py313h5ea7bf4_2.conda hash: - md5: ef2e9ff6d43a07587e3483c34adf6cff - sha256: 3c1e0e7a7d648532e8df97b7fe7b821460eab4011c163e4db686ee8d37db1126 + md5: 40263096906457fbffe51f7dc2265728 + sha256: 4c12f431ef979072781bc4d6363f36ab6d4bcd0797c93a62a4b5a16c9e6c45e0 category: main optional: false - name: dask-core @@ -2232,29 +2232,29 @@ package: category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: jedi @@ -3768,10 +3768,10 @@ package: libgfortran5: '>=14.3.0' liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int64_hfcc3fd4_2.conda hash: - md5: 1dcc0addf04df4ab0227624e3c503737 - sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 + md5: 263641cd867b74db096f6f30752bd502 + sha256: 2c2030d8dc2a4af1bbeac2c25de74fd3269afaf72d3ba666b6bd5af6f4b534ba category: main optional: false - name: libsodium @@ -4526,10 +4526,10 @@ package: manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h5a610fb_2.conda hash: - md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d - sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa + md5: 8ae8d5b0f9d76a386d74adce53e6a81d + sha256: 0e7bde047934c87b8f7e663ee0c06d679d0347d84228ca83cb9fd09abc722156 category: main optional: false - name: mumps-seq @@ -4547,10 +4547,10 @@ package: libscotch: '>=7.0.11,<7.0.12.0a0' metis: '>=5.1.0,<5.1.1.0a0' mumps-include: ==5.8.2 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-hc1b3267_2.conda hash: - md5: 2d0153a02087c7e9b4fbfbacd312f1e3 - sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 + md5: d4f0602b1cd00d94e1467cdb60ba7750 + sha256: ce6c9495defd9a45ead27701e76fc8405571c9cfa305cbfa1f407b773d8e5e41 category: main optional: false - name: mumps-seq @@ -4564,10 +4564,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_2.conda hash: - md5: 6bdd3a1f02ad45955526b4a22cfcfc4a - sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 + md5: 4f9dd2756fd47f390197cdc0a984e08e + sha256: cbb4eb8fdd61ce372f036ea2b45608929bcbdc38ec9abc8102d64ba297bfc862 category: main optional: false - name: munkres @@ -5684,43 +5684,43 @@ package: category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: linux-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '>=3.10' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: win-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '>=3.10' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pymatsolver @@ -6214,10 +6214,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda hash: - md5: ae8647787fcb4dcc6967095211dda391 - sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 + md5: 082985717303dab433c976986c674b35 + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 category: dev optional: true - name: pyzmq @@ -6232,10 +6232,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda hash: - md5: 878fd168c196cc65ab1079fb52ff25bb - sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 + md5: eb1ec67a70b4d479f7dd76e6c8fe7575 + sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df category: dev optional: true - name: qhull diff --git a/py-3.14.conda-lock.yml b/py-3.14.conda-lock.yml index ce922bc9..1170254f 100644 --- a/py-3.14.conda-lock.yml +++ b/py-3.14.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 7b397d2ffdfe2698af20639005deea857051f2511332c80c45824e83c3d5adab - linux-64: aa0fa6b0912cd42b059de70cb127bb081b67eb8c2cf9e6e68a081cc94397e9fd + win-64: 3d9e9eb1d2dfb17d1d7970b4cbc3c1ad4d9a0f35e2679e5172c8973a9e72895d + linux-64: 21497fc87324bc5ac08806cd584260cdb34714418d761bf9935baf9dbd207d35 channels: - url: conda-forge used_env_vars: [] @@ -324,29 +324,29 @@ package: category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: linux-64 dependencies: python: '>=3.10' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: async-lru - version: 2.1.0 + version: 2.2.0 manager: conda platform: win-64 dependencies: python: '>=3.10' typing_extensions: '>=4.0.0' - url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.1.0-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/async-lru-2.2.0-pyhcf101f3_0.conda hash: - md5: 04d2e5fba67e5a1ecec8e25d6c769004 - sha256: fb09cb9bfe4da1586d0ad3bf80bb65e70acfd5fe0f76df384250a1c0587d6acc + md5: 2cdaf7f8bda7eb9ce49c3e08f2f65803 + sha256: d078b0d3fdc13b0ff08485af20928a095c80dff03f7021ee18e8426a773ae948 category: dev optional: true - name: attrs @@ -1061,10 +1061,10 @@ package: python: '>=3.14,<3.15.0a0' python_abi: 3.14.* toolz: '>=0.10.0' - url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_2.conda hash: - md5: 51b0391b0ce96be49b1174e9a3e4a279 - sha256: 7d0c7ac736f944ae1e97a2f066d5529d280d7d014bbf181c1d6d48d5efb1488d + md5: a6a32cab83d59c7812ddbb03220057e3 + sha256: 5edb3c0fbf5c39b66f71fef0264d4fbab561f6adbdd7ef88188b725a82fcd6da category: main optional: false - name: cytoolz @@ -1078,10 +1078,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py314h5a2d7ad_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/cytoolz-1.1.0-py314h5a2d7ad_2.conda hash: - md5: 0453c0a90d9e3ff1c1812103aff3c974 - sha256: 6a87eb2343b80fe22043e77a67076cfb213e2ae89763201c1c2da2f1ef71219b + md5: 8309b55a55dac8050260de935d31724a + sha256: 04dca71339134390f2d76467070f02356efb7bf21408cdd45a868a94009e93b9 category: main optional: false - name: dask-core @@ -2218,29 +2218,29 @@ package: category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: isort - version: 7.0.0 + version: 8.0.0 manager: conda platform: win-64 dependencies: importlib-metadata: '>=4.6.0' python: '>=3.10,<4.0' - url: https://repo.prefix.dev/conda-forge/noarch/isort-7.0.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/isort-8.0.0-pyhd8ed1ab_0.conda hash: - md5: 55a61979242077b2cc377c74326ea9f0 - sha256: 13b0005877f553eb2e5c50447c9d0047e7257124ec2d1569d7dad35697790237 + md5: 83297265e95a934c256d04177ad09293 + sha256: 7b2620c8aee9cf8c11dd70f2729cd29078a4f0e9f04acb3e24ce8ab41ecd3c27 category: dev optional: true - name: jedi @@ -3754,10 +3754,10 @@ package: libgfortran5: '>=14.3.0' liblzma: '>=5.8.2,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int32_h865694f_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libscotch-7.0.11-int64_hfcc3fd4_2.conda hash: - md5: 1dcc0addf04df4ab0227624e3c503737 - sha256: 58a3815f1f9cad31906192c0d6e302c559b94ef57c5a73372efe9a112823e249 + md5: 263641cd867b74db096f6f30752bd502 + sha256: 2c2030d8dc2a4af1bbeac2c25de74fd3269afaf72d3ba666b6bd5af6f4b534ba category: main optional: false - name: libsodium @@ -4505,10 +4505,10 @@ package: manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h1795ed4_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-include-5.8.2-h5a610fb_2.conda hash: - md5: cf2f0cdff9fc6a37fa2cd0ef27644c0d - sha256: c4ec91ffa5b07e3f25cc3067613b26111906c9493b93111b731196f380f6f2fa + md5: 8ae8d5b0f9d76a386d74adce53e6a81d + sha256: 0e7bde047934c87b8f7e663ee0c06d679d0347d84228ca83cb9fd09abc722156 category: main optional: false - name: mumps-seq @@ -4526,10 +4526,10 @@ package: libscotch: '>=7.0.11,<7.0.12.0a0' metis: '>=5.1.0,<5.1.1.0a0' mumps-include: ==5.8.2 - url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-h31f7764_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/mumps-seq-5.8.2-hc1b3267_2.conda hash: - md5: 2d0153a02087c7e9b4fbfbacd312f1e3 - sha256: 96cea3ad2ea45c3ca65e48cc728c2b5e4369c70865fb57a19c51631e356b9191 + md5: d4f0602b1cd00d94e1467cdb60ba7750 + sha256: ce6c9495defd9a45ead27701e76fc8405571c9cfa305cbfa1f407b773d8e5e41 category: main optional: false - name: mumps-seq @@ -4543,10 +4543,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/mumps-seq-5.8.2-h607cc0b_2.conda hash: - md5: 6bdd3a1f02ad45955526b4a22cfcfc4a - sha256: cdfae8fd2e3d6a6cfb878162f6d67fedad1ff55291b271c5ed13a651b060e0f9 + md5: 4f9dd2756fd47f390197cdc0a984e08e + sha256: cbb4eb8fdd61ce372f036ea2b45608929bcbdc38ec9abc8102d64ba297bfc862 category: main optional: false - name: munkres @@ -5663,43 +5663,43 @@ package: category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: linux-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '>=3.10' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pylint - version: 4.0.4 + version: 4.0.5 manager: conda platform: win-64 dependencies: - astroid: '>=4.0.2,<=4.1.0.dev0' + astroid: '>=4.0.2,<=4.1.dev0' colorama: '>=0.4.5' dill: '>=0.3.7' - isort: '>=5,<8,!=5.13' + isort: '>=5,!=5.13,<9' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2' python: '>=3.10' - tomli: '>=1.1.0' + tomli: '>=1.1' tomlkit: '>=0.10.1' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.4-pyhcf101f3_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-4.0.5-pyhcf101f3_0.conda hash: - md5: 3a830511a81b99b67a1206a9d29b44b3 - sha256: ad0bb78785ab385d0afcca4a55e0226d8e6710ebad6450caa552f5fe61c2f6a0 + md5: 7d9916ed19ecda71f0b00963365252a7 + sha256: a8e7736982409a56d2aa329d3052259fd45910f98fb7d3f2816f1a6d59624d60 category: dev optional: true - name: pymatsolver @@ -6195,10 +6195,10 @@ package: libstdcxx: '>=14' python: '' zeromq: '>=4.3.5,<4.4.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_2.conda hash: - md5: ae8647787fcb4dcc6967095211dda391 - sha256: 3ffc42be62a67def6a8521c7ef2ae4547ace3d3c253b470107b274b94ac849f2 + md5: 082985717303dab433c976986c674b35 + sha256: be66c1f85c3b48137200d62c12d918f4f8ad329423daef04fed292818efd3c28 category: dev optional: true - name: pyzmq @@ -6213,10 +6213,10 @@ package: vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' zeromq: '>=4.3.5,<4.3.6.0a0' - url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_2.conda hash: - md5: 878fd168c196cc65ab1079fb52ff25bb - sha256: 008b540f47e874a1df70720a7e504401b1c1c3a590dcff284727d1ec4906bf25 + md5: eb1ec67a70b4d479f7dd76e6c8fe7575 + sha256: d84bcc19a945ca03d1fd794be3e9896ab6afc9f691d58d9c2da514abe584d4df category: dev optional: true - name: qhull From 0460c10bd67b08d97b2cee22a4a8585d788c854b Mon Sep 17 00:00:00 2001 From: dominiquef Date: Mon, 23 Feb 2026 15:33:35 -0800 Subject: [PATCH 09/28] Move images, combine basic usage and methodology sections. Begin adding Sweep docs --- .../images}/index.png | Bin .../methodology}/analyst_geophysics_menu.png | Bin .../images}/methodology/copy_options.png | Bin .../data/simpeg_group_creation.png | Bin .../data/simpeg_group_edit_options.png | Bin .../methodology/data/simpeg_group_options.png | Bin .../methodology/data/simulation_options.png | Bin .../images}/methodology/make_plate_images.pub | Bin .../images}/methodology/mesh/mesh_options.png | Bin .../images}/methodology/mesh/refinement.png | Bin .../methodology/model/basement_options.png | Bin .../methodology/model/n_plates_options.png | Bin .../model/overburden_and_basement.png | Bin .../methodology/model/overburden_options.png | Bin .../methodology/model/plate_location.png | Bin .../model/plate_location_options.png | Bin .../methodology/model/plate_options.png | Bin .../methodology/model/plate_orientation.png | Bin .../model/plate_orientation_options.png | Bin .../model/plate_resistivity_option.png | Bin .../images}/methodology/model/plate_size.png | Bin .../methodology/model/plate_size_options.png | Bin .../methodology/model/three_plates.png | Bin .../images}/methodology/results.png | Bin .../images}/methodology/sweep_option.png | Bin .../images}/methodology/uijson.png | Bin .../images/sweep/sweep_uijson.png | Bin 0 -> 26466 bytes docs/plate-simulation/index.rst | 15 +- docs/plate-simulation/methodology.rst | 274 ----------------- docs/plate-simulation/sweep.rst | 17 ++ docs/plate-simulation/usage.rst | 285 ++++++++++++++++-- 31 files changed, 294 insertions(+), 297 deletions(-) rename docs/{images/plate-simulation => plate-simulation/images}/index.png (100%) rename docs/{images/plate-simulation/basic_usage => plate-simulation/images/methodology}/analyst_geophysics_menu.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/copy_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/data/simpeg_group_creation.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/data/simpeg_group_edit_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/data/simpeg_group_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/data/simulation_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/make_plate_images.pub (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/mesh/mesh_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/mesh/refinement.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/basement_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/n_plates_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/overburden_and_basement.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/overburden_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_location.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_location_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_orientation.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_orientation_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_resistivity_option.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_size.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/plate_size_options.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/model/three_plates.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/results.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/sweep_option.png (100%) rename docs/{images/plate-simulation => plate-simulation/images}/methodology/uijson.png (100%) create mode 100644 docs/plate-simulation/images/sweep/sweep_uijson.png delete mode 100644 docs/plate-simulation/methodology.rst create mode 100644 docs/plate-simulation/sweep.rst diff --git a/docs/images/plate-simulation/index.png b/docs/plate-simulation/images/index.png similarity index 100% rename from docs/images/plate-simulation/index.png rename to docs/plate-simulation/images/index.png diff --git a/docs/images/plate-simulation/basic_usage/analyst_geophysics_menu.png b/docs/plate-simulation/images/methodology/analyst_geophysics_menu.png similarity index 100% rename from docs/images/plate-simulation/basic_usage/analyst_geophysics_menu.png rename to docs/plate-simulation/images/methodology/analyst_geophysics_menu.png diff --git a/docs/images/plate-simulation/methodology/copy_options.png b/docs/plate-simulation/images/methodology/copy_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/copy_options.png rename to docs/plate-simulation/images/methodology/copy_options.png diff --git a/docs/images/plate-simulation/methodology/data/simpeg_group_creation.png b/docs/plate-simulation/images/methodology/data/simpeg_group_creation.png similarity index 100% rename from docs/images/plate-simulation/methodology/data/simpeg_group_creation.png rename to docs/plate-simulation/images/methodology/data/simpeg_group_creation.png diff --git a/docs/images/plate-simulation/methodology/data/simpeg_group_edit_options.png b/docs/plate-simulation/images/methodology/data/simpeg_group_edit_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/data/simpeg_group_edit_options.png rename to docs/plate-simulation/images/methodology/data/simpeg_group_edit_options.png diff --git a/docs/images/plate-simulation/methodology/data/simpeg_group_options.png b/docs/plate-simulation/images/methodology/data/simpeg_group_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/data/simpeg_group_options.png rename to docs/plate-simulation/images/methodology/data/simpeg_group_options.png diff --git a/docs/images/plate-simulation/methodology/data/simulation_options.png b/docs/plate-simulation/images/methodology/data/simulation_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/data/simulation_options.png rename to docs/plate-simulation/images/methodology/data/simulation_options.png diff --git a/docs/images/plate-simulation/methodology/make_plate_images.pub b/docs/plate-simulation/images/methodology/make_plate_images.pub similarity index 100% rename from docs/images/plate-simulation/methodology/make_plate_images.pub rename to docs/plate-simulation/images/methodology/make_plate_images.pub diff --git a/docs/images/plate-simulation/methodology/mesh/mesh_options.png b/docs/plate-simulation/images/methodology/mesh/mesh_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/mesh/mesh_options.png rename to docs/plate-simulation/images/methodology/mesh/mesh_options.png diff --git a/docs/images/plate-simulation/methodology/mesh/refinement.png b/docs/plate-simulation/images/methodology/mesh/refinement.png similarity index 100% rename from docs/images/plate-simulation/methodology/mesh/refinement.png rename to docs/plate-simulation/images/methodology/mesh/refinement.png diff --git a/docs/images/plate-simulation/methodology/model/basement_options.png b/docs/plate-simulation/images/methodology/model/basement_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/basement_options.png rename to docs/plate-simulation/images/methodology/model/basement_options.png diff --git a/docs/images/plate-simulation/methodology/model/n_plates_options.png b/docs/plate-simulation/images/methodology/model/n_plates_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/n_plates_options.png rename to docs/plate-simulation/images/methodology/model/n_plates_options.png diff --git a/docs/images/plate-simulation/methodology/model/overburden_and_basement.png b/docs/plate-simulation/images/methodology/model/overburden_and_basement.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/overburden_and_basement.png rename to docs/plate-simulation/images/methodology/model/overburden_and_basement.png diff --git a/docs/images/plate-simulation/methodology/model/overburden_options.png b/docs/plate-simulation/images/methodology/model/overburden_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/overburden_options.png rename to docs/plate-simulation/images/methodology/model/overburden_options.png diff --git a/docs/images/plate-simulation/methodology/model/plate_location.png b/docs/plate-simulation/images/methodology/model/plate_location.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_location.png rename to docs/plate-simulation/images/methodology/model/plate_location.png diff --git a/docs/images/plate-simulation/methodology/model/plate_location_options.png b/docs/plate-simulation/images/methodology/model/plate_location_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_location_options.png rename to docs/plate-simulation/images/methodology/model/plate_location_options.png diff --git a/docs/images/plate-simulation/methodology/model/plate_options.png b/docs/plate-simulation/images/methodology/model/plate_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_options.png rename to docs/plate-simulation/images/methodology/model/plate_options.png diff --git a/docs/images/plate-simulation/methodology/model/plate_orientation.png b/docs/plate-simulation/images/methodology/model/plate_orientation.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_orientation.png rename to docs/plate-simulation/images/methodology/model/plate_orientation.png diff --git a/docs/images/plate-simulation/methodology/model/plate_orientation_options.png b/docs/plate-simulation/images/methodology/model/plate_orientation_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_orientation_options.png rename to docs/plate-simulation/images/methodology/model/plate_orientation_options.png diff --git a/docs/images/plate-simulation/methodology/model/plate_resistivity_option.png b/docs/plate-simulation/images/methodology/model/plate_resistivity_option.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_resistivity_option.png rename to docs/plate-simulation/images/methodology/model/plate_resistivity_option.png diff --git a/docs/images/plate-simulation/methodology/model/plate_size.png b/docs/plate-simulation/images/methodology/model/plate_size.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_size.png rename to docs/plate-simulation/images/methodology/model/plate_size.png diff --git a/docs/images/plate-simulation/methodology/model/plate_size_options.png b/docs/plate-simulation/images/methodology/model/plate_size_options.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/plate_size_options.png rename to docs/plate-simulation/images/methodology/model/plate_size_options.png diff --git a/docs/images/plate-simulation/methodology/model/three_plates.png b/docs/plate-simulation/images/methodology/model/three_plates.png similarity index 100% rename from docs/images/plate-simulation/methodology/model/three_plates.png rename to docs/plate-simulation/images/methodology/model/three_plates.png diff --git a/docs/images/plate-simulation/methodology/results.png b/docs/plate-simulation/images/methodology/results.png similarity index 100% rename from docs/images/plate-simulation/methodology/results.png rename to docs/plate-simulation/images/methodology/results.png diff --git a/docs/images/plate-simulation/methodology/sweep_option.png b/docs/plate-simulation/images/methodology/sweep_option.png similarity index 100% rename from docs/images/plate-simulation/methodology/sweep_option.png rename to docs/plate-simulation/images/methodology/sweep_option.png diff --git a/docs/images/plate-simulation/methodology/uijson.png b/docs/plate-simulation/images/methodology/uijson.png similarity index 100% rename from docs/images/plate-simulation/methodology/uijson.png rename to docs/plate-simulation/images/methodology/uijson.png diff --git a/docs/plate-simulation/images/sweep/sweep_uijson.png b/docs/plate-simulation/images/sweep/sweep_uijson.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c0a0210c6cfc7cb212093f6373a881b43573d2 GIT binary patch literal 26466 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 @@ -15,7 +11,14 @@ simulate data over the parameterized model. The mesh, model and simulation details are parameterized in a ui.json file that can be rendered in `Geoscience ANALYST Pro `_. -See: +.. figure:: /images/plate-simulation/index.png + :align: center + :width: 100% + +Two other applications are also available to assist users in finding the best plate parameters to match observed data. The sweep application allows users to run a batch of simulations over a range of plate parameters, while the matching application uses an optimization algorithm to find the best fit between simulated and observed data. + +Content: - :ref:`Basic Usage ` -- :ref:`Methodology ` +- :ref:`Sweep (batch) simulations ` +- :ref:`Plate Matching ` diff --git a/docs/plate-simulation/methodology.rst b/docs/plate-simulation/methodology.rst deleted file mode 100644 index 87bbeeea..00000000 --- a/docs/plate-simulation/methodology.rst +++ /dev/null @@ -1,274 +0,0 @@ -.. _plate_simulation_methodology: - -Plate Simulation: Methodology -============================= - -In order to simulate geophysical data from a physical property model, we -need three things: a computational mesh, a discretization of the model -within that mesh and a means to simulate the data. Plate simulation -relies on `discretize `_ for -octree mesh creation, and `SimPEG `_ for finite -volume based forward modeling. Plate simulation includes a module for -generating a simple two-layer model with embedded plate anomalies within -octree meshes. In this section, we will discuss all three of these -components, their interface exposed by the ui.json file, and the storage -of results. - -.. figure:: /images/plate-simulation/methodology/uijson.png - :align: center - :width: 80% - - *Merged images of both tabs of the ui.json rendered interface.* - -.. contents:: - -.. toctree:: - :maxdepth: 3 - -Octree Mesh ------------ - -In order to accurately simulate our earth model, we need a mesh -that is refined in key areas, while being coarse enough elsewhere to -efficiently simulate data. The plate simulation package includes -refinements at the earth-air interface, the transmitter and receiver -sites and on the surface of plates. - -.. figure:: /images/plate-simulation/methodology/mesh/refinement.png - :align: center - :width: 100% - - *Octree mesh refinement for earth-air interface, receiver sites, - and within the mesh.* - -The meshing can be controlled by options exposed in the ui.json. -Those options are significantly reduced compared with the octree creation from -`grid-app `_ -since we have tailored many of the parameters to suit the needs of plate simulation. - -.. figure:: /images/plate-simulation/methodology/mesh/mesh_options.png - :align: center - - *Octree mesh parameters exposed in the ui.json.* - -Geological Model ----------------- - -The plate simulation package includes a module for generating -plate(s) embedded in a two-layer Earth model within octree meshes. -There are many permutations of this simple geological scenario -leading to a complex interface. To simplify things, we have -broken the discussion into two sub-sections: background -(basement and overburden) and plates. - -Background -~~~~~~~~~~ - -All model values within plate-simulation are to be provided in -ohm-metres. The basement resistivity is actually closer to a -halfspace in the sense that it fills the model anywhere outside -of the overburden and plate. So the basement resistivity should -be chosen as an effective resistivity for the whole geological -section. This should be quite reasonable for most applications -where the differences in resistivity between layers is much smaller -than the difference between overburden and any anomalous bodies -(plates). - -.. figure:: /images/plate-simulation/methodology/model/basement_options.png - :align: center - - *Basement resistivity option.* - -The overburden is discretized by the resistivity and thickness -of the layer. The thickness is referenced to the earth-air -interface and extends into the earth by the amount specified -in the thickness parameter. - -.. figure:: /images/plate-simulation/methodology/model/overburden_options.png - :align: center - - *Overburden resistivity and thickness options.* - -.. figure:: /images/plate-simulation/methodology/model/overburden_and_basement.png - :align: center - :width: 100% - - *Model section highlighting the overburden and basement boundary.* - -Plates -~~~~~~ - -In this section we will discuss the various plate options available -through the ui.json and their impact on the resulting discretized -model. - -.. figure:: /images/plate-simulation/methodology/model/plate_options.png - :align: center - - *Plate options available in the ui.json.* - -The first set of options allows the user to specify the number of -plates and their spacing. - -.. figure:: /images/plate-simulation/methodology/model/n_plates_options.png - :align: center - - *Number of plates and spacing options.* - -For all choices of ``n>1``, the plates will be evenly spaced at the requested -spacing and will share the same resistivity, size and orientation. - -.. figure:: /images/plate-simulation/methodology/model/three_plates.png - :align: center - :width: 100% - - *Model created by choosing three plates spaced at 200m.* - -The plate resistivity is expected to be entered in ohm-metres. - -.. figure:: /images/plate-simulation/methodology/model/plate_resistivity_option.png - :align: center - - *Plate resistivity option.* - -The size of the plate is given as a 'thickness', 'strike length', and -'dip length'. - -.. figure:: /images/plate-simulation/methodology/model/plate_size_options.png - :align: center - - *Plate size options.* - -The image below shows a dipping plate with annotations showing the size -parameters for that particular plate. - -.. figure:: /images/plate-simulation/methodology/model/plate_size.png - :align: center - :width: 100% - - *A dipping plate striking northeast with annotations for its thickness, - strike length and dip length.* - -The orientation of the plate is provided in terms of a dip and dip direction. -The dip is defined as the angle between the horizontal projection of the plate -normal and the plate tangent sharing the same origin. The dip direction is -measured between the horizontal projection of the plate normal and the North -arrow. See the image below for a visual representation of these angles. - -.. figure:: /images/plate-simulation/methodology/model/plate_orientation.png - :align: center - :width: 100% - - *Plate orientation options. Plate orientation is given as a dip and dip direction. - The dip (b) is defined as the angle between the horizontal the projection of the - plate normal (n\') and the plate tangent sharing the same origin (t). The dip - direction (a) is the angle measured between the horizontal projection of the plate - normal (n\') and due north (N).* - -The location of the plate can be provided in both relative and absolute terms. -The position parameters are given as an easting, northing, and elevation. If the -relative locations checkbox is chosen, then the easting and northing will be -relative to the center of the survey and the elevation will be relative to one of -the available references. The elevation may either be referenced to the earth-air -interface or the overburden provided by the ``Depth reference`` dropdown. Either of -these choice can be relative to the minimum, maximum, or mean of the points making -up the reference surface as given by the ``Reference type`` dropdown. In all of these -cases the distance provided will act as a depth below the reference to the *top of -plate* in the *z negative down* convention. If the relative locations checkbox is not -chosen, then the easting, northing, and elevation is simply the location of the -center of the plate. - -.. figure:: /images/plate-simulation/methodology/model/plate_location_options.png - :align: center - - *Plate location options in relative mode. Notice the* ``Elevation`` *is given as - negative to ensure the top of the plate is below the selected min of the - overburden.* - -.. figure:: /images/plate-simulation/methodology/model/plate_location.png - :align: center - :width: 100% - - *Example of a relative elevation referenced 100m below the minimum of the - overburden layer.* - -Data Simulation ---------------- - -.. _simpeg_group_options: - -The simulation parameters control the forward modeling of the plate model -discretized within the octree mesh. Rather than exposing the parameters within -the plate simulation interface all over again, we simply allow the user to -select an existing forward modelling SimPEG group. It is expected that the -user will have already edited those options and provided at least a topography -and survey object as well as selected one or more components to simulate. The -user may also provide a name to the new SimPEG group that will be used to store -the results. - - -.. figure:: /images/plate-simulation/methodology/data/simpeg_group_options.png - :align: center - - *Selecting the initialized forward modelling SimPEG group and naming the - group that will store the plate simulation results.* - -The required SimPEG group can be created within Geoscience ANALYST through the -``Geophysics`` menu under ``SimPEG Python Interface`` entry. - -.. figure:: /images/plate-simulation/methodology/data/simpeg_group_creation.png - :align: center - :width: 100% - - *Creating a SimPEG group to be selected within the plate simulation interface.* - -Once created, the options can be edited by right-clicking the group and choosing -the 'Edit Options' entry. - -.. figure:: /images/plate-simulation/methodology/data/simpeg_group_edit_options.png - :align: center - - *Editing the SimPEG group options.* - -Since plate-simulation will create its own mesh and model, the mesh and -conductivity selections can be ignored. Selecting a value will not conflict -with the plate-simulation objects and will simply be ignored. In contrast, the -survey, topography and at least one component must be selected to run the simulation. - -.. figure:: /images/plate-simulation/methodology/data/simulation_options.png - :align: center - :width: 80% - - *Simulation options with annotations for required and not required components.* - -Results -------- - -The results of the simulation are stored in the SimPEG group named in the -:ref:`simpeg group option ` section. - -.. figure:: /images/plate-simulation/methodology/results.png - :align: center - - *Results group containing a survey object with all the simulated data channels - stored in property groups, and an octree mesh containing the model parameterized - in the interface.* - -To iterate on the design of experiment, simply copy the options, edit, and -run again. - -.. figure:: /images/plate-simulation/methodology/copy_options.png - :align: center - - *Copying the options to run a new simulation.* - -If the user wishes to sweep one or more of the input parameters to run a large number of -simulations, they can use the ``generate sweep file`` option to write a file used -by the `param-sweeps `_ package to do just -that. It is beyond the scope of this document to discuss the use of that package; -refer to its README for further details. - -.. figure:: /images/plate-simulation/methodology/sweep_option.png - :align: center - - *Generating a sweep file to run multiple simulations.* diff --git a/docs/plate-simulation/sweep.rst b/docs/plate-simulation/sweep.rst new file mode 100644 index 00000000..b00e40b8 --- /dev/null +++ b/docs/plate-simulation/sweep.rst @@ -0,0 +1,17 @@ +.. _plate_simulation_batch: + +Sweep (batch) Simulations +========================= + +The Plate Sweep module provides a user interface for generating and running multiple simulations by sweeping one or more of the input parameters. The user can select which parameters to sweep and the range of values for each parameter. The results of each simulation are stored in a ``*.geoh5`` file named with a unique identifier. + +.. figure:: /plate-simulation/images/sweep/sweep_uijson.png + :align: center + :width: 80% + + *Rendered user-interface in Geoscience ANALYST.* + +.. contents:: + +.. toctree:: + :maxdepth: 3 diff --git a/docs/plate-simulation/usage.rst b/docs/plate-simulation/usage.rst index f940b6ca..7891edfa 100644 --- a/docs/plate-simulation/usage.rst +++ b/docs/plate-simulation/usage.rst @@ -1,30 +1,281 @@ .. _plate_simulation_usage: -Plate Simulation: Basic usage -============================= +Basic Usage +----------- -The main entry points to the various modules is the `plate_simulation.ui.json `_ -file. The ``ui.json`` has the dual purpose of (1) rendering a user-interface from -Geoscience ANALYST and (2) storing the input parameters chosen by the user for the -program to run. To learn more about the ui.json interface visit the -`UIJson documentation `_ page. +Simulating geophysical data from a physical property model requires three things: +a computational mesh, a discretization of the model within that mesh, and a means +to simulate the data. Plate simulation relies on `discretize `_ +for octree mesh creation and `SimPEG `_ for finite volume +based forward modeling. Plate simulation includes a module for generating a simple +two-layer model with embedded plate anomalies within octree meshes. This section +discusses all three of these components, their interface exposed by the ui.json file, +and the storage of results. +.. figure:: /plate-simulation/images/methodology/uijson.png + :align: center + :width: 80% -User-interface --------------- + *Merged images of both tabs of the ui.json rendered interface.* -The user-interface is accessible from Geoscience ANALYST Pro Geophysics menu. +.. contents:: -.. figure:: /images/plate-simulation/basic_usage/analyst_geophysics_menu.png - :align: center - :width: 800 +.. toctree:: + :maxdepth: 3 + + +Octree Mesh +----------- + +To accurately simulate the earth model, the mesh must be refined in key areas +while remaining coarse enough elsewhere to efficiently simulate data. Plate +simulation includes refinements at the earth-air interface, the transmitter and +receiver sites, and on the surface of plates. + +.. figure:: /plate-simulation/images/methodology/mesh/refinement.png + :align: center + :width: 100% + + *Octree mesh refinement for earth-air interface, receiver sites, + and within the mesh.* + +The meshing is controlled by options exposed in the ui.json. These options are +significantly reduced compared with octree creation from `grid-app `_, +as many parameters have been tailored to suit the needs of plate simulation. + +.. figure:: /plate-simulation/images/methodology/mesh/mesh_options.png + :align: center + + *Octree mesh parameters exposed in the ui.json.* + +Geological Model +---------------- + +Plate simulation includes a module for generating plates embedded in a two-layer +Earth model within octree meshes. Many permutations of this simple geological +scenario result in a complex interface. To simplify this, the discussion is +organized into two sub-sections: background (basement and overburden) and plates. + +Background +~~~~~~~~~~ + +All model values within plate-simulation must be provided in ohm-metres. The +basement resistivity is actually closer to a halfspace in the sense that it +fills the model anywhere outside of the overburden and plate. Therefore, the +basement resistivity should be chosen as an effective resistivity for the whole +geological section. This approach is quite reasonable for most applications +where the differences in resistivity between layers are much smaller than the +difference between overburden and any anomalous bodies (plates). + +.. figure:: /plate-simulation/images/methodology/model/basement_options.png + :align: center + + *Basement resistivity option.* + +The overburden is discretized by the resistivity and thickness of the layer. +The thickness is referenced to the earth-air interface and extends into the +earth by the amount specified in the thickness parameter. + +.. figure:: /plate-simulation/images/methodology/model/overburden_options.png + :align: center + + *Overburden resistivity and thickness options.* + +.. figure:: /plate-simulation/images/methodology/model/overburden_and_basement.png + :align: center + :width: 100% + + *Model section highlighting the overburden and basement boundary.* + +Plates +~~~~~~ + +This section discusses the various plate options available through the ui.json +and their impact on the resulting discretized model. + +.. figure:: /plate-simulation/images/methodology/model/plate_options.png + :align: center + + *Plate options available in the ui.json.* + +The first set of options allows the user to specify the number of plates and +their spacing. + +.. figure:: /plate-simulation/images/methodology/model/n_plates_options.png + :align: center + + *Number of plates and spacing options.* + +For all choices of ``n>1``, the plates are evenly spaced at the requested spacing +and share the same resistivity, size, and orientation. + +.. figure:: /plate-simulation/images/methodology/model/three_plates.png + :align: center + :width: 100% + + *Model created by choosing three plates spaced at 200m.* + +The plate resistivity must be entered in ohm-metres. + +.. figure:: /plate-simulation/images/methodology/model/plate_resistivity_option.png + :align: center + + *Plate resistivity option.* + +The size of the plate is defined by three parameters: thickness, strike length, +and dip length. + +.. figure:: /plate-simulation/images/methodology/model/plate_size_options.png + :align: center + + *Plate size options.* + +The image below shows a dipping plate with annotations indicating the size +parameters for that particular plate. + +.. figure:: /plate-simulation/images/methodology/model/plate_size.png + :align: center + :width: 100% + *A dipping plate striking northeast with annotations for its thickness, + strike length and dip length.* -From command line ------------------ +The plate orientation is defined in terms of dip and dip direction. The dip +is the angle between the horizontal projection of the plate normal and the +plate tangent sharing the same origin. The dip direction is measured between +the horizontal projection of the plate normal and the North arrow. The image +below provides a visual representation of these angles. + +.. figure:: /plate-simulation/images/methodology/model/plate_orientation.png + :align: center + :width: 100% + + *Plate orientation options. Plate orientation is given as a dip and dip direction. + The dip (b) is defined as the angle between the horizontal the projection of the + plate normal (n\') and the plate tangent sharing the same origin (t). The dip + direction (a) is the angle measured between the horizontal projection of the plate + normal (n\') and due north (N).* + +The plate location can be specified in both relative and absolute terms. The position +parameters are given as easting, northing, and elevation. If the relative locations +checkbox is selected, the easting and northing are relative to the center of the +survey and the elevation is relative to one of the available references. The elevation +may be referenced to either the earth-air interface or the overburden via the +``Depth reference`` dropdown. Either choice can be relative to the minimum, maximum, +or mean of the points making up the reference surface as given by the ``Reference type`` +dropdown. In all these cases, the distance provided acts as a depth below the reference +to the *top of plate* in the *z negative down* convention. If the relative locations +checkbox is not selected, the easting, northing, and elevation specify the center +location of the plate. + +.. figure:: /plate-simulation/images/methodology/model/plate_location_options.png + :align: center + + *Plate location options in relative mode. Notice the* ``Elevation`` *is given as + negative to ensure the top of the plate is below the selected min of the + overburden.* + +.. figure:: /plate-simulation/images/methodology/model/plate_location.png + :align: center + :width: 100% + + *Example of a relative elevation referenced 100m below the minimum of the + overburden layer.* + +Data Simulation +--------------- + +.. _simpeg_group_options: + +The simulation parameters control the forward modeling of the plate model +discretized within the octree mesh. Rather than exposing parameters within +the plate simulation interface, the application allows the user to select an +existing forward modelling SimPEG group. The user must ensure that the SimPEG +group has been previously edited with appropriate options, includes at least a +topography and survey object, and has selected one or more components to simulate. +The user may also provide a name for the new SimPEG group to store the results. + +.. figure:: /plate-simulation/images/methodology/data/simpeg_group_options.png + :align: center + + *Selecting the initialized forward modelling SimPEG group and naming the + group that will store the plate simulation results.* + +Create the required SimPEG group within Geoscience ANALYST through the +``Geophysics`` menu under ``SimPEG Python Interface`` entry. + +.. figure:: /plate-simulation/images/methodology/data/simpeg_group_creation.png + :align: center + :width: 100% + + *Creating a SimPEG group to be selected within the plate simulation interface.* + +Edit the options by right-clicking the group and selecting 'Edit Options'. + +.. figure:: /plate-simulation/images/methodology/data/simpeg_group_edit_options.png + :align: center + + *Editing the SimPEG group options.* + +Since plate-simulation creates its own mesh and model, the mesh and conductivity +selections can be ignored. Selecting a value does not conflict with the +plate-simulation objects and is simply ignored. In contrast, the survey, topography, +and at least one component must be selected to run the simulation. + +.. figure:: /plate-simulation/images/methodology/data/simulation_options.png + :align: center + :width: 80% + + *Simulation options with annotations for required and not required components.* + +Results +------- + +The results of the simulation are stored in the SimPEG group named in the +:ref:`simpeg group option ` section. + +.. figure:: /plate-simulation/images/methodology/results.png + :align: center + + *Results group containing a survey object with all the simulated data channels + stored in property groups, and an octree mesh containing the model parameterized + in the interface.* + +To iterate on the design of experiment, copy the options, edit them, and run again. + +.. figure:: /plate-simulation/images/methodology/copy_options.png + :align: center + + *Copying the options to run a new simulation.* + +To sweep one or more input parameters and run multiple simulations, use the +``generate sweep file`` option to create a file for the `param-sweeps `_ +package. See the param-sweeps README for further details on using that package. + +.. figure:: /plate-simulation/images/methodology/sweep_option.png + :align: center + + *Generating a sweep file to run multiple simulations.* + + +Running the application +----------------------- + +The main entry point to the various modules is the `plate_simulation.ui.json `_ +file. The ``ui.json`` serves a dual purpose: (1) rendering a user-interface in +Geoscience ANALYST and (2) storing the input parameters chosen by the user for the +program to run. See the `UIJson documentation `_ +for more information about the ui.json interface. + +Access the user-interface from the Geoscience ANALYST Pro Geophysics menu. + +.. figure:: /plate-simulation/images/methodology/analyst_geophysics_menu.png + :align: center + :width: 800 -The application can also be run from the command line if all required fields in the ui.json are provided. -This is useful for more advanced users wanting to automate the mesh creation process or re-run an existing mesh with different parameters. +The application can also be run from the command line if all required fields in +the ui.json are provided. This approach is useful for advanced users who want to +automate the mesh creation process or re-run an existing mesh with different parameters. To run the application from the command line, use the following command in a Conda Prompt: From b43c8667128ba05bc13d34d24e3492dd5202bf56 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Tue, 24 Feb 2026 12:47:01 -0800 Subject: [PATCH 10/28] Edit more docs --- docs/_toc.yml | 8 +- docs/conf.py | 1 + .../analyst_geophysics_menu.png | Bin docs/intro.md | 33 ++++- .../images/sweep/sweep_uijson.png | Bin 26466 -> 24724 bytes docs/plate-simulation/index.rst | 24 ---- docs/plate-simulation/match.rst | 30 +++++ .../{usage.rst => simulation.rst} | 124 ++++++++---------- docs/plate-simulation/sweep.rst | 31 ++++- 9 files changed, 145 insertions(+), 106 deletions(-) rename docs/{plate-simulation/images/methodology => images}/analyst_geophysics_menu.png (100%) delete mode 100644 docs/plate-simulation/index.rst create mode 100644 docs/plate-simulation/match.rst rename docs/plate-simulation/{usage.rst => simulation.rst} (80%) diff --git a/docs/_toc.yml b/docs/_toc.yml index 5686cb83..14070c93 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -34,10 +34,8 @@ chapters: - file: case_studies/Forrestania/python_code/unconstrained_gravity_inv_training - file: case_studies/Forrestania/python_code/unconstrained_magnetics_inv_training - file: case_studies/Forrestania/python_code/joint_grav_mag -- file: plate-simulation/index +- file: plate-simulation/simulation sections: - - file: plate-simulation/usage - title: Basic Usage - - file: plate-simulation/methodology - title: Methodology + - file: plate-simulation/sweep + - file: plate-simulation/match - file: THIRD_PARTY_SOFTWARE diff --git a/docs/conf.py b/docs/conf.py index 2f18464f..ed45e118 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,6 +42,7 @@ exclude_patterns = [] todo_include_todos = True + # -- Options for auto-doc ---------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#module-sphinx.ext.autodoc diff --git a/docs/plate-simulation/images/methodology/analyst_geophysics_menu.png b/docs/images/analyst_geophysics_menu.png similarity index 100% rename from docs/plate-simulation/images/methodology/analyst_geophysics_menu.png rename to docs/images/analyst_geophysics_menu.png diff --git a/docs/intro.md b/docs/intro.md index 83659657..2407d34e 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,16 +1,45 @@ # About -This document contains training material for geophysical inversions using [SimPEG](https://simpeg.xyz/) and [Geoscience ANALYST](https://www.mirageoscience.com/mining-industry-software/geoscience-analyst/). +This document contains training material for geophysical forward modeling and inversions using [SimPEG](https://simpeg.xyz/) and [Geoscience ANALYST](https://www.mirageoscience.com/mining-industry-software/geoscience-analyst/). ```{image} ./images/ore_body.png :width: 500px ``` -# Table of content + +# Table of contents ```{tableofcontents} ``` +# Running the applications + +The main entry point to the various modules are the [*.ui.json](https://github.com/MiraGeoscience/simpeg-drivers/blob/develop/simpeg_drivers-assets/uijson) +files. The ``ui.json`` serves a dual purpose: + +(1) rendering a user-interface in Geoscience ANALYST + +(2) storing the input parameters chosen by the user for the program to run. See the [UIJson documentation](https://mirageoscience-geoh5py.readthedocs-hosted.com/en/latest/content/uijson_format/usage.html) +for more information about the ui.json interface. + +The various user-interfaces can be accessed from the Geoscience ANALYST Pro Geophysics menu. + +```{image} ./images/analyst_geophysics_menu.png +:width: 500px +``` + +The application can also be run from command line if all required fields in +the ui.json are provided. This approach is useful for advanced users who want to +automate the mesh creation process or re-run an existing mesh with different parameters. + +To run any of the applications, assuming a valid Conda environment, use the following command: + +``conda activate simpeg-drivers`` + +``python -m simpeg-drivers.driver [YOUR.ui.json]`` + +where ``[YOUR.ui.json]`` is the path to the input ui.json file on disk. + # References diff --git a/docs/plate-simulation/images/sweep/sweep_uijson.png b/docs/plate-simulation/images/sweep/sweep_uijson.png index c9c0a0210c6cfc7cb212093f6373a881b43573d2..6a3bff5268e5d9b64716188af8d91b1f8e803cd4 100644 GIT binary patch literal 24724 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 Z7%8mq=p8ZA2EQZ#Gte>8F4D4z_zw>K)Y1R| literal 26466 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 -and `SimPEG `_ projects to create a refined octree mesh and -simulate data over the parameterized model. The mesh, model and simulation -details are parameterized in a ui.json file that can be rendered in -`Geoscience ANALYST Pro `_. - -.. figure:: /images/plate-simulation/index.png - :align: center - :width: 100% - -Two other applications are also available to assist users in finding the best plate parameters to match observed data. The sweep application allows users to run a batch of simulations over a range of plate parameters, while the matching application uses an optimization algorithm to find the best fit between simulated and observed data. - -Content: - -- :ref:`Basic Usage ` -- :ref:`Sweep (batch) simulations ` -- :ref:`Plate Matching ` diff --git a/docs/plate-simulation/match.rst b/docs/plate-simulation/match.rst new file mode 100644 index 00000000..cde3eb13 --- /dev/null +++ b/docs/plate-simulation/match.rst @@ -0,0 +1,30 @@ +.. _plate_simulation_match: + +Plate Matching +============== + +The Plate Matching module provides a user interface for querying a database of plate simulations to find the simulation that best matches a set of user-defined criteria. + +Interface +--------- + +.. figure:: /plate-simulation/images/sweep/sweep_uijson.png + :align: center + :width: 80% + + *Rendered user-interface in Geoscience ANALYST.* + +Inputs +^^^^^^ + +- **A** + +Methodology +----------- + +Something + + +Tutorial +-------- +To be added. diff --git a/docs/plate-simulation/usage.rst b/docs/plate-simulation/simulation.rst similarity index 80% rename from docs/plate-simulation/usage.rst rename to docs/plate-simulation/simulation.rst index 7891edfa..6e7b6d78 100644 --- a/docs/plate-simulation/usage.rst +++ b/docs/plate-simulation/simulation.rst @@ -1,13 +1,27 @@ -.. _plate_simulation_usage: +.. _plate_simulation_index: -Basic Usage ------------ +Plate Simulation +================ + +The plate-simulation application is a tool for simulating geophysical data over +a simple two-layer earth model with plate(s). It relies on the +`discretize `_ +and `SimPEG `_ projects to create a refined octree mesh and +simulate data over the parameterized model. The mesh, model and simulation +details are parameterized in a ui.json file that can be rendered in +`Geoscience ANALYST Pro `_. + +.. figure:: /plate-simulation/images/index.png + :align: center + :width: 50% + + +Interface +========= Simulating geophysical data from a physical property model requires three things: a computational mesh, a discretization of the model within that mesh, and a means -to simulate the data. Plate simulation relies on `discretize `_ -for octree mesh creation and `SimPEG `_ for finite volume -based forward modeling. Plate simulation includes a module for generating a simple +to simulate the data. Plate simulation includes a module for generating a simple two-layer model with embedded plate anomalies within octree meshes. This section discusses all three of these components, their interface exposed by the ui.json file, and the storage of results. @@ -18,35 +32,6 @@ and the storage of results. *Merged images of both tabs of the ui.json rendered interface.* -.. contents:: - -.. toctree:: - :maxdepth: 3 - - -Octree Mesh ------------ - -To accurately simulate the earth model, the mesh must be refined in key areas -while remaining coarse enough elsewhere to efficiently simulate data. Plate -simulation includes refinements at the earth-air interface, the transmitter and -receiver sites, and on the surface of plates. - -.. figure:: /plate-simulation/images/methodology/mesh/refinement.png - :align: center - :width: 100% - - *Octree mesh refinement for earth-air interface, receiver sites, - and within the mesh.* - -The meshing is controlled by options exposed in the ui.json. These options are -significantly reduced compared with octree creation from `grid-app `_, -as many parameters have been tailored to suit the needs of plate simulation. - -.. figure:: /plate-simulation/images/methodology/mesh/mesh_options.png - :align: center - - *Octree mesh parameters exposed in the ui.json.* Geological Model ---------------- @@ -55,12 +40,12 @@ Plate simulation includes a module for generating plates embedded in a two-layer Earth model within octree meshes. Many permutations of this simple geological scenario result in a complex interface. To simplify this, the discussion is organized into two sub-sections: background (basement and overburden) and plates. +All model values within plate-simulation must be provided in SI units that varies depending on the chosen forward simulation (g/cc, SI or Ohm.m) Background ~~~~~~~~~~ -All model values within plate-simulation must be provided in ohm-metres. The -basement resistivity is actually closer to a halfspace in the sense that it +The basement resistivity is actually closer to a halfspace in the sense that it fills the model anywhere outside of the overburden and plate. Therefore, the basement resistivity should be chosen as an effective resistivity for the whole geological section. This approach is quite reasonable for most applications @@ -115,7 +100,7 @@ and share the same resistivity, size, and orientation. *Model created by choosing three plates spaced at 200m.* -The plate resistivity must be entered in ohm-metres. +The plate resistivity must be entered in SI units (g/cc, SI or Ohm.m). .. figure:: /plate-simulation/images/methodology/model/plate_resistivity_option.png :align: center @@ -228,6 +213,30 @@ and at least one component must be selected to run the simulation. *Simulation options with annotations for required and not required components.* +Octree Mesh +----------- + +To accurately simulate the earth model, the mesh must be refined in key areas +while remaining coarse enough elsewhere to efficiently simulate data. Plate +simulation includes refinements at the earth-air interface, the transmitter and +receiver sites, and on the surface of plates. + +.. figure:: /plate-simulation/images/methodology/mesh/refinement.png + :align: center + :width: 100% + + *Octree mesh refinement for earth-air interface, receiver sites, + and within the mesh.* + +The meshing is controlled by options exposed in the ui.json. These options are +significantly reduced compared with octree creation from `grid-app `_, +as many parameters have been tailored to suit the needs of plate simulation. + +.. figure:: /plate-simulation/images/methodology/mesh/mesh_options.png + :align: center + + *Octree mesh parameters exposed in the ui.json.* + Results ------- @@ -248,39 +257,16 @@ To iterate on the design of experiment, copy the options, edit them, and run aga *Copying the options to run a new simulation.* -To sweep one or more input parameters and run multiple simulations, use the -``generate sweep file`` option to create a file for the `param-sweeps `_ -package. See the param-sweeps README for further details on using that package. - -.. figure:: /plate-simulation/images/methodology/sweep_option.png - :align: center - - *Generating a sweep file to run multiple simulations.* - - -Running the application ------------------------ -The main entry point to the various modules is the `plate_simulation.ui.json `_ -file. The ``ui.json`` serves a dual purpose: (1) rendering a user-interface in -Geoscience ANALYST and (2) storing the input parameters chosen by the user for the -program to run. See the `UIJson documentation `_ -for more information about the ui.json interface. +Advanced Applications +--------------------- -Access the user-interface from the Geoscience ANALYST Pro Geophysics menu. +Two other applications are available to assist users in finding the best plate parameters to match observed data. +The sweep application allows users to run a batch of simulations over a range of plate parameters, while the matching application uses an optimization algorithm to find the best fit between simulated and observed data. -.. figure:: /plate-simulation/images/methodology/analyst_geophysics_menu.png - :align: center - :width: 800 -The application can also be run from the command line if all required fields in -the ui.json are provided. This approach is useful for advanced users who want to -automate the mesh creation process or re-run an existing mesh with different parameters. - -To run the application from the command line, use the following command in a Conda Prompt: - -``conda activate plate-simulation`` - -``python -m plate-simulation.driver input_file.json`` +.. toctree:: + :maxdepth: 1 -where ``input_file.json`` is the path to the input file on disk. + sweep + match diff --git a/docs/plate-simulation/sweep.rst b/docs/plate-simulation/sweep.rst index b00e40b8..e73d44c1 100644 --- a/docs/plate-simulation/sweep.rst +++ b/docs/plate-simulation/sweep.rst @@ -1,9 +1,14 @@ .. _plate_simulation_batch: -Sweep (batch) Simulations -========================= +Batch Simulations +================= -The Plate Sweep module provides a user interface for generating and running multiple simulations by sweeping one or more of the input parameters. The user can select which parameters to sweep and the range of values for each parameter. The results of each simulation are stored in a ``*.geoh5`` file named with a unique identifier. +The Plate Sweep module provides a user interface for generating and running a batch of simulations by sweeping one or more of the input parameters. The user can select which parameters to sweep and the range of values for each parameter. The results of each simulation are stored in a ``*.geoh5`` file named with a unique identifier. + + + +Interface +--------- .. figure:: /plate-simulation/images/sweep/sweep_uijson.png :align: center @@ -11,7 +16,21 @@ The Plate Sweep module provides a user interface for generating and running mult *Rendered user-interface in Geoscience ANALYST.* -.. contents:: +Inputs +^^^^^^ + +- **Plate simulation**: A Plate Simulation group that contains the input parameters for a single plate simulation, as well as the connection to a SimPEG Forward group. Parameters that are not included in the sweep will be taken from this group and used for all simulations. +- **Output directory**: A directory where the results of each simulation will be stored. Each simulation will be saved in a separate ``*.geoh5`` file named with a unique identifier. The directory is created if it does not exist, otherwise simulations are appended to it. +- **Generate summary file**: A boolean option to generate a summary file in the output directory. The summary file is a ``*.xls`` file that contains the input parameters and results of each simulation, allowing users to easily sort over the range of simulation parameters. +- **Sweep block**: For each the following parameters, users can choose a **starting**, **ending** and **step** value to sweep over a range of values. The application will generate a simulation for each value in the range, while keeping all other parameters constant. + - **Background**: Over-writing the + +Methodology +----------- + +Something + -.. toctree:: - :maxdepth: 3 +Tutorial +-------- +To be added. From 8fe3e8948635f361e47fb8d2bcda42b4b5bcacc7 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Wed, 25 Feb 2026 10:43:53 -0800 Subject: [PATCH 11/28] change test to use xls on disk --- tests/plate_simulation/runtest/sweep_test.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/plate_simulation/runtest/sweep_test.py b/tests/plate_simulation/runtest/sweep_test.py index 2a765c78..9977c378 100644 --- a/tests/plate_simulation/runtest/sweep_test.py +++ b/tests/plate_simulation/runtest/sweep_test.py @@ -7,7 +7,6 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -from io import BytesIO from geoh5py import Workspace from geoh5py.groups import SimPEGGroup @@ -105,10 +104,6 @@ def test_sweep(tmp_path): n = len(list(workdir.glob("*.geoh5"))) assert n == 6 - # Check that the summary file was created and has the expected number of rows - with Workspace(tmp_path / "test.geoh5") as ws: - file_data = ws.get_entity("summary.xlsx")[0] - blob = BytesIO(file_data.file_bytes) - xls = read_excel(blob) + xls = read_excel(tmp_path / "summary.xlsx") assert len(xls) == 6 From 13310e5ce562c5affb1a145ddf046edd07087e61 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Wed, 25 Feb 2026 15:39:30 -0800 Subject: [PATCH 12/28] Begin section on parallelization --- docs/_toc.yml | 1 + .../images/distributed_parallelization.svg | 1 + docs/fundamentals/parallelization.rst | 49 ++++++++++++++++++ .../plate-simulation/images/sweep/landing.png | Bin 0 -> 330552 bytes docs/plate-simulation/simulation.rst | 2 +- docs/plate-simulation/sweep.rst | 22 +++++--- 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 docs/fundamentals/images/distributed_parallelization.svg create mode 100644 docs/fundamentals/parallelization.rst create mode 100644 docs/plate-simulation/images/sweep/landing.png diff --git a/docs/_toc.yml b/docs/_toc.yml index 14070c93..1809f5be 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -16,6 +16,7 @@ chapters: - file: fundamentals/joint_inversion - file: fundamentals/depth_of_investigation - file: fundamentals/optimization + - file: fundamentals/parallelization - file: tutorials/introduction sections: - file: tutorials/background diff --git a/docs/fundamentals/images/distributed_parallelization.svg b/docs/fundamentals/images/distributed_parallelization.svg new file mode 100644 index 00000000..93432590 --- /dev/null +++ b/docs/fundamentals/images/distributed_parallelization.svg @@ -0,0 +1 @@ + diff --git a/docs/fundamentals/parallelization.rst b/docs/fundamentals/parallelization.rst new file mode 100644 index 00000000..34548e28 --- /dev/null +++ b/docs/fundamentals/parallelization.rst @@ -0,0 +1,49 @@ +.. _parallelization: + +Parallelization +=============== + +For a given inversion routine, the problem can be decomposed into a series of sub-problems, or tiles, each assigned a mesh and a survey. During the inverse process, predicted data and derivatives are continuously requested from the sub-problems. These operations are parallelized within each sub-problem, as well as externally such that sub-problems can be computed concurrently. + + +.. figure:: ./images/distributed_parallelization.svg + :align: center + :width: 80% + + Schematic representation of the computing elements of a tiled inversion. Each tile is assigned a mesh and a survey, with array operations parallelized by dask bookending a direct solvers. The tiles can be distributed across multiple workers, each with a limited number of threads to optimize performance. Only 1-dimensional arrays are returned to the main process. + +This following sections describe the different level of parallelization used by the inversion routines and how to optimize resources. + + +Direct Solvers +-------------- + +The direct solvers are used for all methods evaluated by partial differential (PDE) equations, such as electromagnetics and electric methods. The `Pardiso `_ and `Mumps `_ solvers are parallelized using OpenMP. Note that the current implementation of the solvers are not thread-safe, and can therefore not be shared within parallel processes. + +The number of threads used by the solvers can be set by running the command + +.. code-block:: + + set OMP_NUM_THREADS=X + +before launching the python program. Alternatively, setting ``OMP_NUM_THREADS`` as a local environment variable will set it permanently. The default value is the number of threads available on the machine. + +Dask +---- + +Most operations related to generating arrays are handled by the `dask `_ library. A mixture of dask.arrays and dask.delayed calls are used to parallelize the computations across multiple threads. If a direct solver is involved, the dask operations are bookending the solver to avoid thread-safety issues. Otherwise, the dask operations are performed in parallel across the available threads. + + +Dask.distributed +---------------- + +For large systems, such as High-Performance Computing (HPC) clusters, the ``dask.distributed`` library can be used to distribute the computation from tiles across multiple ``workers``. It has been found that the performance of direct solvers tend to saturate on large numbers of threads. By spawning multiple processes, each with a limited number of threads, the performance can be improved by running multiple tiles in parallel. The number of workers and threads per worker can be set with the following parameters added to the ui.json file: + +.. code-block:: + + { + ... + "n_workers": X, + "n_threads": Y, + "performance_report": true + } diff --git a/docs/plate-simulation/images/sweep/landing.png b/docs/plate-simulation/images/sweep/landing.png new file mode 100644 index 0000000000000000000000000000000000000000..59874636c22094dd0e1652999c9c595a1360218f GIT binary patch literal 330552 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%0D8&o+_8VtX4km4>$D?Nz>Z0FOfa@@q{u; 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

j#n4fPHXT=`_1lGI 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