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 e0bc7568..5649b4e5 100644 --- a/environments/py-3.10-linux-64-dev.conda.lock.yml +++ b/environments/py-3.10-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 55ee19ff2c90ececdd9e48fb426c55b650d231137ad79c0457c83073863be3dc +# input_hash: 39b78e020f5a607258274e330514206cdc38a6a2245823568ca5f08a0bbbce30 channels: - conda-forge @@ -40,7 +40,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py310h3788b33_0 - - coverage=7.7.0=py310h89163eb_0 + - coverage=7.8.0=py310h89163eb_0 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py310ha75aee5_0 - dask-core=2024.6.2=pyhd8ed1ab_0 @@ -58,7 +58,7 @@ dependencies: - fonttools=4.56.0=py310h89163eb_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py310ha2bacc8_0 - greenlet=3.1.1=py310hf71b8c6_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -69,7 +69,6 @@ dependencies: - httpcore=1.0.7=pyh29332c3_1 - httpx=0.28.1=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - idna=3.10=pyhd8ed1ab_1 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.6.1=pyha770c72_0 @@ -121,7 +120,7 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libffi=3.4.6=h2dba641_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -145,10 +144,10 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py310h89163eb_1 @@ -191,7 +190,7 @@ dependencies: - pillow=10.3.0=py310hebfe307_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -202,14 +201,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py310hff52083_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py310h505e2c1_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py310hc1293b2_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py310h69a6472_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -218,7 +217,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py310h6410a28_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py310h89163eb_2 @@ -229,7 +228,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py310hc1293b2_0 + - rpds-py=0.24.0=py310hc1293b2_0 - scikit-learn=1.4.2=py310h981052a_1 - scipy=1.14.1=py310hfcf56fc_2 - send2trash=1.8.3=pyh0d859eb_1 @@ -256,7 +255,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.39=py310ha75aee5_1 + - sqlalchemy=2.0.40=py310ha75aee5_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hceb3a55_1 @@ -273,10 +272,11 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - unicodedata2=16.0.0=py310ha75aee5_0 - uri-template=1.3.0=pyhd8ed1ab_1 @@ -296,11 +296,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py310ha75aee5_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.10-linux-64.conda.lock.yml b/environments/py-3.10-linux-64.conda.lock.yml index 8fa1de60..ecb06df6 100644 --- a/environments/py-3.10-linux-64.conda.lock.yml +++ b/environments/py-3.10-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 55ee19ff2c90ececdd9e48fb426c55b650d231137ad79c0457c83073863be3dc +# input_hash: 39b78e020f5a607258274e330514206cdc38a6a2245823568ca5f08a0bbbce30 channels: - conda-forge @@ -32,14 +32,13 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py310h89163eb_0 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py310ha2bacc8_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py310h60e0fe6_100 - hdf5=1.14.3=nompi_h2d575fe_109 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - importlib-metadata=8.6.1=pyha770c72_0 - importlib_metadata=8.6.1=hd8ed1ab_0 - jinja2=3.1.6=pyhd8ed1ab_0 @@ -61,7 +60,7 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libffi=3.4.6=h2dba641_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -84,9 +83,9 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py310h89163eb_1 - matplotlib-base=3.8.4=py310hef631a5_2 @@ -109,16 +108,16 @@ dependencies: - psutil=7.0.0=py310ha75aee5_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py310h505e2c1_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py310hc1293b2_0 - pydiso=0.1.2=py310h69a6472_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - python=3.10.16=he725a3c_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py310h6410a28_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py310h89163eb_2 @@ -135,9 +134,10 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py310ha75aee5_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - unicodedata2=16.0.0=py310ha75aee5_0 - urllib3=2.3.0=pyhd8ed1ab_0 - wheel=0.45.1=pyhd8ed1ab_1 @@ -149,11 +149,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py310ha75aee5_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 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 8f26b001..f5bcf1dc 100644 --- a/environments/py-3.10-win-64-dev.conda.lock.yml +++ b/environments/py-3.10-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 3794c887194656c944ad346c0ddbbb865b087a56239234bdbfbdad43ef25d0ad +# input_hash: 8859ebcb5c457d64e7d528778f2c319aa506c5f331cc53fe8f9306b94d154389 channels: - conda-forge @@ -39,7 +39,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py310hc19bc0b_0 - - coverage=7.7.0=py310h38315fa_0 + - coverage=7.8.0=py310h38315fa_0 - cpython=3.10.16=py310hd8ed1ab_1 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py310ha8f682b_0 @@ -58,7 +58,7 @@ dependencies: - fonttools=4.56.0=py310h38315fa_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py310h3e8ed56_0 - greenlet=3.1.1=py310h9e98ed7_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -117,7 +117,7 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libffi=3.4.6=h537db12_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -133,10 +133,10 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py310h38315fa_1 @@ -175,7 +175,7 @@ dependencies: - pillow=10.3.0=py310h3e38d90_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -185,14 +185,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py310h5588dad_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py310hc226416_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py310h7c79e54_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py310h8f92c26_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -201,7 +201,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py310hb64895d_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 - pywin32=307=py310h9e98ed7_3 @@ -213,7 +213,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py310h7c79e54_0 + - rpds-py=0.24.0=py310h7c79e54_0 - scikit-learn=1.4.2=py310hf2a6c47_1 - scipy=1.14.1=py310hbd0dde3_2 - send2trash=1.8.3=pyh5737063_1 @@ -240,7 +240,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.39=py310ha8f682b_1 + - sqlalchemy=2.0.40=py310ha8f682b_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h62715c5_1 @@ -257,18 +257,19 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py310ha8f682b_0 - uri-template=1.3.0=pyhd8ed1ab_1 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wcwidth=0.2.13=pyhd8ed1ab_1 - webcolors=24.11.1=pyhd8ed1ab_0 - webencodings=0.5.1=pyhd8ed1ab_3 @@ -286,11 +287,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py310ha8f682b_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.10-win-64.conda.lock.yml b/environments/py-3.10-win-64.conda.lock.yml index 54189990..fc731969 100644 --- a/environments/py-3.10-win-64.conda.lock.yml +++ b/environments/py-3.10-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 3794c887194656c944ad346c0ddbbb865b087a56239234bdbfbdad43ef25d0ad +# input_hash: 8859ebcb5c457d64e7d528778f2c319aa506c5f331cc53fe8f9306b94d154389 channels: - conda-forge @@ -31,7 +31,7 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py310h38315fa_0 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py310h3e8ed56_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py310h2b0be38_100 @@ -56,7 +56,7 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libffi=3.4.6=h537db12_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -71,9 +71,9 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py310h38315fa_1 - matplotlib-base=3.8.4=py310hadb10a8_2 @@ -93,16 +93,16 @@ dependencies: - psutil=7.0.0=py310ha8f682b_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py310hc226416_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py310h7c79e54_0 - pydiso=0.1.2=py310h8f92c26_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - python=3.10.16=h37870fc_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py310hb64895d_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py310h38315fa_2 @@ -118,15 +118,16 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py310ha8f682b_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py310ha8f682b_0 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wheel=0.45.1=pyhd8ed1ab_1 - win_inet_pton=1.1.0=pyh7428d3b_8 - xorg-libxau=1.0.12=h0e40799_0 @@ -137,11 +138,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py310ha8f682b_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 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 1eb56f11..d110992f 100644 --- a/environments/py-3.11-linux-64-dev.conda.lock.yml +++ b/environments/py-3.11-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2c5dc5c15e7ea2c99dfd86c83fc51e0cbeffb0f99726d5f12a6fc8986c3098f4 +# input_hash: 2e1d3ab7e9ab0cdda16847075926d7c162ac45d89ca75eeac2a247ace263e81b channels: - conda-forge @@ -40,7 +40,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py311hd18a35c_0 - - coverage=7.7.0=py311h2dc5d0c_0 + - coverage=7.8.0=py311h2dc5d0c_0 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py311h9ecbd09_0 - dask-core=2024.6.2=pyhd8ed1ab_0 @@ -59,7 +59,7 @@ dependencies: - fonttools=4.56.0=py311h2dc5d0c_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py311h5b7b71f_0 - greenlet=3.1.1=py311hfdbb021_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -70,7 +70,6 @@ dependencies: - httpcore=1.0.7=pyh29332c3_1 - httpx=0.28.1=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - idna=3.10=pyhd8ed1ab_1 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.6.1=pyha770c72_0 @@ -123,8 +122,8 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libexpat=2.6.4=h5888daf_0 - - libffi=3.4.6=h2dba641_0 + - libexpat=2.7.0=h5888daf_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -148,10 +147,10 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py311h2dc5d0c_1 @@ -194,7 +193,7 @@ dependencies: - pillow=10.3.0=py311h82a398c_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -205,14 +204,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py311h38be061_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py311h9e33e62_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py311h687327b_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py311h19ea254_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -221,7 +220,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py311h4b558b0_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py311h2dc5d0c_2 @@ -232,7 +231,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py311h687327b_0 + - rpds-py=0.24.0=py311h687327b_0 - scikit-learn=1.4.2=py311he08f58d_1 - scipy=1.14.1=py311he9a78e4_2 - send2trash=1.8.3=pyh0d859eb_1 @@ -259,7 +258,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.39=py311h9ecbd09_1 + - sqlalchemy=2.0.40=py311h9ecbd09_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hceb3a55_1 @@ -276,10 +275,11 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - unicodedata2=16.0.0=py311h9ecbd09_0 - uri-template=1.3.0=pyhd8ed1ab_1 @@ -300,11 +300,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py311h9ecbd09_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.11-linux-64.conda.lock.yml b/environments/py-3.11-linux-64.conda.lock.yml index 8d278931..5cbea1ac 100644 --- a/environments/py-3.11-linux-64.conda.lock.yml +++ b/environments/py-3.11-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2c5dc5c15e7ea2c99dfd86c83fc51e0cbeffb0f99726d5f12a6fc8986c3098f4 +# input_hash: 2e1d3ab7e9ab0cdda16847075926d7c162ac45d89ca75eeac2a247ace263e81b channels: - conda-forge @@ -33,14 +33,13 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py311h2dc5d0c_0 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py311h5b7b71f_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py311hb639ac4_100 - hdf5=1.14.3=nompi_h2d575fe_109 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - importlib-metadata=8.6.1=pyha770c72_0 - importlib_metadata=8.6.1=hd8ed1ab_0 - jinja2=3.1.6=pyhd8ed1ab_0 @@ -62,8 +61,8 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libexpat=2.6.4=h5888daf_0 - - libffi=3.4.6=h2dba641_0 + - libexpat=2.7.0=h5888daf_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -86,9 +85,9 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py311h2dc5d0c_1 - matplotlib-base=3.8.4=py311ha4ca890_2 @@ -111,16 +110,16 @@ dependencies: - psutil=7.0.0=py311h9ecbd09_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py311h9e33e62_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py311h687327b_0 - pydiso=0.1.2=py311h19ea254_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - python=3.11.11=h9e4cc4f_2_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py311h4b558b0_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py311h2dc5d0c_2 @@ -137,9 +136,10 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py311h9ecbd09_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - unicodedata2=16.0.0=py311h9ecbd09_0 - urllib3=2.3.0=pyhd8ed1ab_0 - wheel=0.45.1=pyhd8ed1ab_1 @@ -152,11 +152,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py311h9ecbd09_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 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 b63b7975..30826d14 100644 --- a/environments/py-3.11-win-64-dev.conda.lock.yml +++ b/environments/py-3.11-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: b8790c4b6727818f781395459b69606928ce3451528fdbc9762b762cb0ac7579 +# input_hash: 20c681a72bef2c3356cb722ccb86c9d7835664e00ea1b09639d374fa77fd6e18 channels: - conda-forge @@ -39,7 +39,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py311h3257749_0 - - coverage=7.7.0=py311h5082efb_0 + - coverage=7.8.0=py311h5082efb_0 - cpython=3.11.11=py311hd8ed1ab_2 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py311he736701_0 @@ -59,7 +59,7 @@ dependencies: - fonttools=4.56.0=py311h5082efb_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py311h9b10771_0 - greenlet=3.1.1=py311hda3d55a_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -119,8 +119,8 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.6=h537db12_0 + - libexpat=2.7.0=he0c23c2_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -136,10 +136,10 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py311h5082efb_1 @@ -178,7 +178,7 @@ dependencies: - pillow=10.3.0=py311h5592be9_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -188,14 +188,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py311h1ea47a8_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py311h533ab2d_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py311ha250665_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py311h66870c1_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -204,7 +204,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py311h5bfbc98_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 - pywin32=307=py311hda3d55a_3 @@ -216,7 +216,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py311ha250665_0 + - rpds-py=0.24.0=py311ha250665_0 - scikit-learn=1.4.2=py311hdcb8d17_1 - scipy=1.14.1=py311hf16d85f_2 - send2trash=1.8.3=pyh5737063_1 @@ -243,7 +243,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.39=py311he736701_1 + - sqlalchemy=2.0.40=py311he736701_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h62715c5_1 @@ -260,18 +260,19 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py311he736701_0 - uri-template=1.3.0=pyhd8ed1ab_1 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wcwidth=0.2.13=pyhd8ed1ab_1 - webcolors=24.11.1=pyhd8ed1ab_0 - webencodings=0.5.1=pyhd8ed1ab_3 @@ -290,11 +291,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py311he736701_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.11-win-64.conda.lock.yml b/environments/py-3.11-win-64.conda.lock.yml index a4361864..d660be09 100644 --- a/environments/py-3.11-win-64.conda.lock.yml +++ b/environments/py-3.11-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: b8790c4b6727818f781395459b69606928ce3451528fdbc9762b762cb0ac7579 +# input_hash: 20c681a72bef2c3356cb722ccb86c9d7835664e00ea1b09639d374fa77fd6e18 channels: - conda-forge @@ -32,7 +32,7 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py311h5082efb_0 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py311h9b10771_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py311h67016bb_100 @@ -57,8 +57,8 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.6=h537db12_0 + - libexpat=2.7.0=he0c23c2_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -73,9 +73,9 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py311h5082efb_1 - matplotlib-base=3.8.4=py311h9b31f6e_2 @@ -95,16 +95,16 @@ dependencies: - psutil=7.0.0=py311he736701_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py311h533ab2d_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py311ha250665_0 - pydiso=0.1.2=py311h66870c1_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - python=3.11.11=h3f84c4b_2_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py311h5bfbc98_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py311h5082efb_2 @@ -120,15 +120,16 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py311he736701_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py311he736701_0 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wheel=0.45.1=pyhd8ed1ab_1 - win_inet_pton=1.1.0=pyh7428d3b_8 - wrapt=1.17.2=py311he736701_0 @@ -140,11 +141,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py311he736701_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 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 67e17f8e..4c9188b4 100644 --- a/environments/py-3.12-linux-64-dev.conda.lock.yml +++ b/environments/py-3.12-linux-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: d8c2c8f19171b4f8723912239dec0d8935e0bfe7e913a97f50ca646e5fe4f427 +# input_hash: 0bf171d0eb497e761b5f27ed670c27090c55e8a96c1bed5d17f8063e9ff15a25 channels: - conda-forge @@ -40,7 +40,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py312h68727a3_0 - - coverage=7.7.0=py312h178313f_0 + - coverage=7.8.0=py312h178313f_0 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py312h66e93f0_0 - dask-core=2024.6.2=pyhd8ed1ab_0 @@ -59,7 +59,7 @@ dependencies: - fonttools=4.56.0=py312h178313f_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py312hc39e661_0 - greenlet=3.1.1=py312h2ec8cdc_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -70,7 +70,6 @@ dependencies: - httpcore=1.0.7=pyh29332c3_1 - httpx=0.28.1=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - idna=3.10=pyhd8ed1ab_1 - imagesize=1.4.1=pyhd8ed1ab_0 - importlib-metadata=8.6.1=pyha770c72_0 @@ -123,8 +122,8 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libexpat=2.6.4=h5888daf_0 - - libffi=3.4.6=h2dba641_0 + - libexpat=2.7.0=h5888daf_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -148,10 +147,10 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py312h178313f_1 @@ -194,7 +193,7 @@ dependencies: - pillow=10.3.0=py312h287a98d_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -205,14 +204,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py312h7900ff3_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py312h12e396e_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py312h3b7be25_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py312h772f2df_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -221,7 +220,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py312h6ad3ee3_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py312h178313f_2 @@ -232,7 +231,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py312h3b7be25_0 + - rpds-py=0.24.0=py312h3b7be25_0 - scikit-learn=1.4.2=py312h1fcc3ea_1 - scipy=1.14.1=py312h62794b6_2 - send2trash=1.8.3=pyh0d859eb_1 @@ -259,7 +258,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.39=py312h66e93f0_1 + - sqlalchemy=2.0.40=py312h66e93f0_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=hceb3a55_1 @@ -276,10 +275,11 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - unicodedata2=16.0.0=py312h66e93f0_0 - uri-template=1.3.0=pyhd8ed1ab_1 @@ -300,11 +300,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py312h66e93f0_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.12-linux-64.conda.lock.yml b/environments/py-3.12-linux-64.conda.lock.yml index 767fee86..3d864017 100644 --- a/environments/py-3.12-linux-64.conda.lock.yml +++ b/environments/py-3.12-linux-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: d8c2c8f19171b4f8723912239dec0d8935e0bfe7e913a97f50ca646e5fe4f427 +# input_hash: 0bf171d0eb497e761b5f27ed670c27090c55e8a96c1bed5d17f8063e9ff15a25 channels: - conda-forge @@ -33,14 +33,13 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py312h178313f_0 - freetype=2.13.3=h48d6fc4_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py312hc39e661_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py312hedeef09_100 - hdf5=1.14.3=nompi_h2d575fe_109 - hpack=4.1.0=pyhd8ed1ab_0 - hyperframe=6.1.0=pyhd8ed1ab_0 - - icu=75.1=he02047a_0 - importlib-metadata=8.6.1=pyha770c72_0 - importlib_metadata=8.6.1=hd8ed1ab_0 - jinja2=3.1.6=pyhd8ed1ab_0 @@ -62,8 +61,8 @@ dependencies: - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libexpat=2.6.4=h5888daf_0 - - libffi=3.4.6=h2dba641_0 + - libexpat=2.7.0=h5888daf_0 + - libffi=3.4.6=h2dba641_1 - libgcc=14.2.0=h767d61c_2 - libgcc-ng=14.2.0=h69a702a_2 - libgfortran=14.2.0=h69a702a_2 @@ -86,9 +85,9 @@ dependencies: - libwebp-base=1.5.0=h851e524_0 - libxcb=1.17.0=h8a09558_0 - libxcrypt=4.4.36=hd590300_1 - - libxml2=2.13.6=h8d12d68_0 + - libxml2=2.13.7=h0d44e9d_0 - libzlib=1.3.1=hb9d3cd8_2 - - llvm-openmp=19.1.7=h024ca30_0 + - llvm-openmp=20.1.1=h024ca30_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py312h178313f_1 - matplotlib-base=3.8.4=py312h20ab3a6_2 @@ -111,16 +110,16 @@ dependencies: - psutil=7.0.0=py312h66e93f0_0 - pthread-stubs=0.4=hb9d3cd8_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py312h12e396e_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py312h3b7be25_0 - pydiso=0.1.2=py312h772f2df_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyha55dd90_7 - python=3.12.9=h9e4cc4f_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py312h6ad3ee3_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py312h178313f_2 @@ -137,9 +136,10 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py312h66e93f0_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - unicodedata2=16.0.0=py312h66e93f0_0 - urllib3=2.3.0=pyhd8ed1ab_0 - wheel=0.45.1=pyhd8ed1ab_1 @@ -152,11 +152,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py312h66e93f0_1 - - zstd=1.5.7=hb8e6e7a_1 + - zstd=1.5.7=hb8e6e7a_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 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 9a7ba5d5..3907a261 100644 --- a/environments/py-3.12-win-64-dev.conda.lock.yml +++ b/environments/py-3.12-win-64-dev.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 63adf464b3a60d0115084a0d2e7b151a9c72e7747eefbefc4932cead4a74bf6a +# input_hash: 419d7fcb75cab535a7a318257756a88ab5d992664861dc1f97a98d4e03424a1b channels: - conda-forge @@ -39,7 +39,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py312hd5eb7cc_0 - - coverage=7.7.0=py312h31fea79_0 + - coverage=7.8.0=py312h31fea79_0 - cpython=3.12.9=py312hd8ed1ab_1 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py312h4389bb4_0 @@ -59,7 +59,7 @@ dependencies: - fonttools=4.56.0=py312h31fea79_0 - fqdn=1.5.1=pyhd8ed1ab_1 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py312hbaa7e33_0 - greenlet=3.1.1=py312h275cf98_1 - h11=0.14.0=pyhd8ed1ab_1 @@ -119,8 +119,8 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.6=h537db12_0 + - libexpat=2.7.0=he0c23c2_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -136,10 +136,10 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markdown-it-py=2.2.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py312h31fea79_1 @@ -178,7 +178,7 @@ dependencies: - pillow=10.3.0=py312h381445a_1 - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - - platformdirs=4.3.6=pyhd8ed1ab_1 + - platformdirs=4.3.7=pyh29332c3_0 - pluggy=1.5.0=pyhd8ed1ab_1 - prometheus_client=0.21.1=pyhd8ed1ab_0 - prompt-toolkit=3.0.50=pyha770c72_0 @@ -188,14 +188,14 @@ dependencies: - pybtex=0.24.0=pyhd8ed1ab_3 - pybtex-docutils=1.0.3=py312h2e8e312_2 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py312h2615798_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py312hfe1d9c4_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - pydiso=0.1.2=py312h01acb21_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.5=pyh29332c3_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - pytest=8.3.5=pyhd8ed1ab_0 - pytest-cov=6.0.0=pyhd8ed1ab_1 @@ -204,7 +204,7 @@ dependencies: - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-mumps=0.0.3=py312h8095395_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 - pytz=2024.1=pyhd8ed1ab_0 - pywin32=307=py312h275cf98_3 @@ -216,7 +216,7 @@ dependencies: - requests=2.32.3=pyhd8ed1ab_1 - rfc3339-validator=0.1.4=pyhd8ed1ab_1 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rpds-py=0.23.1=py312hfe1d9c4_0 + - rpds-py=0.24.0=py312hfe1d9c4_0 - scikit-learn=1.4.2=py312h816cc57_1 - scipy=1.14.1=py312h337df96_2 - send2trash=1.8.3=pyh5737063_1 @@ -243,7 +243,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.39=py312h4389bb4_1 + - sqlalchemy=2.0.40=py312h4389bb4_0 - stack_data=0.6.3=pyhd8ed1ab_1 - tabulate=0.9.0=pyhd8ed1ab_2 - tbb=2021.13.0=h62715c5_1 @@ -260,18 +260,19 @@ dependencies: - tqdm=4.67.1=pyhd8ed1ab_1 - traitlets=5.14.3=pyhd8ed1ab_1 - types-python-dateutil=2.9.0.20241206=pyhd8ed1ab_0 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 - typing_utils=0.1.0=pyhd8ed1ab_1 - - tzdata=2025a=h78e105d_0 + - tzdata=2025b=h78e105d_0 - uc-micro-py=1.0.3=pyhd8ed1ab_1 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py312h4389bb4_0 - uri-template=1.3.0=pyhd8ed1ab_1 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wcwidth=0.2.13=pyhd8ed1ab_1 - webcolors=24.11.1=pyhd8ed1ab_0 - webencodings=0.5.1=pyhd8ed1ab_3 @@ -290,11 +291,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py312h4389bb4_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/environments/py-3.12-win-64.conda.lock.yml b/environments/py-3.12-win-64.conda.lock.yml index 73b31112..3c83d2fb 100644 --- a/environments/py-3.12-win-64.conda.lock.yml +++ b/environments/py-3.12-win-64.conda.lock.yml @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: win-64 -# input_hash: 63adf464b3a60d0115084a0d2e7b151a9c72e7747eefbefc4932cead4a74bf6a +# input_hash: 419d7fcb75cab535a7a318257756a88ab5d992664861dc1f97a98d4e03424a1b channels: - conda-forge @@ -32,7 +32,7 @@ dependencies: - fasteners=0.19=pyhd8ed1ab_1 - fonttools=4.56.0=py312h31fea79_0 - freetype=2.13.3=h0b5ce68_0 - - fsspec=2025.3.0=pyhd8ed1ab_0 + - fsspec=2025.3.2=pyhd8ed1ab_0 - geoana=0.7.2=py312hbaa7e33_0 - h2=4.2.0=pyhd8ed1ab_0 - h5py=3.13.0=nompi_py312ha036244_100 @@ -57,8 +57,8 @@ dependencies: - libcurl=8.12.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.6=h537db12_0 + - libexpat=2.7.0=he0c23c2_0 + - libffi=3.4.6=h537db12_1 - libgcc=14.2.0=h1383e82_2 - libgomp=14.2.0=h1383e82_2 - libhwloc=2.11.2=default_ha69328c_1001 @@ -73,9 +73,9 @@ dependencies: - libwebp-base=1.5.0=h3b0e114_0 - libwinpthread=12.0.0.r4.gg4f2fc60ca=h57928b3_9 - libxcb=1.17.0=h0e4246c_0 - - libxml2=2.13.6=he286e8c_0 + - libxml2=2.13.7=he286e8c_0 - libzlib=1.3.1=h2466b09_2 - - llvm-openmp=19.1.7=h30eaf37_0 + - llvm-openmp=20.1.1=h30eaf37_1 - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py312h31fea79_1 - matplotlib-base=3.8.4=py312hfee7060_2 @@ -95,16 +95,16 @@ dependencies: - psutil=7.0.0=py312h4389bb4_0 - pthread-stubs=0.4=h0e40799_1002 - pycparser=2.22=pyh29332c3_1 - - pydantic=2.10.6=pyh3cfb1c2_0 - - pydantic-core=2.27.2=py312h2615798_0 + - pydantic=2.11.1=pyh3cfb1c2_0 + - pydantic-core=2.33.0=py312hfe1d9c4_0 - pydiso=0.1.2=py312h01acb21_0 - pymatsolver=0.3.1=pyh48887ae_201 - - pyparsing=3.2.1=pyhd8ed1ab_0 + - pyparsing=3.2.3=pyhd8ed1ab_1 - pysocks=1.7.1=pyh09c184e_7 - python=3.12.9=h3f84c4b_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-mumps=0.0.3=py312h8095395_0 - - python-tzdata=2025.1=pyhd8ed1ab_0 + - python-tzdata=2025.2=pyhd8ed1ab_0 - python_abi=3.12=5_cp312 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.2=py312h31fea79_2 @@ -120,15 +120,16 @@ dependencies: - toolz=1.0.0=pyhd8ed1ab_1 - tornado=6.4.2=py312h4389bb4_0 - tqdm=4.67.1=pyhd8ed1ab_1 - - typing-extensions=4.12.2=hd8ed1ab_1 - - typing_extensions=4.12.2=pyha770c72_1 - - tzdata=2025a=h78e105d_0 + - typing-extensions=4.13.0=h9fa5a19_1 + - typing-inspection=0.4.0=pyhd8ed1ab_0 + - typing_extensions=4.13.0=pyh29332c3_1 + - tzdata=2025b=h78e105d_0 - ucrt=10.0.22621.0=h57928b3_1 - unicodedata2=16.0.0=py312h4389bb4_0 - urllib3=2.3.0=pyhd8ed1ab_0 - - vc=14.3=hbf610ac_24 - - vc14_runtime=14.42.34438=hfd919c2_24 - - vs2015_runtime=14.42.34438=h7142326_24 + - vc=14.3=h2b53caa_26 + - vc14_runtime=14.42.34438=hfd919c2_26 + - vs2015_runtime=14.42.34438=h7142326_26 - wheel=0.45.1=pyhd8ed1ab_1 - win_inet_pton=1.1.0=pyh7428d3b_8 - wrapt=1.17.2=py312h4389bb4_0 @@ -140,11 +141,11 @@ dependencies: - zict=3.0.0=pyhd8ed1ab_1 - zipp=3.21.0=pyhd8ed1ab_1 - zstandard=0.23.0=py312h4389bb4_1 - - zstd=1.5.7=hbeecb71_1 + - zstd=1.5.7=hbeecb71_2 - pip: - geoapps-utils @ git+https://github.com/MiraGeoscience/geoapps-utils.git@02f6fd3aa7530dc81fe2e32e7e2c874b429daaf7 - - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa - - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + - geoh5py @ git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 + - mira-simpeg @ git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 - octree-creation-app @ git+https://github.com/MiraGeoscience/octree-creation-app.git@c1797da5ca947c6f48555ea7f7680c0c63c1c456 - param-sweeps @ git+https://github.com/MiraGeoscience/param-sweeps.git@6bf4ac8a7fc6c111216e8042a075f9e92ce38d41 diff --git a/py-3.10.conda-lock.yml b/py-3.10.conda-lock.yml index 5e6ef53f..a7d6c8c8 100644 --- a/py-3.10.conda-lock.yml +++ b/py-3.10.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 3794c887194656c944ad346c0ddbbb865b087a56239234bdbfbdad43ef25d0ad - linux-64: 55ee19ff2c90ececdd9e48fb426c55b650d231137ad79c0457c83073863be3dc + win-64: 8859ebcb5c457d64e7d528778f2c319aa506c5f331cc53fe8f9306b94d154389 + linux-64: 39b78e020f5a607258274e330514206cdc38a6a2245823568ca5f08a0bbbce30 channels: - url: conda-forge used_env_vars: [] @@ -949,7 +949,7 @@ package: category: main optional: false - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: linux-64 dependencies: @@ -958,14 +958,14 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.0-py310h89163eb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda hash: - md5: 6782f8b6cfbc6a8a03b7efd8f8516010 - sha256: 9ef77cdce82d59bd044ebde506d104c8e387c115b14e42a76d45ae3cc5a75565 + md5: 9f7865c17117d16f804b687b498e35fa + sha256: ac410dbd3b1e28d40b88a27f801210b853ebd388f3cf20f85c0178e97f788013 category: dev optional: true - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: win-64 dependencies: @@ -975,10 +975,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.7.0-py310h38315fa_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py310h38315fa_0.conda hash: - md5: 2e2a90e1f695d76f4f64e821b770606e - sha256: 0b9b75800ebc6d2bbc9cb264aa1352323029e57059e7da834213ed83df99ea73 + md5: 30a825dae940c63c55bca8df4f806f3e + sha256: f16e7370e327f20ccba8a6edfb0441ec425c11c10744d6eaa817d05076b458a5 category: dev optional: true - name: cpython @@ -1504,27 +1504,27 @@ package: category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: geoana @@ -1840,20 +1840,6 @@ package: sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 category: main optional: false -- name: icu - version: '75.1' - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - hash: - md5: 8b189310083baabfb622af68fd9d3ae3 - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - category: main - optional: false - name: idna version: '3.10' manager: conda @@ -3409,10 +3395,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda hash: - md5: e3eb7806380bc8bcecba6d749ad5f026 - sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: ede4673863426c0883c0063d853bbd85 + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab category: main optional: false - name: libffi @@ -3423,10 +3409,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda hash: - md5: 31d5107f75b2f204937728417e2e39e5 - sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 category: main optional: false - name: libgcc @@ -3964,24 +3950,23 @@ package: category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - icu: '>=75.1,<76.0a0' libgcc: '>=13' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.6.4,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda hash: - md5: 328382c0e0ca648e5c189d5ec336c604 - sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 3ac6daa5c1210293a6deaec0c345b230 + sha256: d19b28caa42ac9c5ac2aa73f5f44947f78ab416467dc40926484f3afbcc31ed1 category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: win-64 dependencies: @@ -3990,10 +3975,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.6-he286e8c_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-he286e8c_0.conda hash: - md5: c66d5bece33033a9c028bbdf1e627ec5 - sha256: 2919f4e9fffefbf3ff6ecd8ebe81584d573c069b2b82eaeed797b1f56ac8d97b + md5: aec4cf455e4c6cc2644abb348de7ff20 + sha256: 99182f93f1e7b678534df5f07ff94d7bf13a51386050f8fa9411fec764d0f39f category: main optional: false - name: libzlib @@ -4050,29 +4035,29 @@ package: category: dev optional: true - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda hash: - md5: 9915f85a72472011550550623cce2d53 - sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: cfae5693f2ee2117e75e5e533451e04c + sha256: 4275d3b10e5c722a9321769e3aee91b9f879e0c527661d90cc38fa6320a9e765 category: main optional: false - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-19.1.7-h30eaf37_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.1-h30eaf37_1.conda hash: - md5: f6076c844b630037f4a40fae12dc6e41 - sha256: 0dca936d558f986c9100e731483f6c3dbab6a0d9648ec4d8fa6c6f97e18e0325 + md5: b46bba57bbefe505ea795880563ae6a3 + sha256: 6c090b43e11e2e02ee06c81e206fe6d664b35b3a5cd724033acde328f30f4581 category: main optional: false - name: locket @@ -5297,27 +5282,27 @@ package: category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: linux-64 dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: pluggy @@ -5577,68 +5562,70 @@ package: category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: linux-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: win-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - python: '>=3.10,<3.11.0a0' + python: '' python_abi: 3.10.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py310h505e2c1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.0-py310hc1293b2_0.conda hash: - md5: 3f804346d970a0343c46afc21cf5f16e - sha256: 6c58cdbb007f2dc8b0a8d96eacaba45bedf6ddfe9ed4558c40f899cb3438f3cb + md5: ad0dbb22c4499b0fbb6778963bd4f035 + sha256: 98d6b74c13f90afb59f17df777e88c71a6adcd4c03958c2e6a264bce71ebe0a6 category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: win-64 dependencies: - python: '>=3.10,<3.11.0a0' + python: '' python_abi: 3.10.* typing-extensions: '>=4.6.0,!=4.7.0' ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.27.2-py310hc226416_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.33.0-py310h7c79e54_0.conda hash: - md5: 3df8c74e13bd1b7ec1292b5c6b744509 - sha256: 9c5e8eb73caa4c8f1945ac22af392495221f1809055114c4cc23609a8622a1eb + md5: 7b9cf966da0d277d7c555f3a3070e8e8 + sha256: 9e4e90a62490f05874e6a14dbda9ccea25aa3dc09eb8fce73c6f74a38f39c561 category: main optional: false - name: pydata-sphinx-theme @@ -5817,27 +5804,27 @@ package: category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pysocks @@ -6096,27 +6083,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python_abi @@ -6423,7 +6410,7 @@ package: category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: linux-64 dependencies: @@ -6431,14 +6418,14 @@ package: libgcc: '>=13' python: '' python_abi: 3.10.* - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py310hc1293b2_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.24.0-py310hc1293b2_0.conda hash: - md5: 55afda712d4c48108d993ded1bd4de9b - sha256: 775f9fe47c18f8c6c4cb706c7837cc04cdc18e6a748fd8964e132d8329975eea + md5: 2170ed457a6427f37c90104f6a63437d + sha256: b0c896af1d8ce85d7948624664d87bd9286223ea5a19884d6f295d37d5cd4e0f category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: win-64 dependencies: @@ -6447,10 +6434,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py310h7c79e54_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.24.0-py310h7c79e54_0.conda hash: - md5: c449ac14d17f9139895fb1bc98294627 - sha256: b5d0e848c69dfcefaee5193298ce21aec0b76282eb8333bb20c2c5acb0e09fc8 + md5: bd5b837169847d1f3e626ab20a9299f0 + sha256: e058920df1d6609a3522662a44f6c3a465ffb163dda4e8b6449435160c911cef category: dev optional: true - name: scikit-learn @@ -7199,7 +7186,7 @@ package: category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: linux-64 dependencies: @@ -7209,14 +7196,14 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.39-py310ha75aee5_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.40-py310ha75aee5_0.conda hash: - md5: ec8f30932c8dcd1923873941c3f43322 - sha256: 267e69d64d7f1967b6c9e02ecfeb0503d5caf5b6297ba3609a7d576de06adf3e + md5: bc2a512664843a017e39f70beb69fc60 + sha256: ecce430c1f71cbe96fe07cc2b50d3ae895d8ec5ccf7a3083987719d1957961a9 category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: win-64 dependencies: @@ -7227,10 +7214,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.39-py310ha8f682b_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.40-py310ha8f682b_0.conda hash: - md5: 7ef7d2d6a1e6a36dcd00e6ca06d97105 - sha256: e1b2a6dd6f900be3f73b35089382bf2e4eaa835700eff0e697c3c2eb1c55843f + md5: a0919291fec53d2694d88fb0f21009a8 + sha256: c319587abaec3cdf2bb7b76aacb115527f39582c3ce8bb49d0d59c67507e32ef category: dev optional: true - name: stack_data @@ -7650,51 +7637,77 @@ package: category: dev optional: true - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: linux-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd category: main optional: false - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: win-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd category: main optional: false -- name: typing_extensions - version: 4.12.2 +- name: typing-inspection + version: 0.4.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d + category: main + optional: false +- name: typing-inspection + version: 0.4.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d category: main optional: false - name: typing_extensions - version: 4.12.2 + version: 4.13.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda + hash: + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f + category: main + optional: false +- name: typing_extensions + version: 4.13.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f category: main optional: false - name: typing_utils @@ -7722,25 +7735,25 @@ package: category: dev optional: true - name: tzdata - version: 2025a + version: 2025b manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: tzdata - version: 2025a + version: 2025b manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: uc-micro-py @@ -7870,11 +7883,11 @@ package: manager: conda platform: win-64 dependencies: - vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hbf610ac_24.conda + vc14_runtime: '>=14.42.34433' + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda hash: - md5: 9098c5cfb418fc0b0204bf2efc1e9afa - sha256: 8ef83b62f9f0b885882d0dd41cbe47c2308f7ac0537fd508a5bbe6d3953a176e + md5: d3f0381e38093bde620a8d85f266ae55 + sha256: 7a685b5c37e9713fa314a0d26b8b1d7a2e6de5ab758698199b5d5b6dba2e3ce1 category: main optional: false - name: vc14_runtime @@ -7883,10 +7896,10 @@ package: platform: win-64 dependencies: ucrt: '>=10.0.20348.0' - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda hash: - md5: 5fceb7d965d59955888d9a9732719aa8 - sha256: fb36814355ac12dcb4a55b75b5ef0d49ec219ad9df30d7955f2ace88bd6919c4 + md5: 91651a36d31aa20c7ba36299fb7068f4 + sha256: 30dcb71bb166e351aadbdc18f1718757c32cdaa0e1e5d9368469ee44f6bf4709 category: main optional: false - name: vs2015_runtime @@ -7895,10 +7908,10 @@ package: platform: win-64 dependencies: vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_26.conda hash: - md5: 1dd2e838eb13190ae1f1e2760c036fdc - sha256: a7104d3d605d191c8ee8d85d4175df3630d61830583494a5d1e62cd9f1260420 + md5: 3357e4383dbce31eed332008ede242ab + sha256: 432f2937206f1ad4a77e39f84fabc1ce7d2472b669836fb72bd2bfd19a2defc9 category: main optional: false - name: wcwidth @@ -8328,10 +8341,10 @@ package: libgcc: '>=13' libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda hash: - md5: 02e4e2fa41a6528afba2e54cbc4280ff - sha256: 532d3623961e34c53aba98db2ad0a33b7a52ff90d6960e505fb2d2efc06bb7da + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb category: main optional: false - name: zstd @@ -8343,10 +8356,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda hash: - md5: bf190adcc22f146d8ec66da215c9d78b - sha256: a59b096b95f20910158c927797e9144ed9c7970f1b4aca58e6d6c8db9f653006 + md5: 21f56217d6125fb30c3c3f10c786d751 + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 category: main optional: false - name: geoapps-utils @@ -8392,12 +8405,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: geoh5py @@ -8409,16 +8422,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: linux-64 dependencies: @@ -8430,16 +8443,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: win-64 dependencies: @@ -8451,12 +8464,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: octree-creation-app diff --git a/py-3.11.conda-lock.yml b/py-3.11.conda-lock.yml index ce8f35f4..33aa7b74 100644 --- a/py-3.11.conda-lock.yml +++ b/py-3.11.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: b8790c4b6727818f781395459b69606928ce3451528fdbc9762b762cb0ac7579 - linux-64: 2c5dc5c15e7ea2c99dfd86c83fc51e0cbeffb0f99726d5f12a6fc8986c3098f4 + win-64: 20c681a72bef2c3356cb722ccb86c9d7835664e00ea1b09639d374fa77fd6e18 + linux-64: 2e1d3ab7e9ab0cdda16847075926d7c162ac45d89ca75eeac2a247ace263e81b channels: - url: conda-forge used_env_vars: [] @@ -947,7 +947,7 @@ package: category: main optional: false - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: linux-64 dependencies: @@ -956,14 +956,14 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.0-py311h2dc5d0c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda hash: - md5: 1923a8a1fd2b87318804f118273c1ab2 - sha256: 350b0c1eb54d38aa9631255f11a5b83ec924ffd20776d9a2e903f5c58f3d5904 + md5: 37bc439a94beeb29914baa5b4987ebd5 + sha256: 50018d9c2d805eab29be0ad2e65a4d6b9f620e5e6b196923b1f3b397efee9b10 category: dev optional: true - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: win-64 dependencies: @@ -973,10 +973,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.7.0-py311h5082efb_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py311h5082efb_0.conda hash: - md5: a2a2feae26268f73c8ab06818b99b56c - sha256: 05b35904afac394868753abe745bdefe6c595f7fc5bc304bc8559c3faab6f05b + md5: 3237b9093308b18ee36d455ff098017b + sha256: 2a3a8f6304374d19e6fd1cbf73e756debf0a76e787f1a15bd8b11d74f9ef6bd2 category: dev optional: true - name: cpython @@ -1528,27 +1528,27 @@ package: category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: geoana @@ -1864,20 +1864,6 @@ package: sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 category: main optional: false -- name: icu - version: '75.1' - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - hash: - md5: 8b189310083baabfb622af68fd9d3ae3 - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - category: main - optional: false - name: idna version: '3.10' manager: conda @@ -3455,30 +3441,30 @@ package: category: main optional: false - name: libexpat - version: 2.6.4 + version: 2.7.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda hash: - md5: db833e03127376d461e1e13e76f09b6c - sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db0bfbe7dd197b68ad5f30333bae6ce0 + sha256: 33ab03438aee65d6aa667cf7d90c91e5e7d734c19a67aa4c7040742c0a13d505 category: main optional: false - name: libexpat - version: 2.6.4 + version: 2.7.0 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda hash: - md5: eb383771c680aa792feb529eaf9df82f - sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: b6f5352fdb525662f4169a0431d2dd7a + sha256: 1a227c094a4e06bd54e8c2f3ec40c17ff99dcf3037d812294f842210aa66dbeb category: main optional: false - name: libffi @@ -3488,10 +3474,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda hash: - md5: e3eb7806380bc8bcecba6d749ad5f026 - sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: ede4673863426c0883c0063d853bbd85 + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab category: main optional: false - name: libffi @@ -3502,10 +3488,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda hash: - md5: 31d5107f75b2f204937728417e2e39e5 - sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 category: main optional: false - name: libgcc @@ -4043,24 +4029,23 @@ package: category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - icu: '>=75.1,<76.0a0' libgcc: '>=13' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.6.4,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda hash: - md5: 328382c0e0ca648e5c189d5ec336c604 - sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 3ac6daa5c1210293a6deaec0c345b230 + sha256: d19b28caa42ac9c5ac2aa73f5f44947f78ab416467dc40926484f3afbcc31ed1 category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: win-64 dependencies: @@ -4069,10 +4054,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.6-he286e8c_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-he286e8c_0.conda hash: - md5: c66d5bece33033a9c028bbdf1e627ec5 - sha256: 2919f4e9fffefbf3ff6ecd8ebe81584d573c069b2b82eaeed797b1f56ac8d97b + md5: aec4cf455e4c6cc2644abb348de7ff20 + sha256: 99182f93f1e7b678534df5f07ff94d7bf13a51386050f8fa9411fec764d0f39f category: main optional: false - name: libzlib @@ -4129,29 +4114,29 @@ package: category: dev optional: true - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda hash: - md5: 9915f85a72472011550550623cce2d53 - sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: cfae5693f2ee2117e75e5e533451e04c + sha256: 4275d3b10e5c722a9321769e3aee91b9f879e0c527661d90cc38fa6320a9e765 category: main optional: false - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-19.1.7-h30eaf37_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.1-h30eaf37_1.conda hash: - md5: f6076c844b630037f4a40fae12dc6e41 - sha256: 0dca936d558f986c9100e731483f6c3dbab6a0d9648ec4d8fa6c6f97e18e0325 + md5: b46bba57bbefe505ea795880563ae6a3 + sha256: 6c090b43e11e2e02ee06c81e206fe6d664b35b3a5cd724033acde328f30f4581 category: main optional: false - name: locket @@ -5378,27 +5363,27 @@ package: category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: pluggy @@ -5658,68 +5643,70 @@ package: category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: linux-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: win-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - python: '>=3.11,<3.12.0a0' + python: '' python_abi: 3.11.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py311h9e33e62_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.0-py311h687327b_0.conda hash: - md5: 675cb6079b6b3b4ef4f20399fedf6666 - sha256: 8ead97151b2f349cd327456fe4a6fcf7c51a3ab6c06f48f4330f86de0d848bd1 + md5: 590aeab0e5121d8973377cfc4cedf259 + sha256: 9ae39c0c401859e275495be27375aea92e0873d8ac45d9bc1fb245208a7f1522 category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: win-64 dependencies: - python: '>=3.11,<3.12.0a0' + python: '' python_abi: 3.11.* typing-extensions: '>=4.6.0,!=4.7.0' ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.27.2-py311h533ab2d_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.33.0-py311ha250665_0.conda hash: - md5: e9420c025ea324d06255fc34b7e3928e - sha256: d1f641a6f2c9fe6413674dd4e1f7dd5bbd06d26532d6e19f83c56a747d54b667 + md5: 9434db88b7c241fa39aecb8cfb172074 + sha256: 04ffcd9218de9ace25e4ffc694137a3f38258d5f59410033a453911534b717ac category: main optional: false - name: pydata-sphinx-theme @@ -5898,27 +5885,27 @@ package: category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pysocks @@ -6179,27 +6166,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python_abi @@ -6506,7 +6493,7 @@ package: category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: linux-64 dependencies: @@ -6514,14 +6501,14 @@ package: libgcc: '>=13' python: '' python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py311h687327b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.24.0-py311h687327b_0.conda hash: - md5: d35b446856b4d6644a469fd01838baff - sha256: 754d8eff118a6a01f4eb0e8bc6be7be8872f54826d6ff0402eac08d308b01099 + md5: e2fc6063859ff5fd62f983c31e4bf521 + sha256: a45aec5ad66dc54884bc782ac590cd26e00f738bfcf4f55b4d63c8ca22915a30 category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: win-64 dependencies: @@ -6530,10 +6517,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py311ha250665_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.24.0-py311ha250665_0.conda hash: - md5: 8fd1344d7369c84eb7cf4c316ab86518 - sha256: 72ca8e7d54f79e6a99827576e53a277796ab8f4d912eba33e3b949cd757a77f7 + md5: 1f1ad2bacdff1d370c13be99709130da + sha256: 83bcac24bf63b83d3b9560c448f8e353cc427b39ede10d6b8e2bf829866d654f category: dev optional: true - name: scikit-learn @@ -7282,7 +7269,7 @@ package: category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: linux-64 dependencies: @@ -7292,14 +7279,14 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.39-py311h9ecbd09_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.40-py311h9ecbd09_0.conda hash: - md5: 6b5eb445386814e5cfb622030862e3bf - sha256: ff0fa5333e20a80fcba67eac2118ecbad29a5dc4bb3867110e5702c804800b82 + md5: 2e0d3c5a4afb139b23a68a23a2980851 + sha256: 61fd16afea0e24b99b05ee40593edcc966dad436a4ab35b62b4665a3f6bd32f6 category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: win-64 dependencies: @@ -7310,10 +7297,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.39-py311he736701_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.40-py311he736701_0.conda hash: - md5: 48e9ba64e13402865f307b79a408e14f - sha256: 224bdac0c4a332d4dc16f194737d277063f5cec44f855015ae02edd2c71c9da4 + md5: 6dd7c29db6d076ce90c7b62d7f4fb5af + sha256: 6a58a12572600a723a108f3c4974edfdbe63a01dbed186a30c8044a3f8193741 category: dev optional: true - name: stack_data @@ -7733,51 +7720,77 @@ package: category: dev optional: true - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: linux-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd category: main optional: false - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: win-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda + hash: + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd + category: main + optional: false +- name: typing-inspection + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d + category: main + optional: false +- name: typing-inspection + version: 0.4.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d category: main optional: false - name: typing_extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f category: main optional: false - name: typing_extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f category: main optional: false - name: typing_utils @@ -7805,25 +7818,25 @@ package: category: dev optional: true - name: tzdata - version: 2025a + version: 2025b manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: tzdata - version: 2025a + version: 2025b manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: uc-micro-py @@ -7953,11 +7966,11 @@ package: manager: conda platform: win-64 dependencies: - vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hbf610ac_24.conda + vc14_runtime: '>=14.42.34433' + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda hash: - md5: 9098c5cfb418fc0b0204bf2efc1e9afa - sha256: 8ef83b62f9f0b885882d0dd41cbe47c2308f7ac0537fd508a5bbe6d3953a176e + md5: d3f0381e38093bde620a8d85f266ae55 + sha256: 7a685b5c37e9713fa314a0d26b8b1d7a2e6de5ab758698199b5d5b6dba2e3ce1 category: main optional: false - name: vc14_runtime @@ -7966,10 +7979,10 @@ package: platform: win-64 dependencies: ucrt: '>=10.0.20348.0' - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda hash: - md5: 5fceb7d965d59955888d9a9732719aa8 - sha256: fb36814355ac12dcb4a55b75b5ef0d49ec219ad9df30d7955f2ace88bd6919c4 + md5: 91651a36d31aa20c7ba36299fb7068f4 + sha256: 30dcb71bb166e351aadbdc18f1718757c32cdaa0e1e5d9368469ee44f6bf4709 category: main optional: false - name: vs2015_runtime @@ -7978,10 +7991,10 @@ package: platform: win-64 dependencies: vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_26.conda hash: - md5: 1dd2e838eb13190ae1f1e2760c036fdc - sha256: a7104d3d605d191c8ee8d85d4175df3630d61830583494a5d1e62cd9f1260420 + md5: 3357e4383dbce31eed332008ede242ab + sha256: 432f2937206f1ad4a77e39f84fabc1ce7d2472b669836fb72bd2bfd19a2defc9 category: main optional: false - name: wcwidth @@ -8442,10 +8455,10 @@ package: libgcc: '>=13' libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda hash: - md5: 02e4e2fa41a6528afba2e54cbc4280ff - sha256: 532d3623961e34c53aba98db2ad0a33b7a52ff90d6960e505fb2d2efc06bb7da + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb category: main optional: false - name: zstd @@ -8457,10 +8470,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda hash: - md5: bf190adcc22f146d8ec66da215c9d78b - sha256: a59b096b95f20910158c927797e9144ed9c7970f1b4aca58e6d6c8db9f653006 + md5: 21f56217d6125fb30c3c3f10c786d751 + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 category: main optional: false - name: geoapps-utils @@ -8506,12 +8519,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: geoh5py @@ -8523,16 +8536,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: linux-64 dependencies: @@ -8544,16 +8557,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: win-64 dependencies: @@ -8565,12 +8578,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: octree-creation-app diff --git a/py-3.12.conda-lock.yml b/py-3.12.conda-lock.yml index 569cdb30..50c83b71 100644 --- a/py-3.12.conda-lock.yml +++ b/py-3.12.conda-lock.yml @@ -15,8 +15,8 @@ version: 1 metadata: content_hash: - win-64: 63adf464b3a60d0115084a0d2e7b151a9c72e7747eefbefc4932cead4a74bf6a - linux-64: d8c2c8f19171b4f8723912239dec0d8935e0bfe7e913a97f50ca646e5fe4f427 + win-64: 419d7fcb75cab535a7a318257756a88ab5d992664861dc1f97a98d4e03424a1b + linux-64: 0bf171d0eb497e761b5f27ed670c27090c55e8a96c1bed5d17f8063e9ff15a25 channels: - url: conda-forge used_env_vars: [] @@ -947,7 +947,7 @@ package: category: main optional: false - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: linux-64 dependencies: @@ -956,14 +956,14 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.0-py312h178313f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda hash: - md5: ec7b7abbdcfbac99336fadde6b75213c - sha256: 00b0153cc58e638713d8297000761d4b8ab2b75d4c7096192d802e5f362de716 + md5: d0fca021e354cc96455021852a1fad6d + sha256: 029278c43bd2a6ac36bfd93fde69a0cde6a4ee94c0af72d0d51236fbb1fc3720 category: dev optional: true - name: coverage - version: 7.7.0 + version: 7.8.0 manager: conda platform: win-64 dependencies: @@ -973,10 +973,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.7.0-py312h31fea79_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.8.0-py312h31fea79_0.conda hash: - md5: f2a8dc053d6523645333097a20710f97 - sha256: fba20ba73ff712a93c36d806492edb9f71a8453e3224301db03d6e0748dbf118 + md5: a52895ace8c17bc01ceba443d52325c6 + sha256: 7815726b2b45065af4570deca428f48799ce1f49de7d8b5e4f6b7999f6a4dc2f category: dev optional: true - name: cpython @@ -1528,27 +1528,27 @@ package: category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: fsspec - version: 2025.3.0 + version: 2025.3.2 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda hash: - md5: 5ecafd654e33d1f2ecac5ec97057593b - sha256: 9cbba3b36d1e91e4806ba15141936872d44d20a4d1e3bb74f4aea0ebeb01b205 + md5: 9c40692c3d24c7aaf335f673ac09d308 + sha256: 2040d4640708bd6ab9ed6cb9901267441798c44974bc63c9b6c1cb4c1891d825 category: main optional: false - name: geoana @@ -1864,20 +1864,6 @@ package: sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 category: main optional: false -- name: icu - version: '75.1' - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - hash: - md5: 8b189310083baabfb622af68fd9d3ae3 - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - category: main - optional: false - name: idna version: '3.10' manager: conda @@ -3455,30 +3441,30 @@ package: category: main optional: false - name: libexpat - version: 2.6.4 + version: 2.7.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda hash: - md5: db833e03127376d461e1e13e76f09b6c - sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db0bfbe7dd197b68ad5f30333bae6ce0 + sha256: 33ab03438aee65d6aa667cf7d90c91e5e7d734c19a67aa4c7040742c0a13d505 category: main optional: false - name: libexpat - version: 2.6.4 + version: 2.7.0 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.0-he0c23c2_0.conda hash: - md5: eb383771c680aa792feb529eaf9df82f - sha256: 0c0447bf20d1013d5603499de93a16b6faa92d7ead870d96305c0f065b6a5a12 + md5: b6f5352fdb525662f4169a0431d2dd7a + sha256: 1a227c094a4e06bd54e8c2f3ec40c17ff99dcf3037d812294f842210aa66dbeb category: main optional: false - name: libffi @@ -3488,10 +3474,10 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda hash: - md5: e3eb7806380bc8bcecba6d749ad5f026 - sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: ede4673863426c0883c0063d853bbd85 + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab category: main optional: false - name: libffi @@ -3502,10 +3488,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda hash: - md5: 31d5107f75b2f204937728417e2e39e5 - sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be + md5: 85d8fa5e55ed8f93f874b3b23ed54ec6 + sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5 category: main optional: false - name: libgcc @@ -4043,24 +4029,23 @@ package: category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - icu: '>=75.1,<76.0a0' libgcc: '>=13' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.6.4,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda hash: - md5: 328382c0e0ca648e5c189d5ec336c604 - sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 3ac6daa5c1210293a6deaec0c345b230 + sha256: d19b28caa42ac9c5ac2aa73f5f44947f78ab416467dc40926484f3afbcc31ed1 category: main optional: false - name: libxml2 - version: 2.13.6 + version: 2.13.7 manager: conda platform: win-64 dependencies: @@ -4069,10 +4054,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.6-he286e8c_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.13.7-he286e8c_0.conda hash: - md5: c66d5bece33033a9c028bbdf1e627ec5 - sha256: 2919f4e9fffefbf3ff6ecd8ebe81584d573c069b2b82eaeed797b1f56ac8d97b + md5: aec4cf455e4c6cc2644abb348de7ff20 + sha256: 99182f93f1e7b678534df5f07ff94d7bf13a51386050f8fa9411fec764d0f39f category: main optional: false - name: libzlib @@ -4129,29 +4114,29 @@ package: category: dev optional: true - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-20.1.1-h024ca30_1.conda hash: - md5: 9915f85a72472011550550623cce2d53 - sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: cfae5693f2ee2117e75e5e533451e04c + sha256: 4275d3b10e5c722a9321769e3aee91b9f879e0c527661d90cc38fa6320a9e765 category: main optional: false - name: llvm-openmp - version: 19.1.7 + version: 20.1.1 manager: conda platform: win-64 dependencies: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-19.1.7-h30eaf37_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-20.1.1-h30eaf37_1.conda hash: - md5: f6076c844b630037f4a40fae12dc6e41 - sha256: 0dca936d558f986c9100e731483f6c3dbab6a0d9648ec4d8fa6c6f97e18e0325 + md5: b46bba57bbefe505ea795880563ae6a3 + sha256: 6c090b43e11e2e02ee06c81e206fe6d664b35b3a5cd724033acde328f30f4581 category: main optional: false - name: locket @@ -5378,27 +5363,27 @@ package: category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: platformdirs - version: 4.3.6 + version: 4.3.7 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda hash: - md5: 577852c7e53901ddccc7e6a9959ddebe - sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: e57da6fe54bb3a5556cf36d199ff07d8 + sha256: ae7d3e58224d53d6b59e1f5ac5809803bb1972f0ac4fb10cd9b8c87d4122d3e0 category: dev optional: true - name: pluggy @@ -5658,68 +5643,70 @@ package: category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: linux-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic - version: 2.10.6 + version: 2.11.1 manager: conda platform: win-64 dependencies: annotated-types: '>=0.6.0' - pydantic-core: 2.27.2 + pydantic-core: 2.33.0 python: '>=3.9' typing-extensions: '>=4.6.1' + typing-inspection: '>=0.4.0' typing_extensions: '>=4.12.2' - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.10.6-pyh3cfb1c2_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.1-pyh3cfb1c2_0.conda hash: - md5: c69f87041cf24dfc8cb6bf64ca7133c7 - sha256: 9a78801a28959edeb945e8270a4e666577b52fac0cf4e35f88cf122f73d83e75 + md5: f5e18ca78d6adb76558d557fc9b55486 + sha256: d134343e228f0cc40cadb3153af68edb1554aaf1b1e6f03d88bbf6a4a548a88b category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - python: '>=3.12,<3.13.0a0' + python: '' python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.27.2-py312h12e396e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.0-py312h3b7be25_0.conda hash: - md5: bae01b2563030c085f5158c518b84e86 - sha256: 81602a4592ad2ac1a1cb57372fd25214e63b1c477d5818b0c21cde0f1f85c001 + md5: 9510f083be07448f555769fbfd5058d8 + sha256: 0a0fea7b396a68f8aab48eec0cfdd97455a8e91875bcaa4dca187518b3a554df category: main optional: false - name: pydantic-core - version: 2.27.2 + version: 2.33.0 manager: conda platform: win-64 dependencies: - python: '>=3.12,<3.13.0a0' + python: '' python_abi: 3.12.* typing-extensions: '>=4.6.0,!=4.7.0' ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.27.2-py312h2615798_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.33.0-py312hfe1d9c4_0.conda hash: - md5: 8ed894b023eef681ce86e4d0fb06ee60 - sha256: ec6b268b239c9cb62ca2b77b28d011cf356b84386d667970f9d31fd38467e0aa + md5: 7853e720dec119785fb739a121480cd4 + sha256: 70599c5cc098bdbc938efc961b62a7f49e93bc51e6ce860f6ed92432e8fc63a8 category: main optional: false - name: pydata-sphinx-theme @@ -5898,27 +5885,27 @@ package: category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pyparsing - version: 3.2.1 + version: 3.2.3 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda hash: - md5: 285e237b8f351e85e7574a2c7bfa6d46 - sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 513d3c262ee49b54a8fec85c5bc99764 + sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 category: main optional: false - name: pysocks @@ -6179,27 +6166,27 @@ package: category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python-tzdata - version: '2025.1' + version: '2025.2' manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda hash: - md5: 392c91c42edd569a7ec99ed8648f597a - sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 88476ae6ebd24f39261e0854ac244f33 + sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 category: main optional: false - name: python_abi @@ -6506,7 +6493,7 @@ package: category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: linux-64 dependencies: @@ -6514,14 +6501,14 @@ package: libgcc: '>=13' python: '' python_abi: 3.12.* - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.23.1-py312h3b7be25_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.24.0-py312h3b7be25_0.conda hash: - md5: b9cb8c7bcbe3df8e640b244ed096b8e2 - sha256: 0378f8010ef166cea7fcb0d502e3c85fd96442e445aab7e66f8702deb9ab1e26 + md5: 5f5c19cbbd3526fad9c8ca0cca3e7346 + sha256: 10dad6a9d40e7c1856cb1f5f941ea06500610e13ee6ec4961fba59fccbaa0dc9 category: dev optional: true - name: rpds-py - version: 0.23.1 + version: 0.24.0 manager: conda platform: win-64 dependencies: @@ -6530,10 +6517,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.23.1-py312hfe1d9c4_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.24.0-py312hfe1d9c4_0.conda hash: - md5: f0410386ac90b39f953a0313ad111a31 - sha256: 10bbbaea04c8f7f6ab784360be4c9cc9f439017114dd97ee6b99657d57ac6577 + md5: c5fc315df43a26e2c1c0a6040cae12f6 + sha256: bf12ad2fefb2b5c5496d794a5fa0f7a2672a6dcfa9d70b181b6bbd968ade6454 category: dev optional: true - name: scikit-learn @@ -7282,7 +7269,7 @@ package: category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: linux-64 dependencies: @@ -7292,14 +7279,14 @@ package: python: '>=3.12,<3.13.0a0' python_abi: 3.12.* typing-extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.39-py312h66e93f0_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.40-py312h66e93f0_0.conda hash: - md5: 09253e9e1a2c2003b3c42ac11143e05a - sha256: 1ba23a1da71a5883c8fce94662e5468ceee6d784a899fb12315dfcfdd3adb7ba + md5: 933eec95cc2ba4419cb3fb434d8c8056 + sha256: fe3ca23540ef6fe92592af1aefd1673c824a2155f7204e9457747984d3f79b2a category: dev optional: true - name: sqlalchemy - version: 2.0.39 + version: 2.0.40 manager: conda platform: win-64 dependencies: @@ -7310,10 +7297,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.39-py312h4389bb4_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.40-py312h4389bb4_0.conda hash: - md5: caddc19808c2f26047a23c9ef0d8ca30 - sha256: 9a118904819142a635db24908a80b44406e2269f768fc1c67b14f6a1348fdada + md5: 031ea623d7022e8d71d7e6c1f5e0ad2f + sha256: 67a9d5022eb6afa4cfd2cea043b2f522dd4a299ed4e9691d2b0158cafeaeabf6 category: dev optional: true - name: stack_data @@ -7733,51 +7720,77 @@ package: category: dev optional: true - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: linux-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd category: main optional: false - name: typing-extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: win-64 dependencies: - typing_extensions: 4.12.2 - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + typing_extensions: ==4.13.0 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda + hash: + md5: 3fbcc45b908040dca030d3f78ed9a212 + sha256: 4dc1002493f05bf4106e09f0de6df57060c9aab97ad709392ab544ceb62faadd + category: main + optional: false +- name: typing-inspection + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda hash: - md5: b6a408c64b78ec7b779a3e5c7a902433 - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d + category: main + optional: false +- name: typing-inspection + version: 0.4.0 + manager: conda + platform: win-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.12.0' + url: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: c5c76894b6b7bacc888ba25753bc8677 + sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d category: main optional: false - name: typing_extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: linux-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f category: main optional: false - name: typing_extensions - version: 4.12.2 + version: 4.13.0 manager: conda platform: win-64 dependencies: python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda hash: - md5: d17f13df8b65464ca316cbc000a3cb64 - sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: 4c446320a86cc5d48e3b80e332d6ebd7 + sha256: 18eb76e8f19336ecc9733c02901b30503cdc4c1d8de94f7da7419f89b3ff4c2f category: main optional: false - name: typing_utils @@ -7805,25 +7818,25 @@ package: category: dev optional: true - name: tzdata - version: 2025a + version: 2025b manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: tzdata - version: 2025a + version: 2025b manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: - md5: dbcace4706afdfb7eb891f7b37d07c04 - sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: 4222072737ccff51314b5ece9c7d6f5a + sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 category: main optional: false - name: uc-micro-py @@ -7953,11 +7966,11 @@ package: manager: conda platform: win-64 dependencies: - vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hbf610ac_24.conda + vc14_runtime: '>=14.42.34433' + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h2b53caa_26.conda hash: - md5: 9098c5cfb418fc0b0204bf2efc1e9afa - sha256: 8ef83b62f9f0b885882d0dd41cbe47c2308f7ac0537fd508a5bbe6d3953a176e + md5: d3f0381e38093bde620a8d85f266ae55 + sha256: 7a685b5c37e9713fa314a0d26b8b1d7a2e6de5ab758698199b5d5b6dba2e3ce1 category: main optional: false - name: vc14_runtime @@ -7966,10 +7979,10 @@ package: platform: win-64 dependencies: ucrt: '>=10.0.20348.0' - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.42.34438-hfd919c2_26.conda hash: - md5: 5fceb7d965d59955888d9a9732719aa8 - sha256: fb36814355ac12dcb4a55b75b5ef0d49ec219ad9df30d7955f2ace88bd6919c4 + md5: 91651a36d31aa20c7ba36299fb7068f4 + sha256: 30dcb71bb166e351aadbdc18f1718757c32cdaa0e1e5d9368469ee44f6bf4709 category: main optional: false - name: vs2015_runtime @@ -7978,10 +7991,10 @@ package: platform: win-64 dependencies: vc14_runtime: '>=14.42.34438' - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_24.conda + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.42.34438-h7142326_26.conda hash: - md5: 1dd2e838eb13190ae1f1e2760c036fdc - sha256: a7104d3d605d191c8ee8d85d4175df3630d61830583494a5d1e62cd9f1260420 + md5: 3357e4383dbce31eed332008ede242ab + sha256: 432f2937206f1ad4a77e39f84fabc1ce7d2472b669836fb72bd2bfd19a2defc9 category: main optional: false - name: wcwidth @@ -8442,10 +8455,10 @@ package: libgcc: '>=13' libstdcxx: '>=13' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda hash: - md5: 02e4e2fa41a6528afba2e54cbc4280ff - sha256: 532d3623961e34c53aba98db2ad0a33b7a52ff90d6960e505fb2d2efc06bb7da + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb category: main optional: false - name: zstd @@ -8457,10 +8470,10 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda hash: - md5: bf190adcc22f146d8ec66da215c9d78b - sha256: a59b096b95f20910158c927797e9144ed9c7970f1b4aca58e6d6c8db9f653006 + md5: 21f56217d6125fb30c3c3f10c786d751 + sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04 category: main optional: false - name: geoapps-utils @@ -8506,12 +8519,12 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: geoh5py @@ -8523,16 +8536,16 @@ package: numpy: '>=1.26.0,<1.27.0' pillow: '>=10.3.0,<10.4.0' pydantic: '>=2.5.2,<3.0.0' - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 hash: - sha256: 513d08201f3401e61bc07514a318ad581e8e83aa + sha256: 8bbd69efa7fbac07af1b878024c948e126b98c41 source: type: url - url: git+https://github.com/MiraGeoscience/geoh5py.git@513d08201f3401e61bc07514a318ad581e8e83aa + url: git+https://github.com/MiraGeoscience/geoh5py.git@8bbd69efa7fbac07af1b878024c948e126b98c41 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: linux-64 dependencies: @@ -8544,16 +8557,16 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: mira-simpeg - version: 0.21.2.3a2.dev10+g04f222146 + version: 0.21.2.3a2.dev16+g49f567984 manager: pip platform: win-64 dependencies: @@ -8565,12 +8578,12 @@ package: numpy: '>=1.22' pymatsolver: '>=0.3' scipy: '>=1.8' - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 hash: - sha256: 04f222146c082ba646b851f510056b4b2bce1b85 + sha256: 49f5679848e1d5a5703b749512b6005589947718 source: type: url - url: git+https://github.com/MiraGeoscience/simpeg.git@04f222146c082ba646b851f510056b4b2bce1b85 + url: git+https://github.com/MiraGeoscience/simpeg.git@49f5679848e1d5a5703b749512b6005589947718 category: main optional: false - name: octree-creation-app diff --git a/pyproject.toml b/pyproject.toml index 2562db22..92a29012 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ include = [ [tool.poetry.dependencies] python = "^3.10" -dask = {version = "2024.6.*", extras = ["distributed"]} # also in simpeg[dask] +dask-core = {version = "2024.6.*"} # also in simpeg[dask] discretize = "0.11.*" # also in simpeg, octree-creation-app distributed = "2024.6.*" # because conda-lock doesn't take dask extras into account numpy = "~1.26.0" # also in geoh5py, simpeg diff --git a/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json b/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json new file mode 100644 index 00000000..8570a596 --- /dev/null +++ b/simpeg_drivers-assets/uijson/tdem1d_forward.ui.json @@ -0,0 +1,210 @@ +{ + "version": "0.3.0-alpha.1", + "title": "Time-domain EM-1D (TEM-1D) Forward", + "icon": "surveyairborneem", + "documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/stable/intro.html", + "conda_environment": "simpeg_drivers", + "run_command": "simpeg_drivers.driver", + "geoh5": "", + "monitoring_directory": "", + "workspace_geoh5": "", + "inversion_type": "tdem 1d", + "physical property": "conductivity", + "forward_only": true, + "data_object": { + "main": true, + "group": "Survey", + "label": "Object", + "meshType": [ + "{19730589-fd28-4649-9de0-ad47249d9aba}", + "{deebe11a-b57b-4a03-99d6-8f27b25eb2a8}" + ], + "value": "" + }, + "data_units": { + "choiceList": [ + "dB/dt (T/s)", + "B (T)", + "H (A/m)" + ], + "group": "Survey", + "main": true, + "label": "Data type", + "tooltip": "Set the units of the data.", + "value": "dB/dt (T/s)" + }, + "z_channel_bool": { + "group": "Survey", + "main": true, + "label": "Z component", + "value": true + }, + "v_cell_size": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "enabled": true, + "label": "Vertical core cell size (m)", + "value": 25.0 + }, + "depth_core": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "enabled": true, + "label": "Depth of core (m)", + "value": 500.0 + }, + "vertical_padding": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "dependencyType": "disabled", + "label": "Vertical padding (m)", + "value": 1000.0 + }, + "expansion_factor": { + "main": true, + "group": "1D Mesh", + "label": "Expansion factor", + "value": 1.1 + }, + "mesh": { + "group": "Mesh and models", + "main": true, + "label": "Mesh", + "meshType": "{4ea87376-3ece-438b-bf12-3479733ded46}", + "value": "", + "optional": true, + "enabled": false, + "tooltip": "Select a mesh for the inversion." + }, + "model_type": { + "choiceList": [ + "Conductivity (S/m)", + "Resistivity (Ohm-m)" + ], + "main": true, + "group": "Mesh and models", + "label": "Model units", + "tooltip": "Select the units of the model.", + "value": "Conductivity (S/m)" + }, + "starting_model": { + "association": [ + "Cell", + "Vertex" + ], + "dataType": "Float", + "group": "Mesh and models", + "main": true, + "isValue": true, + "parent": "mesh", + "label": "Value(s)", + "property": "", + "value": 0.001 + }, + "topography_object": { + "main": true, + "group": "Topography", + "label": "Topography", + "meshType": [ + "{202c5db1-a56d-4004-9cad-baafd8899406}", + "{6a057fdc-b355-11e3-95be-fd84a7ffcb88}", + "{f26feba3-aded-494b-b9e9-b2bbcbe298e1}", + "{48f5054a-1c5c-4ca4-9048-80f36dc60a06}", + "{b020a277-90e2-4cd7-84d6-612ee3f25051}" + ], + "value": "", + "optional": false, + "enabled": true, + "tooltip": "Select a topography object to define the active cells for inversion." + }, + "topography": { + "association": [ + "Vertex", + "Cell" + ], + "dataType": "Float", + "group": "Topography", + "main": true, + "optional": true, + "enabled": false, + "label": "Elevation channel", + "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object.", + "parent": "topography_object", + "dependency": "topography_object", + "dependencyType": "enabled", + "value": "", + "verbose": 2 + }, + "active_model": { + "association": "Cell", + "dataType": [ + "Referenced", + "Boolean", + "Integer" + ], + "group": "Topography", + "main": true, + "enabled": false, + "visible": false, + "dependency": "topography_object", + "dependencyType": "disabled", + "label": "Active model", + "tooltip": "Provide the active cell boolean model directly if topography not set.", + "parent": "mesh", + "value": "" + }, + "save_sensitivities": false, + "n_cpu": { + "min": 1, + "group": "Compute", + "optional": true, + "enabled": false, + "label": "Number of CPUs", + "value": 1, + "visible": false + }, + "solver_type": { + "choiceList": [ + "Pardiso", + "Mumps" + ], + "group": "Compute", + "label": "Direct solver", + "tooltip": "Direct solver to use for the forward calculations", + "value": "Pardiso" + }, + "tile_spatial": { + "group": "Compute", + "label": "Number of tiles", + "parent": "data_object", + "isValue": true, + "property": "", + "value": 1, + "min": 1, + "max": 1000, + "verbose": 2, + "visible": false, + "tooltip": "Splits the objective function into spatial tiles for distributed computation using the Dask library." + }, + "out_group": { + "label": "SimPEG group", + "value": "", + "groupType": "{55ed3daf-c192-4d4b-a439-60fa987fe2b8}", + "group": "Drag-and-drop options", + "visible": true, + "optional": true, + "enabled": false, + "tooltip": "Optionally set the SimPEG group to which results will be saved." + }, + "generate_sweep": { + "label": "Generate sweep file", + "group": "Python run preferences", + "main": true, + "value": false, + "tooltip": "Generates a file for sweeping parameters instead of running the application." + }, + "distributed_workers": "" +} diff --git a/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json new file mode 100644 index 00000000..9a01c302 --- /dev/null +++ b/simpeg_drivers-assets/uijson/tdem1d_inversion.ui.json @@ -0,0 +1,554 @@ +{ + "version": "0.3.0-alpha.1", + "title": "Time-domain EM-1D (TEM-1D) Inversion", + "icon": "surveyairborneem", + "documentation": "https://mirageoscience-simpeg-drivers.readthedocs-hosted.com/en/stable/intro.html", + "conda_environment": "simpeg_drivers", + "run_command": "simpeg_drivers.driver", + "geoh5": "", + "monitoring_directory": "", + "workspace_geoh5": "", + "inversion_type": "tdem 1d", + "physical_property": "conductivity", + "forward_only": false, + "data_object": { + "main": true, + "group": "Data", + "label": "Object", + "meshType": [ + "{19730589-fd28-4649-9de0-ad47249d9aba}", + "{deebe11a-b57b-4a03-99d6-8f27b25eb2a8}" + ], + "value": "" + }, + "data_units": { + "choiceList": [ + "dB/dt (T/s)", + "B (T)", + "H (A/m)" + ], + "group": "Data", + "main": true, + "label": "Data type", + "tooltip": "Set the units of the data.", + "value": "dB/dt (T/s)" + }, + "z_channel": { + "association": [ + "Cell", + "Vertex" + ], + "dataType": "Float", + "group": "Data", + "dataGroupType": "Multi-element", + "main": true, + "label": "z-component", + "parent": "data_object", + "optional": true, + "enabled": true, + "value": "" + }, + "z_uncertainty": { + "association": [ + "Cell", + "Vertex" + ], + "dataType": "Float", + "group": "Data", + "dataGroupType": "Multi-element", + "main": true, + "label": "Uncertainty", + "parent": "data_object", + "dependency": "z_channel", + "dependencyType": "enabled", + "value": "" + }, + "v_cell_size": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "enabled": true, + "label": "Vertical core cell size (m)", + "value": 25.0 + }, + "depth_core": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "enabled": true, + "label": "Depth of core (m)", + "value": 500.0 + }, + "vertical_padding": { + "min": 0.0, + "group": "1D Mesh", + "main": true, + "dependencyType": "disabled", + "label": "Vertical padding (m)", + "value": 1000.0 + }, + "expansion_factor": { + "main": true, + "group": "1D Mesh", + "label": "Expansion factor", + "value": 1.1 + }, + "mesh": { + "group": "Mesh and models", + "main": true, + "label": "Mesh", + "meshType": "{4ea87376-3ece-438b-bf12-3479733ded46}", + "value": "", + "optional": true, + "enabled": false, + "tooltip": "Select a mesh for the inversion." + }, + "model_type": { + "choiceList": [ + "Conductivity (S/m)", + "Resistivity (Ohm-m)" + ], + "main": true, + "group": "Mesh and models", + "label": "Model units", + "tooltip": "Select the units of the model.", + "value": "Conductivity (S/m)" + }, + "starting_model": { + "association": [ + "Cell", + "Vertex" + ], + "dataType": "Float", + "group": "Mesh and models", + "main": true, + "isValue": true, + "parent": "mesh", + "label": "Initial", + "property": "", + "value": 0.001 + }, + "reference_model": { + "association": [ + "Cell", + "Vertex" + ], + "dataType": "Float", + "main": true, + "group": "Mesh and models", + "isValue": true, + "parent": "mesh", + "label": "Reference", + "property": "", + "optional": true, + "enabled": false, + "value": 0.001 + }, + "lower_bound": { + "association": "Cell", + "main": true, + "dataType": "Float", + "group": "Mesh and models", + "isValue": true, + "parent": "mesh", + "label": "Lower bound", + "property": "", + "optional": true, + "value": 1e-08, + "enabled": false + }, + "upper_bound": { + "association": "Cell", + "main": true, + "dataType": "Float", + "group": "Mesh and models", + "isValue": true, + "parent": "mesh", + "label": "Upper bound", + "property": "", + "optional": true, + "value": 100.0, + "enabled": false + }, + "topography_object": { + "main": true, + "group": "Topography", + "label": "Topography", + "meshType": [ + "{202c5db1-a56d-4004-9cad-baafd8899406}", + "{6a057fdc-b355-11e3-95be-fd84a7ffcb88}", + "{f26feba3-aded-494b-b9e9-b2bbcbe298e1}", + "{48f5054a-1c5c-4ca4-9048-80f36dc60a06}", + "{b020a277-90e2-4cd7-84d6-612ee3f25051}" + ], + "value": "", + "optional": false, + "enabled": true, + "tooltip": "Select a topography object to define the active cells for inversion." + }, + "topography": { + "association": [ + "Vertex", + "Cell" + ], + "dataType": "Float", + "group": "Topography", + "main": true, + "optional": true, + "enabled": false, + "label": "Elevation channel", + "tooltip": "Set elevation from channel. If not set the topography will be set from the geometry of the selected 'topography' object.", + "parent": "topography_object", + "dependency": "topography_object", + "dependencyType": "enabled", + "value": "", + "verbose": 2 + }, + "active_model": { + "association": "Cell", + "dataType": [ + "Referenced", + "Boolean", + "Integer" + ], + "group": "Topography", + "main": true, + "enabled": false, + "visible": false, + "dependency": "topography_object", + "dependencyType": "disabled", + "label": "Active model", + "tooltip": "Provide the active cell boolean model directly if topography not set.", + "parent": "mesh", + "value": "" + }, + "alpha_s": { + "min": 0.0, + "group": "Regularization", + "label": "Reference weight", + "value": 1.0, + "tooltip": "Constant ratio compared to other weights. Larger values result in models that remain close to the reference model", + "dependency": "reference_model", + "dependencyType": "enabled", + "isValue": true, + "parent": "mesh", + "association": "Cell", + "dataType": "Float", + "property": "", + "enabled": true + }, + "length_scale_x": { + "min": 0.0, + "group": "Regularization", + "label": "Lateral-smoothness weight", + "tooltip": "Larger values relative to other smoothness weights will result in x biased smoothness", + "value": 1.0, + "isValue": true, + "parent": "mesh", + "association": "Cell", + "dataType": "Float", + "property": "", + "enabled": true + }, + "length_scale_z": { + "min": 0.0, + "group": "Regularization", + "label": "Vertical-smoothness weight", + "tooltip": "Larger values relative to other smoothness weights will result in z biased smoothess", + "value": 1.0, + "isValue": true, + "parent": "mesh", + "association": "Cell", + "dataType": "Float", + "property": "", + "enabled": true + }, + "s_norm": { + "association": "Cell", + "dataType": "Float", + "group": "Sparse/blocky model", + "label": "Smallness norm", + "isValue": true, + "parent": "mesh", + "property": "", + "value": 0.0, + "min": 0.0, + "max": 2.0, + "precision": 2, + "lineEdit": true, + "enabled": true, + "dependency": "reference_model", + "dependencyType": "enabled", + "tooltip": "Lp-norm used in the smallness term of the objective function." + }, + "x_norm": { + "association": "Cell", + "dataType": "Float", + "group": "Sparse/blocky model", + "label": "Lateral-smoothness norm", + "isValue": true, + "parent": "mesh", + "property": "", + "value": 2.0, + "min": 0.0, + "max": 2.0, + "precision": 2, + "lineEdit": false, + "enabled": true, + "tooltip": "Lp-norm used in the x-smoothness term of the objective function." + }, + "z_norm": { + "association": "Cell", + "dataType": "Float", + "group": "Sparse/blocky model", + "label": "Vertical-smoothness norm", + "isValue": true, + "parent": "mesh", + "property": "", + "value": 2.0, + "min": 0.0, + "max": 2.0, + "precision": 2, + "lineEdit": false, + "enabled": true, + "tooltip": "Lp-norm used in the z-smoothness term of the objective function." + }, + "gradient_type": { + "choiceList": [ + "total", + "components" + ], + "group": "Sparse/blocky model", + "label": "Gradient type", + "value": "total", + "verbose": 3, + "tooltip": "Choose whether the IRLS weights for regularization terms are updated using total or partial gradients." + }, + "max_irls_iterations": { + "min": 0, + "group": "Sparse/blocky model", + "label": "Maximum IRLS iterations", + "tooltip": "Incomplete Re-weighted Least Squares iterations for non-L2 problems", + "value": 25, + "enabled": true, + "verbose": 2 + }, + "starting_chi_factor": { + "group": "Sparse/blocky model", + "label": "IRLS start chi factor", + "enabled": true, + "value": 1.0, + "tooltip": "This chi factor will be used to determine the misfit threshold after which IRLS iterations begin.", + "verbose": 3 + }, + "beta_tol": { + "group": "Update IRLS directive", + "label": "Beta tolerance", + "value": 0.5, + "min": 0.0001, + "verbose": 3, + "visible": false + }, + "percentile": { + "group": "Update IRLS directive", + "label": "Percentile", + "value": 95, + "max": 100, + "min": 5, + "verbose": 3, + "visible": false + }, + "chi_factor": { + "min": 0.1, + "max": 20.0, + "precision": 1, + "lineEdit": false, + "group": "Cooling schedule/target", + "label": "Chi factor", + "value": 1.0, + "enabled": true, + "tooltip": "The global target data misfit value." + }, + "auto_scale_misfits": { + "group": "Cooling schedule/target", + "label": "Auto-scale misfits", + "value": false, + "verbose": 3, + "visible": false, + "tooltip": "Whether to auto-scale misfits functions (tile, frequency, joint methods) based on chi-factor." + }, + "initial_beta_ratio": { + "min": 0.0, + "precision": 2, + "group": "Cooling schedule/target", + "optional": true, + "enabled": true, + "label": "Initial beta ratio", + "value": 100.0, + "verbose": 2, + "tooltip": "Estimate the trade-off parameter by scaling the ratio between the largest derivatives in the objective function gradients." + }, + "initial_beta": { + "min": 0.0, + "group": "Cooling schedule/target", + "optional": true, + "enabled": false, + "dependency": "initial_beta_ratio", + "dependencyType": "disabled", + "label": "Initial beta", + "value": 1.0, + "verbose": 2, + "tooltip": "Trade-off parameter between data misfit and regularization." + }, + "cooling_factor": { + "group": "Cooling schedule/target", + "label": "Beta cooling factor", + "tooltip": "Each beta cooling step will be calculated by dividing the current beta by this factor.", + "value": 2.0, + "min": 1.1, + "max": 100, + "precision": 1, + "lineEdit": false, + "verbose": 2 + }, + "cooling_rate": { + "group": "Optimization", + "label": "Iterations per beta", + "value": 2, + "min": 1, + "LineEdit": false, + "max": 10, + "precision": 1, + "verbose": 2, + "enabled": true, + "tooltip": "Set the number of iterations per beta value. Use higher values for more non-linear optimization problems." + }, + "epsilon_cooling_factor": 1.2, + "max_global_iterations": { + "min": 1, + "lineEdit": false, + "group": "Optimization", + "label": "Maximum iterations", + "tooltip": "Number of L2 and IRLS iterations combined", + "value": 50, + "enabled": true + }, + "max_line_search_iterations": { + "group": "Optimization", + "label": "Maximum number of line searches", + "value": 20, + "min": 1, + "enabled": true, + "verbose": 3, + "tooltip": "Perform an Armijo backtracking linesearch for the provided number of iterations." + }, + "max_cg_iterations": { + "min": 0, + "group": "Optimization", + "label": "Maximum CG iterations", + "value": 30, + "enabled": true, + "verbose": 2 + }, + "tol_cg": { + "min": 0, + "group": "Optimization", + "label": "Conjugate gradient tolerance", + "value": 0.0001, + "enabled": true, + "verbose": 3 + }, + "f_min_change": { + "group": "Optimization", + "label": "Minimum change in objective function", + "value": 0.01, + "min": 1e-06, + "verbose": 3, + "enabled": true, + "tooltip": "Minimum decrease in regularization beyond which the IRLS procedure is deemed to have completed." + }, + "sens_wts_threshold": { + "group": "Update sensitivity weights directive", + "tooltip": "Update sensitivity weight threshold", + "label": "Threshold (%)", + "value": 100.0, + "max": 100.0, + "min": 0.0, + "precision": 3, + "enabled": true, + "verbose": 2 + }, + "every_iteration_bool": { + "group": "Update sensitivity weights directive", + "tooltip": "Update weights at every iteration", + "label": "Every iteration", + "value": true, + "verbose": 2, + "enabled": true + }, + "save_sensitivities": { + "group": "Update sensitivity weights directive", + "label": "Save sensitivities", + "tooltip": "Save the summed square row sensitivities to geoh5.", + "value": false + }, + "n_cpu": { + "min": 1, + "group": "Compute", + "optional": true, + "enabled": false, + "label": "Number of CPUs", + "value": 1, + "visible": false + }, + "solver_type": { + "choiceList": [ + "Pardiso", + "Mumps" + ], + "group": "Compute", + "label": "Direct solver", + "tooltip": "Direct solver to use for the forward calculations", + "value": "Pardiso" + }, + "tile_spatial": { + "group": "Compute", + "label": "Number of tiles", + "parent": "data_object", + "isValue": true, + "property": "", + "value": 1, + "min": 1, + "max": 1000, + "verbose": 2, + "visible": false, + "tooltip": "Splits the objective function into spatial tiles for distributed computation using the Dask library." + }, + "store_sensitivities": { + "choiceList": [ + "ram" + ], + "group": "Compute", + "label": "Storage device", + "tooltip": "Only RAM storage available for now.", + "value": "ram" + }, + "out_group": { + "label": "SimPEG group", + "value": "", + "groupType": "{55ed3daf-c192-4d4b-a439-60fa987fe2b8}", + "group": "Drag-and-drop options", + "visible": true, + "optional": true, + "enabled": false, + "tooltip": "Optionally set the SimPEG group to which results will be saved." + }, + "generate_sweep": { + "label": "Generate sweep file", + "group": "Python run preferences", + "main": true, + "value": false, + "tooltip": "Generates a file for sweeping parameters instead of running the application." + }, + "distributed_workers": "" +} diff --git a/simpeg_drivers/__init__.py b/simpeg_drivers/__init__.py index 9142985e..bb0f0078 100644 --- a/simpeg_drivers/__init__.py +++ b/simpeg_drivers/__init__.py @@ -107,6 +107,13 @@ def assets_path() -> Path: "inversion": "TDEMInversionDriver", }, ), + "tdem 1d": ( + "simpeg_drivers.electromagnetics.time_domain_1d.driver", + { + "forward": "TDEM1DForwardDriver", + "inversion": "TDEM1DInversionDriver", + }, + ), "magnetotellurics": ( "simpeg_drivers.natural_sources.magnetotellurics.driver", { diff --git a/simpeg_drivers/components/data.py b/simpeg_drivers/components/data.py index 98b5f293..735eed3b 100644 --- a/simpeg_drivers/components/data.py +++ b/simpeg_drivers/components/data.py @@ -17,14 +17,14 @@ if TYPE_CHECKING: from geoh5py.workspace import Workspace + from simpeg_drivers.components.meshes import InversionMesh from simpeg_drivers.params import InversionBaseOptions from copy import deepcopy from re import findall import numpy as np -from discretize import TreeMesh -from geoh5py.shared.utils import fetch_active_workspace +from discretize import TensorMesh, TreeMesh from scipy.spatial import cKDTree from simpeg import maps from simpeg.electromagnetics.static.utils.static_utils import geometric_factor @@ -198,7 +198,13 @@ def save_data(self): data_dict = {c: {} for c in data.keys()} uncert_dict = {c: {} for c in data.keys()} - if self.params.inversion_type in ["magnetotellurics", "tipper", "tdem", "fem"]: + if self.params.inversion_type in [ + "magnetotellurics", + "tipper", + "tdem", + "fem", + "tdem 1d", + ]: for component, channels in data.items(): for ind, (channel, values) in enumerate(channels.items()): dnorm = values / self.normalizations[channel][component] @@ -313,7 +319,7 @@ def get_normalizations(self): mu0 * (-1 / offsets[chan] ** 3 / (4 * np.pi)) / 1e6 ) elif ( - self.params.inversion_type in ["tdem"] + "tdem" in self.params.inversion_type and self.params.data_units == "dB/dt (T/s)" ): if comp in ["x", "y", "z"]: @@ -324,7 +330,6 @@ def get_normalizations(self): def create_survey( self, - mesh: TreeMesh | None = None, local_index: np.ndarray | None = None, channel=None, ): @@ -342,7 +347,6 @@ def create_survey( survey_factory = SurveyFactory(self.params) survey, local_index, ordering = survey_factory.build( data=self, - mesh=mesh, local_index=local_index, channel=channel, ) @@ -356,8 +360,8 @@ def create_survey( def simulation( self, - mesh: TreeMesh, - local_mesh: TreeMesh | None, + inversion_mesh: InversionMesh, + local_mesh: TreeMesh | TensorMesh | None, active_cells: np.ndarray, survey, tile_id: int | None = None, @@ -385,21 +389,34 @@ def simulation( mapping = maps.IdentityMap(nP=int(self.n_blocks * active_cells.sum())) simulation = simulation_factory.build( survey=survey, - global_mesh=mesh, + global_mesh=inversion_mesh.mesh, active_cells=active_cells, mapping=mapping, ) - + elif "1d" in self.params.inversion_type: + slice_ind = np.arange( + tile_id, inversion_mesh.mesh.n_cells, inversion_mesh.mesh.shape_cells[0] + )[::-1] + mapping = maps.Projection(inversion_mesh.mesh.n_cells, slice_ind) + simulation = simulation_factory.build( + survey=survey, + receivers=self.entity, + global_mesh=inversion_mesh.mesh, + local_mesh=inversion_mesh.layers_mesh, + active_cells=active_cells, + mapping=mapping, + tile_id=tile_id, + ) else: if local_mesh is None: local_mesh = create_nested_mesh( survey, - mesh, + inversion_mesh.mesh, minimum_level=3, padding_cells=padding_cells, ) mapping = maps.TileMap( - mesh, + inversion_mesh.mesh, active_cells, local_mesh, enforce_active=True, @@ -408,7 +425,7 @@ def simulation( simulation = simulation_factory.build( survey=survey, receivers=self.entity, - global_mesh=mesh, + global_mesh=inversion_mesh.mesh, local_mesh=local_mesh, active_cells=mapping.local_active, mapping=mapping, diff --git a/simpeg_drivers/components/factories/directives_factory.py b/simpeg_drivers/components/factories/directives_factory.py index b56737c6..69214a04 100644 --- a/simpeg_drivers/components/factories/directives_factory.py +++ b/simpeg_drivers/components/factories/directives_factory.py @@ -223,7 +223,8 @@ def save_iteration_residual_directive(self): """""" if ( self._save_iteration_residual_directive is None - and self.factory_type not in ["tdem", "fem", "magnetotellurics", "tipper"] + and self.factory_type + not in ["tdem", "tdem 1d", "fem", "magnetotellurics", "tipper"] ): self._save_iteration_residual_directive = SaveDataGeoh5Factory( self.params @@ -352,12 +353,10 @@ def assemble_keyword_arguments( active_cells_map = maps.InjectActiveCells( inversion_object.mesh, active_cells, np.nan ) - sorting = inversion_object.permutation kwargs = { "label": "model", "association": "CEll", - "transforms": [active_cells_map], - "sorting": sorting, + "transforms": [active_cells_map, inversion_object.permutation.T], } if self.factory_type == "magnetic vector": @@ -365,6 +364,7 @@ def assemble_keyword_arguments( kwargs["transforms"] = [ cartesian2amplitude_dip_azimuth, active_cells_map, + inversion_object.permutation.T, ] if self.factory_type in [ @@ -373,13 +373,26 @@ def assemble_keyword_arguments( "magnetotellurics", "tipper", "tdem", + "tdem 1d", "fem", ]: expmap = maps.ExpMap(inversion_object.mesh) - kwargs["transforms"] = [expmap * active_cells_map] + kwargs["transforms"] = [ + expmap * active_cells_map, + inversion_object.permutation.T, + ] if self.params.model_type == "Resistivity (Ohm-m)": kwargs["transforms"].append(lambda x: 1 / x) + + if "1d" in self.factory_type: + ghosts = ( + np.squeeze(np.asarray(inversion_object.permutation.sum(axis=0))) == 0 + ) + nn_vals = np.ones_like(ghosts, dtype=float) + nn_vals[ghosts] = np.nan + kwargs["transforms"].append(lambda x: nn_vals * x) + return kwargs @@ -411,8 +424,12 @@ def volume_normalization(val): "label": "model", "association": "CEll", "dmisfit": global_misfit, - "transforms": [active_cells_map, sqrt, volume_normalization], - "sorting": inversion_object.permutation, + "transforms": [ + active_cells_map, + sqrt, + volume_normalization, + inversion_object.permutation.T, + ], } if self.factory_type == "magnetic vector": @@ -421,6 +438,7 @@ def volume_normalization(val): lambda x: x.reshape((-1, 3), order="F"), lambda x: np.linalg.norm(x, axis=1), active_cells_map, + inversion_object.permutation.T, ] kwargs["label"] = "sensitivities" @@ -445,7 +463,13 @@ def assemble_keyword_arguments( global_misfit=None, name=None, ): - if self.factory_type in ["fem", "tdem", "magnetotellurics", "tipper"]: + if self.factory_type in [ + "fem", + "tdem", + "tdem 1d", + "magnetotellurics", + "tipper", + ]: kwargs = self.assemble_data_keywords_em( inversion_object=inversion_object, active_cells=active_cells, diff --git a/simpeg_drivers/components/factories/misfit_factory.py b/simpeg_drivers/components/factories/misfit_factory.py index 249fea75..f9d88fdc 100644 --- a/simpeg_drivers/components/factories/misfit_factory.py +++ b/simpeg_drivers/components/factories/misfit_factory.py @@ -18,6 +18,7 @@ from geoapps_utils.driver.params import BaseParams from simpeg_drivers.components.data import InversionData + from simpeg_drivers.components.meshes import InversionMesh from simpeg_drivers.params import BaseOptions import numpy as np @@ -44,11 +45,11 @@ def __init__(self, params: BaseParams | BaseOptions, models=None): def concrete_object(self): return objective_function.ComboObjectiveFunction - def build(self, tiles, inversion_data, mesh, active_cells): # pylint: disable=arguments-differ + def build(self, tiles, inversion_data, inversion_mesh, active_cells): # pylint: disable=arguments-differ global_misfit = super().build( tiles=tiles, inversion_data=inversion_data, - mesh=mesh, + inversion_mesh=inversion_mesh, active_cells=active_cells, ) return global_misfit, self.sorting, self.ordering @@ -57,7 +58,7 @@ def assemble_arguments( # pylint: disable=arguments-differ self, tiles, inversion_data, - mesh, + inversion_mesh, active_cells, ): # Base slice over frequencies @@ -81,7 +82,7 @@ def assemble_arguments( # pylint: disable=arguments-differ local_sim, local_index, ordering, mapping = ( self.create_nested_simulation( inversion_data, - mesh, + inversion_mesh, local_mesh, active_cells, local_index, @@ -91,7 +92,7 @@ def assemble_arguments( # pylint: disable=arguments-differ ) ) - local_mesh = local_sim.mesh + local_mesh = getattr(local_sim, "mesh", None) if count == 0: if self.factory_type in [ @@ -111,10 +112,11 @@ def assemble_arguments( # pylint: disable=arguments-differ else: self.sorting.append(local_index) + # TODO this should be done in the simulation factory if "induced polarization" in self.params.inversion_type: if "2d" in self.params.inversion_type: proj = maps.InjectActiveCells( - mesh, active_cells, value_inactive=1e-8 + inversion_mesh.mesh, active_cells, value_inactive=1e-8 ) else: proj = maps.InjectActiveCells( @@ -123,7 +125,6 @@ def assemble_arguments( # pylint: disable=arguments-differ value_inactive=1e-8, ) - # TODO this should be done in the simulation factory local_sim.sigma = proj * mapping * self.models.conductivity # TODO add option to export tile meshes @@ -176,7 +177,7 @@ def assemble_keyword_arguments(self, **_): @staticmethod def create_nested_simulation( inversion_data: InversionData, - global_mesh: Octree, + inversion_mesh: InversionMesh, local_mesh: Octree | None, active_cells: np.ndarray, indices: np.ndarray, @@ -197,10 +198,10 @@ def create_nested_simulation( :param padding_cells: Number of padding cells around the local survey. """ survey, indices, ordering = inversion_data.create_survey( - mesh=global_mesh, local_index=indices, channel=channel + local_index=indices, channel=channel ) local_sim, mapping = inversion_data.simulation( - global_mesh, + inversion_mesh, local_mesh, active_cells, survey, diff --git a/simpeg_drivers/components/factories/receiver_factory.py b/simpeg_drivers/components/factories/receiver_factory.py index b8fd3fd3..c40c60b2 100644 --- a/simpeg_drivers/components/factories/receiver_factory.py +++ b/simpeg_drivers/components/factories/receiver_factory.py @@ -86,7 +86,7 @@ def concrete_object(self): return receivers.Tipper def assemble_arguments( - self, locations=None, data=None, local_index=None, mesh=None, component=None + self, locations=None, data=None, local_index=None, component=None ): """Provides implementations to assemble arguments for receivers object.""" @@ -105,15 +105,13 @@ def assemble_arguments( args += self._magnetotellurics_arguments( locations=locations, local_index=local_index, - mesh=mesh, ) - elif self.factory_type in ["tdem"]: + elif "tdem" in self.factory_type: args += self._tdem_arguments( data=data, locations=locations, local_index=local_index, - mesh=mesh, ) else: @@ -122,7 +120,7 @@ def assemble_arguments( return args def assemble_keyword_arguments( - self, locations=None, data=None, local_index=None, mesh=None, component=None + self, locations=None, data=None, local_index=None, component=None ): """Provides implementations to assemble keyword arguments for receivers object.""" kwargs = {} @@ -137,19 +135,16 @@ def assemble_keyword_arguments( kwargs["component"] = component.split("_")[1] if self.factory_type in ["tipper"]: kwargs["orientation"] = kwargs["orientation"][::-1] - if self.factory_type in ["tdem"]: + if "tdem" in self.factory_type: kwargs["orientation"] = component return kwargs - def build( - self, locations=None, data=None, local_index=None, mesh=None, component=None - ): + def build(self, locations=None, data=None, local_index=None, component=None): receivers = super().build( locations=locations, data=data, local_index=local_index, - mesh=mesh, component=component, ) @@ -159,13 +154,6 @@ def build( ): stations = self.params.data_object.base_stations.vertices if stations is not None: - if getattr(self.params.mesh, "rotation", None): - rotate_xyz( - stations, - self.params.mesh.origin.tolist(), - -1 * self.params.mesh.rotation[0], - ) - if stations.shape[0] == 1: stations = np.tile(stations.T, self.params.data_object.n_vertices).T @@ -192,13 +180,13 @@ def _dcip_arguments(self, locations=None, local_index=None): return args - def _tdem_arguments(self, data=None, locations=None, local_index=None, mesh=None): + def _tdem_arguments(self, data=None, locations=None, local_index=None): return [ locations, np.asarray(data.entity.channels) * self.params.unit_conversion, ] - def _magnetotellurics_arguments(self, locations=None, local_index=None, mesh=None): + def _magnetotellurics_arguments(self, locations=None, local_index=None): args = [] locs = locations[local_index] diff --git a/simpeg_drivers/components/factories/simpeg_factory.py b/simpeg_drivers/components/factories/simpeg_factory.py index 723bad73..b9611bdf 100644 --- a/simpeg_drivers/components/factories/simpeg_factory.py +++ b/simpeg_drivers/components/factories/simpeg_factory.py @@ -58,6 +58,7 @@ class SimPEGFactory(ABC): "induced polarization pseudo 3d", "fem", "tdem", + "tdem 1d", "magnetotellurics", "tipper", "joint surveys", diff --git a/simpeg_drivers/components/factories/simulation_factory.py b/simpeg_drivers/components/factories/simulation_factory.py index 3e311f6d..1da9656b 100644 --- a/simpeg_drivers/components/factories/simulation_factory.py +++ b/simpeg_drivers/components/factories/simulation_factory.py @@ -39,6 +39,7 @@ def __init__(self, params: BaseParams | BaseOptions): super().__init__(params) self.simpeg_object = self.concrete_object() + self.solver = None if self.factory_type in [ "direct current pseudo 3d", "direct current 3d", @@ -106,6 +107,11 @@ def concrete_object(self): return simulation.Simulation3DMagneticFluxDensity + if self.factory_type in ["tdem 1d"]: + from simpeg.electromagnetics.time_domain import simulation_1d + + return simulation_1d.Simulation1DLayered + def assemble_arguments( self, survey=None, @@ -116,6 +122,9 @@ def assemble_arguments( mapping=None, tile_id=None, ): + if "1d" in self.factory_type: + return () + mesh = global_mesh if tile_id is None else local_mesh return [mesh] @@ -141,79 +150,55 @@ def assemble_keyword_arguments( if self.params.forward_only else self.params.store_sensitivities ) + kwargs["solver"] = self.solver if self.factory_type == "magnetic vector": - return self._magnetic_vector_keywords(kwargs, active_cells=active_cells) + kwargs["active_cells"] = active_cells + kwargs["chiMap"] = maps.IdentityMap(nP=int(active_cells.sum()) * 3) + kwargs["model_type"] = "vector" + kwargs["chunk_format"] = "row" + if self.factory_type == "magnetic scalar": - return self._magnetic_scalar_keywords(kwargs, active_cells=active_cells) + kwargs["active_cells"] = active_cells + kwargs["chiMap"] = maps.IdentityMap(nP=int(active_cells.sum())) + kwargs["chunk_format"] = "row" + if self.factory_type == "gravity": - return self._gravity_keywords(kwargs, active_cells=active_cells) + kwargs["active_cells"] = active_cells + kwargs["rhoMap"] = maps.IdentityMap(nP=int(active_cells.sum())) + kwargs["chunk_format"] = "row" + if "induced polarization" in self.factory_type: - return self._induced_polarization_keywords( - kwargs, - mesh, - active_cells=active_cells, + etamap = maps.InjectActiveCells( + mesh, active_cells=active_cells, value_inactive=0 ) + kwargs["etaMap"] = etamap + if self.factory_type in [ "direct current 3d", "direct current 2d", "magnetotellurics", "tipper", "fem", + "tdem", ]: - return self._conductivity_keywords(kwargs, mesh, active_cells=active_cells) - if self.factory_type in ["tdem"]: - return self._tdem_keywords( - kwargs, receivers, mesh, active_cells=active_cells + actmap = maps.InjectActiveCells( + mesh, active_cells=active_cells, value_inactive=np.log(1e-8) ) + kwargs["sigmaMap"] = maps.ExpMap(mesh) * actmap - def _magnetic_vector_keywords(self, kwargs, active_cells=None): - kwargs["active_cells"] = active_cells - kwargs["chiMap"] = maps.IdentityMap(nP=int(active_cells.sum()) * 3) - kwargs["model_type"] = "vector" - kwargs["chunk_format"] = "row" - return kwargs - - def _magnetic_scalar_keywords(self, kwargs, active_cells=None): - kwargs["active_cells"] = active_cells - kwargs["chiMap"] = maps.IdentityMap(nP=int(active_cells.sum())) - kwargs["chunk_format"] = "row" - return kwargs - - def _gravity_keywords(self, kwargs, active_cells=None): - kwargs["active_cells"] = active_cells - kwargs["rhoMap"] = maps.IdentityMap(nP=int(active_cells.sum())) - kwargs["chunk_format"] = "row" - return kwargs - - def _induced_polarization_keywords( - self, - kwargs, - mesh, - active_cells=None, - ): - etamap = maps.InjectActiveCells( - mesh, active_cells=active_cells, value_inactive=0 - ) - kwargs["etaMap"] = etamap - kwargs["solver"] = self.solver - return kwargs + if "tdem" in self.factory_type: + kwargs["t0"] = -receivers.timing_mark * self.params.unit_conversion + kwargs["time_steps"] = ( + np.round((np.diff(np.unique(receivers.waveform[:, 0]))), decimals=6) + * self.params.unit_conversion + ) - def _conductivity_keywords(self, kwargs, mesh, active_cells=None): - actmap = maps.InjectActiveCells( - mesh, active_cells=active_cells, value_inactive=np.log(1e-8) - ) - kwargs["sigmaMap"] = maps.ExpMap(mesh) * actmap - kwargs["solver"] = self.solver - return kwargs + if self.factory_type in ["tdem 1d"]: + kwargs["sigmaMap"] = maps.ExpMap(mesh) + kwargs["thicknesses"] = local_mesh.h[0][1:][::-1] + kwargs["topo"] = active_cells[tile_id] - def _tdem_keywords(self, kwargs, receivers, mesh, active_cells=None): - kwargs = self._conductivity_keywords(kwargs, mesh, active_cells=active_cells) - kwargs["t0"] = -receivers.timing_mark * self.params.unit_conversion - kwargs["time_steps"] = ( - np.round((np.diff(np.unique(receivers.waveform[:, 0]))), decimals=6) - * self.params.unit_conversion - ) return kwargs def _get_sensitivity_path(self, tile_id: int) -> str: diff --git a/simpeg_drivers/components/factories/source_factory.py b/simpeg_drivers/components/factories/source_factory.py index a5ac083a..c52c0e41 100644 --- a/simpeg_drivers/components/factories/source_factory.py +++ b/simpeg_drivers/components/factories/source_factory.py @@ -11,22 +11,26 @@ from __future__ import annotations +from copy import deepcopy from typing import TYPE_CHECKING +import numpy as np +import simpeg.electromagnetics.frequency_domain.sources as fem_sources +import simpeg.electromagnetics.natural_source.sources as ns_sources +import simpeg.electromagnetics.static.resistivity.sources as dc_sources +import simpeg.electromagnetics.time_domain.sources as tem_sources +import simpeg.potential_fields.gravity.sources as grav_sources +import simpeg.potential_fields.magnetics.sources as mag_sources +from geoh5py.objects import LargeLoopGroundTEMReceivers + +from simpeg_drivers.components.factories.simpeg_factory import SimPEGFactory + if TYPE_CHECKING: from geoapps_utils.driver.params import BaseParams from simpeg_drivers.params import BaseOptions -from copy import deepcopy - -import numpy as np -from geoapps_utils.utils.transformations import rotate_xyz -from geoh5py.objects import LargeLoopGroundTEMReceivers - -from simpeg_drivers.components.factories.simpeg_factory import SimPEGFactory - class SourcesFactory(SimPEGFactory): """Build SimPEG sources objects based on factory type.""" @@ -41,42 +45,37 @@ def __init__(self, params: BaseParams | BaseOptions): def concrete_object(self): if self.factory_type in ["magnetic vector", "magnetic scalar"]: - from simpeg.potential_fields.magnetics import sources - - return sources.UniformBackgroundField + return mag_sources.UniformBackgroundField elif self.factory_type == "gravity": - from simpeg.potential_fields.gravity import sources - - return sources.SourceField + return grav_sources.SourceField elif "direct current" in self.factory_type: - from simpeg.electromagnetics.static.resistivity import sources - - return sources.Dipole + return dc_sources.Dipole elif "induced polarization" in self.factory_type: - from simpeg.electromagnetics.static.induced_polarization import sources - - return sources.Dipole + return dc_sources.Dipole elif "fem" in self.factory_type: - from simpeg.electromagnetics.frequency_domain import sources - - return sources.MagDipole - - elif "tdem" in self.factory_type: - from simpeg.electromagnetics.time_domain import sources + return fem_sources.MagDipole + elif "tdem" == self.factory_type: if isinstance(self.params.data_object, LargeLoopGroundTEMReceivers): - return sources.LineCurrent + return tem_sources.LineCurrent + else: + return tem_sources.MagDipole + + elif "tdem 1d" == self.factory_type: + if np.allclose( + self.params.data_object.vertices, + self.params.data_object.complement.vertices, + ): + return tem_sources.CircularLoop else: - return sources.MagDipole + return tem_sources.MagDipole elif self.factory_type in ["magnetotellurics", "tipper"]: - from simpeg.electromagnetics.natural_source import sources - - return sources.PlanewaveXYPrimary + return ns_sources.PlanewaveXYPrimary def assemble_arguments( self, @@ -86,17 +85,9 @@ def assemble_arguments( waveform=None, ): # pylint: disable=arguments-differ """Provides implementations to assemble arguments for sources object.""" - _ = waveform args = [] - if locations is not None and getattr(self.params.mesh, "rotation", None): - locations = rotate_xyz( - locations, - self.params.mesh.origin.tolist(), - -1 * self.params.mesh.rotation[0], - ) - if self.factory_type in [ "direct current pseudo 3d", "direct current 3d", @@ -114,7 +105,7 @@ def assemble_arguments( args.append(receivers) args.append(frequency) - elif self.factory_type in ["tdem"]: + elif "tdem" in self.factory_type: args.append(receivers) else: @@ -144,10 +135,20 @@ def assemble_keyword_arguments( # pylint: disable=arguments-differ if self.factory_type in ["fem"]: kwargs["location"] = locations - if self.factory_type in ["tdem"]: + if "tdem" in self.factory_type: kwargs["location"] = locations kwargs["waveform"] = waveform + if self.factory_type == "tdem 1d": + if isinstance( + self.concrete_object(), + tem_sources.CircularLoop, + ): + kwargs["moment"] = 1.0 + else: + kwargs["current"] = 1.0 + kwargs["radius"] = np.pi**-0.5 + return kwargs def build( # pylint: disable=arguments-differ @@ -169,11 +170,7 @@ def _dcip_arguments(self, receivers=None, locations=None): args.append(locations_a) if np.all(locations_a == locations_b): - if "direct current" in self.factory_type: - from simpeg.electromagnetics.static.resistivity import sources - else: - from simpeg.electromagnetics.static.induced_polarization import sources - self.simpeg_object = sources.Pole + self.simpeg_object = dc_sources.Pole else: args.append(locations_b) diff --git a/simpeg_drivers/components/factories/survey_factory.py b/simpeg_drivers/components/factories/survey_factory.py index b77f9828..9abdc1ad 100644 --- a/simpeg_drivers/components/factories/survey_factory.py +++ b/simpeg_drivers/components/factories/survey_factory.py @@ -108,7 +108,7 @@ def concrete_object(self): return survey.Survey - def assemble_arguments(self, data=None, mesh=None, local_index=None, channel=None): + def assemble_arguments(self, data=None, local_index=None, channel=None): """Provides implementations to assemble arguments for receivers object.""" receiver_entity = data.entity @@ -124,14 +124,12 @@ def assemble_arguments(self, data=None, mesh=None, local_index=None, channel=Non if "current" in self.factory_type or "polarization" in self.factory_type: return self._dcip_arguments(data=data, local_index=local_index) - elif self.factory_type in ["tdem"]: - return self._tdem_arguments(data=data, mesh=mesh, local_index=local_index) + elif self.factory_type in ["tdem", "tdem 1d"]: + return self._tdem_arguments(data=data) elif self.factory_type in ["magnetotellurics", "tipper"]: - return self._naturalsource_arguments( - data=data, mesh=mesh, frequency=channel - ) + return self._naturalsource_arguments(data=data, frequency=channel) elif self.factory_type in ["fem"]: - return self._fem_arguments(data=data, mesh=mesh, channel=channel) + return self._fem_arguments(data=data, channel=channel) else: receivers = ReceiversFactory(self.params).build( locations=data.locations, @@ -148,7 +146,6 @@ def assemble_keyword_arguments(self, **_): def build( self, data=None, - mesh=None, local_index=None, indices=None, channel=None, @@ -158,7 +155,6 @@ def build( survey = super().build( data=data, local_index=local_index, - mesh=mesh, channel=channel, ) @@ -198,7 +194,7 @@ def _add_data(self, survey, data, local_index, channel): if isinstance(local_index, list): local_index = np.hstack(local_index) - if self.factory_type in ["fem", "tdem"]: + if self.factory_type in ["fem", "tdem", "tdem 1d"]: dobs = [] uncerts = [] @@ -323,7 +319,7 @@ def _dcip_arguments(self, data=None, local_index=None): return [sources] - def _tdem_arguments(self, data=None, local_index=None, mesh=None): + def _tdem_arguments(self, data=None): receivers = data.entity transmitters = receivers.transmitters @@ -357,16 +353,25 @@ def _tdem_arguments(self, data=None, local_index=None, mesh=None): rx_lookup = self.local_index[:, np.newaxis].tolist() tx_locs = [transmitters.vertices[k, :] for k in self.local_index] - wave_function = interp1d( - (receivers.waveform[:, 0] - receivers.timing_mark) - * self.params.unit_conversion, - receivers.waveform[:, 1], - fill_value="extrapolate", - ) + wave_times = ( + receivers.waveform[:, 0] - receivers.timing_mark + ) * self.params.unit_conversion + if "1d" in self.factory_type: + on_times = wave_times <= 0.0 + waveform = tdem.sources.PiecewiseLinearWaveform( + times=wave_times[on_times], + currents=receivers.waveform[on_times, 1], + ) + else: + wave_function = interp1d( + wave_times, + receivers.waveform[:, 1], + fill_value="extrapolate", + ) - waveform = tdem.sources.RawWaveform( - waveform_function=wave_function, offTime=0.0 - ) + waveform = tdem.sources.RawWaveform( + waveform_function=wave_function, offTime=0.0 + ) self.ordering = [] tx_list = [] @@ -381,7 +386,6 @@ def _tdem_arguments(self, data=None, local_index=None, mesh=None): locations=locs, local_index=self.local_index, data=data, - mesh=mesh, component=component, ) rx_obj.local_index = rx_ids @@ -397,7 +401,7 @@ def _tdem_arguments(self, data=None, local_index=None, mesh=None): return [tx_list] - def _fem_arguments(self, data=None, mesh=None, channel=None): + def _fem_arguments(self, data=None, channel=None): channels = np.array(data.entity.channels) frequencies = channels if channel is None else [channel] rx_locs = data.entity.vertices @@ -418,7 +422,6 @@ def _fem_arguments(self, data=None, mesh=None, channel=None): receiver = rx_factory.build( locations=rx_locs[receiver_id, :], data=data, - mesh=mesh, component=component, ) @@ -449,7 +452,7 @@ def _fem_arguments(self, data=None, mesh=None, channel=None): return [sources] - def _naturalsource_arguments(self, data=None, mesh=None, frequency=None): + def _naturalsource_arguments(self, data=None, frequency=None): receivers = [] sources = [] rx_factory = ReceiversFactory(self.params) @@ -462,7 +465,6 @@ def _naturalsource_arguments(self, data=None, mesh=None, frequency=None): locations=data.locations, local_index=self.local_index, data=data, - mesh=mesh, component=comp, ) ) diff --git a/simpeg_drivers/components/meshes.py b/simpeg_drivers/components/meshes.py index af8a8061..c4005baf 100644 --- a/simpeg_drivers/components/meshes.py +++ b/simpeg_drivers/components/meshes.py @@ -22,6 +22,7 @@ from octree_creation_app.driver import OctreeDriver from octree_creation_app.params import OctreeParams from octree_creation_app.utils import octree_2_treemesh, treemesh_2_octree +from scipy.sparse import csr_matrix, identity from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions from simpeg_drivers.utils.meshes import auto_mesh_parameters @@ -78,6 +79,7 @@ def __init__( self, workspace: Workspace, params: BaseForwardOptions | BaseInversionOptions, + entity: Octree | DrapeModel | None = None, ) -> None: """ :param workspace: Workspace object containing mesh data. @@ -85,14 +87,10 @@ def __init__( """ self.workspace = workspace self.params = params - self.mesh: TreeMesh | TensorMesh | None = None - self.n_cells: int | None = None - self.rotation: dict[str, float] | None = None - self._permutation: np.ndarray | None = None - self.entity: Octree | DrapeModel | None = None - self._initialize() - - def _initialize(self) -> None: + self.entity = entity or self.get_entity() + self.mesh, self._permutation = self.to_discretize(self.entity) + + def get_entity(self) -> Octree | DrapeModel: """ Collects mesh data stored in geoh5 workspace into TreeMesh object. @@ -100,19 +98,17 @@ def _initialize(self) -> None: type required for SimPEG inversion and stores data needed to restore original the octree mesh type. """ - if self.params.mesh is None: logger.info( "No mesh provided. Creating optimized mesh from data and topography." ) - self._auto_mesh() + mesh_entity = self._auto_mesh() else: - self.entity = self.params.mesh.copy( + mesh_entity = self.params.mesh.copy( parent=self.params.out_group, copy_children=False ) - self.uid = self.entity.uid - self.n_cells = self.entity.n_cells + return mesh_entity def _auto_mesh(self): """Automate meshing based on data and topography objects.""" @@ -125,21 +121,41 @@ def _auto_mesh(self): driver = OctreeDriver(params) mesh = driver.run() - self.entity = mesh.copy(parent=self.params.out_group) + return mesh.copy(parent=self.params.out_group) + + @classmethod + def to_discretize( + cls, + entity: Octree | DrapeModel, + ) -> tuple[TreeMesh | TensorMesh, np.ndarray]: + """ + Converts mesh entity to its discretize equivalent. + + :param entity: Octree or DrapeModel object containing mesh data. + + :return: Tuple containing mesh object and permutation vector. + """ + + if isinstance(entity, Octree): + mesh = cls.to_treemesh(entity) + permutation = identity(entity.n_cells).tocsr() + elif isinstance(entity, DrapeModel): + mesh, indices = drape_2_tensor(entity, return_sorting=True) + permutation = csr_matrix( + (np.ones_like(indices), (np.arange(len(indices)), indices)), + shape=(mesh.n_cells, entity.n_cells), + ) + else: + raise TypeError("Mesh object must be of type Octree or DrapeModel.") + + return mesh, permutation @property def mesh(self) -> TreeMesh | TensorMesh: """TreeMesh or TensorMesh object containing mesh data.""" - + # In case the _mesh was reset by the driver. if self._mesh is None: - if isinstance(self._entity, Octree): - self._mesh = octree_2_treemesh(self._entity) - self._permutation = np.arange(self.entity.n_cells) - - if isinstance(self.entity, DrapeModel) and self._mesh is None: - self._mesh, self._permutation = drape_2_tensor( - self.entity, return_sorting=True - ) + self.mesh, self._permutation = self.to_discretize(self.entity) return self._mesh @@ -150,11 +166,14 @@ def mesh(self, value: TreeMesh | TensorMesh | None): self._mesh = value + @property + def n_cells(self) -> int: + """Number of cells in the mesh.""" + return self.entity.n_cells + @property def permutation(self) -> np.ndarray: """Permutation vector between discretize and geoh5py/DrapeModel ordering.""" - if self.mesh is None: - raise ValueError("A 'mesh' must be assigned before accessing permutation.") return self._permutation @property @@ -163,17 +182,13 @@ def entity(self) -> Octree | DrapeModel: return self._entity @entity.setter - def entity(self, val: Octree | DrapeModel): - if not isinstance(val, Octree | DrapeModel | type(None)): + def entity(self, entity: Octree | DrapeModel): + if not isinstance(entity, Octree | DrapeModel): raise TypeError( "Attribute 'entity' must be an Octree or DrapeModel object." ) - self._entity = val - - if isinstance(self._entity, Octree): - self._permutation = np.arange(self.entity.n_cells) - self._mesh = self.to_treemesh(self._entity) + self._entity = entity @staticmethod def to_treemesh(octree): diff --git a/simpeg_drivers/components/models.py b/simpeg_drivers/components/models.py index bba96ba9..1e393ecf 100644 --- a/simpeg_drivers/components/models.py +++ b/simpeg_drivers/components/models.py @@ -118,12 +118,12 @@ def active_cells(self, active_cells: np.ndarray | NumericData | None): raise ValueError("active_cells must be a boolean numpy array.") permutation = self.driver.inversion_mesh.permutation - self.edit_ndv_model(active_cells[permutation]) + self.edit_ndv_model(permutation.T @ active_cells) self.remove_air(active_cells) self.driver.inversion_mesh.entity.add_data( { "active_cells": { - "values": active_cells[permutation], + "values": permutation.T @ active_cells, "primitive_type": "boolean", } } @@ -316,19 +316,6 @@ def permute_2_octree(self, name): """ return self._model_method_wrapper("permute_2_octree", name=name) - def permute_2_treemesh(self, model, name): - """ - Reorder model values stored in cell centers of an octree mesh to - TreeMesh sorting. - - :param model: octree sorted model. - :param name: model type name ("starting", "reference", - "lower_bound", or "upper_bound"). - - :return: Vector of model values reordered for TreeMesh. - """ - return self._model_method_wrapper("permute_2_treemesh", name=name, model=model) - def edit_ndv_model(self, actives: np.ndarray): """ Change values in models recorded in geoh5 for no-data-values. @@ -412,9 +399,6 @@ def _initialize(self): * self.driver.params.inducing_field_declination ) - if self.driver.inversion_mesh.rotation is not None: - declination += self.driver.inversion_mesh.rotation["angle"] - inclination[np.isnan(inclination)] = 0 declination[np.isnan(declination)] = 0 field_vecs = dip_azimuth2cartesian( @@ -458,21 +442,10 @@ def permute_2_octree(self) -> np.ndarray | None: if self.is_vector: return mkvc( - self.model.reshape((-1, 3), order="F")[ - self.driver.inversion_mesh.permutation, : - ] + self.driver.inversion_mesh.permutation.T + @ self.model.reshape((-1, 3), order="F") ) - return self.model[self.driver.inversion_mesh.permutation] - - def permute_2_treemesh(self, model: np.ndarray) -> np.ndarray: - """ - Reorder model values stored in cell centers of an octree mesh to - TreeMesh order in self.driver.inversion_mesh. - - :param model: octree sorted model - :return: Vector of model values reordered for TreeMesh. - """ - return model[np.argsort(self.driver.inversion_mesh.permutation)] + return self.driver.inversion_mesh.permutation.T @ self.model def save_model(self): """Resort model to the octree object's ordering and save to workspace.""" @@ -522,7 +495,7 @@ def edit_ndv_model(self, model): and data_obj[0].values is not None ): values = data_obj[0].values.copy() - values[~model] = np.nan + values[~model.astype(bool)] = np.nan data_obj[0].values = values def _get(self, name: str) -> np.ndarray | None: @@ -555,9 +528,9 @@ def _get_value(self, model: float | NumericData) -> np.ndarray: """ if isinstance(model, NumericData): model = self.obj_2_mesh(model, self.driver.inversion_mesh.entity) - model = model[np.argsort(self.driver.inversion_mesh.permutation)] + model = self.driver.inversion_mesh.permutation @ model else: - nc = self.driver.inversion_mesh.n_cells + nc = self.driver.inversion_mesh.mesh.n_cells if isinstance(model, int | float): model *= np.ones(nc) diff --git a/simpeg_drivers/components/topography.py b/simpeg_drivers/components/topography.py index c1281cad..5664c17c 100644 --- a/simpeg_drivers/components/topography.py +++ b/simpeg_drivers/components/topography.py @@ -103,7 +103,7 @@ def active_cells(self, mesh: InversionMesh, data: InversionData) -> np.ndarray: grid_reference="bottom" if forced_to_surface else "center", ) - active_cells = active_cells[np.argsort(mesh.permutation)].astype(bool) + active_cells = (mesh.permutation @ active_cells).astype(bool) if forced_to_surface: active_cells = self.expand_actives(active_cells, mesh, data) diff --git a/simpeg_drivers/driver.py b/simpeg_drivers/driver.py index aff86b94..c80a8ee4 100644 --- a/simpeg_drivers/driver.py +++ b/simpeg_drivers/driver.py @@ -118,7 +118,7 @@ def data_misfit(self): ).build( tiles, self.inversion_data, - self.inversion_mesh.mesh, + self.inversion_mesh, self.models.active_cells, ) print("Done.") @@ -484,6 +484,8 @@ def get_regularization(self): def get_tiles(self): if "2d" in self.params.inversion_type: tiles = [np.arange(len(self.inversion_data.indices))] + elif "1d" in self.params.inversion_type: + tiles = np.arange(len(self.inversion_data.indices)).reshape((-1, 1)) else: locations = self.inversion_data.locations tiles = tile_locations( diff --git a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py index 171e37b7..9afe88fa 100644 --- a/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py +++ b/simpeg_drivers/electricals/direct_current/pseudo_three_dimensions/params.py @@ -19,11 +19,14 @@ from simpeg_drivers import assets_path from simpeg_drivers.electricals.params import ( - DrapeModelOptions, FileControlOptions, +) +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, + DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions class DCBatch2DForwardOptions(BaseForwardOptions): diff --git a/simpeg_drivers/electricals/direct_current/two_dimensions/params.py b/simpeg_drivers/electricals/direct_current/two_dimensions/params.py index 53fff8e0..d5b9f88e 100644 --- a/simpeg_drivers/electricals/direct_current/two_dimensions/params.py +++ b/simpeg_drivers/electricals/direct_current/two_dimensions/params.py @@ -19,11 +19,12 @@ from pydantic import BaseModel, ConfigDict, field_validator, model_validator from simpeg_drivers import assets_path -from simpeg_drivers.electricals.params import ( +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions class DC2DForwardOptions(BaseForwardOptions): diff --git a/simpeg_drivers/electricals/driver.py b/simpeg_drivers/electricals/driver.py index 2099b602..b690418a 100644 --- a/simpeg_drivers/electricals/driver.py +++ b/simpeg_drivers/electricals/driver.py @@ -29,9 +29,12 @@ from simpeg_drivers.components.topography import InversionTopography from simpeg_drivers.components.windows import InversionWindow from simpeg_drivers.driver import InversionDriver -from simpeg_drivers.electricals.params import LineSelectionOptions from simpeg_drivers.line_sweep.driver import LineSweepDriver -from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, + LineSelectionOptions, +) from simpeg_drivers.utils.surveys import extract_dcip_survey from simpeg_drivers.utils.utils import get_drape_model diff --git a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/params.py b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/params.py index 935662ad..7bb47a70 100644 --- a/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/params.py +++ b/simpeg_drivers/electricals/induced_polarization/pseudo_three_dimensions/params.py @@ -19,11 +19,14 @@ from simpeg_drivers import assets_path from simpeg_drivers.electricals.params import ( - DrapeModelOptions, FileControlOptions, +) +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, + DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions class IPBatch2DForwardOptions(BaseForwardOptions): diff --git a/simpeg_drivers/electricals/induced_polarization/two_dimensions/params.py b/simpeg_drivers/electricals/induced_polarization/two_dimensions/params.py index a86747a8..323726c7 100644 --- a/simpeg_drivers/electricals/induced_polarization/two_dimensions/params.py +++ b/simpeg_drivers/electricals/induced_polarization/two_dimensions/params.py @@ -18,11 +18,12 @@ from geoh5py.objects import DrapeModel from simpeg_drivers import assets_path -from simpeg_drivers.electricals.params import ( +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import BaseForwardOptions, BaseInversionOptions class IP2DForwardOptions(BaseForwardOptions): diff --git a/simpeg_drivers/electricals/params.py b/simpeg_drivers/electricals/params.py index 7d683688..574172b3 100644 --- a/simpeg_drivers/electricals/params.py +++ b/simpeg_drivers/electricals/params.py @@ -11,57 +11,7 @@ from __future__ import annotations -from geoh5py.data import DataAssociationEnum, ReferencedData -from pydantic import BaseModel, ConfigDict, field_validator, model_validator - - -class LineSelectionOptions(BaseModel): - """ - Line selection parameters for 2D inversions. - - :param line_object: Reference data categorizing survey by line ids. - :param line_id: Line identifier for simulation/inversion. - """ - - model_config = ConfigDict( - arbitrary_types_allowed=True, - ) - - line_object: ReferencedData - line_id: int = 1 - - @field_validator("line_object", mode="before") - @classmethod - def validate_cell_association(cls, value): - if value.association is not DataAssociationEnum.CELL: - raise ValueError("Line identifier must be associated with cells.") - return value - - @model_validator(mode="after") - def line_id_referenced(self): - if self.line_id not in self.line_object.values: - raise ValueError("Line id isn't referenced in the line object.") - return self - - -class DrapeModelOptions(BaseModel): - """ - Drape model parameters for 2D simulation/inversion]. - - :param u_cell_size: Horizontal cell size for the drape model. - :param v_cell_size: Vertical cell size for the drape model. - :param depth_core: Depth of the core region. - :param horizontal_padding: Horizontal padding. - :param vertical_padding: Vertical padding. - :param expansion_factor: Expansion factor for the drape model. - """ - - u_cell_size: float | None = 25.0 - v_cell_size: float | None = 25.0 - depth_core: float | None = 100.0 - horizontal_padding: float | None = 100.0 - vertical_padding: float | None = 100.0 - expansion_factor: float | None = 100.0 +from pydantic import BaseModel class FileControlOptions(BaseModel): diff --git a/simpeg_drivers/electromagnetics/time_domain/driver.py b/simpeg_drivers/electromagnetics/time_domain/driver.py index 2c2ff36b..ffc61240 100644 --- a/simpeg_drivers/electromagnetics/time_domain/driver.py +++ b/simpeg_drivers/electromagnetics/time_domain/driver.py @@ -25,6 +25,62 @@ ) +def tile_large_group_transmitters( + survey: LargeLoopGroundTEMReceivers, n_tiles: int +) -> list[np.ndarray]: + """ + Tile the data based on the transmitters center locations. + + :param survey: LargeLoopGroundTEMReceivers object. + :param n_tiles: Number of tiles. + + :return: List of numpy arrays containing the indices of the receivers in each tile. + """ + if not isinstance(survey, LargeLoopGroundTEMReceivers): + raise TypeError("Data object must be of type LargeLoopGroundTEMReceivers") + + tx_ids = survey.transmitters.tx_id_property.values + unique_tile_ids = np.unique(tx_ids) + n_groups = np.min([len(unique_tile_ids), n_tiles]) + locations = [] + for uid in unique_tile_ids: + locations.append( + np.mean( + survey.transmitters.vertices[tx_ids == uid], + axis=0, + ) + ) + + # Tile transmitters spatially by loop center + tx_tiles = tile_locations( + np.vstack(locations), + n_groups, + method="kmeans", + ) + receivers_tx_ids = survey.tx_id_property.values + tiles = [] + for _t_id, group in enumerate(tx_tiles): + sub_group = [] + for value in group: + receiver_ind = receivers_tx_ids == unique_tile_ids[value] + sub_group.append(np.where(receiver_ind)[0]) + + tiles.append(np.hstack(sub_group)) + + # If number of tiles remaining, brake up receivers spatially per transmitter + while len(tiles) < n_tiles: + largest_group = np.argmax([len(tile) for tile in tiles]) + tile = tiles.pop(largest_group) + new_tiles = tile_locations( + survey.vertices[tile], + 2, + method="kmeans", + ) + tiles += [tile[new_tiles[0]], tile[new_tiles[1]]] + + return tiles + + class TDEMForwardDriver(InversionDriver): """Time Domain Electromagnetic forward driver.""" @@ -42,46 +98,10 @@ def get_tiles(self) -> list[np.ndarray]: if not isinstance(self.params.data_object, LargeLoopGroundTEMReceivers): return super().get_tiles() - tx_ids = self.params.data_object.transmitters.tx_id_property.values - unique_tile_ids = np.unique(tx_ids) - n_groups = np.min([len(unique_tile_ids), self.params.tile_spatial]) - locations = [] - for uid in unique_tile_ids: - locations.append( - np.mean( - self.params.data_object.transmitters.vertices[tx_ids == uid], - axis=0, - ) - ) - - # Tile transmitters spatially by loop center - tx_tiles = tile_locations( - np.vstack(locations), - n_groups, - method="kmeans", + return tile_large_group_transmitters( + self.params.data_object, + self.params.tile_spatial, ) - receivers_tx_ids = self.params.data_object.tx_id_property.values - tiles = [] - for _t_id, group in enumerate(tx_tiles): - sub_group = [] - for value in group: - receiver_ind = receivers_tx_ids == unique_tile_ids[value] - sub_group.append(np.where(receiver_ind)[0]) - - tiles.append(np.hstack(sub_group)) - - # If number of tiles remaining, brake up receivers spatially per transmitter - while len(tiles) < self.params.tile_spatial: - largest_group = np.argmax([len(tile) for tile in tiles]) - tile = tiles.pop(largest_group) - new_tiles = tile_locations( - self.params.data_object.vertices[tile], - 2, - method="kmeans", - ) - tiles += [tile[new_tiles[0]], tile[new_tiles[1]]] - - return tiles class TDEMInversionDriver(InversionDriver): @@ -101,43 +121,7 @@ def get_tiles(self) -> list[np.ndarray]: if not isinstance(self.params.data_object, LargeLoopGroundTEMReceivers): return super().get_tiles() - tx_ids = self.params.data_object.transmitters.tx_id_property.values - unique_tile_ids = np.unique(tx_ids) - n_groups = np.min([len(unique_tile_ids), self.params.tile_spatial]) - locations = [] - for uid in unique_tile_ids: - locations.append( - np.mean( - self.params.data_object.transmitters.vertices[tx_ids == uid], - axis=0, - ) - ) - - # Tile transmitters spatially by loop center - tx_tiles = tile_locations( - np.vstack(locations), - n_groups, - method="kmeans", + return tile_large_group_transmitters( + self.params.data_object, + self.params.tile_spatial, ) - receivers_tx_ids = self.params.data_object.tx_id_property.values - tiles = [] - for _t_id, group in enumerate(tx_tiles): - sub_group = [] - for value in group: - receiver_ind = receivers_tx_ids == unique_tile_ids[value] - sub_group.append(np.where(receiver_ind)[0]) - - tiles.append(np.hstack(sub_group)) - - # If number of tiles remaining, brake up receivers spatially per transmitter - while len(tiles) < self.params.tile_spatial: - largest_group = np.argmax([len(tile) for tile in tiles]) - tile = tiles.pop(largest_group) - new_tiles = tile_locations( - self.params.data_object.vertices[tile], - 2, - method="kmeans", - ) - tiles += [tile[new_tiles[0]], tile[new_tiles[1]]] - - return tiles diff --git a/simpeg_drivers/electromagnetics/time_domain_1d/__init__.py b/simpeg_drivers/electromagnetics/time_domain_1d/__init__.py new file mode 100644 index 00000000..735bc24e --- /dev/null +++ b/simpeg_drivers/electromagnetics/time_domain_1d/__init__.py @@ -0,0 +1,18 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + +from .params import ( + TDEM1DForwardOptions, + TDEM1DInversionOptions, +) + +# pylint: disable=unused-import +# flake8: noqa diff --git a/simpeg_drivers/electromagnetics/time_domain_1d/driver.py b/simpeg_drivers/electromagnetics/time_domain_1d/driver.py new file mode 100644 index 00000000..1daac739 --- /dev/null +++ b/simpeg_drivers/electromagnetics/time_domain_1d/driver.py @@ -0,0 +1,134 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + +from __future__ import annotations + +import numpy as np +from discretize import TensorMesh +from discretize.utils import mesh_utils +from geoh5py import Workspace +from geoh5py.shared.merging.drape_model import DrapeModelMerger +from geoh5py.ui_json.ui_json import fetch_active_workspace + +from simpeg_drivers.components.factories import MisfitFactory +from simpeg_drivers.components.meshes import InversionMesh +from simpeg_drivers.driver import InversionDriver +from simpeg_drivers.utils.utils import topo_drape_elevation, xyz_2_drape_model + +from .params import ( + TDEM1DForwardOptions, + TDEM1DInversionOptions, +) + + +class Base1DDriver(InversionDriver): + """Base 1D driver for electromagnetic simulations.""" + + _params_class = None + _validations = None + + def __init__(self, workspace: Workspace, **kwargs): + super().__init__(workspace, **kwargs) + + self.layers_mesh: TensorMesh = self.get_1d_mesh() + self.topo_z_drape = topo_drape_elevation( + self.params.data_object.vertices, + self.inversion_topography.locations, + ) + + @property + def inversion_mesh(self) -> InversionMesh: + """Inversion mesh""" + if getattr(self, "_inversion_mesh", None) is None: + # temp_workspace = Workspace() + with fetch_active_workspace(self.workspace, mode="r+"): + drape_models = [] + temp_work = Workspace() + for part in self.params.data_object.unique_parts: + indices = self.params.data_object.parts == part + drape_models.append( + xyz_2_drape_model( + temp_work, + self.topo_z_drape[indices], + self.layers_mesh.h[0][::-1], + ) + ) + + entity = DrapeModelMerger.create_object( + self.workspace, drape_models, parent=self.out_group + ) + + self._inversion_mesh = InversionMesh( + self.workspace, self.params, entity=entity + ) + self._inversion_mesh.layers_mesh = self.layers_mesh + + return self._inversion_mesh + + def get_1d_mesh(self) -> TensorMesh: + layers_mesh = mesh_utils.mesh_builder_xyz( + np.c_[0], + np.r_[self.params.drape_model.v_cell_size], + padding_distance=[ + [self.params.drape_model.vertical_padding, 0], + ], + depth_core=self.params.drape_model.depth_core, + expansion_factor=self.params.drape_model.expansion_factor, + mesh_type="tensor", + ) + return layers_mesh + + @property + def data_misfit(self): + """The Simpeg.data_misfit class""" + if getattr(self, "_data_misfit", None) is None: + with fetch_active_workspace(self.workspace, mode="r+"): + # Tile locations + tiles = self.get_tiles() + + print(f"Setting up {len(tiles)} tile(s) . . .") + # Build tiled misfits and combine to form global misfit + self._data_misfit, self._sorting, self._ordering = MisfitFactory( + self.params, models=self.models + ).build( + tiles, + self.inversion_data, + self.inversion_mesh, + self.topo_z_drape, + ) + self.models.active_cells = np.ones( + self.inversion_mesh.mesh.n_cells, dtype=bool + ) + print("Done.") + + self.inversion_data.save_data() + self._data_misfit.multipliers = np.asarray( + self._data_misfit.multipliers, dtype=float + ) + + if self.client: + self.distributed_misfits() + + return self._data_misfit + + +class TDEM1DForwardDriver(Base1DDriver): + """Time Domain Electromagnetic forward driver.""" + + _params_class = TDEM1DForwardOptions + _validations = None + + +class TDEM1DInversionDriver(Base1DDriver): + """Time Domain Electromagnetic inversion driver.""" + + _params_class = TDEM1DInversionOptions + _validations = None diff --git a/simpeg_drivers/electromagnetics/time_domain_1d/params.py b/simpeg_drivers/electromagnetics/time_domain_1d/params.py new file mode 100644 index 00000000..f372cb78 --- /dev/null +++ b/simpeg_drivers/electromagnetics/time_domain_1d/params.py @@ -0,0 +1,133 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + +from __future__ import annotations + +from pathlib import Path +from typing import ClassVar, TypeAlias + +from geoh5py.groups import PropertyGroup +from geoh5py.objects import ( + AirborneTEMReceivers, + LargeLoopGroundTEMReceivers, + MovingLoopGroundTEMReceivers, +) + +from simpeg_drivers import assets_path +from simpeg_drivers.params import ( + BaseForwardOptions, + BaseInversionOptions, + DrapeModelOptions, + EMDataMixin, +) + + +Receivers: TypeAlias = ( + MovingLoopGroundTEMReceivers | LargeLoopGroundTEMReceivers | AirborneTEMReceivers +) + + +class TDEM1DForwardOptions(EMDataMixin, BaseForwardOptions): + """ + Time Domain Electromagnetic forward options. + + :param z_channel_bool: Z-component data channel boolean. + :param x_channel_bool: X-component data channel boolean. + :param y_channel_bool: Y-component data channel boolean. + :param model_type: Specify whether the models are provided in resistivity or conductivity. + :param data_units: Units for the TEM data + """ + + name: ClassVar[str] = "Time Domain Electromagnetics Forward" + default_ui_json: ClassVar[Path] = assets_path() / "uijson/tdem1d_forward.ui.json" + + title: str = "Time-domain EM-1D (TEM-1D) Forward" + inversion_type: str = "tdem 1d" + physical_property: str = "conductivity" + + data_object: Receivers + z_channel_bool: bool | None = None + x_channel_bool: None = None + y_channel_bool: None = None + data_units: str = "dB/dt (T/s)" + model_type: str = "Conductivity (S/m)" + drape_model: DrapeModelOptions = DrapeModelOptions( + u_cell_size=10.0, + v_cell_size=10.0, + depth_core=100.0, + horizontal_padding=0.0, + vertical_padding=100.0, + expansion_factor=1.1, + ) + + @property + def unit_conversion(self): + """Return time unit conversion factor.""" + conversion = { + "Seconds (s)": 1.0, + "Milliseconds (ms)": 1e-3, + "Microseconds (us)": 1e-6, + } + return conversion[self.data_object.unit] + + +class TDEM1DInversionOptions(EMDataMixin, BaseInversionOptions): + """ + Time Domain Electromagnetic Inversion options. + + :param z_channel: Z-component data channel. + :param z_uncertainty: Z-component data channel uncertainty. + :param x_channel: X-component data channel. + :param x_uncertainty: X-component data channel uncertainty. + :param y_channel: Y-component data channel. + :param y_uncertainty: Y-component data channel uncertainty. + :param model_type: Specify whether the models are provided in resistivity or conductivity. + :param data_units: Units for the TEM data + """ + + name: ClassVar[str] = "Time Domain Electromagnetics Inversion" + default_ui_json: ClassVar[Path] = assets_path() / "uijson/tdem1d_inversion.ui.json" + + title: str = "Time-domain EM-1D (TEM-1D) Inversion" + inversion_type: str = "tdem 1d" + physical_property: str = "conductivity" + + data_object: Receivers + z_channel: PropertyGroup | None = None + z_uncertainty: PropertyGroup | None = None + x_channel: None = None + x_uncertainty: None = None + y_channel: None = None + y_uncertainty: None = None + length_scale_y: None = None + y_norm: None = None + data_units: str = "dB/dt (T/s)" + model_type: str = "Conductivity (S/m)" + drape_model: DrapeModelOptions = DrapeModelOptions( + u_cell_size=10.0, + v_cell_size=10.0, + depth_core=100.0, + horizontal_padding=0.0, + vertical_padding=100.0, + expansion_factor=1.1, + ) + auto_scale_misfits: bool = False + sens_wts_threshold: float = 100.0 + + @property + def unit_conversion(self): + """Return time unit conversion factor.""" + conversion = { + "Seconds (s)": 1.0, + "Milliseconds (ms)": 1e-3, + "Microseconds (us)": 1e-6, + } + return conversion[self.data_object.unit] diff --git a/simpeg_drivers/params.py b/simpeg_drivers/params.py index 2060c9aa..41747ba8 100644 --- a/simpeg_drivers/params.py +++ b/simpeg_drivers/params.py @@ -18,7 +18,13 @@ import numpy as np from geoapps_utils.driver.data import BaseData -from geoh5py.data import BooleanData, FloatData, NumericData +from geoh5py.data import ( + BooleanData, + DataAssociationEnum, + FloatData, + NumericData, + ReferencedData, +) from geoh5py.groups import PropertyGroup, SimPEGGroup, UIJsonGroup from geoh5py.objects import DrapeModel, Octree, Points from geoh5py.shared.utils import fetch_active_workspace @@ -401,3 +407,52 @@ def property_group_data(self, property_group: PropertyGroup): data[f] = properties[i] # in case of other naming conventions return data + + +class DrapeModelOptions(BaseModel): + """ + Drape model parameters for 2D simulation/inversion]. + + :param u_cell_size: Horizontal cell size for the drape model. + :param v_cell_size: Vertical cell size for the drape model. + :param depth_core: Depth of the core region. + :param horizontal_padding: Horizontal padding. + :param vertical_padding: Vertical padding. + :param expansion_factor: Expansion factor for the drape model. + """ + + u_cell_size: float | None = 25.0 + v_cell_size: float | None = 25.0 + depth_core: float | None = 100.0 + horizontal_padding: float | None = 100.0 + vertical_padding: float | None = 100.0 + expansion_factor: float | None = 1.1 + + +class LineSelectionOptions(BaseModel): + """ + Line selection parameters for 2D inversions. + + :param line_object: Reference data categorizing survey by line ids. + :param line_id: Line identifier for simulation/inversion. + """ + + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) + + line_object: ReferencedData + line_id: int = 1 + + @field_validator("line_object", mode="before") + @classmethod + def validate_cell_association(cls, value): + if value.association is not DataAssociationEnum.CELL: + raise ValueError("Line identifier must be associated with cells.") + return value + + @model_validator(mode="after") + def line_id_referenced(self): + if self.line_id not in self.line_object.values: + raise ValueError("Line id isn't referenced in the line object.") + return self diff --git a/simpeg_drivers/utils/testing.py b/simpeg_drivers/utils/testing.py index 8b203a2c..a171be44 100644 --- a/simpeg_drivers/utils/testing.py +++ b/simpeg_drivers/utils/testing.py @@ -502,6 +502,10 @@ def topo_drape(x, y): anomaly, ) + if "1d" in inversion_type: + model = background * np.ones(mesh.nC) + model[(mesh.cell_centers[:, 2] < 0) & (mesh.cell_centers[:, 2] > -20)] = anomaly + model[~active] = np.nan model = entity.add_data({"model": {"values": model}}) geoh5.close() diff --git a/simpeg_drivers/utils/tile_estimate.py b/simpeg_drivers/utils/tile_estimate.py index a22b7374..11b9e1a0 100644 --- a/simpeg_drivers/utils/tile_estimate.py +++ b/simpeg_drivers/utils/tile_estimate.py @@ -106,7 +106,7 @@ def get_results(self, max_tiles: int = 13) -> dict: self.driver.params.tile_spatial = int(count) sim, _, _, mapping = MisfitFactory.create_nested_simulation( self.driver.inversion_data, - self.mesh, + self.driver.inversion_mesh, None, self.active_cells, tiles[ind], diff --git a/simpeg_drivers/utils/utils.py b/simpeg_drivers/utils/utils.py index 0d1ce028..3075b4e4 100644 --- a/simpeg_drivers/utils/utils.py +++ b/simpeg_drivers/utils/utils.py @@ -287,25 +287,47 @@ def drape_2_tensor(drape_model: DrapeModel, return_sorting: bool = False) -> tup """ prisms = drape_model.prisms layers = drape_model.layers - z = np.append(np.unique(layers[:, 2]), prisms[:, 2].max()) - x = compute_alongline_distance(prisms[:, :2]) + + # Deal with ghost points + ghosts = prisms[:, -1] == 1 + prisms = prisms[~ghosts, :] + + nu_layers = np.unique(prisms[:, -1]) + if len(nu_layers) > 1: + raise ValueError( + "Drape model conversion to TensorMesh must have uniform number of layers." + ) + + n_layers = nu_layers[0].astype(int) + filt_layers = ghosts[layers[:, 0].astype(int)] + layers = layers[~filt_layers, :] + + hz = np.r_[ + prisms[0, 2] - layers[0, 2], + -np.diff(layers[:n_layers, 2]), + ][::-1] + + x = compute_alongline_distance(prisms[:, :2], ordered=False) dx = np.diff(x) - end_core = [np.argmin(dx.round(1)), len(dx) - np.argmin(dx[::-1].round(1))] - core = dx[end_core[0]] - exp_fact = dx[0] / dx[1] - cell_width = np.r_[ - core * exp_fact ** np.arange(end_core[0], 0, -1), - core * np.ones(end_core[1] - end_core[0] + 1), - core * exp_fact ** np.arange(1, len(dx) - end_core[1] + 1), - ] - h = [cell_width, np.diff(z)] - origin = [-cell_width[: end_core[0]].sum(), layers[:, 2].min()] - mesh = TensorMesh(h, origin) + cell_width = np.r_[dx[0], (dx[:-1] + dx[1:]) / 2.0, dx[-1]] + h = [cell_width, hz] + origin = [0, layers[:, 2].min()] + mesh = TensorMesh(h, origin=origin) if return_sorting: sorting = np.arange(mesh.n_cells) sorting = sorting.reshape(mesh.shape_cells[1], mesh.shape_cells[0], order="C") - sorting = sorting[::-1].T.flatten() + sorting = np.argsort(sorting[::-1].T.flatten()) + + # Skip indices for ghost points + count = -1 + for ghost in ghosts: + if ghost: + sorting[sorting > count] += 1 + count += 1 + else: + count += n_layers + return (mesh, sorting) else: return mesh @@ -350,15 +372,13 @@ def get_drape_model( :param locations: Location points. :param h: Cell size(s) for the core mesh. :param depth_core: Depth of core mesh below locs. - :param pads: len(6) Padding distances [W, E, N, S, Down, Up] + :param pads: len(4) Padding distances [W, E, Down, Up] :param expansion_factor: Expansion factor for padding cells. :param return_colocated_mesh: If true return TensorMesh. :param return_sorting: If true, return the indices required to map values stored in the TensorMesh to the drape model. - :return object_out: Output block model. """ - locations = truncate_locs_depths(locations, depth_core) depth_core = minimum_depth_core(locations, depth_core, h[1]) order = traveling_salesman(locations) @@ -391,40 +411,12 @@ def get_drape_model( expansion_factor=expansion_factor, mesh_type="tensor", ) - - cc = mesh.cell_centers - hz = mesh.h[1] - top = np.max(cc[:, 1].reshape(len(hz), -1)[:, 0] + (hz / 2)) - bottoms = cc[:, 1].reshape(len(hz), -1)[:, 0] - (hz / 2) - n_layers = len(bottoms) - - prisms = [] - layers = [] - indices = [] - index = 0 - center_xy = np.c_[x_interp(mesh.cell_centers_x), y_interp(mesh.cell_centers_x)] - for i, (x_center, y_center) in enumerate(center_xy): - prisms.append([float(x_center), float(y_center), top, i * n_layers, n_layers]) - for k, b in enumerate(bottoms): - layers.append([i, k, b]) - indices.append(index) - index += 1 - - prisms = np.vstack(prisms) - layers = np.vstack(layers) - layers[:, 2] = layers[:, 2][::-1] - - model = DrapeModel.create( - workspace, layers=layers, name=name, prisms=prisms, parent=parent - ) - model.add_data( - { - "indices": { - "values": np.array(indices, dtype=np.int32), - "association": "CELL", - } - } - ) + hz = mesh.h[1][::-1] + top = np.ones_like(mesh.cell_centers_x) * (mesh.origin[1] + np.sum(hz)) + locations_top = np.c_[ + x_interp(mesh.cell_centers_x), y_interp(mesh.cell_centers_x), top + ] + model = xyz_2_drape_model(workspace, locations_top, hz, name, parent) val = [model] if return_colocated_mesh: val.append(mesh) @@ -461,6 +453,51 @@ def get_inversion_output(h5file: str | Workspace, inversion_group: str | UUID): return out +def xyz_2_drape_model( + workspace, locations, depths, name=None, parent=None +) -> DrapeModel: + """ + Convert a list of cell tops and layer depths to a DrapeModel object. + + :param workspace: Workspace object + :param locations: n x 3 array of cell centers [x, y, z_top] + :param depths: n x 1 array of layer depths + :param name: Name of the new DrapeModel object + :param parent: Parent group for the new DrapeModel object + + :returns: DrapeModel object + """ + n_layers = len(depths) + prisms = [] + layers = [] + indices = [] + index = 0 + + for i, (x_center, y_center, z_top) in enumerate(locations): + prisms.append([float(x_center), float(y_center), z_top, i * n_layers, n_layers]) + bottom = z_top + for k, h in enumerate(depths): + bottom -= h + layers.append([i, k, bottom]) + indices.append(index) + index += 1 + + prisms = np.vstack(prisms) + layers = np.vstack(layers) + model = DrapeModel.create( + workspace, layers=layers, name=name, prisms=prisms, parent=parent + ) + model.add_data( + { + "indices": { + "values": np.array(indices, dtype=np.int32), + "association": "CELL", + } + } + ) + return model + + def tile_locations( locations, n_tiles, @@ -696,14 +733,6 @@ def active_from_xyz( mesh_dim = 2 if isinstance(mesh, DrapeModel) else 3 locations = mesh.centroids.copy() - if method == "linear": - delaunay_2d = Delaunay(topo[:, :-1]) - z_interpolate = LinearNDInterpolator(delaunay_2d, topo[:, -1]) - elif method == "nearest": - z_interpolate = NearestNDInterpolator(topo[:, :-1], topo[:, -1]) - else: - raise ValueError("Method must be 'linear', or 'nearest'") - if mesh_dim == 2: z_offset = cell_size_z(mesh) / 2.0 else: @@ -719,7 +748,37 @@ def active_from_xyz( else: raise ValueError("'grid_reference' must be one of 'center', 'top', or 'bottom'") - unique_locs, inds = np.unique(locations[:, :2].round(), axis=0, return_inverse=True) + z_locations = topo_drape_elevation(locations, topo, method=method) + # fill_nan(locations, z_locations, filler=topo[:, -1]) + + # Return the active cell array + return locations[:, -1] < z_locations[:, -1] + + +def topo_drape_elevation(locations, topo, method="linear") -> np.ndarray: + """ + Get draped elevation at locations. + + Values are extrapolated to nearest neighbour if requested outside the + convex hull of the input topography points. + + :param locations: n x 3 array of locations + :param topo: n x 3 array of topography points + :param method: Type of topography interpolation, either 'linear' or 'nearest' + + :return: An array of z elevations for every input locations. + """ + if method == "linear": + delaunay_2d = Delaunay(topo[:, :-1]) + z_interpolate = LinearNDInterpolator(delaunay_2d, topo[:, -1]) + elif method == "nearest": + z_interpolate = NearestNDInterpolator(topo[:, :-1], topo[:, -1]) + else: + raise ValueError("Method must be 'linear', or 'nearest'") + + unique_locs, inds = np.unique( + locations[:, :-1].round(), axis=0, return_inverse=True + ) z_locations = z_interpolate(unique_locs)[inds] # Apply nearest neighbour if in extrapolation @@ -729,10 +788,7 @@ def active_from_xyz( _, ind = tree.query(locations[ind_nan, :]) z_locations[ind_nan] = topo[ind, -1] - # fill_nan(locations, z_locations, filler=topo[:, -1]) - - # Return the active cell array - return locations[:, -1] < z_locations + return np.c_[locations[:, :-1], z_locations] def truncate_locs_depths(locs: np.ndarray, depth_core: float) -> np.ndarray: diff --git a/tests/run_tests/driver_airborne_tem_1d_test.py b/tests/run_tests/driver_airborne_tem_1d_test.py new file mode 100644 index 00000000..e38b6714 --- /dev/null +++ b/tests/run_tests/driver_airborne_tem_1d_test.py @@ -0,0 +1,173 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +from geoh5py.groups import SimPEGGroup +from geoh5py.workspace import Workspace +from pytest import raises + +from simpeg_drivers.electromagnetics.time_domain_1d.driver import ( + TDEM1DForwardDriver, + TDEM1DInversionDriver, +) +from simpeg_drivers.electromagnetics.time_domain_1d.params import ( + TDEM1DForwardOptions, + TDEM1DInversionOptions, +) +from simpeg_drivers.params import ActiveCellsOptions +from simpeg_drivers.utils.testing import check_target, setup_inversion_workspace +from simpeg_drivers.utils.utils import get_inversion_output + + +# To test the full run and validate the inversion. +# Move this file out of the test directory and run. +target_run = {"data_norm": 6.15712e-10, "phi_d": 110, "phi_m": 89800} + + +def test_airborne_tem_1d_fwr_run( + tmp_path: Path, + n_grid_points=3, + refinement=(2,), + cell_size=(20.0, 20.0, 20.0), +): + # Run the forward + geoh5, _, model, survey, topography = setup_inversion_workspace( + tmp_path, + background=0.1, + anomaly=1.0, + n_electrodes=n_grid_points, + n_lines=n_grid_points, + cell_size=cell_size, + refinement=refinement, + inversion_type="airborne_tem 1d", + drape_height=10.0, + padding_distance=400.0, + flatten=False, + ) + params = TDEM1DForwardOptions( + geoh5=geoh5, + mesh=model.parent, + active_cells=ActiveCellsOptions(topography_object=topography), + data_object=survey, + starting_model=model, + z_channel_bool=True, + solver_type="Mumps", + ) + + fwr_driver = TDEM1DForwardDriver(params) + + fwr_driver.run() + + +def test_airborne_tem_1d_run(tmp_path: Path, max_iterations=1, pytest=True): + workpath = tmp_path / "inversion_test.ui.geoh5" + if pytest: + workpath = ( + tmp_path.parent + / "test_airborne_tem_1d_fwr_run0" + / "inversion_test.ui.geoh5" + ) + + with Workspace(workpath) as geoh5: + survey = next( + child + for child in geoh5.get_entity("Airborne_rx") + if not isinstance(child.parent, SimPEGGroup) + ) + mesh = geoh5.get_entity("mesh")[0] + topography = geoh5.get_entity("topography")[0] + data = {} + uncertainties = {} + components = { + "z": "dBzdt", + } + + for comp, cname in components.items(): + data[cname] = [] + uncertainties[f"{cname} uncertainties"] = [] + for ii, _ in enumerate(survey.channels): + data_entity = geoh5.get_entity(f"Iteration_0_{comp}_[{ii}]")[0].copy( + parent=survey + ) + data[cname].append(data_entity) + + uncert = survey.add_data( + { + f"uncertainty_{comp}_[{ii}]": { + "values": np.ones_like(data_entity.values) + * (np.percentile(np.abs(data_entity.values), 10) / 2.0) + } + } + ) + uncertainties[f"{cname} uncertainties"].append(uncert) + + survey.add_components_data(data) + survey.add_components_data(uncertainties) + + data_kwargs = {} + for comp in components: + data_kwargs[f"{comp}_channel"] = survey.fetch_property_group( + name=f"dB{comp}dt" + ) + data_kwargs[f"{comp}_uncertainty"] = survey.fetch_property_group( + name=f"dB{comp}dt uncertainties" + ) + + orig_dBzdt = geoh5.get_entity("Iteration_0_z_[0]")[0].values + + # Run the inverse + params = TDEM1DInversionOptions( + geoh5=geoh5, + mesh=mesh, + active_cells=ActiveCellsOptions(topography_object=topography), + data_object=survey, + starting_model=5e-1, + reference_model=1e-1, + s_norm=0.0, + x_norm=2.0, + z_norm=0.0, + length_scale_x=1e-4, + lower_bound=1e-4, + upper_bound=1e2, + max_global_iterations=max_iterations, + initial_beta_ratio=1e-2, + **data_kwargs, + ) + params.write_ui_json(path=tmp_path / "Inv_run.ui.json") + + driver = TDEM1DInversionDriver(params) + driver.run() + + with geoh5.open() as run_ws: + output = get_inversion_output( + driver.params.geoh5.h5file, driver.params.out_group.uid + ) + output["data"] = orig_dBzdt + if pytest: + check_target(output, target_run, tolerance=0.1) + nan_ind = np.isnan(run_ws.get_entity("Iteration_0_model")[0].values) + inactive_ind = run_ws.get_entity("active_cells")[0].values == 0 + assert np.all(nan_ind == inactive_ind) + + +if __name__ == "__main__": + # Full run + test_airborne_tem_1d_fwr_run( + Path("./"), n_grid_points=5, cell_size=(5.0, 5.0, 5.0), refinement=(0, 0, 4) + ) + test_airborne_tem_1d_run( + Path("./"), + max_iterations=15, + pytest=False, + ) diff --git a/tests/run_tests/driver_dc_2d_test.py b/tests/run_tests/driver_dc_2d_test.py index 042685ef..69a789a9 100644 --- a/tests/run_tests/driver_dc_2d_test.py +++ b/tests/run_tests/driver_dc_2d_test.py @@ -25,8 +25,11 @@ DC2DForwardOptions, DC2DInversionOptions, ) -from simpeg_drivers.electricals.params import DrapeModelOptions, LineSelectionOptions -from simpeg_drivers.params import ActiveCellsOptions +from simpeg_drivers.params import ( + ActiveCellsOptions, + DrapeModelOptions, + LineSelectionOptions, +) from simpeg_drivers.utils.testing import check_target, setup_inversion_workspace from simpeg_drivers.utils.utils import get_inversion_output diff --git a/tests/run_tests/driver_dc_b2d_test.py b/tests/run_tests/driver_dc_b2d_test.py index 41f16ac7..160dc80b 100644 --- a/tests/run_tests/driver_dc_b2d_test.py +++ b/tests/run_tests/driver_dc_b2d_test.py @@ -26,11 +26,13 @@ DCBatch2DInversionOptions, ) from simpeg_drivers.electricals.params import ( - DrapeModelOptions, FileControlOptions, +) +from simpeg_drivers.params import ( + ActiveCellsOptions, + DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import ActiveCellsOptions from simpeg_drivers.utils.testing import check_target, setup_inversion_workspace from simpeg_drivers.utils.utils import get_inversion_output diff --git a/tests/run_tests/driver_ip_2d_test.py b/tests/run_tests/driver_ip_2d_test.py index 0ff4bb1b..c7ccb03c 100644 --- a/tests/run_tests/driver_ip_2d_test.py +++ b/tests/run_tests/driver_ip_2d_test.py @@ -23,8 +23,7 @@ IP2DForwardDriver, IP2DInversionDriver, ) -from simpeg_drivers.electricals.params import DrapeModelOptions, LineSelectionOptions -from simpeg_drivers.params import ActiveCellsOptions +from simpeg_drivers.params import ActiveCellsOptions, LineSelectionOptions from simpeg_drivers.utils.testing import check_target, setup_inversion_workspace from simpeg_drivers.utils.utils import get_inversion_output diff --git a/tests/run_tests/driver_ip_b2d_test.py b/tests/run_tests/driver_ip_b2d_test.py index b54297d0..2209b94b 100644 --- a/tests/run_tests/driver_ip_b2d_test.py +++ b/tests/run_tests/driver_ip_b2d_test.py @@ -25,11 +25,13 @@ IPBatch2DInversionOptions, ) from simpeg_drivers.electricals.params import ( - DrapeModelOptions, FileControlOptions, +) +from simpeg_drivers.params import ( + ActiveCellsOptions, + DrapeModelOptions, LineSelectionOptions, ) -from simpeg_drivers.params import ActiveCellsOptions from simpeg_drivers.utils.testing import check_target, setup_inversion_workspace from simpeg_drivers.utils.utils import get_inversion_output