diff --git a/environments/py-3.10-linux-64-dev.conda.lock.yml b/environments/py-3.10-linux-64-dev.conda.lock.yml index 670d27d9..ae1cc0ce 100644 --- a/environments/py-3.10-linux-64-dev.conda.lock.yml +++ b/environments/py-3.10-linux-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py310hf71b8c6_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py310hf71b8c6_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -55,7 +55,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py310h89163eb_0 + - fonttools=4.58.2=py310h89163eb_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -63,7 +63,7 @@ dependencies: - greenlet=3.2.3=py310hf71b8c6_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py310h2a0e991_101 + - h5py=3.14.0=nompi_py310hea1e86d_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -112,9 +112,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -133,13 +133,13 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - libsodium=1.0.20=h4ab18f5_0 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -229,7 +229,7 @@ dependencies: - readline=8.2=h8c095d6_2 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py310hbcd0ec0_0 @@ -298,13 +298,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=h3b0a872_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py310ha75aee5_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.10-linux-64.conda.lock.yml b/environments/py-3.10-linux-64.conda.lock.yml index 0142fba5..702e8c21 100644 --- a/environments/py-3.10-linux-64.conda.lock.yml +++ b/environments/py-3.10-linux-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py310hf71b8c6_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py310hf71b8c6_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -30,12 +30,12 @@ dependencies: - discretize=0.11.3=py310ha2bacc8_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py310h89163eb_0 + - fonttools=4.58.2=py310h89163eb_0 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py310ha2bacc8_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py310h2a0e991_101 + - h5py=3.14.0=nompi_py310hea1e86d_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -51,9 +51,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -72,12 +72,12 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -150,13 +150,13 @@ dependencies: - yaml=0.2.5=h7f98852_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py310ha75aee5_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.10-win-64-dev.conda.lock.yml b/environments/py-3.10-win-64-dev.conda.lock.yml index 4e2e736b..77493fd5 100644 --- a/environments/py-3.10-win-64-dev.conda.lock.yml +++ b/environments/py-3.10-win-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py310h9e98ed7_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py310h9e98ed7_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -55,7 +55,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py310h38315fa_0 + - fonttools=4.58.2=py310h38315fa_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -63,7 +63,7 @@ dependencies: - greenlet=3.2.3=py310h9e98ed7_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py310hd6dd405_101 + - h5py=3.14.0=nompi_py310h877c39c_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -110,9 +110,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -127,10 +127,10 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - libsodium=1.0.20=hc70643c_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -213,7 +213,7 @@ dependencies: - pyzmq=26.4.0=py310h656833d_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py310hed05c55_0 @@ -288,13 +288,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=ha9f60a1_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py310ha8f682b_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.10-win-64.conda.lock.yml b/environments/py-3.10-win-64.conda.lock.yml index 909c2fee..41323b48 100644 --- a/environments/py-3.10-win-64.conda.lock.yml +++ b/environments/py-3.10-win-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py310h9e98ed7_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py310h9e98ed7_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -29,12 +29,12 @@ dependencies: - discretize=0.11.3=py310h3e8ed56_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py310h38315fa_0 + - fonttools=4.58.2=py310h38315fa_0 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py310h3e8ed56_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py310hd6dd405_101 + - h5py=3.14.0=nompi_py310h877c39c_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -48,9 +48,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -65,9 +65,9 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -138,13 +138,13 @@ dependencies: - yaml=0.2.5=h8ffe710_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py310ha8f682b_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.11-linux-64-dev.conda.lock.yml b/environments/py-3.11-linux-64-dev.conda.lock.yml index 1048f6b3..c550e8bc 100644 --- a/environments/py-3.11-linux-64-dev.conda.lock.yml +++ b/environments/py-3.11-linux-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py311hfdbb021_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py311hfdbb021_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -56,7 +56,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py311h2dc5d0c_0 + - fonttools=4.58.2=py311h2dc5d0c_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -64,7 +64,7 @@ dependencies: - greenlet=3.2.3=py311hfdbb021_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py311h38436b4_101 + - h5py=3.14.0=nompi_py311h7f87ba5_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -114,9 +114,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -135,13 +135,13 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - libsodium=1.0.20=h4ab18f5_0 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -231,7 +231,7 @@ dependencies: - readline=8.2=h8c095d6_2 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py311hdae7d1d_0 @@ -301,13 +301,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=h3b0a872_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py311h9ecbd09_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.11-linux-64.conda.lock.yml b/environments/py-3.11-linux-64.conda.lock.yml index 56d164f0..d9e9a7e3 100644 --- a/environments/py-3.11-linux-64.conda.lock.yml +++ b/environments/py-3.11-linux-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py311hfdbb021_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py311hfdbb021_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -31,12 +31,12 @@ dependencies: - discretize=0.11.3=py311h5b7b71f_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py311h2dc5d0c_0 + - fonttools=4.58.2=py311h2dc5d0c_0 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py311h5b7b71f_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py311h38436b4_101 + - h5py=3.14.0=nompi_py311h7f87ba5_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -52,9 +52,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -73,12 +73,12 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -152,13 +152,13 @@ dependencies: - yaml=0.2.5=h7f98852_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py311h9ecbd09_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.11-win-64-dev.conda.lock.yml b/environments/py-3.11-win-64-dev.conda.lock.yml index 522f6303..4a2286a8 100644 --- a/environments/py-3.11-win-64-dev.conda.lock.yml +++ b/environments/py-3.11-win-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py311hda3d55a_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py311hda3d55a_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -56,7 +56,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py311h5082efb_0 + - fonttools=4.58.2=py311h5082efb_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -64,7 +64,7 @@ dependencies: - greenlet=3.2.3=py311hda3d55a_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py311hc74fd12_101 + - h5py=3.14.0=nompi_py311h97e6cc2_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -112,9 +112,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -129,10 +129,10 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - libsodium=1.0.20=hc70643c_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -215,7 +215,7 @@ dependencies: - pyzmq=26.4.0=py311h484c95c_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py311hc4022dc_0 @@ -291,13 +291,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=ha9f60a1_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py311he736701_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.11-win-64.conda.lock.yml b/environments/py-3.11-win-64.conda.lock.yml index ac002220..0d709ab1 100644 --- a/environments/py-3.11-win-64.conda.lock.yml +++ b/environments/py-3.11-win-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py311hda3d55a_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py311hda3d55a_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -30,12 +30,12 @@ dependencies: - discretize=0.11.3=py311h9b10771_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py311h5082efb_0 + - fonttools=4.58.2=py311h5082efb_0 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py311h9b10771_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py311hc74fd12_101 + - h5py=3.14.0=nompi_py311h97e6cc2_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -49,9 +49,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -66,9 +66,9 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -140,13 +140,13 @@ dependencies: - yaml=0.2.5=h8ffe710_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py311he736701_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 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 1a8a04f7..6ce8b051 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py312h2ec8cdc_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py312h2ec8cdc_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -56,7 +56,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py312h178313f_0 + - fonttools=4.58.2=py312h178313f_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -64,7 +64,7 @@ dependencies: - greenlet=3.2.3=py312h2ec8cdc_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py312h01d377b_101 + - h5py=3.14.0=nompi_py312h3faca00_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -114,9 +114,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -135,13 +135,13 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - libsodium=1.0.20=h4ab18f5_0 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -231,7 +231,7 @@ dependencies: - readline=8.2=h8c095d6_2 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py312h680f630_0 @@ -301,13 +301,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=h3b0a872_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py312h66e93f0_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index f7825e65..d9c84d00 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=hb9d3cd8_2 - - brotli-bin=1.1.0=hb9d3cd8_2 - - brotli-python=1.1.0=py312h2ec8cdc_2 + - brotli=1.1.0=hb9d3cd8_3 + - brotli-bin=1.1.0=hb9d3cd8_3 + - brotli-python=1.1.0=py312h2ec8cdc_3 - bzip2=1.0.8=h4bc722e_7 - c-ares=1.34.5=hb9d3cd8_0 - ca-certificates=2025.4.26=hbd8a1cb_0 @@ -31,12 +31,12 @@ dependencies: - discretize=0.11.3=py312hc39e661_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py312h178313f_0 + - fonttools=4.58.2=py312h178313f_0 - freetype=2.13.3=ha770c72_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py312hc39e661_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py312h01d377b_101 + - h5py=3.14.0=nompi_py312h3faca00_100 - hdf5=1.14.6=nompi_h2d575fe_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -52,9 +52,9 @@ dependencies: - lerc=4.0.0=h0aef613_1 - libaec=1.1.3=h59595ed_0 - libblas=3.9.0=31_hfdb39a5_mkl - - libbrotlicommon=1.1.0=hb9d3cd8_2 - - libbrotlidec=1.1.0=hb9d3cd8_2 - - libbrotlienc=1.1.0=hb9d3cd8_2 + - libbrotlicommon=1.1.0=hb9d3cd8_3 + - libbrotlidec=1.1.0=hb9d3cd8_3 + - libbrotlienc=1.1.0=hb9d3cd8_3 - libcblas=3.9.0=31_h372d94f_mkl - libcurl=8.14.1=h332b0f4_0 - libdeflate=1.24=h86f0d12_0 @@ -73,12 +73,12 @@ dependencies: - libiconv=1.18=h4ce23a2_1 - libjpeg-turbo=3.1.0=hb9d3cd8_0 - liblapack=3.9.0=31_hc41d3b0_mkl - - liblzma=5.8.1=hb9d3cd8_1 + - liblzma=5.8.1=hb9d3cd8_2 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.47=h943b412_0 - libscotch=7.0.6=hea33c07_1 - - libsqlite=3.50.0=hee588c1_0 + - libsqlite=3.50.1=hee588c1_0 - libssh2=1.11.1=hcf80075_0 - libstdcxx=15.1.0=h8f9b012_2 - libstdcxx-ng=15.1.0=h4852527_2 @@ -152,13 +152,13 @@ dependencies: - yaml=0.2.5=h7f98852_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py312h66e93f0_2 - zstd=1.5.7=hb8e6e7a_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 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 700600e0..73237185 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -24,9 +24,9 @@ dependencies: - bleach=6.2.0=pyh29332c3_4 - bleach-with-css=6.2.0=h82add2a_4 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py312h275cf98_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py312h275cf98_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -56,7 +56,7 @@ dependencies: - exceptiongroup=1.3.0=pyhd8ed1ab_0 - executing=2.2.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py312h31fea79_0 + - fonttools=4.58.2=py312h31fea79_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 @@ -64,7 +64,7 @@ dependencies: - greenlet=3.2.3=py312h275cf98_0 - h11=0.16.0=pyhd8ed1ab_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py312h4e244af_101 + - h5py=3.14.0=nompi_py312h6cc2a29_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - httpcore=1.0.9=pyh29332c3_0 @@ -112,9 +112,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -129,10 +129,10 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - libsodium=1.0.20=hc70643c_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -215,7 +215,7 @@ dependencies: - pyzmq=26.4.0=py312hd7027bb_0 - readthedocs-sphinx-ext=2.2.5=pyhd8ed1ab_1 - referencing=0.36.2=pyh29332c3_0 - - requests=2.32.3=pyhd8ed1ab_1 + - requests=2.32.4=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rpds-py=0.25.1=py312h8422cdd_0 @@ -291,13 +291,13 @@ dependencies: - zarr=2.14.2=pyhd8ed1ab_0 - zeromq=4.3.5=ha9f60a1_7 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py312h4389bb4_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index e67b29f9..58dc0ef4 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -10,9 +10,9 @@ dependencies: - annotated-types=0.7.0=pyhd8ed1ab_1 - asciitree=0.3.3=py_2 - bokeh=3.6.3=pyhd8ed1ab_0 - - brotli=1.1.0=h2466b09_2 - - brotli-bin=1.1.0=h2466b09_2 - - brotli-python=1.1.0=py312h275cf98_2 + - brotli=1.1.0=h2466b09_3 + - brotli-bin=1.1.0=h2466b09_3 + - brotli-python=1.1.0=py312h275cf98_3 - bzip2=1.0.8=h2466b09_7 - ca-certificates=2025.4.26=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 @@ -30,12 +30,12 @@ dependencies: - discretize=0.11.3=py312hbaa7e33_0 - distributed=2025.3.0=pyhd8ed1ab_0 - fasteners=0.19=pyhd8ed1ab_1 - - fonttools=4.58.1=py312h31fea79_0 + - fonttools=4.58.2=py312h31fea79_0 - freetype=2.13.3=h57928b3_1 - fsspec=2025.5.1=pyhd8ed1ab_0 - geoana=0.7.2=py312hbaa7e33_0 - h2=4.2.0=pyhd8ed1ab_0 - - h5py=3.13.0=nompi_py312h4e244af_101 + - h5py=3.14.0=nompi_py312h6cc2a29_100 - hdf5=1.14.6=nompi_hd5d9e70_101 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 @@ -49,9 +49,9 @@ dependencies: - lerc=4.0.0=h6470a55_1 - libaec=1.1.3=h63175ca_0 - libblas=3.9.0=31_h641d27c_mkl - - libbrotlicommon=1.1.0=h2466b09_2 - - libbrotlidec=1.1.0=h2466b09_2 - - libbrotlienc=1.1.0=h2466b09_2 + - libbrotlicommon=1.1.0=h2466b09_3 + - libbrotlidec=1.1.0=h2466b09_3 + - libbrotlienc=1.1.0=h2466b09_3 - libcblas=3.9.0=31_h5e41251_mkl - libcurl=8.14.1=h88aaa65_0 - libdeflate=1.24=h76ddb4d_0 @@ -66,9 +66,9 @@ dependencies: - libiconv=1.18=h135ad9c_1 - libjpeg-turbo=3.1.0=h2466b09_0 - liblapack=3.9.0=31_h1aa476e_mkl - - liblzma=5.8.1=h2466b09_1 + - liblzma=5.8.1=h2466b09_2 - libpng=1.6.47=h7a4582a_0 - - libsqlite=3.50.0=h67fdade_0 + - libsqlite=3.50.1=h67fdade_0 - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.0=h05922d8_5 - libwebp-base=1.5.0=h3b0e114_0 @@ -140,13 +140,13 @@ dependencies: - yaml=0.2.5=h8ffe710_2 - zarr=2.14.2=pyhd8ed1ab_0 - zict=3.0.0=pyhd8ed1ab_1 - - zipp=3.22.0=pyhd8ed1ab_0 + - zipp=3.23.0=pyhd8ed1ab_0 - zstandard=0.23.0=py312h4389bb4_2 - zstd=1.5.7=hbeecb71_2 - pip: - - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@02fbd85bf7d54b8f4336f1f0094c1c3e27714e81 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@d5959a0e19b45a89eb8a02cd608bc8accb74adb7 diff --git a/py-3.10.conda-lock.yml b/py-3.10.conda-lock.yml index 54eb464f..1a472f53 100644 --- a/py-3.10.conda-lock.yml +++ b/py-3.10.conda-lock.yml @@ -535,10 +535,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda hash: - md5: 98514fe74548d768907ce7a13f680e8f - sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b + md5: 5d08a0ac29e6a5a984817584775d4131 + sha256: c969baaa5d7a21afb5ed4b8dd830f82b78e425caaa13d717766ed07a61630bec category: main optional: false - name: brotli @@ -552,10 +552,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_3.conda hash: - md5: 378f1c9421775dfe644731cb121c8979 - sha256: d8fd7d1b446706776117d2dcad1c0289b9f5e1521cb13405173bad38568dd252 + md5: c2a23d8a8986c72148c63bdf855ac99a + sha256: d57cd6ea705c9d2a8a2721f083de247501337e459f5498726b564cfca138e192 category: main optional: false - name: brotli-bin @@ -567,10 +567,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda hash: - md5: c63b5e52939e795ba8d26e35d767a843 - sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 + md5: 58178ef8ba927229fba6d84abf62c108 + sha256: ab74fa8c3d1ca0a055226be89e99d6798c65053e2d2d3c6cb380c574972cd4a7 category: main optional: false - name: brotli-bin @@ -583,10 +583,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_3.conda hash: - md5: d22534a9be5771fc58eb7564947f669d - sha256: f3bf2893613540ac256c68f211861c4de618d96291719e32178d894114ac2bc2 + md5: c7c345559c1ac25eede6dccb7b931202 + sha256: 85aac1c50a426be6d0cc9fd52480911d752f4082cb78accfdb257243e572c7eb category: main optional: false - name: brotli-python @@ -599,10 +599,10 @@ package: libstdcxx: '>=13' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda hash: - md5: bf502c169c71e3c6ac0d6175addfacc2 - sha256: 14f1e89d3888d560a553f40ac5ba83e4435a107552fa5b2b2029a7472554c1ef + md5: 63d24a5dd21c738d706f91569dbd1892 + sha256: 313cd446b1a42b55885741534800a1d69bd3816eeef662f41fc3ac26e16d537e category: main optional: false - name: brotli-python @@ -615,10 +615,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py310h9e98ed7_3.conda hash: - md5: 3a10a1d0cf3ece273195f26191fd6cc6 - sha256: 1b7893a07f2323410b09b63b4627103efa86163be835ac94966333b37741cdc7 + md5: 52d37d0f3a9286d295fbf72cf0aa99ee + sha256: 6eac109d40bd36d158064a552babc3da069662ad93712453eb43320f330b7c82 category: main optional: false - name: bzip2 @@ -1414,7 +1414,7 @@ package: category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: linux-64 dependencies: @@ -1425,14 +1425,14 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* unicodedata2: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.1-py310h89163eb_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.2-py310h89163eb_0.conda hash: - md5: f4f46207c6defa5ea17b0299298ba849 - sha256: 4478c8c3948d36e18b212de9fdc0c2654e4c380ab915d0aa130e7fafb7d123a2 + md5: 3af603de53814258a536b268ad2ae5ff + sha256: e01ccdcfcb6c6aa57fadee4475bbbf9a66fa942abc46a677a27926df851f1679 category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: win-64 dependencies: @@ -1444,10 +1444,10 @@ package: unicodedata2: '>=15.1.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.1-py310h38315fa_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.2-py310h38315fa_0.conda hash: - md5: 76a9c04ac1c23cee8b00733eb942f8e5 - sha256: 7ff47ff80fe7bce1a6695f717c6fdfc1a0bd3490b0bdaa6c2b5b3378555c5a16 + md5: b8f853b33c315e7cab172ab4303ecf06 + sha256: 85cf312fd1ebe07bae419b3b5a84fba72da077587d270046a1595ef8698177ee category: main optional: false - name: fqdn @@ -1651,7 +1651,7 @@ package: category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: linux-64 dependencies: @@ -1659,32 +1659,32 @@ package: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' libgcc: '>=13' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* - url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.13.0-nompi_py310h2a0e991_101.conda + url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.14.0-nompi_py310hea1e86d_100.conda hash: - md5: 5b603121de5b7e3f59ff4b051e6d81e1 - sha256: 5caf8567d9b73fb06501484d80d0e43eab46975b9573ec1346066c2e6848089a + md5: f6879e3fc12006cffde701eb08ce1f09 + sha256: 8c7d6fea5345596f1fbef21b99fbc04cef6e7cfa5023619232da52fab80b554f category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: win-64 dependencies: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.13.0-nompi_py310hd6dd405_101.conda + url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.14.0-nompi_py310h877c39c_100.conda hash: - md5: a15a47ee280b57c98ed3500c0ac36d5a - sha256: 09b7d7bfd58523ed9527ffd7ec3b155d429a0258d4c9639cb1050adc5cb4d8d3 + md5: 5b861086c5a7689a6d95c4df10d211e4 + sha256: 754155af401cb3577c3e76ed7a4427ad9928c210d32b8571f84492c54b67f5a4 category: main optional: false - name: hdf5 @@ -3184,10 +3184,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda hash: - md5: 41b599ed2b02abcfdd84302bff174b23 - sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: cb98af5db26e3f482bebb80ce9d947d3 + sha256: 462a8ed6a7bb9c5af829ec4b90aab322f8bcd9d8987f793e6986ea873bbd05cf category: main optional: false - name: libbrotlicommon @@ -3198,10 +3198,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_3.conda hash: - md5: f7dc9a8f21d74eab46456df301da2972 - sha256: 33e8851c6cc8e2d93059792cd65445bfe6be47e4782f826f01593898ec95764c + md5: cf20c8b8b48ab5252ec64b9c66bfe0a4 + sha256: e70ea4b773fadddda697306a80a29d9cbd36b7001547cd54cbfe9a97a518993f category: main optional: false - name: libbrotlidec @@ -3212,10 +3212,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda hash: - md5: 9566f0bd264fbd463002e759b8a82401 - sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 1c6eecffad553bde44c5238770cfb7da + sha256: 3eb27c1a589cbfd83731be7c3f19d6d679c7a444c3ba19db6ad8bf49172f3d83 category: main optional: false - name: libbrotlidec @@ -3227,10 +3227,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_3.conda hash: - md5: 9bae75ce723fa34e98e239d21d752a7e - sha256: 234fc92f4c4f1cf22f6464b2b15bfc872fa583c74bf3ab9539ff38892c43612f + md5: a342933dbc6d814541234c7c81cb5205 + sha256: a35a0db7e3257e011b10ffb371735b2b24074412d0b27c3dab7ca9f2c549cfcf category: main optional: false - name: libbrotlienc @@ -3241,10 +3241,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda hash: - md5: 06f70867945ea6a84d35836af780f1de - sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 3facafe58f3858eb95527c7d3a3fc578 + sha256: 76e8492b0b0a0d222bfd6081cae30612aa9915e4309396fdca936528ccf314b7 category: main optional: false - name: libbrotlienc @@ -3256,10 +3256,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_3.conda hash: - md5: 85741a24d97954a991e55e34bc55990b - sha256: 3d0dd7ef505962f107b7ea8f894e0b3dd01bf46852b362c8a7fc136b039bc9e1 + md5: 7ef0af55d70cbd9de324bb88b7f9d81e + sha256: 9d0703c5a01c10d346587ff0535a0eb81042364333caa4a24a0e4a0c08fd490b category: main optional: false - name: libcblas @@ -3701,10 +3701,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda hash: - md5: a76fd702c93cd2dfd89eff30a5fd45a8 - sha256: eeff241bddc8f1b87567dd6507c9f441f7f472c27f0860a07628260c000ef27c + md5: 1a580f7796c7bf6393fddb8bbbde58dc + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 category: main optional: false - name: liblzma @@ -3715,10 +3715,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda hash: - md5: 14a1042c163181e143a7522dfb8ad6ab - sha256: adbf6c7bde70536ada734a81b8b5aa23654f2b95445204404622e0cc40e921a0 + md5: c15148b2e18da456f5108ccb5e411446 + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc category: main optional: false - name: libnghttp2 @@ -3825,31 +3825,31 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda hash: - md5: 71888e92098d0f8c41b09a671ad289bc - sha256: b3dcd409c96121c011387bdf7f4b5758d876feeb9d8e3cfc32285b286931d0a7 + md5: 96a7e36bff29f1d0ddf5b771e0da373a + sha256: cd15ab1b9f0d53507e7ad7a01e52f6756ab3080bf623ab0e438973b6e4dba3c0 category: main optional: false - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.0-h67fdade_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.1-h67fdade_0.conda hash: - md5: 92b11b0b2120d563caa1629928122cee - sha256: 92546e3ea213ee7b11385b22ea4e7c69bbde1c25586288765b37bc5e96b20dd9 + md5: 0e11a893eeeb46510520fd3fdd9c346a + sha256: 0dda5b3f21ad2c7e823f21b0e173194347fbfccb73a06ddc9366da1877020bda category: main optional: false - name: libssh2 @@ -6427,7 +6427,7 @@ package: category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: linux-64 dependencies: @@ -6436,14 +6436,14 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: win-64 dependencies: @@ -6452,10 +6452,10 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: rfc3339-validator @@ -8376,27 +8376,27 @@ package: category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zstandard @@ -8471,12 +8471,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoapps-utils @@ -8488,12 +8488,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoh5py @@ -8505,12 +8505,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: geoh5py @@ -8522,16 +8522,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: linux-64 dependencies: @@ -8543,16 +8543,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: win-64 dependencies: @@ -8564,12 +8564,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: octree-creation-app diff --git a/py-3.11.conda-lock.yml b/py-3.11.conda-lock.yml index ad92f741..45bd452a 100644 --- a/py-3.11.conda-lock.yml +++ b/py-3.11.conda-lock.yml @@ -533,10 +533,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda hash: - md5: 98514fe74548d768907ce7a13f680e8f - sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b + md5: 5d08a0ac29e6a5a984817584775d4131 + sha256: c969baaa5d7a21afb5ed4b8dd830f82b78e425caaa13d717766ed07a61630bec category: main optional: false - name: brotli @@ -550,10 +550,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_3.conda hash: - md5: 378f1c9421775dfe644731cb121c8979 - sha256: d8fd7d1b446706776117d2dcad1c0289b9f5e1521cb13405173bad38568dd252 + md5: c2a23d8a8986c72148c63bdf855ac99a + sha256: d57cd6ea705c9d2a8a2721f083de247501337e459f5498726b564cfca138e192 category: main optional: false - name: brotli-bin @@ -565,10 +565,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda hash: - md5: c63b5e52939e795ba8d26e35d767a843 - sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 + md5: 58178ef8ba927229fba6d84abf62c108 + sha256: ab74fa8c3d1ca0a055226be89e99d6798c65053e2d2d3c6cb380c574972cd4a7 category: main optional: false - name: brotli-bin @@ -581,10 +581,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_3.conda hash: - md5: d22534a9be5771fc58eb7564947f669d - sha256: f3bf2893613540ac256c68f211861c4de618d96291719e32178d894114ac2bc2 + md5: c7c345559c1ac25eede6dccb7b931202 + sha256: 85aac1c50a426be6d0cc9fd52480911d752f4082cb78accfdb257243e572c7eb category: main optional: false - name: brotli-python @@ -597,10 +597,10 @@ package: libstdcxx: '>=13' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda hash: - md5: d21daab070d76490cb39a8f1d1729d79 - sha256: 949913bbd1f74d1af202d3e4bff2e0a4e792ec00271dc4dd08641d4221aa2e12 + md5: 8565f7297b28af62e5de2d968ca32e31 + sha256: 4fab04fcc599853efb2904ea3f935942108613c7515f7dd57e7f034650738c52 category: main optional: false - name: brotli-python @@ -613,10 +613,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py311hda3d55a_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py311hda3d55a_3.conda hash: - md5: a0ea2839841a06740a1c110ba3317b42 - sha256: aa3ac5dbf63db2f145235708973c626c2189ee4040d769fdf0076286fa45dc26 + md5: 2d99144abeb3b6b65608fdd7810dbcbd + sha256: a602b15fe1b3a6b40aab7d99099a410b69ccad9bb273779531cef00fc52d762e category: main optional: false - name: bzip2 @@ -1438,7 +1438,7 @@ package: category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: linux-64 dependencies: @@ -1449,14 +1449,14 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* unicodedata2: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.1-py311h2dc5d0c_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.2-py311h2dc5d0c_0.conda hash: - md5: 9af5d6c8703be9bbe200aeae13a5e6ef - sha256: 8ef83f209dfc3f5b808e583bedd129ca95c9f2cb72645540e01d90f82bde9e0d + md5: c58ce3ab3833471964d7ee6b83203425 + sha256: 50a028c44427d51c467905d01129f0ca234007359331282aac374370e1e2e158 category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: win-64 dependencies: @@ -1468,10 +1468,10 @@ package: unicodedata2: '>=15.1.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.1-py311h5082efb_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.2-py311h5082efb_0.conda hash: - md5: 88930bd9938a31990c3b9b0f86930e57 - sha256: c806a73ae3fe27c3ff4fd7a564632d617aa630ec856e5289bb22936fe78355e5 + md5: b2aa1abdfadfdf8deb04ac6a9b64e11d + sha256: 40d319bdb90178680e91046dce7cbdb1764489e7ba7efad4ecc2d9cd00690f18 category: main optional: false - name: fqdn @@ -1675,7 +1675,7 @@ package: category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: linux-64 dependencies: @@ -1683,32 +1683,32 @@ package: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' libgcc: '>=13' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* - url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.13.0-nompi_py311h38436b4_101.conda + url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.14.0-nompi_py311h7f87ba5_100.conda hash: - md5: 0a24ff81763ff208d8485354cb9d347e - sha256: 7c4586e214e4844c6115032a2db43bbcf3aa059374ba691fce57acd51e156d44 + md5: ecfcdeb88c8727f3cf67e1177528a498 + sha256: cd2bd076c9d9bd8d8021698159e694a8600d8349e3208719c422af2c86b9c184 category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: win-64 dependencies: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.13.0-nompi_py311hc74fd12_101.conda + url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.14.0-nompi_py311h97e6cc2_100.conda hash: - md5: 4495f7a36edc99f21d3f8d1ba03734eb - sha256: 7ba0e3e3eb85a0a158dfdf97aa6bf5f66d5aee116339ad187a617cc78ce3467f + md5: f806b981514c8d3e567a2b7d5a8569ff + sha256: 600c7089e5fd40d9592d2d881192052b8c6df5f3afe9cd5e51fb8ef2bc8df1bc category: main optional: false - name: hdf5 @@ -3236,10 +3236,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda hash: - md5: 41b599ed2b02abcfdd84302bff174b23 - sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: cb98af5db26e3f482bebb80ce9d947d3 + sha256: 462a8ed6a7bb9c5af829ec4b90aab322f8bcd9d8987f793e6986ea873bbd05cf category: main optional: false - name: libbrotlicommon @@ -3250,10 +3250,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_3.conda hash: - md5: f7dc9a8f21d74eab46456df301da2972 - sha256: 33e8851c6cc8e2d93059792cd65445bfe6be47e4782f826f01593898ec95764c + md5: cf20c8b8b48ab5252ec64b9c66bfe0a4 + sha256: e70ea4b773fadddda697306a80a29d9cbd36b7001547cd54cbfe9a97a518993f category: main optional: false - name: libbrotlidec @@ -3264,10 +3264,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda hash: - md5: 9566f0bd264fbd463002e759b8a82401 - sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 1c6eecffad553bde44c5238770cfb7da + sha256: 3eb27c1a589cbfd83731be7c3f19d6d679c7a444c3ba19db6ad8bf49172f3d83 category: main optional: false - name: libbrotlidec @@ -3279,10 +3279,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_3.conda hash: - md5: 9bae75ce723fa34e98e239d21d752a7e - sha256: 234fc92f4c4f1cf22f6464b2b15bfc872fa583c74bf3ab9539ff38892c43612f + md5: a342933dbc6d814541234c7c81cb5205 + sha256: a35a0db7e3257e011b10ffb371735b2b24074412d0b27c3dab7ca9f2c549cfcf category: main optional: false - name: libbrotlienc @@ -3293,10 +3293,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda hash: - md5: 06f70867945ea6a84d35836af780f1de - sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 3facafe58f3858eb95527c7d3a3fc578 + sha256: 76e8492b0b0a0d222bfd6081cae30612aa9915e4309396fdca936528ccf314b7 category: main optional: false - name: libbrotlienc @@ -3308,10 +3308,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_3.conda hash: - md5: 85741a24d97954a991e55e34bc55990b - sha256: 3d0dd7ef505962f107b7ea8f894e0b3dd01bf46852b362c8a7fc136b039bc9e1 + md5: 7ef0af55d70cbd9de324bb88b7f9d81e + sha256: 9d0703c5a01c10d346587ff0535a0eb81042364333caa4a24a0e4a0c08fd490b category: main optional: false - name: libcblas @@ -3753,10 +3753,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda hash: - md5: a76fd702c93cd2dfd89eff30a5fd45a8 - sha256: eeff241bddc8f1b87567dd6507c9f441f7f472c27f0860a07628260c000ef27c + md5: 1a580f7796c7bf6393fddb8bbbde58dc + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 category: main optional: false - name: liblzma @@ -3767,10 +3767,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda hash: - md5: 14a1042c163181e143a7522dfb8ad6ab - sha256: adbf6c7bde70536ada734a81b8b5aa23654f2b95445204404622e0cc40e921a0 + md5: c15148b2e18da456f5108ccb5e411446 + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc category: main optional: false - name: libnghttp2 @@ -3877,31 +3877,31 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda hash: - md5: 71888e92098d0f8c41b09a671ad289bc - sha256: b3dcd409c96121c011387bdf7f4b5758d876feeb9d8e3cfc32285b286931d0a7 + md5: 96a7e36bff29f1d0ddf5b771e0da373a + sha256: cd15ab1b9f0d53507e7ad7a01e52f6756ab3080bf623ab0e438973b6e4dba3c0 category: main optional: false - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.0-h67fdade_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.1-h67fdade_0.conda hash: - md5: 92b11b0b2120d563caa1629928122cee - sha256: 92546e3ea213ee7b11385b22ea4e7c69bbde1c25586288765b37bc5e96b20dd9 + md5: 0e11a893eeeb46510520fd3fdd9c346a + sha256: 0dda5b3f21ad2c7e823f21b0e173194347fbfccb73a06ddc9366da1877020bda category: main optional: false - name: libssh2 @@ -6481,7 +6481,7 @@ package: category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: linux-64 dependencies: @@ -6490,14 +6490,14 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: win-64 dependencies: @@ -6506,10 +6506,10 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: rfc3339-validator @@ -8461,27 +8461,27 @@ package: category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zstandard @@ -8556,12 +8556,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoapps-utils @@ -8573,12 +8573,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoh5py @@ -8590,12 +8590,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: geoh5py @@ -8607,16 +8607,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: linux-64 dependencies: @@ -8628,16 +8628,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: win-64 dependencies: @@ -8649,12 +8649,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: octree-creation-app diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 764d1f5f..3aa26912 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -533,10 +533,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda hash: - md5: 98514fe74548d768907ce7a13f680e8f - sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b + md5: 5d08a0ac29e6a5a984817584775d4131 + sha256: c969baaa5d7a21afb5ed4b8dd830f82b78e425caaa13d717766ed07a61630bec category: main optional: false - name: brotli @@ -550,10 +550,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-1.1.0-h2466b09_3.conda hash: - md5: 378f1c9421775dfe644731cb121c8979 - sha256: d8fd7d1b446706776117d2dcad1c0289b9f5e1521cb13405173bad38568dd252 + md5: c2a23d8a8986c72148c63bdf855ac99a + sha256: d57cd6ea705c9d2a8a2721f083de247501337e459f5498726b564cfca138e192 category: main optional: false - name: brotli-bin @@ -565,10 +565,10 @@ package: libbrotlidec: 1.1.0 libbrotlienc: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda hash: - md5: c63b5e52939e795ba8d26e35d767a843 - sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 + md5: 58178ef8ba927229fba6d84abf62c108 + sha256: ab74fa8c3d1ca0a055226be89e99d6798c65053e2d2d3c6cb380c574972cd4a7 category: main optional: false - name: brotli-bin @@ -581,10 +581,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-bin-1.1.0-h2466b09_3.conda hash: - md5: d22534a9be5771fc58eb7564947f669d - sha256: f3bf2893613540ac256c68f211861c4de618d96291719e32178d894114ac2bc2 + md5: c7c345559c1ac25eede6dccb7b931202 + sha256: 85aac1c50a426be6d0cc9fd52480911d752f4082cb78accfdb257243e572c7eb category: main optional: false - name: brotli-python @@ -597,10 +597,10 @@ package: libstdcxx: '>=13' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda hash: - md5: b0b867af6fc74b2a0aa206da29c0f3cf - sha256: f2a59ccd20b4816dea9a2a5cb917eb69728271dbf1aeab4e1b7e609330a50b6f + md5: a32e0c069f6c3dcac635f7b0b0dac67e + sha256: dc27c58dc717b456eee2d57d8bc71df3f562ee49368a2351103bc8f1b67da251 category: main optional: false - name: brotli-python @@ -613,10 +613,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py312h275cf98_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/brotli-python-1.1.0-py312h275cf98_3.conda hash: - md5: a99aec1ac46794a5fb1cd3cf5d2b6110 - sha256: f83baa6f6bcba7b73f6921d5c1aa95ffc5d8b246ade933ade79250de0a4c9c4c + md5: a87a39f9eb9fd5f171b13d8c79f7a99a + sha256: d5c18a90220853c86f7cc23db62b32b22c6c5fe5d632bc111fc1e467c9fd776f category: main optional: false - name: bzip2 @@ -1438,7 +1438,7 @@ package: category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: linux-64 dependencies: @@ -1449,14 +1449,14 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* unicodedata2: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.1-py312h178313f_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/fonttools-4.58.2-py312h178313f_0.conda hash: - md5: 59ac6c124428928a1a41691eedf2b3bd - sha256: e393557ad5ca31f71ec59da7035eea0d8d9a87ef1807fda832d2953112e71588 + md5: 286068e5706fa6eacce413a594cf0d4b + sha256: aa2dbfcc173c1fe4e0e1c54ff07e98f36edfc6bbbd7e49ea9ff60541d37e648d category: main optional: false - name: fonttools - version: 4.58.1 + version: 4.58.2 manager: conda platform: win-64 dependencies: @@ -1468,10 +1468,10 @@ package: unicodedata2: '>=15.1.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.1-py312h31fea79_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/fonttools-4.58.2-py312h31fea79_0.conda hash: - md5: fbe3cbbe4fc661f033725bd9a958bb52 - sha256: 67721282cc0cad4b9d2fb1a6a9987b3090cd6c5a516ffef293e4f8181556c20a + md5: 300dfab2dac1c966c6fc52c2ee442287 + sha256: a314886c4a0baaf00526ded33104fd09fd7044393395f24fd33696beee601c4d category: main optional: false - name: fqdn @@ -1675,7 +1675,7 @@ package: category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: linux-64 dependencies: @@ -1683,32 +1683,32 @@ package: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' libgcc: '>=13' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* - url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.13.0-nompi_py312h01d377b_101.conda + url: https://repo.prefix.dev/conda-forge/linux-64/h5py-3.14.0-nompi_py312h3faca00_100.conda hash: - md5: ea7ee61f4c0dc9c155e22bfae306e42f - sha256: f31fb94114cc5826cd32f8d227ffccd63b2ec3fd10c6d3a1181d35bc8da9d88a + md5: 2e1c2a9e706c74c4dd6f990a680f3f90 + sha256: 9d23b72ee1138e14d379bb4c415cfdfc6944824e1844ff16ebf44e0defd1eddc category: main optional: false - name: h5py - version: 3.13.0 + version: 3.14.0 manager: conda platform: win-64 dependencies: cached-property: '' hdf5: '>=1.14.6,<1.14.7.0a0' - numpy: '>=1.19,<3' + numpy: '>=1.21,<3' python: '>=3.12,<3.13.0a0' python_abi: 3.12.* ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.13.0-nompi_py312h4e244af_101.conda + url: https://repo.prefix.dev/conda-forge/win-64/h5py-3.14.0-nompi_py312h6cc2a29_100.conda hash: - md5: 5b949c5099bb9fc1f8382f23c66fefcd - sha256: 7fbca39e04fade12fb7de01ae640916f897c6fe7fbb4e7bf3d3b67f898d185fb + md5: 7505235f79c9deb9e69fba7cca1a7c97 + sha256: 836d84ebf958e74a154406e785b32c973eaad12163f1b7dae2c0448626acea9c category: main optional: false - name: hdf5 @@ -3236,10 +3236,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda hash: - md5: 41b599ed2b02abcfdd84302bff174b23 - sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: cb98af5db26e3f482bebb80ce9d947d3 + sha256: 462a8ed6a7bb9c5af829ec4b90aab322f8bcd9d8987f793e6986ea873bbd05cf category: main optional: false - name: libbrotlicommon @@ -3250,10 +3250,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlicommon-1.1.0-h2466b09_3.conda hash: - md5: f7dc9a8f21d74eab46456df301da2972 - sha256: 33e8851c6cc8e2d93059792cd65445bfe6be47e4782f826f01593898ec95764c + md5: cf20c8b8b48ab5252ec64b9c66bfe0a4 + sha256: e70ea4b773fadddda697306a80a29d9cbd36b7001547cd54cbfe9a97a518993f category: main optional: false - name: libbrotlidec @@ -3264,10 +3264,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda hash: - md5: 9566f0bd264fbd463002e759b8a82401 - sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 1c6eecffad553bde44c5238770cfb7da + sha256: 3eb27c1a589cbfd83731be7c3f19d6d679c7a444c3ba19db6ad8bf49172f3d83 category: main optional: false - name: libbrotlidec @@ -3279,10 +3279,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlidec-1.1.0-h2466b09_3.conda hash: - md5: 9bae75ce723fa34e98e239d21d752a7e - sha256: 234fc92f4c4f1cf22f6464b2b15bfc872fa583c74bf3ab9539ff38892c43612f + md5: a342933dbc6d814541234c7c81cb5205 + sha256: a35a0db7e3257e011b10ffb371735b2b24074412d0b27c3dab7ca9f2c549cfcf category: main optional: false - name: libbrotlienc @@ -3293,10 +3293,10 @@ package: __glibc: '>=2.17,<3.0.a0' libbrotlicommon: 1.1.0 libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda hash: - md5: 06f70867945ea6a84d35836af780f1de - sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 3facafe58f3858eb95527c7d3a3fc578 + sha256: 76e8492b0b0a0d222bfd6081cae30612aa9915e4309396fdca936528ccf314b7 category: main optional: false - name: libbrotlienc @@ -3308,10 +3308,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/libbrotlienc-1.1.0-h2466b09_3.conda hash: - md5: 85741a24d97954a991e55e34bc55990b - sha256: 3d0dd7ef505962f107b7ea8f894e0b3dd01bf46852b362c8a7fc136b039bc9e1 + md5: 7ef0af55d70cbd9de324bb88b7f9d81e + sha256: 9d0703c5a01c10d346587ff0535a0eb81042364333caa4a24a0e4a0c08fd490b category: main optional: false - name: libcblas @@ -3753,10 +3753,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda + url: https://repo.prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda hash: - md5: a76fd702c93cd2dfd89eff30a5fd45a8 - sha256: eeff241bddc8f1b87567dd6507c9f441f7f472c27f0860a07628260c000ef27c + md5: 1a580f7796c7bf6393fddb8bbbde58dc + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 category: main optional: false - name: liblzma @@ -3767,10 +3767,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_1.conda + url: https://repo.prefix.dev/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda hash: - md5: 14a1042c163181e143a7522dfb8ad6ab - sha256: adbf6c7bde70536ada734a81b8b5aa23654f2b95445204404622e0cc40e921a0 + md5: c15148b2e18da456f5108ccb5e411446 + sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc category: main optional: false - name: libnghttp2 @@ -3877,31 +3877,31 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda hash: - md5: 71888e92098d0f8c41b09a671ad289bc - sha256: b3dcd409c96121c011387bdf7f4b5758d876feeb9d8e3cfc32285b286931d0a7 + md5: 96a7e36bff29f1d0ddf5b771e0da373a + sha256: cd15ab1b9f0d53507e7ad7a01e52f6756ab3080bf623ab0e438973b6e4dba3c0 category: main optional: false - name: libsqlite - version: 3.50.0 + version: 3.50.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.0-h67fdade_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/libsqlite-3.50.1-h67fdade_0.conda hash: - md5: 92b11b0b2120d563caa1629928122cee - sha256: 92546e3ea213ee7b11385b22ea4e7c69bbde1c25586288765b37bc5e96b20dd9 + md5: 0e11a893eeeb46510520fd3fdd9c346a + sha256: 0dda5b3f21ad2c7e823f21b0e173194347fbfccb73a06ddc9366da1877020bda category: main optional: false - name: libssh2 @@ -6481,7 +6481,7 @@ package: category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: linux-64 dependencies: @@ -6490,14 +6490,14 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: requests - version: 2.32.3 + version: 2.32.4 manager: conda platform: win-64 dependencies: @@ -6506,10 +6506,10 @@ package: idna: '>=2.5,<4' python: '>=3.9' urllib3: '>=1.21.1,<3' - url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda + url: https://repo.prefix.dev/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda hash: - md5: a9b9368f3701a417eac9edbcae7cb737 - sha256: d701ca1136197aa121bbbe0e8c18db6b5c94acbd041c2b43c70e5ae104e1d8ad + md5: f6082eae112814f1447b56a5e1f6ed05 + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 category: dev optional: true - name: rfc3339-validator @@ -8461,27 +8461,27 @@ package: category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zipp - version: 3.22.0 + version: 3.23.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda hash: - md5: 234be740b00b8e41567e5b0ed95aaba9 - sha256: 3f7a58ff4ff1d337d56af0641a7eba34e7eea0bf32e49934c96ee171640f620b + md5: df5e78d904988eb55042c0c97446079f + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad category: main optional: false - name: zstandard @@ -8556,12 +8556,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoapps-utils @@ -8573,12 +8573,12 @@ package: numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 hash: - sha256: 3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + sha256: 8d46ccb686e4206683862ec803fc709b26271cd8 source: type: url - url: git+https://github.com/MiraGeoscience/geoapps-utils.git@3deb5f2d2cd1ee39e796fa30a5fcff899e635ba0 + url: git+https://github.com/MiraGeoscience/geoapps-utils.git@8d46ccb686e4206683862ec803fc709b26271cd8 category: main optional: false - name: geoh5py @@ -8590,12 +8590,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: geoh5py @@ -8607,16 +8607,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 hash: - sha256: 2b2b72f906d85bf460292f66e763ff2331017b02 + sha256: 585c89094e3eff35df10d3076964bf154b24d575 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@2b2b72f906d85bf460292f66e763ff2331017b02 + url: git+https://github.com/MiraGeoscience/geoh5py.git@585c89094e3eff35df10d3076964bf154b24d575 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: linux-64 dependencies: @@ -8628,16 +8628,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: mira-simpeg - version: 0.23.0.1a5.dev28+g447de6c5c + version: 0.23.0.1a5.dev33+gf72a1367e manager: pip platform: win-64 dependencies: @@ -8649,12 +8649,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 hash: - sha256: 447de6c5c257883c4eea045cb3372bf6a1051ad1 + sha256: f72a1367edcb2da969002ca06f18f532340b3c27 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@447de6c5c257883c4eea045cb3372bf6a1051ad1 + url: git+https://github.com/MiraGeoscience/simpeg.git@f72a1367edcb2da969002ca06f18f532340b3c27 category: main optional: false - name: octree-creation-app diff --git a/simpeg_drivers-assets/uijson/direct_current_2d_forward.ui.json b/simpeg_drivers-assets/uijson/direct_current_2d_forward.ui.json index 5fd3ef84..b46df77d 100644 --- a/simpeg_drivers-assets/uijson/direct_current_2d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_2d_forward.ui.json @@ -175,7 +175,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/direct_current_2d_inversion.ui.json b/simpeg_drivers-assets/uijson/direct_current_2d_inversion.ui.json index 5b0d3ccf..b7ae8fab 100644 --- a/simpeg_drivers-assets/uijson/direct_current_2d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_2d_inversion.ui.json @@ -342,7 +342,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function." }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/direct_current_3d_forward.ui.json b/simpeg_drivers-assets/uijson/direct_current_3d_forward.ui.json index d262e4b6..a4448f10 100644 --- a/simpeg_drivers-assets/uijson/direct_current_3d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_3d_forward.ui.json @@ -104,7 +104,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/direct_current_3d_inversion.ui.json b/simpeg_drivers-assets/uijson/direct_current_3d_inversion.ui.json index 77346710..c2701f7c 100644 --- a/simpeg_drivers-assets/uijson/direct_current_3d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_3d_inversion.ui.json @@ -312,7 +312,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/direct_current_batch2d_forward.ui.json b/simpeg_drivers-assets/uijson/direct_current_batch2d_forward.ui.json index d4502c29..d9fb5357 100644 --- a/simpeg_drivers-assets/uijson/direct_current_batch2d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_batch2d_forward.ui.json @@ -158,7 +158,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/direct_current_batch2d_inversion.ui.json b/simpeg_drivers-assets/uijson/direct_current_batch2d_inversion.ui.json index f798ead5..9de22370 100644 --- a/simpeg_drivers-assets/uijson/direct_current_batch2d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/direct_current_batch2d_inversion.ui.json @@ -324,7 +324,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/fdem1d_forward.ui.json b/simpeg_drivers-assets/uijson/fdem1d_forward.ui.json index 399943c5..55e08aec 100644 --- a/simpeg_drivers-assets/uijson/fdem1d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/fdem1d_forward.ui.json @@ -157,7 +157,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/fdem1d_inversion.ui.json b/simpeg_drivers-assets/uijson/fdem1d_inversion.ui.json index e163fe82..56f7a54c 100644 --- a/simpeg_drivers-assets/uijson/fdem1d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/fdem1d_inversion.ui.json @@ -347,7 +347,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/fdem_forward.ui.json b/simpeg_drivers-assets/uijson/fdem_forward.ui.json index 9e9fd756..191bfc00 100644 --- a/simpeg_drivers-assets/uijson/fdem_forward.ui.json +++ b/simpeg_drivers-assets/uijson/fdem_forward.ui.json @@ -117,7 +117,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/fdem_inversion.ui.json b/simpeg_drivers-assets/uijson/fdem_inversion.ui.json index 2254cbab..7d601306 100644 --- a/simpeg_drivers-assets/uijson/fdem_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/fdem_inversion.ui.json @@ -348,7 +348,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/gravity_forward.ui.json b/simpeg_drivers-assets/uijson/gravity_forward.ui.json index be3dcfb6..429b7842 100644 --- a/simpeg_drivers-assets/uijson/gravity_forward.ui.json +++ b/simpeg_drivers-assets/uijson/gravity_forward.ui.json @@ -7,7 +7,6 @@ "run_command": "simpeg_drivers.driver", "geoh5": "", "monitoring_directory": "", - "workspace_geoh5": "", "inversion_type": "gravity", "forward_only": true, "physical_property": "density", @@ -161,7 +160,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/gravity_inversion.ui.json b/simpeg_drivers-assets/uijson/gravity_inversion.ui.json index 5efc0c32..73266d23 100644 --- a/simpeg_drivers-assets/uijson/gravity_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/gravity_inversion.ui.json @@ -7,7 +7,6 @@ "run_command": "simpeg_drivers.driver", "geoh5": "", "monitoring_directory": "", - "workspace_geoh5": "", "inversion_type": "gravity", "forward_only": false, "physical_property": "density", @@ -582,7 +581,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_2d_forward.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_2d_forward.ui.json index fa99cfca..471faf4a 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_2d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_2d_forward.ui.json @@ -187,7 +187,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_2d_inversion.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_2d_inversion.ui.json index 6294ff19..28174987 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_2d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_2d_inversion.ui.json @@ -353,7 +353,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function." }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_3d_forward.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_3d_forward.ui.json index c884fb90..c8fd9d36 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_3d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_3d_forward.ui.json @@ -120,7 +120,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_3d_inversion.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_3d_inversion.ui.json index 72871576..ca6acf7d 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_3d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_3d_inversion.ui.json @@ -328,7 +328,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_batch2d_forward.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_batch2d_forward.ui.json index 235a93ec..1cc1505a 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_batch2d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_batch2d_forward.ui.json @@ -169,7 +169,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/induced_polarization_batch2d_inversion.ui.json b/simpeg_drivers-assets/uijson/induced_polarization_batch2d_inversion.ui.json index 30dc2be9..f34894ce 100644 --- a/simpeg_drivers-assets/uijson/induced_polarization_batch2d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/induced_polarization_batch2d_inversion.ui.json @@ -336,7 +336,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/joint_cross_gradient_inversion.ui.json b/simpeg_drivers-assets/uijson/joint_cross_gradient_inversion.ui.json index 5b448f2c..18e8234f 100644 --- a/simpeg_drivers-assets/uijson/joint_cross_gradient_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/joint_cross_gradient_inversion.ui.json @@ -238,7 +238,6 @@ "lineEdit": false, "enabled": false }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/joint_petrophysics_inversion.ui.json b/simpeg_drivers-assets/uijson/joint_petrophysics_inversion.ui.json index 95d201b5..7ab7d224 100644 --- a/simpeg_drivers-assets/uijson/joint_petrophysics_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/joint_petrophysics_inversion.ui.json @@ -7,7 +7,6 @@ "run_command": "simpeg_drivers.driver", "geoh5": "", "monitoring_directory": "", - "workspace_geoh5": "", "group_a": { "main": true, "group": "Joint", @@ -222,7 +221,6 @@ "lineEdit": false, "enabled": false }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/joint_surveys_inversion.ui.json b/simpeg_drivers-assets/uijson/joint_surveys_inversion.ui.json index 8918b092..2ffd200c 100644 --- a/simpeg_drivers-assets/uijson/joint_surveys_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/joint_surveys_inversion.ui.json @@ -317,7 +317,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/magnetic_scalar_forward.ui.json b/simpeg_drivers-assets/uijson/magnetic_scalar_forward.ui.json index b2a40f85..cb27d889 100644 --- a/simpeg_drivers-assets/uijson/magnetic_scalar_forward.ui.json +++ b/simpeg_drivers-assets/uijson/magnetic_scalar_forward.ui.json @@ -190,7 +190,6 @@ "property": "", "value": 0.0001 }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/magnetic_scalar_inversion.ui.json b/simpeg_drivers-assets/uijson/magnetic_scalar_inversion.ui.json index 8ba44d51..51a372b6 100644 --- a/simpeg_drivers-assets/uijson/magnetic_scalar_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/magnetic_scalar_inversion.ui.json @@ -613,7 +613,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/magnetic_vector_forward.ui.json b/simpeg_drivers-assets/uijson/magnetic_vector_forward.ui.json index 96e140ce..674168ce 100644 --- a/simpeg_drivers-assets/uijson/magnetic_vector_forward.ui.json +++ b/simpeg_drivers-assets/uijson/magnetic_vector_forward.ui.json @@ -222,7 +222,6 @@ "property": "", "value": 0.0 }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/magnetic_vector_inversion.ui.json b/simpeg_drivers-assets/uijson/magnetic_vector_inversion.ui.json index 4e2e9aeb..0f43ece5 100644 --- a/simpeg_drivers-assets/uijson/magnetic_vector_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/magnetic_vector_inversion.ui.json @@ -678,7 +678,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/magnetotellurics_forward.ui.json b/simpeg_drivers-assets/uijson/magnetotellurics_forward.ui.json index b1f7f72a..3fec26b6 100644 --- a/simpeg_drivers-assets/uijson/magnetotellurics_forward.ui.json +++ b/simpeg_drivers-assets/uijson/magnetotellurics_forward.ui.json @@ -158,7 +158,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/magnetotellurics_inversion.ui.json b/simpeg_drivers-assets/uijson/magnetotellurics_inversion.ui.json index b06e9359..d171acef 100644 --- a/simpeg_drivers-assets/uijson/magnetotellurics_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/magnetotellurics_inversion.ui.json @@ -533,7 +533,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json b/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json index 846e7cac..6d85105e 100644 --- a/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json +++ b/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json @@ -165,7 +165,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json index 3b49335f..3ffd62b1 100644 --- a/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json @@ -325,7 +325,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/tdem_forward.ui.json b/simpeg_drivers-assets/uijson/tdem_forward.ui.json index 8a6dfd5c..b48dbfde 100644 --- a/simpeg_drivers-assets/uijson/tdem_forward.ui.json +++ b/simpeg_drivers-assets/uijson/tdem_forward.ui.json @@ -136,7 +136,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/tdem_inversion.ui.json b/simpeg_drivers-assets/uijson/tdem_inversion.ui.json index 068ef9d6..df2b9aa8 100644 --- a/simpeg_drivers-assets/uijson/tdem_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/tdem_inversion.ui.json @@ -385,7 +385,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers-assets/uijson/tipper_forward.ui.json b/simpeg_drivers-assets/uijson/tipper_forward.ui.json index 0c89241f..a58c8f31 100644 --- a/simpeg_drivers-assets/uijson/tipper_forward.ui.json +++ b/simpeg_drivers-assets/uijson/tipper_forward.ui.json @@ -134,7 +134,6 @@ "parent": "mesh", "value": "" }, - "save_sensitivities": false, "n_cpu": { "min": 1, "group": "Compute", diff --git a/simpeg_drivers-assets/uijson/tipper_inversion.ui.json b/simpeg_drivers-assets/uijson/tipper_inversion.ui.json index e2038f84..2fd5c1f2 100644 --- a/simpeg_drivers-assets/uijson/tipper_inversion.ui.json +++ b/simpeg_drivers-assets/uijson/tipper_inversion.ui.json @@ -413,7 +413,6 @@ "enabled": true, "tooltip": "Lp-norm used in the z-smoothness term of the objective function" }, - "gradient_type": "total", "max_irls_iterations": { "min": 0, "group": "Sparse/blocky model", diff --git a/simpeg_drivers/components/data.py b/simpeg_drivers/components/data.py index 26be8d76..836c17e9 100644 --- a/simpeg_drivers/components/data.py +++ b/simpeg_drivers/components/data.py @@ -43,7 +43,7 @@ class InversionData(InversionLocations): """ - Retrieve and store data from the workspace and apply transformations. + Retrieve and store data from the workspace and apply normalizations. Parameters --------- @@ -53,16 +53,12 @@ class InversionData(InversionLocations): mask : Mask accumulated by windowing and downsampling operations and applied to locations and data on initialization. - vector : - True if models are vector valued. n_blocks : Number of blocks if vector. components : Component names. observed : Components and associated observed geophysical data. - predicted : - Components and associated predicted geophysical data. uncertainties : Components and associated data uncertainties. normalizations : @@ -86,14 +82,11 @@ def __init__(self, workspace: Workspace, params: InversionBaseOptions): super().__init__(workspace, params) self.locations: np.ndarray | None = None self.mask: np.ndarray | None = None - self.indices: np.ndarray | None = None - self.vector: bool | None = None self.n_blocks: int | None = None - self.observed: dict[str, np.ndarray] = {} - self.predicted: dict[str, np.ndarray] = {} - self.uncertainties: dict[str, np.ndarray] = {} - self.normalizations: dict[str, Any] = {} - self.transformations: dict[str, Any] = {} + + self._observed: dict[str, np.ndarray] | None = None + self._uncertainties: dict[str, np.ndarray] | None = None + self.entity = None self.data_entity = None self._observed_data_types = {} @@ -103,11 +96,9 @@ def __init__(self, workspace: Workspace, params: InversionBaseOptions): def _initialize(self) -> None: """Extract data from the workspace using params data.""" - self.vector = True if self.params.inversion_type == "magnetic vector" else False self.n_blocks = 3 if self.params.inversion_type == "magnetic vector" else 1 self.components = self.params.active_components - self.observed = self.params.data - self.uncertainties = self.params.uncertainties + self.has_tensor = InversionData.check_tensor(self.params.components) self.locations = super().get_locations(self.params.data_object) @@ -119,16 +110,35 @@ def _initialize(self) -> None: else: self.mask = np.ones(len(self.locations), dtype=bool) - self.observed = self.filter(self.observed) - self.uncertainties = self.filter(self.uncertainties) + self.normalizations: dict[str, Any] = self.get_normalizations() - self.normalizations = self.get_normalizations() - self.observed = self.normalize(self.observed) - self.uncertainties = self.normalize(self.uncertainties, absolute=True) self.entity = self.write_entity() - self.params.data_object = self.entity + + self.save_data() self.locations = super().get_locations(self.entity) + @property + def observed(self): + """ + Return observed data filtered and normalized. + """ + if self._observed is None: + filtered = self.filter(self.params.data, mask=self.mask) + self._observed = self.normalize(filtered) + + return self._observed + + @property + def uncertainties(self): + """ + Return uncertainties filtered and normalized. + """ + if self._uncertainties is None and hasattr(self.params, "uncertainties"): + filtered = self.filter(self.params.uncertainties, mask=self.mask) + self._uncertainties = self.normalize(filtered, absolute=True) + + return self._uncertainties + def drape_locations(self, locations: np.ndarray) -> np.ndarray: """ Return pseudo locations along line in distance, depth. @@ -151,18 +161,6 @@ def drape_locations(self, locations: np.ndarray) -> np.ndarray: return np.c_[distance_interp, locations[:, 2:]] - def filter(self, obj: dict[str, np.ndarray] | np.ndarray, mask=None): - """Remove vertices based on mask property.""" - if mask is None: - mask = self.mask - - if self.indices is None: - self.indices = np.where(mask)[0] - - obj = super().filter(obj, mask=self.indices) - - return obj - def get_data(self) -> tuple[list, dict, dict]: """ Get all data and uncertainty components and possibly set infinite uncertainties. @@ -192,78 +190,61 @@ def write_entity(self): def save_data(self): """Write out the data to geoh5""" - data = self.predicted if self.params.forward_only else self.observed - basename = "Predicted" if self.params.forward_only else "Observed" - self._observed_data_types = {c: {} for c in data.keys()} - data_dict = {c: {} for c in data.keys()} - uncert_dict = {c: {} for c in data.keys()} - - if self.params.inversion_type in [ + has_channels = self.params.inversion_type in [ "magnetotellurics", "tipper", "tdem", "fdem", "fdem 1d", "tdem 1d", - ]: - for component, channels in data.items(): - for ind, (channel, values) in enumerate(channels.items()): - dnorm = values / self.normalizations[channel][component] - data_channel = self.entity.add_data( - {f"{basename}_{component}_[{ind}]": {"values": dnorm}} - ) - data_dict[component] = self.entity.add_data_to_group( - data_channel, f"{basename}_{component}" - ) - if not self.params.forward_only: - self._observed_data_types[component][f"[{ind}]"] = ( - data_channel.entity_type - ) - uncerts = np.abs( - self.uncertainties[component][channel].copy() - / self.normalizations[channel][component] - ) - uncerts[np.isinf(uncerts)] = np.nan - uncert_entity = self.entity.add_data( - {f"Uncertainties_{component}_[{ind}]": {"values": uncerts}} - ) - uncert_dict[component] = self.entity.add_data_to_group( - uncert_entity, f"Uncertainties_{component}" - ) - else: - for component in data: - dnorm = data[component] / self.normalizations[None][component] - data_dict[component] = self.entity.add_data( - {f"{basename}_{component}": {"values": dnorm}} + ] + + # Pre-allocate dictionaries + data_types = {c: {} for c in self.observed.keys()} + data_dict = data_types.copy() + uncert_dict = data_types.copy() + + for component, channels in self.observed.items(): + # Forward only + if channels is None: + continue + + # Non-EM methods + if not has_channels: + channels = {None: channels} + + for ind, (channel, values) in enumerate(channels.items()): + suffix = f"_{component}" + if has_channels: + suffix += f"_[{ind}]" + + normalized_data = values / self.normalizations[channel][component] + data_entity = self.entity.add_data( + {"Observed" + suffix: {"values": normalized_data}} + ) + uncerts = np.abs( + self.uncertainties[component][channel].flatten() + / self.normalizations[channel][component] + ) + uncerts[np.isinf(uncerts)] = np.nan + uncert_entity = self.entity.add_data( + {"Uncertainties" + suffix: {"values": uncerts}} ) - if not self.params.forward_only: - self._observed_data_types[component] = data_dict[ - component - ].entity_type - uncerts = np.abs( - self.uncertainties[component].copy() - / self.normalizations[None][component] + if has_channels: + data_dict[component] = self.entity.add_data_to_group( + data_entity, f"Observed_{component}" ) - uncerts[np.isinf(uncerts)] = np.nan - - uncert_dict[component] = self.entity.add_data( - {f"Uncertainties_{component}": {"values": uncerts}} + uncert_dict[component] = self.entity.add_data_to_group( + uncert_entity, f"Uncertainties_{component}" ) + else: + data_dict[component] = data_entity + uncert_dict[component] = uncert_entity - if "direct current" in self.params.inversion_type: - apparent_property = data[component].copy() - apparent_property *= self.survey.apparent_resistivity - - data_dict["apparent_resistivity"] = self.entity.add_data( - { - f"{basename}_apparent_resistivity": { - "values": apparent_property, - "association": "CELL", - } - } - ) + data_types[component][channel] = data_entity.entity_type + self._observed_data_types = data_types self.update_params(data_dict, uncert_dict) def normalize( @@ -421,7 +402,7 @@ def simulation( active_cells, local_mesh, enforce_active=True, - components=3 if self.vector else 1, + components=self.n_blocks, ) simulation = simulation_factory.build( survey=survey, @@ -473,9 +454,7 @@ def update_params(self, data_dict, uncert_dict): """ Update pointers to newly created object and data. """ - self.params.data_object = self.entity - for comp in self.params.components: if getattr(self.params, "_".join([comp, "channel"]), None) is None: continue diff --git a/simpeg_drivers/components/factories/directives_factory.py b/simpeg_drivers/components/factories/directives_factory.py index 735eb947..a1672fbe 100644 --- a/simpeg_drivers/components/factories/directives_factory.py +++ b/simpeg_drivers/components/factories/directives_factory.py @@ -25,6 +25,7 @@ from simpeg.utils.mat_utils import cartesian2amplitude_dip_azimuth from simpeg_drivers.components.factories.simpeg_factory import SimPEGFactory +from simpeg_drivers.options import BaseInversionOptions if TYPE_CHECKING: @@ -57,12 +58,13 @@ def __init__(self, driver: InversionDriver): def beta_estimate_by_eigenvalues_directive(self): """""" if ( - self.params.initial_beta is None + self.params.cooling_schedule.initial_beta is None and self._beta_estimate_by_eigenvalues_directive is None ): self._beta_estimate_by_eigenvalues_directive = ( directives.BetaEstimateDerivative( - beta0_ratio=self.params.initial_beta_ratio, random_seed=0 + beta0_ratio=self.params.cooling_schedule.initial_beta_ratio, + random_seed=0, ) ) @@ -179,9 +181,8 @@ def save_property_group(self): @property def save_sensitivities_directive(self): """""" - if ( - self._save_sensitivities_directive is None - and self.params.save_sensitivities + if self._save_sensitivities_directive is None and isinstance( + self.params, BaseInversionOptions ): self._save_sensitivities_directive = SaveSensitivitiesGeoh5Factory( self.params @@ -254,7 +255,7 @@ def save_iteration_residual_directive(self): def scale_misfits(self): if ( self._scale_misfits is None - and self.params.auto_scale_misfits + and self.params.directives.auto_scale_misfits and len(self.driver.data_misfit.objfcts) > 1 ): self._scale_misfits = directives.ScaleMisfitMultipliers( @@ -266,25 +267,28 @@ def scale_misfits(self): def update_irls_directive(self): """Directive to update IRLS.""" if self._update_irls_directive is None: - start_chi_fact = self.params.starting_chi_factor + start_chi_fact = self.params.irls.starting_chi_factor - if start_chi_fact is not None and self.params.chi_factor > start_chi_fact: + if ( + start_chi_fact is not None + and self.params.cooling_schedule.chi_factor > start_chi_fact + ): logger.warning( "Starting chi factor is greater than target chi factor.\n" "Setting the target chi factor to the starting chi factor." ) - start_chi_fact = self.params.chi_factor + start_chi_fact = self.params.cooling_schedule.chi_factor self._update_irls_directive = directives.UpdateIRLS( - f_min_change=self.params.f_min_change, - max_irls_iterations=self.params.max_irls_iterations, - misfit_tolerance=self.params.beta_tol, - percentile=self.params.percentile, - cooling_rate=self.params.cooling_rate, - cooling_factor=self.params.cooling_factor, - irls_cooling_factor=self.params.epsilon_cooling_factor, - chifact_start=start_chi_fact or self.params.chi_factor, - chifact_target=self.params.chi_factor, + f_min_change=self.params.optimization.f_min_change, + max_irls_iterations=self.params.irls.max_irls_iterations, + misfit_tolerance=self.params.irls.beta_tol, + percentile=self.params.irls.percentile, + cooling_rate=self.params.cooling_schedule.cooling_rate, + cooling_factor=self.params.cooling_schedule.cooling_factor, + irls_cooling_factor=self.params.irls.epsilon_cooling_factor, + chifact_start=start_chi_fact or self.params.cooling_schedule.chi_factor, + chifact_target=self.params.cooling_schedule.chi_factor, ) return self._update_irls_directive @@ -301,8 +305,8 @@ def update_sensitivity_weights_directive(self): if self._update_sensitivity_weights_directive is None: self._update_sensitivity_weights_directive = ( directives.UpdateSensitivityWeights( - every_iteration=self.params.every_iteration_bool, - threshold_value=self.params.sens_wts_threshold / 100.0, + every_iteration=self.params.directives.every_iteration_bool, + threshold_value=self.params.directives.sens_wts_threshold / 100.0, ) ) @@ -321,7 +325,7 @@ def vector_inversion_directive(self): self._vector_inversion_directive = directives.VectorInversion( [objective.simulation for objective in self.driver.data_misfit.objfcts], self.driver.regularization, - chifact_target=self.driver.params.chi_factor * 2, + chifact_target=self.driver.params.cooling_schedule.chi_factor * 2, reference_angles=reference_angles, ) return self._vector_inversion_directive @@ -400,7 +404,7 @@ def assemble_keyword_arguments( inversion_object.permutation.T, ] - if self.params.model_type == "Resistivity (Ohm-m)": + if self.params.models.model_type == "Resistivity (Ohm-m)": kwargs["transforms"].append(lambda x: 1 / x) if "1d" in self.factory_type: @@ -451,7 +455,7 @@ def volume_normalization(val): } if self.factory_type == "magnetic vector": - kwargs["channels"] = [""] + kwargs["channels"] = [None] kwargs["transforms"] = [ lambda x: x.reshape((-1, 3), order="F"), lambda x: np.linalg.norm(x, axis=1), @@ -541,10 +545,7 @@ def assemble_data_keywords_potential_fields( components = list(inversion_object.observed) channels = [None] kwargs = { - "data_type": { - comp: dict.fromkeys(channels, dtype) - for comp, dtype in inversion_object.observed_data_types.items() - }, + "data_type": inversion_object.observed_data_types, "transforms": [ np.hstack( [ @@ -589,17 +590,18 @@ def assemble_data_keywords_dcip( name=None, ): components = list(inversion_object.observed) - channels = [""] + channels = [None] is_dc = True if "direct current" in self.factory_type else False component = "dc" if is_dc else "ip" kwargs = { - "data_type": { - comp: dict.fromkeys(channels, dtype) - for comp, dtype in inversion_object.observed_data_types.items() - }, + "data_type": inversion_object.observed_data_types, "transforms": [ np.hstack( - [inversion_object.normalizations[None][c] for c in components] + [ + inversion_object.normalizations[chan][comp] + for chan in channels + for comp in components + ] ) ], "channels": channels, @@ -672,7 +674,7 @@ def reshape(values): for comp in components ] ), - "channels": [f"[{ind}]" for ind, _ in enumerate(channels)], + "channels": channels, "components": components, "sorting": sorting, "_reshape": reshape, diff --git a/simpeg_drivers/components/factories/misfit_factory.py b/simpeg_drivers/components/factories/misfit_factory.py index 98177771..ae3d18f6 100644 --- a/simpeg_drivers/components/factories/misfit_factory.py +++ b/simpeg_drivers/components/factories/misfit_factory.py @@ -65,7 +65,7 @@ def assemble_arguments( # pylint: disable=arguments-differ ): # Base slice over frequencies if self.factory_type in ["magnetotellurics", "tipper", "fdem"]: - channels = np.unique([list(v) for v in inversion_data.observed.values()]) + channels = inversion_data.entity.channels else: channels = [None] @@ -140,7 +140,9 @@ def assemble_arguments( # pylint: disable=arguments-differ value_inactive=1e-8, ) - local_sim.sigma = proj * mapping * self.models.conductivity + local_sim.sigma = ( + proj * mapping * self.models.conductivity_model + ) simulation = meta.MetaSimulation( simulations=[local_sim], mappings=[mapping] diff --git a/simpeg_drivers/components/factories/simulation_factory.py b/simpeg_drivers/components/factories/simulation_factory.py index 11809d91..d15e6559 100644 --- a/simpeg_drivers/components/factories/simulation_factory.py +++ b/simpeg_drivers/components/factories/simulation_factory.py @@ -54,7 +54,7 @@ def __init__(self, params: BaseParams | BaseOptions): ]: import pymatsolver.direct as solver_module - self.solver = getattr(solver_module, params.solver_type) + self.solver = getattr(solver_module, params.compute.solver_type) def concrete_object(self): if self.factory_type in ["magnetic scalar", "magnetic vector"]: @@ -149,7 +149,7 @@ def assemble_keyword_arguments( kwargs = {} kwargs["survey"] = survey kwargs["sensitivity_path"] = sensitivity_path - kwargs["max_chunk_size"] = self.params.max_chunk_size + kwargs["max_chunk_size"] = self.params.compute.max_chunk_size kwargs["store_sensitivities"] = ( "forward_only" if self.params.forward_only diff --git a/simpeg_drivers/components/factories/source_factory.py b/simpeg_drivers/components/factories/source_factory.py index efbb1fb7..2431a0ae 100644 --- a/simpeg_drivers/components/factories/source_factory.py +++ b/simpeg_drivers/components/factories/source_factory.py @@ -132,9 +132,9 @@ def assemble_keyword_arguments( # pylint: disable=arguments-differ "declination": self.params.inducing_field_declination, } if self.factory_type in ["magnetotellurics", "tipper"]: - background = deepcopy(self.params.background_conductivity) + background = deepcopy(self.params.models.conductivity_model) - if getattr(self.params, "model_type", None) == "Resistivity (Ohm-m)": + if getattr(self.params.models, "model_type", None) == "Resistivity (Ohm-m)": background **= -1.0 kwargs["sigma_primary"] = [background] diff --git a/simpeg_drivers/components/models.py b/simpeg_drivers/components/models.py index d12cc95b..6792f9fc 100644 --- a/simpeg_drivers/components/models.py +++ b/simpeg_drivers/components/models.py @@ -32,11 +32,15 @@ MODEL_TYPES = [ - "starting", - "reference", + "starting_model", + "starting_inclination", + "starting_declination", + "reference_model", + "reference_inclination", + "reference_declination", "lower_bound", "upper_bound", - "conductivity", + "conductivity_model", "alpha_s", "length_scale_x", "length_scale_y", @@ -47,7 +51,7 @@ "x_norm", "y_norm", "z_norm", - "petrophysics", + "petrophysical_model", ] @@ -70,35 +74,32 @@ def __init__(self, driver: InversionDriver): self._active_cells: np.ndarray | None = None self._driver = driver self.is_sigma = self.driver.params.physical_property == "conductivity" - is_vector = ( - True if self.driver.params.inversion_type == "magnetic vector" else False - ) - self._starting = InversionModel(driver, "starting", is_vector=is_vector) - self._reference = InversionModel(driver, "reference", is_vector=is_vector) - self._lower_bound = InversionModel(driver, "lower_bound", is_vector=is_vector) - self._upper_bound = InversionModel(driver, "upper_bound", is_vector=is_vector) - self._conductivity = InversionModel(driver, "conductivity", is_vector=is_vector) - self._alpha_s = InversionModel(driver, "alpha_s", is_vector=is_vector) - self._length_scale_x = InversionModel( - driver, "length_scale_x", is_vector=is_vector - ) - self._length_scale_y = InversionModel( - driver, "length_scale_y", is_vector=is_vector - ) - self._length_scale_z = InversionModel( - driver, "length_scale_z", is_vector=is_vector - ) + self.is_vector = self.driver.params.inversion_type == "magnetic vector" + + self._starting_model = InversionModel(driver, "starting_model") + self._starting_inclination = InversionModel(driver, "starting_inclination") + self._starting_declination = InversionModel(driver, "starting_declination") + self._reference_model = InversionModel(driver, "reference_model") + self._reference_inclination = InversionModel(driver, "reference_inclination") + self._reference_declination = InversionModel(driver, "reference_declination") + self._lower_bound = InversionModel(driver, "lower_bound") + self._upper_bound = InversionModel(driver, "upper_bound") + self._conductivity_model = InversionModel(driver, "conductivity_model") + self._alpha_s = InversionModel(driver, "alpha_s") + self._length_scale_x = InversionModel(driver, "length_scale_x") + self._length_scale_y = InversionModel(driver, "length_scale_y") + self._length_scale_z = InversionModel(driver, "length_scale_z") self._gradient_dip = InversionModel( driver, "gradient_dip", trim_active_cells=False ) self._gradient_direction = InversionModel( driver, "gradient_direction", trim_active_cells=False ) - self._s_norm = InversionModel(driver, "s_norm", is_vector=is_vector) - self._x_norm = InversionModel(driver, "x_norm", is_vector=is_vector) - self._y_norm = InversionModel(driver, "y_norm", is_vector=is_vector) - self._z_norm = InversionModel(driver, "z_norm", is_vector=is_vector) - self._petrophysics = InversionModel(driver, "petrophysics", is_vector=False) + self._s_norm = InversionModel(driver, "s_norm") + self._x_norm = InversionModel(driver, "x_norm") + self._y_norm = InversionModel(driver, "y_norm") + self._z_norm = InversionModel(driver, "z_norm") + self._petrophysical_model = InversionModel(driver, "petrophysical_model") @property def n_active(self) -> int: @@ -149,23 +150,57 @@ def active_cells(self, active_cells: np.ndarray | NumericData | None): self._active_cells = active_cells @property - def starting(self) -> np.ndarray | None: - if self._starting.model is None: + def starting_model(self) -> np.ndarray | None: + if self._starting_model.model is None: return None - mstart = self._starting.model.copy() + mstart = self._starting_model.model.copy() if mstart is not None and self.is_sigma: - if getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)": + if self.driver.params.models.model_type == "Resistivity (Ohm-m)": mstart = 1 / mstart mstart = np.log(mstart) + if self.is_vector: + field_vecs = dip_azimuth2cartesian( + self.starting_inclination, + self.starting_declination, + ) + mstart = (field_vecs.T * mstart).flatten() + return mstart @property - def reference(self) -> np.ndarray | None: - mref = self._reference.model + def starting_inclination(self) -> np.ndarray | None: + value = self._starting_inclination.model + + if value is None and self.is_vector: + return ( + np.ones_like(self._starting_model.model) + * self.driver.params.inducing_field_inclination + ) + + if value is not None: + value[np.isnan(value)] = 0 + + return value + + @property + def starting_declination(self) -> np.ndarray | None: + value = self._starting_declination.model + + if value is None and self.is_vector: + return ( + np.ones_like(self._starting_model.model) + * self.driver.params.inducing_field_declination + ) + + return value + + @property + def reference_model(self) -> np.ndarray | None: + mref = self._reference_model.model if self.driver.params.forward_only: return mref @@ -179,19 +214,50 @@ def reference(self) -> np.ndarray | None: if ( self.is_sigma - and getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)" + and self.driver.params.models.model_type == "Resistivity (Ohm-m)" ): ref_model = 1 / ref_model ref_model = np.log(ref_model) if self.is_sigma else ref_model + if self.is_vector: + field_vecs = dip_azimuth2cartesian( + self.starting_inclination, + self.starting_declination, + ) + ref_model = (field_vecs.T * ref_model).flatten() + return ref_model + @property + def reference_inclination(self) -> np.ndarray | None: + value = self._reference_inclination.model + + if value is None and self.is_vector: + return ( + np.ones(self.active_cells.sum()) + * self.driver.params.inducing_field_inclination + ) + + return value + + @property + def reference_declination(self) -> np.ndarray | None: + value = self._reference_declination.model + + if value is None and self.is_vector: + return ( + np.ones(self.active_cells.sum()) + * self.driver.params.inducing_field_declination + ) + + return value + @property def lower_bound(self) -> np.ndarray | None: if ( - getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)" - and self.is_sigma + self.is_sigma + and self.driver.params.models.model_type == "Resistivity (Ohm-m)" ): bound_model = self._upper_bound.model else: @@ -211,18 +277,21 @@ def lower_bound(self) -> np.ndarray | None: if self.is_sigma: is_finite = np.isfinite(lbound) - if getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)": + if self.driver.params.models.model_type == "Resistivity (Ohm-m)": lbound[is_finite] = 1 / lbound[is_finite] lbound[is_finite] = np.log(lbound[is_finite]) + if self.is_vector: + lbound = np.tile(lbound, 3) + return lbound @property def upper_bound(self) -> np.ndarray | None: if ( - getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)" - and self.is_sigma + self.is_sigma + and self.driver.params.models.model_type == "Resistivity (Ohm-m)" ): bound_model = self._lower_bound.model else: @@ -236,22 +305,25 @@ def upper_bound(self) -> np.ndarray | None: if self.is_sigma: is_finite = np.isfinite(ubound) - if getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)": + if self.driver.params.models.model_type == "Resistivity (Ohm-m)": ubound[is_finite] = 1 / ubound[is_finite] ubound[is_finite] = np.log(ubound[is_finite]) + if self.is_vector: + ubound = np.tile(ubound, 3) + return ubound @property - def conductivity(self) -> np.ndarray | None: - if self._conductivity.model is None: + def conductivity_model(self) -> np.ndarray | None: + if self._conductivity_model.model is None: return None - background_sigma = self._conductivity.model.copy() + background_sigma = self._conductivity_model.model.copy() if background_sigma is not None: - if getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)": + if self.driver.params.models.model_type == "Resistivity (Ohm-m)": background_sigma = 1 / background_sigma # Don't apply log if IP inversion @@ -265,49 +337,45 @@ def alpha_s(self) -> np.ndarray | None: if self._alpha_s.model is None: return None - return self._alpha_s.model.copy() + alpha = self._alpha_s.model.copy() + + if self.is_vector: + alpha = np.tile(alpha, 3) + + return alpha @property def length_scale_x(self) -> np.ndarray | None: if self._length_scale_x.model is None: return None - return self._length_scale_x.model.copy() + length_scale = self._length_scale_x.model.copy() + + if self.is_vector: + length_scale = np.tile(length_scale, 3) + return length_scale @property def length_scale_y(self) -> np.ndarray | None: if self._length_scale_y.model is None: return None - return self._length_scale_y.model.copy() + length_scale = self._length_scale_y.model.copy() + + if self.is_vector: + length_scale = np.tile(length_scale, 3) + return length_scale @property def length_scale_z(self) -> np.ndarray | None: if self._length_scale_z.model is None: return None - return self._length_scale_z.model.copy() - - @property - def petrophysics(self) -> np.ndarray | None: - if self._petrophysics.model is None: - return None - - return self._petrophysics.model.copy() - - @property - def gradient_dip(self) -> np.ndarray | None: - if self._gradient_dip.model is None: - return None + length_scale = self._length_scale_z.model.copy() - return self._gradient_dip.model.copy() - - @property - def gradient_direction(self) -> np.ndarray | None: - if self._gradient_direction.model is None: - return None - - return self._gradient_direction.model.copy() + if self.is_vector: + length_scale = np.tile(length_scale, 3) + return length_scale @property def s_norm(self) -> np.ndarray | None: @@ -315,6 +383,10 @@ def s_norm(self) -> np.ndarray | None: return None s_norm = self._s_norm.model.copy() + + if self.is_vector: + s_norm = np.tile(s_norm, 3) + return s_norm @property @@ -323,6 +395,10 @@ def x_norm(self) -> np.ndarray | None: return None x_norm = self._x_norm.model.copy() + + if self.is_vector: + x_norm = np.tile(x_norm, 3) + return x_norm @property @@ -331,6 +407,10 @@ def y_norm(self) -> np.ndarray | None: return None y_norm = self._y_norm.model.copy() + + if self.is_vector: + y_norm = np.tile(y_norm, 3) + return y_norm @property @@ -339,6 +419,10 @@ def z_norm(self) -> np.ndarray | None: return None z_norm = self._z_norm.model.copy() + + if self.is_vector: + z_norm = np.tile(z_norm, 3) + return z_norm def _model_method_wrapper(self, method, name=None, **kwargs): @@ -353,6 +437,27 @@ def _model_method_wrapper(self, method, name=None, **kwargs): if name is not None: return returned_items[name] + @property + def petrophysical_model(self) -> np.ndarray | None: + if self._petrophysical_model.model is None: + return None + + return self._petrophysical_model.model.copy() + + @property + def gradient_dip(self) -> np.ndarray | None: + if self._gradient_dip.model is None: + return None + + return self._gradient_dip.model.copy() + + @property + def gradient_direction(self) -> np.ndarray | None: + if self._gradient_direction.model is None: + return None + + return self._gradient_direction.model.copy() + def remove_air(self, active_cells: np.ndarray): """Use active cells vector to remove air cells from model""" self._model_method_wrapper("remove_air", active_cells=active_cells) @@ -362,7 +467,7 @@ def permute_2_octree(self, name): Reorder model values stored in cell centers of a TreeMesh to their original octree mesh sorting. - :param: name: model type name ("starting", "reference", + :param: name: model type name ("starting_model", "reference_model", "lower_bound", or "upper_bound"). :return: Vector of model values reordered for octree mesh. @@ -392,7 +497,6 @@ def __init__( self, driver: InversionDriver, model_type: str, - is_vector: bool = False, trim_active_cells: bool = True, ): """ @@ -404,7 +508,6 @@ def __init__( self.driver = driver self.model_type = model_type self.model: np.ndarray | None = None - self.is_vector = is_vector self.trim_active_cells = trim_active_cells self._initialize() @@ -416,55 +519,19 @@ def _initialize(self): are provided, then values are projected onto the direction of the inducing field. """ - if self.model_type in ["starting", "reference", "conductivity"]: - model = self._get(self.model_type) - - if self.is_vector: - inclination = self._get(self.model_type + "_inclination") - declination = self._get(self.model_type + "_declination") - - if inclination is None: - inclination = ( - np.ones(self.driver.inversion_mesh.n_cells) - * self.driver.params.inducing_field_inclination - ) - - if declination is None: - declination = ( - np.ones(self.driver.inversion_mesh.n_cells) - * self.driver.params.inducing_field_declination - ) - - inclination[np.isnan(inclination)] = 0 - declination[np.isnan(declination)] = 0 - field_vecs = dip_azimuth2cartesian( - inclination, - declination, - ) - - if model is not None: - model += 1e-8 # make sure the incl/decl don't zero out - model = (field_vecs.T * model).T - - else: - model = self._get(self.model_type) - - if ( - model is not None - and self.is_vector - and model.shape[0] == self.driver.inversion_mesh.n_cells - ): - model = np.tile(model, 3 if self.is_vector else 1) + model = self._get(self.model_type) if model is not None: self.model = mkvc(model) - self.save_model() + + if isinstance(self._fetch_reference(self.model_type), Data): + self.save_model() def remove_air(self, active_cells): """Use active cells vector to remove air cells from model""" if self.model is not None and self.trim_active_cells: - self.model = self.model[np.tile(active_cells, 3 if self.is_vector else 1)] + self.model = self.model[active_cells] def permute_2_octree(self) -> np.ndarray | None: """ @@ -476,11 +543,6 @@ def permute_2_octree(self) -> np.ndarray | None: if self.model is None: return None - if self.is_vector: - return mkvc( - self.driver.inversion_mesh.permutation.T - @ self.model.reshape((-1, 3), order="F") - ) return self.driver.inversion_mesh.permutation.T @ self.model def save_model(self): @@ -490,32 +552,12 @@ def save_model(self): if remapped_model is None: return - if self.is_vector: - if self.model_type in ["starting", "reference"]: - aid = cartesian2amplitude_dip_azimuth(remapped_model) - aid[np.isnan(aid[:, 0]), 1:] = np.nan - self.driver.inversion_mesh.entity.add_data( - {f"{self.model_type}_inclination": {"values": aid[:, 1]}} - ) - self.driver.inversion_mesh.entity.add_data( - {f"{self.model_type}_declination": {"values": aid[:, 2]}} - ) - remapped_model = aid[:, 0] - elif "norm" in self.model_type: - remapped_model = np.mean( - remapped_model.reshape((-1, 3), order="F"), axis=1 - ) - else: - remapped_model = np.linalg.norm( - remapped_model.reshape((-1, 3), order="F"), axis=1 - ) - model_type = self.model_type if ( - model_type == "conductivity" - and getattr(self.driver.params, "model_type", None) == "Resistivity (Ohm-m)" + model_type == "conductivity_model" + and self.driver.params.models.model_type == "Resistivity (Ohm-m)" ): - model_type = "resistivity" + model_type = "resistivity_model" entity_type = None if isinstance(self._fetch_reference(self.model_type), NumericData): @@ -523,7 +565,7 @@ def save_model(self): self.driver.inversion_mesh.entity.add_data( { - f"{model_type}_model": { + f"{model_type}": { "values": remapped_model, "entity_type": entity_type, } @@ -532,38 +574,28 @@ def save_model(self): def edit_ndv_model(self, model): """Change values to NDV on models and save to workspace.""" - for field in ["model", "inclination", "declination"]: - model_type = self.model_type - if ( - model_type == "conductivity" - and getattr(self.driver.params, "model_type", None) - == "Resistivity (Ohm-m)" - ): - model_type = "resistivity" - - data_obj = self.driver.inversion_mesh.entity.get_data( - f"{model_type}_{field}" + model_type = self.model_type + if ( + model_type == "conductivity_model" + and getattr(self.driver.params.models, "model_type", None) + == "Resistivity (Ohm-m)" + ): + model_type = "resistivity_model" + + data_obj = self.driver.inversion_mesh.entity.get_data(model_type) + if ( + any(data_obj) + and isinstance(data_obj[0], NumericData) + and data_obj[0].values is not None + ): + values = data_obj[0].values.copy() + values[~model.astype(bool)] = ( + np.nan if isinstance(data_obj[0], FloatData) else 0 ) - if ( - any(data_obj) - and isinstance(data_obj[0], NumericData) - and data_obj[0].values is not None - ): - values = data_obj[0].values.copy() - values[~model.astype(bool)] = ( - np.nan if isinstance(data_obj[0], FloatData) else 0 - ) - data_obj[0].values = values + data_obj[0].values = values def _fetch_reference(self, name: str) -> NumericData | None: - if name in ["petrophysics", "starting", "reference", "conductivity"]: - name += "_model" - - value = getattr(self.driver.params, name, None) - - if "reference" in name and value is None: - value = self._fetch_reference("starting") - + value = getattr(self.driver.params.models, name, None) return value def _get(self, name: str) -> np.ndarray | None: diff --git a/simpeg_drivers/driver.py b/simpeg_drivers/driver.py index 3b7ae6c4..48be8882 100644 --- a/simpeg_drivers/driver.py +++ b/simpeg_drivers/driver.py @@ -129,7 +129,7 @@ def split_list(self): """ Number of splits for the data misfit to be distributed evenly among workers. """ - n_misfits = self.params.tile_spatial + n_misfits = self.params.compute.tile_spatial if isinstance(self.params.data_object, FEMSurvey): n_misfits *= len(self.params.data_object.channels) @@ -169,10 +169,11 @@ def data_misfit(self): self.models.active_cells, ) self.logger.write("Saving data to file...\n") - self.inversion_data.save_data() - self._data_misfit.multipliers = np.asarray( - self._data_misfit.multipliers, dtype=float - ) + + if isinstance(self.params, BaseInversionOptions): + self._data_misfit.multipliers = np.asarray( + self._data_misfit.multipliers, dtype=float + ) if self.client: self.logger.write( @@ -209,8 +210,11 @@ def inverse_problem(self): self.optimization, ) - if not self.params.forward_only and self.params.initial_beta: - self._inverse_problem.beta = self.params.initial_beta + if ( + not self.params.forward_only + and self.params.cooling_schedule.initial_beta + ): + self._inverse_problem.beta = self.params.cooling_schedule.initial_beta return self._inverse_problem @@ -293,12 +297,12 @@ def optimization(self): return optimization.ProjectedGNCG() self._optimization = optimization.ProjectedGNCG( - maxIter=self.params.max_global_iterations, + maxIter=self.params.optimization.max_global_iterations, lower=self.models.lower_bound, upper=self.models.upper_bound, - maxIterLS=self.params.max_line_search_iterations, - maxIterCG=self.params.max_cg_iterations, - tolCG=self.params.tol_cg, + maxIterLS=self.params.optimization.max_line_search_iterations, + maxIterCG=self.params.optimization.max_cg_iterations, + tolCG=self.params.optimization.tol_cg, stepOffBoundsFact=1e-8, LSshorten=0.25, ) @@ -399,12 +403,12 @@ def run(self): if self.params.forward_only: self.logger.write("Running the forward simulation ...\n") predicted = simpeg_inversion.invProb.get_dpred( - self.models.starting, None + self.models.starting_model, None ) else: # Run the inversion self.start_inversion_message() - simpeg_inversion.run(self.models.starting) + simpeg_inversion.run(self.models.starting_model) except np.core._exceptions._ArrayMemoryError as error: # pylint: disable=protected-access raise GeoAppsError( @@ -439,9 +443,11 @@ def run(self): def start_inversion_message(self): # SimPEG reports half phi_d, so we scale to match - has_chi_start = self.params.starting_chi_factor is not None + has_chi_start = self.params.irls.starting_chi_factor is not None chi_start = ( - self.params.starting_chi_factor if has_chi_start else self.params.chi_factor + self.params.irls.starting_chi_factor + if has_chi_start + else self.params.cooling_schedule.chi_factor ) if getattr(self, "drivers", None) is not None: # joint problem @@ -452,8 +458,8 @@ def start_inversion_message(self): data_count = self.inversion_data.n_data self.logger.write( - f"Target Misfit: {self.params.chi_factor * data_count:.2e} ({data_count} data " - f"with chifact = {self.params.chi_factor})\n" + f"Target Misfit: {self.params.cooling_schedule.chi_factor * data_count:.2e} ({data_count} data " + f"with chifact = {self.params.cooling_schedule.chi_factor})\n" ) self.logger.write( f"IRLS Start Misfit: {chi_start * data_count:.2e} ({data_count} data " @@ -489,7 +495,7 @@ def get_regularization(self): return BaseRegularization(mesh=self.inversion_mesh.mesh) reg_funcs = [] - is_rotated = self.params.gradient_rotation is not None + is_rotated = self.params.models.gradient_rotation is not None neighbors = None backward_mesh = None forward_mesh = None @@ -498,7 +504,7 @@ def get_regularization(self): forward_mesh or self.inversion_mesh.mesh, active_cells=self.models.active_cells if forward_mesh is None else None, mapping=mapping, - reference_model=self.models.reference, + reference_model=self.models.reference_model, ) if is_rotated and neighbors is None: @@ -586,14 +592,14 @@ def get_regularization(self): def get_tiles(self): if "2d" in self.params.inversion_type: - tiles = [np.arange(len(self.inversion_data.indices))] + tiles = [np.arange(self.inversion_data.mask.sum())] elif "1d" in self.params.inversion_type: - tiles = np.arange(len(self.inversion_data.indices)).reshape((-1, 1)) + tiles = np.arange(self.inversion_data.mask.sum()).reshape((-1, 1)) else: locations = self.inversion_data.locations tiles = tile_locations( locations, - self.params.tile_spatial, + self.params.compute.tile_spatial, method="kmeans", ) @@ -605,7 +611,7 @@ def configure_dask(self): if self.client: dconf.set(scheduler=self.client) else: - n_cpu = self.params.n_cpu + n_cpu = self.params.compute.n_cpu if n_cpu is None: n_cpu = int(multiprocessing.cpu_count()) diff --git a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/options.py b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/options.py index 54300f91..fd1edd04 100644 --- a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/options.py +++ b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/options.py @@ -24,6 +24,7 @@ from simpeg_drivers.options import ( BaseForwardOptions, BaseInversionOptions, + ConductivityModelOptions, DrapeModelOptions, LineSelectionOptions, ) @@ -38,8 +39,6 @@ class DCBatch2DForwardOptions(BaseForwardOptions): :param line_selection: Line selection parameters. :param mesh: Optional mesh object if providing a heterogeneous model. :param drape_model: Drape model parameters common to all 2D simulations. - :param model_type: Specify whether the models are provided in resistivity - or conductivity. :param file_control: File control parameters. """ @@ -57,8 +56,8 @@ class DCBatch2DForwardOptions(BaseForwardOptions): line_selection: LineSelectionOptions mesh: Octree | None = None drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" file_control: FileControlOptions = FileControlOptions() + models: ConductivityModelOptions class DCBatch2DInversionOptions(BaseInversionOptions): @@ -71,11 +70,7 @@ class DCBatch2DInversionOptions(BaseInversionOptions): :param line_selection: Line selection parameters. :param mesh: Optional mesh object if providing a heterogeneous model. :param drape_model: Drape model parameters. - :param model_type: Specify whether the models are provided in resistivity - or conductivity. :param file_control: File control parameters. - :param length_scale_y: Inactive length scale for y direction. - :param y_norm: Inactive y normalization factor. """ name: ClassVar[str] = "Direct Current Pseudo 3D Inversion" @@ -93,7 +88,5 @@ class DCBatch2DInversionOptions(BaseInversionOptions): line_selection: LineSelectionOptions mesh: Octree | None = None drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" file_control: FileControlOptions = FileControlOptions() - length_scale_y: None = None - y_norm: None = None + models: ConductivityModelOptions diff --git a/simpeg_drivers/electricals/direct_current/three_dimensions/options.py b/simpeg_drivers/electricals/direct_current/three_dimensions/options.py index 5417c484..323c0d95 100644 --- a/simpeg_drivers/electricals/direct_current/three_dimensions/options.py +++ b/simpeg_drivers/electricals/direct_current/three_dimensions/options.py @@ -15,9 +15,14 @@ from typing import ClassVar from geoh5py.data import FloatData +from geoh5py.objects import PotentialElectrode from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ConductivityModelOptions, +) class DC3DForwardOptions(BaseForwardOptions): @@ -25,8 +30,6 @@ class DC3DForwardOptions(BaseForwardOptions): Direct Current 3D forward options. :param potential_channel_bool: Potential channel boolean. - :param model_type: Specify whether the models are provided in - resistivity or conductivity. """ name: ClassVar[str] = "Direct Current 3D Forward" @@ -38,8 +41,9 @@ class DC3DForwardOptions(BaseForwardOptions): physical_property: str = "conductivity" inversion_type: str = "direct current 3d" + data_object: PotentialElectrode potential_channel_bool: bool = True - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions class DC3DInversionOptions(BaseInversionOptions): @@ -48,8 +52,6 @@ class DC3DInversionOptions(BaseInversionOptions): :param potential_channel: Potential data channel. :param potential_uncertainty: Potential data uncertainty channel. - :param model_type: Specify whether the models are provided in - resistivity or conductivity. """ name: ClassVar[str] = "Direct Current 3D Inversion" @@ -61,6 +63,7 @@ class DC3DInversionOptions(BaseInversionOptions): physical_property: str = "conductivity" inversion_type: str = "direct current 3d" + data_object: PotentialElectrode potential_channel: FloatData potential_uncertainty: float | FloatData | None = None - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions diff --git a/simpeg_drivers/electricals/direct_current/two_dimensions/options.py b/simpeg_drivers/electricals/direct_current/two_dimensions/options.py index e168a689..544a691e 100644 --- a/simpeg_drivers/electricals/direct_current/two_dimensions/options.py +++ b/simpeg_drivers/electricals/direct_current/two_dimensions/options.py @@ -14,14 +14,14 @@ from pathlib import Path from typing import ClassVar -from geoh5py.data import DataAssociationEnum, FloatData, ReferencedData -from geoh5py.objects import DrapeModel -from pydantic import BaseModel, ConfigDict, field_validator, model_validator +from geoh5py.data import FloatData +from geoh5py.objects import DrapeModel, PotentialElectrode from simpeg_drivers import assets_path from simpeg_drivers.options import ( BaseForwardOptions, BaseInversionOptions, + ConductivityModelOptions, DrapeModelOptions, LineSelectionOptions, ) @@ -34,8 +34,6 @@ class DC2DForwardOptions(BaseForwardOptions): :param potential_channel_bool: Potential channel boolean. :param line_selection: Line selection parameters. :param drape_model: Drape model parameters. - :param model_type: Specify whether the models are provided in - resistivity or conductivity. """ name: ClassVar[str] = "Direct Current 2D Forward" @@ -47,11 +45,12 @@ class DC2DForwardOptions(BaseForwardOptions): physical_property: str = "conductivity" inversion_type: str = "direct current 2d" + data_object: PotentialElectrode potential_channel_bool: bool = True line_selection: LineSelectionOptions mesh: DrapeModel | None = None drape_model: DrapeModelOptions - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions class DC2DInversionOptions(BaseInversionOptions): @@ -62,8 +61,6 @@ class DC2DInversionOptions(BaseInversionOptions): :param potential_uncertainty: Potential data uncertainty channel. :param line_selection: Line selection parameters. :param drape_model: Drape model parameters. - :param model_type: Specify whether the models are provided in - resistivity or conductivity. """ name: ClassVar[str] = "Direct Current 2D Inversion" @@ -75,11 +72,10 @@ class DC2DInversionOptions(BaseInversionOptions): physical_property: str = "conductivity" inversion_type: str = "direct current 2d" + data_object: PotentialElectrode potential_channel: FloatData potential_uncertainty: float | FloatData | None = None line_selection: LineSelectionOptions mesh: DrapeModel | None = None drape_model: DrapeModelOptions - model_type: str = "Conductivity (S/m)" - length_scale_y: None = None - y_norm: None = None + models: ConductivityModelOptions diff --git a/simpeg_drivers/electricals/driver.py b/simpeg_drivers/electricals/driver.py index 66f96779..ccb34c92 100644 --- a/simpeg_drivers/electricals/driver.py +++ b/simpeg_drivers/electricals/driver.py @@ -96,14 +96,14 @@ def transfer_models(self, mesh: DrapeModel) -> dict[str, uuid.UUID | float]: :param mesh: Destination DrapeModel object. """ - models = {"starting_model": self.batch2d_params.starting_model} + models = {"starting_model": self.batch2d_params.models.starting_model} for model in self._model_list: - models[model] = getattr(self.batch2d_params, model) + models[model] = getattr(self.batch2d_params, model, None) if not self.batch2d_params.forward_only: for model in ["reference_model", "lower_bound", "upper_bound"]: - models[model] = getattr(self.batch2d_params, model) + models[model] = getattr(self.batch2d_params.models, model) if self.batch2d_params.mesh is not None: xyz_in = get_locations(self.workspace, self.batch2d_params.mesh) @@ -131,7 +131,6 @@ def write_files(self, lookup): with fetch_active_workspace(self.workspace, mode="r+"): self._window = InversionWindow(self.workspace, self.batch2d_params) self._inversion_data = InversionData(self.workspace, self.batch2d_params) - self._inversion_data.save_data() self._inversion_topography = InversionTopography( self.workspace, self.batch2d_params ) diff --git a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/options.py b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/options.py index 3d4732de..0e3e65b6 100644 --- a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/options.py +++ b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/options.py @@ -20,6 +20,7 @@ from simpeg_drivers import assets_path from simpeg_drivers.electricals.options import ( FileControlOptions, + IPModelOptions, ) from simpeg_drivers.options import ( BaseForwardOptions, @@ -38,8 +39,6 @@ class IPBatch2DForwardOptions(BaseForwardOptions): :param line_selection: Line selection parameters. :param mesh: Optional mesh object if providing a heterogeneous model. :param drape_model: Drape model parameters common to all 2D simulations. - :param model_type: Specify whether the models are provided in resistivity - or conductivity. :param file_control: File control parameters. """ @@ -56,10 +55,9 @@ class IPBatch2DForwardOptions(BaseForwardOptions): chargeability_channel_bool: bool = True line_selection: LineSelectionOptions mesh: Octree | None = None - conductivity_model: float | FloatData drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" file_control: FileControlOptions = FileControlOptions() + models: IPModelOptions class IPBatch2DInversionOptions(BaseInversionOptions): @@ -72,10 +70,7 @@ class IPBatch2DInversionOptions(BaseInversionOptions): :param line_selection: Line selection parameters. :param mesh: Optional mesh object if providing a heterogeneous model. :param drape_model: Drape model parameters common to all 2D simulations. - :param conductivity_model: Conductivity model. :param file_control: File control parameters. - :param length_scale_y: Inactive length scale for y direction. - :param y_norm: Inactive y normalization factor. """ name: ClassVar[str] = "Induced Polarization Pseudo 3D Inversion" @@ -93,9 +88,5 @@ class IPBatch2DInversionOptions(BaseInversionOptions): line_selection: LineSelectionOptions mesh: Octree | None = None drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" - conductivity_model: float | FloatData - lower_bound: float | FloatData | None = 0.0 file_control: FileControlOptions = FileControlOptions() - length_scale_y: None = None - y_norm: None = None + models: IPModelOptions diff --git a/simpeg_drivers/electricals/induced_polarization/three_dimensions/options.py b/simpeg_drivers/electricals/induced_polarization/three_dimensions/options.py index ddad7421..1f9c51c3 100644 --- a/simpeg_drivers/electricals/induced_polarization/three_dimensions/options.py +++ b/simpeg_drivers/electricals/induced_polarization/three_dimensions/options.py @@ -15,9 +15,14 @@ from typing import ClassVar from geoh5py.data import FloatData +from geoh5py.objects.surveys.direct_current import PotentialElectrode from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions +from simpeg_drivers.electricals.options import IPModelOptions +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, +) class IP3DForwardOptions(BaseForwardOptions): @@ -25,7 +30,6 @@ class IP3DForwardOptions(BaseForwardOptions): Induced Polarization 3D forward options. :param chargeability_channel_bool: Chargeability channel boolean. - :param conductivity_model: Conductivity model. """ name: ClassVar[str] = "Induced Polarization 3D Forward" @@ -37,9 +41,9 @@ class IP3DForwardOptions(BaseForwardOptions): physical_property: str = "chargeability" inversion_type: str = "induced polarization 3d" + data_object: PotentialElectrode chargeability_channel_bool: bool = True - model_type: str = "Conductivity (S/m)" - conductivity_model: float | FloatData + models: IPModelOptions class IP3DInversionOptions(BaseInversionOptions): @@ -48,7 +52,6 @@ class IP3DInversionOptions(BaseInversionOptions): :param chargeability_channel: Chargeability data channel. :param chargeability_uncertainty: Chargeability data uncertainty channel. - :param conductivity_model: Conductivity model. """ name: ClassVar[str] = "Induced Polarization 3D Inversion" @@ -60,8 +63,7 @@ class IP3DInversionOptions(BaseInversionOptions): physical_property: str = "chargeability" inversion_type: str = "induced polarization 3d" + data_object: PotentialElectrode chargeability_channel: FloatData chargeability_uncertainty: float | FloatData | None = None - model_type: str = "Conductivity (S/m)" - conductivity_model: float | FloatData - lower_bound: float | FloatData | None = 0.0 + models: IPModelOptions diff --git a/simpeg_drivers/electricals/induced_polarization/two_dimensions/options.py b/simpeg_drivers/electricals/induced_polarization/two_dimensions/options.py index 1bbef88f..01608d2c 100644 --- a/simpeg_drivers/electricals/induced_polarization/two_dimensions/options.py +++ b/simpeg_drivers/electricals/induced_polarization/two_dimensions/options.py @@ -15,9 +15,10 @@ from typing import ClassVar from geoh5py.data import FloatData -from geoh5py.objects import DrapeModel +from geoh5py.objects import DrapeModel, PotentialElectrode from simpeg_drivers import assets_path +from simpeg_drivers.electricals.options import IPModelOptions from simpeg_drivers.options import ( BaseForwardOptions, BaseInversionOptions, @@ -34,7 +35,6 @@ class IP2DForwardOptions(BaseForwardOptions): :param mesh: Optional mesh object if providing a heterogeneous model. :param drape_model: Drape model parameters. :param line_selection: Line selection parameters. - :param conductivity_model: Conductivity model. """ name: ClassVar[str] = "Induced Polarization 2D Forward" @@ -46,12 +46,12 @@ class IP2DForwardOptions(BaseForwardOptions): physical_property: str = "chargeability" inversion_type: str = "induced polarization 2d" + data_object: PotentialElectrode chargeability_channel_bool: bool = True line_selection: LineSelectionOptions mesh: DrapeModel | None = None drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" - conductivity_model: float | FloatData + models: IPModelOptions class IP2DInversionOptions(BaseInversionOptions): @@ -62,10 +62,6 @@ class IP2DInversionOptions(BaseInversionOptions): :param chargeability_uncertainty: Chargeability data uncertainty channel. :param line_selection: Line selection parameters. :param drape_model: Drape model parameters. - :param conductivity_model: Conductivity model. - :param lower_bound: Lower bound for the inversion. - :param length_scale_y: Inactive length scale in the y direction. - :param y_norm: Inactive y normalization factor. """ name: ClassVar[str] = "Induced Polarization 2D Inversion" @@ -77,13 +73,10 @@ class IP2DInversionOptions(BaseInversionOptions): physical_property: str = "chargeability" inversion_type: str = "induced polarization 2d" + data_object: PotentialElectrode chargeability_channel: FloatData chargeability_uncertainty: float | FloatData | None = None line_selection: LineSelectionOptions mesh: DrapeModel | None = None drape_model: DrapeModelOptions = DrapeModelOptions() - model_type: str = "Conductivity (S/m)" - conductivity_model: float | FloatData - lower_bound: float | FloatData | None = 0.0 - length_scale_y: None = None - y_norm: None = None + models: IPModelOptions diff --git a/simpeg_drivers/electricals/options.py b/simpeg_drivers/electricals/options.py index 574172b3..06e43a11 100644 --- a/simpeg_drivers/electricals/options.py +++ b/simpeg_drivers/electricals/options.py @@ -11,8 +11,19 @@ from __future__ import annotations +from geoh5py.data import FloatData from pydantic import BaseModel +from simpeg_drivers.options import ConductivityModelOptions + + +class IPModelOptions(ConductivityModelOptions): + """ + ModelOptions class with defaulted lower bound. + """ + + lower_bound: float | FloatData | None = 0 + class FileControlOptions(BaseModel): """ diff --git a/simpeg_drivers/electromagnetics/base_1d_driver.py b/simpeg_drivers/electromagnetics/base_1d_driver.py index d5f0db8b..e5befd66 100644 --- a/simpeg_drivers/electromagnetics/base_1d_driver.py +++ b/simpeg_drivers/electromagnetics/base_1d_driver.py @@ -110,7 +110,6 @@ def data_misfit(self): ) logger.info("Done.") - self.inversion_data.save_data() self._data_misfit.multipliers = np.asarray( self._data_misfit.multipliers, dtype=float ) @@ -125,7 +124,7 @@ def split_list(self): """ Split the list of data into chunks for parallel processing. """ - n_misfits = len(self.inversion_data.indices) + n_misfits = self.inversion_data.mask.sum() if isinstance(self.params.data_object, FEMSurvey): n_misfits *= len(self.params.data_object.channels) diff --git a/simpeg_drivers/electromagnetics/frequency_domain/options.py b/simpeg_drivers/electromagnetics/frequency_domain/options.py index 261b7fa1..ec7928b7 100644 --- a/simpeg_drivers/electromagnetics/frequency_domain/options.py +++ b/simpeg_drivers/electromagnetics/frequency_domain/options.py @@ -24,7 +24,12 @@ from pydantic import field_validator from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions, EMDataMixin +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ConductivityModelOptions, + EMDataMixin, +) Receivers: TypeAlias = ( @@ -39,11 +44,6 @@ class BaseFDEMOptions(EMDataMixin): Base Frequency Domain Electromagnetic options. """ - physical_property: str = "conductivity" - data_object: Receivers - inversion_type: str = "fdem" - model_type: str = "Conductivity (S/m)" - @property def tx_offsets(self): """Return transmitter offsets from frequency metadata""" @@ -81,7 +81,7 @@ def name_change(cls, value: str): return value -class FDEMForwardOptions(BaseFDEMOptions, BaseForwardOptions): +class FDEMForwardOptions(BaseForwardOptions, BaseFDEMOptions): """ Frequency Domain Electromagnetic Forward options. @@ -93,9 +93,13 @@ class FDEMForwardOptions(BaseFDEMOptions, BaseForwardOptions): name: ClassVar[str] = "Frequency Domain Electromagnetics Forward" default_ui_json: ClassVar[Path] = assets_path() / "uijson/fdem_forward.ui.json" title: str = "Frequency-domain EM (FEM) Forward" + physical_property: str = "conductivity" + inversion_type: str = "fdem" + data_object: Receivers z_real_channel_bool: bool z_imag_channel_bool: bool + models: ConductivityModelOptions class FDEMInversionOptions(BaseFDEMOptions, BaseInversionOptions): @@ -112,8 +116,12 @@ class FDEMInversionOptions(BaseFDEMOptions, BaseInversionOptions): name: ClassVar[str] = "Frequency Domain Electromagnetics Inversion" default_ui_json: ClassVar[Path] = assets_path() / "uijson/fdem_inversion.ui.json" title: str = "Frequency-domain EM (FEM) Inversion" + physical_property: str = "conductivity" + inversion_type: str = "fdem" + data_object: Receivers z_real_channel: PropertyGroup | None = None z_real_uncertainty: PropertyGroup | None = None z_imag_channel: PropertyGroup | None = None z_imag_uncertainty: PropertyGroup | None = None + models: ConductivityModelOptions diff --git a/simpeg_drivers/electromagnetics/frequency_domain_1d/options.py b/simpeg_drivers/electromagnetics/frequency_domain_1d/options.py index 2ea767d9..5bbbe3ee 100644 --- a/simpeg_drivers/electromagnetics/frequency_domain_1d/options.py +++ b/simpeg_drivers/electromagnetics/frequency_domain_1d/options.py @@ -18,24 +18,22 @@ from simpeg_drivers import assets_path from simpeg_drivers.electromagnetics.frequency_domain.options import ( - BaseFDEMOptions, + FDEMForwardOptions, + FDEMInversionOptions, ) from simpeg_drivers.options import ( - BaseForwardOptions, - BaseInversionOptions, + DirectiveOptions, DrapeModelOptions, ) -class FDEM1DForwardOptions(BaseFDEMOptions, BaseForwardOptions): +class FDEM1DForwardOptions(FDEMForwardOptions): """ Frequency Domain Electromagnetic forward options. - :param z_channel_bool: Z-component data channel boolean. - :param x_channel_bool: X-component data channel boolean. - :param y_channel_bool: Y-component data channel boolean. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the FEM data + :param z_real_channel_bool: Z-component data channel boolean. + :param z_imag_channel_bool: X-component data channel boolean. + :param drape_model: Drape model options. """ name: ClassVar[str] = "Frequency Domain 1D Electromagnetics Forward" @@ -57,7 +55,7 @@ class FDEM1DForwardOptions(BaseFDEMOptions, BaseForwardOptions): ) -class FDEM1DInversionOptions(BaseFDEMOptions, BaseInversionOptions): +class FDEM1DInversionOptions(FDEMInversionOptions): """ Frequency Domain Electromagnetic Inversion options. @@ -65,8 +63,7 @@ class FDEM1DInversionOptions(BaseFDEMOptions, BaseInversionOptions): :param z_real_uncertainty: Real Z-component data channel uncertainty. :param z_imag_channel: Imaginary Z-component data channel. :param z_imag_uncertainty: Imaginary Z-component data channel uncertainty. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the FEM data + :param drape_model: Drape model options. """ name: ClassVar[str] = "Frequency Domain 1D Electromagnetics Inversion" @@ -82,13 +79,9 @@ class FDEM1DInversionOptions(BaseFDEMOptions, BaseInversionOptions): vertical_padding=100.0, expansion_factor=1.1, ) - - # 1D specific options - auto_scale_misfits: bool = False - sens_wts_threshold: float = 100.0 - length_scale_y: None = None - y_norm: None = None - + directives: DirectiveOptions = DirectiveOptions( + sens_wts_threshold=100.0, + ) z_real_channel: PropertyGroup | None = None z_real_uncertainty: PropertyGroup | None = None z_imag_channel: PropertyGroup | None = None diff --git a/simpeg_drivers/electromagnetics/time_domain/driver.py b/simpeg_drivers/electromagnetics/time_domain/driver.py index ef02069e..66b4e779 100644 --- a/simpeg_drivers/electromagnetics/time_domain/driver.py +++ b/simpeg_drivers/electromagnetics/time_domain/driver.py @@ -100,7 +100,7 @@ def get_tiles(self) -> list[np.ndarray]: return tile_large_group_transmitters( self.params.data_object, - self.params.tile_spatial, + self.params.compute.tile_spatial, ) @@ -123,5 +123,5 @@ def get_tiles(self) -> list[np.ndarray]: return tile_large_group_transmitters( self.params.data_object, - self.params.tile_spatial, + self.params.compute.tile_spatial, ) diff --git a/simpeg_drivers/electromagnetics/time_domain/options.py b/simpeg_drivers/electromagnetics/time_domain/options.py index 50dfd7e8..2010e1e9 100644 --- a/simpeg_drivers/electromagnetics/time_domain/options.py +++ b/simpeg_drivers/electromagnetics/time_domain/options.py @@ -22,7 +22,12 @@ ) from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions, EMDataMixin +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ConductivityModelOptions, + EMDataMixin, +) Receivers: TypeAlias = ( @@ -37,13 +42,9 @@ class BaseTDEMOptions(EMDataMixin): :param data_object: The data object containing the TDEM data. :param physical_property: The physical property being modeled (e.g., conductivity). :param data_units: The units of the TDEM data (e.g., "dB/dt (T/s)"). - :param model_type: The type of model used (e.g., "Conductivity (S/m)"). """ - data_object: Receivers - physical_property: str = "conductivity" data_units: str = "dB/dt (T/s)" - model_type: str = "Conductivity (S/m)" @property def unit_conversion(self): @@ -63,20 +64,19 @@ class TDEMForwardOptions(BaseTDEMOptions, BaseForwardOptions): :param z_channel_bool: Z-component data channel boolean. :param x_channel_bool: X-component data channel boolean. :param y_channel_bool: Y-component data channel boolean. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the TEM data """ name: ClassVar[str] = "Time Domain Electromagnetics Forward" default_ui_json: ClassVar[Path] = assets_path() / "uijson/tdem_forward.ui.json" - title: str = "Time-domain EM (TEM) Forward" physical_property: str = "conductivity" inversion_type: str = "tdem" + data_object: Receivers z_channel_bool: bool | None = None x_channel_bool: bool | None = None y_channel_bool: bool | None = None + models: ConductivityModelOptions class TDEMInversionOptions(BaseTDEMOptions, BaseInversionOptions): @@ -89,18 +89,19 @@ class TDEMInversionOptions(BaseTDEMOptions, BaseInversionOptions): :param x_uncertainty: X-component data channel uncertainty. :param y_channel: Y-component data channel. :param y_uncertainty: Y-component data channel uncertainty. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the TEM data """ name: ClassVar[str] = "Time Domain Electromagnetics Inversion" default_ui_json: ClassVar[Path] = assets_path() / "uijson/tdem_inversion.ui.json" title: str = "Time-domain EM (TEM) Inversion" + physical_property: str = "conductivity" inversion_type: str = "tdem" + data_object: Receivers z_channel: PropertyGroup | None = None z_uncertainty: PropertyGroup | None = None x_channel: PropertyGroup | None = None x_uncertainty: PropertyGroup | None = None y_channel: PropertyGroup | None = None y_uncertainty: PropertyGroup | None = None + models: ConductivityModelOptions diff --git a/simpeg_drivers/electromagnetics/time_domain_1d/options.py b/simpeg_drivers/electromagnetics/time_domain_1d/options.py index 120e40a3..60dd7af0 100644 --- a/simpeg_drivers/electromagnetics/time_domain_1d/options.py +++ b/simpeg_drivers/electromagnetics/time_domain_1d/options.py @@ -22,12 +22,13 @@ ) from simpeg_drivers import assets_path -from simpeg_drivers.electromagnetics.time_domain.options import BaseTDEMOptions +from simpeg_drivers.electromagnetics.time_domain.options import ( + TDEMForwardOptions, + TDEMInversionOptions, +) from simpeg_drivers.options import ( - BaseForwardOptions, - BaseInversionOptions, + DirectiveOptions, DrapeModelOptions, - EMDataMixin, ) @@ -36,15 +37,12 @@ ) -class TDEM1DForwardOptions(BaseTDEMOptions, BaseForwardOptions): +class TDEM1DForwardOptions(TDEMForwardOptions): """ Time Domain Electromagnetic forward options. :param z_channel_bool: Z-component data channel boolean. - :param x_channel_bool: X-component data channel boolean. - :param y_channel_bool: Y-component data channel boolean. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the TEM data + :param drape_model: Options for drape mesh. """ name: ClassVar[str] = "Time Domain Electromagnetics Forward" @@ -53,7 +51,7 @@ class TDEM1DForwardOptions(BaseTDEMOptions, BaseForwardOptions): title: str = "Time-domain EM-1D (TEM-1D) Forward" inversion_type: str = "tdem 1d" - z_channel_bool: bool + z_channel_bool: bool = True drape_model: DrapeModelOptions = DrapeModelOptions( u_cell_size=10.0, @@ -65,18 +63,13 @@ class TDEM1DForwardOptions(BaseTDEMOptions, BaseForwardOptions): ) -class TDEM1DInversionOptions(BaseTDEMOptions, BaseInversionOptions): +class TDEM1DInversionOptions(TDEMInversionOptions): """ Time Domain Electromagnetic Inversion options. :param z_channel: Z-component data channel. :param z_uncertainty: Z-component data channel uncertainty. - :param x_channel: X-component data channel. - :param x_uncertainty: X-component data channel uncertainty. - :param y_channel: Y-component data channel. - :param y_uncertainty: Y-component data channel uncertainty. - :param model_type: Specify whether the models are provided in resistivity or conductivity. - :param data_units: Units for the TEM data + :param drape_model: Options for drape mesh. """ name: ClassVar[str] = "Time Domain Electromagnetics Inversion" @@ -87,9 +80,10 @@ class TDEM1DInversionOptions(BaseTDEMOptions, BaseInversionOptions): z_channel: PropertyGroup | None = None z_uncertainty: PropertyGroup | None = None - length_scale_y: None = None - y_norm: None = None + directives: DirectiveOptions = DirectiveOptions( + sens_wts_threshold=100.0, + ) drape_model: DrapeModelOptions = DrapeModelOptions( u_cell_size=10.0, v_cell_size=10.0, @@ -98,5 +92,3 @@ class TDEM1DInversionOptions(BaseTDEMOptions, BaseInversionOptions): vertical_padding=100.0, expansion_factor=1.1, ) - auto_scale_misfits: bool = False - sens_wts_threshold: float = 100.0 diff --git a/simpeg_drivers/joint/driver.py b/simpeg_drivers/joint/driver.py index 686246a1..5bdb7660 100644 --- a/simpeg_drivers/joint/driver.py +++ b/simpeg_drivers/joint/driver.py @@ -123,7 +123,7 @@ def initialize(self): global_actives, driver.inversion_mesh.mesh, enforce_active=False, - components=3 if driver.inversion_data.vector else 1, + components=driver.inversion_data.n_blocks, ) driver.params.active_model = None driver.models.active_cells = projection.local_active @@ -206,7 +206,7 @@ def n_values(self): n_values = self.models.n_active count = [] for driver in self.drivers: - n_comp = 3 if driver.inversion_data.vector else 1 + n_comp = driver.inversion_data.n_blocks # If vector of scalar model count.append(n_values * n_comp) self._n_values = count @@ -228,7 +228,7 @@ def run(self): if self.params.forward_only: print("Running the forward simulation ...") predicted = self.inverse_problem.get_dpred( - self.models.starting, compute_J=False + self.models.starting_model, compute_J=False ) for sub, driver in zip(predicted, self.drivers, strict=True): @@ -240,7 +240,7 @@ def run(self): else: # Run the inversion self.start_inversion_message() - self.inversion.run(self.models.starting) + self.inversion.run(self.models.starting_model) self.logger.end() sys.stdout = self.logger.terminal @@ -267,7 +267,15 @@ def validate_create_mesh(self): def validate_create_models(self): """Create stacked model vectors from all drivers provided.""" for model_type in self.models.model_types: - if model_type in ["petrophysics", "gradient_dip", "gradient_direction"]: + if model_type in [ + "petrophysical_model", + "gradient_dip", + "gradient_direction", + "starting_inclination", + "starting_declination", + "reference_inclination", + "reference_declination", + ]: continue model = getattr(self.models, f"_{model_type}").model @@ -355,11 +363,10 @@ def _get_drivers_directives(self) -> list[directives.Directive]: for driver in self.drivers: driver_directives = DirectivesFactory(driver) - if ( - getattr(driver.params, "model_type", None) is not None - and getattr(self.params, "model_type", None) is not None + if hasattr(driver.params.models, "model_type") and hasattr( + self.params.models, "model_type" ): - driver.params.model_type = self.params.model_type + driver.params.models.model_type = self.params.models.model_type save_model = driver_directives.save_iteration_model_directive save_model.transforms = [ @@ -418,8 +425,8 @@ def _get_local_model_save_directives( ) model_directive.label = driver.params.physical_property - if getattr(driver.params, "model_type", None) == "Resistivity (Ohm-m)": - model_directive.label = "resistivity" + if getattr(driver.params.models, "model_type", None) == "Resistivity (Ohm-m)": + model_directive.label = "resistivity_model" model_directive.transforms = [wire, *model_directive.transforms] diff --git a/simpeg_drivers/joint/joint_cross_gradient/options.py b/simpeg_drivers/joint/joint_cross_gradient/options.py index 3c79e150..fec6ce54 100644 --- a/simpeg_drivers/joint/joint_cross_gradient/options.py +++ b/simpeg_drivers/joint/joint_cross_gradient/options.py @@ -18,6 +18,17 @@ from simpeg_drivers import assets_path from simpeg_drivers.joint.options import BaseJointOptions +from simpeg_drivers.options import ModelOptions + + +class JointCrossGradientModelOptions(ModelOptions): + """ + Model options with petrophysics reference model. + + :param petrophysical: The reference geology data. + """ + + starting_model: None = None class JointCrossGradientOptions(BaseJointOptions): @@ -25,11 +36,11 @@ class JointCrossGradientOptions(BaseJointOptions): Joint Cross Gradient inversion options. :param cross_gradient_weight_a_b: Weight applied to the cross gradient - regularizations. + regularization between the first and second models. :param cross_gradient_weight_c_a: Weight applied to the cross gradient - regularizations. + regularization between the first and third models. :param cross_gradient_weight_c_b: Weight applied to the cross gradient - regularizations. + regularization between the second and third model. """ name: ClassVar[str] = "Joint Cross Gradient Inversion" @@ -44,3 +55,5 @@ class JointCrossGradientOptions(BaseJointOptions): cross_gradient_weight_a_b: float = 1.0 cross_gradient_weight_c_a: float | None = None cross_gradient_weight_c_b: float | None = None + + models: JointCrossGradientModelOptions = JointCrossGradientModelOptions() diff --git a/simpeg_drivers/joint/joint_petrophysics/driver.py b/simpeg_drivers/joint/joint_petrophysics/driver.py index 1e3ae3fd..a3542e8f 100644 --- a/simpeg_drivers/joint/joint_petrophysics/driver.py +++ b/simpeg_drivers/joint/joint_petrophysics/driver.py @@ -74,7 +74,7 @@ def directives(self): self.inversion_mesh.mesh, self.models.active_cells, 0 ), ], - reference_type=self.params.petrophysics_model.entity_type, + reference_type=self.params.models.petrophysical_model.entity_type, ) ) directives_list.append( @@ -97,7 +97,7 @@ def get_regularization(self): regularizations = super().get_regularization() reg_list, multipliers = self._overload_regularization(regularizations) reg_list.append(self.pgi_regularization) - multipliers.append(self.params.alpha_s) + multipliers.append(self.params.models.alpha_s) return ComboObjectiveFunction(objfcts=reg_list, multipliers=multipliers) @@ -141,9 +141,9 @@ def n_units(self) -> int: @property def geo_units(self) -> dict: """Model units.""" - units = np.unique(self.models.petrophysics) + units = np.unique(self.models.petrophysical_model) model_map = { - unit: self.params.petrophysics_model.entity_type.value_map()[unit] + unit: self.params.models.petrophysical_model.entity_type.value_map()[unit] for unit in units if unit != 0 } @@ -155,7 +155,7 @@ def membership(self) -> np.ndarray[np.int]: if self._membership is None: self._membership = np.empty(self.models.n_active, dtype=int) for ii, unit in enumerate(self.geo_units): - unit_ind = self.models.petrophysics == unit + unit_ind = self.models.petrophysical_model == unit self._membership[unit_ind] = self.class_mapping[ii] return self._membership @@ -169,10 +169,10 @@ def means(self) -> np.ndarray: """ means = [] for mapping in self.mapping: - model_vec = mapping @ self.models.reference + model_vec = mapping @ self.models.reference_model unit_mean = [] for uid in self.geo_units: - unit_ind = self.models.petrophysics == uid + unit_ind = self.models.petrophysical_model == uid start_values = np.mean(model_vec[unit_ind]) unit_mean.append(start_values) @@ -199,7 +199,7 @@ def weights(self) -> np.ndarray: weights = [] volumes = self.inversion_mesh.mesh.cell_volumes[self.models.active_cells] for uid in self.geo_units: - weights.append(volumes[self.models.petrophysics == uid].sum()) + weights.append(volumes[self.models.petrophysical_model == uid].sum()) return np.r_[weights] / np.sum(weights) @property @@ -216,7 +216,7 @@ def pgi_regularization(self): active_cells=self.models.active_cells, wiresmap=maps.Wires(*wires), maplist=maplist, - reference_model=self.models.reference, + reference_model=self.models.reference_model, ) return self._pgi_regularization diff --git a/simpeg_drivers/joint/joint_petrophysics/options.py b/simpeg_drivers/joint/joint_petrophysics/options.py index b0d0562d..d51e6d06 100644 --- a/simpeg_drivers/joint/joint_petrophysics/options.py +++ b/simpeg_drivers/joint/joint_petrophysics/options.py @@ -15,11 +15,22 @@ from typing import ClassVar from geoh5py.data import ReferencedData -from geoh5py.groups import SimPEGGroup from geoh5py.objects import Octree from simpeg_drivers import assets_path from simpeg_drivers.joint.options import BaseJointOptions +from simpeg_drivers.options import ModelOptions + + +class JointPetrophysicsModelOptions(ModelOptions): + """ + Model options with petrophysics reference model. + + :param petrophysical: The reference geology data. + """ + + starting_model: None = None + petrophysical_model: ReferencedData class JointPetrophysicsOptions(BaseJointOptions): @@ -27,7 +38,7 @@ class JointPetrophysicsOptions(BaseJointOptions): Joint Petrophysically Guided Inversion (PGI) driver. :param mesh: The global mesh entity containing the reference geology. - :param petrophysics: The reference geology data. + :param petrophysics_model: The reference geology data. """ name: ClassVar[str] = "Petrophysically Guided Inversion (PGI)" @@ -36,15 +47,8 @@ class JointPetrophysicsOptions(BaseJointOptions): ) title: str = "Joint Petrophysically Guided Inversion (PGI)" - physical_property: list[str] = [""] - inversion_type: str = "joint petrophysics" - mesh: Octree - petrophysics_model: ReferencedData - group_a: SimPEGGroup - group_a_multiplier: float | None = 1.0 - group_b: SimPEGGroup | None = None group_b_multiplier: float | None = None - group_c: SimPEGGroup | None = None - group_c_multiplier: float | None = None + mesh: Octree + models: JointPetrophysicsModelOptions diff --git a/simpeg_drivers/joint/joint_surveys/driver.py b/simpeg_drivers/joint/joint_surveys/driver.py index 8e3aa744..5916cbb1 100644 --- a/simpeg_drivers/joint/joint_surveys/driver.py +++ b/simpeg_drivers/joint/joint_surveys/driver.py @@ -65,13 +65,13 @@ def validate_create_models(self): ]: model = np.exp(model) if ( - getattr(self.params, "model_type", None) + getattr(self.params.models, "model_type", None) == "Resistivity (Ohm-m)" ): logger.info( "Converting input %s model to %s", model_type, - getattr(self.params, "model_type", None), + getattr(self.params.models, "model_type", None), ) model = 1.0 / model diff --git a/simpeg_drivers/joint/joint_surveys/options.py b/simpeg_drivers/joint/joint_surveys/options.py index 79c46069..0b2c8548 100644 --- a/simpeg_drivers/joint/joint_surveys/options.py +++ b/simpeg_drivers/joint/joint_surveys/options.py @@ -14,11 +14,11 @@ from pathlib import Path from typing import ClassVar -from geoh5py.data import FloatData from pydantic import model_validator from simpeg_drivers import assets_path from simpeg_drivers.joint.options import BaseJointOptions +from simpeg_drivers.options import ConductivityModelOptions class JointSurveysOptions(BaseJointOptions): @@ -30,14 +30,9 @@ class JointSurveysOptions(BaseJointOptions): ) title: str = "Joint Surveys Inversion" - inversion_type: str = "joint surveys" - model_type: str = "Conductivity (S/m)" - starting_model: float | FloatData - reference_model: float | FloatData | None = None - lower_bound: float | FloatData | None = None - upper_bound: float | FloatData | None = None + models: ConductivityModelOptions @model_validator(mode="after") def all_groups_same_physical_property(self): diff --git a/simpeg_drivers/joint/options.py b/simpeg_drivers/joint/options.py index 5248d499..2a22f4b9 100644 --- a/simpeg_drivers/joint/options.py +++ b/simpeg_drivers/joint/options.py @@ -11,22 +11,20 @@ from __future__ import annotations -import multiprocessing +from geoh5py.groups import SimPEGGroup +from pydantic import ConfigDict -import numpy as np -from geoapps_utils.driver.data import BaseData -from geoh5py.data import FloatData -from geoh5py.groups import PropertyGroup, SimPEGGroup, UIJsonGroup -from geoh5py.objects import DrapeModel, Octree -from geoh5py.shared.utils import fetch_active_workspace -from pydantic import ConfigDict, field_validator, model_validator +from simpeg_drivers.options import ( + CoolingSceduleOptions, + CoreOptions, + DirectiveOptions, + IRLSOptions, + ModelOptions, + OptimizationOptions, +) -import simpeg_drivers -from simpeg_drivers.options import ActiveCellsOptions, SolverType -from simpeg_drivers.utils.regularization import direction_and_dip - -class BaseJointOptions(BaseData): +class BaseJointOptions(CoreOptions): """ Base Joint Options. @@ -40,13 +38,8 @@ class BaseJointOptions(BaseData): model_config = ConfigDict(frozen=False) - icon: str | None = None - documentation: str | None = None - version: str = simpeg_drivers.__version__ - run_command: str = "simpeg_drivers.driver" - conda_environment: str = "simpeg-drivers" forward_only: bool = False - physical_property: str | None = None + physical_property: str = "" group_a: SimPEGGroup group_a_multiplier: float = 1.0 @@ -55,133 +48,14 @@ class BaseJointOptions(BaseData): group_c: SimPEGGroup | None = None group_c_multiplier: float | None = None - mesh: Octree | DrapeModel | None - - active_cells: ActiveCellsOptions - tile_spatial: int = 1 - parallelized: bool = True - solver_type: SolverType = SolverType.Pardiso - save_sensitivities: bool = False - n_cpu: int | None = None - max_chunk_size: int = 128 - out_group: SimPEGGroup | UIJsonGroup | None = None - generate_sweep: bool = False - distributed_workers: str | None = None - alpha_s: float | FloatData | None = 1.0 - length_scale_x: float | FloatData = 1.0 - length_scale_y: float | FloatData | None = 1.0 - length_scale_z: float | FloatData = 1.0 - gradient_rotation: PropertyGroup | None = None - s_norm: float | FloatData | None = 0.0 - x_norm: float | FloatData = 2.0 - y_norm: float | FloatData | None = 2.0 - z_norm: float | FloatData = 2.0 - gradient_type: str = "total" - max_irls_iterations: int = 25 - starting_chi_factor: float = 1.0 - - chi_factor: float = 1.0 - auto_scale_misfits: bool = True - initial_beta_ratio: float | None = 100.0 - initial_beta: float | None = None - cooling_factor: float = 2.0 - - cooling_rate: int = 1 - max_global_iterations: int = 50 - max_line_search_iterations: int = 20 - max_cg_iterations: int = 30 - tol_cg: float = 1e-4 - f_min_change: float = 1e-2 - solver_type: SolverType = SolverType.Pardiso - - sens_wts_threshold: float = 1e-3 - every_iteration_bool: bool = True + irls: IRLSOptions = IRLSOptions() + directives: DirectiveOptions = DirectiveOptions(auto_scale_misfits=True) + cooling_schedule: CoolingSceduleOptions = CoolingSceduleOptions() + optimization: OptimizationOptions = OptimizationOptions() store_sensitivities: str = "ram" - beta_tol: float = 0.5 - percentile: float = 95.0 - epsilon_cooling_factor: float = 1.2 - - n_workers: int | None = 1 - n_threads: int | None = None - max_ram: float | None = None - performance_report: bool = False - @property def groups(self) -> list[SimPEGGroup]: """List all active groups.""" return [k for k in [self.group_a, self.group_b, self.group_c] if k is not None] - - @field_validator("n_cpu", mode="before") - @classmethod - def maximize_cpu_if_none(cls, value): - if value is None: - value = int(multiprocessing.cpu_count()) - return value - - @field_validator("mesh", mode="before") - @classmethod - def mesh_cannot_be_rotated(cls, value: Octree): - if isinstance(value, Octree) and value.rotation not in [0.0, None]: - raise ValueError( - "Rotated meshes are not supported. Please use a mesh with an angle of 0.0." - ) - return value - - @model_validator(mode="before") - @classmethod - def out_group_if_none(cls, data): - group = data.get("out_group", None) - - if isinstance(group, SimPEGGroup): - return data - - if isinstance(group, UIJsonGroup | type(None)): - name = ( - cls.model_fields["title"].default # pylint: disable=unsubscriptable-object - if group is None - else group.name - ) - with fetch_active_workspace(data["geoh5"], mode="r+") as geoh5: - group = SimPEGGroup.create(geoh5, name=name) - - data["out_group"] = group - - return data - - @model_validator(mode="after") - def update_out_group_options(self): - assert self.out_group is not None - with fetch_active_workspace(self.geoh5, mode="r+"): - self.out_group.options = self.serialize() - self.out_group.metadata = None - return self - - @property - def gradient_orientations(self) -> tuple(float, float): - """ - Direction and dip angles for rotated gradient regularization. - - Angles are in radians and are clockwise from North for direction - and clockwise from horizontal for dip. - """ - - if self.gradient_rotation is not None: - orientations = direction_and_dip(self.gradient_rotation) - - return np.deg2rad(orientations) - - return None - - @property - def gradient_direction(self) -> np.ndarray: - if self.gradient_orientations is None: - return None - return self.gradient_orientations[:, 0] - - @property - def gradient_dip(self) -> np.ndarray: - if self.gradient_orientations is None: - return None - return self.gradient_orientations[:, 1] diff --git a/simpeg_drivers/natural_sources/magnetotellurics/options.py b/simpeg_drivers/natural_sources/magnetotellurics/options.py index ff78a043..4bff4768 100644 --- a/simpeg_drivers/natural_sources/magnetotellurics/options.py +++ b/simpeg_drivers/natural_sources/magnetotellurics/options.py @@ -19,7 +19,12 @@ from geoh5py.objects import MTReceivers from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions, EMDataMixin +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ConductivityModelOptions, + EMDataMixin, +) class MTForwardOptions(EMDataMixin, BaseForwardOptions): @@ -34,7 +39,6 @@ class MTForwardOptions(EMDataMixin, BaseForwardOptions): :param zyx_imag_channel_bool: Boolean for zyx imaginary channel. :param zyy_real_channel_bool: Boolean for zyy real channel. :param zyy_imag_channel_bool: Boolean for zyy imaginary channel. - :param background_conductivity: Background conductivity model. :param model_type: Specify whether the models are provided in resistivity or conductivity. """ @@ -56,8 +60,7 @@ class MTForwardOptions(EMDataMixin, BaseForwardOptions): zyx_imag_channel_bool: bool | None = None zyy_real_channel_bool: bool | None = None zyy_imag_channel_bool: bool | None = None - background_conductivity: float | FloatData - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions @property def channels(self) -> list[str]: @@ -84,8 +87,6 @@ class MTInversionOptions(EMDataMixin, BaseInversionOptions): :param zyy_real_uncertainty: Real component of Zyy uncertainty. :param zyy_imag_channel: Imaginary component of Zyy data. :param zyy_imag_uncertainty: Imaginary component of Zyy uncertainty. - :param background_conductivity: Background conductivity model. - :param model_type: Specify whether the models are provided in resistivity or conductivity. """ name: ClassVar[str] = "Magnetotellurics Inversion" @@ -114,5 +115,5 @@ class MTInversionOptions(EMDataMixin, BaseInversionOptions): zyy_real_uncertainty: PropertyGroup | None = None zyy_imag_channel: PropertyGroup | None = None zyy_imag_uncertainty: PropertyGroup | None = None - background_conductivity: float | FloatData - model_type: str = "Conductivity (S/m)" + + models: ConductivityModelOptions diff --git a/simpeg_drivers/natural_sources/tipper/options.py b/simpeg_drivers/natural_sources/tipper/options.py index b657a0dd..36c59b80 100644 --- a/simpeg_drivers/natural_sources/tipper/options.py +++ b/simpeg_drivers/natural_sources/tipper/options.py @@ -19,7 +19,12 @@ from geoh5py.objects import TipperReceivers from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions, EMDataMixin +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ConductivityModelOptions, + EMDataMixin, +) class TipperForwardOptions(EMDataMixin, BaseForwardOptions): @@ -30,8 +35,6 @@ class TipperForwardOptions(EMDataMixin, BaseForwardOptions): :param txz_imag_channel_bool: Boolean for txz imaginary channel. :param tyz_real_channel_bool: Boolean for tyz real channel. :param tyz_imag_channel_bool: Boolean for tyz imaginary channel. - :param background_conductivity: Background conductivity model. - :param model_type: Specify whether the models are provided in resistivity or conductivity. """ name: ClassVar[str] = "Tipper Forward" @@ -46,8 +49,7 @@ class TipperForwardOptions(EMDataMixin, BaseForwardOptions): txz_imag_channel_bool: bool | None = None tyz_real_channel_bool: bool | None = None tyz_imag_channel_bool: bool | None = None - background_conductivity: float | FloatData - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions class TipperInversionOptions(EMDataMixin, BaseInversionOptions): @@ -62,8 +64,6 @@ class TipperInversionOptions(EMDataMixin, BaseInversionOptions): :param tyz_real_uncertainty: Real component of Tyz tipper uncertainty. :param tyz_imag_channel: Imaginary component of Tyz tipper data. :param tyz_imag_uncertainty: Imaginary component of Tyz tipper uncertainty. - :param background_conductivity: Background conductivity model. - :param model_type: Specify whether the models are provided in resistivity or conductivity. """ name: ClassVar[str] = "Tipper Inversion" @@ -82,5 +82,4 @@ class TipperInversionOptions(EMDataMixin, BaseInversionOptions): tyz_real_uncertainty: PropertyGroup | None = None tyz_imag_channel: PropertyGroup | None = None tyz_imag_uncertainty: PropertyGroup | None = None - background_conductivity: float | FloatData - model_type: str = "Conductivity (S/m)" + models: ConductivityModelOptions diff --git a/simpeg_drivers/options.py b/simpeg_drivers/options.py index 0170808c..01869a03 100644 --- a/simpeg_drivers/options.py +++ b/simpeg_drivers/options.py @@ -11,10 +11,9 @@ from __future__ import annotations -from enum import Enum from logging import getLogger from pathlib import Path -from typing import Annotated, Any, ClassVar, TypeAlias +from typing import Annotated, Any, ClassVar, Literal, TypeAlias import numpy as np from geoapps_utils.driver.data import BaseData @@ -28,8 +27,10 @@ ) from geoh5py.groups import PropertyGroup, SimPEGGroup, UIJsonGroup from geoh5py.objects import DrapeModel, Grid2D, Octree, Points +from geoh5py.objects.surveys.electromagnetics.base import BaseEMSurvey from geoh5py.shared.utils import fetch_active_workspace from geoh5py.ui_json import InputFile +from geoh5py.ui_json.templates import data_parameter from pydantic import ( AliasChoices, BaseModel, @@ -91,13 +92,30 @@ def at_least_one(cls, data): return data -class SolverType(str, Enum): +class ComputeOptions(BaseModel): """ - Supported solvers. + Options related to compute resources and parallelization. + + :param distributed_workers: Distributed workers. + :param max_chunk_size: Maximum chunk size used for parallel operations. + :param max_ram: Maximum amount of RAM available + :param n_cpu: Number of CPUs to use for parallel operations. + :param n_threads: Number of threads per worker + :param n_workers: Number of distributed workers to use. + :param performance_report: Generate an HTML report from dask.diagnostics + :param solver_type: Type of solver to use for the inversion. + :param tile_spatial: Number of tiles to split the data. """ - Pardiso = "Pardiso" - Mumps = "Mumps" + distributed_workers: str | None = None + max_chunk_size: int = 128 + max_ram: float | None = None + n_cpu: int | None = None + n_threads: int | None = None + n_workers: int | None = 1 + performance_report: bool = False + solver_type: Literal["Pardiso", "Mumps"] = "Pardiso" + tile_spatial: int = 1 class DeprecatedOptions(BaseModel): @@ -105,13 +123,15 @@ class DeprecatedOptions(BaseModel): List of deprecated options. """ + beta_search: Deprecated chunk_by_rows: Deprecated - parallelized: Deprecated ga_group: Deprecated - z_from_topo: Deprecated - receivers_radar_drape: Deprecated - receivers_offset_z: Deprecated gps_receivers_offset: Deprecated + gradient_type: Deprecated + receivers_offset_z: Deprecated + receivers_radar_drape: Deprecated + parallelized: Deprecated + z_from_topo: Deprecated Deprecations = Annotated[ @@ -128,22 +148,10 @@ class CoreOptions(BaseData): :param conda_environment: Name of the conda environment used to run the application with all of its dependencies. :param inversion_type: Type of inversion. - :param data_object: Data object containing survey geometry and data - channels. - :param mesh: Mesh object containing models (starting, reference, active, etc..). - :param starting_model: Starting model used to start inversion or for simulating - data in the forward operation. :param active_cells: Active cell data as either a topography surface/data or a 3D model. - :param tile_spatial: Number of tiles to split the data. - :param max_chunk_size: Maximum chunk size used for parallel operations. - :param save_sensitivities: Save sensitivities to file. + :param out_group: Output group to save results. :param generate_sweep: Generate sweep file instead of running the app. - :param distributed_workers: Distributed workers. - :param n_threads: Number of threads per worker - :param n_workers: Number of distributed workers to use. - :param max_ram: Maximum amount of RAM available - :param performance_report: Generate an HTML report from dask.diagnostics """ # TODO: Refactor to allow frozen True. Currently params.data_object is @@ -157,34 +165,35 @@ class CoreOptions(BaseData): ) title: str | None = None + version: str = simpeg_drivers.__version__ icon: str | None = None + inversion_type: str documentation: str | None = None - version: str = simpeg_drivers.__version__ - run_command: str = "simpeg_drivers.driver" conda_environment: str = "simpeg_drivers" - inversion_type: str - data_object: Points - mesh: Octree | DrapeModel | None - starting_model: float | FloatData + run_command: str = "simpeg_drivers.driver" + mesh: Octree | Grid2D | DrapeModel | None = None active_cells: ActiveCellsOptions - tile_spatial: int = 1 - - solver_type: SolverType = SolverType.Pardiso - save_sensitivities: bool = False - max_chunk_size: int = 128 + compute: ComputeOptions = ComputeOptions() out_group: SimPEGGroup | UIJsonGroup | None = None generate_sweep: bool = False - distributed_workers: str | None = None - n_workers: int | None = 1 - n_threads: int | None = None - max_ram: float | None = None - performance_report: bool = False - gradient_type: str = "total" # To properly deprecate in the future - n_cpu: int | None = None # To properly deprecate in the future - + workspace_geoh5: Path | None = Field( + default=None, + exclude=True, + ) # List of deprecated parameters deprecations: Deprecations + @property + def components(self) -> list[str]: + """Return list of component names.""" + return [self._component_name(k) for k in self.__dict__ if "channel" in k] + + def _component_name(self, component: str) -> str: + """Strip the '_channel' and '_channel_bool' suffixes from data name.""" + return "_".join( + [k for k in component.split("_") if k not in ["channel", "bool"]] + ) + @field_validator("mesh", mode="before") @classmethod def mesh_cannot_be_rotated(cls, value: Octree): @@ -227,73 +236,13 @@ def update_out_group_options(self): def workpath(self): return Path(self.geoh5.h5file).parent - @property - def components(self) -> list[str]: - """Return list of component names.""" - return [self._component_name(k) for k in self.__dict__ if "channel" in k] - - @property - def active_components(self) -> list[str]: - """Return list of active components.""" - return [ - k - for k in self.components - if getattr(self, "_".join([k, "channel"])) is not None - ] - - @property - def data(self) -> InversionDataDict: - """Return dictionary of data components and associated values.""" - out = {} - for k in self.active_components: - out[k] = self.component_data(k) - return out - - @property - def uncertainties(self) -> InversionDataDict: - """Return dictionary of unceratinty components and associated values.""" - out = {} - for k in self.active_components: - out[k] = self.component_uncertainty(k) - return out - - def component_data(self, component: str) -> np.ndarray | None: - """Return data values associated with the component.""" - data = getattr(self, "_".join([component, "channel"]), None) - if isinstance(data, NumericData): - data = data.values - return data - - def component_uncertainty(self, component: str) -> np.ndarray | None: - """ - Return uncertainty values associated with the component. - - If the uncertainty is a float, it will be broadcasted to the same - shape as the data. - - :param component: Component name. - """ - data = getattr(self, "_".join([component, "uncertainty"]), None) - if isinstance(data, NumericData): - data = data.values - elif isinstance(data, float): - data *= np.ones_like(self.component_data(component)) - - return data - - def _component_name(self, component: str) -> str: - """Strip the '_channel' and '_channel_bool' suffixes from data name.""" - return "_".join( - [k for k in component.split("_") if k not in ["channel", "bool"]] - ) - @property def padding_cells(self) -> int: """ Default padding cells used for tiling. """ # Keep whole mesh for 1 tile - if self.tile_spatial == 1: + if self.compute.tile_spatial == 1: return 100 return 4 if self.inversion_type in ["fdem", "tdem"] else 6 @@ -304,133 +253,59 @@ def _create_input_file_from_attributes(self) -> InputFile: return ifile -class BaseForwardOptions(CoreOptions): +class ModelOptions(BaseModel): """ - Base class for forward parameters. - - See CoreData class docstring for addition parameters descriptions.""" - - forward_only: bool = True - - @property - def active_components(self) -> list[str]: - """Return list of active components.""" - return [k for k in self.components if getattr(self, f"{k}_channel_bool")] - - -class BaseInversionOptions(CoreOptions): - """ - Base class for inversion parameters. - - See CoreData class docstring for addition parameters descriptions. + Base class for model parameters. + :param starting_model: Starting model. :param reference_model: Reference model. :param lower_bound: Lower bound. :param upper_bound: Upper bound. - - :param alpha_s: Alpha s. - :param length_scale_x: Length scale x. - :param length_scale_y: Length scale y. - :param length_scale_z: Length scale z. + :param alpha_s: Scale on the reference model. + :param length_scale_x: Length scale along the u-direction. + :param length_scale_y: Length scale along the v-direction. + :param length_scale_z: Length scale along the z-direction. :param gradient_rotation: Property group for gradient rotation angles. - - :param s_norm: S norm. - :param x_norm: X norm. - :param y_norm: Y norm. - :param z_norm: Z norm. - :param max_irls_iterations: Maximum IRLS iterations. - :param starting_chi_factor: Starting chi factor. - - :param percentile: Percentile. - :param beta_tol: Beta tolerance. - - :param chi_factor: Chi factor. - :param auto_scale_misfits: Automatically scale misfits. - :param initial_beta: Initial beta. - :param initial_beta_ratio: Initial beta ratio. - :param cooling_factor: Cooling factor. - - :param cooling_rate: Cooling rate. - :param max_global_iterations: Maximum global iterations. - :param max_line_search_iterations: Maximum line search iterations. - :param max_cg_iterations: Maximum CG iterations. - :param tol_cg: Tolerance CG. - :param f_min_change: F min change. - - :param sens_wts_threshold: Sensitivity weights threshold. - :param every_iteration_bool: Every iteration bool. - - :param solver_type: Direct solver provider. Either Mumps or Pardiso. - :param tile_spatial: Tile the data spatially. - :param store_sensitivities: Store sensitivities. - :param out_group: Output group. - :param generate_sweep: Generate sweep. - :param epsilon_cooling_factor: Cool eps fact. - :param beta_search: Beta search. + :param s_norm: Norm applied on the reference model. + :param x_norm: Norm applied on the smoothing along the u-direction. + :param y_norm: Norm applied on the smoothing along the v-direction. + :param z_norm: Norm applied on the smoothing along the w-direction. """ model_config = ConfigDict( arbitrary_types_allowed=True, ) - name: ClassVar[str] = "Inversion" - - title: str = "Geophysical inversion" - run_command: str = "simpeg_drivers.driver" - - forward_only: bool = False - conda_environment: str = "simpeg_drivers" - + # Model options + starting_model: float | FloatData reference_model: float | FloatData | None = None lower_bound: float | FloatData | None = None upper_bound: float | FloatData | None = None + # Model values for regularization alpha_s: float | FloatData | None = 1.0 length_scale_x: float | FloatData = 1.0 length_scale_y: float | FloatData | None = 1.0 length_scale_z: float | FloatData = 1.0 gradient_rotation: PropertyGroup | None = None + # Model values for IRLS s_norm: float | FloatData | None = 0.0 x_norm: float | FloatData = 2.0 y_norm: float | FloatData | None = 2.0 z_norm: float | FloatData = 2.0 - max_irls_iterations: int = 25 - starting_chi_factor: float = 1.0 - - chi_factor: float = 1.0 - auto_scale_misfits: bool = True - initial_beta_ratio: float | None = 100.0 - initial_beta: float | None = None - - cooling_factor: float = Field( - 2.0, validation_alias=AliasChoices("cooling_factor", "coolingFactor") - ) - cooling_rate: int = Field( - 1, validation_alias=AliasChoices("cooling_rate", "coolingRate") - ) - epsilon_cooling_factor: float = Field( - 1.2, validation_alias=AliasChoices("epsilon_cooling_factor", "coolEpsFact") - ) - - max_global_iterations: int = 50 - max_line_search_iterations: int = 20 - max_cg_iterations: int = 30 - tol_cg: float = 1e-4 - f_min_change: float = 1e-2 - solver_type: SolverType = SolverType.Pardiso - - sens_wts_threshold: float = 1e-3 - every_iteration_bool: bool = True - - store_sensitivities: str = "ram" - - beta_tol: float = 0.5 + @property + def gradient_direction(self) -> np.ndarray: + if self.gradient_orientations is None: + return None + return self.gradient_orientations[:, 0] - percentile: float = Field( - 95, validation_alias=AliasChoices("percentile", "prctile") - ) + @property + def gradient_dip(self) -> np.ndarray: + if self.gradient_orientations is None: + return None + return self.gradient_orientations[:, 1] @property def gradient_orientations(self) -> tuple(float, float): @@ -448,17 +323,107 @@ def gradient_orientations(self) -> tuple(float, float): return None + +class ConductivityModelOptions(ModelOptions): + """ + Options for the conductivity model used in all of EM methods. + """ + + model_type: Literal["Conductivity (S/m)", "Resistivity (Ohm-m)"] = ( + "Conductivity (S/m)" + ) + conductivity_model: float | FloatData | None = Field( + None, + validation_alias=AliasChoices("background_conductivity", "conductivity_model"), + ) + + +class BaseForwardOptions(CoreOptions): + """ + Base class for forward parameters. + + See CoreData class docstring for addition parameters descriptions. + + :param data_object: Data object containing the survey data. + :param models: Model options for the forward simulation. + """ + + forward_only: bool = True + data_object: Points + models: ModelOptions + @property - def gradient_direction(self) -> np.ndarray: - if self.gradient_orientations is None: - return None - return self.gradient_orientations[:, 0] + def active_components(self) -> list[str]: + """Return list of active components.""" + return [k for k in self.components if getattr(self, f"{k}_channel_bool")] @property - def gradient_dip(self) -> np.ndarray: - if self.gradient_orientations is None: - return None - return self.gradient_orientations[:, 1] + def data(self) -> InversionDataDict: + """Return dictionary of data components and associated values.""" + return dict.fromkeys(self.active_components) + + +class CoolingSceduleOptions(BaseModel): + """ + Options controlling the trade-off schedule between data misfit and + model regularization. + + :param chi_factor: Target chi factor for the data misfit. + :param cooling_factor: Factor by which the regularization parameter is reduced. + :param cooling_rate: Rate at which the regularization parameter is reduced. + :param initial_beta: Initial regularization parameter. + :param initial_beta_ratio: Initial ratio of regularization to data misfit. + """ + + chi_factor: float = 1.0 + cooling_factor: float = Field( + 2.0, validation_alias=AliasChoices("cooling_factor", "coolingFactor") + ) + cooling_rate: int = Field( + 1, validation_alias=AliasChoices("cooling_rate", "coolingRate") + ) + initial_beta: float | None = None + initial_beta_ratio: float | None = 100.0 + + +class DirectiveOptions(BaseModel): + """ + Directive options for inversion. + + :param auto_scale_misfits: Automatically scale misfits of sub objectives. + :param beta_search: Beta search. + :param every_iteration_bool: Update the sensitivity weights every iteration. + :param save_sensitivities: Save sensitivities to file. + :param sens_wts_threshold: Threshold for sensitivity weights. + """ + + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + auto_scale_misfits: bool = False + every_iteration_bool: bool = True + save_sensitivities: bool = False + sens_wts_threshold: float | None = 1e-3 + + +class DrapeModelOptions(BaseModel): + """ + Drape model parameters for 2D simulation/inversion]. + + :param u_cell_size: Horizontal cell size for the drape model. + :param v_cell_size: Vertical cell size for the drape model. + :param depth_core: Depth of the core region. + :param horizontal_padding: Horizontal padding. + :param vertical_padding: Vertical padding. + :param expansion_factor: Expansion factor for the drape model. + """ + + u_cell_size: float | None = 25.0 + v_cell_size: float | None = 25.0 + depth_core: float | None = 100.0 + horizontal_padding: float | None = 100.0 + vertical_padding: float | None = 100.0 + expansion_factor: float | None = 1.1 class EMDataMixin: @@ -466,6 +431,8 @@ class EMDataMixin: Mixin class to add data and uncertainty access from property groups. """ + data_object: BaseEMSurvey + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -507,40 +474,45 @@ def property_group_data(self, property_group: PropertyGroup): return data -class DrapeModelOptions(BaseModel): +class IRLSOptions(BaseModel): """ - Drape model parameters for 2D simulation/inversion]. + IRLS (Iteratively Reweighted Least Squares) options for inversion. - :param u_cell_size: Horizontal cell size for the drape model. - :param v_cell_size: Vertical cell size for the drape model. - :param depth_core: Depth of the core region. - :param horizontal_padding: Horizontal padding. - :param vertical_padding: Vertical padding. - :param expansion_factor: Expansion factor for the drape model. + :param beta_tol: Tolerance for the beta parameter. + :param epsilon_cooling_factor: Factor by which the epsilon value is reduced + :param max_irls_iterations: Maximum number of IRLS iterations. + :param percentile: Percentile of the model values used to compute the initial epsilon value. + :param starting_chi_factor: Starting chi factor for IRLS. """ - u_cell_size: float | None = 25.0 - v_cell_size: float | None = 25.0 - depth_core: float | None = 100.0 - horizontal_padding: float | None = 100.0 - vertical_padding: float | None = 100.0 - expansion_factor: float | None = 1.1 + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + + beta_tol: float = 0.5 + epsilon_cooling_factor: float = Field( + 1.2, validation_alias=AliasChoices("epsilon_cooling_factor", "coolEpsFact") + ) + max_irls_iterations: int = 25 + percentile: float = Field( + 95, validation_alias=AliasChoices("percentile", "prctile") + ) + starting_chi_factor: float = 1.0 class LineSelectionOptions(BaseModel): """ Line selection parameters for 2D inversions. - :param line_object: Reference data categorizing survey by line ids. :param line_id: Line identifier for simulation/inversion. + :param line_object: Reference data categorizing survey by line ids. """ model_config = ConfigDict( arbitrary_types_allowed=True, ) - - line_object: ReferencedData line_id: int = 1 + line_object: ReferencedData @field_validator("line_object", mode="before") @classmethod @@ -554,3 +526,118 @@ def line_id_referenced(self): if self.line_id not in self.line_object.values: raise ValueError("Line id isn't referenced in the line object.") return self + + +class OptimizationOptions(BaseModel): + """ + Optimization parameters for inversion. + + :param f_min_change: F min change. + :param max_cg_iterations: Maximum CG iterations. + :param max_global_iterations: Maximum global iterations. + :param max_line_search_iterations: Maximum line search iterations. + :param tol_cg: Tolerance CG. + """ + + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + + f_min_change: float = 1e-2 + max_cg_iterations: int = 30 + max_global_iterations: int = 50 + max_line_search_iterations: int = 20 + tol_cg: float = 1e-4 + + +class BaseInversionOptions(CoreOptions): + """ + Base class for inversion parameters. + + See CoreData class docstring for addition parameters descriptions. + + :param name: Name of the inversion. + :param title: Title of the inversion. + :param run_command: Command (module name) used to run the application from + command line. + :param forward_only: If True, only run the forward simulation. + :param conda_environment: Name of the conda environment used to run the program + :param data_object: Data object containing the survey data. + :param models: Model options for the inversion. + :param regularization: Options specific to the regularization function. + :param irls: Options specific to the IRLS (Iteratively Reweighted Least Squares) directive. + :param directives: Additional directives to be used in the inversion. + :param cooling_schedule: Options controlling the trade-off schedule between data misfit and model regularization. + :param optimization: Options for the optimization algorithm used in the inversion. + :param store_sensitivities: Where to store sensitivities, either in RAM or on disk. + """ + + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + + name: ClassVar[str] = "Inversion" + + title: str = "Geophysical inversion" + run_command: str = "simpeg_drivers.driver" + + forward_only: bool = False + conda_environment: str = "simpeg_drivers" + + data_object: Points + models: ModelOptions + irls: IRLSOptions = IRLSOptions() + directives: DirectiveOptions = DirectiveOptions() + cooling_schedule: CoolingSceduleOptions = CoolingSceduleOptions() + optimization: OptimizationOptions = OptimizationOptions() + + store_sensitivities: str = "ram" + + @property + def active_components(self) -> list[str]: + """Return list of active components.""" + return [ + k + for k in self.components + if getattr(self, "_".join([k, "channel"])) is not None + ] + + @property + def data(self) -> InversionDataDict: + """Return dictionary of data components and associated values.""" + out = {} + for k in self.active_components: + out[k] = self.component_data(k) + return out + + @property + def uncertainties(self) -> InversionDataDict: + """Return dictionary of unceratinty components and associated values.""" + out = {} + for k in self.active_components: + out[k] = self.component_uncertainty(k) + return out + + def component_data(self, component: str) -> np.ndarray | None: + """Return data values associated with the component.""" + data = getattr(self, "_".join([component, "channel"]), None) + if isinstance(data, NumericData): + data = data.values + return data + + def component_uncertainty(self, component: str) -> np.ndarray | None: + """ + Return uncertainty values associated with the component. + + If the uncertainty is a float, it will be broadcasted to the same + shape as the data. + + :param component: Component name. + """ + data = getattr(self, "_".join([component, "uncertainty"]), None) + if isinstance(data, NumericData): + data = data.values + elif isinstance(data, float): + data *= np.ones_like(self.component_data(component)) + + return data diff --git a/simpeg_drivers/potential_fields/gravity/options.py b/simpeg_drivers/potential_fields/gravity/options.py index b95f850e..177231bf 100644 --- a/simpeg_drivers/potential_fields/gravity/options.py +++ b/simpeg_drivers/potential_fields/gravity/options.py @@ -41,7 +41,7 @@ class GravityForwardOptions(BaseForwardOptions): title: str = "Gravity Forward" physical_property: str = "density" inversion_type: str = "gravity" - workspace_geoh5: Path | None = None + gx_channel_bool: bool = False gy_channel_bool: bool = False gz_channel_bool: bool = True @@ -84,7 +84,7 @@ class GravityInversionOptions(BaseInversionOptions): title: str = "Gravity Inversion" physical_property: str = "density" inversion_type: str = "gravity" - workspace_geoh5: Path | None = None + gx_channel: FloatData | None = None gy_channel: FloatData | None = None gz_channel: FloatData | None = None diff --git a/simpeg_drivers/potential_fields/magnetic_scalar/options.py b/simpeg_drivers/potential_fields/magnetic_scalar/options.py index 7e202416..8b462b7d 100644 --- a/simpeg_drivers/potential_fields/magnetic_scalar/options.py +++ b/simpeg_drivers/potential_fields/magnetic_scalar/options.py @@ -17,7 +17,19 @@ from geoh5py.data import FloatData from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ModelOptions, +) + + +class MagneticModelOptions(ModelOptions): + """ + ModelOptions class with defaulted lower bound. + """ + + lower_bound: float | FloatData | None = 0 class MagneticForwardOptions(BaseForwardOptions): @@ -55,6 +67,11 @@ class MagneticForwardOptions(BaseForwardOptions): byy_channel_bool: bool = False byz_channel_bool: bool = False bzz_channel_bool: bool = False + inducing_field_strength: float | FloatData + inducing_field_inclination: float | FloatData + inducing_field_declination: float | FloatData + + models: MagneticModelOptions class MagneticInversionOptions(BaseInversionOptions): @@ -118,4 +135,5 @@ class MagneticInversionOptions(BaseInversionOptions): inducing_field_strength: float | FloatData inducing_field_inclination: float | FloatData inducing_field_declination: float | FloatData - lower_bound: float | FloatData | None = 0.0 + + models: MagneticModelOptions diff --git a/simpeg_drivers/potential_fields/magnetic_vector/options.py b/simpeg_drivers/potential_fields/magnetic_vector/options.py index 562b7262..726e71d1 100644 --- a/simpeg_drivers/potential_fields/magnetic_vector/options.py +++ b/simpeg_drivers/potential_fields/magnetic_vector/options.py @@ -16,10 +16,25 @@ from geoh5py.data import FloatData from geoh5py.ui_json.annotations import Deprecated -from pydantic import model_validator from simpeg_drivers import assets_path -from simpeg_drivers.options import BaseForwardOptions, BaseInversionOptions +from simpeg_drivers.options import ( + BaseForwardOptions, + BaseInversionOptions, + ModelOptions, +) + + +class VectorModelOptions(ModelOptions): + """ + Magnetic Vector Model options. + """ + + lower_bound: Deprecated | None = None + starting_inclination: float | FloatData | None = None + starting_declination: float | FloatData | None = None + reference_inclination: float | FloatData | None = None + reference_declination: float | FloatData | None = None class MVIForwardOptions(BaseForwardOptions): @@ -57,11 +72,10 @@ class MVIForwardOptions(BaseForwardOptions): byy_channel_bool: bool = False byz_channel_bool: bool = False bzz_channel_bool: bool = False - inducing_field_strength: float | FloatData = 50000.0 - inducing_field_inclination: float | FloatData = 90.0 - inducing_field_declination: float | FloatData = 0.0 - starting_inclination: float | FloatData | None = None - starting_declination: float | FloatData | None = None + inducing_field_strength: float | FloatData + inducing_field_inclination: float | FloatData + inducing_field_declination: float | FloatData + models: VectorModelOptions class MVIInversionOptions(BaseInversionOptions): @@ -91,10 +105,6 @@ class MVIInversionOptions(BaseInversionOptions): :param inducing_field_strength: Inducing field strength. :param inducing_field_inclination: Inducing field inclination. :param inducing_field_declination: Inducing field declination. - :param starting_inclination: Starting inclination. - :param starting_declination: Starting declination. - :param reference_inclination: Reference inclination. - :param reference_declination: Reference declination. """ name: ClassVar[str] = "Magnetic Vector Inversion" @@ -126,13 +136,7 @@ class MVIInversionOptions(BaseInversionOptions): byy_uncertainty: float | FloatData | None = None byz_uncertainty: float | FloatData | None = None bzz_uncertainty: float | FloatData | None = None - inducing_field_strength: float | FloatData = 50000.0 - inducing_field_inclination: float | FloatData = 90.0 - inducing_field_declination: float | FloatData = 0.0 - - lower_bound: Deprecated | None = None - - starting_inclination: float | FloatData | None = None - starting_declination: float | FloatData | None = None - reference_inclination: float | FloatData | None = None - reference_declination: float | FloatData | None = None + inducing_field_strength: float | FloatData + inducing_field_inclination: float | FloatData + inducing_field_declination: float | FloatData + models: VectorModelOptions diff --git a/simpeg_drivers/utils/tile_estimate.py b/simpeg_drivers/utils/tile_estimate.py index 11b9e1a0..ca31fe43 100644 --- a/simpeg_drivers/utils/tile_estimate.py +++ b/simpeg_drivers/utils/tile_estimate.py @@ -103,7 +103,7 @@ def get_results(self, max_tiles: int = 13) -> dict: ) # Get the median tile ind = int(np.argsort([len(tile) for tile in tiles])[int(count / 2)]) - self.driver.params.tile_spatial = int(count) + self.driver.params.compute.tile_spatial = int(count) sim, _, _, mapping = MisfitFactory.create_nested_simulation( self.driver.inversion_data, self.driver.inversion_mesh, @@ -221,7 +221,7 @@ def generate_optimal_group(self, optimal: int): Generate a new SimPEGGroup with the optimal number of tiles. """ out_group = self.params.simulation.copy(copy_children=False) - self.driver.params.tile_spatial = optimal + self.driver.params.compute.tile_spatial = optimal self.driver.params.out_group = out_group out_group.options = self.driver.params.serialize() out_group.metadata = None diff --git a/tests/data_test.py b/tests/data_test.py index 5f01de33..e829caa6 100644 --- a/tests/data_test.py +++ b/tests/data_test.py @@ -46,13 +46,17 @@ def get_mvi_params(tmp_path: Path, **kwargs) -> MVIInversionOptions: tmi_channel = survey.add_data( {"tmi": {"values": np.random.rand(survey.n_vertices)}} ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, data_object=survey, tmi_channel=tmi_channel, - active_cells=ActiveCellsOptions(topography_object=topography), + tmi_uncertainty=1.0, + topography_object=topography, mesh=model.parent, starting_model=model, + inducing_field_strength=50000.0, + inducing_field_inclination=60.0, + inducing_field_declination=30.0, **kwargs, ) return params @@ -115,7 +119,7 @@ def test_survey_data(tmp_path: Path): active_cells = ActiveCellsOptions( topography_object=test_topo_object, topography=topo ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=workspace, data_object=test_data_object, active_cells=active_cells, @@ -128,6 +132,9 @@ def test_survey_data(tmp_path: Path): mesh=mesh, starting_model=0.0, tile_spatial=2, + inducing_field_strength=50000.0, + inducing_field_inclination=60.0, + inducing_field_declination=30.0, ) driver = MVIInversionDriver(params) @@ -201,7 +208,7 @@ def test_has_tensor(): def test_get_uncertainty_component(tmp_path: Path): - params = get_mvi_params(tmp_path, tmi_uncertainty=1.0) + params = get_mvi_params(tmp_path) geoh5 = params.geoh5 with geoh5.open(): data = InversionData(geoh5, params) @@ -223,7 +230,7 @@ def test_normalize(tmp_path: Path): def test_get_survey(tmp_path: Path): - params = get_mvi_params(tmp_path, tmi_uncertainty=1.0) + params = get_mvi_params(tmp_path) geoh5 = params.geoh5 with geoh5.open(): data = InversionData(geoh5, params) diff --git a/tests/driver_test.py b/tests/driver_test.py index 03b69ea6..345edcea 100644 --- a/tests/driver_test.py +++ b/tests/driver_test.py @@ -35,17 +35,16 @@ def test_smallness_terms(tmp_path: Path): with geoh5.open(): gz = survey.add_data({"gz": {"values": np.ones(survey.n_vertices)}}) mesh = model.parent - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=gz.parent, starting_model=1e-4, reference_model=0.0, alpha_s=1.0, s_norm=0.0, - gradient_type="components", gz_channel=gz, gz_uncertainty=2e-3, lower_bound=0.0, @@ -56,7 +55,7 @@ def test_smallness_terms(tmp_path: Path): ) params.alpha_s = None driver = GravityInversionDriver(params) - assert driver.regularization.objfcts[0].alpha_s == 0.0 + assert driver.regularization.objfcts[0].alpha_s == 1.0 def test_target_chi(tmp_path: Path, caplog): @@ -76,11 +75,10 @@ def test_target_chi(tmp_path: Path, caplog): with geoh5.open(): gz = survey.add_data({"gz": {"values": np.ones(survey.n_vertices)}}) mesh = model.parent - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=gz.parent, gz_channel=gz, gz_uncertainty=2e-3, diff --git a/tests/locations_test.py b/tests/locations_test.py index b654cdc7..6754485d 100644 --- a/tests/locations_test.py +++ b/tests/locations_test.py @@ -36,14 +36,17 @@ def get_mvi_params(tmp_path: Path) -> MVIInversionOptions: tmi_channel = survey.add_data( {"tmi": {"values": np.random.rand(survey.n_vertices)}} ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, data_object=survey, tmi_channel=tmi_channel, tmi_uncertainty=1.0, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, mesh=model.parent, starting_model=model, + inducing_field_strength=50000.0, + inducing_field_inclination=60.0, + inducing_field_declination=30.0, ) return params diff --git a/tests/meshes_test.py b/tests/meshes_test.py index e8a02391..d492c1c8 100644 --- a/tests/meshes_test.py +++ b/tests/meshes_test.py @@ -47,13 +47,17 @@ def get_mvi_params(tmp_path: Path) -> MVIInversionOptions: {"elevation": {"values": topography.vertices[:, 2]}} ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, data_object=survey, tmi_channel=tmi_channel, + tmi_uncertainty=0.01, active_cells=ActiveCellsOptions( topography_object=topography, topography=elevation ), + inducing_field_strength=50000.0, + inducing_field_inclination=60.0, + inducing_field_declination=30.0, mesh=mesh, starting_model=model, ) diff --git a/tests/models_test.py b/tests/models_test.py index d8208574..0352c22c 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -40,6 +40,12 @@ def get_mvi_params(tmp_path: Path) -> MVIInversionOptions: ) with geoh5.open(): mesh = model.parent + ref_inducing = mesh.add_data( + { + "reference_inclination": {"values": np.ones(mesh.n_cells) * 79.0}, + "reference_declination": {"values": np.ones(mesh.n_cells) * 11.0}, + } + ) tmi_channel = survey.add_data( { "tmi": {"values": np.random.rand(survey.n_vertices)}, @@ -48,10 +54,11 @@ def get_mvi_params(tmp_path: Path) -> MVIInversionOptions: elevation = topography.add_data( {"elevation": {"values": topography.vertices[:, 2]}} ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, data_object=survey, tmi_channel=tmi_channel, + tmi_uncertainty=1.0, mesh=mesh, active_cells=ActiveCellsOptions( topography_object=topography, topography=elevation @@ -60,8 +67,9 @@ def get_mvi_params(tmp_path: Path) -> MVIInversionOptions: inducing_field_inclination=79.0, inducing_field_declination=11.0, reference_model=0.0, - reference_inclination=79.0, - reference_declination=11.0, + inducing_field_strength=50000.0, + reference_inclination=ref_inducing[0], + reference_declination=ref_inducing[1], ) return params @@ -72,7 +80,7 @@ def test_zero_reference_model(tmp_path: Path): geoh5 = params.geoh5 with geoh5.open(): driver = MVIInversionDriver(params) - _ = InversionModel(driver, "reference", is_vector=True) + _ = InversionModel(driver, "reference_model") incl = np.unique(geoh5.get_entity("reference_inclination")[0].values) decl = np.unique(geoh5.get_entity("reference_declination")[0].values) assert len(incl) == 1 @@ -87,18 +95,23 @@ def test_collection(tmp_path: Path): driver = MVIInversionDriver(params) models = InversionModelCollection(driver) models.remove_air(driver.models.active_cells) - starting = InversionModel(driver, "starting", is_vector=True) + starting = InversionModel(driver, "starting_model") starting.remove_air(driver.models.active_cells) - np.testing.assert_allclose(models.starting, starting.model, atol=1e-7) + assert len(models.starting_model) == 3 * len(starting.model) + np.testing.assert_allclose( + np.linalg.norm(models.starting_model.reshape((-1, 3), order="F"), axis=1), + starting.model, + atol=1e-7, + ) def test_initialize(tmp_path: Path): params = get_mvi_params(tmp_path) with params.geoh5.open(): driver = MVIInversionDriver(params) - starting_model = InversionModel(driver, "starting", is_vector=True) - assert len(starting_model.model) == 3 * driver.inversion_mesh.n_cells - assert len(np.unique(starting_model.model)) == 3 + starting_model = InversionModel(driver, "starting_model") + assert len(starting_model.model) == driver.inversion_mesh.n_cells + assert len(np.unique(starting_model.model)) == 1 def test_model_from_object(tmp_path: Path): @@ -116,11 +129,11 @@ def test_model_from_object(tmp_path: Path): point_object = Points.create(geoh5, name="test_point", vertices=cc) point_object.add_data({"test_data": {"values": vals}}) data_object = geoh5.get_entity("test_data")[0] - params.lower_bound = data_object - lower_bound = InversionModel(driver, "lower_bound", is_vector=True) - nc = int(len(lower_bound.model) / 3) + params.models.upper_bound = data_object + upper_bound = InversionModel(driver, "upper_bound") + A = driver.inversion_mesh.mesh.cell_centers - b = lower_bound.model[:nc] + b = upper_bound.model from scipy.linalg import lstsq m = lstsq(A, b)[0] diff --git a/tests/run_tests/driver_2d_rotated_gradients_test.py b/tests/run_tests/driver_2d_rotated_gradients_test.py index 74a3790e..37793b85 100644 --- a/tests/run_tests/driver_2d_rotated_gradients_test.py +++ b/tests/run_tests/driver_2d_rotated_gradients_test.py @@ -64,7 +64,7 @@ def test_dc2d_rotated_grad_fwr_run( line_object=geoh5.get_entity("line_ids")[0], line_id=101, ) - params = DC2DForwardOptions( + params = DC2DForwardOptions.build( geoh5=geoh5, data_object=survey, line_selection=line_selection, @@ -77,7 +77,7 @@ def test_dc2d_rotated_grad_fwr_run( expansion_factor=1.1, ), starting_model=model, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, ) fwr_driver = DC2DForwardDriver(params) fwr_driver.run() @@ -118,7 +118,7 @@ def test_dc2d_rotated_grad_run( ) # Run the inverse - params = DC2DInversionOptions( + params = DC2DInversionOptions.build( geoh5=geoh5, drape_model=DrapeModelOptions( u_cell_size=5.0, @@ -128,7 +128,7 @@ def test_dc2d_rotated_grad_run( vertical_padding=100.0, expansion_factor=1.1, ), - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, line_selection=LineSelectionOptions( line_object=geoh5.get_entity("line_ids")[0], line_id=101, @@ -143,7 +143,6 @@ def test_dc2d_rotated_grad_run( s_norm=0.0, x_norm=0.0, z_norm=0.0, - gradient_type="components", max_global_iterations=max_iterations, initial_beta=None, initial_beta_ratio=1e0, diff --git a/tests/run_tests/driver_airborne_fem_1d_test.py b/tests/run_tests/driver_airborne_fem_1d_test.py index a38b25a0..b5ab4f22 100644 --- a/tests/run_tests/driver_airborne_fem_1d_test.py +++ b/tests/run_tests/driver_airborne_fem_1d_test.py @@ -57,10 +57,10 @@ def test_fem_fwr_1d_run( inversion_type="fdem 1d", flatten=False, ) - params = FDEM1DForwardOptions( + params = FDEM1DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, z_real_channel_bool=True, @@ -126,10 +126,10 @@ def test_fem_1d_run(tmp_path: Path, max_iterations=1, pytest=True): orig_z_real_1 = geoh5.get_entity("Iteration_0_z_real_[0]")[0].values # Run the inverse - params = FDEM1DInversionOptions( + params = FDEM1DInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=1e-3, reference_model=1e-3, @@ -137,7 +137,6 @@ def test_fem_1d_run(tmp_path: Path, max_iterations=1, pytest=True): s_norm=0.0, x_norm=0.0, z_norm=0.0, - gradient_type="components", upper_bound=0.75, max_global_iterations=max_iterations, initial_beta_ratio=1e1, diff --git a/tests/run_tests/driver_airborne_tem_1d_test.py b/tests/run_tests/driver_airborne_tem_1d_test.py index bddf1d09..3f706843 100644 --- a/tests/run_tests/driver_airborne_tem_1d_test.py +++ b/tests/run_tests/driver_airborne_tem_1d_test.py @@ -55,10 +55,10 @@ def test_airborne_tem_1d_fwr_run( padding_distance=400.0, flatten=False, ) - params = TDEM1DForwardOptions( + params = TDEM1DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, z_channel_bool=True, @@ -127,10 +127,10 @@ def test_airborne_tem_1d_run(tmp_path: Path, max_iterations=1, pytest=True): orig_dBzdt = geoh5.get_entity("Iteration_0_z_[0]")[0].values # Run the inverse - params = TDEM1DInversionOptions( + params = TDEM1DInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=5e-1, reference_model=1e-1, diff --git a/tests/run_tests/driver_airborne_tem_test.py b/tests/run_tests/driver_airborne_tem_test.py index 1ad5f7ae..be971724 100644 --- a/tests/run_tests/driver_airborne_tem_test.py +++ b/tests/run_tests/driver_airborne_tem_test.py @@ -50,10 +50,10 @@ def test_bad_waveform(tmp_path: Path): padding_distance=400.0, flatten=False, ) - params = TDEMForwardOptions( + params = TDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, x_channel_bool=True, @@ -89,10 +89,10 @@ def test_airborne_tem_fwr_run( padding_distance=400.0, flatten=False, ) - params = TDEMForwardOptions( + params = TDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, x_channel_bool=True, @@ -162,10 +162,10 @@ def test_airborne_tem_run(tmp_path: Path, max_iterations=1, pytest=True): orig_dBzdt = geoh5.get_entity("Iteration_0_z_[0]")[0].values # Run the inverse - params = TDEMInversionOptions( + params = TDEMInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=1e-3, reference_model=1e-3, @@ -175,7 +175,6 @@ def test_airborne_tem_run(tmp_path: Path, max_iterations=1, pytest=True): y_norm=2.0, z_norm=2.0, alpha_s=1e-4, - gradient_type="total", lower_bound=2e-6, upper_bound=1e2, max_global_iterations=max_iterations, diff --git a/tests/run_tests/driver_dc_2d_test.py b/tests/run_tests/driver_dc_2d_test.py index 3edd585d..b2b14f7c 100644 --- a/tests/run_tests/driver_dc_2d_test.py +++ b/tests/run_tests/driver_dc_2d_test.py @@ -66,7 +66,7 @@ def test_dc_2d_fwr_run( line_object=geoh5.get_entity("line_ids")[0], line_id=101, ) - params = DC2DForwardOptions( + params = DC2DForwardOptions.build( geoh5=geoh5, data_object=survey, line_selection=line_selection, @@ -79,7 +79,7 @@ def test_dc_2d_fwr_run( expansion_factor=1.1, ), starting_model=model, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, ) fwr_driver = DC2DForwardDriver(params) fwr_driver.run() @@ -95,7 +95,7 @@ def test_dc_2d_run(tmp_path: Path, max_iterations=1, pytest=True): topography = geoh5.get_entity("topography")[0] # Run the inverse - params = DC2DInversionOptions( + params = DC2DInversionOptions.build( geoh5=geoh5, drape_model=DrapeModelOptions( u_cell_size=5.0, @@ -105,7 +105,7 @@ def test_dc_2d_run(tmp_path: Path, max_iterations=1, pytest=True): vertical_padding=100.0, expansion_factor=1.1, ), - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, line_selection=LineSelectionOptions( line_object=geoh5.get_entity("line_ids")[0], line_id=101, @@ -119,7 +119,6 @@ def test_dc_2d_run(tmp_path: Path, max_iterations=1, pytest=True): s_norm=0.0, x_norm=1.0, z_norm=1.0, - gradient_type="components", max_global_iterations=max_iterations, initial_beta=None, initial_beta_ratio=1e0, diff --git a/tests/run_tests/driver_dc_b2d_test.py b/tests/run_tests/driver_dc_b2d_test.py index 5368b407..b0f406da 100644 --- a/tests/run_tests/driver_dc_b2d_test.py +++ b/tests/run_tests/driver_dc_b2d_test.py @@ -61,7 +61,7 @@ def test_dc_p3d_fwr_run( drape_height=0.0, flatten=False, ) - params = DCBatch2DForwardOptions( + params = DCBatch2DForwardOptions.build( geoh5=geoh5, mesh=model.parent, drape_model=DrapeModelOptions( @@ -72,7 +72,7 @@ def test_dc_p3d_fwr_run( horizontal_padding=1000.0, vertical_padding=1000.0, ), - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, line_selection=LineSelectionOptions( @@ -99,7 +99,7 @@ def test_dc_p3d_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - params = DCBatch2DInversionOptions( + params = DCBatch2DInversionOptions.build( geoh5=geoh5, mesh=mesh, drape_model=DrapeModelOptions( @@ -110,7 +110,7 @@ def test_dc_p3d_run( horizontal_padding=1000.0, vertical_padding=1000.0, ), - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=potential.parent, potential_channel=potential, potential_uncertainty=1e-3, @@ -122,7 +122,6 @@ def test_dc_p3d_run( s_norm=0.0, x_norm=1.0, z_norm=1.0, - gradient_type="components", max_global_iterations=max_iterations, initial_beta=None, initial_beta_ratio=10.0, diff --git a/tests/run_tests/driver_dc_test.py b/tests/run_tests/driver_dc_test.py index c13e64c6..b5fe26cd 100644 --- a/tests/run_tests/driver_dc_test.py +++ b/tests/run_tests/driver_dc_test.py @@ -65,12 +65,10 @@ def test_dc_3d_fwr_run( survey.ab_cell_id = tx_id survey.cells = cells - active_cells = ActiveCellsOptions(topography_object=topography) - - params = DC3DForwardOptions( + params = DC3DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) @@ -94,11 +92,10 @@ def test_dc_3d_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) - params = DC3DInversionOptions( + params = DC3DInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=potential.parent, starting_model=1e-2, reference_model=1e-2, @@ -106,7 +103,6 @@ def test_dc_3d_run( x_norm=1.0, y_norm=1.0, z_norm=1.0, - gradient_type="components", potential_channel=potential, potential_uncertainty=1e-3, max_global_iterations=max_iterations, @@ -153,14 +149,13 @@ def test_dc_single_line_fwr_run( n_lines=n_lines, refinement=refinement, drape_height=0.0, - inversion_type="dcip", + inversion_type="direct current 3d", flatten=False, ) - active_cells = ActiveCellsOptions(topography_object=topography) - params = DC3DForwardOptions( + params = DC3DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) diff --git a/tests/run_tests/driver_fem_test.py b/tests/run_tests/driver_fem_test.py index 6f9054f4..25d57011 100644 --- a/tests/run_tests/driver_fem_test.py +++ b/tests/run_tests/driver_fem_test.py @@ -52,10 +52,10 @@ def test_fem_name_change(tmp_path, caplog): inversion_type="fdem", ) with caplog.at_level(logging.WARNING): - FDEMForwardOptions( + FDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, z_real_channel_bool=True, @@ -85,10 +85,10 @@ def test_fem_fwr_run( inversion_type="fdem", flatten=True, ) - params = FDEMForwardOptions( + params = FDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, z_real_channel_bool=True, @@ -154,10 +154,10 @@ def test_fem_run(tmp_path: Path, max_iterations=1, pytest=True): orig_z_real_1 = geoh5.get_entity("Iteration_0_z_real_[0]")[0].values # Run the inverse - params = FDEMInversionOptions( + params = FDEMInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=1e-3, reference_model=1e-3, @@ -166,7 +166,6 @@ def test_fem_run(tmp_path: Path, max_iterations=1, pytest=True): x_norm=0.0, y_norm=0.0, z_norm=0.0, - gradient_type="components", upper_bound=0.75, max_global_iterations=max_iterations, initial_beta_ratio=1e1, diff --git a/tests/run_tests/driver_grav_test.py b/tests/run_tests/driver_grav_test.py index 83a6c86a..251e2014 100644 --- a/tests/run_tests/driver_grav_test.py +++ b/tests/run_tests/driver_grav_test.py @@ -18,7 +18,7 @@ from geoh5py.workspace import Workspace from pytest import raises -from simpeg_drivers.options import ActiveCellsOptions +from simpeg_drivers.options import ActiveCellsOptions, ModelOptions from simpeg_drivers.potential_fields import ( GravityForwardOptions, GravityInversionOptions, @@ -33,7 +33,6 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. - target_run = {"data_norm": 0.0028055269276044915, "phi_d": 8.32e-05, "phi_m": 0.0038} @@ -43,7 +42,7 @@ def test_gravity_fwr_run( refinement=(2,), ): # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( + geoh5, mesh, model, survey, topography = setup_inversion_workspace( tmp_path, background=0.0, anomaly=0.75, @@ -54,11 +53,9 @@ def test_gravity_fwr_run( flatten=False, ) - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, - mesh=model.parent, - active_cells=active_cells, + mesh=mesh, topography_object=topography, data_object=survey, starting_model=model, @@ -79,11 +76,10 @@ def test_array_too_large_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=gz.parent, gz_channel=gz, gz_uncertainty=1e-4, @@ -109,9 +105,10 @@ def test_gravity_run( workpath = tmp_path.parent / "test_gravity_fwr_run0" / "inversion_test.ui.geoh5" with Workspace(workpath) as geoh5: + group = geoh5.get_entity("Gravity Forward")[0] gz = geoh5.get_entity("Iteration_0_gz")[0] orig_gz = gz.values.copy() - mesh = geoh5.get_entity("mesh")[0] + mesh = group.get_entity("mesh")[0] model = mesh.get_entity("starting_model")[0] inds = (mesh.centroids[:, 0] > -35) & (mesh.centroids[:, 0] < 35) @@ -133,25 +130,23 @@ def test_gravity_run( gz.values = values # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, data_object=gz.parent, - starting_model=1e-4, - reference_model=0.0, s_norm=0.0, x_norm=gradient_norms, y_norm=gradient_norms, z_norm=gradient_norms, - gradient_type="components", gz_channel=gz, gz_uncertainty=2e-3, lower_bound=0.0, max_global_iterations=max_iterations, initial_beta_ratio=1e-2, percentile=100, + starting_model=1e-4, + topography_object=topography, + reference_model=0.0, store_sensitivities="ram", save_sensitivities=True, ) diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/run_tests/driver_ground_tem_test.py index 38b2d8ac..2331acb0 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/run_tests/driver_ground_tem_test.py @@ -60,10 +60,10 @@ def test_tiling_ground_tem( flatten=True, ) - params = TDEMForwardOptions( + params = TDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, x_channel_bool=True, @@ -107,10 +107,10 @@ def test_ground_tem_fwr_run( padding_distance=1000.0, flatten=True, ) - params = TDEMForwardOptions( + params = TDEMForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, x_channel_bool=True, @@ -192,10 +192,10 @@ def test_ground_tem_run(tmp_path: Path, max_iterations=1, pytest=True): orig_dBzdt = geoh5.get_entity("Iteration_0_z_[0]")[0].values # Run the inverse - params = TDEMInversionOptions( + params = TDEMInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=1e-3, reference_model=1e-3, @@ -205,7 +205,6 @@ def test_ground_tem_run(tmp_path: Path, max_iterations=1, pytest=True): y_norm=2.0, z_norm=2.0, alpha_s=0e-1, - gradient_type="total", lower_bound=2e-6, upper_bound=1e2, max_global_iterations=max_iterations, diff --git a/tests/run_tests/driver_ip_2d_test.py b/tests/run_tests/driver_ip_2d_test.py index 26daff56..ab1f7be1 100644 --- a/tests/run_tests/driver_ip_2d_test.py +++ b/tests/run_tests/driver_ip_2d_test.py @@ -52,11 +52,11 @@ def test_ip_2d_fwr_run( flatten=False, drape_height=0.0, ) - params = IP2DForwardOptions( + params = IP2DForwardOptions.build( geoh5=geoh5, data_object=survey, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, starting_model=model, conductivity_model=1e2, model_type="Resistivity (Ohm-m)", @@ -85,10 +85,10 @@ def test_ip_2d_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - params = IP2DInversionOptions( + params = IP2DInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=chargeability.parent, chargeability_channel=chargeability, chargeability_uncertainty=2e-4, @@ -102,7 +102,6 @@ def test_ip_2d_run( s_norm=0.0, x_norm=0.0, z_norm=0.0, - gradient_type="components", max_global_iterations=max_iterations, initial_beta=None, initial_beta_ratio=1e0, diff --git a/tests/run_tests/driver_ip_b2d_test.py b/tests/run_tests/driver_ip_b2d_test.py index f19ad257..769a24ab 100644 --- a/tests/run_tests/driver_ip_b2d_test.py +++ b/tests/run_tests/driver_ip_b2d_test.py @@ -61,7 +61,7 @@ def test_ip_p3d_fwr_run( flatten=False, ) - params = IPBatch2DForwardOptions( + params = IPBatch2DForwardOptions.build( geoh5=geoh5, mesh=model.parent, drape_model=DrapeModelOptions( @@ -103,7 +103,7 @@ def test_ip_p3d_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - params = IPBatch2DInversionOptions( + params = IPBatch2DInversionOptions.build( geoh5=geoh5, mesh=mesh, drape_model=DrapeModelOptions( @@ -114,7 +114,7 @@ def test_ip_p3d_run( horizontal_padding=1000.0, vertical_padding=1000.0, ), - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=chargeability.parent, chargeability_channel=chargeability, chargeability_uncertainty=2e-4, @@ -129,7 +129,6 @@ def test_ip_p3d_run( z_norm=0.0, length_scale_x=1.0, length_scale_z=1.0, - gradient_type="components", max_global_iterations=max_iterations, initial_beta=None, initial_beta_ratio=1e0, diff --git a/tests/run_tests/driver_ip_test.py b/tests/run_tests/driver_ip_test.py index c191590e..afc32f10 100644 --- a/tests/run_tests/driver_ip_test.py +++ b/tests/run_tests/driver_ip_test.py @@ -51,10 +51,10 @@ def test_ip_3d_fwr_run( inversion_type="induced polarization 3d", flatten=False, ) - params = IP3DForwardOptions( + params = IP3DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, conductivity_model=1e-2, @@ -80,10 +80,10 @@ def test_ip_3d_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - params = IP3DInversionOptions( + params = IP3DInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=potential.parent, conductivity_model=1e2, model_type="Resistivity (Ohm-m)", @@ -93,7 +93,6 @@ def test_ip_3d_run( x_norm=0.0, y_norm=0.0, z_norm=0.0, - gradient_type="components", chargeability_channel=potential, chargeability_uncertainty=2e-4, max_global_iterations=max_iterations, diff --git a/tests/run_tests/driver_joint_cross_gradient_test.py b/tests/run_tests/driver_joint_cross_gradient_test.py index cbf3cdfb..2d2ce48d 100644 --- a/tests/run_tests/driver_joint_cross_gradient_test.py +++ b/tests/run_tests/driver_joint_cross_gradient_test.py @@ -66,11 +66,10 @@ def test_joint_cross_gradient_fwr_run( n_electrodes=n_grid_points, n_lines=n_grid_points, ) - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) @@ -89,10 +88,10 @@ def test_joint_cross_gradient_fwr_run( flatten=False, ) inducing_field = (50000.0, 90.0, 0.0) - params = MVIForwardOptions( + params = MVIForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -115,10 +114,10 @@ def test_joint_cross_gradient_fwr_run( flatten=False, ) - params = DC3DForwardOptions( + params = DC3DForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, ) @@ -184,13 +183,11 @@ def test_joint_cross_gradient_inv_run( orig_data.append(data.values) if group.options["inversion_type"] == "gravity": - data.values = data.values + np.random.randn(data.values.size) * 1e-2 - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, alpha_s=1.0, - active_cells=active_cells, + topography_object=topography, data_object=survey, gz_channel=data, gz_uncertainty=1e-2, @@ -200,12 +197,11 @@ def test_joint_cross_gradient_inv_run( drivers.append(GravityInversionDriver(params)) elif group.options["inversion_type"] == "direct current 3d": data.values = data.values + np.random.randn(data.values.size) * 5e-4 - active_cells = ActiveCellsOptions(topography_object=topography) - params = DC3DInversionOptions( + params = DC3DInversionOptions.build( geoh5=geoh5, mesh=mesh, alpha_s=1.0, - active_cells=active_cells, + topography_object=topography, data_object=survey, potential_channel=data, model_type="Resistivity (Ohm-m)", @@ -219,11 +215,11 @@ def test_joint_cross_gradient_inv_run( drivers.append(DC3DInversionDriver(params)) else: data.values = data.values + np.random.randn(data.values.size) * 10.0 - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, mesh=mesh, alpha_s=1.0, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, inducing_field_strength=group.options["inducing_field_strength"][ "value" ], @@ -243,9 +239,9 @@ def test_joint_cross_gradient_inv_run( drivers.append(MVIInversionDriver(params)) # Run the inverse - joint_params = JointCrossGradientOptions( + joint_params = JointCrossGradientOptions.build( geoh5=geoh5, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, group_a=drivers[0].params.out_group, group_a_multiplier=1.0, group_b=drivers[1].params.out_group, diff --git a/tests/run_tests/driver_joint_pgi_homogeneous_test.py b/tests/run_tests/driver_joint_pgi_homogeneous_test.py index 1b06d0c6..e1cfe7eb 100644 --- a/tests/run_tests/driver_joint_pgi_homogeneous_test.py +++ b/tests/run_tests/driver_joint_pgi_homogeneous_test.py @@ -19,34 +19,24 @@ from geoh5py.groups.property_group import GroupTypeEnum, PropertyGroup from geoh5py.groups.simpeg import SimPEGGroup from geoh5py.workspace import Workspace -from pytest import raises -from simpeg_drivers.electricals import DC3DForwardOptions, DC3DInversionOptions -from simpeg_drivers.electricals.direct_current.three_dimensions.driver import ( - DC3DForwardDriver, - DC3DInversionDriver, -) from simpeg_drivers.joint.joint_petrophysics.driver import JointPetrophysicsDriver from simpeg_drivers.joint.joint_petrophysics.options import JointPetrophysicsOptions -from simpeg_drivers.options import ActiveCellsOptions from simpeg_drivers.potential_fields import ( GravityForwardOptions, GravityInversionOptions, MagneticInversionOptions, MVIForwardOptions, - MVIInversionOptions, ) from simpeg_drivers.potential_fields.gravity.driver import ( GravityForwardDriver, GravityInversionDriver, ) from simpeg_drivers.potential_fields.magnetic_scalar.driver import ( - MagneticForwardDriver, MagneticInversionDriver, ) from simpeg_drivers.potential_fields.magnetic_vector.driver import ( MVIForwardDriver, - MVIInversionDriver, ) from simpeg_drivers.utils.utils import get_inversion_output from tests.testing_utils import check_target, setup_inversion_workspace @@ -55,7 +45,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = {"data_norm": 390.6585155910284, "phi_d": 2320, "phi_m": 0.642} +target_run = {"data_norm": 390.65805009978556, "phi_d": 2470, "phi_m": 0.674} def test_homogeneous_fwr_run( @@ -78,11 +68,10 @@ def test_homogeneous_fwr_run( ind = mesh.centroids[:, 0] > 0 model.values[ind] = 0.05 - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) @@ -105,10 +94,10 @@ def test_homogeneous_fwr_run( ind = mesh.centroids[:, 0] > 0 model.values[ind] = 0.01 - params = MVIForwardOptions( + params = MVIForwardOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -196,11 +185,10 @@ def test_homogeneous_run( ref_model.values = ref_model.values / 2.0 if group.options["inversion_type"] == "gravity": - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=survey, gz_channel=data, gz_uncertainty=1e-2, @@ -209,10 +197,10 @@ def test_homogeneous_run( ) drivers.append(GravityInversionDriver(params)) else: - params = MagneticInversionOptions( + params = MagneticInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, inducing_field_strength=group.options["inducing_field_strength"][ "value" ], @@ -231,8 +219,8 @@ def test_homogeneous_run( ) drivers.append(MagneticInversionDriver(params)) - params = JointPetrophysicsOptions( - active_cells=active_cells, + params = JointPetrophysicsOptions.build( + topography_object=topography, geoh5=geoh5, group_a=drivers[0].params.out_group, group_a_multiplier=1.0, @@ -243,7 +231,7 @@ def test_homogeneous_run( length_scale_x=1.0, length_scale_y=1.0, length_scale_z=1.0, - petrophysics_model=petrophysics, + petrophysical_model=petrophysics, initial_beta_ratio=1e2, max_global_iterations=max_iterations, ) @@ -260,7 +248,7 @@ def test_homogeneous_run( out_group = run_ws.get_entity(driver.params.out_group.uid)[0] mesh = out_group.get_entity("mesh")[0] - petro_model = mesh.get_entity("petrophysics_model")[0] + petro_model = mesh.get_entity("petrophysical_model")[0] assert len(np.unique(petro_model.values)) == 4 diff --git a/tests/run_tests/driver_joint_surveys_test.py b/tests/run_tests/driver_joint_surveys_test.py index 214aceb2..0cdd4d24 100644 --- a/tests/run_tests/driver_joint_surveys_test.py +++ b/tests/run_tests/driver_joint_surveys_test.py @@ -46,11 +46,10 @@ def test_joint_surveys_fwr_run( n_electrodes=n_grid_points, n_lines=n_grid_points, ) - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) @@ -72,12 +71,10 @@ def test_joint_surveys_fwr_run( geoh5=geoh5, drape_height=10.0, ) - active_cells = ActiveCellsOptions(topography_object=topography) - - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, data_object=survey, starting_model=model, ) @@ -129,7 +126,7 @@ def test_joint_surveys_inv_run( gz = survey.get_data("Iteration_0_gz")[0] orig_data.append(gz.values) active_cells = ActiveCellsOptions(active_model=active_model) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, active_cells=active_cells, @@ -142,7 +139,7 @@ def test_joint_surveys_inv_run( active_model = drivers[0].params.mesh.get_entity("active_cells")[0] # Run the inverse - joint_params = JointSurveysOptions( + joint_params = JointSurveysOptions.build( geoh5=geoh5, active_cells=ActiveCellsOptions(active_model=active_model), mesh=drivers[0].params.mesh, diff --git a/tests/run_tests/driver_mag_automesh_test.py b/tests/run_tests/driver_mag_automesh_test.py index 8ac5db4d..1ff96236 100644 --- a/tests/run_tests/driver_mag_automesh_test.py +++ b/tests/run_tests/driver_mag_automesh_test.py @@ -48,12 +48,11 @@ def test_automesh( flatten=False, ) inducing_field = (49999.8, 90.0, 0.0) - active_cells = ActiveCellsOptions(topography_object=topography) - params = MagneticForwardOptions( + params = MagneticForwardOptions.build( forward_only=True, geoh5=geoh5, mesh=None, - active_cells=active_cells, + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], diff --git a/tests/run_tests/driver_mag_test.py b/tests/run_tests/driver_mag_test.py index 20dff4dd..0ec4891c 100644 --- a/tests/run_tests/driver_mag_test.py +++ b/tests/run_tests/driver_mag_test.py @@ -52,12 +52,12 @@ def test_susceptibility_fwr_run( flatten=False, ) inducing_field = (49999.8, 90.0, 0.0) - active_cells = ActiveCellsOptions(topography_object=topography) - params = MagneticForwardOptions( + + params = MagneticForwardOptions.build( forward_only=True, geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -93,11 +93,10 @@ def test_susceptibility_run( inducing_field = (50000.0, 90.0, 0.0) # Run the inverse - active_cells = ActiveCellsOptions(active_model=active_cells) - params = MagneticInversionOptions( + params = MagneticInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + active_model=active_cells, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -109,7 +108,6 @@ def test_susceptibility_run( y_norm=1.0, z_norm=1.0, initial_beta_ratio=1e1, - gradient_type="components", tmi_channel=tmi, tmi_uncertainty=1.0, max_global_iterations=max_iterations, @@ -117,7 +115,7 @@ def test_susceptibility_run( ) params.write_ui_json(path=tmp_path / "Inv_run.ui.json") - assert params.lower_bound == 0.0 + assert params.models.lower_bound == 0.0 driver = MagneticInversionDriver.start(str(tmp_path / "Inv_run.ui.json")) with Workspace(driver.params.geoh5.h5file) as run_ws: diff --git a/tests/run_tests/driver_mt_test.py b/tests/run_tests/driver_mt_test.py index e9cb1b04..bd05e66c 100644 --- a/tests/run_tests/driver_mt_test.py +++ b/tests/run_tests/driver_mt_test.py @@ -104,10 +104,10 @@ def test_magnetotellurics_fwr_run( inversion_type="magnetotellurics", flatten=False, ) - params = MTForwardOptions( + params = MTForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, background_conductivity=1e-2, @@ -149,10 +149,10 @@ def test_magnetotellurics_run(tmp_path: Path, max_iterations=1, pytest=True): orig_zyy_real_1 = geoh5.get_entity("Iteration_0_zyy_real_[0]")[0].values # Run the inverse - params = MTInversionOptions( + params = MTInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=100.0, reference_model=100.0, @@ -161,7 +161,6 @@ def test_magnetotellurics_run(tmp_path: Path, max_iterations=1, pytest=True): x_norm=1.0, y_norm=1.0, z_norm=1.0, - gradient_type="components", cooling_rate=1, lower_bound=0.75, model_type="Resistivity (Ohm-m)", @@ -191,10 +190,10 @@ def test_magnetotellurics_run(tmp_path: Path, max_iterations=1, pytest=True): # test that one channel works data_kwargs = {k: v for k, v in data_kwargs.items() if "zxx_real" in k} geoh5.open() - params = MTInversionOptions( + params = MTInversionOptions.build( geoh5=geoh5, mesh=geoh5.get_entity("mesh")[0], - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=0.01, background_conductivity=1e-2, diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py index ca0ee227..53553bad 100644 --- a/tests/run_tests/driver_mvi_test.py +++ b/tests/run_tests/driver_mvi_test.py @@ -59,12 +59,11 @@ def test_magnetic_vector_fwr_run( survey = Curve.create(geoh5, name=points.name, vertices=points.vertices) geoh5.remove_entity(points) inducing_field = (50000.0, 90.0, 0.0) - active_cells = ActiveCellsOptions(topography_object=topography) - params = MVIForwardOptions( + params = MVIForwardOptions.build( forward_only=True, geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -111,11 +110,10 @@ def test_magnetic_vector_run( ) # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -186,12 +184,11 @@ def test_magnetic_vector_bounds_run( inducing_field = (50000.0, 90.0, 0.0) # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) with caplog.at_level(logging.WARNING): - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -202,7 +199,6 @@ def test_magnetic_vector_bounds_run( x_norm=1.0, y_norm=1.0, z_norm=1.0, - gradient_type="components", tmi_channel=tmi, tmi_uncertainty=4.0, lower_bound=1e-6, diff --git a/tests/run_tests/driver_rotated_gradients_test.py b/tests/run_tests/driver_rotated_gradients_test.py index ec6664b8..f13cfd0d 100644 --- a/tests/run_tests/driver_rotated_gradients_test.py +++ b/tests/run_tests/driver_rotated_gradients_test.py @@ -55,11 +55,9 @@ def test_gravity_rotated_grad_fwr_run( flatten=False, ) - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityForwardOptions( + params = GravityForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=active_cells, topography_object=topography, data_object=survey, starting_model=model, @@ -103,11 +101,10 @@ def test_rotated_grad_run( topography = geoh5.get_entity("topography")[0] # Run the inverse - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=gz.parent, gradient_rotation=pg, starting_model=1e-4, @@ -116,7 +113,6 @@ def test_rotated_grad_run( x_norm=0.0, y_norm=0.0, z_norm=0.0, - gradient_type="components", gz_channel=gz, gz_uncertainty=2e-3, lower_bound=0.0, diff --git a/tests/run_tests/driver_tile_estimator_test.py b/tests/run_tests/driver_tile_estimator_test.py index ddb0ae92..0c74ef21 100644 --- a/tests/run_tests/driver_tile_estimator_test.py +++ b/tests/run_tests/driver_tile_estimator_test.py @@ -46,10 +46,10 @@ def test_tile_estimator_run( "tmi": {"values": np.random.rand(survey.n_vertices)}, } ) - params = MagneticInversionOptions( + params = MagneticInversionOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, inducing_field_strength=inducing_field[0], inducing_field_inclination=inducing_field[1], inducing_field_declination=inducing_field[2], @@ -69,7 +69,7 @@ def test_tile_estimator_run( driver = simpeg_group_to_driver(simpeg_group, geoh5) assert driver.inversion_type == "magnetic scalar" - assert driver.params.tile_spatial == 2 + assert driver.params.compute.tile_spatial == 2 assert ( len(simpeg_group.children) == 2 and simpeg_group.children[0].name == "tile_estimator.png" diff --git a/tests/run_tests/driver_tipper_test.py b/tests/run_tests/driver_tipper_test.py index d87f2a4a..919643c4 100644 --- a/tests/run_tests/driver_tipper_test.py +++ b/tests/run_tests/driver_tipper_test.py @@ -55,10 +55,10 @@ def test_tipper_fwr_run( flatten=False, ) - params = TipperForwardOptions( + params = TipperForwardOptions.build( geoh5=geoh5, mesh=model.parent, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=model, model_type="Resistivity (Ohm-m)", @@ -72,7 +72,7 @@ def test_tipper_fwr_run( fwr_driver = TipperForwardDriver(params) # Should always be returning conductivity for simpeg simulations - assert not np.any(np.exp(fwr_driver.models.starting) > 1.01) + assert not np.any(np.exp(fwr_driver.models.starting_model) > 1.01) fwr_driver.run() @@ -131,10 +131,10 @@ def test_tipper_run(tmp_path: Path, max_iterations=1, pytest=True): orig_tyz_real_1 = geoh5.get_entity("Iteration_0_tyz_real_[0]")[0].values # Run the inverse - params = TipperInversionOptions( + params = TipperInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=ActiveCellsOptions(topography_object=topography), + topography_object=topography, data_object=survey, starting_model=1e2, reference_model=1e2, @@ -144,7 +144,6 @@ def test_tipper_run(tmp_path: Path, max_iterations=1, pytest=True): y_norm=1.0, z_norm=1.0, alpha_s=1.0, - gradient_type="components", model_type="Resistivity (Ohm-m)", lower_bound=0.75, max_global_iterations=max_iterations, diff --git a/tests/run_tests/sensitivity_cutoff_test.py b/tests/run_tests/sensitivity_cutoff_test.py index 15cc11ef..da0d2bab 100644 --- a/tests/run_tests/sensitivity_cutoff_test.py +++ b/tests/run_tests/sensitivity_cutoff_test.py @@ -46,16 +46,14 @@ def setup_inversion_results( with geoh5.open(): gz = survey.add_data({"gz": {"values": np.random.randn(len(survey.vertices))}}) - active_cells = ActiveCellsOptions(topography_object=topography) - params = GravityInversionOptions( + params = GravityInversionOptions.build( geoh5=geoh5, mesh=mesh, - active_cells=active_cells, + topography_object=topography, data_object=gz.parent, starting_model=1e-4, reference_model=0.0, s_norm=0.0, - gradient_type="components", gz_channel=gz, gz_uncertainty=2e-3, lower_bound=0.0, diff --git a/tests/topography_test.py b/tests/topography_test.py index de8bebb8..26fc148f 100644 --- a/tests/topography_test.py +++ b/tests/topography_test.py @@ -40,14 +40,18 @@ def test_get_locations(tmp_path: Path): elevation = topography.add_data( {"elevation": {"values": topography.vertices[:, 2]}} ) - params = MVIInversionOptions( + params = MVIInversionOptions.build( geoh5=geoh5, mesh=mesh, data_object=survey, tmi_channel=tmi_channel, + tmi_uncertainty=0.01, active_cells=ActiveCellsOptions( topography_object=topography, topography=elevation ), + inducing_field_strength=50000.0, + inducing_field_inclination=60.0, + inducing_field_declination=0.0, starting_model=1.0, ) diff --git a/tests/uijson_test.py b/tests/uijson_test.py index 7a3b40a6..1a63769a 100644 --- a/tests/uijson_test.py +++ b/tests/uijson_test.py @@ -25,7 +25,7 @@ import simpeg_drivers from simpeg_drivers.driver import InversionDriver from simpeg_drivers.line_sweep.driver import LineSweepDriver -from simpeg_drivers.options import ActiveCellsOptions, Deprecations +from simpeg_drivers.options import ActiveCellsOptions, Deprecations, IRLSOptions from simpeg_drivers.potential_fields.gravity.options import GravityInversionOptions from simpeg_drivers.potential_fields.gravity.uijson import GravityInversionUIJson from simpeg_drivers.uijson import SimPEGDriversUIJson @@ -176,16 +176,29 @@ class MyUIJson(SimPEGDriversUIJson): ) == SimPEGDriversUIJson.comparable_version(simpeg_drivers.__version__) +def test_alias_options(): + geoh5 = Workspace() + + class Options(BaseData): + irls: IRLSOptions = IRLSOptions() + name: str = "My Inversion" + + options = Options.build(geoh5=geoh5, coolEpsFact=0.1) + assert options.irls.epsilon_cooling_factor == 0.1 + + def test_deprecated_options(caplog): geoh5 = Workspace() class Options(BaseData): + irls: IRLSOptions = IRLSOptions() + name: str = "My Inversion" deprecations: Deprecations with caplog.at_level(logging.WARNING): - options = Options.build(geoh5=geoh5, parallelized="abc") + options = Options.build(geoh5=geoh5, gradient_type="abc") - assert "Deprecated field 'parallelized' will be ignored" in caplog.text + assert "Deprecated field 'gradient_type' will be ignored" in caplog.text assert "deprecations" not in options.model_dump() assert "parallelized" not in options.model_dump() @@ -229,7 +242,7 @@ def test_gravity_uijson(tmp_path): gz_channel = survey.add_data({"gz": {"values": np.ones(survey.n_vertices)}}) gz_uncerts = survey.add_data({"gz_unc": {"values": np.ones(survey.n_vertices)}}) - opts = GravityInversionOptions( + opts = GravityInversionOptions.build( version="old news", geoh5=geoh5, data_object=survey, @@ -237,9 +250,7 @@ def test_gravity_uijson(tmp_path): gz_uncertainty=gz_uncerts, mesh=starting_model.parent, starting_model=starting_model, - active_cells=ActiveCellsOptions( - topography_object=topography, - ), + topography_object=topography, ) params_uijson_path = tmp_path / "from_params.ui.json" opts.write_ui_json(params_uijson_path)