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 0b7a32e95..61169ad6d 100644 --- a/environments/py-3.10-linux-64-dev.conda.lock.yml +++ b/environments/py-3.10-linux-64-dev.conda.lock.yml @@ -18,7 +18,7 @@ dependencies: - astroid=3.3.11=py310hff52083_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -29,10 +29,10 @@ dependencies: - brotli-python=1.1.0=py310hea6c23e_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py310h34a4b09_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh707e725_0 @@ -125,10 +125,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -142,8 +142,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -187,7 +187,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py310h0158d43_1 - - pandoc=3.8.1=ha770c72_0 + - pandoc=3.8.2=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -204,14 +204,14 @@ dependencies: - ptyprocess=0.7.0=pyhd8ed1ab_1 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py310hff52083_2 + - pybtex-docutils=1.0.3=py310hff52083_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py310hbcd0ec0_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py310h69a6472_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -262,7 +262,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py310h7c4b9e2_0 + - sqlalchemy=2.0.43=py310h7c4b9e2_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hb60516a_3 @@ -306,7 +306,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.10-linux-64.conda.lock.yml b/environments/py-3.10-linux-64.conda.lock.yml index 5d71e4d26..32c9b583e 100644 --- a/environments/py-3.10-linux-64.conda.lock.yml +++ b/environments/py-3.10-linux-64.conda.lock.yml @@ -16,10 +16,10 @@ dependencies: - brotli-python=1.1.0=py310hea6c23e_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py310h34a4b09_0 - click=8.3.0=pyh707e725_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -68,10 +68,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -84,8 +84,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -119,10 +119,10 @@ dependencies: - psutil=7.1.0=py310h7c4b9e2_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py310hbcd0ec0_0 - pydiso=0.1.2=py310h69a6472_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -168,7 +168,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e 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 e7abf9e24..8e3ad57c3 100644 --- a/environments/py-3.10-win-64-dev.conda.lock.yml +++ b/environments/py-3.10-win-64-dev.conda.lock.yml @@ -18,7 +18,7 @@ dependencies: - astroid=3.3.11=py310h5588dad_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -28,10 +28,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py310h73ae2b4_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py310h29418f3_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh7428d3b_0 @@ -121,8 +121,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -135,7 +135,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -172,7 +172,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py310hed136d8_1 - - pandoc=3.8.1=h57928b3_0 + - pandoc=3.8.2=h57928b3_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -187,14 +187,14 @@ dependencies: - pthread-stubs=0.4=h0e40799_1002 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py310h5588dad_2 + - pybtex-docutils=1.0.3=py310h5588dad_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py310hed05c55_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py310h8f92c26_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -246,7 +246,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py310h29418f3_0 + - sqlalchemy=2.0.43=py310h29418f3_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h18a62a1_3 @@ -296,7 +296,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.10-win-64.conda.lock.yml b/environments/py-3.10-win-64.conda.lock.yml index 62f897913..b80b2a662 100644 --- a/environments/py-3.10-win-64.conda.lock.yml +++ b/environments/py-3.10-win-64.conda.lock.yml @@ -15,10 +15,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py310h73ae2b4_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py310h29418f3_0 - click=8.3.0=pyh7428d3b_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -63,8 +63,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -76,7 +76,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -103,10 +103,10 @@ dependencies: - psutil=7.1.0=py310h29418f3_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py310hed05c55_0 - pydiso=0.1.2=py310h8f92c26_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -156,7 +156,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e 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 b7f9af401..957a620f0 100644 --- a/environments/py-3.11-linux-64-dev.conda.lock.yml +++ b/environments/py-3.11-linux-64-dev.conda.lock.yml @@ -18,7 +18,7 @@ dependencies: - astroid=3.3.11=py311h38be061_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -29,10 +29,10 @@ dependencies: - brotli-python=1.1.0=py311h1ddb823_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py311h5b438cf_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh707e725_0 @@ -127,10 +127,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -144,8 +144,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -189,7 +189,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py311hed34c8f_1 - - pandoc=3.8.1=ha770c72_0 + - pandoc=3.8.2=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -206,14 +206,14 @@ dependencies: - ptyprocess=0.7.0=pyhd8ed1ab_1 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py311h38be061_2 + - pybtex-docutils=1.0.3=py311h38be061_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py311hdae7d1d_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py311h19ea254_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -264,7 +264,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py311h49ec1c0_0 + - sqlalchemy=2.0.43=py311h49ec1c0_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hb60516a_3 @@ -309,7 +309,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.11-linux-64.conda.lock.yml b/environments/py-3.11-linux-64.conda.lock.yml index b2e19f8f2..7fe65ea6a 100644 --- a/environments/py-3.11-linux-64.conda.lock.yml +++ b/environments/py-3.11-linux-64.conda.lock.yml @@ -16,10 +16,10 @@ dependencies: - brotli-python=1.1.0=py311h1ddb823_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py311h5b438cf_0 - click=8.3.0=pyh707e725_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -69,10 +69,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -85,8 +85,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -120,10 +120,10 @@ dependencies: - psutil=7.1.0=py311h49ec1c0_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py311hdae7d1d_0 - pydiso=0.1.2=py311h19ea254_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -170,7 +170,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e 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 e86cad4e9..733af0ba5 100644 --- a/environments/py-3.11-win-64-dev.conda.lock.yml +++ b/environments/py-3.11-win-64-dev.conda.lock.yml @@ -18,7 +18,7 @@ dependencies: - astroid=3.3.11=py311h1ea47a8_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -28,10 +28,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py311h3e6a449_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py311h3485c13_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh7428d3b_0 @@ -123,8 +123,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -137,7 +137,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -174,7 +174,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py311h11fd7f3_1 - - pandoc=3.8.1=h57928b3_0 + - pandoc=3.8.2=h57928b3_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -189,14 +189,14 @@ dependencies: - pthread-stubs=0.4=h0e40799_1002 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py311h1ea47a8_2 + - pybtex-docutils=1.0.3=py311h1ea47a8_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py311hc4022dc_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py311h66870c1_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -248,7 +248,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py311h3485c13_0 + - sqlalchemy=2.0.43=py311h3485c13_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h18a62a1_3 @@ -299,7 +299,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.11-win-64.conda.lock.yml b/environments/py-3.11-win-64.conda.lock.yml index ef321743e..a2a0a7d4f 100644 --- a/environments/py-3.11-win-64.conda.lock.yml +++ b/environments/py-3.11-win-64.conda.lock.yml @@ -15,10 +15,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py311h3e6a449_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py311h3485c13_0 - click=8.3.0=pyh7428d3b_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -64,8 +64,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -77,7 +77,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -104,10 +104,10 @@ dependencies: - psutil=7.1.0=py311h3485c13_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py311hc4022dc_0 - pydiso=0.1.2=py311h66870c1_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -158,7 +158,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e 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 eac480cab..3ac695976 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -19,7 +19,7 @@ dependencies: - astroid=3.3.11=py312h7900ff3_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -30,10 +30,10 @@ dependencies: - brotli-python=1.1.0=py312h1289d80_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py312h35888ee_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh707e725_0 @@ -129,10 +129,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -146,8 +146,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -191,7 +191,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py312hf79963d_1 - - pandoc=3.8.1=ha770c72_0 + - pandoc=3.8.2=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -208,14 +208,14 @@ dependencies: - ptyprocess=0.7.0=pyhd8ed1ab_1 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py312h7900ff3_2 + - pybtex-docutils=1.0.3=py312h7900ff3_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py312h680f630_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py312h772f2df_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -267,7 +267,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py312h4c3975b_0 + - sqlalchemy=2.0.43=py312h4c3975b_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hb60516a_3 @@ -312,7 +312,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index c46959b2b..e070a7835 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -16,10 +16,10 @@ dependencies: - brotli-python=1.1.0=py312h1289d80_4 - bzip2=1.0.8=hda65f42_8 - c-ares=1.34.5=hb9d3cd8_0 - - ca-certificates=2025.8.3=hbd8a1cb_0 + - ca-certificates=2025.10.5=hbd8a1cb_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py312h35888ee_0 - click=8.3.0=pyh707e725_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -69,10 +69,10 @@ dependencies: - libffi=3.4.6=h2dba641_1 - libfreetype=2.14.1=ha770c72_0 - libfreetype6=2.14.1=h73754d4_0 - - libgcc=15.1.0=h767d61c_5 - - libgcc-ng=15.1.0=h69a702a_5 - - libgfortran=15.1.0=h69a702a_5 - - libgfortran5=15.1.0=hcea5267_5 + - libgcc=15.2.0=h767d61c_6 + - libgcc-ng=15.2.0=h69a702a_6 + - libgfortran=15.2.0=h69a702a_6 + - libgfortran5=15.2.0=hcd61629_6 - libhwloc=2.12.1=default_h7f8ec31_1002 - libiconv=1.18=h3b78370_2 - libjpeg-turbo=3.1.0=hb9d3cd8_0 @@ -85,8 +85,8 @@ dependencies: - libspatialindex=2.0.0=he02047a_0 - libsqlite=3.50.4=h0c1763c_0 - libssh2=1.11.1=hcf80075_0 - - libstdcxx=15.1.0=h8f9b012_5 - - libstdcxx-ng=15.1.0=h4852527_5 + - libstdcxx=15.2.0=h8f9b012_6 + - libstdcxx-ng=15.2.0=h4852527_6 - libtiff=4.7.1=h8261f1e_0 - libuuid=2.41.2=he9a06e4_0 - libwebp-base=1.6.0=hd42ef1d_0 @@ -120,10 +120,10 @@ dependencies: - psutil=7.1.0=py312h4c3975b_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py312h680f630_0 - pydiso=0.1.2=py312h772f2df_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyha55dd90_7 @@ -170,7 +170,7 @@ dependencies: - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e 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 6297e737f..c33566e40 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -19,7 +19,7 @@ dependencies: - astroid=3.3.11=py312h2e8e312_1 - asttokens=3.0.0=pyhd8ed1ab_1 - async-lru=2.0.5=pyh29332c3_0 - - attrs=25.3.0=pyh71513ae_0 + - attrs=25.4.0=pyh71513ae_0 - babel=2.17.0=pyhd8ed1ab_0 - beautifulsoup4=4.14.2=pyha770c72_0 - bleach=6.2.0=pyh29332c3_4 @@ -29,10 +29,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py312hbb81ca0_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py312he06e257_0 - charset-normalizer=3.4.3=pyhd8ed1ab_0 - click=8.3.0=pyh7428d3b_0 @@ -124,8 +124,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -138,7 +138,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -175,7 +175,7 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=25.0=pyh29332c3_1 - pandas=2.3.3=py312hc128f0a_1 - - pandoc=3.8.1=h57928b3_0 + - pandoc=3.8.2=h57928b3_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.5=pyhcf101f3_0 - partd=1.4.2=pyhd8ed1ab_0 @@ -190,14 +190,14 @@ dependencies: - pthread-stubs=0.4=h0e40799_1002 - pure_eval=0.2.3=pyhd8ed1ab_1 - pybtex=0.25.1=pyhd8ed1ab_0 - - pybtex-docutils=1.0.3=py312h2e8e312_2 + - pybtex-docutils=1.0.3=py312h2e8e312_3 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py312h8422cdd_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py312h01acb21_0 - pygments=2.19.2=pyhd8ed1ab_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -250,7 +250,7 @@ dependencies: - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_1 - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_1 - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_1 - - sqlalchemy=2.0.43=py312he06e257_0 + - sqlalchemy=2.0.43=py312he06e257_1 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h18a62a1_3 @@ -301,7 +301,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index 847c93df9..2400092f7 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -15,10 +15,10 @@ dependencies: - brotli-bin=1.1.0=hfd05255_4 - brotli-python=1.1.0=py312hbb81ca0_4 - bzip2=1.0.8=h0ad9c76_8 - - ca-certificates=2025.8.3=h4c7d964_0 + - ca-certificates=2025.10.5=h4c7d964_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - certifi=2025.8.3=pyhd8ed1ab_0 + - certifi=2025.10.5=pyhd8ed1ab_0 - cffi=2.0.0=py312he06e257_0 - click=8.3.0=pyh7428d3b_0 - cloudpickle=3.1.1=pyhd8ed1ab_0 @@ -64,8 +64,8 @@ dependencies: - libffi=3.4.6=h537db12_1 - libfreetype=2.14.1=h57928b3_0 - libfreetype6=2.14.1=hdbac1cb_0 - - libgcc=15.1.0=h1383e82_5 - - libgomp=15.1.0=h1383e82_5 + - libgcc=15.2.0=h1383e82_6 + - libgomp=15.2.0=h1383e82_6 - libhwloc=2.12.1=default_h64bd3f2_1002 - libiconv=1.18=hc1393d2_2 - libjpeg-turbo=3.1.0=h2466b09_0 @@ -77,7 +77,7 @@ dependencies: - libssh2=1.11.1=h9aa295b_0 - libtiff=4.7.1=h550210a_0 - libwebp-base=1.6.0=h4d5522a_0 - - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 + - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_10 - libxcb=1.17.0=h0e4246c_0 - libxml2=2.15.0=ha29bfb0_1 - libxml2-16=2.15.0=h06f855e_1 @@ -104,10 +104,10 @@ dependencies: - psutil=7.1.0=py312he06e257_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.11.9=pyh3cfb1c2_0 + - pydantic=2.11.10=pyh3cfb1c2_0 - pydantic-core=2.33.2=py312h8422cdd_0 - pydiso=0.1.2=py312h01acb21_0 - - pylint=3.3.8=pyhe01879c_0 + - pylint=3.3.9=pyhcf101f3_0 - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.5=pyhcf101f3_0 - pysocks=1.7.1=pyh09c184e_7 @@ -158,7 +158,7 @@ dependencies: - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@13980469f5548c3dcbd2bd208b232bf02a2f68ca - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 - grid-apps @ git+https://github.com/MiraGeoscience/grid-apps.git@ed6918388d6fc4062f72e471e415a1a22cc15d0d - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@825b0b73fcc95b7b2c9629c19ea8861222adad7e diff --git a/py-3.10.conda-lock.yml b/py-3.10.conda-lock.yml index ed60e3fbc..83e25a309 100644 --- a/py-3.10.conda-lock.yml +++ b/py-3.10.conda-lock.yml @@ -354,27 +354,27 @@ package: category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: babel @@ -662,27 +662,27 @@ package: category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: __unix: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda hash: - md5: 74784ee3d225fc3dca89edb635b4e5cc - sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: f9e5fbc24009179e8b0409624691758a + sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: __win: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda hash: - md5: c9e0c0f82f6e63323827db462b40ede8 - sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: e54200a1cd1fe33d61c9df8d3b00b743 + sha256: bfb7f9f242f441fdcd80f1199edd2ecf09acea0f2bcef6f07d7cbb1a8131a345 category: main optional: false - name: cached-property @@ -734,27 +734,27 @@ package: category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: cffi @@ -3512,78 +3512,78 @@ package: category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_6.conda hash: - md5: 264fbfba7fb20acf3b29cde153e345ce - sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 99eee6aa5abea12f326f7fc010aef0c8 + sha256: 29c6ce15cf54f89282581d19329c99d1639036c5dde049bf1cae48dcc4137470 category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: _openmp_mutex: '>=4.5' libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.2.0-h1383e82_6.conda hash: - md5: c84381a01ede0e28d632fdbeea2debb2 - sha256: 9b997baa85ba495c04e1b30f097b80420c02dcaca6441c4bf2c6bb4b2c5d2114 + md5: 15d8f18987161d5a467434a0869cd789 + sha256: f910d04ea9bb4def10870c8c42b1bb55d22897c267eacea15b3cb18c69d8fac2 category: main optional: false - name: libgcc-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_6.conda hash: - md5: 069afdf8ea72504e48d23ae1171d951c - sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: d9717466cca9b9584226ce57a7cd58e6 + sha256: 12c91470ceb8d7d38fcee1a4ff1f50524625349059988f6bd0e8e6b27599a1ad category: main optional: false - name: libgfortran - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgfortran5: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + libgfortran5: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_6.conda hash: - md5: 0c91408b3dec0b97e8a3c694845bd63b - sha256: 4c1a526198d0d62441549fdfd668cc8e18e77609da1e545bdcc771dd8dc6a990 + md5: c41f84a30601e911a1e7a30f53531a59 + sha256: 37ac19d22718d371b1fd78207eee37bc384c5e7f8880e06187cb817f1124d1e2 category: main optional: false - name: libgfortran5 - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + libgcc: '>=15.2.0' + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_6.conda hash: - md5: fbd4008644add05032b6764807ee2cba - sha256: 9d06adc6d8e8187ddc1cad87525c690bc8202d8cb06c13b76ab2fc80a35ed565 + md5: 8fc1650fb7c7fca583cc3537a808e21b + sha256: 5046054c10fe5c81433849aa5d569e50ae051c4eac44b3e2a9bb34945eb16fc8 category: main optional: false - name: libgomp - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.2.0-h1383e82_6.conda hash: - md5: eae9a32a85152da8e6928a703a514d35 - sha256: 65fd558d8f3296e364b8ae694932a64642fdd26d8eb4cf7adf08941e449be926 + md5: 5939a1cf8d58da8b11bfc0db95aad396 + sha256: b6e6c2c527b1de0803ae820de9b78246ebcba688c797f77845a67e1125fb2714 category: main optional: false - name: libhwloc @@ -3916,28 +3916,28 @@ package: category: main optional: false - name: libstdcxx - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_6.conda hash: - md5: 4e02a49aaa9d5190cb630fa43528fbe6 - sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 9acaf38d72dcddace144f28506d45afa + sha256: fafd1c1320384a664f57e5d75568f214a31fe2201fc8baace6c15d88b8cf89a8 category: main optional: false - name: libstdcxx-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libstdcxx: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + libstdcxx: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_6.conda hash: - md5: 8bba50c7f4679f08c861b597ad2bda6b - sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 89611cb5b685d19e6201065720f97561 + sha256: 462fa002d3ab6702045ee330ab45719ac2958a092a4634a955cebc095f564794 category: main optional: false - name: libtiff @@ -4027,10 +4027,10 @@ package: platform: win-64 dependencies: ucrt: '' - url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda hash: - md5: 08bfa5da6e242025304b206d152479ef - sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 category: main optional: false - name: libxcb @@ -5214,25 +5214,25 @@ package: category: main optional: false - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.1-ha770c72_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.2-ha770c72_0.conda hash: - md5: 867fad79e8dbf2a38f1d9bbb9101aafe - sha256: bab8e43037c40560bb8996ab5bda966aeb370e5c715c25acb5e1ec8287078cc6 + md5: 4c9317a85d1c233f490545392e895118 + sha256: ae3760e865327aaf95df025ccea9ddc1d80ab9f70c5d2478bbfbf324b8eb4e7d category: dev optional: true - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: win-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.1-h57928b3_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.2-h57928b3_0.conda hash: - md5: 3c968a29de1b6747c092fc2483474a83 - sha256: d53f198eb2d5c4a9e9fbd4cd8037ebbcd922798e6f6f6ad3ddfc627cc3913543 + md5: 88a11dca037752f036fafb414dd8e0b0 + sha256: ff55de733e42d44f10372f1707e1579bdc56edb6e8b72ab80e6306d9073299b1 category: dev optional: true - name: pandocfilters @@ -5658,10 +5658,10 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py310hff52083_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py310hff52083_3.conda hash: - md5: e9a2e0883b856ff34cea07ff02f702d3 - sha256: c19926680a369df0a45f61bb1762e3e722afc9e28b7f50a4dc053435a322dbdc + md5: 22e1730cafba181ebf5b719a90a02485 + sha256: e1aa05e27940046ea391401469332b4908922415e703be2d3d871b8b5e127509 category: dev optional: true - name: pybtex-docutils @@ -5674,10 +5674,10 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py310h5588dad_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py310h5588dad_3.conda hash: - md5: 0caf4a3d5cf845e8d693e7f9bc8a7182 - sha256: 1a6a996ff1bfb607f88d71dbbee0df3cfe71ca135f7d42583f0e548b5e55d9d2 + md5: aa1485fb33be39a1036cdc93ee41a412 + sha256: b4c0a016d409328743e98671c2708d86bf54beb52546926a113696518659f41f category: dev optional: true - name: pycparser @@ -5705,7 +5705,7 @@ package: category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: linux-64 dependencies: @@ -5715,14 +5715,14 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: win-64 dependencies: @@ -5732,10 +5732,10 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic-core @@ -5873,7 +5873,7 @@ package: category: dev optional: true - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: linux-64 dependencies: @@ -5887,14 +5887,14 @@ package: tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: win-64 dependencies: @@ -5904,14 +5904,14 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '>=3.9' + python: '>=3.10' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pymatsolver @@ -7396,10 +7396,10 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* typing-extensions: '>=4.6.0' - url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py310h7c4b9e2_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py310h7c4b9e2_1.conda hash: - md5: ef71b1b926213f1b198486604727709e - sha256: ce149017f6e6d91f3103ff8017bb2f234aefacbed95acb459c21095da4d9582e + md5: 0849ba912ee3d982bf1eb44ecbe2a412 + sha256: cad1d739a42a01adc2f7a01d07fd35e72900026a3fbd275cb34bbc2323f831ce category: dev optional: true - name: sqlalchemy @@ -7414,10 +7414,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py310h29418f3_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py310h29418f3_1.conda hash: - md5: 328f2420ec397b0f27fee2d001c62704 - sha256: 6211457b98f8ad57665f8bb32e354b39bbcfe93ec6f8f50ef877578a0085556a + md5: afa4c6d3b4bfedfd47385570781f796c + sha256: 897b4080b98a6feacad32c7cee100319cc47b5134d2d105afcf93ae3e86043bd category: dev optional: true - name: stack_data @@ -8575,7 +8575,7 @@ package: manager: pip platform: linux-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8592,7 +8592,7 @@ package: manager: pip platform: win-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8605,7 +8605,7 @@ package: category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: linux-64 dependencies: @@ -8614,16 +8614,16 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: win-64 dependencies: @@ -8632,12 +8632,12 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: grid-apps @@ -8647,7 +8647,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8666,7 +8666,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' diff --git a/py-3.11.conda-lock.yml b/py-3.11.conda-lock.yml index ba096fbe2..b4ab89c01 100644 --- a/py-3.11.conda-lock.yml +++ b/py-3.11.conda-lock.yml @@ -352,27 +352,27 @@ package: category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: babel @@ -660,27 +660,27 @@ package: category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: __unix: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda hash: - md5: 74784ee3d225fc3dca89edb635b4e5cc - sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: f9e5fbc24009179e8b0409624691758a + sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: __win: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda hash: - md5: c9e0c0f82f6e63323827db462b40ede8 - sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: e54200a1cd1fe33d61c9df8d3b00b743 + sha256: bfb7f9f242f441fdcd80f1199edd2ecf09acea0f2bcef6f07d7cbb1a8131a345 category: main optional: false - name: cached-property @@ -732,27 +732,27 @@ package: category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: cffi @@ -3564,78 +3564,78 @@ package: category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_6.conda hash: - md5: 264fbfba7fb20acf3b29cde153e345ce - sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 99eee6aa5abea12f326f7fc010aef0c8 + sha256: 29c6ce15cf54f89282581d19329c99d1639036c5dde049bf1cae48dcc4137470 category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: _openmp_mutex: '>=4.5' libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.2.0-h1383e82_6.conda hash: - md5: c84381a01ede0e28d632fdbeea2debb2 - sha256: 9b997baa85ba495c04e1b30f097b80420c02dcaca6441c4bf2c6bb4b2c5d2114 + md5: 15d8f18987161d5a467434a0869cd789 + sha256: f910d04ea9bb4def10870c8c42b1bb55d22897c267eacea15b3cb18c69d8fac2 category: main optional: false - name: libgcc-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_6.conda hash: - md5: 069afdf8ea72504e48d23ae1171d951c - sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: d9717466cca9b9584226ce57a7cd58e6 + sha256: 12c91470ceb8d7d38fcee1a4ff1f50524625349059988f6bd0e8e6b27599a1ad category: main optional: false - name: libgfortran - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgfortran5: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + libgfortran5: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_6.conda hash: - md5: 0c91408b3dec0b97e8a3c694845bd63b - sha256: 4c1a526198d0d62441549fdfd668cc8e18e77609da1e545bdcc771dd8dc6a990 + md5: c41f84a30601e911a1e7a30f53531a59 + sha256: 37ac19d22718d371b1fd78207eee37bc384c5e7f8880e06187cb817f1124d1e2 category: main optional: false - name: libgfortran5 - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + libgcc: '>=15.2.0' + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_6.conda hash: - md5: fbd4008644add05032b6764807ee2cba - sha256: 9d06adc6d8e8187ddc1cad87525c690bc8202d8cb06c13b76ab2fc80a35ed565 + md5: 8fc1650fb7c7fca583cc3537a808e21b + sha256: 5046054c10fe5c81433849aa5d569e50ae051c4eac44b3e2a9bb34945eb16fc8 category: main optional: false - name: libgomp - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.2.0-h1383e82_6.conda hash: - md5: eae9a32a85152da8e6928a703a514d35 - sha256: 65fd558d8f3296e364b8ae694932a64642fdd26d8eb4cf7adf08941e449be926 + md5: 5939a1cf8d58da8b11bfc0db95aad396 + sha256: b6e6c2c527b1de0803ae820de9b78246ebcba688c797f77845a67e1125fb2714 category: main optional: false - name: libhwloc @@ -3968,28 +3968,28 @@ package: category: main optional: false - name: libstdcxx - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_6.conda hash: - md5: 4e02a49aaa9d5190cb630fa43528fbe6 - sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 9acaf38d72dcddace144f28506d45afa + sha256: fafd1c1320384a664f57e5d75568f214a31fe2201fc8baace6c15d88b8cf89a8 category: main optional: false - name: libstdcxx-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libstdcxx: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + libstdcxx: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_6.conda hash: - md5: 8bba50c7f4679f08c861b597ad2bda6b - sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 89611cb5b685d19e6201065720f97561 + sha256: 462fa002d3ab6702045ee330ab45719ac2958a092a4634a955cebc095f564794 category: main optional: false - name: libtiff @@ -4079,10 +4079,10 @@ package: platform: win-64 dependencies: ucrt: '' - url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda hash: - md5: 08bfa5da6e242025304b206d152479ef - sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 category: main optional: false - name: libxcb @@ -5268,25 +5268,25 @@ package: category: main optional: false - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.1-ha770c72_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.2-ha770c72_0.conda hash: - md5: 867fad79e8dbf2a38f1d9bbb9101aafe - sha256: bab8e43037c40560bb8996ab5bda966aeb370e5c715c25acb5e1ec8287078cc6 + md5: 4c9317a85d1c233f490545392e895118 + sha256: ae3760e865327aaf95df025ccea9ddc1d80ab9f70c5d2478bbfbf324b8eb4e7d category: dev optional: true - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: win-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.1-h57928b3_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.2-h57928b3_0.conda hash: - md5: 3c968a29de1b6747c092fc2483474a83 - sha256: d53f198eb2d5c4a9e9fbd4cd8037ebbcd922798e6f6f6ad3ddfc627cc3913543 + md5: 88a11dca037752f036fafb414dd8e0b0 + sha256: ff55de733e42d44f10372f1707e1579bdc56edb6e8b72ab80e6306d9073299b1 category: dev optional: true - name: pandocfilters @@ -5712,10 +5712,10 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py311h38be061_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py311h38be061_3.conda hash: - md5: a092cf434b09ea147245e978999a379d - sha256: f6ce37fc10a1c003f0db95a2bec20f3df09802617815cb848fa379a79c660b76 + md5: c3f40f483b106ac05b01d5482ec6ce5e + sha256: 65def1af82e39c9666cf88a07615ab82c2f41c7aa96525d71b8828ccfb3d5b14 category: dev optional: true - name: pybtex-docutils @@ -5728,10 +5728,10 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py311h1ea47a8_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py311h1ea47a8_3.conda hash: - md5: 544c4eeebd01975a6d71e3776212623f - sha256: 20ca92d7b6088c217ff65be59d2bfe710402d459b239e23497a04d7bf8a102c4 + md5: 2ec4b5376aeb7a79e07be2864faf45af + sha256: bf212b6aea818cbaf6a97aa1165671c6d5739a70257b6c852e6d1645b1f7aa72 category: dev optional: true - name: pycparser @@ -5759,7 +5759,7 @@ package: category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: linux-64 dependencies: @@ -5769,14 +5769,14 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: win-64 dependencies: @@ -5786,10 +5786,10 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic-core @@ -5927,7 +5927,7 @@ package: category: dev optional: true - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: linux-64 dependencies: @@ -5937,18 +5937,18 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '>=3.9' + python: '>=3.10' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: win-64 dependencies: @@ -5958,14 +5958,14 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '>=3.9' + python: '>=3.10' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pymatsolver @@ -7450,10 +7450,10 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* typing-extensions: '>=4.6.0' - url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py311h49ec1c0_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py311h49ec1c0_1.conda hash: - md5: d666d60bafc3dee42ebc74f0362ac619 - sha256: 8b9c01517b381820699f824972d967d8235ce383b5e39e00f653787c36434bfa + md5: 7e7855cd3f43fd9bd6423d0722f4dbb1 + sha256: 10e6ecbc4034b48ba7dc5e1223c81c35a23fe7e1325980b4bae8b7873b05ac28 category: dev optional: true - name: sqlalchemy @@ -7468,10 +7468,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py311h3485c13_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py311h3485c13_1.conda hash: - md5: 3dc596423e46db6dd8b500311ffeb82f - sha256: dc698ab700d4e7c396e62eaccb004b85556404d0e3013169c3f20ff5b54a8835 + md5: 6e70d0cacca9e2fe5efde69d4e251c30 + sha256: 3d9180233eff5b87d8d290c7fb47d786f9de8bbed0d73fe4ae4fdd31488e9d64 category: dev optional: true - name: stack_data @@ -8660,7 +8660,7 @@ package: manager: pip platform: linux-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8677,7 +8677,7 @@ package: manager: pip platform: win-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8690,7 +8690,7 @@ package: category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: linux-64 dependencies: @@ -8699,16 +8699,16 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: win-64 dependencies: @@ -8717,12 +8717,12 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: grid-apps @@ -8732,7 +8732,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8751,7 +8751,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index f58f0b656..5d6fda6a1 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -378,27 +378,27 @@ package: category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: attrs - version: 25.3.0 + version: 25.4.0 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda hash: - md5: a10d11958cadc13fdb43df75f8b1903f - sha256: 99c53ffbcb5dc58084faf18587b215f9ac8ced36bbfb55fa807c00967e419019 + md5: c7944d55af26b6d2d7629e27e9a972c1 + sha256: f6c3c19fa599a1a856a88db166c318b148cac3ee4851a9905ed8a04eeec79f45 category: dev optional: true - name: babel @@ -686,27 +686,27 @@ package: category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: __unix: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda hash: - md5: 74784ee3d225fc3dca89edb635b4e5cc - sha256: 837b795a2bb39b75694ba910c13c15fa4998d4bb2a622c214a6a5174b2ae53d1 + md5: f9e5fbc24009179e8b0409624691758a + sha256: 3b5ad78b8bb61b6cdc0978a6a99f8dfb2cc789a451378d054698441005ecbdb6 category: main optional: false - name: ca-certificates - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: __win: '' - url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2025.10.5-h4c7d964_0.conda hash: - md5: c9e0c0f82f6e63323827db462b40ede8 - sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485 + md5: e54200a1cd1fe33d61c9df8d3b00b743 + sha256: bfb7f9f242f441fdcd80f1199edd2ecf09acea0f2bcef6f07d7cbb1a8131a345 category: main optional: false - name: cached-property @@ -758,27 +758,27 @@ package: category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: certifi - version: 2025.8.3 + version: 2025.10.5 manager: conda platform: win-64 dependencies: - python: '>=3.9' - url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda + python: '>=3.10' + url: https://repo.prefix.dev/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda hash: - md5: 11f59985f49df4620890f3e746ed7102 - sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40 + md5: 257ae203f1d204107ba389607d375ded + sha256: 955bac31be82592093f6bc006e09822cd13daf52b28643c9a6abd38cd5f4a306 category: main optional: false - name: cffi @@ -3603,78 +3603,78 @@ package: category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' _openmp_mutex: '>=4.5' - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-15.2.0-h767d61c_6.conda hash: - md5: 264fbfba7fb20acf3b29cde153e345ce - sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 99eee6aa5abea12f326f7fc010aef0c8 + sha256: 29c6ce15cf54f89282581d19329c99d1639036c5dde049bf1cae48dcc4137470 category: main optional: false - name: libgcc - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: _openmp_mutex: '>=4.5' libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgcc-15.2.0-h1383e82_6.conda hash: - md5: c84381a01ede0e28d632fdbeea2debb2 - sha256: 9b997baa85ba495c04e1b30f097b80420c02dcaca6441c4bf2c6bb4b2c5d2114 + md5: 15d8f18987161d5a467434a0869cd789 + sha256: f910d04ea9bb4def10870c8c42b1bb55d22897c267eacea15b3cb18c69d8fac2 category: main optional: false - name: libgcc-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_6.conda hash: - md5: 069afdf8ea72504e48d23ae1171d951c - sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: d9717466cca9b9584226ce57a7cd58e6 + sha256: 12c91470ceb8d7d38fcee1a4ff1f50524625349059988f6bd0e8e6b27599a1ad category: main optional: false - name: libgfortran - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libgfortran5: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda + libgfortran5: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_6.conda hash: - md5: 0c91408b3dec0b97e8a3c694845bd63b - sha256: 4c1a526198d0d62441549fdfd668cc8e18e77609da1e545bdcc771dd8dc6a990 + md5: c41f84a30601e911a1e7a30f53531a59 + sha256: 37ac19d22718d371b1fd78207eee37bc384c5e7f8880e06187cb817f1124d1e2 category: main optional: false - name: libgfortran5 - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: '>=15.1.0' - url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda + libgcc: '>=15.2.0' + url: https://repo.prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_6.conda hash: - md5: fbd4008644add05032b6764807ee2cba - sha256: 9d06adc6d8e8187ddc1cad87525c690bc8202d8cb06c13b76ab2fc80a35ed565 + md5: 8fc1650fb7c7fca583cc3537a808e21b + sha256: 5046054c10fe5c81433849aa5d569e50ae051c4eac44b3e2a9bb34945eb16fc8 category: main optional: false - name: libgomp - version: 15.1.0 + version: 15.2.0 manager: conda platform: win-64 dependencies: libwinpthread: '>=12.0.0.r4.gg4f2fc60ca' - url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.1.0-h1383e82_5.conda + url: https://repo.prefix.dev/conda-forge/win-64/libgomp-15.2.0-h1383e82_6.conda hash: - md5: eae9a32a85152da8e6928a703a514d35 - sha256: 65fd558d8f3296e364b8ae694932a64642fdd26d8eb4cf7adf08941e449be926 + md5: 5939a1cf8d58da8b11bfc0db95aad396 + sha256: b6e6c2c527b1de0803ae820de9b78246ebcba688c797f77845a67e1125fb2714 category: main optional: false - name: libhwloc @@ -4007,28 +4007,28 @@ package: category: main optional: false - name: libstdcxx - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - libgcc: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + libgcc: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_6.conda hash: - md5: 4e02a49aaa9d5190cb630fa43528fbe6 - sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 9acaf38d72dcddace144f28506d45afa + sha256: fafd1c1320384a664f57e5d75568f214a31fe2201fc8baace6c15d88b8cf89a8 category: main optional: false - name: libstdcxx-ng - version: 15.1.0 + version: 15.2.0 manager: conda platform: linux-64 dependencies: - libstdcxx: 15.1.0 - url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + libstdcxx: 15.2.0 + url: https://repo.prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_6.conda hash: - md5: 8bba50c7f4679f08c861b597ad2bda6b - sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 89611cb5b685d19e6201065720f97561 + sha256: 462fa002d3ab6702045ee330ab45719ac2958a092a4634a955cebc095f564794 category: main optional: false - name: libtiff @@ -4118,10 +4118,10 @@ package: platform: win-64 dependencies: ucrt: '' - url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_9.conda + url: https://repo.prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda hash: - md5: 08bfa5da6e242025304b206d152479ef - sha256: 373f2973b8a358528b22be5e8d84322c165b4c5577d24d94fd67ad1bb0a0f261 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 category: main optional: false - name: libxcb @@ -5307,25 +5307,25 @@ package: category: main optional: false - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: linux-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.1-ha770c72_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pandoc-3.8.2-ha770c72_0.conda hash: - md5: 867fad79e8dbf2a38f1d9bbb9101aafe - sha256: bab8e43037c40560bb8996ab5bda966aeb370e5c715c25acb5e1ec8287078cc6 + md5: 4c9317a85d1c233f490545392e895118 + sha256: ae3760e865327aaf95df025ccea9ddc1d80ab9f70c5d2478bbfbf324b8eb4e7d category: dev optional: true - name: pandoc - version: 3.8.1 + version: 3.8.2 manager: conda platform: win-64 dependencies: {} - url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.1-h57928b3_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/pandoc-3.8.2-h57928b3_0.conda hash: - md5: 3c968a29de1b6747c092fc2483474a83 - sha256: d53f198eb2d5c4a9e9fbd4cd8037ebbcd922798e6f6f6ad3ddfc627cc3913543 + md5: 88a11dca037752f036fafb414dd8e0b0 + sha256: ff55de733e42d44f10372f1707e1579bdc56edb6e8b72ab80e6306d9073299b1 category: dev optional: true - name: pandocfilters @@ -5751,10 +5751,10 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_2.conda + url: https://repo.prefix.dev/conda-forge/linux-64/pybtex-docutils-1.0.3-py312h7900ff3_3.conda hash: - md5: 0472f87b9dc0b1db7b501f4d814ba90b - sha256: bf9c8f4c5282d46ce54bd2c6837fa5ff7a1c112382be3d13a7a0ae038d92b7c7 + md5: 97b91618b3c3419d55a76421c9078e07 + sha256: 2397e01959863ed36a9fa70bc7f2e655204d01b575b0809ba224684458460ed3 category: dev optional: true - name: pybtex-docutils @@ -5767,10 +5767,10 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* setuptools: '' - url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py312h2e8e312_2.conda + url: https://repo.prefix.dev/conda-forge/win-64/pybtex-docutils-1.0.3-py312h2e8e312_3.conda hash: - md5: 3bd0fdb9f643c218de4a0db9d72e734f - sha256: 2118403f158511cd869ac5cfe1d8a4bb50b4a6b7a0f181272909f0e4f60cf91b + md5: 6ac5a13b50c2a563d6adb48f5715d4eb + sha256: 4dd634b9fdb7a1dde8dedf8332f915824cd4f0ae1ccd4dbeec076b7a0e083bcc category: dev optional: true - name: pycparser @@ -5798,7 +5798,7 @@ package: category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: linux-64 dependencies: @@ -5808,14 +5808,14 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic - version: 2.11.9 + version: 2.11.10 manager: conda platform: win-64 dependencies: @@ -5825,10 +5825,10 @@ package: typing-extensions: '>=4.6.1' typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.9-pyh3cfb1c2_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pydantic-2.11.10-pyh3cfb1c2_0.conda hash: - md5: a6db60d33fe1ad50314a46749267fdfc - sha256: c3ec0c2202d109cdd5cac008bf7a42b67d4aa3c4cc14b4ee3e00a00541eabd88 + md5: 918d9adfc81cb14ab4cced31d22c7711 + sha256: 26779821ba83b896f319837d7c5301cc244dee41b311d2bd57cbd693ed9e43ef category: main optional: false - name: pydantic-core @@ -5966,7 +5966,7 @@ package: category: dev optional: true - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: linux-64 dependencies: @@ -5976,18 +5976,18 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '>=3.9' + python: '>=3.10' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pylint - version: 3.3.8 + version: 3.3.9 manager: conda platform: win-64 dependencies: @@ -5997,14 +5997,14 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '>=3.9' + python: '>=3.10' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' - url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.8-pyhe01879c_0.conda + url: https://repo.prefix.dev/conda-forge/noarch/pylint-3.3.9-pyhcf101f3_0.conda hash: - md5: f5ba3b2c52e855b67fc0abedcebc9675 - sha256: 5b19f8113694ff4e4f0d0870cf38357d9e84330ff6c2516127a65764289b6743 + md5: 3d773559e6b319a802a7c831b7f59138 + sha256: aed395678d4fdcec6ae66c22f06a16a92be600751979e75f6fb39f7c60b9ebf7 category: main optional: false - name: pymatsolver @@ -7517,10 +7517,10 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* typing-extensions: '>=4.6.0' - url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py312h4c3975b_0.conda + url: https://repo.prefix.dev/conda-forge/linux-64/sqlalchemy-2.0.43-py312h4c3975b_1.conda hash: - md5: 8a8ae29bfb3353ef70ebdad2ca373a40 - sha256: ef1faa38ee1a24a9a26755e9345c7e2ea852a678e0cd56d002a52db9fc87d163 + md5: 95d7654483188c67bd579374361473b8 + sha256: 0a235fad9c2be40cd32cbcb5481ece19c494647f66f55cff22a684ada7a2b802 category: dev optional: true - name: sqlalchemy @@ -7535,10 +7535,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.3,<15' vc14_runtime: '>=14.44.35208' - url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py312he06e257_0.conda + url: https://repo.prefix.dev/conda-forge/win-64/sqlalchemy-2.0.43-py312he06e257_1.conda hash: - md5: 0adeed53f5b3788e5c7ffcef77de8a6f - sha256: 55dc8d0253ab240c988229fdc35202a8d12647b6510f3ac60f4417126fb233c9 + md5: 9e7c0976b93b87e843ff8cdd579ca3f2 + sha256: f6051bff3119693120f13f21aacb1a94fc1b06f7d6a2254211fe48503cc98a99 category: dev optional: true - name: stack_data @@ -8727,7 +8727,7 @@ package: manager: pip platform: linux-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8744,7 +8744,7 @@ package: manager: pip platform: win-64 dependencies: - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8757,7 +8757,7 @@ package: category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: linux-64 dependencies: @@ -8766,16 +8766,16 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: geoh5py - version: 0.12.0a2.dev124+3d7c550d + version: 0.12.0a2.dev132+e5a08e7b manager: pip platform: win-64 dependencies: @@ -8784,12 +8784,12 @@ package: pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' pylint: '>=3.3.8,<4.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 hash: - sha256: 3d7c550d8271f13faf531eba83615e9ab637ac86 + sha256: e5a08e7bfed421e16b59c318ea430aec55a2c005 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@3d7c550d8271f13faf531eba83615e9ab637ac86 + url: git+https://github.com/MiraGeoscience/geoh5py.git@e5a08e7bfed421e16b59c318ea430aec55a2c005 category: main optional: false - name: grid-apps @@ -8799,7 +8799,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' @@ -8818,7 +8818,7 @@ package: dependencies: discretize: '>=0.11.0,<0.12.dev' geoapps-utils: 0.6.0a1.dev103+1398046 - geoh5py: 0.12.0a2.dev124+3d7c550d + geoh5py: 0.12.0a2.dev132+e5a08e7b numpy: '>=1.26.0,<1.27.0' pydantic: '>=2.5.2,<3.0.0' scipy: '>=1.14.0,<1.15.0' diff --git a/simpeg_drivers-assets/uijson/plate_simulation.ui.json b/simpeg_drivers-assets/uijson/plate_simulation.ui.json index 5431f723c..af639c887 100644 --- a/simpeg_drivers-assets/uijson/plate_simulation.ui.json +++ b/simpeg_drivers-assets/uijson/plate_simulation.ui.json @@ -4,9 +4,11 @@ "icon": "maxwellplate", "documentation": "https://mirageoscience-plate-simulation.readthedocs-hosted.com/en/latest/", "conda_environment": "simpeg_drivers", - "run_command": "simpeg_drivers.plate_simulation.driver", + "run_command": "simpeg_drivers.driver", "geoh5": "", "monitoring_directory": "", + "inversion_type": "plate simulation", + "forward_only": true, "simulation": { "main": true, "label": "SimPEG Group", diff --git a/simpeg_drivers-assets/uijson/plate_sweep.ui.json b/simpeg_drivers-assets/uijson/plate_sweep.ui.json index 99f5613ec..822e29889 100644 --- a/simpeg_drivers-assets/uijson/plate_sweep.ui.json +++ b/simpeg_drivers-assets/uijson/plate_sweep.ui.json @@ -4,9 +4,11 @@ "icon": "maxwellplate", "documentation": "https://mirageoscience-plate-simulation.readthedocs-hosted.com/en/latest/", "conda_environment": "simpeg_drivers", - "run_command": "simpeg_drivers.plate_simulation.sweep.driver", + "run_command": "simpeg_drivers.driver", "geoh5": "", "monitoring_directory": "", + "inversion_type": "plate sweep", + "forward_only": true, "template": { "main": true, "group": "Base", @@ -30,8 +32,7 @@ "directory" ], "directoryOnly": true, - "optional": true, - "enabled": false, + "enabled": true, "value": "" }, "background_start": { diff --git a/simpeg_drivers/__init__.py b/simpeg_drivers/__init__.py index 220e12ecd..cdfa2975d 100644 --- a/simpeg_drivers/__init__.py +++ b/simpeg_drivers/__init__.py @@ -168,4 +168,12 @@ def assets_path() -> Path: "simpeg_drivers.natural_sources.tipper.driver", {"forward": "TipperForwardDriver", "inversion": "TipperInversionDriver"}, ), + "plate simulation": ( + "simpeg_drivers.plate_simulation.driver", + {"forward": "PlateSimulationDriver"}, + ), + "plate sweep": ( + "simpeg_drivers.plate_simulation.sweep.driver", + {"forward": "PlateSweepDriver"}, + ), } diff --git a/simpeg_drivers/components/factories/directives_factory.py b/simpeg_drivers/components/factories/directives_factory.py index 7c4c95e48..da1f603cd 100644 --- a/simpeg_drivers/components/factories/directives_factory.py +++ b/simpeg_drivers/components/factories/directives_factory.py @@ -241,7 +241,7 @@ def save_iteration_model_directive(self): @property def save_iteration_log_files(self): """""" - if self._save_iteration_log_files is None: + if self._save_iteration_log_files is None and self.driver.logger: self._save_iteration_log_files = directives.SaveLogFilesGeoH5( self.driver.out_group, ) diff --git a/simpeg_drivers/components/factories/misfit_factory.py b/simpeg_drivers/components/factories/misfit_factory.py index 7b8cad882..eeb3bb195 100644 --- a/simpeg_drivers/components/factories/misfit_factory.py +++ b/simpeg_drivers/components/factories/misfit_factory.py @@ -125,6 +125,7 @@ def build(self, tiles, **_): return dask_objective_function.DistributedComboMisfits( misfits, client=self.client, + workers=self.workers, ) return self.simpeg_object( # pylint: disable=not-callable diff --git a/simpeg_drivers/driver.py b/simpeg_drivers/driver.py index 2217590a6..5a4ec45e9 100644 --- a/simpeg_drivers/driver.py +++ b/simpeg_drivers/driver.py @@ -31,7 +31,8 @@ from dask.distributed import get_client, Client, LocalCluster, performance_report -from geoapps_utils.base import Driver +from geoapps_utils.base import Driver, Options +from geoapps_utils.run import load_ui_json_as_dict from geoapps_utils.utils.importing import GeoAppsError from geoapps_utils.param_sweeps.driver import SweepParams @@ -84,15 +85,83 @@ mlogger.setLevel(logging.WARNING) -logger = logging.getLogger("simpeg-drivers") +class BaseDriver(Driver): + """ + Base class for drivers handling the parallel setup. + """ + def __init__( + self, + params: Options, + client: Client | bool | None = None, + workers: list[str] | None = None, + ): + super().__init__(params) + self._client: Client | bool = self.validate_client(client) + self._workers: list[tuple[str]] | None = self.validate_workers(workers) + + @property + def client(self) -> Client | bool | None: + """ + Dask client or False if not using Dask.distributed. + """ + return self._client -class InversionDriver(Driver): - _options_class = BaseForwardOptions | BaseInversionOptions + @property + def workers(self) -> list[tuple[str]]: + """List of workers stored as a list of tuples.""" + return self._workers + + def validate_client(self, client: Client | bool | None) -> Client | bool: + """ + Validate or create a Dask client. + """ + if client is None: + try: + client = get_client() + except ValueError: + client = False + return client + + def validate_workers(self, workers: list[tuple[str]] | None) -> list[tuple[str]]: + """ + Validate the list of workers. + """ + if self.client: + available_workers = [(worker,) for worker in self.client.nthreads()] + else: + return [] + + if workers is None: + return available_workers + + if not isinstance(workers, list) or not all( + isinstance(w, tuple) for w in workers + ): + raise TypeError("Workers must be a list of tuple[str].") + + invalid_workers = [w for w in workers if w not in available_workers] + if invalid_workers: + raise ValueError( + f"The following workers are not available: {invalid_workers}. " + f"Available workers are: {available_workers}." + ) + + return workers + + +class InversionDriver(BaseDriver): + _params_class = BaseForwardOptions | BaseInversionOptions _inversion_type: str | None = None - def __init__(self, params: BaseForwardOptions | BaseInversionOptions): - super().__init__(params) + def __init__( + self, + params: BaseForwardOptions | BaseInversionOptions, + client: Client | bool | None = None, + workers: list[tuple[str]] | None = None, + logger: logging.Logger | None | bool = None, + ): + super().__init__(params, client=client, workers=workers) self.inversion_type = self.params.inversion_type self.out_group = self.validate_out_group(self.params.out_group) @@ -103,7 +172,7 @@ def __init__(self, params: BaseForwardOptions | BaseInversionOptions): self._inversion_data: InversionData | None = None self._inversion_mesh: InversionMesh | None = None self._inversion_topography: InversionTopography | None = None - self._logger: InversionLogger | None = None + self.logger: InversionLogger | None = logger self._mapping: list[maps.IdentityMap] | None = None self._models: InversionModelCollection | None = None self._n_values: int | None = None @@ -114,31 +183,6 @@ def __init__(self, params: BaseForwardOptions | BaseInversionOptions): self._ordering: list[np.ndarray] | None = None self._mappings: list[maps.IdentityMap] | None = None self._window = None - self._client: Client | bool | None = None - self._workers: list[str] | None = None - - @property - def client(self) -> Client | bool | None: - if self._client is None: - try: - self._client = get_client() - except ValueError: - self._client = False - - return self._client - - @property - def workers(self): - """List of workers""" - if self._workers is None: - if self.client: - self._workers = [ - (worker.worker_address,) - for worker in self.client.cluster.workers.values() - ] - else: - self._workers = [] - return self._workers def split_list(self, tiles: list[np.ndarray]) -> list[np.ndarray]: """ @@ -162,9 +206,10 @@ def split_list(self, tiles: list[np.ndarray]) -> list[np.ndarray]: split_list[count % n_tiles] += 1 count += 1 - self.logger.write( - f"Number of misfits: {np.sum(split_list)} distributed over {len(self.workers)} workers.\n" - ) + if self.logger: + self.logger.write( + f"Number of misfits: {np.sum(split_list)} distributed over {len(self.workers)} workers.\n" + ) flat_tile_list = [] for tile, split in zip(tiles, split_list): @@ -179,14 +224,17 @@ def data_misfit(self): # Tile locations tiles = self.get_tiles() - self.logger.write(f"Setting up {len(tiles)} tile(s) . . .\n") - # Build tiled misfits and combine to form global misfit + if self.logger: + self.logger.write(f"Setting up {len(tiles)} tile(s) . . .\n") + self._data_misfit = MisfitFactory( self.params, self.client, self.simulation, self.workers ).build( self.split_list(tiles), ) - self.logger.write("Saving data to file...\n") + + if self.logger: + self.logger.write("Saving data to file...\n") return self._data_misfit @@ -260,15 +308,25 @@ def inversion_type(self, value): self._inversion_type = value @property - def logger(self): + def logger(self) -> InversionLogger | None: """ Inversion logger """ - if getattr(self, "_logger", None) is None: - self._logger = InversionLogger("SimPEG.log", self) - return self._logger + @logger.setter + def logger(self, value: InversionLogger | None | bool): + if value is True or value is None: + self._logger = InversionLogger("SimPEG.log", self) + elif value is False: + self._logger = None + elif isinstance(value, logging.Logger): + self._logger = value + else: + raise TypeError( + "Logger must be a InversionLogger instance, None, True or False." + ) + @property def models(self): """Inversion models""" @@ -413,8 +471,10 @@ def window(self): def run(self): """Run inversion from params""" - sys.stdout = self.logger - self.logger.start() + if self.logger: + sys.stdout = self.logger + self.logger.start() + self.configure_dask() with fetch_active_workspace(self.workspace, mode="r+"): @@ -426,13 +486,15 @@ def run(self): predicted = None try: if self.params.forward_only: - self.logger.write("Running the forward simulation ...\n") + if self.logger: + self.logger.write("Running the forward simulation ...\n") predicted = simpeg_inversion.invProb.get_dpred( self.models.starting_model, None ) else: # Run the inversion - self.start_inversion_message() + if self.logger: + self.start_inversion_message() simpeg_inversion.run(self.models.starting_model) except np.core._exceptions._ArrayMemoryError as error: # pylint: disable=protected-access @@ -442,9 +504,9 @@ def run(self): "or increase the number of tiles." ) from error - self.logger.end() - sys.stdout = self.logger.terminal - self.logger.log.close() + if self.logger: + self.logger.end() + sys.stdout = self.logger.terminal if self.params.forward_only: self.directives.save_iteration_data_directive.write(0, predicted) @@ -642,36 +704,16 @@ def configure_dask(self): dconf.set(scheduler="threads", pool=ThreadPool(n_cpu)) @classmethod - def start( - cls, filepath: str | Path | InputFile, driver_class=None, **kwargs - ) -> InversionDriver: + def start(cls, filepath: str | Path | InputFile, **kwargs) -> BaseDriver: """ Start the inversion driver. :param filepath: Path to the input file or InputFile object. - :param driver_class: Optional driver class to use instead of the default. :param kwargs: Additional keyword arguments for InputFile read_ui_json. :return: InversionDriver instance with the specified parameters. """ - if isinstance(filepath, InputFile): - ifile = filepath - else: - ifile = InputFile.read_ui_json(filepath, **kwargs) - - try: - if driver_class is None: - driver = cls.from_input_file(ifile) - else: - with ifile.data["geoh5"].open(mode="r+"): - params = driver_class._options_class.build(ifile) - driver = driver_class(params) - - driver.run() - - except GeoAppsError as error: - logger.warning("\n\nApplicationError: %s\n\n", error) - sys.exit(1) + driver = super().start(filepath, **kwargs) return driver @@ -685,39 +727,35 @@ def driver_class_from_name( raise NotImplementedError(msg) mod_name, classes = DRIVER_MAP.get(name) + class_name = classes.get("inversion") if forward_only: - class_name = classes.get("forward", classes["inversion"]) - else: - class_name = classes.get("inversion") + class_name = classes.get("forward", class_name) + module = __import__(mod_name, fromlist=[class_name]) return getattr(module, class_name) @classmethod - def from_input_file(cls, ifile: InputFile) -> InversionDriver: - forward_only = ifile.data["forward_only"] - inversion_type = ifile.ui_json.get("inversion_type", None) + def from_input_file(cls, data: dict) -> type[InversionDriver]: + forward_only = data.get("forward_only", False) + inversion_type = data.get("inversion_type", "") if inversion_type is None: raise GeoAppsError( "Key/value 'inversion_type' not found in the input file. " "Please specify the inversion type in the UI JSON." ) - driver_class = cls.driver_class_from_name( - inversion_type, forward_only=forward_only - ) - - with ifile.data["geoh5"].open(mode="r+"): - params = driver_class._options_class.build(ifile) - driver = driver_class(params) - - return driver + return cls.driver_class_from_name(inversion_type, forward_only=forward_only) class InversionLogger: + """ + Logger for the inversion process. + """ + def __init__(self, logfile, driver): self.driver = driver self.terminal = sys.stdout - self.log = open(self.get_path(logfile), "w", encoding="utf8") + self.logfile = self.get_path(logfile) self.initial_time = time() def start(self): @@ -737,8 +775,9 @@ def end(self): def write(self, message): self.terminal.write(message) - self.log.write(message) - self.log.flush() + with open(self.logfile, "a", encoding="utf8") as logfile: + logfile.write(message) + logfile.flush() @staticmethod def format_seconds(seconds): @@ -763,13 +802,15 @@ def get_path(self, filepath: str | Path) -> str: if __name__ == "__main__": file = Path(sys.argv[1]).resolve() - input_file = InputFile.read_ui_json(file) - n_workers = input_file.data.get("n_workers", None) - n_threads = input_file.data.get("n_threads", None) - save_report = input_file.data.get("performance_report", False) + input_file = load_ui_json_as_dict(file) + n_workers = input_file.get("n_workers", None) + n_threads = input_file.get("n_threads", None) + save_report = input_file.get("performance_report", False) + + driver_class = InversionDriver.from_input_file(input_file) # Force distributed on 1D problems - if "1D" in input_file.data["title"] and n_workers is None: + if "1D" in input_file.get("title") and n_workers is None: n_threads = n_threads or 2 n_workers = multiprocessing.cpu_count() // n_threads @@ -784,15 +825,15 @@ def get_path(self, filepath: str | Path) -> str: with ( cluster.get_client() if cluster is not None - else contextlib.nullcontext() as client + else contextlib.nullcontext() as context_client ): # Full run with ( performance_report(filename=file.parent / "dask_profile.html") - if (save_report and isinstance(client, Client)) + if (save_report and isinstance(context_client, Client)) else contextlib.nullcontext() ): - InversionDriver.start(input_file) + driver_class.start(file) sys.stdout.close() profiler.disable() diff --git a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/driver.py b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/driver.py index 69a7d8529..d3ab11850 100644 --- a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/driver.py +++ b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/driver.py @@ -25,12 +25,12 @@ class DCBatch2DForwardDriver(BaseBatch2DDriver): """Direct Current batch 2D forward driver.""" - _options_class = DCBatch2DForwardOptions + _params_class = DCBatch2DForwardOptions _params_2d_class = DC2DForwardOptions class DCBatch2DInversionDriver(BaseBatch2DDriver): """Direct Current batch 2D inversion driver.""" - _options_class = DCBatch2DInversionOptions + _params_class = DCBatch2DInversionOptions _params_2d_class = DC2DInversionOptions diff --git a/simpeg_drivers/electricals/direct_current/three_dimensions/driver.py b/simpeg_drivers/electricals/direct_current/three_dimensions/driver.py index 59e7b6684..b8d46c265 100644 --- a/simpeg_drivers/electricals/direct_current/three_dimensions/driver.py +++ b/simpeg_drivers/electricals/direct_current/three_dimensions/driver.py @@ -19,12 +19,12 @@ class DC3DForwardDriver(InversionDriver): """Direct Current 3D forward driver.""" - _options_class = DC3DForwardOptions + _params_class = DC3DForwardOptions _validation = None class DC3DInversionDriver(InversionDriver): """Direct Current 3D inversion driver.""" - _options_class = DC3DInversionOptions + _params_class = DC3DInversionOptions _validation = None diff --git a/simpeg_drivers/electricals/direct_current/two_dimensions/driver.py b/simpeg_drivers/electricals/direct_current/two_dimensions/driver.py index fae98cf15..5ef715bb1 100644 --- a/simpeg_drivers/electricals/direct_current/two_dimensions/driver.py +++ b/simpeg_drivers/electricals/direct_current/two_dimensions/driver.py @@ -19,10 +19,10 @@ class DC2DForwardDriver(Base2DDriver): """Direct Current 2D forward driver.""" - _options_class = DC2DForwardOptions + _params_class = DC2DForwardOptions class DC2DInversionDriver(Base2DDriver): """Direct Current 2D inversion driver.""" - _options_class = DC2DInversionOptions + _params_class = DC2DInversionOptions diff --git a/simpeg_drivers/electricals/driver.py b/simpeg_drivers/electricals/driver.py index 62b5c3893..3a85868e1 100644 --- a/simpeg_drivers/electricals/driver.py +++ b/simpeg_drivers/electricals/driver.py @@ -81,7 +81,7 @@ def create_drape_mesh(self) -> DrapeModel: class BaseBatch2DDriver(LineSweepDriver): """Base class for batch 2D DC and IP forward and inversion drivers.""" - _options_class: type[BaseForwardOptions | BaseInversionOptions] + _params_class: type[BaseForwardOptions | BaseInversionOptions] _params_2d_class: type[BaseForwardOptions | BaseInversionOptions] _model_list: list[str] = [] diff --git a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/driver.py b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/driver.py index 4e48c4d72..abbaa0951 100644 --- a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/driver.py +++ b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/driver.py @@ -25,7 +25,7 @@ class IPBatch2DForwardDriver(BaseBatch2DDriver): """Induced Polarization batch 2D forward driver.""" - _options_class = IPBatch2DForwardOptions + _params_class = IPBatch2DForwardOptions _params_2d_class = IP2DForwardOptions _model_list = ["conductivity_model"] @@ -34,7 +34,7 @@ class IPBatch2DForwardDriver(BaseBatch2DDriver): class IPBatch2DInversionDriver(BaseBatch2DDriver): """Induced Polarization batch 2D inversion driver.""" - _options_class = IPBatch2DInversionOptions + _params_class = IPBatch2DInversionOptions _params_2d_class = IP2DInversionOptions _model_list = ["conductivity_model"] diff --git a/simpeg_drivers/electricals/induced_polarization/three_dimensions/driver.py b/simpeg_drivers/electricals/induced_polarization/three_dimensions/driver.py index 076f6d7da..da79b3cfd 100644 --- a/simpeg_drivers/electricals/induced_polarization/three_dimensions/driver.py +++ b/simpeg_drivers/electricals/induced_polarization/three_dimensions/driver.py @@ -22,10 +22,10 @@ class IP3DForwardDriver(InversionDriver): """Induced Polarization 3D forward driver.""" - _options_class = IP3DForwardOptions + _params_class = IP3DForwardOptions class IP3DInversionDriver(InversionDriver): """Induced Polarization 3D inversion driver.""" - _options_class = IP3DInversionOptions + _params_class = IP3DInversionOptions diff --git a/simpeg_drivers/electricals/induced_polarization/two_dimensions/driver.py b/simpeg_drivers/electricals/induced_polarization/two_dimensions/driver.py index 30bc2a515..8a0197d9b 100644 --- a/simpeg_drivers/electricals/induced_polarization/two_dimensions/driver.py +++ b/simpeg_drivers/electricals/induced_polarization/two_dimensions/driver.py @@ -22,10 +22,10 @@ class IP2DForwardDriver(Base2DDriver): """Induced Polarization 2D forward driver.""" - _options_class = IP2DForwardOptions + _params_class = IP2DForwardOptions class IP2DInversionDriver(Base2DDriver): """Induced Polarization 2D inversion driver.""" - _options_class = IP2DInversionOptions + _params_class = IP2DInversionOptions diff --git a/simpeg_drivers/electromagnetics/base_1d_driver.py b/simpeg_drivers/electromagnetics/base_1d_driver.py index 2b10ffc12..a4e935121 100644 --- a/simpeg_drivers/electromagnetics/base_1d_driver.py +++ b/simpeg_drivers/electromagnetics/base_1d_driver.py @@ -35,7 +35,7 @@ class Base1DDriver(InversionDriver): """Base 1D driver for electromagnetic simulations.""" - _options_class = None + _params_class = None def __init__(self, workspace: Workspace, **kwargs): super().__init__(workspace, **kwargs) diff --git a/simpeg_drivers/electromagnetics/frequency_domain/driver.py b/simpeg_drivers/electromagnetics/frequency_domain/driver.py index 7be3e0604..70dcce70a 100644 --- a/simpeg_drivers/electromagnetics/frequency_domain/driver.py +++ b/simpeg_drivers/electromagnetics/frequency_domain/driver.py @@ -22,7 +22,7 @@ class FDEMForwardDriver(InversionDriver): """Frequency Domain Electromagnetic forward driver.""" - _options_class = FDEMForwardOptions + _params_class = FDEMForwardOptions def __init__(self, params: FDEMForwardOptions): super().__init__(params) @@ -31,4 +31,4 @@ def __init__(self, params: FDEMForwardOptions): class FDEMInversionDriver(InversionDriver): """Frequency Domain Electromagnetic inversion driver.""" - _options_class = FDEMInversionOptions + _params_class = FDEMInversionOptions diff --git a/simpeg_drivers/electromagnetics/frequency_domain_1d/driver.py b/simpeg_drivers/electromagnetics/frequency_domain_1d/driver.py index b719232e4..acdb00a53 100644 --- a/simpeg_drivers/electromagnetics/frequency_domain_1d/driver.py +++ b/simpeg_drivers/electromagnetics/frequency_domain_1d/driver.py @@ -22,10 +22,10 @@ class FDEM1DForwardDriver(Base1DDriver): """Frequency Domain 1D Electromagnetic forward driver.""" - _options_class = FDEM1DForwardOptions + _params_class = FDEM1DForwardOptions class FDEM1DInversionDriver(Base1DDriver): """Frequency Domain 1D Electromagnetic inversion driver.""" - _options_class = FDEM1DInversionOptions + _params_class = FDEM1DInversionOptions diff --git a/simpeg_drivers/electromagnetics/time_domain/driver.py b/simpeg_drivers/electromagnetics/time_domain/driver.py index a47a958e3..f53c411f4 100644 --- a/simpeg_drivers/electromagnetics/time_domain/driver.py +++ b/simpeg_drivers/electromagnetics/time_domain/driver.py @@ -27,10 +27,10 @@ class TDEMForwardDriver(InversionDriver): """Time Domain Electromagnetic forward driver.""" - _options_class = TDEMForwardOptions + _params_class = TDEMForwardOptions class TDEMInversionDriver(InversionDriver): """Time Domain Electromagnetic inversion driver.""" - _options_class = TDEMInversionOptions + _params_class = TDEMInversionOptions diff --git a/simpeg_drivers/electromagnetics/time_domain_1d/driver.py b/simpeg_drivers/electromagnetics/time_domain_1d/driver.py index deba2b409..1a19af2c3 100644 --- a/simpeg_drivers/electromagnetics/time_domain_1d/driver.py +++ b/simpeg_drivers/electromagnetics/time_domain_1d/driver.py @@ -22,10 +22,10 @@ class TDEM1DForwardDriver(Base1DDriver): """Time Domain 1D Electromagnetic forward driver.""" - _options_class = TDEM1DForwardOptions + _params_class = TDEM1DForwardOptions class TDEM1DInversionDriver(Base1DDriver): """Time Domain 1D Electromagnetic inversion driver.""" - _options_class = TDEM1DInversionOptions + _params_class = TDEM1DInversionOptions diff --git a/simpeg_drivers/joint/driver.py b/simpeg_drivers/joint/driver.py index c61bc6fc6..b0a74a464 100644 --- a/simpeg_drivers/joint/driver.py +++ b/simpeg_drivers/joint/driver.py @@ -226,9 +226,10 @@ def n_values(self): def run(self): """Run inversion from params""" - sys.stdout = self.logger - self.logger.start() - self.configure_dask() + if self.logger: + sys.stdout = self.logger + self.logger.start() + self.configure_dask() if Path(self.params.input_file.path_name).is_file(): with fetch_active_workspace(self.workspace, mode="r+"): @@ -248,11 +249,10 @@ def run(self): # Run the inversion self.start_inversion_message() self.inversion.run(self.models.starting_model) - - self.logger.end() - sys.stdout = self.logger.terminal - self.logger.log.close() - self._update_log() + if self.logger: + self.logger.end() + sys.stdout = self.logger.terminal + self._update_log() def validate_create_mesh(self): """Function to validate and create the inversion mesh.""" diff --git a/simpeg_drivers/joint/joint_cross_gradient/driver.py b/simpeg_drivers/joint/joint_cross_gradient/driver.py index ffc17d0aa..05e500b9d 100644 --- a/simpeg_drivers/joint/joint_cross_gradient/driver.py +++ b/simpeg_drivers/joint/joint_cross_gradient/driver.py @@ -32,7 +32,7 @@ class JointCrossGradientDriver(BaseJointDriver): - _options_class = JointCrossGradientOptions + _params_class = JointCrossGradientOptions def __init__(self, params: JointCrossGradientOptions): self._wires = None diff --git a/simpeg_drivers/joint/joint_petrophysics/driver.py b/simpeg_drivers/joint/joint_petrophysics/driver.py index b36170d9a..5e9bacf87 100644 --- a/simpeg_drivers/joint/joint_petrophysics/driver.py +++ b/simpeg_drivers/joint/joint_petrophysics/driver.py @@ -29,7 +29,7 @@ class JointPetrophysicsDriver(BaseJointDriver): - _options_class = JointPetrophysicsOptions + _params_class = JointPetrophysicsOptions def __init__(self, params: JointPetrophysicsOptions): self._wires = None diff --git a/simpeg_drivers/joint/joint_surveys/driver.py b/simpeg_drivers/joint/joint_surveys/driver.py index b688df457..c0906560a 100644 --- a/simpeg_drivers/joint/joint_surveys/driver.py +++ b/simpeg_drivers/joint/joint_surveys/driver.py @@ -30,7 +30,7 @@ class JointSurveyDriver(BaseJointDriver): """Joint surveys inversion driver""" - _options_class = JointSurveysOptions + _params_class = JointSurveysOptions def __init__(self, params: JointSurveysOptions): super().__init__(params) diff --git a/simpeg_drivers/line_sweep/driver.py b/simpeg_drivers/line_sweep/driver.py index a2e6d56fa..f29195d93 100644 --- a/simpeg_drivers/line_sweep/driver.py +++ b/simpeg_drivers/line_sweep/driver.py @@ -18,6 +18,7 @@ import numpy as np from geoapps_utils.param_sweeps.driver import SweepDriver, SweepParams from geoapps_utils.param_sweeps.generate import generate +from geoapps_utils.run import load_ui_json_as_dict from geoapps_utils.utils.importing import GeoAppsError from geoh5py.data import FilenameData from geoh5py.groups import ContainerGroup, SimPEGGroup @@ -77,6 +78,8 @@ def validate_out_group(self, out_group: SimPEGGroup | None) -> SimPEGGroup: def run(self): """ Run the line sweep driver. + + TODO: Add parallelization on GEOPY-2490 """ with fetch_active_workspace(self.workspace, mode="r+"): if not isinstance(self.out_group, SimPEGGroup): @@ -84,7 +87,26 @@ def run(self): f"Output group should be a valid SimPEGGroup, received: {type(self.out_group)}." ) - super().run() + lookup = self.get_lookup() + self.write_files(lookup) + + for name, trial in lookup.items(): + file_path = Path(self.working_directory) / f"{name}.ui.json" + if trial["status"] == "complete": + continue + + trial["status"] = "processing" + self.update_lookup(lookup) + params_dict = load_ui_json_as_dict(file_path) + driver = self.driver_class_from_name( + params_dict["inversion_type"], + forward_only=params_dict["forward_only"], + ) + driver.start(file_path) + + trial["status"] = "complete" + self.update_lookup(lookup) + self.collect_results() if self.cleanup: diff --git a/simpeg_drivers/natural_sources/magnetotellurics/driver.py b/simpeg_drivers/natural_sources/magnetotellurics/driver.py index f522d9a22..355023c8b 100644 --- a/simpeg_drivers/natural_sources/magnetotellurics/driver.py +++ b/simpeg_drivers/natural_sources/magnetotellurics/driver.py @@ -19,10 +19,10 @@ class MTForwardDriver(InversionDriver): """Magnetotellurics forward driver.""" - _options_class = MTForwardOptions + _params_class = MTForwardOptions class MTInversionDriver(InversionDriver): """Magnetotellurics inversion driver.""" - _options_class = MTInversionOptions + _params_class = MTInversionOptions diff --git a/simpeg_drivers/natural_sources/tipper/driver.py b/simpeg_drivers/natural_sources/tipper/driver.py index 30bd09213..e7bb85dc6 100644 --- a/simpeg_drivers/natural_sources/tipper/driver.py +++ b/simpeg_drivers/natural_sources/tipper/driver.py @@ -19,10 +19,10 @@ class TipperForwardDriver(InversionDriver): """Tipper forward driver.""" - _options_class = TipperForwardOptions + _params_class = TipperForwardOptions class TipperInversionDriver(InversionDriver): """Tipper inversion driver.""" - _options_class = TipperInversionOptions + _params_class = TipperInversionOptions diff --git a/simpeg_drivers/plate_simulation/driver.py b/simpeg_drivers/plate_simulation/driver.py index 48ab0a2d8..b7dd61c06 100644 --- a/simpeg_drivers/plate_simulation/driver.py +++ b/simpeg_drivers/plate_simulation/driver.py @@ -14,17 +14,17 @@ from pathlib import Path import numpy as np +from dask.distributed import Client from geoapps_utils.base import Driver, get_logger -from geoapps_utils.param_sweeps.generate import generate from geoapps_utils.utils.transformations import azimuth_to_unit_vector from geoh5py.data import FloatData, ReferencedData -from geoh5py.groups import UIJsonGroup +from geoh5py.groups import SimPEGGroup from geoh5py.objects import Octree, Points, Surface from geoh5py.shared.utils import fetch_active_workspace, stringify from geoh5py.ui_json import InputFile, monitored_directory_copy from grid_apps.octree_creation.driver import OctreeDriver -from simpeg_drivers.driver import InversionDriver +from simpeg_drivers.driver import BaseDriver, InversionDriver from simpeg_drivers.options import BaseForwardOptions from simpeg_drivers.plate_simulation.models.events import Anomaly, Erosion, Overburden from simpeg_drivers.plate_simulation.models.parametric import Plate @@ -35,7 +35,7 @@ logger = get_logger(__name__, propagate=False) -class PlateSimulationDriver(Driver): +class PlateSimulationDriver(BaseDriver): """ Driver for simulating background + plate + overburden model. @@ -49,8 +49,13 @@ class PlateSimulationDriver(Driver): _params_class = PlateSimulationOptions - def __init__(self, params: PlateSimulationOptions): - super().__init__(params) + def __init__( + self, + params: PlateSimulationOptions, + client: Client | bool | None = None, + workers: list[tuple[str]] | None = None, + ): + super().__init__(params, client=client, workers=workers) self._plates: list[Plate] | None = None self._survey: Points | None = None @@ -66,15 +71,7 @@ def run(self) -> InversionDriver: logger.info("running the simulation...") with fetch_active_workspace(self.params.geoh5, mode="r+"): self.simulation_driver.run() - self.out_group.add_ui_json() - if ( - self.params.monitoring_directory is not None - and Path(self.params.monitoring_directory).is_dir() - ): - monitored_directory_copy( - str(Path(self.params.monitoring_directory).resolve()), - self.out_group, - ) + self.update_monitoring_directory(self.out_group) logger.info("done.") logger.handlers.clear() @@ -82,23 +79,23 @@ def run(self) -> InversionDriver: return self.simulation_driver @property - def out_group(self) -> UIJsonGroup: + def out_group(self) -> SimPEGGroup: """ Returns the output group for the simulation. """ return self._out_group - def validate_out_group(self, out_group: UIJsonGroup | None) -> UIJsonGroup: + def validate_out_group(self, out_group: SimPEGGroup | None) -> SimPEGGroup: """ - Validate or create a UIJsonGroup to store results. + Validate or create a SimPEGGroup to store results. - :param value: Output group from selection. + :param out_group: Output group from selection. """ - if isinstance(out_group, UIJsonGroup): + if isinstance(out_group, SimPEGGroup): return out_group with fetch_active_workspace(self.params.geoh5, mode="r+"): - out_group = UIJsonGroup.create( + out_group = SimPEGGroup.create( self.params.geoh5, name="Plate Simulation", ) @@ -128,7 +125,9 @@ def simulation_driver(self) -> InversionDriver: driver_class = InversionDriver.driver_class_from_name( self.simulation_parameters.inversion_type, forward_only=True ) - self._simulation_driver = driver_class(self.simulation_parameters) + self._simulation_driver = driver_class( + self.simulation_parameters, client=self.client, workers=self.workers + ) self._simulation_driver.out_group.parent = self.out_group return self._simulation_driver @@ -300,36 +299,6 @@ def replicate( plates.append(new) return plates - @staticmethod - def start(ifile: str | Path | InputFile): - """Run the plate simulation driver from an input file.""" - - if isinstance(ifile, str): - ifile = Path(ifile) - - if isinstance(ifile, Path): - ifile = InputFile.read_ui_json(ifile) - - if ifile.data is None: # type: ignore - raise ValueError("Input file has no data loaded.") - - generate_sweep = ifile.data["generate_sweep"] # type: ignore - if generate_sweep: - filepath = Path(ifile.path_name) # type: ignore - ifile.data["generate_sweep"] = False # type: ignore - name = filepath.name - path = filepath.parent - ifile.write_ui_json(name=name, path=path) # type: ignore - generate( # pylint: disable=unexpected-keyword-arg - str(filepath), update_values={"conda_environment": "plate_simulation"} - ) - return None - - with ifile.geoh5.open(mode="r+"): # type: ignore - params = PlateSimulationOptions.build(ifile) - - return PlateSimulationDriver(params).run() - if __name__ == "__main__": file = Path(sys.argv[1]) diff --git a/simpeg_drivers/plate_simulation/options.py b/simpeg_drivers/plate_simulation/options.py index 9a754e84c..5c2275e93 100644 --- a/simpeg_drivers/plate_simulation/options.py +++ b/simpeg_drivers/plate_simulation/options.py @@ -12,7 +12,7 @@ from pathlib import Path from typing import ClassVar -from geoapps_utils.driver.data import BaseData +from geoapps_utils.base import Options from geoh5py.groups import SimPEGGroup, UIJsonGroup from geoh5py.objects import ObjectBase, Points, Surface from geoh5py.ui_json import InputFile @@ -104,14 +104,10 @@ def octree_params( diagonal_balance=self.diagonal_balance, refinements=refinements, ) - - assert isinstance(survey.workspace.h5file, Path) - path = survey.workspace.h5file.parent - octree_params.write_ui_json(path / "octree.ui.json") return octree_params -class PlateSimulationOptions(BaseData): +class PlateSimulationOptions(Options): """ Parameters for the plate simulation driver. @@ -128,6 +124,8 @@ class PlateSimulationOptions(BaseData): title: ClassVar[str] = "Plate Simulation" run_command: ClassVar[str] = "simpeg_drivers.plate_simulation.driver" out_group: SimPEGGroup | UIJsonGroup | None = None + forward_only: bool = True + inversion_type: str = "plate simulation" mesh: MeshOptions model: ModelOptions diff --git a/simpeg_drivers/plate_simulation/sweep/driver.py b/simpeg_drivers/plate_simulation/sweep/driver.py index 4434beaa8..a042119cb 100644 --- a/simpeg_drivers/plate_simulation/sweep/driver.py +++ b/simpeg_drivers/plate_simulation/sweep/driver.py @@ -12,14 +12,17 @@ import sys from pathlib import Path -from geoapps_utils.base import Driver +import numpy as np +from dask.distributed import Client, LocalCluster, performance_report +from geoapps_utils.run import load_ui_json_as_dict from geoapps_utils.utils.importing import GeoAppsError from geoapps_utils.utils.logger import get_logger from geoh5py import Workspace from geoh5py.groups import SimPEGGroup, UIJsonGroup from geoh5py.shared.utils import fetch_active_workspace -from geoh5py.ui_json.input_file import InputFile +from geoh5py.ui_json.utils import flatten +from simpeg_drivers.driver import BaseDriver from simpeg_drivers.plate_simulation.driver import PlateSimulationDriver from simpeg_drivers.plate_simulation.options import PlateSimulationOptions from simpeg_drivers.plate_simulation.sweep.options import SweepOptions @@ -30,15 +33,15 @@ # TODO: Can we make this generic (PlateSweepDriver -> SweepDriver)? -class PlateSweepDriver(Driver): +class PlateSweepDriver(BaseDriver): """Sets up and manages workers to run all combinations of swepts parameters.""" _params_class = SweepOptions - def __init__(self, params: SweepOptions): - super().__init__(params) + def __init__(self, params: SweepOptions, workers: list[tuple[str]] | None = None): + super().__init__(params, workers=workers) - self._out_group = self.validate_out_group(self.params.out_group) + self.out_group = self.validate_out_group(self.params.out_group) @property def out_group(self) -> SimPEGGroup: @@ -47,6 +50,17 @@ def out_group(self) -> SimPEGGroup: """ return self._out_group + @out_group.setter + def out_group(self, value: SimPEGGroup): + if not isinstance(value, SimPEGGroup): + raise TypeError("Output group must be a SimPEGGroup.") + + if self.params.out_group != value: + self.params.out_group = value + self.params.update_out_group_options() + + self._out_group = value + def validate_out_group(self, out_group: SimPEGGroup | None) -> SimPEGGroup: """ Validate or create a UIJsonGroup to store results. @@ -62,14 +76,11 @@ def validate_out_group(self, out_group: SimPEGGroup | None) -> SimPEGGroup: name=self.params.title, ) out_group.entity_type.name = self.params.title - self.params = self.params.model_copy(update={"out_group": out_group}) - out_group.options = self.params.serialize() - out_group.metadata = None return out_group @classmethod - def start(cls, filepath: str | Path, mode="r", **_) -> Driver: + def start(cls, filepath: str | Path, mode="r", **_) -> BaseDriver: """Start the parameter sweep from a ui.json file.""" logger.info("Loading input file . . .") filepath = Path(filepath).resolve() @@ -99,18 +110,45 @@ def run(self): len(trials), self.params.template.options["title"], ) - for kwargs in trials: - options_string = self.params.jsonify(kwargs) - uid = SweepOptions.uuid_from_params(options_string) - kwargs.update({"out_group": str(self.out_group.uid)}) - PlateSweepDriver.run_worker( - uid, kwargs, self.workspace.h5file, options_string, self.params.workdir - ) + + use_futures = self.client + + if use_futures: + blocks = np.array_split(trials, len(self.workers)) + else: + blocks = trials + + futures = [] + for ind, block in enumerate(blocks): + if use_futures: + futures.append( + self.client.submit( + run_block, + block, + self.params.geoh5.h5file, + self.params.workdir, + self.workers[ind], + workers=self.workers[ind], + ) + ) + + else: + run_block( + [block], + self.params.geoh5.h5file, + self.params.workdir, + ) + + if use_futures: + self.client.gather(futures) @staticmethod - def run_worker( - uid: str, data: dict, h5file: Path, options_string: str, workdir: Path | None + def run_trial( + data: dict, h5file: Path, workdir: Path | None, worker: tuple[str] | None = None ): + json_string = SweepOptions.jsonify(data) + uid = SweepOptions.uuid_from_params(json_string) + if workdir is None: workdir = h5file.parent @@ -120,24 +158,45 @@ def run_worker( return shutil.copy(h5file, workerfile) - with Workspace(workerfile, mode="r+") as worker: + with Workspace(workerfile, mode="r+") as workspace: plate_simulation = next( group - for group in worker.groups + for group in workspace.groups if isinstance(group, SimPEGGroup | UIJsonGroup) - and "plate_simulation.driver" in group.options.get("run_command") + and "plate simulation" == group.options.get("inversion_type") ) - plate_simulation.add_file(options_string.encode("utf-8"), name="options") - ifile = InputFile(ui_json=plate_simulation.options, validate=False) - for key, value in data.items(): - ifile.set_data_value(key, value) - options = PlateSimulationOptions.build( - ifile.data, geoh5=worker, out_group=plate_simulation + + opt_dict = workspace.promote(flatten(plate_simulation.options)) + opt_dict["geoh5"] = workspace + opt_dict["out_group"] = None + opt_dict["monitoring_directory"] = None + opt_dict.update(data) + options = PlateSimulationOptions.build(opt_dict) + plate_sim = PlateSimulationDriver(options, workers=[worker]) + plate_sim.simulation_driver.logger = False + # Knock out the log directive + plate_sim.out_group.add_file( + json_string.encode("utf-8"), name="options.txt" ) - options.write_ui_json(workdir / f"{uid}.ui.json") - PlateSimulationDriver.start(workdir / f"{uid}.ui.json") + plate_sim.run() + + del plate_sim + return None + + +def run_block( + trials: list[dict], + h5file: Path, + workdir: Path | None, + worker: tuple[str] | None = None, +): + """ + Loop through a list of trials and run a worker for each unique parameter set. + """ + for kwargs in trials: + PlateSweepDriver.run_trial(kwargs, h5file, workdir, worker=worker) if __name__ == "__main__": - file = Path(sys.argv[1]).resolve() + file = Path(sys.argv[1]) PlateSweepDriver.start(file) diff --git a/simpeg_drivers/plate_simulation/sweep/options.py b/simpeg_drivers/plate_simulation/sweep/options.py index 637d8bf34..6e62fffa4 100644 --- a/simpeg_drivers/plate_simulation/sweep/options.py +++ b/simpeg_drivers/plate_simulation/sweep/options.py @@ -12,17 +12,18 @@ import json import uuid from pathlib import Path -from typing import ClassVar +from typing import Any, ClassVar import numpy as np from geoapps_utils.base import Options from geoh5py.groups import SimPEGGroup, UIJsonGroup from geoh5py.shared import Entity -from geoh5py.shared.utils import stringify +from geoh5py.shared.utils import dict_mapper, stringify from geoh5py.ui_json import InputFile -from pydantic import BaseModel, field_serializer +from pydantic import BaseModel, ConfigDict, ValidationError, field_serializer from simpeg_drivers import assets_path +from simpeg_drivers.plate_simulation.options import PlateSimulationOptions class ParamSweep(BaseModel): @@ -56,11 +57,15 @@ class SweepOptions(Options): by the template application. """ + model_config = ConfigDict(frozen=False, arbitrary_types_allowed=True) + name: ClassVar[str] = "plate_sweep" default_ui_json: ClassVar[Path] = assets_path() / "uijson/plate_sweep.ui.json" title: ClassVar[str] = "Plate Sweep" run_command: ClassVar[str] = "simpeg_drivers.plate_simulation.sweep.driver" out_group: SimPEGGroup | None = None + forward_only: bool = True + inversion_type: str = "plate sweep" template: SimPEGGroup | UIJsonGroup sweeps: list[ParamSweep] workdir: Path | None = None @@ -122,7 +127,14 @@ def trials(self) -> list[dict]: """Returns a list of parameter combinations to run for each trial.""" names = [s.name for s in self.sweeps] iterations = itertools.product(*[np.linspace(*s()) for s in self.sweeps]) - return [dict(zip(names, i, strict=True)) for i in iterations] + options_dict = self.template_options.copy() + + trials = [] + for iterate in iterations: + options_dict.update(dict(zip(names, iterate, strict=True))) + trials.append(options_dict.copy()) + + return trials @staticmethod def all_hashable_options(options: dict) -> dict: @@ -134,30 +146,41 @@ def all_hashable_options(options: dict) -> dict: ifile = InputFile(ui_json=options, validate=False) exceptions = list(Options.model_fields) + ["version", "icon", "documentation"] # TODO: add these to the Options fields with empty string defaults. - out = {k: v for k, v in ifile.data.items() if k not in exceptions} + out = {} for k, v in ifile.data.items(): + if k in exceptions: + continue + if isinstance(v, SimPEGGroup | UIJsonGroup): - out.pop(k) - out.update(SweepOptions.all_hashable_options(v.options)) + opts = v.options + opts["geoh5"] = options["geoh5"] + out.update(SweepOptions.all_hashable_options(opts)) + else: + out[k] = v return out @property def template_options(self): """Return a flat version of the template.options dictionary.""" - return stringify(SweepOptions.all_hashable_options(self.template.options)) - - def jsonify(self, updates: dict): - options = dict(self.template_options, **updates) + options = self.template.options + options["geoh5"] = self.geoh5 + return stringify(SweepOptions.all_hashable_options(options)) - def format_value(v): - if isinstance(v, float): - return f"{v:.4e}" - if isinstance(v, Entity): - return str(v.uid) - return v - - return json.dumps({k: format_value(v) for k, v in options.items()}, indent=4) + @staticmethod + def format_value(value: Any) -> Any: + """Format a value for json serialization.""" + if isinstance(value, float): + return f"{value:.4e}" + if isinstance(value, Entity): + return str(value.uid) + return value + + @classmethod + def jsonify(cls, data: dict) -> dict: + """Format all values in a dictionary for json serialization.""" + formatted = dict_mapper(data, [cls.format_value]) + return json.dumps(formatted, indent=4) @staticmethod def uuid_from_params(param_string: str) -> str: diff --git a/simpeg_drivers/potential_fields/gravity/driver.py b/simpeg_drivers/potential_fields/gravity/driver.py index b7509f9a8..dac7e166e 100644 --- a/simpeg_drivers/potential_fields/gravity/driver.py +++ b/simpeg_drivers/potential_fields/gravity/driver.py @@ -21,10 +21,10 @@ class GravityForwardDriver(InversionDriver): """Gravity forward driver.""" - _options_class = GravityForwardOptions + _params_class = GravityForwardOptions class GravityInversionDriver(InversionDriver): """Gravity inversion driver.""" - _options_class = GravityInversionOptions + _params_class = GravityInversionOptions diff --git a/simpeg_drivers/potential_fields/magnetic_scalar/driver.py b/simpeg_drivers/potential_fields/magnetic_scalar/driver.py index cdeb36285..15ee1bafe 100644 --- a/simpeg_drivers/potential_fields/magnetic_scalar/driver.py +++ b/simpeg_drivers/potential_fields/magnetic_scalar/driver.py @@ -21,10 +21,10 @@ class MagneticForwardDriver(InversionDriver): """Magnetic forward driver.""" - _options_class = MagneticForwardOptions + _params_class = MagneticForwardOptions class MagneticInversionDriver(InversionDriver): """Magnetic inversion driver.""" - _options_class = MagneticInversionOptions + _params_class = MagneticInversionOptions diff --git a/simpeg_drivers/potential_fields/magnetic_vector/driver.py b/simpeg_drivers/potential_fields/magnetic_vector/driver.py index ddeaec6d2..c3fa6764b 100644 --- a/simpeg_drivers/potential_fields/magnetic_vector/driver.py +++ b/simpeg_drivers/potential_fields/magnetic_vector/driver.py @@ -21,13 +21,13 @@ class MVIForwardDriver(InversionDriver): """Magnetic Vector forward driver.""" - _options_class = MVIForwardOptions + _params_class = MVIForwardOptions class MVIInversionDriver(InversionDriver): """Magnetic Vector inversion driver.""" - _options_class = MVIInversionOptions + _params_class = MVIInversionOptions @property def mapping(self) -> list[maps.Projection] | None: diff --git a/simpeg_drivers/utils/utils.py b/simpeg_drivers/utils/utils.py index cda6a194c..79f82f54f 100644 --- a/simpeg_drivers/utils/utils.py +++ b/simpeg_drivers/utils/utils.py @@ -566,6 +566,6 @@ def simpeg_group_to_driver(group: SimPEGGroup, workspace: Workspace) -> Inversio inversion_driver = getattr(module, class_name) ifile.set_data_value("out_group", group) - params = inversion_driver._options_class.build(ifile) # pylint: disable=protected-access + params = inversion_driver._params_class.build(ifile) # pylint: disable=protected-access return inversion_driver(params) diff --git a/tests/plate_simulation/runtest/sweep_test.py b/tests/plate_simulation/runtest/sweep_test.py index d1e983fba..9fa388276 100644 --- a/tests/plate_simulation/runtest/sweep_test.py +++ b/tests/plate_simulation/runtest/sweep_test.py @@ -102,5 +102,5 @@ def test_sweep(tmp_path): PlateSweepDriver.start(tmp_path / "plate_sweep_modified.ui.json") - n = len(list(workdir.glob("*.ui.json"))) - assert n == 7 # 7 trials and one for octree. + n = len(list(workdir.glob("*.geoh5"))) + assert n == 6 diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py index 6fb1a1055..b33dc093f 100644 --- a/tests/run_tests/driver_mvi_test.py +++ b/tests/run_tests/driver_mvi_test.py @@ -45,7 +45,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_mvi_run = {"data_norm": 149.10117434016038, "phi_d": 23.9, "phi_m": 0.0079} +target_mvi_run = {"data_norm": 149.10117434016038, "phi_d": 1.95, "phi_m": 0.147} def test_magnetic_vector_fwr_run( diff --git a/tests/uijson_test.py b/tests/uijson_test.py index 2c836c308..6c9bde99b 100644 --- a/tests/uijson_test.py +++ b/tests/uijson_test.py @@ -403,7 +403,7 @@ def test_legacy_uijson(tmp_path: Path): ifile.data[CHANNEL_NAME[inversion_type] + "_channel"] = channel ifile.data[CHANNEL_NAME[inversion_type] + "_uncertainty"] = channel - driver = InversionDriver.from_input_file(ifile) + driver = InversionDriver.from_input_file(ifile.data) if hasattr(driver.params, "cooling_factor"): assert driver.params.cooling_factor == 4.0 diff --git a/tests/utils/targets.py b/tests/utils/targets.py index 87ef585b0..e605e6e46 100644 --- a/tests/utils/targets.py +++ b/tests/utils/targets.py @@ -51,7 +51,7 @@ def check_target(output: dict, target: dict, tolerance=0.05): :param tolerance: Tolerance between output and target measured as: |a-b|/b """ print( - f"Output: 'data_norm': {np.linalg.norm(output['data'])}, 'phi_d': {output['phi_d'][1]}, 'phi_m': {output['phi_m'][1]}" + f"Output: 'data_norm': {np.linalg.norm(output['data'])}, 'phi_d': {output['phi_d'][-1]}, 'phi_m': {output['phi_m'][-1]}" ) print(f"Target: {target}") @@ -67,10 +67,10 @@ def check_target(output: dict, target: dict, tolerance=0.05): ) np.testing.assert_array_less( - np.abs(output["phi_m"][1] - target["phi_m"]) / target["phi_m"], tolerance + np.abs(output["phi_m"][-1] - target["phi_m"]) / target["phi_m"], tolerance ) np.testing.assert_array_less( - np.abs(output["phi_d"][1] - target["phi_d"]) / target["phi_d"], tolerance + np.abs(output["phi_d"][-1] - target["phi_d"]) / target["phi_d"], tolerance )