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 3c868f93..ffb83a2d 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: dc38e6c2bc010e4f5f4a6d873c48f5299990b0dfde18a7539d3660d3062156b8 +# input_hash: 66e9913a5ef1fb1332138c652310f05691ea42399acda2f2936b5613d53c3e03 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.6.10=py310h89163eb_0 + - coverage=7.6.11=py310h89163eb_0 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py310ha75aee5_0 - dask-core=2024.6.2=pyhd8ed1ab_0 @@ -102,26 +102,26 @@ dependencies: - jupyterlab_pygments=0.3.0=pyhd8ed1ab_2 - jupyterlab_server=2.27.3=pyhd8ed1ab_1 - jupyterlab_widgets=1.1.11=pyhd8ed1ab_0 - - jupytext=1.16.6=pyh80e38bb_0 + - jupytext=1.16.7=pyhbbac1ac_0 - keyutils=1.6.1=h166bdaf_0 - kiwisolver=1.4.7=py310h3788b33_0 - krb5=1.21.3=h659f571_0 - latexcodec=2.0.1=pyh9f0ad1d_0 - - lcms2=2.16=hb7c19ff_0 + - lcms2=2.17=h717163a_0 - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - libaec=1.1.3=h59595ed_0 - - libblas=3.9.0=20_linux64_mkl + - libblas=3.9.0=28_h2556b6b_mkl - libbrotlicommon=1.1.0=hb9d3cd8_2 - libbrotlidec=1.1.0=hb9d3cd8_2 - libbrotlienc=1.1.0=hb9d3cd8_2 - - libcblas=3.9.0=20_linux64_mkl + - libcblas=3.9.0=28_h372d94f_mkl - libcurl=8.11.1=h332b0f4_0 - libdeflate=1.23=h4ddbbb0_0 - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libffi=3.4.2=h7f98852_5 + - libffi=3.4.6=h2dba641_0 - libgcc=14.2.0=h77fa898_1 - libgcc-ng=14.2.0=h69a702a_1 - libgfortran=14.2.0=h69a702a_1 @@ -129,12 +129,13 @@ dependencies: - libhwloc=2.11.1=default_hecaa2ac_1000 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_mkl + - liblapack=3.9.0=28_hc41d3b0_mkl - libllvm15=15.0.7=hb3ce162_4 - liblzma=5.6.4=hb9d3cd8_0 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.46=h943b412_0 + - libscotch=7.0.6=hea33c07_1 - libsodium=1.0.20=h4ab18f5_0 - libsqlite=3.48.0=hee588c1_1 - libssh2=1.11.1=hf672d98_0 @@ -158,11 +159,14 @@ dependencies: - mccabe=0.7.0=pyhd8ed1ab_1 - mdit-py-plugins=0.4.2=pyhd8ed1ab_1 - mdurl=0.1.2=pyhd8ed1ab_1 + - metis=5.1.0=hd0bcaf9_1007 - mistune=3.1.1=pyhd8ed1ab_0 - - mkl=2023.2.0=h84fe81f_50496 + - mkl=2024.2.2=ha957f24_16 - msgpack-python=1.1.0=py310h3788b33_0 + - mumps-include=5.7.3=ha770c72_7 + - mumps-seq=5.7.3=h2064c95_7 - munkres=1.1.4=pyh9f0ad1d_0 - - myst-nb=1.1.2=pyhd8ed1ab_1 + - myst-nb=1.2.0=pyh29332c3_0 - myst-parser=1.0.0=pyhd8ed1ab_0 - nbclient=0.10.2=pyhd8ed1ab_0 - nbconvert=7.16.6=hb482800_0 @@ -173,7 +177,7 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_1 - notebook=7.3.2=pyhd8ed1ab_0 - notebook-shim=0.2.4=pyhd8ed1ab_1 - - numba=0.61.0=py310h699fe88_0 + - numba=0.61.0=py310h699fe88_1 - numcodecs=0.13.1=py310h5eaa309_0 - numpy=1.26.4=py310hb13e2d6_0 - openjpeg=2.5.3=h5fbd93e_0 @@ -181,14 +185,14 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=24.2=pyhd8ed1ab_2 - pandas=2.2.3=py310h5eaa309_1 - - pandoc=3.6.2=ha770c72_0 + - pandoc=3.6.3=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.4=pyhd8ed1ab_1 - partd=1.4.2=pyhd8ed1ab_0 - pexpect=4.9.0=pyhd8ed1ab_1 - pickleshare=0.7.5=pyhd8ed1ab_1004 - pillow=10.3.0=py310hebfe307_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - platformdirs=4.3.6=pyhd8ed1ab_1 - pluggy=1.5.0=pyhd8ed1ab_1 @@ -204,11 +208,10 @@ dependencies: - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py310h505e2c1_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - - pydiso=0.1.2=py310h7b68af5_0 + - pydiso=0.1.2=py310h69a6472_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.4=pyh29332c3_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyha55dd90_7 - pytest=8.3.4=pyhd8ed1ab_1 @@ -217,6 +220,7 @@ dependencies: - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 + - python-mumps=0.0.3=py310h6410a28_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 diff --git a/environments/py-3.10-linux-64.conda.lock.yml b/environments/py-3.10-linux-64.conda.lock.yml index b81fda9a..ef6da019 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: dc38e6c2bc010e4f5f4a6d873c48f5299990b0dfde18a7539d3660d3062156b8 +# input_hash: 66e9913a5ef1fb1332138c652310f05691ea42399acda2f2936b5613d53c3e03 channels: - conda-forge @@ -47,21 +47,21 @@ dependencies: - keyutils=1.6.1=h166bdaf_0 - kiwisolver=1.4.7=py310h3788b33_0 - krb5=1.21.3=h659f571_0 - - lcms2=2.16=hb7c19ff_0 + - lcms2=2.17=h717163a_0 - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - libaec=1.1.3=h59595ed_0 - - libblas=3.9.0=20_linux64_mkl + - libblas=3.9.0=28_h2556b6b_mkl - libbrotlicommon=1.1.0=hb9d3cd8_2 - libbrotlidec=1.1.0=hb9d3cd8_2 - libbrotlienc=1.1.0=hb9d3cd8_2 - - libcblas=3.9.0=20_linux64_mkl + - libcblas=3.9.0=28_h372d94f_mkl - libcurl=8.11.1=h332b0f4_0 - libdeflate=1.23=h4ddbbb0_0 - libdlf=0.3.0=pyhd8ed1ab_1 - libedit=3.1.20250104=pl5321h7949ede_0 - libev=4.33=hd590300_2 - - libffi=3.4.2=h7f98852_5 + - libffi=3.4.6=h2dba641_0 - libgcc=14.2.0=h77fa898_1 - libgcc-ng=14.2.0=h69a702a_1 - libgfortran=14.2.0=h69a702a_1 @@ -69,12 +69,13 @@ dependencies: - libhwloc=2.11.1=default_hecaa2ac_1000 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_mkl + - liblapack=3.9.0=28_hc41d3b0_mkl - libllvm15=15.0.7=hb3ce162_4 - liblzma=5.6.4=hb9d3cd8_0 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.46=h943b412_0 + - libscotch=7.0.6=hea33c07_1 - libsqlite=3.48.0=hee588c1_1 - libssh2=1.11.1=hf672d98_0 - libstdcxx=14.2.0=hc0a3c3a_1 @@ -91,11 +92,14 @@ dependencies: - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py310h89163eb_1 - matplotlib-base=3.8.4=py310hef631a5_2 - - mkl=2023.2.0=h84fe81f_50496 + - metis=5.1.0=hd0bcaf9_1007 + - mkl=2024.2.2=ha957f24_16 - msgpack-python=1.1.0=py310h3788b33_0 + - mumps-include=5.7.3=ha770c72_7 + - mumps-seq=5.7.3=h2064c95_7 - munkres=1.1.4=pyh9f0ad1d_0 - ncurses=6.5=h2d0b736_3 - - numba=0.61.0=py310h699fe88_0 + - numba=0.61.0=py310h699fe88_1 - numcodecs=0.13.1=py310h5eaa309_0 - numpy=1.26.4=py310hb13e2d6_0 - openjpeg=2.5.3=h5fbd93e_0 @@ -104,19 +108,19 @@ dependencies: - pandas=2.2.3=py310h5eaa309_1 - partd=1.4.2=pyhd8ed1ab_0 - pillow=10.3.0=py310hebfe307_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - psutil=6.1.1=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 - - pydiso=0.1.2=py310h7b68af5_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pydiso=0.1.2=py310h69a6472_0 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - 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=2023.4=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 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 46ceb2ce..d385b925 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: cd12157f221db0e319212cba17a768833dc85bfd4b99015876cdcc60f9174a20 +# input_hash: 916ddd337b49f22f16f37fc65fce871f2377ea96099a23688152bfc4810be3aa channels: - conda-forge @@ -37,7 +37,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py310hc19bc0b_0 - - coverage=7.6.10=py310h38315fa_0 + - coverage=7.6.11=py310h38315fa_0 - cpython=3.10.16=py310hd8ed1ab_1 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py310ha8f682b_0 @@ -74,7 +74,7 @@ dependencies: - importlib_metadata=8.6.1=hd8ed1ab_0 - importlib_resources=6.5.2=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_1 - - intel-openmp=2023.2.0=h57928b3_50497 + - intel-openmp=2024.2.1=h57928b3_1083 - ipykernel=6.29.5=pyh4bbf305_0 - ipython=8.32.0=pyh9ab4c32_0 - ipython_genutils=0.2.0=pyhd8ed1ab_2 @@ -101,26 +101,26 @@ dependencies: - jupyterlab_pygments=0.3.0=pyhd8ed1ab_2 - jupyterlab_server=2.27.3=pyhd8ed1ab_1 - jupyterlab_widgets=1.1.11=pyhd8ed1ab_0 - - jupytext=1.16.6=pyh80e38bb_0 + - jupytext=1.16.7=pyhbbac1ac_0 - kiwisolver=1.4.7=py310hc19bc0b_0 - krb5=1.21.3=hdf4eb48_0 - latexcodec=2.0.1=pyh9f0ad1d_0 - - lcms2=2.16=h67d730c_0 + - lcms2=2.17=hbcf6048_0 - lerc=4.0.0=h63175ca_0 - libaec=1.1.3=h63175ca_0 - - libblas=3.9.0=20_win64_mkl + - libblas=3.9.0=28_h576b46c_mkl - libbrotlicommon=1.1.0=h2466b09_2 - libbrotlidec=1.1.0=h2466b09_2 - libbrotlienc=1.1.0=h2466b09_2 - - libcblas=3.9.0=20_win64_mkl + - libcblas=3.9.0=28_h7ad3364_mkl - libcurl=8.11.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libffi=3.4.2=h8ffe710_5 + - libffi=3.4.6=h537db12_0 - libhwloc=2.11.1=default_h8125262_1000 - libiconv=1.17=hcfcfb64_2 - libjpeg-turbo=3.0.0=hcfcfb64_1 - - liblapack=3.9.0=20_win64_mkl + - liblapack=3.9.0=28_hacfb0e4_mkl - liblzma=5.6.4=h2466b09_0 - libpng=1.6.46=had7236b_0 - libsodium=1.0.20=hc70643c_0 @@ -132,6 +132,7 @@ dependencies: - libxml2=2.13.5=he286e8c_1 - libzlib=1.3.1=h2466b09_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 + - llvm-openmp=19.1.7=h30eaf37_0 - llvmlite=0.44.0=py310h0288bfe_0 - locket=1.0.0=pyhd8ed1ab_0 - m2w64-gcc-libgfortran=5.3.0=6 @@ -147,11 +148,12 @@ dependencies: - mdit-py-plugins=0.4.2=pyhd8ed1ab_1 - mdurl=0.1.2=pyhd8ed1ab_1 - mistune=3.1.1=pyhd8ed1ab_0 - - mkl=2023.2.0=h6a75c08_50497 + - mkl=2024.2.2=h66d3029_15 - msgpack-python=1.1.0=py310hc19bc0b_0 - msys2-conda-epoch=20160418=1 + - mumps-seq=5.7.3=h9576071_7 - munkres=1.1.4=pyh9f0ad1d_0 - - myst-nb=1.1.2=pyhd8ed1ab_1 + - myst-nb=1.2.0=pyh29332c3_0 - myst-parser=1.0.0=pyhd8ed1ab_0 - nbclient=0.10.2=pyhd8ed1ab_0 - nbconvert=7.16.6=hb482800_0 @@ -161,7 +163,7 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_1 - notebook=7.3.2=pyhd8ed1ab_0 - notebook-shim=0.2.4=pyhd8ed1ab_1 - - numba=0.61.0=py310h7793332_0 + - numba=0.61.0=py310h7793332_1 - numcodecs=0.13.1=py310hb4db72f_0 - numpy=1.26.4=py310hf667824_0 - openjpeg=2.5.3=h4d64b90_0 @@ -169,13 +171,13 @@ dependencies: - overrides=7.7.0=pyhd8ed1ab_1 - packaging=24.2=pyhd8ed1ab_2 - pandas=2.2.3=py310hb4db72f_1 - - pandoc=3.6.2=h57928b3_0 + - pandoc=3.6.3=h57928b3_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.4=pyhd8ed1ab_1 - partd=1.4.2=pyhd8ed1ab_0 - pickleshare=0.7.5=pyhd8ed1ab_1004 - pillow=10.3.0=py310h3e38d90_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - platformdirs=4.3.6=pyhd8ed1ab_1 - pluggy=1.5.0=pyhd8ed1ab_1 @@ -191,11 +193,10 @@ dependencies: - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py310hc226416_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - - pydiso=0.1.2=py310h5da8fee_0 + - pydiso=0.1.2=py310h8f92c26_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.4=pyh29332c3_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyh09c184e_7 - pytest=8.3.4=pyhd8ed1ab_1 @@ -204,6 +205,7 @@ dependencies: - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 + - python-mumps=0.0.3=py310hb64895d_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 diff --git a/environments/py-3.10-win-64.conda.lock.yml b/environments/py-3.10-win-64.conda.lock.yml index 07c6f95f..2edadb63 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: cd12157f221db0e319212cba17a768833dc85bfd4b99015876cdcc60f9174a20 +# input_hash: 916ddd337b49f22f16f37fc65fce871f2377ea96099a23688152bfc4810be3aa channels: - conda-forge @@ -39,27 +39,27 @@ dependencies: - hyperframe=6.1.0=pyhd8ed1ab_0 - importlib-metadata=8.6.1=pyha770c72_0 - importlib_metadata=8.6.1=hd8ed1ab_0 - - intel-openmp=2023.2.0=h57928b3_50497 + - intel-openmp=2024.2.1=h57928b3_1083 - jinja2=3.1.5=pyhd8ed1ab_0 - joblib=1.4.2=pyhd8ed1ab_1 - kiwisolver=1.4.7=py310hc19bc0b_0 - krb5=1.21.3=hdf4eb48_0 - - lcms2=2.16=h67d730c_0 + - lcms2=2.17=hbcf6048_0 - lerc=4.0.0=h63175ca_0 - libaec=1.1.3=h63175ca_0 - - libblas=3.9.0=20_win64_mkl + - libblas=3.9.0=28_h576b46c_mkl - libbrotlicommon=1.1.0=h2466b09_2 - libbrotlidec=1.1.0=h2466b09_2 - libbrotlienc=1.1.0=h2466b09_2 - - libcblas=3.9.0=20_win64_mkl + - libcblas=3.9.0=28_h7ad3364_mkl - libcurl=8.11.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - - libffi=3.4.2=h8ffe710_5 + - libffi=3.4.6=h537db12_0 - libhwloc=2.11.1=default_h8125262_1000 - libiconv=1.17=hcfcfb64_2 - libjpeg-turbo=3.0.0=hcfcfb64_1 - - liblapack=3.9.0=20_win64_mkl + - liblapack=3.9.0=28_hacfb0e4_mkl - liblzma=5.6.4=h2466b09_0 - libpng=1.6.46=had7236b_0 - libsqlite=3.48.0=h67fdade_1 @@ -69,6 +69,7 @@ dependencies: - libxcb=1.16=h013a479_1 - libxml2=2.13.5=he286e8c_1 - libzlib=1.3.1=h2466b09_2 + - llvm-openmp=19.1.7=h30eaf37_0 - llvmlite=0.44.0=py310h0288bfe_0 - locket=1.0.0=pyhd8ed1ab_0 - m2w64-gcc-libgfortran=5.3.0=6 @@ -78,11 +79,12 @@ dependencies: - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 - markupsafe=3.0.2=py310h38315fa_1 - matplotlib-base=3.8.4=py310hadb10a8_2 - - mkl=2023.2.0=h6a75c08_50497 + - mkl=2024.2.2=h66d3029_15 - msgpack-python=1.1.0=py310hc19bc0b_0 - msys2-conda-epoch=20160418=1 + - mumps-seq=5.7.3=h9576071_7 - munkres=1.1.4=pyh9f0ad1d_0 - - numba=0.61.0=py310h7793332_0 + - numba=0.61.0=py310h7793332_1 - numcodecs=0.13.1=py310hb4db72f_0 - numpy=1.26.4=py310hf667824_0 - openjpeg=2.5.3=h4d64b90_0 @@ -91,20 +93,20 @@ dependencies: - pandas=2.2.3=py310hb4db72f_1 - partd=1.4.2=pyhd8ed1ab_0 - pillow=10.3.0=py310h3e38d90_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - psutil=6.1.1=py310ha8f682b_0 - pthread-stubs=0.4=hcd874cb_1001 - pthreads-win32=2.9.1=h2466b09_4 - pycparser=2.22=pyh29332c3_1 - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py310hc226416_0 - - pydiso=0.1.2=py310h5da8fee_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pydiso=0.1.2=py310h8f92c26_0 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - 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=2023.4=pyhd8ed1ab_0 - python_abi=3.10=5_cp310 - pytz=2024.1=pyhd8ed1ab_0 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 2dfcefa2..f86d1f8c 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: fdeb51cc55c36bafe8a4c5fab310126b6b9a6b88e10785b039488ee54fb0b7ae +# input_hash: 659549a3414ad3a33dccc8e91d8a2206cfb37024a4ef2c8078c3417f15b3e8d4 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.6.10=py311h2dc5d0c_0 + - coverage=7.6.11=py311h2dc5d0c_0 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py311h9ecbd09_0 - dask-core=2024.6.2=pyhd8ed1ab_0 @@ -103,27 +103,27 @@ dependencies: - jupyterlab_pygments=0.3.0=pyhd8ed1ab_2 - jupyterlab_server=2.27.3=pyhd8ed1ab_1 - jupyterlab_widgets=1.1.11=pyhd8ed1ab_0 - - jupytext=1.16.6=pyh80e38bb_0 + - jupytext=1.16.7=pyhbbac1ac_0 - keyutils=1.6.1=h166bdaf_0 - kiwisolver=1.4.7=py311hd18a35c_0 - krb5=1.21.3=h659f571_0 - latexcodec=2.0.1=pyh9f0ad1d_0 - - lcms2=2.16=hb7c19ff_0 + - lcms2=2.17=h717163a_0 - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - libaec=1.1.3=h59595ed_0 - - libblas=3.9.0=20_linux64_mkl + - libblas=3.9.0=28_h2556b6b_mkl - libbrotlicommon=1.1.0=hb9d3cd8_2 - libbrotlidec=1.1.0=hb9d3cd8_2 - libbrotlienc=1.1.0=hb9d3cd8_2 - - libcblas=3.9.0=20_linux64_mkl + - libcblas=3.9.0=28_h372d94f_mkl - libcurl=8.11.1=h332b0f4_0 - libdeflate=1.23=h4ddbbb0_0 - 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.2=h7f98852_5 + - libffi=3.4.6=h2dba641_0 - libgcc=14.2.0=h77fa898_1 - libgcc-ng=14.2.0=h69a702a_1 - libgfortran=14.2.0=h69a702a_1 @@ -131,12 +131,13 @@ dependencies: - libhwloc=2.11.1=default_hecaa2ac_1000 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_mkl + - liblapack=3.9.0=28_hc41d3b0_mkl - libllvm15=15.0.7=hb3ce162_4 - liblzma=5.6.4=hb9d3cd8_0 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.46=h943b412_0 + - libscotch=7.0.6=hea33c07_1 - libsodium=1.0.20=h4ab18f5_0 - libsqlite=3.48.0=hee588c1_1 - libssh2=1.11.1=hf672d98_0 @@ -160,11 +161,14 @@ dependencies: - mccabe=0.7.0=pyhd8ed1ab_1 - mdit-py-plugins=0.4.2=pyhd8ed1ab_1 - mdurl=0.1.2=pyhd8ed1ab_1 + - metis=5.1.0=hd0bcaf9_1007 - mistune=3.1.1=pyhd8ed1ab_0 - - mkl=2023.2.0=h84fe81f_50496 + - mkl=2024.2.2=ha957f24_16 - msgpack-python=1.1.0=py311hd18a35c_0 + - mumps-include=5.7.3=ha770c72_7 + - mumps-seq=5.7.3=h2064c95_7 - munkres=1.1.4=pyh9f0ad1d_0 - - myst-nb=1.1.2=pyhd8ed1ab_1 + - myst-nb=1.2.0=pyh29332c3_0 - myst-parser=1.0.0=pyhd8ed1ab_0 - nbclient=0.10.2=pyhd8ed1ab_0 - nbconvert=7.16.6=hb482800_0 @@ -175,22 +179,22 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_1 - notebook=7.3.2=pyhd8ed1ab_0 - notebook-shim=0.2.4=pyhd8ed1ab_1 - - numba=0.61.0=py311h4e1c48f_0 - - numcodecs=0.15.0=py311h7db5c69_0 + - numba=0.61.0=py311h4e1c48f_1 + - numcodecs=0.15.1=py311h7db5c69_0 - numpy=1.26.4=py311h64a7726_0 - openjpeg=2.5.3=h5fbd93e_0 - openssl=3.4.0=h7b32b05_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=24.2=pyhd8ed1ab_2 - pandas=2.2.3=py311h7db5c69_1 - - pandoc=3.6.2=ha770c72_0 + - pandoc=3.6.3=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.4=pyhd8ed1ab_1 - partd=1.4.2=pyhd8ed1ab_0 - pexpect=4.9.0=pyhd8ed1ab_1 - pickleshare=0.7.5=pyhd8ed1ab_1004 - pillow=10.3.0=py311h82a398c_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - platformdirs=4.3.6=pyhd8ed1ab_1 - pluggy=1.5.0=pyhd8ed1ab_1 @@ -206,11 +210,10 @@ dependencies: - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py311h9e33e62_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - - pydiso=0.1.2=py311h979a38d_0 + - pydiso=0.1.2=py311h19ea254_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.4=pyh29332c3_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyha55dd90_7 - pytest=8.3.4=pyhd8ed1ab_1 @@ -219,6 +222,7 @@ dependencies: - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 + - python-mumps=0.0.3=py311h4b558b0_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 diff --git a/environments/py-3.11-linux-64.conda.lock.yml b/environments/py-3.11-linux-64.conda.lock.yml index 235e4fea..0e751f8e 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: fdeb51cc55c36bafe8a4c5fab310126b6b9a6b88e10785b039488ee54fb0b7ae +# input_hash: 659549a3414ad3a33dccc8e91d8a2206cfb37024a4ef2c8078c3417f15b3e8d4 channels: - conda-forge @@ -48,22 +48,22 @@ dependencies: - keyutils=1.6.1=h166bdaf_0 - kiwisolver=1.4.7=py311hd18a35c_0 - krb5=1.21.3=h659f571_0 - - lcms2=2.16=hb7c19ff_0 + - lcms2=2.17=h717163a_0 - ld_impl_linux-64=2.43=h712a8e2_2 - lerc=4.0.0=h27087fc_0 - libaec=1.1.3=h59595ed_0 - - libblas=3.9.0=20_linux64_mkl + - libblas=3.9.0=28_h2556b6b_mkl - libbrotlicommon=1.1.0=hb9d3cd8_2 - libbrotlidec=1.1.0=hb9d3cd8_2 - libbrotlienc=1.1.0=hb9d3cd8_2 - - libcblas=3.9.0=20_linux64_mkl + - libcblas=3.9.0=28_h372d94f_mkl - libcurl=8.11.1=h332b0f4_0 - libdeflate=1.23=h4ddbbb0_0 - 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.2=h7f98852_5 + - libffi=3.4.6=h2dba641_0 - libgcc=14.2.0=h77fa898_1 - libgcc-ng=14.2.0=h69a702a_1 - libgfortran=14.2.0=h69a702a_1 @@ -71,12 +71,13 @@ dependencies: - libhwloc=2.11.1=default_hecaa2ac_1000 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - - liblapack=3.9.0=20_linux64_mkl + - liblapack=3.9.0=28_hc41d3b0_mkl - libllvm15=15.0.7=hb3ce162_4 - liblzma=5.6.4=hb9d3cd8_0 - libnghttp2=1.64.0=h161d5f1_0 - libnsl=2.0.1=hd590300_0 - libpng=1.6.46=h943b412_0 + - libscotch=7.0.6=hea33c07_1 - libsqlite=3.48.0=hee588c1_1 - libssh2=1.11.1=hf672d98_0 - libstdcxx=14.2.0=hc0a3c3a_1 @@ -93,12 +94,15 @@ dependencies: - locket=1.0.0=pyhd8ed1ab_0 - markupsafe=3.0.2=py311h2dc5d0c_1 - matplotlib-base=3.8.4=py311ha4ca890_2 - - mkl=2023.2.0=h84fe81f_50496 + - metis=5.1.0=hd0bcaf9_1007 + - mkl=2024.2.2=ha957f24_16 - msgpack-python=1.1.0=py311hd18a35c_0 + - mumps-include=5.7.3=ha770c72_7 + - mumps-seq=5.7.3=h2064c95_7 - munkres=1.1.4=pyh9f0ad1d_0 - ncurses=6.5=h2d0b736_3 - - numba=0.61.0=py311h4e1c48f_0 - - numcodecs=0.15.0=py311h7db5c69_0 + - numba=0.61.0=py311h4e1c48f_1 + - numcodecs=0.15.1=py311h7db5c69_0 - numpy=1.26.4=py311h64a7726_0 - openjpeg=2.5.3=h5fbd93e_0 - openssl=3.4.0=h7b32b05_1 @@ -106,19 +110,19 @@ dependencies: - pandas=2.2.3=py311h7db5c69_1 - partd=1.4.2=pyhd8ed1ab_0 - pillow=10.3.0=py311h82a398c_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - psutil=6.1.1=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 - - pydiso=0.1.2=py311h979a38d_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pydiso=0.1.2=py311h19ea254_0 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyha55dd90_7 - python=3.11.11=h9e4cc4f_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 + - python-mumps=0.0.3=py311h4b558b0_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 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 d70d0104..873f748c 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: f40366e42a6575622083baceba54250d699e04b60a3dac847b222d5b77c58f5a +# input_hash: 34ae3ab3ad7d3e9ee47c706a5a6a8e8b13177ee6288941185b6fddda785d55c5 channels: - conda-forge @@ -37,7 +37,7 @@ dependencies: - colorama=0.4.6=pyhd8ed1ab_1 - comm=0.2.2=pyhd8ed1ab_1 - contourpy=1.3.1=py311h3257749_0 - - coverage=7.6.10=py311h5082efb_0 + - coverage=7.6.11=py311h5082efb_0 - cpython=3.11.11=py311hd8ed1ab_1 - cycler=0.12.1=pyhd8ed1ab_1 - cytoolz=1.0.1=py311he736701_0 @@ -75,7 +75,7 @@ dependencies: - importlib_metadata=8.6.1=hd8ed1ab_0 - importlib_resources=6.5.2=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_1 - - intel-openmp=2023.2.0=h57928b3_50497 + - intel-openmp=2024.2.1=h57928b3_1083 - ipykernel=6.29.5=pyh4bbf305_0 - ipython=8.32.0=pyh9ab4c32_0 - ipython_genutils=0.2.0=pyhd8ed1ab_2 @@ -102,27 +102,27 @@ dependencies: - jupyterlab_pygments=0.3.0=pyhd8ed1ab_2 - jupyterlab_server=2.27.3=pyhd8ed1ab_1 - jupyterlab_widgets=1.1.11=pyhd8ed1ab_0 - - jupytext=1.16.6=pyh80e38bb_0 + - jupytext=1.16.7=pyhbbac1ac_0 - kiwisolver=1.4.7=py311h3257749_0 - krb5=1.21.3=hdf4eb48_0 - latexcodec=2.0.1=pyh9f0ad1d_0 - - lcms2=2.16=h67d730c_0 + - lcms2=2.17=hbcf6048_0 - lerc=4.0.0=h63175ca_0 - libaec=1.1.3=h63175ca_0 - - libblas=3.9.0=20_win64_mkl + - libblas=3.9.0=28_h576b46c_mkl - libbrotlicommon=1.1.0=h2466b09_2 - libbrotlidec=1.1.0=h2466b09_2 - libbrotlienc=1.1.0=h2466b09_2 - - libcblas=3.9.0=20_win64_mkl + - libcblas=3.9.0=28_h7ad3364_mkl - libcurl=8.11.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.2=h8ffe710_5 + - libffi=3.4.6=h537db12_0 - libhwloc=2.11.1=default_h8125262_1000 - libiconv=1.17=hcfcfb64_2 - libjpeg-turbo=3.0.0=hcfcfb64_1 - - liblapack=3.9.0=20_win64_mkl + - liblapack=3.9.0=28_hacfb0e4_mkl - liblzma=5.6.4=h2466b09_0 - libpng=1.6.46=had7236b_0 - libsodium=1.0.20=hc70643c_0 @@ -134,6 +134,7 @@ dependencies: - libxml2=2.13.5=he286e8c_1 - libzlib=1.3.1=h2466b09_2 - linkify-it-py=2.0.3=pyhd8ed1ab_1 + - llvm-openmp=19.1.7=h30eaf37_0 - llvmlite=0.44.0=py311h7deaa30_0 - locket=1.0.0=pyhd8ed1ab_0 - m2w64-gcc-libgfortran=5.3.0=6 @@ -149,11 +150,12 @@ dependencies: - mdit-py-plugins=0.4.2=pyhd8ed1ab_1 - mdurl=0.1.2=pyhd8ed1ab_1 - mistune=3.1.1=pyhd8ed1ab_0 - - mkl=2023.2.0=h6a75c08_50497 + - mkl=2024.2.2=h66d3029_15 - msgpack-python=1.1.0=py311h3257749_0 - msys2-conda-epoch=20160418=1 + - mumps-seq=5.7.3=h9576071_7 - munkres=1.1.4=pyh9f0ad1d_0 - - myst-nb=1.1.2=pyhd8ed1ab_1 + - myst-nb=1.2.0=pyh29332c3_0 - myst-parser=1.0.0=pyhd8ed1ab_0 - nbclient=0.10.2=pyhd8ed1ab_0 - nbconvert=7.16.6=hb482800_0 @@ -163,21 +165,21 @@ dependencies: - nest-asyncio=1.6.0=pyhd8ed1ab_1 - notebook=7.3.2=pyhd8ed1ab_0 - notebook-shim=0.2.4=pyhd8ed1ab_1 - - numba=0.61.0=py311h0673bce_0 - - numcodecs=0.15.0=py311hcf9f919_0 + - numba=0.61.0=py311h0673bce_1 + - numcodecs=0.15.1=py311hcf9f919_0 - numpy=1.26.4=py311h0b4df5a_0 - openjpeg=2.5.3=h4d64b90_0 - openssl=3.4.0=ha4e3fda_1 - overrides=7.7.0=pyhd8ed1ab_1 - packaging=24.2=pyhd8ed1ab_2 - pandas=2.2.3=py311hcf9f919_1 - - pandoc=3.6.2=h57928b3_0 + - pandoc=3.6.3=h57928b3_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - parso=0.8.4=pyhd8ed1ab_1 - partd=1.4.2=pyhd8ed1ab_0 - pickleshare=0.7.5=pyhd8ed1ab_1004 - pillow=10.3.0=py311h5592be9_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_2 - platformdirs=4.3.6=pyhd8ed1ab_1 - pluggy=1.5.0=pyhd8ed1ab_1 @@ -193,11 +195,10 @@ dependencies: - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py311h533ab2d_0 - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 - - pydiso=0.1.2=py311h6340b4d_0 + - pydiso=0.1.2=py311h66870c1_0 - pygments=2.19.1=pyhd8ed1ab_0 - pylint=3.3.4=pyh29332c3_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyh09c184e_7 - pytest=8.3.4=pyhd8ed1ab_1 @@ -206,6 +207,7 @@ dependencies: - python-dateutil=2.9.0.post0=pyhff2d567_1 - python-fastjsonschema=2.21.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 + - python-mumps=0.0.3=py311h5bfbc98_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 diff --git a/environments/py-3.11-win-64.conda.lock.yml b/environments/py-3.11-win-64.conda.lock.yml index a218c06a..ab859010 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: f40366e42a6575622083baceba54250d699e04b60a3dac847b222d5b77c58f5a +# input_hash: 34ae3ab3ad7d3e9ee47c706a5a6a8e8b13177ee6288941185b6fddda785d55c5 channels: - conda-forge @@ -40,28 +40,28 @@ dependencies: - hyperframe=6.1.0=pyhd8ed1ab_0 - importlib-metadata=8.6.1=pyha770c72_0 - importlib_metadata=8.6.1=hd8ed1ab_0 - - intel-openmp=2023.2.0=h57928b3_50497 + - intel-openmp=2024.2.1=h57928b3_1083 - jinja2=3.1.5=pyhd8ed1ab_0 - joblib=1.4.2=pyhd8ed1ab_1 - kiwisolver=1.4.7=py311h3257749_0 - krb5=1.21.3=hdf4eb48_0 - - lcms2=2.16=h67d730c_0 + - lcms2=2.17=hbcf6048_0 - lerc=4.0.0=h63175ca_0 - libaec=1.1.3=h63175ca_0 - - libblas=3.9.0=20_win64_mkl + - libblas=3.9.0=28_h576b46c_mkl - libbrotlicommon=1.1.0=h2466b09_2 - libbrotlidec=1.1.0=h2466b09_2 - libbrotlienc=1.1.0=h2466b09_2 - - libcblas=3.9.0=20_win64_mkl + - libcblas=3.9.0=28_h7ad3364_mkl - libcurl=8.11.1=h88aaa65_0 - libdeflate=1.23=h9062f6e_0 - libdlf=0.3.0=pyhd8ed1ab_1 - libexpat=2.6.4=he0c23c2_0 - - libffi=3.4.2=h8ffe710_5 + - libffi=3.4.6=h537db12_0 - libhwloc=2.11.1=default_h8125262_1000 - libiconv=1.17=hcfcfb64_2 - libjpeg-turbo=3.0.0=hcfcfb64_1 - - liblapack=3.9.0=20_win64_mkl + - liblapack=3.9.0=28_hacfb0e4_mkl - liblzma=5.6.4=h2466b09_0 - libpng=1.6.46=had7236b_0 - libsqlite=3.48.0=h67fdade_1 @@ -71,6 +71,7 @@ dependencies: - libxcb=1.16=h013a479_1 - libxml2=2.13.5=he286e8c_1 - libzlib=1.3.1=h2466b09_2 + - llvm-openmp=19.1.7=h30eaf37_0 - llvmlite=0.44.0=py311h7deaa30_0 - locket=1.0.0=pyhd8ed1ab_0 - m2w64-gcc-libgfortran=5.3.0=6 @@ -80,12 +81,13 @@ dependencies: - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 - markupsafe=3.0.2=py311h5082efb_1 - matplotlib-base=3.8.4=py311h9b31f6e_2 - - mkl=2023.2.0=h6a75c08_50497 + - mkl=2024.2.2=h66d3029_15 - msgpack-python=1.1.0=py311h3257749_0 - msys2-conda-epoch=20160418=1 + - mumps-seq=5.7.3=h9576071_7 - munkres=1.1.4=pyh9f0ad1d_0 - - numba=0.61.0=py311h0673bce_0 - - numcodecs=0.15.0=py311hcf9f919_0 + - numba=0.61.0=py311h0673bce_1 + - numcodecs=0.15.1=py311hcf9f919_0 - numpy=1.26.4=py311h0b4df5a_0 - openjpeg=2.5.3=h4d64b90_0 - openssl=3.4.0=ha4e3fda_1 @@ -93,20 +95,20 @@ dependencies: - pandas=2.2.3=py311hcf9f919_1 - partd=1.4.2=pyhd8ed1ab_0 - pillow=10.3.0=py311h5592be9_1 - - pip=25.0=pyh8b19718_0 + - pip=25.0.1=pyh8b19718_0 - psutil=6.1.1=py311he736701_0 - pthread-stubs=0.4=hcd874cb_1001 - pthreads-win32=2.9.1=h2466b09_4 - pycparser=2.22=pyh29332c3_1 - pydantic=2.10.6=pyh3cfb1c2_0 - pydantic-core=2.27.2=py311h533ab2d_0 - - pydiso=0.1.2=py311h6340b4d_0 - - pymatsolver=0.2.0=ha770c72_3 - - pymatsolver-base=0.2.0=pyh44b312d_3 + - pydiso=0.1.2=py311h66870c1_0 + - pymatsolver=0.3.1=pyh48887ae_201 - pyparsing=3.2.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyh09c184e_7 - python=3.11.11=h3f84c4b_1_cpython - python-dateutil=2.9.0.post0=pyhff2d567_1 + - python-mumps=0.0.3=py311h5bfbc98_0 - python-tzdata=2023.4=pyhd8ed1ab_0 - python_abi=3.11=5_cp311 - pytz=2024.1=pyhd8ed1ab_0 diff --git a/meta.yaml b/meta.yaml index 1205cbfe..2a85deae 100644 --- a/meta.yaml +++ b/meta.yaml @@ -1,5 +1,6 @@ {% set name = "simpeg-drivers" %} -{% set version = "0.2.0" %} +{% set version = "0.2.1a1" %} +{% set python_min = "3.10.0" %} package: name: {{ name|lower }} @@ -15,35 +16,35 @@ build: requirements: host: - - python >=3.10, <3.11 + - python 3.10.* - poetry-core >=1.0.0 - setuptools - pip run: - - python >=3.10,<3.11 + - python >={{ python_min }} - dask-core 2024.06.* - - discretize >=0.10.0,<0.11.0 + - discretize >=0.10.0,<0.11.dev - distributed >=2024.06.* - - numpy >=1.26.0,<1.27.0 - - scipy >=1.14.0,<1.15.0 - - geoh5py >=0.10.0b1,<0.11.0a.dev - - octree-creation-app >=0.2.0b1,<0.3.0a.dev - - geoapps-utils >=0.4.0b1,<0.5.0a.dev - - mira-simpeg >=0.21.2.1b1,<0.22.0a.dev - - param-sweeps >=0.2.0b1,<0.2.1a.dev + - numpy >=1.26.0,<1.27.dev + - scipy >=1.14.0,<1.15.dev + - geoh5py >=0.10.0b1,<0.11.dev + - octree-creation-app >=0.2.0b1,<0.3.dev + - geoapps-utils >=0.4.0b1,<0.5.dev + - mira-simpeg >=0.21.2.1b1,<0.22.dev + - param-sweeps >=0.2.0b1,<0.2.1.dev - pillow >=10.3.0 - - empymod >=2.2.1,<2.3.0 - - geoana >=0.5.0,<0.6.0 - - h5py >=3.2.1,<4.0.0 - - matplotlib-base >=3.8.4,<3.9.0 - - mkl >=2023.2, <2023.3 - - pandas >=2.2.1,<2.3.0 - - pydantic >=2.5.2,<3.0.0 - - pydiso >=0.1.0, <0.2.0 - - pymatsolver >=0.2.0,<0.3.0 - - scikit-learn >=1.4.0,<1.5.0 - - tqdm >=4.66.1,<5.0.0 - - zarr >=2.14.2,<2.15.0 + - empymod >=2.2.1,<2.3.dev + - geoana >=0.5.0,<0.6.dev + - h5py >=3.2.1,<4.0.dev + - matplotlib-base >=3.8.4,<3.9.dev + - mkl >=2024.2.2, <2025.dev + - pandas >=2.2.1,<2.3.dev + - pydantic >=2.5.2,<3.0.dev + - pydiso >=0.1.0, <0.2.dev + - pymatsolver >=0.2.0,<0.3.dev + - scikit-learn >=1.4.0,<1.5.dev + - tqdm >=4.66.1,<5.0.dev + - zarr >=2.14.2,<2.15.dev run_constrained: - tbb 2021.12.* - python-tzdata 2023.4.* @@ -56,5 +57,5 @@ about: extra: recipe-maintainers: - - SophieCurinier + - andrewg-mira - sebhmg diff --git a/py-3.10.conda-lock.yml b/py-3.10.conda-lock.yml index 00b1a624..9649242f 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: cd12157f221db0e319212cba17a768833dc85bfd4b99015876cdcc60f9174a20 - linux-64: dc38e6c2bc010e4f5f4a6d873c48f5299990b0dfde18a7539d3660d3062156b8 + win-64: 916ddd337b49f22f16f37fc65fce871f2377ea96099a23688152bfc4810be3aa + linux-64: 66e9913a5ef1fb1332138c652310f05691ea42399acda2f2936b5613d53c3e03 channels: - url: conda-forge used_env_vars: [] @@ -448,7 +448,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' webencodings: '' url: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda hash: @@ -906,7 +906,7 @@ package: category: main optional: false - name: coverage - version: 7.6.10 + version: 7.6.11 manager: conda platform: linux-64 dependencies: @@ -915,14 +915,14 @@ package: python: '>=3.10,<3.11.0a0' python_abi: 3.10.* tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.11-py310h89163eb_0.conda hash: - md5: f9bf6ea6ddf8349750f1b455f603b0ae - sha256: 41336a050be9faa75b5785af036a756acd95adf2319cf258fe1836e2bf55221b + md5: bb5f0a171c8b84c5849e2aba6e619c8e + sha256: 401f0a5fa6f292ec78cc91ae56f1f7bf8c64d0476cae0f390a16bd4c794e16e7 category: dev optional: true - name: coverage - version: 7.6.10 + version: 7.6.11 manager: conda platform: win-64 dependencies: @@ -932,10 +932,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.6.10-py310h38315fa_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.11-py310h38315fa_0.conda hash: - md5: 17a5805f88d2bce1e213b73201ef1007 - sha256: 187b0afc6fad0078667b1ade42e02623945c884b70554039cd30c5b92ebf46a6 + md5: 1d7aff2c6685843dedfc04ffaab572c9 + sha256: 72d2b667d71f0a697ea9c7a84be066d4ccb28861f4a3bfa3eea3987662c64934 category: dev optional: true - name: cpython @@ -1971,14 +1971,14 @@ package: category: dev optional: true - name: intel-openmp - version: 2023.2.0 + version: 2024.2.1 manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2023.2.0-h57928b3_50497.conda + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda hash: - md5: a401f3cae152deb75bbed766a90a6312 - sha256: dd9fded25ebe5c66af30ac6e3685146efdc2d7787035f01bfb546b347f138f6f + md5: 2d89243bfb53652c182a7c73182cce4f + sha256: 0fd2b0b84c854029041b0ede8f4c2369242ee92acc0092f8407b1fe9238a8209 category: main optional: false - name: ipykernel @@ -2069,7 +2069,7 @@ package: pickleshare: '' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.4.0' - python: '' + python: '>=3.10' stack_data: '' traitlets: '>=5.13.0' typing_extensions: '>=4.6' @@ -2646,7 +2646,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2890,7 +2890,7 @@ package: category: dev optional: true - name: jupytext - version: 1.16.6 + version: 1.16.7 manager: conda platform: linux-64 dependencies: @@ -2901,14 +2901,14 @@ package: python: '>=3.9' pyyaml: '' tomli: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.6-pyh80e38bb_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda hash: - md5: f25972a8da0a44826594059a1bb4d82a - sha256: 8704b9547bf444b737f9ff6b9a8855e7ab0b83f2cee58dd913dfd7600a906b78 + md5: f5abe5ee23914325837250927f20e623 + sha256: cfbd169b6d64c983e74c5fdfbaac1128209017ebd0992f163c13dadea71f606e category: dev optional: true - name: jupytext - version: 1.16.6 + version: 1.16.7 manager: conda platform: win-64 dependencies: @@ -2919,10 +2919,10 @@ package: python: '>=3.9' pyyaml: '' tomli: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.6-pyh80e38bb_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda hash: - md5: f25972a8da0a44826594059a1bb4d82a - sha256: 8704b9547bf444b737f9ff6b9a8855e7ab0b83f2cee58dd913dfd7600a906b78 + md5: f5abe5ee23914325837250927f20e623 + sha256: cfbd169b6d64c983e74c5fdfbaac1128209017ebd0992f163c13dadea71f606e category: dev optional: true - name: keyutils @@ -3027,33 +3027,34 @@ package: category: dev optional: true - name: lcms2 - version: '2.16' + version: '2.17' manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' libjpeg-turbo: '>=3.0.0,<4.0a0' - libtiff: '>=4.6.0,<4.8.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + libtiff: '>=4.7.0,<4.8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda hash: - md5: 51bb7010fc86f70eee639b4bb7a894f5 - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 000e85703f0fd9594c81710dd5066471 + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 category: main optional: false - name: lcms2 - version: '2.16' + version: '2.17' manager: conda platform: win-64 dependencies: libjpeg-turbo: '>=3.0.0,<4.0a0' - libtiff: '>=4.6.0,<4.8.0a0' + libtiff: '>=4.7.0,<4.8.0a0' ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda hash: - md5: d3592435917b62a8becff3a60db674f6 - sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 + md5: 3538827f77b82a837fa681a4579e37a1 + sha256: 7712eab5f1a35ca3ea6db48ead49e0d6ac7f96f8560da8023e61b3dbe4f3b25d category: main optional: false - name: ld_impl_linux-64 @@ -3126,11 +3127,11 @@ package: manager: conda platform: linux-64 dependencies: - mkl: '>=2023.2.0,<2024.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_mkl.conda + mkl: '>=2024.2.2,<2025.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h2556b6b_mkl.conda hash: - md5: 8bf521f6007b0b0eb91515a1165b5d85 - sha256: 9e5f27fca79223a5d38ccdf4c468e798c3684ba01bdb6b4b44e61f2103a298eb + md5: 11a51a7baa5ed32d37e7e241e1c8219b + sha256: 9c563275c673558a850899dbf6befc52959fc5cd9db9258f3b0f9a8155f246ba category: main optional: false - name: libblas @@ -3138,11 +3139,11 @@ package: manager: conda platform: win-64 dependencies: - mkl: 2023.2.0 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-20_win64_mkl.conda + mkl: 2024.2.2 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-28_h576b46c_mkl.conda hash: - md5: 6cad6cd2fbdeef4d651b8f752a4da960 - sha256: 34becfe991510be7b9ee05b4ae466c5a26a72af275c3071c1ca7e2308d3f7e64 + md5: eb97c3ea4cc02e42c01bc6c928094037 + sha256: 664fac202fb0f48f11538863f78128cc95e72fbf75fa7d037ddea7c497c0df5d category: main optional: false - name: libbrotlicommon @@ -3236,10 +3237,10 @@ package: platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_mkl.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_h372d94f_mkl.conda hash: - md5: 7a2972758a03adc92d856072c71c9170 - sha256: 841b4d44e20e5207f4a74ca98176629ead5ba590384ed6b0fe3c8600248c9fef + md5: 05023f192bae42c92781fe63baaaf7da + sha256: a202ee018d48d3e6304e9615274c58953e8fd5ad07c1db180a585c14391a62af category: main optional: false - name: libcblas @@ -3248,10 +3249,10 @@ package: platform: win-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-20_win64_mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-28_h7ad3364_mkl.conda hash: - md5: e6d36cfcb2f2dff0f659d2aa0813eb2d - sha256: e526023ed8e7f6fde43698cd326dd16c8448f29414bab8a9594b33deb57a5347 + md5: fc67cf6a19301fc7d6eb83949abce428 + sha256: affd4330721e0dadeefb31cd8191478772f75643db6bef485309782be689c52f category: main optional: false - name: libcurl @@ -3370,28 +3371,30 @@ package: category: main optional: false - name: libffi - version: 3.4.2 + version: 3.4.6 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.4.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda hash: - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: e3eb7806380bc8bcecba6d749ad5f026 + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da category: main optional: false - name: libffi - version: 3.4.2 + version: 3.4.6 manager: conda platform: win-64 dependencies: - vc: '>=14.1,<15.0a0' - vs2015_runtime: '>=14.16.27012' - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + 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 hash: - md5: 2c96d1b6915b408893f9472569dee135 - sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 31d5107f75b2f204937728417e2e39e5 + sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be category: main optional: false - name: libgcc @@ -3532,10 +3535,10 @@ package: platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_mkl.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_hc41d3b0_mkl.conda hash: - md5: 4db0cd03efcdab535f6f066aca4cddbb - sha256: 21b4324dd65815f6b5a83c15f0b9a201434d0aa55eeecc37efce7ee70bbbf482 + md5: 29e0a20efbf943d7b062af5e8a9a7044 + sha256: 41722505678641075eb3937d1a785e7ef75161b98c339e5d49c55ca3e63b4ee7 category: main optional: false - name: liblapack @@ -3544,10 +3547,10 @@ package: platform: win-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-20_win64_mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-28_hacfb0e4_mkl.conda hash: - md5: 9510d07424d70fcac553d86b3e4a7c14 - sha256: 7627ef580c26e48c3496b5885fd32be4e4db49fa1077eb21235dc638489565f6 + md5: 5aa8e62e29e0d76b0b99b79a739cd2dd + sha256: 4b4bb704f46d12f56c1dcf5525bb97aea53a110e6bde6b8d588bf43b773500da category: main optional: false - name: libllvm15 @@ -3652,6 +3655,24 @@ package: sha256: c866cd79dce3f6478fa3b4bc625d5cbe0512720fd6f8d45718da9537292329cf category: main optional: false +- name: libscotch + version: 7.0.6 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=13' + libgfortran: '' + libgfortran5: '>=13.3.0' + liblzma: '>=5.6.3,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libscotch-7.0.6-hea33c07_1.conda + hash: + md5: 1b600d55dcd98c958192a69a79e6acd2 + sha256: 8330bba8b7b3a37da6eca04bace985fb9f8d487d3249b8f690e8f4a3d8d3c7dc + category: main + optional: false - name: libsodium version: 1.0.20 manager: conda @@ -3982,6 +4003,20 @@ package: sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 category: main optional: false +- name: llvm-openmp + version: 19.1.7 + 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 + hash: + md5: f6076c844b630037f4a40fae12dc6e41 + sha256: 0dca936d558f986c9100e731483f6c3dbab6a0d9648ec4d8fa6c6f97e18e0325 + category: main + optional: false - name: llvmlite version: 0.44.0 manager: conda @@ -4322,6 +4357,20 @@ package: sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 category: dev optional: true +- name: metis + version: 5.1.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda + hash: + md5: 28eb714416de4eb83e2cbc47e99a1b45 + sha256: e8a00971e6d00bd49f375c5d8d005b37a9abba0b1768533aed0f90a422bf5cc7 + category: main + optional: false - name: mistune version: 3.1.1 manager: conda @@ -4349,30 +4398,30 @@ package: category: dev optional: true - name: mkl - version: 2023.2.0 + version: 2024.2.2 manager: conda platform: linux-64 dependencies: _openmp_mutex: '>=4.5' - llvm-openmp: '>=17.0.3' + llvm-openmp: '>=19.1.2' tbb: 2021.* - url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2023.2.0-h84fe81f_50496.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda hash: - md5: 81d4a1a57d618adf0152db973d93b2ad - sha256: 046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a + md5: 1459379c79dda834673426504d52b319 + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 category: main optional: false - name: mkl - version: 2023.2.0 + version: 2024.2.2 manager: conda platform: win-64 dependencies: - intel-openmp: 2023.* + intel-openmp: 2024.* tbb: 2021.* - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2023.2.0-h6a75c08_50497.conda + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda hash: - md5: 064cea9f45531e7b53584acf4bd8b044 - sha256: 46ec9e767279da219398b6e79c8fa95822b2ed3c8e02ab604615b7d1213a5d5a + md5: 302dff2807f2927b3e9e0d19d60121de + sha256: 20e52b0389586d0b914a49cd286c5ccc9c47949bed60ca6df004d1d295f2edbd category: main optional: false - name: msgpack-python @@ -4418,6 +4467,55 @@ package: sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 category: main optional: false +- name: mumps-include + version: 5.7.3 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-include-5.7.3-ha770c72_7.conda + hash: + md5: dc10f13639b574503ededf0bb180d357 + sha256: 714110d4704cd585fe0434fd99ae2e43132174a6609918c5939aa6aae947612a + category: main + optional: false +- name: mumps-seq + version: 5.7.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + libblas: '>=3.9.0,<4.0a0' + libgcc: '>=13' + libgfortran: '' + libgfortran5: '>=13.3.0' + liblapack: '>=3.9.0,<4.0a0' + libscotch: '>=7.0.6,<7.0.7.0a0' + metis: '>=5.1.0,<5.1.1.0a0' + mumps-include: 5.7.3 + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-seq-5.7.3-h2064c95_7.conda + hash: + md5: 46523370432ffd9ed12a2aba5dda8db8 + sha256: 4d8c076a3b7821dec3a753b4260737aed81c447a91baf50c38c095557e59bd90 + category: main + optional: false +- name: mumps-seq + version: 5.7.3 + manager: conda + platform: win-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + liblapack: '>=3.9.0,<4.0a0' + llvm-openmp: '>=19.1.7' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/mumps-seq-5.7.3-h9576071_7.conda + hash: + md5: 9483f654b63889300902eb57227c1faf + sha256: d8451cc9a924ae671cd4aab78fcdf16ab1fd0c8e2463b5f4bc78acd400e66b3b + category: main + optional: false - name: munkres version: 1.1.4 manager: conda @@ -4443,7 +4541,7 @@ package: category: main optional: false - name: myst-nb - version: 1.1.2 + version: 1.2.0 manager: conda platform: linux-64 dependencies: @@ -4454,18 +4552,18 @@ package: myst-parser: '>=1.0.0' nbclient: '' nbformat: '>=5.0' - python: '>=3.9' + python: '' pyyaml: '' sphinx: '>=5' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.2.0-pyh29332c3_0.conda hash: - md5: b78625bb0b4b144fe7048523a178986d - sha256: 0bc2fdde44340d93834983106fdacad5683c441ae5faa5450444e4ff8560f13b + md5: 4f63865e1bb08e05476fa136a2dfe2ac + sha256: de3e58d54126fdb667a55921675693fb8eee23757fd3be6116f6565cae710279 category: dev optional: true - name: myst-nb - version: 1.1.2 + version: 1.2.0 manager: conda platform: win-64 dependencies: @@ -4480,10 +4578,10 @@ package: pyyaml: '' sphinx: '>=5' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.2.0-pyh29332c3_0.conda hash: - md5: b78625bb0b4b144fe7048523a178986d - sha256: 0bc2fdde44340d93834983106fdacad5683c441ae5faa5450444e4ff8560f13b + md5: 4f63865e1bb08e05476fa136a2dfe2ac + sha256: de3e58d54126fdb667a55921675693fb8eee23757fd3be6116f6565cae710279 category: dev optional: true - name: myst-parser @@ -4628,7 +4726,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.9' traitlets: '>=5.1' url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda hash: @@ -4806,10 +4904,10 @@ package: numpy: '>=1.24,<2.2' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* - url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.61.0-py310h699fe88_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.61.0-py310h699fe88_1.conda hash: - md5: 67c3f8861269c7ad00c0a296ebd091ec - sha256: ef084da75c5b85db326b9173d2d8ea95dd9c2223476da4bc0c6c802198487ca4 + md5: 73bf45d299c017a67dd8fffab92bcaaa + sha256: 2be5e6ad0ffbc0781ab4241bf9ae759e0af6679d4a9e084ed671cef3cacc899d category: main optional: false - name: numba @@ -4824,10 +4922,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/numba-0.61.0-py310h7793332_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/numba-0.61.0-py310h7793332_1.conda hash: - md5: 2b25eefe19afdbec6e6ef9502c91a8af - sha256: 163deb727a45dab26ae1a5eca1da21b8e55f8899e6f7e065aef6790295f2d8f6 + md5: e7f2c80934601fc827391b8fbed20b5c + sha256: 27f54a8453fd36c35467d3b556e0a203774905f37c906158e4fdae3c7edaeb1e category: main optional: false - name: numcodecs @@ -5057,25 +5155,25 @@ package: category: main optional: false - name: pandoc - version: 3.6.2 + version: 3.6.3 manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.2-ha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.3-ha770c72_0.conda hash: - md5: 4ded4ab71d9fd3764d796a23ca3e722b - sha256: ed347f989622c91dd86180011a93efe284eef5f3d98bec83468165e6b418917e + md5: 16ff7c679250dc09f9732aab14408d2c + sha256: a7392b0d5403676b0b3ab9ff09c1e65d8ab9e1c34349bba9be605d76cf622640 category: dev optional: true - name: pandoc - version: 3.6.2 + version: 3.6.3 manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.2-h57928b3_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.3-h57928b3_0.conda hash: - md5: 05afb57dcba13f72295a1790b95a7996 - sha256: b9b7480ba2339c2e9c48ec66bfce1a93b1fa398bad3404ecc8cbc088b5af2250 + md5: 9b999036cccf0d5a94ed3c0b0edbb905 + sha256: ffdb8fd1da7419f6625c8b2339a12f9669a705ada4177b763cc796c60763f734 category: dev optional: true - name: pandocfilters @@ -5240,31 +5338,31 @@ package: category: main optional: false - name: pip - version: '25.0' + version: 25.0.1 manager: conda platform: linux-64 dependencies: python: '>=3.9,<3.13.0a0' setuptools: '' wheel: '' - url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda hash: - md5: c2548760a02ed818f92dd0d8c81b55b4 - sha256: 094fa4c825f8b9e8403e0c0b569c3d50892325acdac1010ff43cc3ac65bf62cd + md5: 79b5c1440aedc5010f687048d9103628 + sha256: 585940f09d87787f79f73ff5dff8eb2af8a67e5bec5eebf2f553cd26c840ba69 category: main optional: false - name: pip - version: '25.0' + version: 25.0.1 manager: conda platform: win-64 dependencies: python: '>=3.9,<3.13.0a0' setuptools: '' wheel: '' - url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda hash: - md5: c2548760a02ed818f92dd0d8c81b55b4 - sha256: 094fa4c825f8b9e8403e0c0b569c3d50892325acdac1010ff43cc3ac65bf62cd + md5: 79b5c1440aedc5010f687048d9103628 + sha256: 585940f09d87787f79f73ff5dff8eb2af8a67e5bec5eebf2f553cd26c840ba69 category: main optional: false - name: pkgutil-resolve-name @@ -5576,7 +5674,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5695,15 +5793,15 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - mkl: '>=2023.2.0,<2024.0a0' + mkl: '>=2024.1.0,<2025.0a0' numpy: '>=1.19,<3' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* scipy: '>=0.13' - url: https://conda.anaconda.org/conda-forge/linux-64/pydiso-0.1.2-py310h7b68af5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydiso-0.1.2-py310h69a6472_0.conda hash: - md5: d70757c06c05a699982906150738d0fa - sha256: 620757472baf508531f142611d409ebd0d21cb3cacf8fa2488a33dc8fe1292b7 + md5: d4ab7c8858c0f0db75600239c09b38d5 + sha256: bfaa4f0455b0e3c4f7c535c8e1a3bd4ad1c3a546807647490871f4c3a6106b20 category: main optional: false - name: pydiso @@ -5711,7 +5809,7 @@ package: manager: conda platform: win-64 dependencies: - mkl: '>=2023.2.0,<2024.0a0' + mkl: '>=2024.2.2,<2025.0a0' numpy: '>=1.19,<3' python: '>=3.10,<3.11.0a0' python_abi: 3.10.* @@ -5719,10 +5817,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/pydiso-0.1.2-py310h5da8fee_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydiso-0.1.2-py310h8f92c26_0.conda hash: - md5: aeb651d2c58b022f815fd488c9ae0e2d - sha256: 4398403f1dfde0db3a4c42d88f6f61f1ba7070766aa0eec4231af761fd68f91f + md5: 8b436acfa40172914304ac42a6387351 + sha256: d86c167db66ccc00a45736f27a485c394713f075a91a18eb02e3416b8e5b4fdc category: main optional: false - name: pygments @@ -5781,7 +5879,7 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '' + python: '>=3.9' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' @@ -5792,57 +5890,35 @@ package: category: dev optional: true - name: pymatsolver - version: 0.2.0 + version: 0.3.1 manager: conda platform: linux-64 dependencies: - pydiso: '' - pymatsolver-base: 0.2.0 - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.2.0-ha770c72_3.conda + numpy: '>=1.21' + packaging: '' + pydiso: '>=0.1' + python: '>=3.10' + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.3.1-pyh48887ae_201.conda hash: - md5: 71c5698e2f1f19b16164bae528b143ca - sha256: 8d16b3c276ffd5f35890bba6539f3f526cc93061b0320eee2c8d488e7d5089de + md5: b6805e522702eabf2ebbd236490d5eed + sha256: d49ad9b58b9eeae204a3677cafc389c00c7f0f830ef76f481ab9aaf3e0260bad category: main optional: false - name: pymatsolver - version: 0.2.0 - manager: conda - platform: win-64 - dependencies: - pydiso: '' - pymatsolver-base: 0.2.0 - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.2.0-ha770c72_3.conda - hash: - md5: 71c5698e2f1f19b16164bae528b143ca - sha256: 8d16b3c276ffd5f35890bba6539f3f526cc93061b0320eee2c8d488e7d5089de - category: main - optional: false -- name: pymatsolver-base - version: 0.2.0 - manager: conda - platform: linux-64 - dependencies: - numpy: '' - python: '' - scipy: '' - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-base-0.2.0-pyh44b312d_3.conda - hash: - md5: d3843c2374465a0d1a0eb15cc87669c4 - sha256: d03fd3f24f87d7c07675b15129b6e481485500304e03aae35eb93224e2f757b1 - category: main - optional: false -- name: pymatsolver-base - version: 0.2.0 + version: 0.3.1 manager: conda platform: win-64 dependencies: - numpy: '' - python: '' - scipy: '' - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-base-0.2.0-pyh44b312d_3.conda + numpy: '>=1.21' + packaging: '' + pydiso: '>=0.1' + python: '>=3.10' + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.3.1-pyh48887ae_201.conda hash: - md5: d3843c2374465a0d1a0eb15cc87669c4 - sha256: d03fd3f24f87d7c07675b15129b6e481485500304e03aae35eb93224e2f757b1 + md5: b6805e522702eabf2ebbd236490d5eed + sha256: d49ad9b58b9eeae204a3677cafc389c00c7f0f830ef76f481ab9aaf3e0260bad category: main optional: false - name: pyparsing @@ -6087,6 +6163,43 @@ package: sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca category: dev optional: true +- name: python-mumps + version: 0.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + mumps-seq: '>=5.7.3,<5.7.4.0a0' + numpy: '>=1.19,<3' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/linux-64/python-mumps-0.0.3-py310h6410a28_0.conda + hash: + md5: f7e3766b109232dadef0cc072e1e3cc6 + sha256: bf869230e332833c9f9f1908731a859c3b39a612e74ae8f65b5338d67795c613 + category: main + optional: false +- name: python-mumps + version: 0.0.3 + manager: conda + platform: win-64 + dependencies: + mumps-seq: '>=5.7.3,<5.7.4.0a0' + numpy: '>=1.19,<3' + python: '>=3.10,<3.11.0a0' + python_abi: 3.10.* + scipy: '>=1.8' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/python-mumps-0.0.3-py310hb64895d_0.conda + hash: + md5: 477083091731501c8bef2fd4733ec23f + sha256: 1461a60b36aa7b2189ad3bd0ca9bb356d42ea2e54c8aaf122826e9f8bd33735c + category: main + optional: false - name: python-tzdata version: '2023.4' manager: conda @@ -6323,7 +6436,7 @@ package: platform: win-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.9' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda diff --git a/py-3.11.conda-lock.yml b/py-3.11.conda-lock.yml index 8984a3d1..2380facd 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: f40366e42a6575622083baceba54250d699e04b60a3dac847b222d5b77c58f5a - linux-64: fdeb51cc55c36bafe8a4c5fab310126b6b9a6b88e10785b039488ee54fb0b7ae + win-64: 34ae3ab3ad7d3e9ee47c706a5a6a8e8b13177ee6288941185b6fddda785d55c5 + linux-64: 659549a3414ad3a33dccc8e91d8a2206cfb37024a4ef2c8078c3417f15b3e8d4 channels: - url: conda-forge used_env_vars: [] @@ -433,7 +433,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' webencodings: '' url: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda hash: @@ -446,7 +446,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' webencodings: '' url: https://conda.anaconda.org/conda-forge/noarch/bleach-6.2.0-pyh29332c3_4.conda hash: @@ -904,7 +904,7 @@ package: category: main optional: false - name: coverage - version: 7.6.10 + version: 7.6.11 manager: conda platform: linux-64 dependencies: @@ -913,14 +913,14 @@ package: python: '>=3.11,<3.12.0a0' python_abi: 3.11.* tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.11-py311h2dc5d0c_0.conda hash: - md5: 2a772b30e69ba8319651e9f3ab01608f - sha256: c5782231c9255f0492728bfb74ebcddf2dd8f5561d4f792d9d186d9d360242b8 + md5: ab0609d6d63bf51bc328d1e807f3a54c + sha256: 222e31d1958e2f6c46475301a7bd6fd7df372e1de2764eebcaacae7e81bec60b category: dev optional: true - name: coverage - version: 7.6.10 + version: 7.6.11 manager: conda platform: win-64 dependencies: @@ -930,10 +930,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.6.10-py311h5082efb_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/coverage-7.6.11-py311h5082efb_0.conda hash: - md5: b985c39f9a9e62e2c16cd71e3832968a - sha256: f634fc561dc5969bf1614c724d5961804fb213100c08a9fad5aa543e51995daf + md5: 430104611f9f8aa55029037f735ad216 + sha256: 41294a2203e608815c84236dce54bbe2ddce52278c43e4d9e84091a93531990c category: dev optional: true - name: cpython @@ -1995,14 +1995,14 @@ package: category: dev optional: true - name: intel-openmp - version: 2023.2.0 + version: 2024.2.1 manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2023.2.0-h57928b3_50497.conda + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.2.1-h57928b3_1083.conda hash: - md5: a401f3cae152deb75bbed766a90a6312 - sha256: dd9fded25ebe5c66af30ac6e3685146efdc2d7787035f01bfb546b347f138f6f + md5: 2d89243bfb53652c182a7c73182cce4f + sha256: 0fd2b0b84c854029041b0ede8f4c2369242ee92acc0092f8407b1fe9238a8209 category: main optional: false - name: ipykernel @@ -2069,7 +2069,7 @@ package: pickleshare: '' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.4.0' - python: '' + python: '>=3.10' stack_data: '' traitlets: '>=5.13.0' typing_extensions: '>=4.6' @@ -2093,7 +2093,7 @@ package: pickleshare: '' prompt-toolkit: '>=3.0.41,<3.1.0' pygments: '>=2.4.0' - python: '' + python: '>=3.10' stack_data: '' traitlets: '>=5.13.0' typing_extensions: '>=4.6' @@ -2650,7 +2650,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2670,7 +2670,7 @@ package: dependencies: jsonschema-with-format-nongpl: '>=4.18.0' packaging: '' - python: '' + python: '>=3.9' python-json-logger: '>=2.0.4' pyyaml: '>=5.3' referencing: '' @@ -2914,7 +2914,7 @@ package: category: dev optional: true - name: jupytext - version: 1.16.6 + version: 1.16.7 manager: conda platform: linux-64 dependencies: @@ -2925,14 +2925,14 @@ package: python: '>=3.9' pyyaml: '' tomli: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.6-pyh80e38bb_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda hash: - md5: f25972a8da0a44826594059a1bb4d82a - sha256: 8704b9547bf444b737f9ff6b9a8855e7ab0b83f2cee58dd913dfd7600a906b78 + md5: f5abe5ee23914325837250927f20e623 + sha256: cfbd169b6d64c983e74c5fdfbaac1128209017ebd0992f163c13dadea71f606e category: dev optional: true - name: jupytext - version: 1.16.6 + version: 1.16.7 manager: conda platform: win-64 dependencies: @@ -2943,10 +2943,10 @@ package: python: '>=3.9' pyyaml: '' tomli: '' - url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.6-pyh80e38bb_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.7-pyhbbac1ac_0.conda hash: - md5: f25972a8da0a44826594059a1bb4d82a - sha256: 8704b9547bf444b737f9ff6b9a8855e7ab0b83f2cee58dd913dfd7600a906b78 + md5: f5abe5ee23914325837250927f20e623 + sha256: cfbd169b6d64c983e74c5fdfbaac1128209017ebd0992f163c13dadea71f606e category: dev optional: true - name: keyutils @@ -3051,33 +3051,34 @@ package: category: dev optional: true - name: lcms2 - version: '2.16' + version: '2.17' manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=12' + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' libjpeg-turbo: '>=3.0.0,<4.0a0' - libtiff: '>=4.6.0,<4.8.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + libtiff: '>=4.7.0,<4.8.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda hash: - md5: 51bb7010fc86f70eee639b4bb7a894f5 - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 000e85703f0fd9594c81710dd5066471 + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 category: main optional: false - name: lcms2 - version: '2.16' + version: '2.17' manager: conda platform: win-64 dependencies: libjpeg-turbo: '>=3.0.0,<4.0a0' - libtiff: '>=4.6.0,<4.8.0a0' + libtiff: '>=4.7.0,<4.8.0a0' ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda hash: - md5: d3592435917b62a8becff3a60db674f6 - sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 + md5: 3538827f77b82a837fa681a4579e37a1 + sha256: 7712eab5f1a35ca3ea6db48ead49e0d6ac7f96f8560da8023e61b3dbe4f3b25d category: main optional: false - name: ld_impl_linux-64 @@ -3150,11 +3151,11 @@ package: manager: conda platform: linux-64 dependencies: - mkl: '>=2023.2.0,<2024.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_mkl.conda + mkl: '>=2024.2.2,<2025.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h2556b6b_mkl.conda hash: - md5: 8bf521f6007b0b0eb91515a1165b5d85 - sha256: 9e5f27fca79223a5d38ccdf4c468e798c3684ba01bdb6b4b44e61f2103a298eb + md5: 11a51a7baa5ed32d37e7e241e1c8219b + sha256: 9c563275c673558a850899dbf6befc52959fc5cd9db9258f3b0f9a8155f246ba category: main optional: false - name: libblas @@ -3162,11 +3163,11 @@ package: manager: conda platform: win-64 dependencies: - mkl: 2023.2.0 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-20_win64_mkl.conda + mkl: 2024.2.2 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-28_h576b46c_mkl.conda hash: - md5: 6cad6cd2fbdeef4d651b8f752a4da960 - sha256: 34becfe991510be7b9ee05b4ae466c5a26a72af275c3071c1ca7e2308d3f7e64 + md5: eb97c3ea4cc02e42c01bc6c928094037 + sha256: 664fac202fb0f48f11538863f78128cc95e72fbf75fa7d037ddea7c497c0df5d category: main optional: false - name: libbrotlicommon @@ -3260,10 +3261,10 @@ package: platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_mkl.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_h372d94f_mkl.conda hash: - md5: 7a2972758a03adc92d856072c71c9170 - sha256: 841b4d44e20e5207f4a74ca98176629ead5ba590384ed6b0fe3c8600248c9fef + md5: 05023f192bae42c92781fe63baaaf7da + sha256: a202ee018d48d3e6304e9615274c58953e8fd5ad07c1db180a585c14391a62af category: main optional: false - name: libcblas @@ -3272,10 +3273,10 @@ package: platform: win-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-20_win64_mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-28_h7ad3364_mkl.conda hash: - md5: e6d36cfcb2f2dff0f659d2aa0813eb2d - sha256: e526023ed8e7f6fde43698cd326dd16c8448f29414bab8a9594b33deb57a5347 + md5: fc67cf6a19301fc7d6eb83949abce428 + sha256: affd4330721e0dadeefb31cd8191478772f75643db6bef485309782be689c52f category: main optional: false - name: libcurl @@ -3421,28 +3422,30 @@ package: category: main optional: false - name: libffi - version: 3.4.2 + version: 3.4.6 manager: conda platform: linux-64 dependencies: - libgcc-ng: '>=9.4.0' - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda hash: - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: e3eb7806380bc8bcecba6d749ad5f026 + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da category: main optional: false - name: libffi - version: 3.4.2 + version: 3.4.6 manager: conda platform: win-64 dependencies: - vc: '>=14.1,<15.0a0' - vs2015_runtime: '>=14.16.27012' - url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + 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 hash: - md5: 2c96d1b6915b408893f9472569dee135 - sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 31d5107f75b2f204937728417e2e39e5 + sha256: 77922d8dd2faf88ac6accaeebf06409d1820486fde710cff6b554d12273e46be category: main optional: false - name: libgcc @@ -3583,10 +3586,10 @@ package: platform: linux-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_mkl.conda + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_hc41d3b0_mkl.conda hash: - md5: 4db0cd03efcdab535f6f066aca4cddbb - sha256: 21b4324dd65815f6b5a83c15f0b9a201434d0aa55eeecc37efce7ee70bbbf482 + md5: 29e0a20efbf943d7b062af5e8a9a7044 + sha256: 41722505678641075eb3937d1a785e7ef75161b98c339e5d49c55ca3e63b4ee7 category: main optional: false - name: liblapack @@ -3595,10 +3598,10 @@ package: platform: win-64 dependencies: libblas: 3.9.0 - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-20_win64_mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-28_hacfb0e4_mkl.conda hash: - md5: 9510d07424d70fcac553d86b3e4a7c14 - sha256: 7627ef580c26e48c3496b5885fd32be4e4db49fa1077eb21235dc638489565f6 + md5: 5aa8e62e29e0d76b0b99b79a739cd2dd + sha256: 4b4bb704f46d12f56c1dcf5525bb97aea53a110e6bde6b8d588bf43b773500da category: main optional: false - name: libllvm15 @@ -3703,6 +3706,24 @@ package: sha256: c866cd79dce3f6478fa3b4bc625d5cbe0512720fd6f8d45718da9537292329cf category: main optional: false +- name: libscotch + version: 7.0.6 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=13' + libgfortran: '' + libgfortran5: '>=13.3.0' + liblzma: '>=5.6.3,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libscotch-7.0.6-hea33c07_1.conda + hash: + md5: 1b600d55dcd98c958192a69a79e6acd2 + sha256: 8330bba8b7b3a37da6eca04bace985fb9f8d487d3249b8f690e8f4a3d8d3c7dc + category: main + optional: false - name: libsodium version: 1.0.20 manager: conda @@ -4033,6 +4054,20 @@ package: sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 category: main optional: false +- name: llvm-openmp + version: 19.1.7 + 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 + hash: + md5: f6076c844b630037f4a40fae12dc6e41 + sha256: 0dca936d558f986c9100e731483f6c3dbab6a0d9648ec4d8fa6c6f97e18e0325 + category: main + optional: false - name: llvmlite version: 0.44.0 manager: conda @@ -4373,6 +4408,20 @@ package: sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 category: dev optional: true +- name: metis + version: 5.1.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-hd0bcaf9_1007.conda + hash: + md5: 28eb714416de4eb83e2cbc47e99a1b45 + sha256: e8a00971e6d00bd49f375c5d8d005b37a9abba0b1768533aed0f90a422bf5cc7 + category: main + optional: false - name: mistune version: 3.1.1 manager: conda @@ -4400,30 +4449,30 @@ package: category: dev optional: true - name: mkl - version: 2023.2.0 + version: 2024.2.2 manager: conda platform: linux-64 dependencies: - _openmp_mutex: '>=4.5' - llvm-openmp: '>=17.0.3' + _openmp_mutex: '*' + llvm-openmp: '>=19.1.2' tbb: 2021.* - url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2023.2.0-h84fe81f_50496.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda hash: - md5: 81d4a1a57d618adf0152db973d93b2ad - sha256: 046073737bf73153b0c39e343b197cdf0b7867d336962369407465a17ea5979a + md5: 1459379c79dda834673426504d52b319 + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 category: main optional: false - name: mkl - version: 2023.2.0 + version: 2024.2.2 manager: conda platform: win-64 dependencies: - intel-openmp: 2023.* + intel-openmp: 2024.* tbb: 2021.* - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2023.2.0-h6a75c08_50497.conda + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.2.2-h66d3029_15.conda hash: - md5: 064cea9f45531e7b53584acf4bd8b044 - sha256: 46ec9e767279da219398b6e79c8fa95822b2ed3c8e02ab604615b7d1213a5d5a + md5: 302dff2807f2927b3e9e0d19d60121de + sha256: 20e52b0389586d0b914a49cd286c5ccc9c47949bed60ca6df004d1d295f2edbd category: main optional: false - name: msgpack-python @@ -4469,6 +4518,55 @@ package: sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 category: main optional: false +- name: mumps-include + version: 5.7.3 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-include-5.7.3-ha770c72_7.conda + hash: + md5: dc10f13639b574503ededf0bb180d357 + sha256: 714110d4704cd585fe0434fd99ae2e43132174a6609918c5939aa6aae947612a + category: main + optional: false +- name: mumps-seq + version: 5.7.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + libblas: '>=3.9.0,<4.0a0' + libgcc: '>=13' + libgfortran: '' + libgfortran5: '>=13.3.0' + liblapack: '>=3.9.0,<4.0a0' + libscotch: '>=7.0.6,<7.0.7.0a0' + metis: '>=5.1.0,<5.1.1.0a0' + mumps-include: 5.7.3 + url: https://conda.anaconda.org/conda-forge/linux-64/mumps-seq-5.7.3-h2064c95_7.conda + hash: + md5: 46523370432ffd9ed12a2aba5dda8db8 + sha256: 4d8c076a3b7821dec3a753b4260737aed81c447a91baf50c38c095557e59bd90 + category: main + optional: false +- name: mumps-seq + version: 5.7.3 + manager: conda + platform: win-64 + dependencies: + libblas: '>=3.9.0,<4.0a0' + liblapack: '>=3.9.0,<4.0a0' + llvm-openmp: '>=19.1.7' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/mumps-seq-5.7.3-h9576071_7.conda + hash: + md5: 9483f654b63889300902eb57227c1faf + sha256: d8451cc9a924ae671cd4aab78fcdf16ab1fd0c8e2463b5f4bc78acd400e66b3b + category: main + optional: false - name: munkres version: 1.1.4 manager: conda @@ -4494,7 +4592,7 @@ package: category: main optional: false - name: myst-nb - version: 1.1.2 + version: 1.2.0 manager: conda platform: linux-64 dependencies: @@ -4509,14 +4607,14 @@ package: pyyaml: '' sphinx: '>=5' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.2.0-pyh29332c3_0.conda hash: - md5: b78625bb0b4b144fe7048523a178986d - sha256: 0bc2fdde44340d93834983106fdacad5683c441ae5faa5450444e4ff8560f13b + md5: 4f63865e1bb08e05476fa136a2dfe2ac + sha256: de3e58d54126fdb667a55921675693fb8eee23757fd3be6116f6565cae710279 category: dev optional: true - name: myst-nb - version: 1.1.2 + version: 1.2.0 manager: conda platform: win-64 dependencies: @@ -4531,10 +4629,10 @@ package: pyyaml: '' sphinx: '>=5' typing_extensions: '' - url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.1.2-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.2.0-pyh29332c3_0.conda hash: - md5: b78625bb0b4b144fe7048523a178986d - sha256: 0bc2fdde44340d93834983106fdacad5683c441ae5faa5450444e4ff8560f13b + md5: 4f63865e1bb08e05476fa136a2dfe2ac + sha256: de3e58d54126fdb667a55921675693fb8eee23757fd3be6116f6565cae710279 category: dev optional: true - name: myst-parser @@ -4652,7 +4750,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.9' traitlets: '>=5.1' url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda hash: @@ -4679,7 +4777,7 @@ package: packaging: '' pandocfilters: '>=1.4.1' pygments: '>=2.4.1' - python: '' + python: '>=3.9' traitlets: '>=5.1' url: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyh29332c3_0.conda hash: @@ -4857,10 +4955,10 @@ package: numpy: '>=1.24,<2.2' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.61.0-py311h4e1c48f_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.61.0-py311h4e1c48f_1.conda hash: - md5: 265b12cabad27acca15c08493973eeb1 - sha256: 23d43f453e05e3c23fbe70a51d6e22c43d8b2f27a5c93612e85cb6565ea5ea49 + md5: 24b37c8a91f275959d158f5f8e3c2439 + sha256: f0f1eae51f0a837a2902bf317819c5381b0cf76bf3abdedf218cef6b1cd6ca26 category: main optional: false - name: numba @@ -4875,14 +4973,14 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - url: https://conda.anaconda.org/conda-forge/win-64/numba-0.61.0-py311h0673bce_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/numba-0.61.0-py311h0673bce_1.conda hash: - md5: 39457b23fbbd36c86cfe40d9f624079d - sha256: 283695efa4d95f1998a58eedd8f7accdaa67c76b46792eaba31a6a10faf83fb3 + md5: c45f583aa699c7c752bdd3cd4658bd4b + sha256: 622717601a63419e190a871cddafb6fd4110a77794099ae69805b726bab6f66c category: main optional: false - name: numcodecs - version: 0.15.0 + version: 0.15.1 manager: conda platform: linux-64 dependencies: @@ -4894,14 +4992,14 @@ package: numpy: '>=1.24' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* - url: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.0-py311h7db5c69_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.1-py311h7db5c69_0.conda hash: - md5: a23ef80377cf798ed3bf2540ffee78f1 - sha256: ad66ccaaa82f68eb5678512f87dd82a87501eaedb0af5b2f240f7de34d08b768 + md5: 969c10aa2c0b994e33a436bea697e214 + sha256: 38794beadfe994f21ae105ec3a888999a002f341a3fb7e8e870fef8212cebfef category: main optional: false - name: numcodecs - version: 0.15.0 + version: 0.15.1 manager: conda platform: win-64 dependencies: @@ -4913,10 +5011,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/numcodecs-0.15.0-py311hcf9f919_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.15.1-py311hcf9f919_0.conda hash: - md5: d0c17e3c6bfcce74a492308cd485cb11 - sha256: 5b20c935f10c1dedf59a9690f1ac046ffc736785736acacd896b984f059f0075 + md5: 89d8435b5b12da6eb043309c45b022f2 + sha256: 5c6ece778e8abaed89c5c7529f4fe276fa2ab72013e27301dd08a649e37f1f05 category: main optional: false - name: numpy @@ -5110,25 +5208,25 @@ package: category: main optional: false - name: pandoc - version: 3.6.2 + version: 3.6.3 manager: conda platform: linux-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.2-ha770c72_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.6.3-ha770c72_0.conda hash: - md5: 4ded4ab71d9fd3764d796a23ca3e722b - sha256: ed347f989622c91dd86180011a93efe284eef5f3d98bec83468165e6b418917e + md5: 16ff7c679250dc09f9732aab14408d2c + sha256: a7392b0d5403676b0b3ab9ff09c1e65d8ab9e1c34349bba9be605d76cf622640 category: dev optional: true - name: pandoc - version: 3.6.2 + version: 3.6.3 manager: conda platform: win-64 dependencies: {} - url: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.2-h57928b3_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.6.3-h57928b3_0.conda hash: - md5: 05afb57dcba13f72295a1790b95a7996 - sha256: b9b7480ba2339c2e9c48ec66bfce1a93b1fa398bad3404ecc8cbc088b5af2250 + md5: 9b999036cccf0d5a94ed3c0b0edbb905 + sha256: ffdb8fd1da7419f6625c8b2339a12f9669a705ada4177b763cc796c60763f734 category: dev optional: true - name: pandocfilters @@ -5293,31 +5391,31 @@ package: category: main optional: false - name: pip - version: '25.0' + version: 25.0.1 manager: conda platform: linux-64 dependencies: python: '>=3.9,<3.13.0a0' setuptools: '' wheel: '' - url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda hash: - md5: c2548760a02ed818f92dd0d8c81b55b4 - sha256: 094fa4c825f8b9e8403e0c0b569c3d50892325acdac1010ff43cc3ac65bf62cd + md5: 79b5c1440aedc5010f687048d9103628 + sha256: 585940f09d87787f79f73ff5dff8eb2af8a67e5bec5eebf2f553cd26c840ba69 category: main optional: false - name: pip - version: '25.0' + version: 25.0.1 manager: conda platform: win-64 dependencies: python: '>=3.9,<3.13.0a0' setuptools: '' wheel: '' - url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda hash: - md5: c2548760a02ed818f92dd0d8c81b55b4 - sha256: 094fa4c825f8b9e8403e0c0b569c3d50892325acdac1010ff43cc3ac65bf62cd + md5: 79b5c1440aedc5010f687048d9103628 + sha256: 585940f09d87787f79f73ff5dff8eb2af8a67e5bec5eebf2f553cd26c840ba69 category: main optional: false - name: pkgutil-resolve-name @@ -5617,7 +5715,7 @@ package: manager: conda platform: linux-64 dependencies: - python: '' + python: '>=3.9' url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5629,7 +5727,7 @@ package: manager: conda platform: win-64 dependencies: - python: '' + python: '>=3.9' url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: md5: 12c566707c80111f9799308d9e265aef @@ -5748,15 +5846,15 @@ package: dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=13' - mkl: '>=2023.2.0,<2024.0a0' + mkl: '>=2024.1.0,<2025.0a0' numpy: '>=1.19,<3' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* scipy: '>=0.13' - url: https://conda.anaconda.org/conda-forge/linux-64/pydiso-0.1.2-py311h979a38d_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydiso-0.1.2-py311h19ea254_0.conda hash: - md5: b95de0fa0dd8d8ec06be59b212f2e06a - sha256: 567eff98ec44e1ebee2dc326f371615c7cd6419817ee070f3d1aba0e929ee5ac + md5: c167267bfdb40fd2b924e06e9c7241a5 + sha256: e16eed2ff0eb8f45868ca47d61322052530475a292fcda8101d5c1241c428b27 category: main optional: false - name: pydiso @@ -5764,7 +5862,7 @@ package: manager: conda platform: win-64 dependencies: - mkl: '>=2023.2.0,<2024.0a0' + mkl: '>=2024.2.2,<2025.0a0' numpy: '>=1.19,<3' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* @@ -5772,10 +5870,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/pydiso-0.1.2-py311h6340b4d_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydiso-0.1.2-py311h66870c1_0.conda hash: - md5: 442ca13ff6a08fe31945472d6b1b2fe5 - sha256: 9c6fc6b81a595d3631c267ad96c0931fe5e6c726a58ff47680da61bf10a78001 + md5: 84cec6512899d9afc17baaad404ad74c + sha256: 72cbc2c46902724c61f7b745e4c3538f8814053fafb274aecae7c6b70ae92862 category: main optional: false - name: pygments @@ -5813,7 +5911,7 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '' + python: '>=3.9' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' @@ -5834,7 +5932,7 @@ package: isort: '>=4.2.5,<7,!=5.13.0' mccabe: '>=0.6,<0.8' platformdirs: '>=2.2.0' - python: '' + python: '>=3.9' tomli: '>=1.1.0' tomlkit: '>=0.10.1' typing_extensions: '>=3.10.0' @@ -5845,57 +5943,35 @@ package: category: dev optional: true - name: pymatsolver - version: 0.2.0 + version: 0.3.1 manager: conda platform: linux-64 dependencies: - pydiso: '' - pymatsolver-base: 0.2.0 - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.2.0-ha770c72_3.conda + numpy: '>=1.21' + packaging: '' + pydiso: '>=0.1' + python: '>=3.10' + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.3.1-pyh48887ae_201.conda hash: - md5: 71c5698e2f1f19b16164bae528b143ca - sha256: 8d16b3c276ffd5f35890bba6539f3f526cc93061b0320eee2c8d488e7d5089de + md5: b6805e522702eabf2ebbd236490d5eed + sha256: d49ad9b58b9eeae204a3677cafc389c00c7f0f830ef76f481ab9aaf3e0260bad category: main optional: false - name: pymatsolver - version: 0.2.0 - manager: conda - platform: win-64 - dependencies: - pydiso: '' - pymatsolver-base: 0.2.0 - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.2.0-ha770c72_3.conda - hash: - md5: 71c5698e2f1f19b16164bae528b143ca - sha256: 8d16b3c276ffd5f35890bba6539f3f526cc93061b0320eee2c8d488e7d5089de - category: main - optional: false -- name: pymatsolver-base - version: 0.2.0 - manager: conda - platform: linux-64 - dependencies: - numpy: '' - python: '' - scipy: '' - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-base-0.2.0-pyh44b312d_3.conda - hash: - md5: d3843c2374465a0d1a0eb15cc87669c4 - sha256: d03fd3f24f87d7c07675b15129b6e481485500304e03aae35eb93224e2f757b1 - category: main - optional: false -- name: pymatsolver-base - version: 0.2.0 + version: 0.3.1 manager: conda platform: win-64 dependencies: - numpy: '' - python: '' - scipy: '' - url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-base-0.2.0-pyh44b312d_3.conda + numpy: '>=1.21' + packaging: '' + pydiso: '>=0.1' + python: '>=3.10' + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/noarch/pymatsolver-0.3.1-pyh48887ae_201.conda hash: - md5: d3843c2374465a0d1a0eb15cc87669c4 - sha256: d03fd3f24f87d7c07675b15129b6e481485500304e03aae35eb93224e2f757b1 + md5: b6805e522702eabf2ebbd236490d5eed + sha256: d49ad9b58b9eeae204a3677cafc389c00c7f0f830ef76f481ab9aaf3e0260bad category: main optional: false - name: pyparsing @@ -6142,6 +6218,43 @@ package: sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca category: dev optional: true +- name: python-mumps + version: 0.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + mumps-seq: '>=5.7.3,<5.7.4.0a0' + numpy: '>=1.19,<3' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* + scipy: '>=1.8' + url: https://conda.anaconda.org/conda-forge/linux-64/python-mumps-0.0.3-py311h4b558b0_0.conda + hash: + md5: 5c50e4db02aa7d89b5200773605175e1 + sha256: a46217f37ead2d17a59626d8f23517ba0f3026b9dd281ec251e880b3afe4cb13 + category: main + optional: false +- name: python-mumps + version: 0.0.3 + manager: conda + platform: win-64 + dependencies: + mumps-seq: '>=5.7.3,<5.7.4.0a0' + numpy: '>=1.19,<3' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* + scipy: '>=1.8' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + url: https://conda.anaconda.org/conda-forge/win-64/python-mumps-0.0.3-py311h5bfbc98_0.conda + hash: + md5: 5e8a15c6501520752ca264fa7a1a762d + sha256: 330afd54afd2087de0aa320be05dbbee64893359fe395067209e8c8fd9650b05 + category: main + optional: false - name: python-tzdata version: '2023.4' manager: conda @@ -6363,7 +6476,7 @@ package: platform: linux-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.9' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda @@ -6378,7 +6491,7 @@ package: platform: win-64 dependencies: attrs: '>=22.2.0' - python: '' + python: '>=3.9' rpds-py: '>=0.7.0' typing_extensions: '>=4.4.0' url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda @@ -6553,7 +6666,7 @@ package: libgfortran5: '>=13.3.0' liblapack: '>=3.9.0,<4.0a0' libstdcxx: '>=13' - numpy: '>=1.23.5' + numpy: <2.3 python: '>=3.11,<3.12.0a0' python_abi: 3.11.* url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he9a78e4_2.conda @@ -6570,7 +6683,7 @@ package: libblas: '>=3.9.0,<4.0a0' libcblas: '>=3.9.0,<4.0a0' liblapack: '>=3.9.0,<4.0a0' - numpy: '>=1.23.5' + numpy: <2.3 python: '>=3.11,<3.12.0a0' python_abi: 3.11.* ucrt: '>=10.0.20348.0' @@ -8349,7 +8462,7 @@ package: libgcc: '>=13' python: '>=3.11,<3.12.0a0' python_abi: 3.11.* - zstd: '>=1.5.6,<1.6.0a0' + zstd: '>=1.5.6,<1.5.7.0a0' url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda hash: md5: aec590674ba365e50ae83aa2d6e1efae @@ -8367,7 +8480,7 @@ package: ucrt: '>=10.0.20348.0' vc: '>=14.2,<15' vc14_runtime: '>=14.29.30139' - zstd: '>=1.5.6,<1.6.0a0' + zstd: '>=1.5.6,<1.5.7.0a0' url: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py311h53056dc_1.conda hash: md5: 7d4c123cbb5e6293dd4dd2f8d30f0de4 diff --git a/pyproject.toml b/pyproject.toml index 1127bcad..2356acac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "simpeg-drivers" -version = "0.2.0" +version = "0.2.1-alpha.1" description = "Application to run SimPEG inversions with geoh5 files from Geoscience Analyst." license = "MIT" authors = ["Mira Geoscience "] @@ -39,19 +39,19 @@ scipy = "~1.14.0" ## Pip dependencies from Git repositories #---------------------------------------- -geoh5py = {version = ">=0.10.1rc1, <0.11.0a.dev", source = "pypi", allow-prereleases = true} +geoh5py = {version = ">=0.10.1rc1, <0.11.dev", source = "pypi", allow-prereleases = true} #geoh5py = {git = "https://github.com/MiraGeoscience/geoh5py.git", rev = "release/0.10.0"} -octree-creation-app = {version = ">=0.2.0rc1, <0.3.0a.dev", source = "pypi", allow-prereleases = true} +octree-creation-app = {version = ">=0.2.0rc1, <0.3.dev", source = "pypi", allow-prereleases = true} #octree-creation-app = {git = "https://github.com/MiraGeoscience/octree-creation-app.git", rev = "release/0.2.0"} -geoapps-utils = {version = ">=0.4.0rc1, <0.5.0a.dev", source = "pypi", allow-prereleases = true} +geoapps-utils = {version = ">=0.4.0rc1, <0.5.dev", source = "pypi", allow-prereleases = true} #geoapps-utils = {git = "https://github.com/MiraGeoscience/geoapps-utils.git", rev = "release/0.4.0"} -mira-simpeg = {version = ">=0.21.2.1rc1, <0.21.2.2a.dev", source="pypi", allow-prereleases = true, extras = ["dask"]} +mira-simpeg = {version = ">=0.21.2.1rc1, <0.21.2.2.dev", source="pypi", allow-prereleases = true, extras = ["dask"]} #mira-simpeg = {git = "https://github.com/MiraGeoscience/simpeg.git", rev = "release/0.21.2.1", extras = ["dask"]} -param-sweeps = {version = ">=0.2.0rc1, <0.3.0a.dev", source = "pypi", allow-prereleases = true} +param-sweeps = {version = ">=0.2.0rc1, <0.3.dev", source = "pypi", allow-prereleases = true} #param-sweeps = {git = "https://github.com/MiraGeoscience/param-sweeps.git", rev = "release/0.2.0"} ## force some versions to resolve incompatible resolution between PyPI and Conda @@ -99,11 +99,12 @@ fsspec = "2022.*" # from simpeg[dask] geoana = ">=0.5.0, <0.6.0" # from simpeg h5py = ">=3.2.1, <4.0.0" # from geoh5py matplotlib-base = ">=3.8.4, <3.9.0" # from simpeg -mkl = "2023.2, <2024.1" # from simpeg +mkl = ">=2024.2.2, <2025.dev" # from simpeg pandas = ">=2.2.1, <2.3.0" # from SimPEG, also used by targeting-workflow, petro-lingo pydantic = ">=2.5.2, <3.0.0" # from geoh5py, geoapps-utils pydiso = ">=0.1.0, <0.2.0" # from simpeg -pymatsolver = ">=0.2.0, <0.3.0" # from simpeg +python-mumps = ">=0.0.3, <1.0.0" # from simpeg +pymatsolver = ">=0.3.0, <0.4.0" # from simpeg scikit-learn = ">=1.4.0, <1.5.0" # from SimPEG, also used by geo-unsup-mapper, petro-lingo tqdm = ">=4.66.1, <5.0.0" # from simpeg zarr = ">=2.14.2, <2.15.0" # from simpeg[dask] diff --git a/simpeg_drivers/__init__.py b/simpeg_drivers/__init__.py index 8b199ae0..5a6451d2 100644 --- a/simpeg_drivers/__init__.py +++ b/simpeg_drivers/__init__.py @@ -12,7 +12,7 @@ from __future__ import annotations -__version__ = "0.2.0" +__version__ = "0.2.1-alpha.1" import logging diff --git a/tests/__init__.py b/tests/__init__.py index 4d06f672..f488969a 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -7,3 +7,8 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# +# This file is part of simpeg-drivers. +# +# simpeg-drivers is distributed under the terms and conditions of the MIT License +# (see LICENSE file at the root of this source code package). diff --git a/tests/assets_path_test.py b/tests/assets_path_test.py deleted file mode 100644 index c0510ad1..00000000 --- a/tests/assets_path_test.py +++ /dev/null @@ -1,20 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 simpeg_drivers import assets_path - - -def test_assets_directory_exist(): - assert assets_path().is_dir() - - -def test_uijson_files_exists(): - assert (assets_path() / "uijson").is_dir() - assert next(iter((assets_path() / "uijson").iterdir())).is_file() diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 5317a66f..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,25 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 pytest -import tomli as toml - - -@pytest.fixture -def pyproject() -> dict[str]: - """Return the pyproject.toml as a dictionary.""" - - pyproject_path = Path(__file__).resolve().parents[1] / "pyproject.toml" - with open(pyproject_path, "rb") as pyproject_file: - return toml.load(pyproject_file) diff --git a/tests/constants_test.py b/tests/constants_test.py deleted file mode 100644 index 991285a6..00000000 --- a/tests/constants_test.py +++ /dev/null @@ -1,44 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# Copyright (c) 2024-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 simpeg_drivers.electricals.direct_current.three_dimensions import ( - constants as direct_current_constants, -) -from simpeg_drivers.electricals.induced_polarization.three_dimensions import ( - constants as induced_polarization_constants, -) -from simpeg_drivers.potential_fields.gravity import constants as gravity_constants -from simpeg_drivers.potential_fields.magnetic_scalar import ( - constants as magnetic_scalar_constants, -) -from simpeg_drivers.potential_fields.magnetic_vector import ( - constants as magnetic_vector_constants, -) - - -constants = [ - gravity_constants, - magnetic_scalar_constants, - magnetic_vector_constants, - direct_current_constants, - induced_polarization_constants, -] - - -def test_deprecated_uijson_fields(): - deprecated_fields = ["default"] - for constant in constants: - d_u_j = constant.default_ui_json - for value in d_u_j.values(): - if isinstance(value, dict): - for field in deprecated_fields: - assert field not in value.keys() diff --git a/tests/data_test.py b/tests/data_test.py deleted file mode 100644 index b548390f..00000000 --- a/tests/data_test.py +++ /dev/null @@ -1,305 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 -import pytest -import simpeg -from discretize.utils import mesh_builder_xyz -from geoh5py.objects import Points -from geoh5py.workspace import Workspace -from octree_creation_app.driver import OctreeDriver -from octree_creation_app.utils import treemesh_2_octree - -from simpeg_drivers.components import InversionData -from simpeg_drivers.potential_fields.magnetic_vector.driver import ( - MagneticVectorDriver, - MagneticVectorParams, -) -from simpeg_drivers.utils.testing import Geoh5Tester, setup_inversion_workspace - - -def setup_params(tmp_path): - geoh5, entity, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=(2,), - n_electrodes=2, - n_lines=2, - inversion_type="magnetic_vector", - ) - tmi_channel, gyz_channel = survey.add_data( - { - "tmi": {"values": np.random.rand(survey.n_vertices)}, - "gyz": {"values": np.random.rand(survey.n_vertices)}, - } - ) - - mesh = model.parent - geotest = Geoh5Tester( - geoh5, tmp_path, "test.geoh5", params_class=MagneticVectorParams - ) - geotest.set_param("mesh", str(mesh.uid)) - geotest.set_param("data_object", str(survey.uid)) - geotest.set_param("topography_object", str(topography.uid)) - geotest.set_param("tmi_channel", str(tmi_channel.uid)) - geotest.set_param("gyz_channel", str(gyz_channel.uid)) - geotest.set_param("topography", str(topography.uid)) - return geotest.make() - - -def test_save_data(tmp_path: Path): - ws, params = setup_params(tmp_path) - locs = params.data_object.vertices - params.update( - { - "window_center_x": np.mean(locs[:, 0]), - "window_center_y": np.mean(locs[:, 1]), - "window_width": 100.0, - "window_height": 100.0, - } - ) - data = InversionData(ws, params) - - assert len(data.entity.vertices) > 0 - - -def test_survey_data(tmp_path: Path): - X, Y, Z = np.meshgrid(np.linspace(0, 100, 3), np.linspace(0, 100, 3), 0) - verts = np.column_stack([X.ravel(), Y.ravel(), Z.ravel()]) - with Workspace(tmp_path / "test_workspace.geoh5") as workspace: - test_data_object = Points.create( - workspace, vertices=verts, name="test_data_object" - ) - bxx_data, byy_data, bzz_data = test_data_object.add_data( - { - "bxx": { - "association": "VERTEX", - "values": np.arange(len(verts)).astype(float), - }, - "byy": { - "association": "VERTEX", - "values": len(verts) + np.arange(len(verts)).astype(float), - }, - "bzz": { - "association": "VERTEX", - "values": 2 * len(verts) + np.arange(len(verts)).astype(float), - }, - } - ) - test_topo_object = Points.create( - workspace, vertices=verts, name="test_topo_object" - ) - _ = test_topo_object.add_data( - {"elev": {"association": "VERTEX", "values": 100 * np.ones(len(verts))}} - ) - topo = workspace.get_entity("elev")[0] - mesh = mesh_builder_xyz( - verts, - [20, 20, 20], - depth_core=50, - mesh_type="TREE", - ) - mesh = OctreeDriver.refine_tree_from_surface( - mesh, - test_topo_object, - levels=[2], - diagonal_balance=False, - finalize=True, - ) - - mesh = treemesh_2_octree(workspace, mesh) - with pytest.warns( - DeprecationWarning, - match="The use of 'receiver_offset_z' will be deprecated in future release.", - ): - params = MagneticVectorParams( - forward_only=False, - geoh5=workspace, - data_object=test_data_object.uid, - topography_object=test_topo_object.uid, - topography=topo, - bxx_channel=bxx_data.uid, - bxx_uncertainty=0.1, - byy_channel=byy_data.uid, - byy_uncertainty=0.2, - bzz_channel=bzz_data.uid, - bzz_uncertainty=0.3, - mesh=mesh.uid, - starting_model=0.0, - tile_spatial=2, - z_from_topo=True, - receivers_offset_z=50.0, - resolution=0.0, - ) - - driver = MagneticVectorDriver(params) - - assert driver.inversion is not None - - local_survey_a = driver.inverse_problem.dmisfit.objfcts[0].simulation.survey - local_survey_b = driver.inverse_problem.dmisfit.objfcts[1].simulation.survey - - # test locations - - np.testing.assert_array_equal( - verts[driver.sorting[0], :2], local_survey_a.receiver_locations[:, :2] - ) - np.testing.assert_array_equal( - verts[driver.sorting[1], :2], local_survey_b.receiver_locations[:, :2] - ) - assert all( - local_survey_a.receiver_locations[:, 2] == 150.0 - ) # 150 = 100 (z_from_topo) + 50 (receivers_offset_z) - assert all(local_survey_b.receiver_locations[:, 2] == 150.0) - - # test observed data - sorting = np.hstack(driver.sorting) - expected_dobs = np.column_stack( - [bxx_data.values, byy_data.values, bzz_data.values] - )[sorting].ravel() - survey_dobs = [local_survey_a.dobs, local_survey_b.dobs] - np.testing.assert_array_equal(expected_dobs, np.hstack(survey_dobs)) - - # test save geoh5 iteration data - driver.directives.save_iteration_data_directive.write(99, survey_dobs) - - with workspace.open(): - bxx_test = workspace.get_entity("Iteration_99_bxx")[0].values - byy_test = workspace.get_entity("Iteration_99_byy")[0].values - bzz_test = workspace.get_entity("Iteration_99_bzz")[0].values - - np.testing.assert_array_equal(bxx_test, bxx_data.values) - np.testing.assert_array_equal(byy_test, byy_data.values) - np.testing.assert_array_equal(bzz_test, bzz_data.values) - - driver.directives.save_iteration_residual_directive.write(99, survey_dobs) - - with workspace.open(): - assert np.all( - workspace.get_entity("Iteration_99_bxx_Residual")[0].values == 0 - ), "Residual data should be zero." - assert np.all( - workspace.get_entity("Iteration_99_byy_Residual")[0].values == 0 - ), "Residual data should be zero." - assert np.all( - workspace.get_entity("Iteration_99_bzz_Residual")[0].values == 0 - ), "Residual data should be zero." - - -def test_has_tensor(): - assert InversionData.check_tensor(["Gxx"]) - assert InversionData.check_tensor(["Gxy"]) - assert InversionData.check_tensor(["Gxz"]) - assert InversionData.check_tensor(["Gyy"]) - assert InversionData.check_tensor(["Gyx"]) - assert InversionData.check_tensor(["Gyz"]) - assert InversionData.check_tensor(["Gzz"]) - assert InversionData.check_tensor(["Gzx"]) - assert InversionData.check_tensor(["Gzy"]) - assert InversionData.check_tensor(["Gxx", "Gyy", "tmi"]) - assert not InversionData.check_tensor(["tmi"]) - - -def test_get_uncertainty_component(tmp_path: Path): - ws, params = setup_params(tmp_path) - locs = params.data_object.vertices - params.update( - { - "window_center_x": np.mean(locs[:, 0]), - "window_center_y": np.mean(locs[:, 1]), - "window_width": 100.0, - "window_height": 100.0, - } - ) - params.tmi_uncertainty = 1.0 - data = InversionData(ws, params) - unc = data.get_data()[2]["tmi"] - assert len(np.unique(unc)) == 1 - assert np.unique(unc)[0] == 1 - assert len(unc) == data.entity.n_vertices - - -def test_displace(tmp_path: Path): - ws, params = setup_params(tmp_path) - locs = params.data_object.vertices - params.update( - { - "window_center_x": np.mean(locs[:, 0]), - "window_center_y": np.mean(locs[:, 1]), - "window_width": 100.0, - "window_height": 100.0, - } - ) - data = InversionData(ws, params) - test_locs = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) - test_offset = np.array([[1.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 0.0, 0.0]]) - expected_locs = np.array([[2.0, 2.0, 3.0], [5.0, 5.0, 6.0], [8.0, 8.0, 9.0]]) - displaced_locs = data.displace(test_locs, test_offset) - assert np.all(displaced_locs == expected_locs) - - test_offset = np.array([[0.0, 1.0, 0.0], [0.0, 1.0, 0.0], [0.0, 1.0, 0.0]]) - expected_locs = np.array([[1.0, 3.0, 3.0], [4.0, 6.0, 6.0], [7.0, 9.0, 9.0]]) - displaced_locs = data.displace(test_locs, test_offset) - assert np.all(displaced_locs == expected_locs) - - test_offset = np.array([[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]]) - expected_locs = np.array([[1.0, 2.0, 4.0], [4.0, 5.0, 7.0], [7.0, 8.0, 10.0]]) - displaced_locs = data.displace(test_locs, test_offset) - assert np.all(displaced_locs == expected_locs) - - -def test_drape(tmp_path: Path): - ws, params = setup_params(tmp_path) - locs = params.data_object.vertices - params.update( - { - "window_center_x": np.mean(locs[:, 0]), - "window_center_y": np.mean(locs[:, 1]), - "window_width": 100.0, - "window_height": 100.0, - } - ) - data = InversionData(ws, params) - test_locs = np.array([[1.0, 2.0, 1.0], [2.0, 1.0, 1.0], [8.0, 9.0, 1.0]]) - radar_ch = np.array([1.0, 2.0, 3.0]) - expected_locs = np.array([[1.0, 2.0, 2.0], [2.0, 1.0, 3.0], [8.0, 9.0, 4.0]]) - draped_locs = data.drape(test_locs, radar_ch) - - assert np.all(draped_locs == expected_locs) - - -def test_normalize(tmp_path: Path): - ws, params = setup_params(tmp_path) - data = InversionData(ws, params) - len_data = len(data.observed["tmi"]) - data.observed = { - "tmi": np.arange(len_data, dtype=float), - "gz": np.arange(len_data, dtype=float), - } - data.components = list(data.observed.keys()) - data.normalizations = data.get_normalizations() - test_data = data.normalize(data.observed) - assert np.all( - np.hstack(list(data.normalizations[None].values())).tolist() - == np.repeat([1, -1], len_data) - ) - assert all(test_data["gz"] == (-1 * data.observed["gz"])) - - -def test_get_survey(tmp_path: Path): - ws, params = setup_params(tmp_path) - data = InversionData(ws, params) - survey = data.create_survey() - assert isinstance(survey[0], simpeg.potential_fields.magnetics.Survey) diff --git a/tests/run_tests/driver_ground_tem_test.py b/tests/driver_ground_tem_test.py similarity index 96% rename from tests/run_tests/driver_ground_tem_test.py rename to tests/driver_ground_tem_test.py index 68e2c4dc..f20764b4 100644 --- a/tests/run_tests/driver_ground_tem_test.py +++ b/tests/driver_ground_tem_test.py @@ -15,6 +15,7 @@ import numpy as np from geoh5py.workspace import Workspace +from pymatsolver.direct import Mumps from simpeg_drivers.electromagnetics.time_domain import TimeDomainElectromagneticsParams from simpeg_drivers.electromagnetics.time_domain.driver import ( @@ -30,11 +31,7 @@ # To test the full run and validate the inversion. # Move this file out of the test directory and run. -target_run = { - "data_norm": 5.95181e-7, - "phi_d": 86.58, - "phi_m": 443.1, -} +target_run = {"data_norm": 7.646233e-07, "phi_d": 86.58, "phi_m": 443.1} def test_tiling_ground_tem( @@ -134,6 +131,7 @@ def test_ground_tem_fwr_run( assert "closed" in caplog.records[0].message + fwr_driver.data_misfit.objfcts[0].simulation.solver = Mumps fwr_driver.run() @@ -220,8 +218,10 @@ def test_ground_tem_run(tmp_path: Path, max_iterations=1, pytest=True): ) params.write_input_file(path=tmp_path, name="Inv_run") - driver = TimeDomainElectromagneticsDriver.start(str(tmp_path / "Inv_run.ui.json")) + driver = TimeDomainElectromagneticsDriver(params) + driver.data_misfit.objfcts[0].simulation.solver = Mumps + driver.run() with geoh5.open() as run_ws: output = get_inversion_output( driver.params.geoh5.h5file, driver.params.out_group.uid diff --git a/tests/driver_test.py b/tests/driver_test.py deleted file mode 100644 index 55363efe..00000000 --- a/tests/driver_test.py +++ /dev/null @@ -1,58 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 pathlib import Path - -import numpy as np - -from simpeg_drivers.potential_fields import GravityParams -from simpeg_drivers.potential_fields.gravity.driver import GravityDriver -from simpeg_drivers.utils.testing import setup_inversion_workspace - - -def test_smallness_terms(tmp_path: Path): - n_grid_points = 2 - refinement = (2,) - - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.75, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - refinement=refinement, - flatten=False, - ) - - gz = survey.add_data({"gz": {"values": np.ones(survey.n_vertices)}}) - mesh = model.parent - params = GravityParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - data_object=gz.parent.uid, - starting_model=1e-4, - reference_model=0.0, - alpha_s=1.0, - s_norm=0.0, - gradient_type="components", - gz_channel_bool=True, - z_from_topo=False, - gz_channel=gz.uid, - gz_uncertainty=2e-3, - lower_bound=0.0, - max_global_iterations=1, - initial_beta_ratio=1e-2, - prctile=100, - store_sensitivities="ram", - ) - params.alpha_s = None - driver = GravityDriver(params) - assert driver.regularization.objfcts[0].alpha_s == 0.0 diff --git a/tests/locations_test.py b/tests/locations_test.py deleted file mode 100644 index cd66c75c..00000000 --- a/tests/locations_test.py +++ /dev/null @@ -1,103 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 -import pytest -from geoh5py.objects import Grid2D, Points - -from simpeg_drivers.components.locations import InversionLocations -from simpeg_drivers.potential_fields import MagneticVectorParams -from simpeg_drivers.utils.testing import Geoh5Tester, setup_inversion_workspace - - -def setup_params(tmp_path): - geoh5, entity, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=(2,), - n_electrodes=2, - n_lines=2, - ) - - geotest = Geoh5Tester(geoh5, tmp_path, "test.geoh5", MagneticVectorParams) - mesh = geoh5.get_entity("mesh")[0] - topography_object = geoh5.get_entity("topography")[0] - - geotest.set_param("mesh", str(mesh.uid)) - geotest.set_param("topography_object", str(topography_object.uid)) - - return geotest.make() - - -def test_mask(tmp_path: Path): - ws, params = setup_params(tmp_path) - locations = InversionLocations(ws, params) - loc_mask = [0, 1, 1, 0] - locations.mask = loc_mask - assert isinstance(locations.mask, np.ndarray) - assert locations.mask.dtype == bool - loc_mask = [0, 1, 2, 3] - with pytest.raises(ValueError) as excinfo: - locations.mask = loc_mask - assert "Badly formed" in str(excinfo.value) - - -def test_get_locations(tmp_path: Path): - ws, params = setup_params(tmp_path) - locs = np.ones((10, 3), dtype=float) - points_object = Points.create(ws, name="test-data", vertices=locs) - locations = InversionLocations(ws, params) - dlocs = locations.get_locations(points_object) - np.testing.assert_allclose(locs, dlocs) - - xg, yg = np.meshgrid(np.arange(5) + 0.5, np.arange(5) + 0.5) - locs = np.c_[xg.ravel(), yg.ravel(), np.zeros(25)] - grid_object = Grid2D.create( - ws, - origin=[0, 0, 0], - u_cell_size=1.0, - v_cell_size=1.0, - u_count=5, - v_count=5, - rotation=0.0, - dip=0.0, - ) - dlocs = locations.get_locations(grid_object) - np.testing.assert_allclose(dlocs, locs) - - -def test_filter(tmp_path: Path): - ws, params = setup_params(tmp_path) - locations = InversionLocations(ws, params) - test_data = np.array([0, 1, 2, 3, 4, 5]) - locations.mask = np.array([0, 0, 1, 1, 1, 0]) - filtered_data = locations.filter(test_data) - assert np.all(filtered_data == [2, 3, 4]) - - test_data = {"key": test_data} - filtered_data = locations.filter(test_data) - assert np.all(filtered_data["key"] == [2, 3, 4]) - - -def test_z_from_topo(tmp_path: Path): - ws, params = setup_params(tmp_path) - locations = InversionLocations(ws, params) - locs = locations.set_z_from_topo(np.array([[0.0, 0.0, 0.0]])) - assert np.isclose(locs[0, 2], 49.91677) - - params.topography = 320.0 - locations = InversionLocations(ws, params) - locs = locations.set_z_from_topo(np.array([[315674, 6070832, 0]])) - assert locs[0, 2] == 320.0 diff --git a/tests/meshes_test.py b/tests/meshes_test.py deleted file mode 100644 index 63a6fda2..00000000 --- a/tests/meshes_test.py +++ /dev/null @@ -1,194 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 -import pytest -from discretize import TreeMesh -from geoh5py import Workspace -from geoh5py.objects import Octree -from octree_creation_app.utils import octree_2_treemesh, treemesh_2_octree - -from simpeg_drivers.components import InversionData, InversionMesh, InversionTopography -from simpeg_drivers.potential_fields import MagneticVectorParams -from simpeg_drivers.utils.testing import Geoh5Tester, setup_inversion_workspace - - -def setup_params(tmp_path): - geoh5, entity, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=(2,), - n_electrodes=4, - n_lines=4, - inversion_type="magnetic_vector", - ) - - mesh = model.parent - - tmi_channel, gyz_channel = survey.add_data( - { - "tmi": {"values": np.random.rand(survey.n_vertices)}, - "gyz": {"values": np.random.rand(survey.n_vertices)}, - } - ) - elevation = topography.add_data( - {"elevation": {"values": topography.vertices[:, 2]}} - ) - elevation = topography.children[0] - geotest = Geoh5Tester(geoh5, tmp_path, "test.geoh5", MagneticVectorParams) - geotest.set_param("mesh", str(mesh.uid)) - geotest.set_param("data_object", str(survey.uid)) - geotest.set_param("topography_object", str(topography.uid)) - geotest.set_param("tmi_channel", str(tmi_channel.uid)) - geotest.set_param("topography", str(elevation.uid)) - return geotest.make() - - -def test_initialize(tmp_path: Path): - ws, params = setup_params(tmp_path) - inversion_mesh = InversionMesh(ws, params) - assert isinstance(inversion_mesh.mesh, TreeMesh) - - -def test_to_treemesh(tmp_path): - workspace = Workspace(tmp_path / "test_octree.geoh5") - - # Positive cells sizes and Z ordering - cells = np.array( - [ - [0, 0, 0, 1], - [1, 0, 0, 1], - [0, 1, 0, 1], - [1, 1, 0, 1], - [0, 0, 1, 1], - [1, 0, 1, 1], - [0, 1, 1, 1], - [1, 1, 1, 1], - ] - ) - octree = Octree.create( - workspace, - u_count=2, - v_count=2, - w_count=2, - u_cell_size=1, - v_cell_size=1, - w_cell_size=1, - octree_cells=cells, - name="All is well", - ) - mesh = InversionMesh.to_treemesh(octree) - assert np.allclose(mesh.cell_centers, octree.centroids) - - # IJK ordering - cells = np.array( - [ - [0, 0, 0, 1], - [0, 0, 1, 1], - [0, 1, 0, 1], - [0, 1, 1, 1], - [1, 0, 0, 1], - [1, 0, 1, 1], - [1, 1, 0, 1], - [1, 1, 1, 1], - ] - ) - octree = Octree.create( - workspace, - u_count=2, - v_count=2, - w_count=2, - u_cell_size=1, - v_cell_size=1, - w_cell_size=1, - octree_cells=cells, - name="Uh oh", - ) - mesh = InversionMesh.to_treemesh(octree) - assert np.allclose(mesh.cell_centers, octree.centroids) - - # Negative cell sizes - cells = np.array( - [ - [0, 0, 1, 1], - [1, 0, 1, 1], - [0, 1, 1, 1], - [1, 1, 1, 1], - [0, 0, 0, 1], - [1, 0, 0, 1], - [0, 1, 0, 1], - [1, 1, 0, 1], - ] - ) - octree = Octree.create( - workspace, - u_count=2, - v_count=2, - w_count=2, - u_cell_size=1, - v_cell_size=1, - w_cell_size=-1, - octree_cells=cells, - name="All is well", - ) - mesh = InversionMesh.to_treemesh(octree) - assert np.allclose(mesh.cell_centers, octree.centroids) - - -def test_ensure_cell_convention(tmp_path): - workspace = Workspace(tmp_path / "test_octree.geoh5") - octree_cells = np.array( - [ - (0, 0, 0, 1), - (1, 0, 0, 1), - (0, 1, 0, 1), - (1, 1, 0, 1), - (0, 0, 1, 1), - (1, 0, 1, 1), - (0, 1, 1, 1), - (1, 1, 1, 1), - ], - dtype=[("I", " 0) - - -if __name__ == "__main__": - # Full run - - test_dc_3d_fwr_run( - Path("./"), - n_electrodes=20, - n_lines=5, - refinement=(4, 8), - ) - - test_dc_3d_run( - Path("./"), - n_lines=5, - max_iterations=15, - pytest=False, - ) diff --git a/tests/run_tests/driver_fem_test.py b/tests/run_tests/driver_fem_test.py deleted file mode 100644 index 88fdfbee..00000000 --- a/tests/run_tests/driver_fem_test.py +++ /dev/null @@ -1,182 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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). ' -# ' -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -# pylint: disable=too-many-locals - -from __future__ import annotations - -from pathlib import Path - -import numpy as np -from geoh5py import Workspace -from geoh5py.groups import SimPEGGroup - -from simpeg_drivers.electromagnetics.frequency_domain.driver import ( - FrequencyDomainElectromagneticsDriver, -) -from simpeg_drivers.electromagnetics.frequency_domain.params import ( - FrequencyDomainElectromagneticsParams, -) -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": 47.522882323952054, "phi_d": 729, "phi_m": 883.8} - - -def test_fem_fwr_run( - tmp_path: Path, - n_grid_points=3, - refinement=(2,), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=1e-3, - anomaly=1.0, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - refinement=refinement, - drape_height=15.0, - padding_distance=400, - inversion_type="fem", - flatten=True, - ) - params = FrequencyDomainElectromagneticsParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - z_real_channel_bool=True, - z_imag_channel_bool=True, - ) - params.workpath = tmp_path - fwr_driver = FrequencyDomainElectromagneticsDriver(params) - fwr_driver.run() - geoh5.close() - - -def test_fem_run(tmp_path: Path, max_iterations=1, pytest=True): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_fem_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_real": "z_real", - "z_imag": "z_imag", - } - - for comp, cname in components.items(): - data[cname] = [] - uncertainties[f"{cname} uncertainties"] = [] - for ind, freq in enumerate(survey.channels): - data_entity = geoh5.get_entity(f"Iteration_0_{comp}_[{ind}]")[0].copy( - parent=survey - ) - data[cname].append(data_entity) - abs_val = np.abs(data_entity.values) - uncert = survey.add_data( - { - f"uncertainty_{comp}_[{ind}]": { - "values": np.ones_like(abs_val) - * freq - / 200.0 # * 2**(np.abs(ind-1)) - } - } - ) - uncertainties[f"{cname} uncertainties"].append( - uncert.copy(parent=survey) - ) - - data_groups = survey.add_components_data(data) - uncert_groups = survey.add_components_data(uncertainties) - - data_kwargs = {} - for comp, data_group, uncert_group in zip( - components, data_groups, uncert_groups, strict=True - ): - data_kwargs[f"{comp}_channel"] = data_group.uid - data_kwargs[f"{comp}_uncertainty"] = uncert_group.uid - - orig_z_real_1 = geoh5.get_entity("Iteration_0_z_real_[0]")[0].values - - # Run the inverse - params = FrequencyDomainElectromagneticsParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - resolution=0.0, - data_object=survey.uid, - starting_model=1e-3, - reference_model=1e-3, - alpha_s=0.0, - s_norm=0.0, - x_norm=0.0, - y_norm=0.0, - z_norm=0.0, - gradient_type="components", - z_from_topo=False, - upper_bound=0.75, - max_global_iterations=max_iterations, - initial_beta_ratio=1e1, - prctile=100, - coolingRate=3, - chi_factor=0.25, - store_sensitivities="ram", - sens_wts_threshold=1.0, - **data_kwargs, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - driver = FrequencyDomainElectromagneticsDriver(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_z_real_1 - - assert ( - run_ws.get_entity("Iteration_1_z_imag_[1]")[0].entity_type.uid - == run_ws.get_entity("Observed_z_imag_[1]")[0].entity_type.uid - ) - - if pytest: - check_target(output, target_run, tolerance=0.5) - 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_fem_fwr_run(Path("./"), n_grid_points=5, refinement=(4, 4, 4)) - test_fem_run( - Path("./"), - max_iterations=15, - pytest=False, - ) diff --git a/tests/run_tests/driver_grav_test.py b/tests/run_tests/driver_grav_test.py deleted file mode 100644 index 5011dbae..00000000 --- a/tests/run_tests/driver_grav_test.py +++ /dev/null @@ -1,160 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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.workspace import Workspace - -from simpeg_drivers.potential_fields import GravityParams -from simpeg_drivers.potential_fields.gravity.driver import GravityDriver -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": 0.0028055269276044915, "phi_d": 8.315e-05, "phi_m": 0.002882} - - -def test_gravity_fwr_run( - tmp_path: Path, - n_grid_points=2, - refinement=(2,), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.75, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - refinement=refinement, - flatten=False, - ) - params = GravityParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - fwr_driver = GravityDriver(params) - fwr_driver.run() - - -def test_gravity_run( - tmp_path: Path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_gravity_fwr_run0" / "inversion_test.ui.geoh5" - - with Workspace(workpath) as geoh5: - gz = geoh5.get_entity("Iteration_0_gz")[0] - orig_gz = gz.values.copy() - mesh = geoh5.get_entity("mesh")[0] - model = mesh.get_entity("starting_model")[0] - - inds = (mesh.centroids[:, 0] > -35) & (mesh.centroids[:, 0] < 35) - norms = np.ones(mesh.n_cells) * 2 - norms[inds] = 0 - gradient_norms = mesh.add_data({"norms": {"values": norms}}) - - # Test mesh UBC ordered - ind = np.argsort(mesh.octree_cells, order=["K", "J", "I"]) - mesh.octree_cells = mesh.octree_cells[ind] - model.values = model.values[ind] - gradient_norms.values = gradient_norms.values[ind] - - topography = geoh5.get_entity("topography")[0] - - # Turn some values to nan - values = gz.values.copy() - values[0] = np.nan - gz.values = values - - # Run the inverse - params = GravityParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - data_object=gz.parent.uid, - starting_model=1e-4, - reference_model=0.0, - s_norm=0.0, - x_norm=gradient_norms, - y_norm=gradient_norms, - z_norm=gradient_norms, - gradient_type="components", - gz_channel_bool=True, - z_from_topo=False, - gz_channel=gz.uid, - gz_uncertainty=2e-3, - lower_bound=0.0, - max_global_iterations=max_iterations, - initial_beta_ratio=1e-2, - prctile=100, - store_sensitivities="ram", - ) - params.write_input_file(path=tmp_path, name="Inv_run") - - driver = GravityDriver.start(str(tmp_path / "Inv_run.ui.json")) - - assert driver.params.data_object.uid != gz.parent.uid - assert driver.models.upper_bound is np.inf - - with Workspace(driver.params.geoh5.h5file) as run_ws: - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - - residual = run_ws.get_entity("Iteration_1_gz_Residual")[0] - assert np.isnan(residual.values).sum() == 1, "Number of nan residuals differ." - - predicted = next( - pred - for pred in run_ws.get_entity("Iteration_0_gz") - if pred.parent.parent.name == "Gravity Inversion" - ) - assert not any(np.isnan(predicted.values)), ( - "Predicted data should not have nans." - ) - output["data"] = orig_gz - - assert len(run_ws.get_entity("SimPEG.log")) == 2 - - if pytest: - check_target(output, target_run) - 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_gravity_fwr_run( - Path("./"), - n_grid_points=20, - refinement=(4, 8), - ) - - test_gravity_run( - Path("./"), - max_iterations=15, - pytest=False, - ) diff --git a/tests/run_tests/driver_ip_2d_test.py b/tests/run_tests/driver_ip_2d_test.py deleted file mode 100644 index 7cddae02..00000000 --- a/tests/run_tests/driver_ip_2d_test.py +++ /dev/null @@ -1,135 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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.workspace import Workspace - -from simpeg_drivers.electricals.induced_polarization.two_dimensions import ( - InducedPolarization2DParams, -) -from simpeg_drivers.electricals.induced_polarization.two_dimensions.driver import ( - InducedPolarization2DDriver, -) -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": 0.091350, "phi_d": 25630, "phi_m": 0.1578} - - -def test_ip_2d_fwr_run( - tmp_path: Path, - n_electrodes=10, - n_lines=3, - refinement=(4, 6), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=1e-6, - anomaly=1e-1, - n_electrodes=n_electrodes, - n_lines=n_lines, - refinement=refinement, - inversion_type="dcip_2d", - flatten=False, - drape_height=0.0, - ) - params = InducedPolarization2DParams( - forward_only=True, - geoh5=geoh5, - data_object=survey.uid, - mesh=model.parent.uid, - topography_object=topography.uid, - z_from_topo=True, - starting_model=model.uid, - conductivity_model=1e-2, - line_object=geoh5.get_entity("line_ids")[0].uid, - line_id=101, - ) - params.workpath = tmp_path - fwr_driver = InducedPolarization2DDriver(params) - fwr_driver.run() - - -def test_ip_2d_run( - tmp_path: Path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_ip_2d_fwr_run0" / "inversion_test.ui.geoh5" - - with Workspace(workpath) as geoh5: - chargeability = geoh5.get_entity("Iteration_0_ip")[0] - mesh = geoh5.get_entity("Models")[0] - topography = geoh5.get_entity("topography")[0] - - # Run the inverse - params = InducedPolarization2DParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - data_object=chargeability.parent.uid, - chargeability_channel=chargeability.uid, - chargeability_uncertainty=2e-4, - line_object=geoh5.get_entity("line_ids")[0].uid, - line_id=101, - starting_model=1e-6, - reference_model=1e-6, - conductivity_model=1e-2, - s_norm=0.0, - x_norm=0.0, - z_norm=0.0, - gradient_type="components", - chargeability_channel_bool=True, - z_from_topo=True, - max_global_iterations=max_iterations, - initial_beta=None, - initial_beta_ratio=1e0, - prctile=100, - upper_bound=0.1, - store_sensitivities="ram", - coolingRate=1, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - - driver = InducedPolarization2DDriver.start(str(tmp_path / "Inv_run.ui.json")) - - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - if geoh5.open(): - output["data"] = chargeability.values[np.isfinite(chargeability.values)] - if pytest: - check_target(output, target_run) - - -if __name__ == "__main__": - # Full run - test_ip_2d_fwr_run( - Path("./"), - n_electrodes=20, - n_lines=3, - refinement=(4, 8), - ) - test_ip_2d_run( - Path("./"), - max_iterations=20, - pytest=False, - ) diff --git a/tests/run_tests/driver_ip_p3d_test.py b/tests/run_tests/driver_ip_p3d_test.py deleted file mode 100644 index 53f2a7bf..00000000 --- a/tests/run_tests/driver_ip_p3d_test.py +++ /dev/null @@ -1,162 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 json -from pathlib import Path - -from geoh5py.groups import SimPEGGroup -from geoh5py.workspace import Workspace - -from simpeg_drivers.electricals.induced_polarization.pseudo_three_dimensions.driver import ( - InducedPolarizationPseudo3DDriver, -) -from simpeg_drivers.electricals.induced_polarization.pseudo_three_dimensions.params import ( - InducedPolarizationPseudo3DParams, -) -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": 0.0919313, "phi_d": 25480, "phi_m": 0.2008} - - -def test_ip_p3d_fwr_run( - tmp_path: Path, - n_electrodes=10, - n_lines=3, - refinement=(4, 6), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=1e-6, - anomaly=1e-1, - n_electrodes=n_electrodes, - n_lines=n_lines, - refinement=refinement, - inversion_type="dcip", - drape_height=0.0, - flatten=False, - ) - - params = InducedPolarizationPseudo3DParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - u_cell_size=5.0, - v_cell_size=5.0, - depth_core=100.0, - expansion_factor=1.1, - padding_distance=100.0, - topography_object=topography.uid, - z_from_topo=True, - data_object=survey.uid, - conductivity_model=1e-2, - starting_model=model.uid, - line_object=geoh5.get_entity("line_ids")[0].uid, - cleanup=True, - ) - params.workpath = tmp_path - fwr_driver = InducedPolarizationPseudo3DDriver(params) - fwr_driver.run() - - -def test_ip_p3d_run( - tmp_path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_ip_p3d_fwr_run0" / "inversion_test.ui.geoh5" - - with Workspace(workpath) as geoh5: - chargeability = geoh5.get_entity("Iteration_0_ip")[0] - out_group = geoh5.get_entity("Line 1")[0].parent - mesh = out_group.get_entity("mesh")[0] # Finds the octree mesh - topography = geoh5.get_entity("topography")[0] - - # Run the inverse - params = InducedPolarizationPseudo3DParams( - geoh5=geoh5, - mesh=mesh.uid, - u_cell_size=5.0, - v_cell_size=5.0, - depth_core=100.0, - expansion_factor=1.1, - padding_distance=100.0, - topography_object=topography.uid, - data_object=chargeability.parent.uid, - chargeability_channel=chargeability.uid, - chargeability_uncertainty=2e-4, - line_object=geoh5.get_entity("line_ids")[0].uid, - conductivity_model=1e-2, - starting_model=1e-6, - reference_model=1e-6, - s_norm=0.0, - x_norm=0.0, - y_norm=0.0, - z_norm=0.0, - gradient_type="components", - chargeability_channel_bool=True, - z_from_topo=True, - max_global_iterations=max_iterations, - initial_beta=None, - initial_beta_ratio=1e0, - prctile=100, - upper_bound=0.1, - coolingRate=1, - cleanup=False, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - - driver = InducedPolarizationPseudo3DDriver.start(str(tmp_path / "Inv_run.ui.json")) - - basepath = workpath.parent - with open(basepath / "lookup.json", encoding="utf8") as f: - lookup = json.load(f) - middle_line_id = next(k for k, v in lookup.items() if v["line_id"] == 101) - - with Workspace(basepath / f"{middle_line_id}.ui.geoh5", mode="r") as workspace: - middle_inversion_group = next( - k for k in workspace.groups if isinstance(k, SimPEGGroup) - ) - filedata = middle_inversion_group.get_entity("SimPEG.out")[0] - - with driver.pseudo3d_params.out_group.workspace.open(mode="r+"): - filedata.copy(parent=driver.pseudo3d_params.out_group) - - output = get_inversion_output( - driver.pseudo3d_params.geoh5.h5file, driver.pseudo3d_params.out_group.uid - ) - if geoh5.open(): - output["data"] = chargeability.values - if pytest: - check_target(output, target_run) - - -if __name__ == "__main__": - # Full run - test_ip_p3d_fwr_run( - Path("./"), - n_electrodes=20, - n_lines=3, - refinement=(4, 8), - ) - test_ip_p3d_run( - Path("./"), - max_iterations=20, - pytest=False, - ) diff --git a/tests/run_tests/driver_ip_test.py b/tests/run_tests/driver_ip_test.py deleted file mode 100644 index 083c2411..00000000 --- a/tests/run_tests/driver_ip_test.py +++ /dev/null @@ -1,133 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 geoh5py.workspace import Workspace - -from simpeg_drivers.electricals.induced_polarization.three_dimensions import ( - InducedPolarization3DParams, -) -from simpeg_drivers.electricals.induced_polarization.three_dimensions.driver import ( - InducedPolarization3DDriver, -) -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": 0.0082997, "phi_d": 180.9, "phi_m": 0.6749} - - -def test_ip_3d_fwr_run( - tmp_path: Path, - n_electrodes=4, - n_lines=3, - refinement=(4, 6), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=1e-6, - anomaly=1e-1, - n_electrodes=n_electrodes, - n_lines=n_lines, - refinement=refinement, - drape_height=0.0, - inversion_type="dcip", - flatten=False, - ) - params = InducedPolarization3DParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - z_from_topo=True, - data_object=survey.uid, - starting_model=model.uid, - conductivity_model=1e-2, - ) - params.workpath = tmp_path - fwr_driver = InducedPolarization3DDriver(params) - fwr_driver.run() - - -def test_ip_3d_run( - tmp_path: Path, - max_iterations=1, - pytest=True, - n_lines=3, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_ip_3d_fwr_run0" / "inversion_test.ui.geoh5" - - with Workspace(workpath) as geoh5: - potential = geoh5.get_entity("Iteration_0_ip")[0] - mesh = geoh5.get_entity("mesh")[0] - topography = geoh5.get_entity("topography")[0] - - # Run the inverse - params = InducedPolarization3DParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - data_object=potential.parent.uid, - conductivity_model=1e-2, - reference_model=1e-6, - starting_model=1e-6, - s_norm=0.0, - x_norm=0.0, - y_norm=0.0, - z_norm=0.0, - gradient_type="components", - chargeability_channel_bool=True, - z_from_topo=False, - chargeability_channel=potential.uid, - chargeability_uncertainty=2e-4, - max_global_iterations=max_iterations, - initial_beta=None, - initial_beta_ratio=1e0, - prctile=100, - upper_bound=0.1, - tile_spatial=n_lines, - store_sensitivities="ram", - coolingRate=1, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - driver = InducedPolarization3DDriver.start(str(tmp_path / "Inv_run.ui.json")) - - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - if geoh5.open(): - output["data"] = potential.values - if pytest: - check_target(output, target_run) - - -if __name__ == "__main__": - # Full run - test_ip_3d_fwr_run( - Path("./"), - n_electrodes=20, - n_lines=5, - refinement=(4, 8), - ) - test_ip_3d_run( - Path("./"), - n_lines=5, - max_iterations=15, - pytest=False, - ) diff --git a/tests/run_tests/driver_joint_cross_gradient_test.py b/tests/run_tests/driver_joint_cross_gradient_test.py deleted file mode 100644 index 1a5a6ea2..00000000 --- a/tests/run_tests/driver_joint_cross_gradient_test.py +++ /dev/null @@ -1,274 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 pathlib import Path - -import numpy as np -from geoh5py.data import FloatData -from geoh5py.groups import SimPEGGroup -from geoh5py.workspace import Workspace - -from simpeg_drivers.electricals.direct_current.three_dimensions import ( - DirectCurrent3DParams, -) -from simpeg_drivers.electricals.direct_current.three_dimensions.driver import ( - DirectCurrent3DDriver, -) -from simpeg_drivers.joint.joint_cross_gradient import JointCrossGradientParams -from simpeg_drivers.joint.joint_cross_gradient.driver import JointCrossGradientDriver -from simpeg_drivers.potential_fields import GravityParams, MagneticVectorParams -from simpeg_drivers.potential_fields.gravity.driver import GravityDriver -from simpeg_drivers.potential_fields.magnetic_vector.driver import MagneticVectorDriver -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": 53.29601, "phi_d": 10590, "phi_m": 0.1336} - - -def test_joint_cross_gradient_fwr_run( - tmp_path, - n_grid_points=4, - n_lines=3, - refinement=(2,), -): - # Create local problem A - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.75, - drape_height=15.0, - refinement=refinement, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - ) - params = GravityParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - fwr_driver_a = GravityDriver(params) - - _, _, model, survey, _ = setup_inversion_workspace( - tmp_path, - geoh5=geoh5, - background=0.0, - anomaly=0.05, - drape_height=15.0, - refinement=refinement, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - flatten=False, - ) - inducing_field = (50000.0, 90.0, 0.0) - params = MagneticVectorParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - inducing_field_strength=inducing_field[0], - inducing_field_inclination=inducing_field[1], - inducing_field_declination=inducing_field[2], - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - params.workpath = tmp_path - fwr_driver_b = MagneticVectorDriver(params) - - _, _, model, survey, _ = setup_inversion_workspace( - tmp_path, - geoh5=geoh5, - background=0.01, - anomaly=10, - n_electrodes=n_grid_points, - n_lines=n_lines, - refinement=refinement, - drape_height=0.0, - inversion_type="dcip", - flatten=False, - ) - params = DirectCurrent3DParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - data_object=survey.uid, - starting_model=model.uid, - ) - fwr_driver_c = DirectCurrent3DDriver(params) - fwr_driver_c.inversion_data.entity.name = "survey" - - # Force co-location of meshes - for driver in [fwr_driver_b, fwr_driver_c]: - driver.inversion_mesh.entity.origin = fwr_driver_a.inversion_mesh.entity.origin - driver.workspace.update_attribute(driver.inversion_mesh.entity, "attributes") - driver.inversion_mesh._mesh = None # pylint: disable=protected-access - - fwr_driver_a.run() - fwr_driver_b.run() - fwr_driver_c.run() - - -def test_joint_cross_gradient_inv_run( - tmp_path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = ( - tmp_path.parent - / "test_joint_cross_gradient_fwr_0" - / "inversion_test.ui.geoh5" - ) - - with Workspace(workpath) as geoh5: - topography = geoh5.get_entity("topography")[0] - drivers = [] - orig_data = [] - - for group_name in [ - "Gravity Forward", - "Magnetic vector Forward", - "Direct current 3d Forward", - ]: - group = geoh5.get_entity(group_name)[0] - - if not isinstance(group, SimPEGGroup): - continue - - mesh = group.get_entity("mesh")[0] - survey = group.get_entity("survey")[0] - - data = None - for child in survey.children: - if isinstance(child, FloatData): - data = child - - if data is None: - raise ValueError("No data found in survey") - - orig_data.append(data.values) - - if group.options["inversion_type"] == "gravity": - data.values = data.values + np.random.randn(data.values.size) * 1e-2 - params = GravityParams( - geoh5=geoh5, - mesh=mesh.uid, - alpha_s=1.0, - topography_object=topography.uid, - data_object=survey.uid, - gz_channel=data.uid, - gz_uncertainty=1e-2, - starting_model=0.0, - reference_model=0.0, - ) - drivers.append(GravityDriver(params)) - elif group.options["inversion_type"] == "direct current 3d": - data.values = data.values + np.random.randn(data.values.size) * 5e-4 - params = DirectCurrent3DParams( - geoh5=geoh5, - mesh=mesh.uid, - alpha_s=1.0, - topography_object=topography.uid, - data_object=survey.uid, - potential_channel=data.uid, - model_type="Resistivity (Ohm-m)", - potential_uncertainty=5e-4, - tile_spatial=1, - starting_model=100.0, - reference_model=100.0, - save_sensitivities=True, - ) - drivers.append(DirectCurrent3DDriver(params)) - else: - data.values = data.values + np.random.randn(data.values.size) * 10.0 - params = MagneticVectorParams( - geoh5=geoh5, - mesh=mesh.uid, - alpha_s=1.0, - topography_object=topography.uid, - inducing_field_strength=group.options["inducing_field_strength"][ - "value" - ], - inducing_field_inclination=group.options[ - "inducing_field_inclination" - ]["value"], - inducing_field_declination=group.options[ - "inducing_field_declination" - ]["value"], - data_object=survey.uid, - starting_model=1e-4, - reference_model=0.0, - tile_spatial=1, - tmi_channel=data.uid, - tmi_uncertainty=1e1, - ) - drivers.append(MagneticVectorDriver(params)) - - # Run the inverse - joint_params = JointCrossGradientParams( - geoh5=geoh5, - topography_object=topography.uid, - group_a=drivers[0].params.out_group, - group_a_multiplier=1.0, - group_b=drivers[1].params.out_group, - group_b_multiplier=1.0, - group_c=drivers[2].params.out_group, - max_global_iterations=max_iterations, - initial_beta_ratio=1e1, - cross_gradient_weight_a_b=1e0, - cross_gradient_weight_c_a=1e0, - cross_gradient_weight_c_b=1e0, - s_norm=0.0, - x_norm=0.0, - y_norm=0.0, - z_norm=0.0, - gradient_type="components", - prctile=100, - store_sensitivities="ram", - ) - - driver = JointCrossGradientDriver(joint_params) - driver.run() - - with Workspace(driver.params.geoh5.h5file): - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - - output["data"] = np.hstack(orig_data) - if pytest: - check_target(output, target_run) - - -if __name__ == "__main__": - # Full run - test_joint_cross_gradient_fwr_run( - Path("./"), - n_grid_points=16, - n_lines=5, - refinement=(4, 8), - ) - test_joint_cross_gradient_inv_run( - Path("./"), - max_iterations=20, - pytest=False, - ) diff --git a/tests/run_tests/driver_joint_surveys_test.py b/tests/run_tests/driver_joint_surveys_test.py deleted file mode 100644 index 6fb15c12..00000000 --- a/tests/run_tests/driver_joint_surveys_test.py +++ /dev/null @@ -1,184 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 pathlib import Path - -import numpy as np -from geoh5py.objects import Octree -from geoh5py.workspace import Workspace - -from simpeg_drivers.joint.joint_surveys import JointSurveysParams -from simpeg_drivers.joint.joint_surveys.driver import JointSurveyDriver -from simpeg_drivers.potential_fields import GravityParams -from simpeg_drivers.potential_fields.gravity.driver import GravityDriver -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": 0.2997791602206556, "phi_d": 1411, "phi_m": 74.54} - - -def test_joint_surveys_fwr_run( - tmp_path, - n_grid_points=6, - refinement=(2,), -): - # Create local problem A - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.75, - refinement=refinement, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - ) - params = GravityParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - fwr_driver_a = GravityDriver(params) - fwr_driver_a.out_group.name = "Gravity Forward [0]" - - # Create local problem B - _, _, model, survey, _ = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.75, - refinement=[0, 2], - n_electrodes=int(n_grid_points / 2), - n_lines=int(n_grid_points / 2), - flatten=False, - geoh5=geoh5, - drape_height=10.0, - ) - params = GravityParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - fwr_driver_b = GravityDriver(params) - fwr_driver_b.out_group.name = "Gravity Forward [1]" - - # Force co-location of meshes - fwr_driver_b.inversion_mesh.entity.origin = ( - fwr_driver_a.inversion_mesh.entity.origin - ) - fwr_driver_b.workspace.update_attribute( - fwr_driver_b.inversion_mesh.entity, "attributes" - ) - fwr_driver_b.inversion_mesh._mesh = None # pylint: disable=protected-access - fwr_driver_a.run() - fwr_driver_b.run() - geoh5.close() - - -def test_joint_surveys_inv_run( - tmp_path, - max_iterations=1, - unittest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if unittest: - workpath = ( - tmp_path.parent / "test_joint_surveys_fwr_run0" / "inversion_test.ui.geoh5" - ) - - with Workspace(workpath) as geoh5: - drivers = [] - orig_data = [] - - for ind in range(2): - group = geoh5.get_entity(f"Gravity Forward [{ind}]")[0] - survey = geoh5.get_entity(group.options["data_object"]["value"])[0] - mesh = None - for child in group.children: - if isinstance(child, Octree): - mesh = child - else: - survey = child - - if mesh is None: - raise ValueError("No mesh found in the group.") - - active_model = mesh.get_entity("active_cells")[0] - gz = survey.get_data("Iteration_0_gz")[0] - orig_data.append(gz.values) - params = GravityParams( - geoh5=geoh5, - mesh=mesh.uid, - active_model=active_model.uid, - data_object=survey.uid, - gz_channel=gz.uid, - gz_uncertainty=np.var(gz.values) * 2.0, - starting_model=0.0, - ) - drivers.append(GravityDriver(params)) - - active_model = drivers[0].params.mesh.get_entity("active_cells")[0] - # Run the inverse - joint_params = JointSurveysParams( - geoh5=geoh5, - activate_model=active_model, - mesh=drivers[0].params.mesh, - group_a=drivers[0].params.out_group, - group_b=drivers[1].params.out_group, - starting_model=1e-4, - reference_model=0.0, - s_norm=0.0, - x_norm=0.0, - y_norm=0.0, - z_norm=0.0, - gradient_type="components", - lower_bound=0.0, - max_global_iterations=max_iterations, - initial_beta_ratio=1e-2, - prctile=100, - store_sensitivities="ram", - ) - - driver = JointSurveyDriver(joint_params) - driver.run() - - with Workspace(driver.params.geoh5.h5file): - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - output["data"] = np.hstack(orig_data) - - if unittest: - check_target(output, target_run) - - -if __name__ == "__main__": - # Full run - test_joint_surveys_fwr_run( - Path("./"), - n_grid_points=20, - refinement=(4, 8), - ) - test_joint_surveys_inv_run( - Path("./"), - max_iterations=20, - unittest=False, - ) diff --git a/tests/run_tests/driver_mag_test.py b/tests/run_tests/driver_mag_test.py deleted file mode 100644 index c000f81a..00000000 --- a/tests/run_tests/driver_mag_test.py +++ /dev/null @@ -1,135 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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.workspace import Workspace - -from simpeg_drivers.potential_fields import MagneticScalarParams -from simpeg_drivers.potential_fields.magnetic_scalar.driver import MagneticScalarDriver -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": 8.71227951689941, "phi_d": 37.52, "phi_m": 5.717e-06} - - -def test_susceptibility_fwr_run( - tmp_path: Path, - n_grid_points=2, - refinement=(2,), -): - inducing_field = (49999.8, 90.0, 0.0) - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=refinement, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - flatten=False, - ) - params = MagneticScalarParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - inducing_field_strength=inducing_field[0], - inducing_field_inclination=inducing_field[1], - inducing_field_declination=inducing_field[2], - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - ) - params.workpath = tmp_path - fwr_driver = MagneticScalarDriver(params) - fwr_driver.run() - - assert fwr_driver.inversion_data.survey.source_field.amplitude == inducing_field[0] - - assert params.out_group is not None - assert params.out_group.options - - -def test_susceptibility_run( - tmp_path: Path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = ( - tmp_path.parent / "test_susceptibility_fwr_run0" / "inversion_test.ui.geoh5" - ) - - with Workspace(workpath) as geoh5: - tmi = geoh5.get_entity("Iteration_0_tmi")[0] - orig_tmi = tmi.values.copy() - mesh = geoh5.get_entity("mesh")[0] - active_cells = mesh.get_entity("active_cells")[0] - inducing_field = (50000.0, 90.0, 0.0) - - # Run the inverse - params = MagneticScalarParams( - geoh5=geoh5, - mesh=mesh.uid, - active_model=active_cells.uid, - inducing_field_strength=inducing_field[0], - inducing_field_inclination=inducing_field[1], - inducing_field_declination=inducing_field[2], - data_object=tmi.parent.uid, - starting_model=1e-4, - reference_model=0.0, - s_norm=0.0, - x_norm=1.0, - y_norm=1.0, - z_norm=1.0, - initial_beta_ratio=1e1, - gradient_type="components", - lower_bound=0.0, - tmi_channel_bool=True, - z_from_topo=False, - tmi_channel=tmi.uid, - tmi_uncertainty=1.0, - max_global_iterations=max_iterations, - store_sensitivities="ram", - ) - params.write_input_file(path=tmp_path, name="Inv_run", validate=False) - - driver = MagneticScalarDriver.start(str(tmp_path / "Inv_run.ui.json")) - - with Workspace(driver.params.geoh5.h5file) as run_ws: - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - output["data"] = orig_tmi - assert ( - run_ws.get_entity("Iteration_1_tmi")[0].entity_type.uid - == run_ws.get_entity("Observed_tmi")[0].entity_type.uid - ) - - if pytest: - check_target(output, target_run) - 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_susceptibility_fwr_run(Path("./"), n_grid_points=20, refinement=(4, 8)) - test_susceptibility_run(Path("./"), max_iterations=30, pytest=False) diff --git a/tests/run_tests/driver_mt_test.py b/tests/run_tests/driver_mt_test.py deleted file mode 100644 index 80e40605..00000000 --- a/tests/run_tests/driver_mt_test.py +++ /dev/null @@ -1,208 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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). ' -# ' -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -# pylint: disable=too-many-locals - -from __future__ import annotations - -from pathlib import Path - -import numpy as np -from geoh5py.groups import SimPEGGroup -from geoh5py.workspace import Workspace - -from simpeg_drivers.natural_sources.magnetotellurics.driver import ( - MagnetotelluricsDriver, -) -from simpeg_drivers.natural_sources.magnetotellurics.params import ( - MagnetotelluricsParams, -) -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": 0.0042988, "phi_d": 50.2, "phi_m": 11.1} - - -def test_magnetotellurics_fwr_run( - tmp_path: Path, - n_grid_points=2, - refinement=(2,), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.01, - anomaly=1.0, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - refinement=refinement, - drape_height=0.0, - inversion_type="magnetotellurics", - flatten=False, - ) - params = MagnetotelluricsParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - background_conductivity=1e-2, - zxx_real_channel_bool=True, - zxx_imag_channel_bool=True, - zxy_real_channel_bool=True, - zxy_imag_channel_bool=True, - zyx_real_channel_bool=True, - zyx_imag_channel_bool=True, - zyy_real_channel_bool=True, - zyy_imag_channel_bool=True, - ) - params.workpath = tmp_path - fwr_driver = MagnetotelluricsDriver(params) - fwr_driver.run() - - -def test_magnetotellurics_run(tmp_path: Path, max_iterations=1, pytest=True): - # pass - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = ( - tmp_path.parent - / "test_magnetotellurics_fwr_run0" - / "inversion_test.ui.geoh5" - ) - - with Workspace(workpath) as geoh5: - survey = next( - child - for child in geoh5.get_entity("survey") - if not isinstance(child.parent, SimPEGGroup) - ) - mesh = geoh5.get_entity("mesh")[0] - topography = geoh5.get_entity("topography")[0] - - data = {} - uncertainties = {} - components = { - "zxx_real": "Zxx (real)", - "zxx_imag": "Zxx (imag)", - "zxy_real": "Zxy (real)", - "zxy_imag": "Zxy (imag)", - "zyx_real": "Zyx (real)", - "zyx_imag": "Zyx (imag)", - "zyy_real": "Zyy (real)", - "zyy_imag": "Zyy (imag)", - } - - for comp, cname in components.items(): - data[cname] = [] - # uncertainties[f"{cname} uncertainties"] = {} - uncertainties[f"{cname} uncertainties"] = [] - for ind in range(len(survey.channels)): - data_entity = geoh5.get_entity(f"Iteration_0_{comp}_[{ind}]")[0].copy( - parent=survey - ) - data[cname].append(data_entity) - - uncert = survey.add_data( - { - f"uncertainty_{comp}_[{ind}]": { - "values": np.ones_like(data_entity.values) - * np.percentile(np.abs(data_entity.values), 5) - } - } - ) - uncertainties[f"{cname} uncertainties"].append( - uncert.copy(parent=survey) - ) - - data_groups = survey.add_components_data(data) - uncert_groups = survey.add_components_data(uncertainties) - - data_kwargs = {} - for comp, data_group, uncert_group in zip( - components, data_groups, uncert_groups, strict=True - ): - data_kwargs[f"{comp}_channel"] = data_group.uid - data_kwargs[f"{comp}_uncertainty"] = uncert_group.uid - - orig_zyy_real_1 = geoh5.get_entity("Iteration_0_zyy_real_[0]")[0].values - - # Run the inverse - params = MagnetotelluricsParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - resolution=0.0, - data_object=survey.uid, - starting_model=100.0, - reference_model=100.0, - alpha_s=1.0, - s_norm=1.0, - x_norm=1.0, - y_norm=1.0, - z_norm=1.0, - gradient_type="components", - z_from_topo=False, - coolingRate=1, - lower_bound=0.75, - model_type="Resistivity (Ohm-m)", - background_conductivity=100.0, - max_global_iterations=max_iterations, - initial_beta_ratio=1e3, - prctile=100, - store_sensitivities="ram", - **data_kwargs, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - driver = MagnetotelluricsDriver.start(str(tmp_path / "Inv_run.ui.json")) - - with geoh5.open() as run_ws: - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - output["data"] = orig_zyy_real_1 - if pytest: - check_target(output, target_run, tolerance=0.5) - 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) - - # test that one channel works - data_kwargs = {k: v for k, v in data_kwargs.items() if "zxx_real" in k} - geoh5.open() - params = MagnetotelluricsParams( - geoh5=geoh5, - mesh=geoh5.get_entity("mesh")[0].uid, - topography_object=topography.uid, - data_object=survey.uid, - starting_model=0.01, - conductivity_model=1e-2, - max_global_iterations=0, - **data_kwargs, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - MagnetotelluricsDriver.start(str(tmp_path / "Inv_run.ui.json")) - - -if __name__ == "__main__": - # Full run - test_magnetotellurics_fwr_run(Path("./"), n_grid_points=8, refinement=(4, 8)) - test_magnetotellurics_run( - Path("./"), - max_iterations=15, - pytest=False, - ) diff --git a/tests/run_tests/driver_mvi_test.py b/tests/run_tests/driver_mvi_test.py deleted file mode 100644 index 5927a5ca..00000000 --- a/tests/run_tests/driver_mvi_test.py +++ /dev/null @@ -1,149 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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.property_group import GroupTypeEnum -from geoh5py.objects import Curve -from geoh5py.workspace import Workspace - -from simpeg_drivers.potential_fields import MagneticVectorParams -from simpeg_drivers.potential_fields.magnetic_vector.driver import MagneticVectorDriver -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_mvi_run = { - "data_norm": 6.3559205278626525, - "phi_d": 0.01447, - "phi_m": 4.657e-06, -} - - -def test_magnetic_vector_fwr_run( - tmp_path: Path, - n_grid_points=2, - refinement=(2,), -): - inducing_field = (50000.0, 90.0, 0.0) - # Run the forward - geoh5, _, model, points, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=refinement, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - ) - - # Unitest dealing with Curve - survey = Curve.create(geoh5, name=points.name, vertices=points.vertices) - geoh5.remove_entity(points) - - params = MagneticVectorParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - inducing_field_strength=inducing_field[0], - inducing_field_inclination=inducing_field[1], - inducing_field_declination=inducing_field[2], - z_from_topo=False, - data_object=survey.uid, - starting_model_object=model.parent.uid, - starting_model=model.uid, - starting_inclination=45, - starting_declination=270, - ) - fwr_driver = MagneticVectorDriver(params) - - fwr_driver.run() - - -def test_magnetic_vector_run( - tmp_path: Path, - max_iterations=1, - pytest=True, -): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = ( - tmp_path.parent - / "test_magnetic_vector_fwr_run0" - / "inversion_test.ui.geoh5" - ) - - with Workspace(workpath) as geoh5: - tmi = geoh5.get_entity("Iteration_0_tmi")[0] - orig_tmi = tmi.values.copy() - mesh = geoh5.get_entity("mesh")[0] - topography = geoh5.get_entity("topography")[0] - inducing_field = (50000.0, 90.0, 0.0) - - # Run the inverse - params = MagneticVectorParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - inducing_field_strength=inducing_field[0], - inducing_field_inclination=inducing_field[1], - inducing_field_declination=inducing_field[2], - data_object=tmi.parent.uid, - starting_model=1e-4, - reference_model=0.0, - s_norm=0.0, - x_norm=1.0, - y_norm=1.0, - z_norm=1.0, - gradient_type="components", - tmi_channel_bool=True, - z_from_topo=False, - tmi_channel=tmi.uid, - tmi_uncertainty=4.0, - max_global_iterations=max_iterations, - initial_beta_ratio=1e1, - store_sensitivities="ram", - save_sensitivities=True, - prctile=100, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - driver = MagneticVectorDriver.start(str(tmp_path / "Inv_run.ui.json")) - - with Workspace(driver.params.geoh5.h5file) as run_ws: - # Re-open the workspace and get iterations - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - output["data"] = orig_tmi - if pytest: - check_target(output, target_mvi_run) - nan_ind = np.isnan( - run_ws.get_entity("Iteration_0_amplitude_model")[0].values - ) - inactive_ind = run_ws.get_entity("active_cells")[0].values == 0 - assert np.all(nan_ind == inactive_ind) - - out_group = run_ws.get_entity("Magnetic vector Inversion")[0] - mesh = out_group.get_entity("mesh")[0] - assert len(mesh.property_groups) == 2 - assert len(mesh.property_groups[0].properties) == 2 - assert mesh.property_groups[1].property_group_type == GroupTypeEnum.DIPDIR - - -if __name__ == "__main__": - # Full run - test_magnetic_vector_fwr_run(Path("./"), n_grid_points=20, refinement=(4, 8)) - test_magnetic_vector_run(Path("./"), max_iterations=30, pytest=False) diff --git a/tests/run_tests/driver_tipper_test.py b/tests/run_tests/driver_tipper_test.py deleted file mode 100644 index e2230f5b..00000000 --- a/tests/run_tests/driver_tipper_test.py +++ /dev/null @@ -1,178 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 simpeg_drivers.natural_sources import TipperParams -from simpeg_drivers.natural_sources.tipper.driver import TipperDriver -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": 0.0055932, "phi_d": 7.346, "phi_m": 472.2} - - -def test_tipper_fwr_run( - tmp_path: Path, - n_grid_points=2, - refinement=(2,), -): - # Run the forward - geoh5, _, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=100, - anomaly=1.0, - n_electrodes=n_grid_points, - n_lines=n_grid_points, - refinement=refinement, - inversion_type="tipper", - drape_height=15.0, - flatten=False, - ) - - params = TipperParams( - forward_only=True, - geoh5=geoh5, - mesh=model.parent.uid, - topography_object=topography.uid, - resolution=0.0, - z_from_topo=False, - data_object=survey.uid, - starting_model=model.uid, - model_type="Resistivity (Ohm-m)", - background_conductivity=1e2, - txz_real_channel_bool=True, - txz_imag_channel_bool=True, - tyz_real_channel_bool=True, - tyz_imag_channel_bool=True, - ) - params.workpath = tmp_path - fwr_driver = TipperDriver(params) - - # Should always be returning conductivity for simpeg simulations - assert not np.any(np.exp(fwr_driver.models.starting) > 1.01) - fwr_driver.run() - - -def test_tipper_run(tmp_path: Path, max_iterations=1, pytest=True): - workpath = tmp_path / "inversion_test.ui.geoh5" - if pytest: - workpath = tmp_path.parent / "test_tipper_fwr_run0" / "inversion_test.ui.geoh5" - - with Workspace(workpath) as geoh5: - survey = next( - child - for child in geoh5.get_entity("survey") - if not isinstance(child.parent, SimPEGGroup) - ) - mesh = geoh5.get_entity("mesh")[0] - topography = geoh5.get_entity("topography")[0] - - data = {} - uncertainties = {} - components = { - "txz_real": "Txz (real)", - "txz_imag": "Txz (imag)", - "tyz_real": "Tyz (real)", - "tyz_imag": "Tyz (imag)", - } - - for comp, cname in components.items(): - data[cname] = [] - uncertainties[f"{cname} uncertainties"] = [] - for ind in range(len(survey.channels)): - data_entity = geoh5.get_entity(f"Iteration_0_{comp}_[{ind}]")[0].copy( - parent=survey - ) - data[cname].append(data_entity) - - uncert = survey.add_data( - { - f"uncertainty_{comp}_[{ind}]": { - "values": np.ones_like(data_entity.values) - * np.percentile(np.abs(data_entity.values), 1) - } - } - ) - uncertainties[f"{cname} uncertainties"].append(uncert) - - data_groups = survey.add_components_data(data) - uncert_groups = survey.add_components_data(uncertainties) - - data_kwargs = {} - for comp, data_group, uncert_group in zip( - components, data_groups, uncert_groups, strict=True - ): - data_kwargs[f"{comp}_channel"] = data_group.uid - data_kwargs[f"{comp}_uncertainty"] = uncert_group.uid - - orig_tyz_real_1 = geoh5.get_entity("Iteration_0_tyz_real_[0]")[0].values - - # Run the inverse - params = TipperParams( - geoh5=geoh5, - mesh=mesh.uid, - topography_object=topography.uid, - resolution=0.0, - data_object=survey.uid, - starting_model=1e2, - reference_model=1e2, - background_conductivity=1e2, - s_norm=1.0, - x_norm=1.0, - y_norm=1.0, - z_norm=1.0, - alpha_s=1.0, - gradient_type="components", - model_type="Resistivity (Ohm-m)", - z_from_topo=False, - lower_bound=0.75, - max_global_iterations=max_iterations, - initial_beta_ratio=1e3, - starting_chi_factor=1.0, - coolingRate=1, - prctile=100, - chi_factor=1.0, - max_line_search_iterations=5, - store_sensitivities="ram", - **data_kwargs, - ) - params.write_input_file(path=tmp_path, name="Inv_run") - driver = TipperDriver.start(str(tmp_path / "Inv_run.ui.json")) - - with geoh5.open() as run_ws: - output = get_inversion_output( - driver.params.geoh5.h5file, driver.params.out_group.uid - ) - output["data"] = orig_tyz_real_1 - if pytest: - check_target(output, target_run, tolerance=0.5) - 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_tipper_fwr_run(Path("./"), n_grid_points=8, refinement=(4, 4)) - test_tipper_run( - Path("./"), - max_iterations=15, - pytest=False, - ) diff --git a/tests/topography_test.py b/tests/topography_test.py deleted file mode 100644 index 58976e40..00000000 --- a/tests/topography_test.py +++ /dev/null @@ -1,63 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 simpeg_drivers.components import InversionTopography -from simpeg_drivers.potential_fields import MagneticVectorParams -from simpeg_drivers.utils.testing import Geoh5Tester, setup_inversion_workspace - - -def setup_params(tmp_path): - geoh5, entity, model, survey, topography = setup_inversion_workspace( - tmp_path, - background=0.0, - anomaly=0.05, - refinement=(2,), - n_electrodes=2, - n_lines=2, - inversion_type="magnetic_vector", - ) - mesh = model.parent - tmi_channel, gyz_channel = survey.add_data( - { - "tmi": {"values": np.random.rand(survey.n_vertices)}, - "gyz": {"values": np.random.rand(survey.n_vertices)}, - } - ) - elevation = topography.add_data( - {"elevation": {"values": topography.vertices[:, 2]}} - ) - - geotest = Geoh5Tester(geoh5, tmp_path, "test.geoh5", MagneticVectorParams) - geotest.set_param("mesh", str(mesh.uid)) - geotest.set_param("data_object", str(survey.uid)) - geotest.set_param("tmi_channel", str(tmi_channel.uid)) - geotest.set_param("topography_object", str(topography.uid)) - geotest.set_param("topography", str(elevation.uid)) - return geotest.make() - - -def test_get_locations(tmp_path: Path): - ws, params = setup_params(tmp_path) - topo = InversionTopography(ws, params) - locs = topo.get_locations(params.topography_object) - np.testing.assert_allclose( - locs[:, 2], - params.topography.values, - ) - - params.topography = 199.0 - locs = topo.get_locations(params.topography_object) - np.testing.assert_allclose(locs[:, 2], np.ones_like(locs[:, 2]) * 199.0) diff --git a/tests/utils_surveys_test.py b/tests/utils_surveys_test.py deleted file mode 100644 index ab2156ed..00000000 --- a/tests/utils_surveys_test.py +++ /dev/null @@ -1,27 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 simpeg_drivers.utils.surveys import counter_clockwise_sort - - -def test_counterclockwise_sort(): - vertices = np.array( - [[0, 0], [0.25, 1.5], [0.0, 2.0], [0.5, 1], [1.5, 0], [0.2, 0.2]] - ) - segments = np.c_[np.arange(len(vertices)), np.arange(1, len(vertices) + 1)] - segments[-1, 1] = 0 - - ccw_sorted = counter_clockwise_sort(segments, vertices) - - np.testing.assert_equal(ccw_sorted[0, :], [0, 5]) diff --git a/tests/version_test.py b/tests/version_test.py deleted file mode 100644 index d551f3be..00000000 --- a/tests/version_test.py +++ /dev/null @@ -1,67 +0,0 @@ -# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -# 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 re -from pathlib import Path - -import tomli as toml -import yaml -from jinja2 import Template -from packaging.version import Version - -import simpeg_drivers - - -def get_pyproject_version(): - path = Path(__file__).resolve().parents[1] / "pyproject.toml" - - with open(str(path), encoding="utf-8") as file: - pyproject = toml.loads(file.read()) - - return pyproject["tool"]["poetry"]["version"] - - -def get_conda_recipe_version(): - path = Path(__file__).resolve().parents[1] / "meta.yaml" - - with open(str(path), encoding="utf-8") as file: - content = file.read() - - template = Template(content) - rendered_yaml = template.render() - - recipe = yaml.safe_load(rendered_yaml) - - return recipe["package"]["version"] - - -def test_version_is_consistent(): - assert simpeg_drivers.__version__ == get_pyproject_version() - normalized_conda_version = Version(get_conda_recipe_version()) - normalized_version = Version(simpeg_drivers.__version__) - assert normalized_conda_version == normalized_version - - -def test_conda_version_is_pep440(): - version = Version(get_conda_recipe_version()) - assert version is not None - - -def test_version_is_semver(): - semver_re = ( - r"^(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)" - r"(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)" - r"(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?" - r"(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" - ) - assert re.search(semver_re, simpeg_drivers.__version__) is not None